diff options
-rw-r--r-- | firmware/thread.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/firmware/thread.c b/firmware/thread.c index e358079aba..77fdb06ec9 100644 --- a/firmware/thread.c +++ b/firmware/thread.c | |||
@@ -36,7 +36,7 @@ typedef struct | |||
36 | { | 36 | { |
37 | int created; | 37 | int created; |
38 | int current; | 38 | int current; |
39 | ctx_t ctx[MAXTHREADS] __attribute__ ((aligned (32))); | 39 | ctx_t ctx[MAXTHREADS]; |
40 | } thread_t; | 40 | } thread_t; |
41 | 41 | ||
42 | static thread_t threads = {1, 0}; | 42 | static thread_t threads = {1, 0}; |
@@ -118,7 +118,9 @@ int create_thread(void* fp, void* sp, int stk_size) | |||
118 | { | 118 | { |
119 | ctx_t* ctxp = &t->ctx[t->created++]; | 119 | ctx_t* ctxp = &t->ctx[t->created++]; |
120 | stctx(ctxp); | 120 | stctx(ctxp); |
121 | ctxp->regs.sp = (void*)(((unsigned int)sp + stk_size) & ~31); | 121 | /* Subtract 4 to leave room for the PR push in ldctx() |
122 | Align it on an even 32 bit boundary */ | ||
123 | ctxp->regs.sp = (void*)(((unsigned int)sp + stk_size - 4) & ~3; | ||
122 | ctxp->regs.pr = fp; | 124 | ctxp->regs.pr = fp; |
123 | } | 125 | } |
124 | return 0; | 126 | return 0; |