1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2022 The Ebitengine Authors
3
4//go:build !cgo && (darwin || freebsd || linux || netbsd)
5
6#include "textflag.h"
7#include "go_asm.h"
8#include "abi_arm64.h"
9
10// These trampolines map the gcc ABI to Go ABIInternal and then calls into the Go equivalent functions.
11// Note that C arguments are passed in R0-R7, which matches Go ABIInternal for the first eight arguments.
12// R9 is used as a temporary register.
13
14TEXT x_cgo_init_trampoline(SB), NOSPLIT, $0-0
15 MOVD ·x_cgo_init_call(SB), R9
16 MOVD (R9), R9
17 CALL R9
18 RET
19
20TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $0-0
21 MOVD ·x_cgo_thread_start_call(SB), R9
22 MOVD (R9), R9
23 CALL R9
24 RET
25
26TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $0-0
27 MOVD ·x_cgo_setenv_call(SB), R9
28 MOVD (R9), R9
29 CALL R9
30 RET
31
32TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $0-0
33 MOVD ·x_cgo_unsetenv_call(SB), R9
34 MOVD (R9), R9
35 CALL R9
36 RET
37
38TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0
39 CALL ·x_cgo_notify_runtime_init_done(SB)
40 RET
41
42TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
43 CALL ·x_cgo_bindm(SB)
44 RET
45
46// func setg_trampoline(setg uintptr, g uintptr)
47TEXT ·setg_trampoline(SB), NOSPLIT, $0-16
48 MOVD G+8(FP), R0
49 MOVD setg+0(FP), R9
50 CALL R9
51 RET
52
53TEXT threadentry_trampoline(SB), NOSPLIT, $0-0
54 // See crosscall2.
55 SUB $(8*24), RSP
56 STP (R0, R1), (8*1)(RSP)
57 MOVD R3, (8*3)(RSP)
58
59 SAVE_R19_TO_R28(8*4)
60 SAVE_F8_TO_F15(8*14)
61
62 MOVD ·threadentry_call(SB), R9
63 MOVD (R9), R9
64 CALL R9
65 MOVD $0, R0 // TODO: get the return value from threadentry
66
67 RESTORE_R19_TO_R28(8*4)
68 RESTORE_F8_TO_F15(8*14)
69 ADD $(8*24), RSP
70 RET
71
72TEXT ·call5(SB), NOSPLIT, $0-0
73 MOVD fn+0(FP), R9
74 MOVD a1+8(FP), R0
75 MOVD a2+16(FP), R1
76 MOVD a3+24(FP), R2
77 MOVD a4+32(FP), R3
78 MOVD a5+40(FP), R4
79 CALL R9
80 MOVD R0, ret+48(FP)
81 RET