diff --git a/src/vm/arm64/asmhelpers.asm b/src/vm/arm64/asmhelpers.asm index d76076588577..e8b16ded6a53 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,17 +999,42 @@ 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_NO_FP fp,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 fp, lr, #16! + 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, #96! EPILOG_RETURN NESTED_END CallEHFunclet