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