diff options
author | Geoff Norton <kangaroo@clr.ninja> | 2015-09-04 03:26:34 +0000 |
---|---|---|
committer | Geoff Norton <kangaroo@clr.ninja> | 2015-09-04 05:04:59 +0000 |
commit | 7436b1ab19a090317f1cd3c8917cf0671ce1963c (patch) | |
tree | 013f1e4f8a0ad3f92b0c46fb09f1eef38127ddbe /src/pal/src/arch | |
parent | 1165038551b7ca20f230d867dc5fd2357ede14fe (diff) | |
download | coreclr-7436b1ab19a090317f1cd3c8917cf0671ce1963c.tar.gz coreclr-7436b1ab19a090317f1cd3c8917cf0671ce1963c.tar.bz2 coreclr-7436b1ab19a090317f1cd3c8917cf0671ce1963c.zip |
[arm] Fix RtlRestoreContext on ARM with newer clang
Diffstat (limited to 'src/pal/src/arch')
-rw-r--r-- | src/pal/src/arch/arm/context2.S | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/pal/src/arch/arm/context2.S b/src/pal/src/arch/arm/context2.S index 88aee3b321..a257471260 100644 --- a/src/pal/src/arch/arm/context2.S +++ b/src/pal/src/arch/arm/context2.S @@ -193,8 +193,13 @@ LEAF_ENTRY RtlRestoreContext, _TEXT ldr R2, [r0, #(CONTEXT_Cpsr)] msr APSR, r2 - add r0, CONTEXT_R0 - ldmia r0, {r0-r12, sp, lr, pc} + mov r12, r0 // ideally we would ldmia r0, {r0-r12, sp, lr, pc} here, but that isn't supported on new clang + add r12, CONTEXT_R0 // so we'll burn r12 as the IPC reg for now -- TODO: is this ok? + ldm r12, {r0-r11} + add r12, (CONTEXT_Sp - CONTEXT_R0) + ldr sp, [r12] + ldr lr, [r12, #(CONTEXT_Lr - CONTEXT_Sp)] + ldr pc, [r12, #(CONTEXT_Pc - CONTEXT_Sp)] LOCAL_LABEL(No_Restore_CONTEXT_INTEGER): @@ -202,7 +207,9 @@ LOCAL_LABEL(No_Restore_CONTEXT_INTEGER): msr APSR, r2 add r0, CONTEXT_Sp - ldmia r0, {sp, lr, pc} + ldr sp, [r0] + ldr lr, [r0, #(CONTEXT_Lr - CONTEXT_Sp)] + ldr pc, [r0, #(CONTEXT_Pc - CONTEXT_Sp)] LOCAL_LABEL(No_Restore_CONTEXT_CONTROL): ldr r2, [r0, #(CONTEXT_ContextFlags)] @@ -214,4 +221,4 @@ LOCAL_LABEL(No_Restore_CONTEXT_CONTROL): sub sp, sp, #4 bx lr -LEAF_END RtlRestoreContext, _TEXT
\ No newline at end of file +LEAF_END RtlRestoreContext, _TEXT |