1/** 2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "arch/asm_support.h" 17#include "arch/arm/shorty.S" 18 19.macro PROXY_ENTRYPOINT name, entry 20.global \name 21.type \name, %function 22\name: 23 CFI_STARTPROC 24 CFI_DEF_CFA(sp, 0) 25 sub sp, sp, #16 26 CFI_ADJUST_CFA_OFFSET(16) 27 str lr, [sp, #12] 28 CFI_REL_OFFSET(lr, 12) 29 mov ip, #COMPILED_CODE_TO_INTERPRETER_BRIDGE 30 str ip, [sp, #8] 31 str fp, [sp, #4] 32 CFI_REL_OFFSET(fp, 4) 33 add fp, sp, #4 34 CFI_DEF_CFA_REGISTER(fp) 35 CFI_ADJUST_CFA_OFFSET(-4) 36 37 // save all the callee saved registers to the stack 38 // stack walker will read them during stack unwinding 39 push {r4 - r10} 40 CFI_REL_OFFSET(r10, -(2 * 4)) 41 CFI_REL_OFFSET(r9, -(3 * 4)) 42 CFI_REL_OFFSET(r8, -(4 * 4)) 43 CFI_REL_OFFSET(r7, -(5 * 4)) 44 CFI_REL_OFFSET(r6, -(6 * 4)) 45 CFI_REL_OFFSET(r5, -(7 * 4)) 46 CFI_REL_OFFSET(r4, -(8 * 4)) 47 48 // align to 8 49 sub sp, sp, #4 50 51 // save arguments to the stack 52 push {r0 - r3} 53 54 ldrb r7, [THREAD_REG, #MANAGED_THREAD_FRAME_KIND_OFFSET] 55 56 // If caller is the compiled method, we need to set C2I boundary frame in the TLS 57 ldrb lr, [THREAD_REG, #MANAGED_THREAD_FRAME_KIND_OFFSET] 58 cmp lr, #0 59 beq 1f 60 61 str fp, [THREAD_REG, #MANAGED_THREAD_FRAME_OFFSET] 62 631: 64 65 mov r1, sp 66 add r2, fp, #12 67 blx \entry 68 69 // Restore callee registers, since GC may change its values while moving objects. 70 sub sp, fp, #4 71 72 mov r2, r7 73 74 ldmdb sp, {r4 - r10} 75 CFI_RESTORE(r10) 76 CFI_RESTORE(r9) 77 CFI_RESTORE(r8) 78 CFI_RESTORE(r7) 79 CFI_RESTORE(r6) 80 CFI_RESTORE(r5) 81 CFI_RESTORE(r4) 82 83 sub sp, fp, #4 84 CFI_DEF_CFA(sp, 16) 85 ldr fp, [sp, #4] 86 CFI_RESTORE(fp) 87 add sp, sp, #12 // c2i 88 CFI_ADJUST_CFA_OFFSET(-12) 89 90 // check native exception 91 ldr r3, [THREAD_REG, #MANAGED_THREAD_EXCEPTION_OFFSET] 92 cmp r3, #0 93 beq 2f 94 95 // check frame is compiled 96 cmp r2, #0 97 beq 2f 98 99 // check prev frame is true CFRAME and not BYPASS 100 ldr r3, [fp, #(SLOT_SIZE * COMP_METHOD_OFFSET)] 101 cmp r3, #BYPASS_BRIDGE 102 beq 2f 103 CFI_REMEMBER_STATE 104 105 add lr, fp, #-CALLER_REG0_OFFSET 106 ldm lr, {r0-r3} 107 108#ifndef PANDA_TARGET_ARM32_ABI_SOFT 109 ldr lr, [fp, #(-CFRAME_FLAGS_SLOT * 4)] 110 tst lr, #CFRAME_HAS_FLOAT_REGS_FLAG_MASK 111 beq 3f 112 113 add lr, fp, #-CALLER_VREG0_OFFSET 114 vldm lr, {d0-d7} 1153: 116#endif 117 118 pop {lr} 119 CFI_ADJUST_CFA_OFFSET(-4) 120 CFI_RESTORE(lr) 121 122 b ThrowNativeExceptionBridge 123 CFI_RESTORE_STATE 124 1252: 126 pop {lr} 127 CFI_ADJUST_CFA_OFFSET(-4) 128 CFI_RESTORE(lr) 129 bx lr 130 CFI_ENDPROC 131.endm 132 133