• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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