summaryrefslogtreecommitdiff
path: root/src/vm/arm64
diff options
context:
space:
mode:
authorSteve MacLean, Qualcomm Datacenter Technologies, Inc <sdmaclea@qti.qualcomm.com>2017-03-15 15:36:27 +0000
committerSteve MacLean, Qualcomm Datacenter Technologies, Inc <sdmaclea@qti.qualcomm.com>2017-03-15 15:38:13 +0000
commita230fe2a47f681496e5818668197bacbb52cab57 (patch)
treebf2f690ee08f857c0a266524f0e926faf4589b50 /src/vm/arm64
parent44df0f37ce9e4e4ea63718ba0b4e74d53970037a (diff)
downloadcoreclr-a230fe2a47f681496e5818668197bacbb52cab57.tar.gz
coreclr-a230fe2a47f681496e5818668197bacbb52cab57.tar.bz2
coreclr-a230fe2a47f681496e5818668197bacbb52cab57.zip
[Arm64/Windows] Backport #9500 changes
Fixes #9526
Diffstat (limited to 'src/vm/arm64')
-rw-r--r--src/vm/arm64/CallDescrWorkerARM64.asm5
-rw-r--r--src/vm/arm64/asmhelpers.asm36
-rw-r--r--src/vm/arm64/calldescrworkerarm64.S2
3 files changed, 31 insertions, 12 deletions
diff --git a/src/vm/arm64/CallDescrWorkerARM64.asm b/src/vm/arm64/CallDescrWorkerARM64.asm
index b9f8a6090d..4bd0de7f2b 100644
--- a/src/vm/arm64/CallDescrWorkerARM64.asm
+++ b/src/vm/arm64/CallDescrWorkerARM64.asm
@@ -21,7 +21,8 @@
;;void CallDescrWorkerInternal(CallDescrData * pCallDescrData);
NESTED_ENTRY CallDescrWorkerInternal,,CallDescrWorkerUnwindFrameChainHandler
PROLOG_SAVE_REG_PAIR fp, lr, #-32!
- PROLOG_SAVE_REG x19, #16 ;the stack slot at sp+24 is empty for 16 byte alligment
+ PROLOG_SAVE_REG x19, #16
+ PROLOG_SAVE_REG x0, #24
mov x19, x0 ; save pCallDescrData in x19
@@ -76,6 +77,8 @@ LNoFloatingPoint
ldr x9, [x19,#CallDescrData__pTarget]
blr x9
+ ldr x19, [fp, 24] ; Fixup corrupted X19 callee preserved register
+
ldr w3, [x19,#CallDescrData__fpReturnSize]
;; Int return case
diff --git a/src/vm/arm64/asmhelpers.asm b/src/vm/arm64/asmhelpers.asm
index d760765885..42e8c59bfc 100644
--- a/src/vm/arm64/asmhelpers.asm
+++ b/src/vm/arm64/asmhelpers.asm
@@ -159,6 +159,7 @@
RestoreRegMS 26, X26
RestoreRegMS 27, X27
RestoreRegMS 28, X28
+ RestoreRegMS 29, X29
Done
; Its imperative that the return value of HelperMethodFrameRestoreState is zero
@@ -991,16 +992,6 @@ UM2MThunk_WrapperHelper_RegArgumentsSetup
; This helper enables us to call into a funclet after restoring Fp register
NESTED_ENTRY CallEHFunclet
-
- ; Using below prolog instead of PROLOG_SAVE_REG_PAIR fp,lr, #-16!
- ; is intentional. Above statement would also emit instruction to save
- ; sp in fp. If sp is saved in fp in prolog then it is not expected that fp can change in the body
- ; of method. However, this method needs to be able to change fp before calling funclet.
- ; This is required to access locals in funclet.
- PROLOG_SAVE_REG_PAIR x19,x20, #-16!
- PROLOG_SAVE_REG fp, #0
- PROLOG_SAVE_REG lr, #8
-
; On entry:
;
; X0 = throwable
@@ -1008,16 +999,41 @@ UM2MThunk_WrapperHelper_RegArgumentsSetup
; X2 = address of X19 register in CONTEXT record; used to restore the non-volatile registers of CrawlFrame
; X3 = address of the location where the SP of funclet's caller (i.e. this helper) should be saved.
;
+
+ ; Using below prolog instead of PROLOG_SAVE_REG_PAIR fp,lr, #-16!
+ ; is intentional. Above statement would also emit instruction to save
+ ; sp in fp. If sp is saved in fp in prolog then it is not expected that fp can change in the body
+ ; of method. However, this method needs to be able to change fp before calling funclet.
+ ; This is required to access locals in funclet.
+ PROLOG_SAVE_REG_PAIR x29,lr, #-96!
+
+ ; Spill callee saved registers
+ PROLOG_SAVE_REG_PAIR x19, x20, 16
+ PROLOG_SAVE_REG_PAIR x21, x22, 32
+ PROLOG_SAVE_REG_PAIR x23, x24, 48
+ PROLOG_SAVE_REG_PAIR x25, x26, 64
+ PROLOG_SAVE_REG_PAIR x27, x28, 80
+
; Save the SP of this function. We cannot store SP directly.
mov fp, sp
str fp, [x3]
+ ldp x19, x20, [x2, #0]
+ ldp x21, x22, [x2, #16]
+ ldp x23, x24, [x2, #32]
+ ldp x25, x26, [x2, #48]
+ ldp x27, x28, [x2, #64]
ldr fp, [x2, #80] ; offset of fp in CONTEXT relative to X19
; Invoke the funclet
blr x1
nop
+ EPILOG_RESTORE_REG_PAIR x19, x20, 16
+ EPILOG_RESTORE_REG_PAIR x21, x22, 32
+ EPILOG_RESTORE_REG_PAIR x23, x24, 48
+ EPILOG_RESTORE_REG_PAIR x25, x26, 64
+ EPILOG_RESTORE_REG_PAIR x27, x28, 80
EPILOG_RESTORE_REG_PAIR fp, lr, #16!
EPILOG_RETURN
diff --git a/src/vm/arm64/calldescrworkerarm64.S b/src/vm/arm64/calldescrworkerarm64.S
index 2210d70523..f3ea970d2d 100644
--- a/src/vm/arm64/calldescrworkerarm64.S
+++ b/src/vm/arm64/calldescrworkerarm64.S
@@ -69,7 +69,7 @@ LOCAL_LABEL(NoFloatingPoint):
ldr x9, [x19,#CallDescrData__pTarget]
blr x9
- ldr x19, [fp, 24] // Fixup corrupted X19 caller preserved register
+ ldr x19, [fp, 24] // Fixup corrupted X19 callee preserved register
ldr w3, [x19,#CallDescrData__fpReturnSize]