Text file src/runtime/sys_linux_mips64x.s
1 // Copyright 2015 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 // +build linux
6 // +build mips64 mips64le
7
8 //
9 // System calls and other sys.stuff for mips64, Linux
10 //
11
12 #include "go_asm.h"
13 #include "go_tls.h"
14 #include "textflag.h"
15
16 #define AT_FDCWD -100
17
18 #define SYS_exit 5058
19 #define SYS_read 5000
20 #define SYS_write 5001
21 #define SYS_close 5003
22 #define SYS_getpid 5038
23 #define SYS_kill 5060
24 #define SYS_fcntl 5080
25 #define SYS_mmap 5009
26 #define SYS_munmap 5011
27 #define SYS_setitimer 5036
28 #define SYS_clone 5055
29 #define SYS_nanosleep 5034
30 #define SYS_sched_yield 5023
31 #define SYS_rt_sigreturn 5211
32 #define SYS_rt_sigaction 5013
33 #define SYS_rt_sigprocmask 5014
34 #define SYS_sigaltstack 5129
35 #define SYS_madvise 5027
36 #define SYS_mincore 5026
37 #define SYS_gettid 5178
38 #define SYS_futex 5194
39 #define SYS_sched_getaffinity 5196
40 #define SYS_exit_group 5205
41 #define SYS_epoll_create 5207
42 #define SYS_epoll_ctl 5208
43 #define SYS_tgkill 5225
44 #define SYS_openat 5247
45 #define SYS_epoll_pwait 5272
46 #define SYS_clock_gettime 5222
47 #define SYS_epoll_create1 5285
48 #define SYS_brk 5012
49
50 TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4
51 MOVW code+0(FP), R4
52 MOVV $SYS_exit_group, R2
53 SYSCALL
54 RET
55
56 // func exitThread(wait *uint32)
57 TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8
58 MOVV wait+0(FP), R1
59 // We're done using the stack.
60 MOVW $0, R2
61 SYNC
62 MOVW R2, (R1)
63 SYNC
64 MOVW $0, R4 // exit code
65 MOVV $SYS_exit, R2
66 SYSCALL
67 JMP 0(PC)
68
69 TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
70 // This uses openat instead of open, because Android O blocks open.
71 MOVW $AT_FDCWD, R4 // AT_FDCWD, so this acts like open
72 MOVV name+0(FP), R5
73 MOVW mode+8(FP), R6
74 MOVW perm+12(FP), R7
75 MOVV $SYS_openat, R2
76 SYSCALL
77 BEQ R7, 2(PC)
78 MOVW $-1, R2
79 MOVW R2, ret+16(FP)
80 RET
81
82 TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12
83 MOVW fd+0(FP), R4
84 MOVV $SYS_close, R2
85 SYSCALL
86 BEQ R7, 2(PC)
87 MOVW $-1, R2
88 MOVW R2, ret+8(FP)
89 RET
90
91 TEXT runtime·write(SB),NOSPLIT|NOFRAME,$0-28
92 MOVV fd+0(FP), R4
93 MOVV p+8(FP), R5
94 MOVW n+16(FP), R6
95 MOVV $SYS_write, R2
96 SYSCALL
97 BEQ R7, 2(PC)
98 MOVW $-1, R2
99 MOVW R2, ret+24(FP)
100 RET
101
102 TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
103 MOVW fd+0(FP), R4
104 MOVV p+8(FP), R5
105 MOVW n+16(FP), R6
106 MOVV $SYS_read, R2
107 SYSCALL
108 BEQ R7, 2(PC)
109 MOVW $-1, R2
110 MOVW R2, ret+24(FP)
111 RET
112
113 TEXT runtime·usleep(SB),NOSPLIT,$16-4
114 MOVWU usec+0(FP), R3
115 MOVV R3, R5
116 MOVW $1000000, R4
117 DIVVU R4, R3
118 MOVV LO, R3
119 MOVV R3, 8(R29)
120 MOVW $1000, R4
121 MULVU R3, R4
122 MOVV LO, R4
123 SUBVU R4, R5
124 MOVV R5, 16(R29)
125
126 // nanosleep(&ts, 0)
127 ADDV $8, R29, R4
128 MOVW $0, R5
129 MOVV $SYS_nanosleep, R2
130 SYSCALL
131 RET
132
133 TEXT runtime·gettid(SB),NOSPLIT,$0-4
134 MOVV $SYS_gettid, R2
135 SYSCALL
136 MOVW R2, ret+0(FP)
137 RET
138
139 TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0
140 MOVV $SYS_getpid, R2
141 SYSCALL
142 MOVW R2, R16
143 MOVV $SYS_gettid, R2
144 SYSCALL
145 MOVW R2, R5 // arg 2 tid
146 MOVW R16, R4 // arg 1 pid
147 MOVW sig+0(FP), R6 // arg 3
148 MOVV $SYS_tgkill, R2
149 SYSCALL
150 RET
151
152 TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
153 MOVV $SYS_getpid, R2
154 SYSCALL
155 MOVW R2, R4 // arg 1 pid
156 MOVW sig+0(FP), R5 // arg 2
157 MOVV $SYS_kill, R2
158 SYSCALL
159 RET
160
161 TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
162 MOVW mode+0(FP), R4
163 MOVV new+8(FP), R5
164 MOVV old+16(FP), R6
165 MOVV $SYS_setitimer, R2
166 SYSCALL
167 RET
168
169 TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28
170 MOVV addr+0(FP), R4
171 MOVV n+8(FP), R5
172 MOVV dst+16(FP), R6
173 MOVV $SYS_mincore, R2
174 SYSCALL
175 SUBVU R2, R0, R2 // caller expects negative errno
176 MOVW R2, ret+24(FP)
177 RET
178
179 // func walltime() (sec int64, nsec int32)
180 TEXT runtime·walltime(SB),NOSPLIT,$16
181 MOVW $0, R4 // CLOCK_REALTIME
182 MOVV $0(R29), R5
183 MOVV $SYS_clock_gettime, R2
184 SYSCALL
185 MOVV 0(R29), R3 // sec
186 MOVV 8(R29), R5 // nsec
187 MOVV R3, sec+0(FP)
188 MOVW R5, nsec+8(FP)
189 RET
190
191 TEXT runtime·nanotime(SB),NOSPLIT,$16
192 MOVW $1, R4 // CLOCK_MONOTONIC
193 MOVV $0(R29), R5
194 MOVV $SYS_clock_gettime, R2
195 SYSCALL
196 MOVV 0(R29), R3 // sec
197 MOVV 8(R29), R5 // nsec
198 // sec is in R3, nsec in R5
199 // return nsec in R3
200 MOVV $1000000000, R4
201 MULVU R4, R3
202 MOVV LO, R3
203 ADDVU R5, R3
204 MOVV R3, ret+0(FP)
205 RET
206
207 TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28
208 MOVW how+0(FP), R4
209 MOVV new+8(FP), R5
210 MOVV old+16(FP), R6
211 MOVW size+24(FP), R7
212 MOVV $SYS_rt_sigprocmask, R2
213 SYSCALL
214 BEQ R7, 2(PC)
215 MOVV R0, 0xf1(R0) // crash
216 RET
217
218 TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36
219 MOVV sig+0(FP), R4
220 MOVV new+8(FP), R5
221 MOVV old+16(FP), R6
222 MOVV size+24(FP), R7
223 MOVV $SYS_rt_sigaction, R2
224 SYSCALL
225 BEQ R7, 2(PC)
226 SUBVU R2, R0, R2 // caller expects negative errno
227 MOVW R2, ret+32(FP)
228 RET
229
230 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
231 MOVW sig+8(FP), R4
232 MOVV info+16(FP), R5
233 MOVV ctx+24(FP), R6
234 MOVV fn+0(FP), R25
235 JAL (R25)
236 RET
237
238 TEXT runtime·sigtramp(SB),NOSPLIT,$64
239 // initialize REGSB = PC&0xffffffff00000000
240 BGEZAL R0, 1(PC)
241 SRLV $32, R31, RSB
242 SLLV $32, RSB
243
244 // this might be called in external code context,
245 // where g is not set.
246 MOVB runtime·iscgo(SB), R1
247 BEQ R1, 2(PC)
248 JAL runtime·load_g(SB)
249
250 MOVW R4, 8(R29)
251 MOVV R5, 16(R29)
252 MOVV R6, 24(R29)
253 MOVV $runtime·sigtrampgo(SB), R1
254 JAL (R1)
255 RET
256
257 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0
258 JMP runtime·sigtramp(SB)
259
260 TEXT runtime·mmap(SB),NOSPLIT|NOFRAME,$0
261 MOVV addr+0(FP), R4
262 MOVV n+8(FP), R5
263 MOVW prot+16(FP), R6
264 MOVW flags+20(FP), R7
265 MOVW fd+24(FP), R8
266 MOVW off+28(FP), R9
267
268 MOVV $SYS_mmap, R2
269 SYSCALL
270 BEQ R7, ok
271 MOVV $0, p+32(FP)
272 MOVV R2, err+40(FP)
273 RET
274 ok:
275 MOVV R2, p+32(FP)
276 MOVV $0, err+40(FP)
277 RET
278
279 TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0
280 MOVV addr+0(FP), R4
281 MOVV n+8(FP), R5
282 MOVV $SYS_munmap, R2
283 SYSCALL
284 BEQ R7, 2(PC)
285 MOVV R0, 0xf3(R0) // crash
286 RET
287
288 TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0
289 MOVV addr+0(FP), R4
290 MOVV n+8(FP), R5
291 MOVW flags+16(FP), R6
292 MOVV $SYS_madvise, R2
293 SYSCALL
294 MOVW R2, ret+24(FP)
295 RET
296
297 // int64 futex(int32 *uaddr, int32 op, int32 val,
298 // struct timespec *timeout, int32 *uaddr2, int32 val2);
299 TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0
300 MOVV addr+0(FP), R4
301 MOVW op+8(FP), R5
302 MOVW val+12(FP), R6
303 MOVV ts+16(FP), R7
304 MOVV addr2+24(FP), R8
305 MOVW val3+32(FP), R9
306 MOVV $SYS_futex, R2
307 SYSCALL
308 BEQ R7, 2(PC)
309 SUBVU R2, R0, R2 // caller expects negative errno
310 MOVW R2, ret+40(FP)
311 RET
312
313 // int64 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void));
314 TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0
315 MOVW flags+0(FP), R4
316 MOVV stk+8(FP), R5
317
318 // Copy mp, gp, fn off parent stack for use by child.
319 // Careful: Linux system call clobbers ???.
320 MOVV mp+16(FP), R16
321 MOVV gp+24(FP), R17
322 MOVV fn+32(FP), R18
323
324 MOVV R16, -8(R5)
325 MOVV R17, -16(R5)
326 MOVV R18, -24(R5)
327 MOVV $1234, R16
328 MOVV R16, -32(R5)
329
330 MOVV $SYS_clone, R2
331 SYSCALL
332 BEQ R7, 2(PC)
333 SUBVU R2, R0, R2 // caller expects negative errno
334
335 // In parent, return.
336 BEQ R2, 3(PC)
337 MOVW R2, ret+40(FP)
338 RET
339
340 // In child, on new stack.
341 MOVV -32(R29), R16
342 MOVV $1234, R1
343 BEQ R16, R1, 2(PC)
344 MOVV R0, 0(R0)
345
346 // Initialize m->procid to Linux tid
347 MOVV $SYS_gettid, R2
348 SYSCALL
349
350 MOVV -24(R29), R18 // fn
351 MOVV -16(R29), R17 // g
352 MOVV -8(R29), R16 // m
353
354 BEQ R16, nog
355 BEQ R17, nog
356
357 MOVV R2, m_procid(R16)
358
359 // TODO: setup TLS.
360
361 // In child, set up new stack
362 MOVV R16, g_m(R17)
363 MOVV R17, g
364 //CALL runtime·stackcheck(SB)
365
366 nog:
367 // Call fn
368 JAL (R18)
369
370 // It shouldn't return. If it does, exit that thread.
371 MOVW $111, R4
372 MOVV $SYS_exit, R2
373 SYSCALL
374 JMP -3(PC) // keep exiting
375
376 TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0
377 MOVV new+0(FP), R4
378 MOVV old+8(FP), R5
379 MOVV $SYS_sigaltstack, R2
380 SYSCALL
381 BEQ R7, 2(PC)
382 MOVV R0, 0xf1(R0) // crash
383 RET
384
385 TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0
386 MOVV $SYS_sched_yield, R2
387 SYSCALL
388 RET
389
390 TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0
391 MOVV pid+0(FP), R4
392 MOVV len+8(FP), R5
393 MOVV buf+16(FP), R6
394 MOVV $SYS_sched_getaffinity, R2
395 SYSCALL
396 BEQ R7, 2(PC)
397 SUBVU R2, R0, R2 // caller expects negative errno
398 MOVW R2, ret+24(FP)
399 RET
400
401 // int32 runtime·epollcreate(int32 size);
402 TEXT runtime·epollcreate(SB),NOSPLIT|NOFRAME,$0
403 MOVW size+0(FP), R4
404 MOVV $SYS_epoll_create, R2
405 SYSCALL
406 BEQ R7, 2(PC)
407 SUBVU R2, R0, R2 // caller expects negative errno
408 MOVW R2, ret+8(FP)
409 RET
410
411 // int32 runtime·epollcreate1(int32 flags);
412 TEXT runtime·epollcreate1(SB),NOSPLIT|NOFRAME,$0
413 MOVW flags+0(FP), R4
414 MOVV $SYS_epoll_create1, R2
415 SYSCALL
416 BEQ R7, 2(PC)
417 SUBVU R2, R0, R2 // caller expects negative errno
418 MOVW R2, ret+8(FP)
419 RET
420
421 // func epollctl(epfd, op, fd int32, ev *epollEvent) int
422 TEXT runtime·epollctl(SB),NOSPLIT|NOFRAME,$0
423 MOVW epfd+0(FP), R4
424 MOVW op+4(FP), R5
425 MOVW fd+8(FP), R6
426 MOVV ev+16(FP), R7
427 MOVV $SYS_epoll_ctl, R2
428 SYSCALL
429 SUBVU R2, R0, R2 // caller expects negative errno
430 MOVW R2, ret+24(FP)
431 RET
432
433 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
434 TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0
435 // This uses pwait instead of wait, because Android O blocks wait.
436 MOVW epfd+0(FP), R4
437 MOVV ev+8(FP), R5
438 MOVW nev+16(FP), R6
439 MOVW timeout+20(FP), R7
440 MOVV $0, R8
441 MOVV $SYS_epoll_pwait, R2
442 SYSCALL
443 BEQ R7, 2(PC)
444 SUBVU R2, R0, R2 // caller expects negative errno
445 MOVW R2, ret+24(FP)
446 RET
447
448 // void runtime·closeonexec(int32 fd);
449 TEXT runtime·closeonexec(SB),NOSPLIT|NOFRAME,$0
450 MOVW fd+0(FP), R4 // fd
451 MOVV $2, R5 // F_SETFD
452 MOVV $1, R6 // FD_CLOEXEC
453 MOVV $SYS_fcntl, R2
454 SYSCALL
455 RET
456
457 // func sbrk0() uintptr
458 TEXT runtime·sbrk0(SB),NOSPLIT|NOFRAME,$0-8
459 // Implemented as brk(NULL).
460 MOVV $0, R4
461 MOVV $SYS_brk, R2
462 SYSCALL
463 MOVV R2, ret+0(FP)
464 RET
465
466 TEXT runtime·access(SB),$0-20
467 MOVV R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
468 MOVW R0, ret+16(FP) // for vet
469 RET
470
471 TEXT runtime·connect(SB),$0-28
472 MOVV R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
473 MOVW R0, ret+24(FP) // for vet
474 RET
475
476 TEXT runtime·socket(SB),$0-20
477 MOVV R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
478 MOVW R0, ret+16(FP) // for vet
479 RET
View as plain text