Source file
src/runtime/sys_darwin.go
1
2
3
4
5 package runtime
6
7 import (
8 "internal/abi"
9 "internal/runtime/atomic"
10 "unsafe"
11 )
12
13
14 func libcError() uintptr {
15 errPtr, _ := syscall(abi.FuncPCABI0(libc_error_trampoline), 0, 0, 0)
16 return errPtr
17 }
18 func libc_error_trampoline()
19
20
21
22
23
24
25
26
27 func syscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr) {
28 args := struct{ fn, a1, a2, a3, r1, r2 uintptr }{fn, a1, a2, a3, r1, r2}
29 libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall_trampoline)), unsafe.Pointer(&args))
30 return args.r1, args.r2
31 }
32 func syscall_trampoline()
33
34
35
36
37
38
39
40 func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
41 entersyscall()
42 r1, r2, err = syscall_rawSyscall(fn, a1, a2, a3)
43 exitsyscall()
44 return r1, r2, err
45 }
46
47
48
49 func syscall_syscallX(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
50 entersyscall()
51 r1, r2, err = syscall_rawSyscallX(fn, a1, a2, a3)
52 exitsyscall()
53 return r1, r2, err
54 }
55
56
57 func syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr) {
58 args := struct{ fn, a1, a2, a3, a4, a5, a6, r1, r2 uintptr }{fn, a1, a2, a3, a4, a5, a6, r1, r2}
59 libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall6_trampoline)), unsafe.Pointer(&args))
60 return args.r1, args.r2
61 }
62 func syscall6_trampoline()
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
78 entersyscall()
79 r1, r2, err = syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6)
80 exitsyscall()
81 return r1, r2, err
82 }
83
84
85
86 func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
87 entersyscall()
88 r1, r2, err = syscall_rawSyscall6X(fn, a1, a2, a3, a4, a5, a6)
89 exitsyscall()
90 return r1, r2, err
91 }
92
93
94 func syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr) {
95 args := struct{ fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, r1, r2 uintptr }{fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, r1, r2}
96 libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall9_trampoline)), unsafe.Pointer(&args))
97 return args.r1, args.r2
98 }
99 func syscall9_trampoline()
100
101
102
103
104
105
106
107 func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) {
108 entersyscall()
109 r1, r2, err = syscall_rawSyscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9)
110 exitsyscall()
111 return r1, r2, err
112 }
113
114
115
116
117
118
119
120 func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
121 entersyscall()
122 r1, r2, err = syscall_rawSyscallPtr(fn, a1, a2, a3)
123 exitsyscall()
124 return r1, r2, err
125 }
126
127
128
129
130
131
132
133 func syscall_rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
134 r1, r2 = syscall(fn, a1, a2, a3)
135
136 if int32(r1) == -1 {
137 err = libcError()
138 }
139 return r1, r2, err
140 }
141
142
143 func syscall_rawSyscallX(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
144 r1, r2 = syscall(fn, a1, a2, a3)
145 if r1 == ^uintptr(0) {
146 err = libcError()
147 }
148 return r1, r2, err
149 }
150
151
152 func syscall_rawSyscallPtr(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
153 r1, r2 = syscall(fn, a1, a2, a3)
154 if r1 == 0 {
155 err = libcError()
156 }
157 return r1, r2, err
158 }
159
160
161
162
163
164
165
166 func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
167 r1, r2 = syscall6(fn, a1, a2, a3, a4, a5, a6)
168
169 if int32(r1) == -1 {
170 err = libcError()
171 }
172 return r1, r2, err
173 }
174
175
176 func syscall_rawSyscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
177 r1, r2 = syscall6(fn, a1, a2, a3, a4, a5, a6)
178 if r1 == ^uintptr(0) {
179 err = libcError()
180 }
181 return r1, r2, err
182 }
183
184
185 func syscall_rawSyscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) {
186 r1, r2 = syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9)
187
188 if int32(r1) == -1 {
189 err = libcError()
190 }
191 return r1, r2, err
192 }
193
194
195
196
197
198 func crypto_x509_syscall(fn, a1, a2, a3, a4, a5 uintptr, f1 float64) (r1 uintptr) {
199 args := struct {
200 fn, a1, a2, a3, a4, a5 uintptr
201 f1 float64
202 r1 uintptr
203 }{fn, a1, a2, a3, a4, a5, f1, r1}
204 entersyscall()
205 libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall_x509)), unsafe.Pointer(&args))
206 exitsyscall()
207 return args.r1
208 }
209 func syscall_x509()
210
211
212
213
214
215
216 func pthread_attr_init(attr *pthreadattr) int32 {
217 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_attr_init_trampoline)), unsafe.Pointer(&attr))
218 KeepAlive(attr)
219 return ret
220 }
221 func pthread_attr_init_trampoline()
222
223
224
225 func pthread_attr_getstacksize(attr *pthreadattr, size *uintptr) int32 {
226 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_attr_getstacksize_trampoline)), unsafe.Pointer(&attr))
227 KeepAlive(attr)
228 KeepAlive(size)
229 return ret
230 }
231 func pthread_attr_getstacksize_trampoline()
232
233
234
235 func pthread_attr_setdetachstate(attr *pthreadattr, state int) int32 {
236 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_attr_setdetachstate_trampoline)), unsafe.Pointer(&attr))
237 KeepAlive(attr)
238 return ret
239 }
240 func pthread_attr_setdetachstate_trampoline()
241
242
243
244 func pthread_create(attr *pthreadattr, start uintptr, arg unsafe.Pointer) int32 {
245 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_create_trampoline)), unsafe.Pointer(&attr))
246 KeepAlive(attr)
247 KeepAlive(arg)
248 return ret
249 }
250 func pthread_create_trampoline()
251
252
253
254 func raise(sig uint32) {
255 libcCall(unsafe.Pointer(abi.FuncPCABI0(raise_trampoline)), unsafe.Pointer(&sig))
256 }
257 func raise_trampoline()
258
259
260
261 func pthread_self() (t pthread) {
262 libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_self_trampoline)), unsafe.Pointer(&t))
263 return
264 }
265 func pthread_self_trampoline()
266
267
268
269 func pthread_kill(t pthread, sig uint32) {
270 libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_kill_trampoline)), unsafe.Pointer(&t))
271 return
272 }
273 func pthread_kill_trampoline()
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308 func osinit_hack() {
309 if GOOS == "darwin" {
310 libcCall(unsafe.Pointer(abi.FuncPCABI0(osinit_hack_trampoline)), nil)
311 }
312 return
313 }
314 func osinit_hack_trampoline()
315
316
317
318
319
320
321 func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) (unsafe.Pointer, int) {
322 args := struct {
323 addr unsafe.Pointer
324 n uintptr
325 prot, flags, fd int32
326 off uint32
327 ret1 unsafe.Pointer
328 ret2 int
329 }{addr, n, prot, flags, fd, off, nil, 0}
330 libcCall(unsafe.Pointer(abi.FuncPCABI0(mmap_trampoline)), unsafe.Pointer(&args))
331 return args.ret1, args.ret2
332 }
333 func mmap_trampoline()
334
335
336
337 func munmap(addr unsafe.Pointer, n uintptr) {
338 libcCall(unsafe.Pointer(abi.FuncPCABI0(munmap_trampoline)), unsafe.Pointer(&addr))
339 KeepAlive(addr)
340 }
341 func munmap_trampoline()
342
343
344
345 func madvise(addr unsafe.Pointer, n uintptr, flags int32) {
346 libcCall(unsafe.Pointer(abi.FuncPCABI0(madvise_trampoline)), unsafe.Pointer(&addr))
347 KeepAlive(addr)
348 }
349 func madvise_trampoline()
350
351
352
353 func mlock(addr unsafe.Pointer, n uintptr) {
354 libcCall(unsafe.Pointer(abi.FuncPCABI0(mlock_trampoline)), unsafe.Pointer(&addr))
355 KeepAlive(addr)
356 }
357 func mlock_trampoline()
358
359
360
361 func read(fd int32, p unsafe.Pointer, n int32) int32 {
362 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(read_trampoline)), unsafe.Pointer(&fd))
363 KeepAlive(p)
364 return ret
365 }
366 func read_trampoline()
367
368 func pipe() (r, w int32, errno int32) {
369 var p [2]int32
370 errno = libcCall(unsafe.Pointer(abi.FuncPCABI0(pipe_trampoline)), noescape(unsafe.Pointer(&p)))
371 return p[0], p[1], errno
372 }
373 func pipe_trampoline()
374
375
376
377 func closefd(fd int32) int32 {
378 return libcCall(unsafe.Pointer(abi.FuncPCABI0(close_trampoline)), unsafe.Pointer(&fd))
379 }
380 func close_trampoline()
381
382
383
384
385
386
387 func exit(code int32) {
388 libcCall(unsafe.Pointer(abi.FuncPCABI0(exit_trampoline)), unsafe.Pointer(&code))
389 }
390 func exit_trampoline()
391
392
393
394 func usleep(usec uint32) {
395 libcCall(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))
396 }
397 func usleep_trampoline()
398
399
400
401 func usleep_no_g(usec uint32) {
402 asmcgocall_no_g(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))
403 }
404
405
406
407 func write1(fd uintptr, p unsafe.Pointer, n int32) int32 {
408 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(write_trampoline)), unsafe.Pointer(&fd))
409 KeepAlive(p)
410 return ret
411 }
412 func write_trampoline()
413
414
415
416 func open(name *byte, mode, perm int32) (ret int32) {
417 ret = libcCall(unsafe.Pointer(abi.FuncPCABI0(open_trampoline)), unsafe.Pointer(&name))
418 KeepAlive(name)
419 return
420 }
421 func open_trampoline()
422
423
424
425 func nanotime1() int64 {
426 var r struct {
427 t int64
428 numer, denom uint32
429 }
430 libcCall(unsafe.Pointer(abi.FuncPCABI0(nanotime_trampoline)), unsafe.Pointer(&r))
431
432
433
434 t := r.t
435 if r.numer != 1 {
436 t *= int64(r.numer)
437 }
438 if r.denom != 1 {
439 t /= int64(r.denom)
440 }
441 return t
442 }
443 func nanotime_trampoline()
444
445
446
447
448
449
450
451
452
453
454
455
456 func walltime() (int64, int32) {
457 var t timespec
458 libcCall(unsafe.Pointer(abi.FuncPCABI0(walltime_trampoline)), unsafe.Pointer(&t))
459 return t.tv_sec, int32(t.tv_nsec)
460 }
461 func walltime_trampoline()
462
463
464
465 func sigaction(sig uint32, new *usigactiont, old *usigactiont) {
466 libcCall(unsafe.Pointer(abi.FuncPCABI0(sigaction_trampoline)), unsafe.Pointer(&sig))
467 KeepAlive(new)
468 KeepAlive(old)
469 }
470 func sigaction_trampoline()
471
472
473
474 func sigprocmask(how uint32, new *sigset, old *sigset) {
475 libcCall(unsafe.Pointer(abi.FuncPCABI0(sigprocmask_trampoline)), unsafe.Pointer(&how))
476 KeepAlive(new)
477 KeepAlive(old)
478 }
479 func sigprocmask_trampoline()
480
481
482
483 func sigaltstack(new *stackt, old *stackt) {
484 if new != nil && new.ss_flags&_SS_DISABLE != 0 && new.ss_size == 0 {
485
486
487
488
489 new.ss_size = 32768
490 }
491 libcCall(unsafe.Pointer(abi.FuncPCABI0(sigaltstack_trampoline)), unsafe.Pointer(&new))
492 KeepAlive(new)
493 KeepAlive(old)
494 }
495 func sigaltstack_trampoline()
496
497
498
499 func raiseproc(sig uint32) {
500 libcCall(unsafe.Pointer(abi.FuncPCABI0(raiseproc_trampoline)), unsafe.Pointer(&sig))
501 }
502 func raiseproc_trampoline()
503
504
505
506 func setitimer(mode int32, new, old *itimerval) {
507 libcCall(unsafe.Pointer(abi.FuncPCABI0(setitimer_trampoline)), unsafe.Pointer(&mode))
508 KeepAlive(new)
509 KeepAlive(old)
510 }
511 func setitimer_trampoline()
512
513
514
515 func sysctl(mib *uint32, miblen uint32, oldp *byte, oldlenp *uintptr, newp *byte, newlen uintptr) int32 {
516 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(sysctl_trampoline)), unsafe.Pointer(&mib))
517 KeepAlive(mib)
518 KeepAlive(oldp)
519 KeepAlive(oldlenp)
520 KeepAlive(newp)
521 return ret
522 }
523 func sysctl_trampoline()
524
525
526
527 func sysctlbyname(name *byte, oldp *byte, oldlenp *uintptr, newp *byte, newlen uintptr) int32 {
528 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(sysctlbyname_trampoline)), unsafe.Pointer(&name))
529 KeepAlive(name)
530 KeepAlive(oldp)
531 KeepAlive(oldlenp)
532 KeepAlive(newp)
533 return ret
534 }
535 func sysctlbyname_trampoline()
536
537
538
539 func fcntl(fd, cmd, arg int32) (ret int32, errno int32) {
540 args := struct {
541 fd, cmd, arg int32
542 ret, errno int32
543 }{fd, cmd, arg, 0, 0}
544 libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&args))
545 return args.ret, args.errno
546 }
547 func fcntl_trampoline()
548
549
550
551 func kqueue() int32 {
552 v := libcCall(unsafe.Pointer(abi.FuncPCABI0(kqueue_trampoline)), nil)
553 return v
554 }
555 func kqueue_trampoline()
556
557
558
559 func kevent(kq int32, ch *keventt, nch int32, ev *keventt, nev int32, ts *timespec) int32 {
560 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(kevent_trampoline)), unsafe.Pointer(&kq))
561 KeepAlive(ch)
562 KeepAlive(ev)
563 KeepAlive(ts)
564 return ret
565 }
566 func kevent_trampoline()
567
568
569
570 func pthread_mutex_init(m *pthreadmutex, attr *pthreadmutexattr) int32 {
571 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_mutex_init_trampoline)), unsafe.Pointer(&m))
572 KeepAlive(m)
573 KeepAlive(attr)
574 return ret
575 }
576 func pthread_mutex_init_trampoline()
577
578
579
580 func pthread_mutex_lock(m *pthreadmutex) int32 {
581 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_mutex_lock_trampoline)), unsafe.Pointer(&m))
582 KeepAlive(m)
583 return ret
584 }
585 func pthread_mutex_lock_trampoline()
586
587
588
589 func pthread_mutex_unlock(m *pthreadmutex) int32 {
590 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_mutex_unlock_trampoline)), unsafe.Pointer(&m))
591 KeepAlive(m)
592 return ret
593 }
594 func pthread_mutex_unlock_trampoline()
595
596
597
598 func pthread_cond_init(c *pthreadcond, attr *pthreadcondattr) int32 {
599 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_cond_init_trampoline)), unsafe.Pointer(&c))
600 KeepAlive(c)
601 KeepAlive(attr)
602 return ret
603 }
604 func pthread_cond_init_trampoline()
605
606
607
608 func pthread_cond_wait(c *pthreadcond, m *pthreadmutex) int32 {
609 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_cond_wait_trampoline)), unsafe.Pointer(&c))
610 KeepAlive(c)
611 KeepAlive(m)
612 return ret
613 }
614 func pthread_cond_wait_trampoline()
615
616
617
618 func pthread_cond_timedwait_relative_np(c *pthreadcond, m *pthreadmutex, t *timespec) int32 {
619 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_cond_timedwait_relative_np_trampoline)), unsafe.Pointer(&c))
620 KeepAlive(c)
621 KeepAlive(m)
622 KeepAlive(t)
623 return ret
624 }
625 func pthread_cond_timedwait_relative_np_trampoline()
626
627
628
629 func pthread_cond_signal(c *pthreadcond) int32 {
630 ret := libcCall(unsafe.Pointer(abi.FuncPCABI0(pthread_cond_signal_trampoline)), unsafe.Pointer(&c))
631 KeepAlive(c)
632 return ret
633 }
634 func pthread_cond_signal_trampoline()
635
636
637
638 func arc4random_buf(p unsafe.Pointer, n int32) {
639
640 libcCall(unsafe.Pointer(abi.FuncPCABI0(arc4random_buf_trampoline)), unsafe.Pointer(&p))
641 KeepAlive(p)
642 }
643 func arc4random_buf_trampoline()
644
645
646 func exitThread(wait *atomic.Uint32) {
647 throw("exitThread")
648 }
649
650
651 func setNonblock(fd int32) {
652 flags, _ := fcntl(fd, _F_GETFL, 0)
653 if flags != -1 {
654 fcntl(fd, _F_SETFL, flags|_O_NONBLOCK)
655 }
656 }
657
658 func issetugid() int32 {
659 return libcCall(unsafe.Pointer(abi.FuncPCABI0(issetugid_trampoline)), nil)
660 }
661 func issetugid_trampoline()
662
663
664
665
666
667
668 func mach_vm_region(address, region_size *uint64, info unsafe.Pointer) int32 {
669
670
671
672
673
674
675
676
677 var count machMsgTypeNumber = _VM_REGION_BASIC_INFO_COUNT_64
678 var object_name machPort
679 args := struct {
680 address *uint64
681 size *uint64
682 flavor machVMRegionFlavour
683 info unsafe.Pointer
684 count *machMsgTypeNumber
685 object_name *machPort
686 }{
687 address: address,
688 size: region_size,
689 flavor: _VM_REGION_BASIC_INFO_64,
690 info: info,
691 count: &count,
692 object_name: &object_name,
693 }
694 return libcCall(unsafe.Pointer(abi.FuncPCABI0(mach_vm_region_trampoline)), unsafe.Pointer(&args))
695 }
696 func mach_vm_region_trampoline()
697
698
699 func proc_regionfilename(pid int, address uint64, buf *byte, buflen int64) int32 {
700 args := struct {
701 pid int
702 address uint64
703 buf *byte
704 bufSize int64
705 }{
706 pid: pid,
707 address: address,
708 buf: buf,
709 bufSize: buflen,
710 }
711 return libcCall(unsafe.Pointer(abi.FuncPCABI0(proc_regionfilename_trampoline)), unsafe.Pointer(&args))
712 }
713 func proc_regionfilename_trampoline()
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
View as plain text