diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libthread/Linux-arm-asm.s | 66 | ||||
-rw-r--r-- | src/libthread/Linux.c | 3 |
2 files changed, 35 insertions, 34 deletions
diff --git a/src/libthread/Linux-arm-asm.s b/src/libthread/Linux-arm-asm.s index 95c8aaac..5a285bf2 100644 --- a/src/libthread/Linux-arm-asm.s +++ b/src/libthread/Linux-arm-asm.s @@ -11,43 +11,43 @@ _tas: .globl getmcontext getmcontext: - /* r0 will be overwritten */ - str r1, [r0,#4]! - str r2, [r0,#4]! - str r3, [r0,#4]! - str r4, [r0,#4]! - str r5, [r0,#4]! - str r6, [r0,#4]! - str r7, [r0,#4]! - str r8, [r0,#4]! - str r9, [r0,#4]! - str r10, [r0,#4]! - str r11, [r0,#4]! - str r12, [r0,#4]! - str r13, [r0,#4]! - str r14, [r0,#4]! - /* r15 is pc */ + str r1, [r0,#4] + str r2, [r0,#8] + str r3, [r0,#12] + str r4, [r0,#16] + str r5, [r0,#20] + str r6, [r0,#24] + str r7, [r0,#28] + str r8, [r0,#32] + str r9, [r0,#36] + str r10, [r0,#40] + str r11, [r0,#44] + str r12, [r0,#48] + str r13, [r0,#52] + str r14, [r0,#56] + /* store 1 as r0-to-restore */ + mov r1, #1 + str r1, [r0] + /* return 0 */ mov r0, #0 mov pc, lr .globl setmcontext setmcontext: - /* r0 will be overwritten */ - ldr r1, [r0,#4]! - ldr r2, [r0,#4]! - ldr r3, [r0,#4]! - ldr r4, [r0,#4]! - ldr r5, [r0,#4]! - ldr r6, [r0,#4]! - ldr r7, [r0,#4]! - ldr r8, [r0,#4]! - ldr r9, [r0,#4]! - ldr r10, [r0,#4]! - ldr r11, [r0,#4]! - ldr r12, [r0,#4]! - ldr r13, [r0,#4]! - ldr r14, [r0,#4]! - /* r15 is pc */ - mov r0, #1 + ldr r1, [r0,#4] + ldr r2, [r0,#8] + ldr r3, [r0,#12] + ldr r4, [r0,#16] + ldr r5, [r0,#20] + ldr r6, [r0,#24] + ldr r7, [r0,#28] + ldr r8, [r0,#32] + ldr r9, [r0,#36] + ldr r10, [r0,#40] + ldr r11, [r0,#44] + ldr r12, [r0,#48] + ldr r13, [r0,#52] + ldr r14, [r0,#56] + ldr r0, [r0] mov pc, lr diff --git a/src/libthread/Linux.c b/src/libthread/Linux.c index 5d033248..73cb28e0 100644 --- a/src/libthread/Linux.c +++ b/src/libthread/Linux.c @@ -449,7 +449,8 @@ makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...) sp = (int*)uc->uc_stack.ss_sp+uc->uc_stack.ss_size/4; va_start(arg, argc); for(i=0; i<4 && i<argc; i++) - uc->uc_mcontext.gregs[0] = va_arg(arg, uint); + uc->uc_mcontext.gregs[i] = va_arg(arg, uint); + va_end(arg); uc->uc_mcontext.gregs[13] = (uint)sp; uc->uc_mcontext.gregs[14] = (uint)fn; } |