Text file
src/runtime/sys_aix_ppc64.s
Documentation: runtime
1 // Copyright 2018 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 //
6 // System calls and other sys.stuff for ppc64, Aix
7 //
8
9 #include "go_asm.h"
10 #include "go_tls.h"
11 #include "textflag.h"
12 #include "asm_ppc64x.h"
13
14 // This function calls a C function with the function descriptor in R12
15 TEXT callCfunction<>(SB), NOSPLIT|NOFRAME,$0
16 MOVD 0(R12), R12
17 MOVD R2, 40(R1)
18 MOVD 0(R12), R0
19 MOVD 8(R12), R2
20 MOVD R0, CTR
21 BR (CTR)
22
23
24 // asmsyscall6 calls a library function with a function descriptor
25 // stored in libcall_fn and store the results in libcall struture
26 // Up to 6 arguments can be passed to this C function
27 // Called by runtime.asmcgocall
28 // It reserves a stack of 288 bytes for the C function.
29 // NOT USING GO CALLING CONVENTION
30 // runtime.asmsyscall6 is a function descriptor to the real asmsyscall6.
31 DATA runtime·asmsyscall6+0(SB)/8, $asmsyscall6<>(SB)
32 DATA runtime·asmsyscall6+8(SB)/8, $TOC(SB)
33 DATA runtime·asmsyscall6+16(SB)/8, $0
34 GLOBL runtime·asmsyscall6(SB), NOPTR, $24
35
36 TEXT asmsyscall6<>(SB),NOSPLIT,$256
37 MOVD R3, 48(R1) // Save libcall for later
38 MOVD libcall_fn(R3), R12
39 MOVD libcall_args(R3), R9
40 MOVD 0(R9), R3
41 MOVD 8(R9), R4
42 MOVD 16(R9), R5
43 MOVD 24(R9), R6
44 MOVD 32(R9), R7
45 MOVD 40(R9), R8
46 BL callCfunction<>(SB)
47
48 // Restore R0 and TOC
49 XOR R0, R0
50 MOVD 40(R1), R2
51
52 // Store result in libcall
53 MOVD 48(R1), R5
54 MOVD R3, (libcall_r1)(R5)
55 MOVD $-1, R6
56 CMP R6, R3
57 BNE skiperrno
58
59 // Save errno in libcall
60 BL runtime·load_g(SB)
61 MOVD g_m(g), R4
62 MOVD (m_mOS + mOS_perrno)(R4), R9
63 MOVW 0(R9), R9
64 MOVD R9, (libcall_err)(R5)
65 RET
66 skiperrno:
67 // Reset errno if no error has been returned
68 MOVD R0, (libcall_err)(R5)
69 RET
70
71
72 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
73 MOVW sig+8(FP), R3
74 MOVD info+16(FP), R4
75 MOVD ctx+24(FP), R5
76 MOVD fn+0(FP), R12
77 // fn is a function descriptor
78 // R2 must be saved on restore
79 MOVD 0(R12), R0
80 MOVD R2, 40(R1)
81 MOVD 8(R12), R2
82 MOVD R0, CTR
83 BL (CTR)
84 MOVD 40(R1), R2
85 BL runtime·reginit(SB)
86 RET
87
88
89 // runtime.sigtramp is a function descriptor to the real sigtramp.
90 DATA runtime·sigtramp+0(SB)/8, $sigtramp<>(SB)
91 DATA runtime·sigtramp+8(SB)/8, $TOC(SB)
92 DATA runtime·sigtramp+16(SB)/8, $0
93 GLOBL runtime·sigtramp(SB), NOPTR, $24
94
95 // This function must not have any frame as we want to control how
96 // every registers are used.
97 // TODO(aix): Implement SetCgoTraceback handler.
98 TEXT sigtramp<>(SB),NOSPLIT|NOFRAME,$0
99 MOVD LR, R0
100 MOVD R0, 16(R1)
101 // initialize essential registers (just in case)
102 BL runtime·reginit(SB)
103
104 // Note that we are executing on altsigstack here, so we have
105 // more stack available than NOSPLIT would have us believe.
106 // To defeat the linker, we make our own stack frame with
107 // more space.
108 SUB $144+FIXED_FRAME, R1
109
110 // Save registers
111 MOVD R31, 56(R1)
112 MOVD g, 64(R1)
113 MOVD R29, 72(R1)
114 MOVD R14, 80(R1)
115 MOVD R15, 88(R1)
116
117 BL runtime·load_g(SB)
118
119 CMP $0, g
120 BEQ sigtramp // g == nil
121 MOVD g_m(g), R6
122 CMP $0, R6
123 BEQ sigtramp // g.m == nil
124
125 // Save m->libcall. We need to do this because we
126 // might get interrupted by a signal in runtime·asmcgocall.
127 MOVD (m_libcall+libcall_fn)(R6), R7
128 MOVD R7, 96(R1)
129 MOVD (m_libcall+libcall_args)(R6), R7
130 MOVD R7, 104(R1)
131 MOVD (m_libcall+libcall_n)(R6), R7
132 MOVD R7, 112(R1)
133 MOVD (m_libcall+libcall_r1)(R6), R7
134 MOVD R7, 120(R1)
135 MOVD (m_libcall+libcall_r2)(R6), R7
136 MOVD R7, 128(R1)
137
138 // save errno, it might be EINTR; stuff we do here might reset it.
139 MOVD (m_mOS+mOS_perrno)(R6), R8
140 MOVD 0(R8), R8
141 MOVD R8, 136(R1)
142
143 sigtramp:
144 MOVW R3, FIXED_FRAME+0(R1)
145 MOVD R4, FIXED_FRAME+8(R1)
146 MOVD R5, FIXED_FRAME+16(R1)
147 MOVD $runtime·sigtrampgo(SB), R12
148 MOVD R12, CTR
149 BL (CTR)
150
151 CMP $0, g
152 BEQ exit // g == nil
153 MOVD g_m(g), R6
154 CMP $0, R6
155 BEQ exit // g.m == nil
156
157 // restore libcall
158 MOVD 96(R1), R7
159 MOVD R7, (m_libcall+libcall_fn)(R6)
160 MOVD 104(R1), R7
161 MOVD R7, (m_libcall+libcall_args)(R6)
162 MOVD 112(R1), R7
163 MOVD R7, (m_libcall+libcall_n)(R6)
164 MOVD 120(R1), R7
165 MOVD R7, (m_libcall+libcall_r1)(R6)
166 MOVD 128(R1), R7
167 MOVD R7, (m_libcall+libcall_r2)(R6)
168
169 // restore errno
170 MOVD (m_mOS+mOS_perrno)(R6), R7
171 MOVD 136(R1), R8
172 MOVD R8, 0(R7)
173
174 exit:
175 // restore registers
176 MOVD 56(R1),R31
177 MOVD 64(R1),g
178 MOVD 72(R1),R29
179 MOVD 80(R1), R14
180 MOVD 88(R1), R15
181
182 // Don't use RET because we need to restore R31 !
183 ADD $144+FIXED_FRAME, R1
184 MOVD 16(R1), R0
185 MOVD R0, LR
186 BR (LR)
187
188 // runtime.tstart is a function descriptor to the real tstart.
189 DATA runtime·tstart+0(SB)/8, $tstart<>(SB)
190 DATA runtime·tstart+8(SB)/8, $TOC(SB)
191 DATA runtime·tstart+16(SB)/8, $0
192 GLOBL runtime·tstart(SB), NOPTR, $24
193
194 TEXT tstart<>(SB),NOSPLIT,$0
195 XOR R0, R0 // reset R0
196
197 // set g
198 MOVD m_g0(R3), g
199 BL runtime·save_g(SB)
200 MOVD R3, g_m(g)
201
202 // Layout new m scheduler stack on os stack.
203 MOVD R1, R3
204 MOVD R3, (g_stack+stack_hi)(g)
205 SUB $(const_threadStackSize), R3 // stack size
206 MOVD R3, (g_stack+stack_lo)(g)
207 ADD $const__StackGuard, R3
208 MOVD R3, g_stackguard0(g)
209 MOVD R3, g_stackguard1(g)
210
211 BL runtime·mstart(SB)
212
213 MOVD R0, R3
214 RET
215
216
217 #define CSYSCALL() \
218 MOVD 0(R12), R12 \
219 MOVD R2, 40(R1) \
220 MOVD 0(R12), R0 \
221 MOVD 8(R12), R2 \
222 MOVD R0, CTR \
223 BL (CTR) \
224 MOVD 40(R1), R2 \
225 BL runtime·reginit(SB)
226
227
228 // Runs on OS stack, called from runtime·osyield.
229 TEXT runtime·osyield1(SB),NOSPLIT,$0
230 MOVD $libc_sched_yield(SB), R12
231 CSYSCALL()
232 RET
233
234
235 // Runs on OS stack, called from runtime·sigprocmask.
236 TEXT runtime·sigprocmask1(SB),NOSPLIT,$0-24
237 MOVD how+0(FP), R3
238 MOVD new+8(FP), R4
239 MOVD old+16(FP), R5
240 MOVD $libpthread_sigthreadmask(SB), R12
241 CSYSCALL()
242 RET
243
244 // Runs on OS stack, called from runtime·usleep.
245 TEXT runtime·usleep1(SB),NOSPLIT,$0-4
246 MOVW us+0(FP), R3
247 MOVD $libc_usleep(SB), R12
248 CSYSCALL()
249 RET
250
251 // Runs on OS stack, called from runtime·exit.
252 TEXT runtime·exit1(SB),NOSPLIT,$0-4
253 MOVW code+0(FP), R3
254 MOVD $libc_exit(SB), R12
255 CSYSCALL()
256 RET
257
258 // Runs on OS stack, called from runtime·write1.
259 TEXT runtime·write2(SB),NOSPLIT,$0-28
260 MOVD fd+0(FP), R3
261 MOVD p+8(FP), R4
262 MOVW n+16(FP), R5
263 MOVD $libc_write(SB), R12
264 CSYSCALL()
265 MOVW R3, ret+24(FP)
266 RET
267
268 // Runs on OS stack, called from runtime·pthread_attr_init.
269 TEXT runtime·pthread_attr_init1(SB),NOSPLIT,$0-12
270 MOVD attr+0(FP), R3
271 MOVD $libpthread_attr_init(SB), R12
272 CSYSCALL()
273 MOVW R3, ret+8(FP)
274 RET
275
276 // Runs on OS stack, called from runtime·pthread_attr_setstacksize.
277 TEXT runtime·pthread_attr_setstacksize1(SB),NOSPLIT,$0-20
278 MOVD attr+0(FP), R3
279 MOVD size+8(FP), R4
280 MOVD $libpthread_attr_setstacksize(SB), R12
281 CSYSCALL()
282 MOVW R3, ret+16(FP)
283 RET
284
285 // Runs on OS stack, called from runtime·pthread_setdetachstate.
286 TEXT runtime·pthread_attr_setdetachstate1(SB),NOSPLIT,$0-20
287 MOVD attr+0(FP), R3
288 MOVW state+8(FP), R4
289 MOVD $libpthread_attr_setdetachstate(SB), R12
290 CSYSCALL()
291 MOVW R3, ret+16(FP)
292 RET
293
294 // Runs on OS stack, called from runtime·pthread_create.
295 TEXT runtime·pthread_create1(SB),NOSPLIT,$0-36
296 MOVD tid+0(FP), R3
297 MOVD attr+8(FP), R4
298 MOVD fn+16(FP), R5
299 MOVD arg+24(FP), R6
300 MOVD $libpthread_create(SB), R12
301 CSYSCALL()
302 MOVW R3, ret+32(FP)
303 RET
304
305 // Runs on OS stack, called from runtime·sigaction.
306 TEXT runtime·sigaction1(SB),NOSPLIT,$0-24
307 MOVD sig+0(FP), R3
308 MOVD new+8(FP), R4
309 MOVD old+16(FP), R5
310 MOVD $libc_sigaction(SB), R12
311 CSYSCALL()
312 RET
313
View as plain text