summaryrefslogtreecommitdiff
path: root/src/pal/src/arch
diff options
context:
space:
mode:
authorGeoff Norton <kangaroo@clr.ninja>2015-09-04 03:26:34 +0000
committerGeoff Norton <kangaroo@clr.ninja>2015-09-04 05:04:59 +0000
commit7436b1ab19a090317f1cd3c8917cf0671ce1963c (patch)
tree013f1e4f8a0ad3f92b0c46fb09f1eef38127ddbe /src/pal/src/arch
parent1165038551b7ca20f230d867dc5fd2357ede14fe (diff)
downloadcoreclr-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.S15
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