summaryrefslogtreecommitdiff
path: root/firmware/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/thread.c')
-rw-r--r--firmware/thread.c6
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
42static thread_t threads = {1, 0}; 42static 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;