diff options
Diffstat (limited to 'ports/sysdeps/unix/sysv/linux/arm/setcontext.S')
-rw-r--r-- | ports/sysdeps/unix/sysv/linux/arm/setcontext.S | 89 |
1 files changed, 45 insertions, 44 deletions
diff --git a/ports/sysdeps/unix/sysv/linux/arm/setcontext.S b/ports/sysdeps/unix/sysv/linux/arm/setcontext.S index d163fc4a4c..64367704b4 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/setcontext.S +++ b/ports/sysdeps/unix/sysv/linux/arm/setcontext.S @@ -29,40 +29,42 @@ ENTRY(__setcontext) mov r4, r0 add r0, r0, #UCONTEXT_REGSPACE - /* Restore the VFP registers. Copied from arm/__longjmp.S. */ + /* Restore the VFP registers. Copied from arm/__longjmp.S. */ #ifdef PIC - ldr r2, 1f - ldr r1, Lrtld_global_ro + ldr r2, 1f + ldr r1, .Lrtld_global_ro 0: add r2, pc, r2 - ldr r2, [r2, r1] - ldr r2, [r2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET] + ldr r2, [r2, r1] + ldr r2, [r2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET] #else - ldr r2, Lhwcap - ldr r2, [r2, #0] + ldr r2, .Lhwcap + ldr r2, [r2, #0] #endif - tst r2, #HWCAP_ARM_VFP - beq Lno_vfp_sc - - /* Following instruction is vldmia r0!, {d8-d15}. */ - ldc p11, cr8, [r0], #64 - /* Restore the floating-point status register. */ - ldr r1, [r0], #4 - /* Following instruction is fmxr fpscr, r1. */ - mcr p10, 7, r1, cr1, cr0, 0 -Lno_vfp_sc: - tst r2, #HWCAP_ARM_IWMMXT - beq Lno_iwmmxt_sc - - /* Restore the call-preserved iWMMXt registers. */ - /* Following instructions are wldrd wr10, [r0], #8 (etc.) */ - ldcl p1, cr10, [r0], #8 - ldcl p1, cr11, [r0], #8 - ldcl p1, cr12, [r0], #8 - ldcl p1, cr13, [r0], #8 - ldcl p1, cr14, [r0], #8 - ldcl p1, cr15, [r0], #8 -Lno_iwmmxt_sc: +#ifdef __SOFTFP__ + tst r2, #HWCAP_ARM_VFP + beq .Lno_vfp_sc +#endif + + /* Following instruction is vldmia r0!, {d8-d15}. */ + ldc p11, cr8, [r0], #64 + /* Restore the floating-point status register. */ + ldr r1, [r0], #4 + /* Following instruction is fmxr fpscr, r1. */ + mcr p10, 7, r1, cr1, cr0, 0 +.Lno_vfp_sc: + tst r2, #HWCAP_ARM_IWMMXT + beq .Lno_iwmmxt_sc + + /* Restore the call-preserved iWMMXt registers. */ + /* Following instructions are wldrd wr10, [r0], #8 (etc.) */ + ldcl p1, cr10, [r0], #8 + ldcl p1, cr11, [r0], #8 + ldcl p1, cr12, [r0], #8 + ldcl p1, cr13, [r0], #8 + ldcl p1, cr14, [r0], #8 + ldcl p1, cr15, [r0], #8 +.Lno_iwmmxt_sc: /* Now bring back the signal status. */ mov r0, #SIG_SETMASK @@ -70,12 +72,12 @@ Lno_iwmmxt_sc: mov r2, #0 bl PLTJMP(__sigprocmask) - /* Loading r0-r3 makes makecontext easier. */ - add r14, r4, #MCONTEXT_ARM_R0 - ldmia r14, {r0-r12} - ldr r13, [r14, #(MCONTEXT_ARM_SP - MCONTEXT_ARM_R0)] - add r14, r14, #(MCONTEXT_ARM_LR - MCONTEXT_ARM_R0) - ldmia r14, {r14, pc} + /* Loading r0-r3 makes makecontext easier. */ + add r14, r4, #MCONTEXT_ARM_R0 + ldmia r14, {r0-r12} + ldr r13, [r14, #(MCONTEXT_ARM_SP - MCONTEXT_ARM_R0)] + add r14, r14, #(MCONTEXT_ARM_LR - MCONTEXT_ARM_R0) + ldmia r14, {r14, pc} END(setcontext) weak_alias(__setcontext, setcontext) @@ -83,19 +85,18 @@ weak_alias(__setcontext, setcontext) /* Called when a makecontext() context returns. Start the context in R4 or fall through to exit(). */ ENTRY(__startcontext) - movs r0, r4 - bne PLTJMP(__setcontext) + movs r0, r4 + bne PLTJMP(__setcontext) - @ New context was 0 - exit - b PLTJMP(HIDDEN_JUMPTARGET(_exit)) + @ New context was 0 - exit + b PLTJMP(HIDDEN_JUMPTARGET(_exit)) END(__startcontext) #ifdef PIC 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 -Lrtld_global_ro: - .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) +.Lrtld_global_ro: + .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) #else -Lhwcap: - .long C_SYMBOL_NAME(_dl_hwcap) +.Lhwcap: + .long C_SYMBOL_NAME(_dl_hwcap) #endif - |