Text file src/runtime/sys_darwin_386.s
1 // Copyright 2009 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 // System calls and other sys.stuff for 386, Darwin
6 // System calls are implemented in libSystem, this file contains
7 // trampolines that convert from Go to C calling convention.
8
9 #include "go_asm.h"
10 #include "go_tls.h"
11 #include "textflag.h"
12
13 // Exit the entire program (like C exit)
14 TEXT runtime·exit_trampoline(SB),NOSPLIT,$0
15 PUSHL BP
16 MOVL SP, BP
17 SUBL $8, SP // allocate space for callee args (must be 8 mod 16)
18 MOVL 16(SP), CX // arg ptr
19 MOVL 0(CX), AX // arg 1 exit status
20 MOVL AX, 0(SP)
21 CALL libc_exit(SB)
22 MOVL $0xf1, 0xf1 // crash
23 MOVL BP, SP
24 POPL BP
25 RET
26
27 TEXT runtime·open_trampoline(SB),NOSPLIT,$0
28 PUSHL BP
29 MOVL SP, BP
30 SUBL $24, SP
31 MOVL 32(SP), CX
32 MOVL 0(CX), AX // arg 1 name
33 MOVL AX, 0(SP)
34 MOVL 4(CX), AX // arg 2 mode
35 MOVL AX, 4(SP)
36 MOVL 8(CX), AX // arg 3 perm
37 MOVL AX, 8(SP)
38 CALL libc_open(SB)
39 MOVL BP, SP
40 POPL BP
41 RET
42
43 TEXT runtime·close_trampoline(SB),NOSPLIT,$0
44 PUSHL BP
45 MOVL SP, BP
46 SUBL $8, SP
47 MOVL 16(SP), CX
48 MOVL 0(CX), AX // arg 1 fd
49 MOVL AX, 0(SP)
50 CALL libc_close(SB)
51 MOVL BP, SP
52 POPL BP
53 RET
54
55 TEXT runtime·read_trampoline(SB),NOSPLIT,$0
56 PUSHL BP
57 MOVL SP, BP
58 SUBL $24, SP
59 MOVL 32(SP), CX
60 MOVL 0(CX), AX // arg 1 fd
61 MOVL AX, 0(SP)
62 MOVL 4(CX), AX // arg 2 buf
63 MOVL AX, 4(SP)
64 MOVL 8(CX), AX // arg 3 count
65 MOVL AX, 8(SP)
66 CALL libc_read(SB)
67 MOVL BP, SP
68 POPL BP
69 RET
70
71 TEXT runtime·write_trampoline(SB),NOSPLIT,$0
72 PUSHL BP
73 MOVL SP, BP
74 SUBL $24, SP
75 MOVL 32(SP), CX
76 MOVL 0(CX), AX // arg 1 fd
77 MOVL AX, 0(SP)
78 MOVL 4(CX), AX // arg 2 buf
79 MOVL AX, 4(SP)
80 MOVL 8(CX), AX // arg 3 count
81 MOVL AX, 8(SP)
82 CALL libc_write(SB)
83 MOVL BP, SP
84 POPL BP
85 RET
86
87 TEXT runtime·pipe_trampoline(SB),NOSPLIT,$0
88 PUSHL BP
89 MOVL SP, BP
90 SUBL $8, SP
91 MOVL 16(SP), AX // arg 1 pipefd
92 MOVL AX, 0(SP)
93 CALL libc_pipe(SB)
94 TESTL AX, AX
95 JEQ 3(PC)
96 CALL libc_error(SB) // return negative errno value
97 NEGL AX
98 MOVL BP, SP
99 POPL BP
100 RET
101
102 TEXT runtime·mmap_trampoline(SB),NOSPLIT,$0
103 PUSHL BP
104 MOVL SP, BP
105 SUBL $24, SP
106 MOVL 32(SP), CX
107 MOVL 0(CX), AX // arg 1 addr
108 MOVL AX, 0(SP)
109 MOVL 4(CX), AX // arg 2 len
110 MOVL AX, 4(SP)
111 MOVL 8(CX), AX // arg 3 prot
112 MOVL AX, 8(SP)
113 MOVL 12(CX), AX // arg 4 flags
114 MOVL AX, 12(SP)
115 MOVL 16(CX), AX // arg 5 fid
116 MOVL AX, 16(SP)
117 MOVL 20(CX), AX // arg 6 offset
118 MOVL AX, 20(SP)
119 CALL libc_mmap(SB)
120 XORL DX, DX
121 CMPL AX, $-1
122 JNE ok
123 CALL libc_error(SB)
124 MOVL (AX), DX // errno
125 XORL AX, AX
126 ok:
127 MOVL 32(SP), CX
128 MOVL AX, 24(CX) // result pointer
129 MOVL DX, 28(CX) // errno
130 MOVL BP, SP
131 POPL BP
132 RET
133
134 TEXT runtime·madvise_trampoline(SB),NOSPLIT,$0
135 PUSHL BP
136 MOVL SP, BP
137 SUBL $24, SP
138 MOVL 32(SP), CX
139 MOVL 0(CX), AX // arg 1 addr
140 MOVL AX, 0(SP)
141 MOVL 4(CX), AX // arg 2 len
142 MOVL AX, 4(SP)
143 MOVL 8(CX), AX // arg 3 advice
144 MOVL AX, 8(SP)
145 CALL libc_madvise(SB)
146 // ignore failure - maybe pages are locked
147 MOVL BP, SP
148 POPL BP
149 RET
150
151 TEXT runtime·munmap_trampoline(SB),NOSPLIT,$0
152 PUSHL BP
153 MOVL SP, BP
154 SUBL $8, SP
155 MOVL 16(SP), CX
156 MOVL 0(CX), AX // arg 1 addr
157 MOVL AX, 0(SP)
158 MOVL 4(CX), AX // arg 2 len
159 MOVL AX, 4(SP)
160 CALL libc_munmap(SB)
161 TESTL AX, AX
162 JEQ 2(PC)
163 MOVL $0xf1, 0xf1 // crash
164 MOVL BP, SP
165 POPL BP
166 RET
167
168 TEXT runtime·setitimer_trampoline(SB),NOSPLIT,$0
169 PUSHL BP
170 MOVL SP, BP
171 SUBL $24, SP
172 MOVL 32(SP), CX
173 MOVL 0(CX), AX // arg 1 mode
174 MOVL AX, 0(SP)
175 MOVL 4(CX), AX // arg 2 new
176 MOVL AX, 4(SP)
177 MOVL 8(CX), AX // arg 3 old
178 MOVL AX, 8(SP)
179 CALL libc_setitimer(SB)
180 MOVL BP, SP
181 POPL BP
182 RET
183
184 TEXT runtime·walltime_trampoline(SB),NOSPLIT,$0
185 PUSHL BP
186 MOVL SP, BP
187 SUBL $8, SP
188 MOVL 16(SP), AX
189 MOVL AX, 0(SP) // *timeval
190 MOVL $0, 4(SP) // no timezone needed
191 CALL libc_gettimeofday(SB)
192 MOVL BP, SP
193 POPL BP
194 RET
195
196 GLOBL timebase<>(SB),NOPTR,$(machTimebaseInfo__size)
197
198 TEXT runtime·nanotime_trampoline(SB),NOSPLIT,$0
199 PUSHL BP
200 MOVL SP, BP
201 SUBL $8+(machTimebaseInfo__size+15)/16*16, SP
202 CALL libc_mach_absolute_time(SB)
203 MOVL 16+(machTimebaseInfo__size+15)/16*16(SP), CX
204 MOVL AX, 0(CX)
205 MOVL DX, 4(CX)
206 MOVL timebase<>+machTimebaseInfo_denom(SB), DI // atomic read
207 MOVL timebase<>+machTimebaseInfo_numer(SB), SI
208 TESTL DI, DI
209 JNE initialized
210
211 LEAL 4(SP), AX
212 MOVL AX, 0(SP)
213 CALL libc_mach_timebase_info(SB)
214 MOVL 4+machTimebaseInfo_numer(SP), SI
215 MOVL 4+machTimebaseInfo_denom(SP), DI
216
217 MOVL SI, timebase<>+machTimebaseInfo_numer(SB)
218 MOVL DI, AX
219 XCHGL AX, timebase<>+machTimebaseInfo_denom(SB) // atomic write
220 MOVL 16+(machTimebaseInfo__size+15)/16*16(SP), CX
221
222 initialized:
223 MOVL SI, 8(CX)
224 MOVL DI, 12(CX)
225 MOVL BP, SP
226 POPL BP
227 RET
228
229 TEXT runtime·sigaction_trampoline(SB),NOSPLIT,$0
230 PUSHL BP
231 MOVL SP, BP
232 SUBL $24, SP
233 MOVL 32(SP), CX
234 MOVL 0(CX), AX // arg 1 sig
235 MOVL AX, 0(SP)
236 MOVL 4(CX), AX // arg 2 new
237 MOVL AX, 4(SP)
238 MOVL 8(CX), AX // arg 3 old
239 MOVL AX, 8(SP)
240 CALL libc_sigaction(SB)
241 TESTL AX, AX
242 JEQ 2(PC)
243 MOVL $0xf1, 0xf1 // crash
244 MOVL BP, SP
245 POPL BP
246 RET
247
248 TEXT runtime·sigprocmask_trampoline(SB),NOSPLIT,$0
249 PUSHL BP
250 MOVL SP, BP
251 SUBL $24, SP
252 MOVL 32(SP), CX
253 MOVL 0(CX), AX // arg 1 how
254 MOVL AX, 0(SP)
255 MOVL 4(CX), AX // arg 2 new
256 MOVL AX, 4(SP)
257 MOVL 8(CX), AX // arg 3 old
258 MOVL AX, 8(SP)
259 CALL libc_pthread_sigmask(SB)
260 TESTL AX, AX
261 JEQ 2(PC)
262 MOVL $0xf1, 0xf1 // crash
263 MOVL BP, SP
264 POPL BP
265 RET
266
267 TEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0
268 PUSHL BP
269 MOVL SP, BP
270 SUBL $8, SP
271 MOVL 16(SP), CX
272 MOVL 0(CX), AX // arg 1 new
273 MOVL AX, 0(SP)
274 MOVL 4(CX), AX // arg 2 old
275 MOVL AX, 4(SP)
276 CALL libc_sigaltstack(SB)
277 TESTL AX, AX
278 JEQ 2(PC)
279 MOVL $0xf1, 0xf1 // crash
280 MOVL BP, SP
281 POPL BP
282 RET
283
284 TEXT runtime·raiseproc_trampoline(SB),NOSPLIT,$0
285 PUSHL BP
286 MOVL SP, BP
287 SUBL $8, SP
288 CALL libc_getpid(SB)
289 MOVL AX, 0(SP) // arg 1 pid
290 MOVL 16(SP), CX
291 MOVL 0(CX), AX
292 MOVL AX, 4(SP) // arg 2 signal
293 CALL libc_kill(SB)
294 MOVL BP, SP
295 POPL BP
296 RET
297
298 TEXT runtime·sigfwd(SB),NOSPLIT,$0-16
299 MOVL fn+0(FP), AX
300 MOVL sig+4(FP), BX
301 MOVL info+8(FP), CX
302 MOVL ctx+12(FP), DX
303 MOVL SP, SI
304 SUBL $32, SP
305 ANDL $~15, SP // align stack: handler might be a C function
306 MOVL BX, 0(SP)
307 MOVL CX, 4(SP)
308 MOVL DX, 8(SP)
309 MOVL SI, 12(SP) // save SI: handler might be a Go function
310 CALL AX
311 MOVL 12(SP), AX
312 MOVL AX, SP
313 RET
314
315 // Sigtramp's job is to call the actual signal handler.
316 // It is called with the C calling convention, and calls out
317 // to sigtrampgo with the Go calling convention.
318 TEXT runtime·sigtramp(SB),NOSPLIT,$0
319 SUBL $28, SP
320
321 // Save callee-save registers.
322 MOVL BP, 12(SP)
323 MOVL BX, 16(SP)
324 MOVL SI, 20(SP)
325 MOVL DI, 24(SP)
326
327 MOVL 32(SP), AX
328 MOVL AX, 0(SP) // arg 1 signal number
329 MOVL 36(SP), AX
330 MOVL AX, 4(SP) // arg 2 siginfo
331 MOVL 40(SP), AX
332 MOVL AX, 8(SP) // arg 3 ctxt
333 CALL runtime·sigtrampgo(SB)
334
335 // Restore callee-save registers.
336 MOVL 12(SP), BP
337 MOVL 16(SP), BX
338 MOVL 20(SP), SI
339 MOVL 24(SP), DI
340
341 ADDL $28, SP
342 RET
343
344 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0
345 JMP runtime·sigtramp(SB)
346
347 TEXT runtime·usleep_trampoline(SB),NOSPLIT,$0
348 PUSHL BP
349 MOVL SP, BP
350 SUBL $8, SP
351 MOVL 16(SP), CX
352 MOVL 0(CX), AX // arg 1 usec
353 MOVL AX, 0(SP)
354 CALL libc_usleep(SB)
355 MOVL BP, SP
356 POPL BP
357 RET
358
359 // func setldt(entry int, address int, limit int)
360 TEXT runtime·setldt(SB),NOSPLIT,$32
361 // Nothing to do on Darwin, pthread already set thread-local storage up.
362 RET
363
364 TEXT runtime·sysctl_trampoline(SB),NOSPLIT,$0
365 PUSHL BP
366 MOVL SP, BP
367 SUBL $24, SP
368 MOVL 32(SP), CX
369 MOVL 0(CX), AX // arg 1 mib
370 MOVL AX, 0(SP)
371 MOVL 4(CX), AX // arg 2 miblen
372 MOVL AX, 4(SP)
373 MOVL 8(CX), AX // arg 3 out
374 MOVL AX, 8(SP)
375 MOVL 12(CX), AX // arg 4 size
376 MOVL AX, 12(SP)
377 MOVL 16(CX), AX // arg 5 dst
378 MOVL AX, 16(SP)
379 MOVL 20(CX), AX // arg 6 ndst
380 MOVL AX, 20(SP)
381 CALL libc_sysctl(SB)
382 MOVL BP, SP
383 POPL BP
384 RET
385
386 TEXT runtime·kqueue_trampoline(SB),NOSPLIT,$0
387 PUSHL BP
388 MOVL SP, BP
389 SUBL $8, SP
390 CALL libc_kqueue(SB)
391 MOVL BP, SP
392 POPL BP
393 RET
394
395 TEXT runtime·kevent_trampoline(SB),NOSPLIT,$0
396 PUSHL BP
397 MOVL SP, BP
398 SUBL $24, SP
399 MOVL 32(SP), CX
400 MOVL 0(CX), AX // arg 1 kq
401 MOVL AX, 0(SP)
402 MOVL 4(CX), AX // arg 2 ch
403 MOVL AX, 4(SP)
404 MOVL 8(CX), AX // arg 3 nch
405 MOVL AX, 8(SP)
406 MOVL 12(CX), AX // arg 4 ev
407 MOVL AX, 12(SP)
408 MOVL 16(CX), AX // arg 5 nev
409 MOVL AX, 16(SP)
410 MOVL 20(CX), AX // arg 6 ts
411 MOVL AX, 20(SP)
412 CALL libc_kevent(SB)
413 CMPL AX, $-1
414 JNE ok
415 CALL libc_error(SB)
416 MOVL (AX), AX // errno
417 NEGL AX // caller wants it as a negative error code
418 ok:
419 MOVL BP, SP
420 POPL BP
421 RET
422
423 TEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0
424 PUSHL BP
425 MOVL SP, BP
426 SUBL $24, SP
427 MOVL 32(SP), CX
428 MOVL 0(CX), AX // arg 1 fd
429 MOVL AX, 0(SP)
430 MOVL 4(CX), AX // arg 2 cmd
431 MOVL AX, 4(SP)
432 MOVL 8(CX), AX // arg 3 arg
433 MOVL AX, 8(SP)
434 CALL libc_fcntl(SB)
435 MOVL BP, SP
436 POPL BP
437 RET
438
439 // mstart_stub is the first function executed on a new thread started by pthread_create.
440 // It just does some low-level setup and then calls mstart.
441 // Note: called with the C calling convention.
442 TEXT runtime·mstart_stub(SB),NOSPLIT,$0
443 // The value at SP+4 points to the m.
444 // We are already on m's g0 stack.
445
446 // Save callee-save registers.
447 SUBL $16, SP
448 MOVL BP, 0(SP)
449 MOVL BX, 4(SP)
450 MOVL SI, 8(SP)
451 MOVL DI, 12(SP)
452
453 MOVL SP, AX // hide argument read from vet (vet thinks this function is using the Go calling convention)
454 MOVL 20(AX), DI // m
455 MOVL m_g0(DI), DX // g
456
457 // Initialize TLS entry.
458 // See cmd/link/internal/ld/sym.go:computeTLSOffset.
459 MOVL DX, 0x18(GS)
460
461 // Someday the convention will be D is always cleared.
462 CLD
463
464 CALL runtime·mstart(SB)
465
466 // Restore callee-save registers.
467 MOVL 0(SP), BP
468 MOVL 4(SP), BX
469 MOVL 8(SP), SI
470 MOVL 12(SP), DI
471
472 // Go is all done with this OS thread.
473 // Tell pthread everything is ok (we never join with this thread, so
474 // the value here doesn't really matter).
475 XORL AX, AX
476
477 ADDL $16, SP
478 RET
479
480 TEXT runtime·pthread_attr_init_trampoline(SB),NOSPLIT,$0
481 PUSHL BP
482 MOVL SP, BP
483 SUBL $8, SP
484 MOVL 16(SP), CX
485 MOVL 0(CX), AX // arg 1 attr
486 MOVL AX, 0(SP)
487 CALL libc_pthread_attr_init(SB)
488 MOVL BP, SP
489 POPL BP
490 RET
491
492 TEXT runtime·pthread_attr_getstacksize_trampoline(SB),NOSPLIT,$0
493 PUSHL BP
494 MOVL SP, BP
495 SUBL $8, SP
496 MOVL 16(SP), CX
497 MOVL 0(CX), AX // arg 1 attr
498 MOVL AX, 0(SP)
499 MOVL 4(CX), AX // arg 2 size
500 MOVL AX, 4(SP)
501 CALL libc_pthread_attr_getstacksize(SB)
502 MOVL BP, SP
503 POPL BP
504 RET
505
506 TEXT runtime·pthread_attr_setdetachstate_trampoline(SB),NOSPLIT,$0
507 PUSHL BP
508 MOVL SP, BP
509 SUBL $8, SP
510 MOVL 16(SP), CX
511 MOVL 0(CX), AX // arg 1 attr
512 MOVL AX, 0(SP)
513 MOVL 4(CX), AX // arg 2 state
514 MOVL AX, 4(SP)
515 CALL libc_pthread_attr_setdetachstate(SB)
516 MOVL BP, SP
517 POPL BP
518 RET
519
520 TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0
521 PUSHL BP
522 MOVL SP, BP
523 SUBL $24, SP
524 MOVL 32(SP), CX
525 LEAL 16(SP), AX // arg "0" &threadid (which we throw away)
526 MOVL AX, 0(SP)
527 MOVL 0(CX), AX // arg 1 attr
528 MOVL AX, 4(SP)
529 MOVL 4(CX), AX // arg 2 start
530 MOVL AX, 8(SP)
531 MOVL 8(CX), AX // arg 3 arg
532 MOVL AX, 12(SP)
533 CALL libc_pthread_create(SB)
534 MOVL BP, SP
535 POPL BP
536 RET
537
538 TEXT runtime·raise_trampoline(SB),NOSPLIT,$0
539 PUSHL BP
540 MOVL SP, BP
541 SUBL $8, SP
542 MOVL 16(SP), CX
543 MOVL 0(CX), AX // arg 1 sig
544 MOVL AX, 0(SP)
545 CALL libc_raise(SB)
546 MOVL BP, SP
547 POPL BP
548 RET
549
550 TEXT runtime·pthread_mutex_init_trampoline(SB),NOSPLIT,$0
551 PUSHL BP
552 MOVL SP, BP
553 SUBL $8, SP
554 MOVL 16(SP), CX
555 MOVL 0(CX), AX // arg 1 mutex
556 MOVL AX, 0(SP)
557 MOVL 4(CX), AX // arg 2 attr
558 MOVL AX, 4(SP)
559 CALL libc_pthread_mutex_init(SB)
560 MOVL BP, SP
561 POPL BP
562 RET
563
564 TEXT runtime·pthread_mutex_lock_trampoline(SB),NOSPLIT,$0
565 PUSHL BP
566 MOVL SP, BP
567 SUBL $8, SP
568 MOVL 16(SP), CX
569 MOVL 0(CX), AX // arg 1 mutex
570 MOVL AX, 0(SP)
571 CALL libc_pthread_mutex_lock(SB)
572 MOVL BP, SP
573 POPL BP
574 RET
575
576 TEXT runtime·pthread_mutex_unlock_trampoline(SB),NOSPLIT,$0
577 PUSHL BP
578 MOVL SP, BP
579 SUBL $8, SP
580 MOVL 16(SP), CX
581 MOVL 0(CX), AX // arg 1 mutex
582 MOVL AX, 0(SP)
583 CALL libc_pthread_mutex_unlock(SB)
584 MOVL BP, SP
585 POPL BP
586 RET
587
588 TEXT runtime·pthread_cond_init_trampoline(SB),NOSPLIT,$0
589 PUSHL BP
590 MOVL SP, BP
591 SUBL $8, SP
592 MOVL 16(SP), CX
593 MOVL 0(CX), AX // arg 1 cond
594 MOVL AX, 0(SP)
595 MOVL 4(CX), AX // arg 2 attr
596 MOVL AX, 4(SP)
597 CALL libc_pthread_cond_init(SB)
598 MOVL BP, SP
599 POPL BP
600 RET
601
602 TEXT runtime·pthread_cond_wait_trampoline(SB),NOSPLIT,$0
603 PUSHL BP
604 MOVL SP, BP
605 SUBL $8, SP
606 MOVL 16(SP), CX
607 MOVL 0(CX), AX // arg 1 cond
608 MOVL AX, 0(SP)
609 MOVL 4(CX), AX // arg 2 mutex
610 MOVL AX, 4(SP)
611 CALL libc_pthread_cond_wait(SB)
612 MOVL BP, SP
613 POPL BP
614 RET
615
616 TEXT runtime·pthread_cond_timedwait_relative_np_trampoline(SB),NOSPLIT,$0
617 PUSHL BP
618 MOVL SP, BP
619 SUBL $24, SP
620 MOVL 32(SP), CX
621 MOVL 0(CX), AX // arg 1 cond
622 MOVL AX, 0(SP)
623 MOVL 4(CX), AX // arg 2 mutex
624 MOVL AX, 4(SP)
625 MOVL 8(CX), AX // arg 3 timeout
626 MOVL AX, 8(SP)
627 CALL libc_pthread_cond_timedwait_relative_np(SB)
628 MOVL BP, SP
629 POPL BP
630 RET
631
632 TEXT runtime·pthread_cond_signal_trampoline(SB),NOSPLIT,$0
633 PUSHL BP
634 MOVL SP, BP
635 SUBL $8, SP
636 MOVL 16(SP), CX
637 MOVL 0(CX), AX // arg 1 cond
638 MOVL AX, 0(SP)
639 CALL libc_pthread_cond_signal(SB)
640 MOVL BP, SP
641 POPL BP
642 RET
643
644 // syscall calls a function in libc on behalf of the syscall package.
645 // syscall takes a pointer to a struct like:
646 // struct {
647 // fn uintptr
648 // a1 uintptr
649 // a2 uintptr
650 // a3 uintptr
651 // r1 uintptr
652 // r2 uintptr
653 // err uintptr
654 // }
655 // syscall must be called on the g0 stack with the
656 // C calling convention (use libcCall).
657 TEXT runtime·syscall(SB),NOSPLIT,$0
658 PUSHL BP
659 MOVL SP, BP
660 SUBL $24, SP
661 MOVL 32(SP), CX
662 MOVL (0*4)(CX), AX // fn
663 MOVL (1*4)(CX), DX // a1
664 MOVL DX, 0(SP)
665 MOVL (2*4)(CX), DX // a2
666 MOVL DX, 4(SP)
667 MOVL (3*4)(CX), DX // a3
668 MOVL DX, 8(SP)
669
670 CALL AX
671
672 MOVL 32(SP), CX
673 MOVL AX, (4*4)(CX) // r1
674 MOVL DX, (5*4)(CX) // r2
675
676 // Standard libc functions return -1 on error
677 // and set errno.
678 CMPL AX, $-1
679 JNE ok
680
681 // Get error code from libc.
682 CALL libc_error(SB)
683 MOVL (AX), AX
684 MOVL 32(SP), CX
685 MOVL AX, (6*4)(CX) // err
686
687 ok:
688 XORL AX, AX // no error (it's ignored anyway)
689 MOVL BP, SP
690 POPL BP
691 RET
692
693 // syscallPtr is like syscall except the libc function reports an
694 // error by returning NULL and setting errno.
695 TEXT runtime·syscallPtr(SB),NOSPLIT,$0
696 PUSHL BP
697 MOVL SP, BP
698 SUBL $24, SP
699 MOVL 32(SP), CX
700 MOVL (0*4)(CX), AX // fn
701 MOVL (1*4)(CX), DX // a1
702 MOVL DX, 0(SP)
703 MOVL (2*4)(CX), DX // a2
704 MOVL DX, 4(SP)
705 MOVL (3*4)(CX), DX // a3
706 MOVL DX, 8(SP)
707
708 CALL AX
709
710 MOVL 32(SP), CX
711 MOVL AX, (4*4)(CX) // r1
712 MOVL DX, (5*4)(CX) // r2
713
714 // syscallPtr libc functions return NULL on error
715 // and set errno.
716 TESTL AX, AX
717 JNE ok
718
719 // Get error code from libc.
720 CALL libc_error(SB)
721 MOVL (AX), AX
722 MOVL 32(SP), CX
723 MOVL AX, (6*4)(CX) // err
724
725 ok:
726 XORL AX, AX // no error (it's ignored anyway)
727 MOVL BP, SP
728 POPL BP
729 RET
730
731 // syscall6 calls a function in libc on behalf of the syscall package.
732 // syscall6 takes a pointer to a struct like:
733 // struct {
734 // fn uintptr
735 // a1 uintptr
736 // a2 uintptr
737 // a3 uintptr
738 // a4 uintptr
739 // a5 uintptr
740 // a6 uintptr
741 // r1 uintptr
742 // r2 uintptr
743 // err uintptr
744 // }
745 // syscall6 must be called on the g0 stack with the
746 // C calling convention (use libcCall).
747 TEXT runtime·syscall6(SB),NOSPLIT,$0
748 PUSHL BP
749 MOVL SP, BP
750 SUBL $24, SP
751 MOVL 32(SP), CX
752 MOVL (0*4)(CX), AX // fn
753 MOVL (1*4)(CX), DX // a1
754 MOVL DX, 0(SP)
755 MOVL (2*4)(CX), DX // a2
756 MOVL DX, 4(SP)
757 MOVL (3*4)(CX), DX // a3
758 MOVL DX, 8(SP)
759 MOVL (4*4)(CX), DX // a4
760 MOVL DX, 12(SP)
761 MOVL (5*4)(CX), DX // a5
762 MOVL DX, 16(SP)
763 MOVL (6*4)(CX), DX // a6
764 MOVL DX, 20(SP)
765
766 CALL AX
767
768 MOVL 32(SP), CX
769 MOVL AX, (7*4)(CX) // r1
770 MOVL DX, (8*4)(CX) // r2
771
772 // Standard libc functions return -1 on error
773 // and set errno.
774 CMPL AX, $-1
775 JNE ok
776
777 // Get error code from libc.
778 CALL libc_error(SB)
779 MOVL (AX), AX
780 MOVL 32(SP), CX
781 MOVL AX, (9*4)(CX) // err
782
783 ok:
784 XORL AX, AX // no error (it's ignored anyway)
785 MOVL BP, SP
786 POPL BP
787 RET
788
789 // syscall6X calls a function in libc on behalf of the syscall package.
790 // syscall6X takes a pointer to a struct like:
791 // struct {
792 // fn uintptr
793 // a1 uintptr
794 // a2 uintptr
795 // a3 uintptr
796 // a4 uintptr
797 // a5 uintptr
798 // a6 uintptr
799 // r1 uintptr
800 // r2 uintptr
801 // err uintptr
802 // }
803 // syscall6X must be called on the g0 stack with the
804 // C calling convention (use libcCall).
805 TEXT runtime·syscall6X(SB),NOSPLIT,$0
806 PUSHL BP
807 MOVL SP, BP
808 SUBL $24, SP
809 MOVL 32(SP), CX
810 MOVL (0*4)(CX), AX // fn
811 MOVL (1*4)(CX), DX // a1
812 MOVL DX, 0(SP)
813 MOVL (2*4)(CX), DX // a2
814 MOVL DX, 4(SP)
815 MOVL (3*4)(CX), DX // a3
816 MOVL DX, 8(SP)
817 MOVL (4*4)(CX), DX // a4
818 MOVL DX, 12(SP)
819 MOVL (5*4)(CX), DX // a5
820 MOVL DX, 16(SP)
821 MOVL (6*4)(CX), DX // a6
822 MOVL DX, 20(SP)
823
824 CALL AX
825
826 MOVL 32(SP), CX
827 MOVL AX, (7*4)(CX) // r1
828 MOVL DX, (8*4)(CX) // r2
829
830 // Standard libc functions return -1 on error
831 // and set errno.
832 CMPL AX, $-1
833 JNE ok
834 CMPL DX, $-1
835 JNE ok
836
837 // Get error code from libc.
838 CALL libc_error(SB)
839 MOVL (AX), AX
840 MOVL 32(SP), CX
841 MOVL AX, (9*4)(CX) // err
842
843 ok:
844 XORL AX, AX // no error (it's ignored anyway)
845 MOVL BP, SP
846 POPL BP
847 RET
848
849 // syscall9 calls a function in libc on behalf of the syscall package.
850 // syscall9 takes a pointer to a struct like:
851 // struct {
852 // fn uintptr
853 // a1 uintptr
854 // a2 uintptr
855 // a3 uintptr
856 // a4 uintptr
857 // a5 uintptr
858 // a6 uintptr
859 // a7 uintptr
860 // a8 uintptr
861 // a9 uintptr
862 // r1 uintptr
863 // r2 uintptr
864 // err uintptr
865 // }
866 // syscall9 must be called on the g0 stack with the
867 // C calling convention (use libcCall).
868 TEXT runtime·syscall9(SB),NOSPLIT,$0
869 PUSHL BP
870 MOVL SP, BP
871 SUBL $40, SP
872 MOVL 48(SP), CX
873 MOVL (0*4)(CX), AX // fn
874 MOVL (1*4)(CX), DX // a1
875 MOVL DX, 0(SP)
876 MOVL (2*4)(CX), DX // a2
877 MOVL DX, 4(SP)
878 MOVL (3*4)(CX), DX // a3
879 MOVL DX, 8(SP)
880 MOVL (4*4)(CX), DX // a4
881 MOVL DX, 12(SP)
882 MOVL (5*4)(CX), DX // a5
883 MOVL DX, 16(SP)
884 MOVL (6*4)(CX), DX // a6
885 MOVL DX, 20(SP)
886 MOVL (7*4)(CX), DX // a7
887 MOVL DX, 24(SP)
888 MOVL (8*4)(CX), DX // a8
889 MOVL DX, 28(SP)
890 MOVL (9*4)(CX), DX // a9
891 MOVL DX, 32(SP)
892
893 CALL AX
894
895 MOVL 48(SP), CX
896 MOVL AX, (10*4)(CX) // r1
897 MOVL DX, (11*4)(CX) // r2
898
899 // Standard libc functions return -1 on error
900 // and set errno.
901 CMPL AX, $-1
902 JNE ok
903
904 // Get error code from libc.
905 CALL libc_error(SB)
906 MOVL (AX), AX
907 MOVL 48(SP), CX
908 MOVL AX, (12*4)(CX) // err
909
910 ok:
911 XORL AX, AX // no error (it's ignored anyway)
912 MOVL BP, SP
913 POPL BP
914 RET
View as plain text