1/** 2 * Copyright (c) 2023-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/asm_constants.h" 18#include "arch/arm/shorty.S" 19#include "shorty_values.h" 20 21// Promise EtsAsyncCall(Method *method, ManagedThread *thread, const uint8_t *reg_args, const uint8_t *stack_args) 22.extern EtsAsyncCall 23 24// The entrypoint for an async method 25.global EtsAsyncEntryPoint 26.type EtsAsyncEntryPoint, %function 27EtsAsyncEntryPoint: 28 CFI_STARTPROC 29 CFI_DEF_CFA(sp, 0) 30 31 push {fp, lr} 32 CFI_ADJUST_CFA_OFFSET(8) 33 CFI_REL_OFFSET(lr, 4) 34 CFI_REL_OFFSET(fp, 0) 35 36 mov fp, sp 37 CFI_DEF_CFA_REGISTER(fp) 38 sub sp, sp, #8 39 str r0, [sp, #4] 40 mov lr, #CFRAME_KIND_NATIVE 41 str lr, [sp] 42 43 // Skip locals 44 sub sp, sp, #(CFRAME_LOCALS_COUNT * 4) 45 46 // save all the callee saved registers to the stack 47 // stack walker will read them during stack unwinding 48#ifndef PANDA_TARGET_ARM32_ABI_SOFT 49 vpush {d8 - d15} 50 CFI_REL_OFFSET(d15, -((CFRAME_LOCALS_COUNT + 2 + 2) * 4)) 51 CFI_REL_OFFSET(d14, -((CFRAME_LOCALS_COUNT + 2 + 4) * 4)) 52 CFI_REL_OFFSET(d13, -((CFRAME_LOCALS_COUNT + 2 + 6) * 4)) 53 CFI_REL_OFFSET(d12, -((CFRAME_LOCALS_COUNT + 2 + 8) * 4)) 54 CFI_REL_OFFSET(d11, -((CFRAME_LOCALS_COUNT + 2 + 10) * 4)) 55 CFI_REL_OFFSET(d10, -((CFRAME_LOCALS_COUNT + 2 + 12) * 4)) 56 CFI_REL_OFFSET(d9, -((CFRAME_LOCALS_COUNT + 2 + 14) * 4)) 57 CFI_REL_OFFSET(d8, -((CFRAME_LOCALS_COUNT + 2 + 16) * 4)) 58#else 59 sub sp, sp, #(8 * 8) 60#endif 61 push {r4 - r10} 62 CFI_REL_OFFSET(r10, -((CFRAME_LOCALS_COUNT + 18 + 1) * 4)) // Thread pointer 63 CFI_REL_OFFSET(r9, -((CFRAME_LOCALS_COUNT + 18 + 2) * 4)) 64 CFI_REL_OFFSET(r8, -((CFRAME_LOCALS_COUNT + 18 + 3) * 4)) 65 CFI_REL_OFFSET(r7, -((CFRAME_LOCALS_COUNT + 18 + 4) * 4)) 66 CFI_REL_OFFSET(r6, -((CFRAME_LOCALS_COUNT + 18 + 5) * 4)) 67 CFI_REL_OFFSET(r5, -((CFRAME_LOCALS_COUNT + 18 + 6) * 4)) 68 CFI_REL_OFFSET(r4, -((CFRAME_LOCALS_COUNT + 18 + 7) * 4)) 69 70 // align to 8 71 sub sp, sp, #4 72 73 // save arguments to the stack 74 push {r0 - r3} 75 mov r2, sp 76 77 str fp, [THREAD_REG, #MANAGED_THREAD_FRAME_OFFSET] 78 ldrb r7, [THREAD_REG, #MANAGED_THREAD_FRAME_KIND_OFFSET] 79 mov r1, #1 80 strb r1, [THREAD_REG, #MANAGED_THREAD_FRAME_KIND_OFFSET] 81 82 add r3, fp, #8 83 mov r1, THREAD_REG 84 bl EtsAsyncCall 85 86 strb r7, [THREAD_REG, #MANAGED_THREAD_FRAME_KIND_OFFSET] 87 mov r2, r7 88 89 // Restore callee registers, since GC may change its values while moving objects. 90 sub r1, fp, #(CFRAME_ARM_SOFTFP_CALLEE_REGS_OFFSET - 4) 91 92 ldm r1, {r4 - r10} 93 CFI_RESTORE(r10) 94 CFI_RESTORE(r9) 95 CFI_RESTORE(r8) 96 CFI_RESTORE(r7) 97 CFI_RESTORE(r6) 98 CFI_RESTORE(r5) 99 CFI_RESTORE(r4) 100 mov sp, fp 101 CFI_DEF_CFA(sp, 8) 102 pop {fp} 103 CFI_ADJUST_CFA_OFFSET(-4) 104 CFI_RESTORE(fp) 105 CFI_REMEMBER_STATE 106 107 // check native exception 108 ldr r3, [THREAD_REG, #MANAGED_THREAD_EXCEPTION_OFFSET] 109 cmp r3, #0 110 beq .Lexit 111 112 // check frame is compiled 113 cmp r2, #0 114 beq .Lexit 115 116 // check prev frame is true CFRAME and not BYPASS 117 ldr r3, [fp, #(SLOT_SIZE * COMP_METHOD_OFFSET)] 118 cmp r3, #BYPASS_BRIDGE 119 beq .Lexit 120 121 add lr, fp, #-CALLER_REG0_OFFSET 122 ldm lr, {r0-r3} 123 124#ifndef PANDA_TARGET_ARM32_ABI_SOFT 125 ldr lr, [fp, #(-CFRAME_FLAGS_SLOT * 4)] 126 tst lr, #CFRAME_HAS_FLOAT_REGS_FLAG_MASK 127 beq 1f 128 129 add lr, fp, #-CALLER_VREG0_OFFSET 130 vldm lr, {d0-d7} 1311: 132#endif 133 134 pop {lr} 135 CFI_ADJUST_CFA_OFFSET(-4) 136 CFI_RESTORE(lr) 137 138 b ThrowNativeExceptionBridge 139 CFI_RESTORE_STATE 140 141.Lexit: 142 pop {lr} 143 CFI_ADJUST_CFA_OFFSET(-4) 144 CFI_RESTORE(lr) 145 bx lr 146 CFI_ENDPROC 147