diff options
author | Steve MacLean, Qualcomm Datacenter Technologies, Inc <sdmaclea@qti.qualcomm.com> | 2017-03-15 15:36:27 +0000 |
---|---|---|
committer | Steve MacLean, Qualcomm Datacenter Technologies, Inc <sdmaclea@qti.qualcomm.com> | 2017-03-15 15:38:13 +0000 |
commit | a230fe2a47f681496e5818668197bacbb52cab57 (patch) | |
tree | bf2f690ee08f857c0a266524f0e926faf4589b50 /src | |
parent | 44df0f37ce9e4e4ea63718ba0b4e74d53970037a (diff) | |
download | coreclr-a230fe2a47f681496e5818668197bacbb52cab57.tar.gz coreclr-a230fe2a47f681496e5818668197bacbb52cab57.tar.bz2 coreclr-a230fe2a47f681496e5818668197bacbb52cab57.zip |
[Arm64/Windows] Backport #9500 changes
Fixes #9526
Diffstat (limited to 'src')
-rw-r--r-- | src/vm/arm64/CallDescrWorkerARM64.asm | 5 | ||||
-rw-r--r-- | src/vm/arm64/asmhelpers.asm | 36 | ||||
-rw-r--r-- | src/vm/arm64/calldescrworkerarm64.S | 2 |
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] |