1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2022 The Ebitengine Authors
3
4//go:build darwin
5// +build darwin
6
7#include "textflag.h"
8#include "go_asm.h"
9
10// these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions.
11
12// TODO: put <> to make these private
13TEXT x_cgo_init_trampoline(SB), NOSPLIT, $0-0
14 MOVD R0, 8(RSP)
15 MOVD R1, 16(RSP)
16 CALL ·x_cgo_init(SB)
17 RET
18
19TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $0-0
20 MOVD R0, 8(RSP)
21 CALL ·x_cgo_thread_start(SB)
22 RET
23
24TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $0-0
25 MOVD R0, 8(RSP)
26 CALL ·x_cgo_setenv(SB)
27 RET
28
29TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $0-0
30 MOVD R0, 8(RSP)
31 CALL ·x_cgo_unsetenv(SB)
32 RET
33
34TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0
35 CALL ·x_cgo_notify_runtime_init_done(SB)
36 RET
37
38// func setg_trampoline(setg uintptr, g uintptr)
39TEXT ·setg_trampoline(SB), NOSPLIT, $0-16
40 MOVD G+8(FP), R0
41 MOVD setg+0(FP), R1
42 CALL R1
43 RET
44
45TEXT threadentry_trampoline(SB), NOSPLIT, $0-0
46 MOVD R0, 8(RSP)
47 CALL ·threadentry(SB)
48 MOVD $0, R0 // TODO: get the return value from threadentry
49 RET
50
51TEXT ·setenv(SB), NOSPLIT, $0-0
52 MOVD name+0(FP), R0
53 MOVD value+8(FP), R1
54 MOVD overwrite+16(FP), R2
55 CALL libc_setenv(SB)
56 MOVD R0, ret+24(FP)
57 RET
58
59TEXT ·unsetenv(SB), NOSPLIT, $0-0
60 MOVD name+0(FP), R0
61 CALL libc_unsetenv(SB)
62 MOVD R0, ret+8(FP)
63 RET
64
65TEXT ·malloc(SB), NOSPLIT, $0-0
66 MOVD size+0(FP), R0
67 CALL libc_malloc(SB)
68 MOVD R0, ret+8(FP)
69 RET
70
71TEXT ·free(SB), NOSPLIT, $0-0
72 MOVD ptr+0(FP), R0
73 CALL libc_free(SB)
74 RET
75
76TEXT ·pthread_attr_init(SB), NOSPLIT, $0-12
77 MOVD attr+0(FP), R0
78 CALL libc_pthread_attr_init(SB)
79 MOVD R0, ret+8(FP)
80 RET
81
82TEXT ·pthread_detach(SB), NOSPLIT, $0-12
83 MOVD thread+0(FP), R0
84 CALL libc_pthread_detach(SB)
85 MOVD R0, ret+8(FP)
86 RET
87
88TEXT ·pthread_create(SB), NOSPLIT, $0-36
89 MOVD thread+0(FP), R0
90 MOVD attr+8(FP), R1
91 MOVD start+16(FP), R2
92 MOVD arg+24(FP), R3
93 CALL libc_pthread_create(SB)
94 MOVD R0, ret+32(FP)
95 RET
96
97TEXT ·pthread_attr_destroy(SB), NOSPLIT, $0-0
98 MOVD attr+0(FP), R0
99 CALL libc_pthread_attr_destroy(SB)
100 MOVD R0, ret+8(FP)
101 RET
102
103TEXT ·pthread_attr_getstacksize(SB), NOSPLIT, $0-0
104 MOVD attr+0(FP), R0
105 MOVD stacksize+8(FP), R1
106 CALL libc_pthread_attr_getstacksize(SB)
107 MOVD R0, ret+16(FP)
108 RET
109
110TEXT ·pthread_sigmask(SB), NOSPLIT, $0-0
111 MOVD how+0(FP), R0
112 MOVD ign+8(FP), R1
113 MOVD oset+16(FP), R2
114 CALL libc_pthread_sigmask(SB)
115 MOVD R0, ret+24(FP)
116 RET
117
118TEXT ·abort(SB), NOSPLIT, $0-0
119 CALL libc_abort(SB)
120 RET
121
122TEXT ·sigfillset(SB), NOSPLIT, $0-12
123 MOVD set+0(FP), R0
124 CALL libc_sigfillset(SB)
125 MOVD R0, ret+8(FP)
126 RET
127
128TEXT ·nanosleep(SB), NOSPLIT, $0-20
129 MOVD ts+0(FP), R0
130 MOVD rem+8(FP), R1
131 CALL libc_nanosleep(SB)
132 MOVD R0, ret+16(FP)
133 RET