Source file src/runtime/sys_darwin.go
1
2
3
4
5 package runtime
6
7 import "unsafe"
8
9
10
11
12
13
14 func libcCall(fn, arg unsafe.Pointer) int32 {
15
16 gp := getg()
17 var mp *m
18 if gp != nil {
19 mp = gp.m
20 }
21 if mp != nil && mp.libcallsp == 0 {
22 mp.libcallg.set(gp)
23 mp.libcallpc = getcallerpc()
24
25
26 mp.libcallsp = getcallersp()
27 } else {
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 mp = nil
45 }
46 res := asmcgocall(fn, arg)
47 if mp != nil {
48 mp.libcallsp = 0
49 }
50 return res
51 }
52
53
54
55
56
57
58
59
60
61
62 func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
63 entersyscall()
64 libcCall(unsafe.Pointer(funcPC(syscall)), unsafe.Pointer(&fn))
65 exitsyscall()
66 return
67 }
68 func syscall()
69
70
71
72
73 func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
74 entersyscall()
75 libcCall(unsafe.Pointer(funcPC(syscall6)), unsafe.Pointer(&fn))
76 exitsyscall()
77 return
78 }
79 func syscall6()
80
81
82
83
84 func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
85 entersyscall()
86 libcCall(unsafe.Pointer(funcPC(syscall6X)), unsafe.Pointer(&fn))
87 exitsyscall()
88 return
89 }
90 func syscall6X()
91
92
93
94
95 func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
96 entersyscall()
97 libcCall(unsafe.Pointer(funcPC(syscallPtr)), unsafe.Pointer(&fn))
98 exitsyscall()
99 return
100 }
101 func syscallPtr()
102
103
104
105
106 func syscall_rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
107 libcCall(unsafe.Pointer(funcPC(syscall)), unsafe.Pointer(&fn))
108 return
109 }
110
111
112
113
114 func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
115 libcCall(unsafe.Pointer(funcPC(syscall6)), unsafe.Pointer(&fn))
116 return
117 }
118
119
120
121
122
123
124 func pthread_attr_init(attr *pthreadattr) int32 {
125 return libcCall(unsafe.Pointer(funcPC(pthread_attr_init_trampoline)), unsafe.Pointer(&attr))
126 }
127 func pthread_attr_init_trampoline()
128
129
130
131 func pthread_attr_getstacksize(attr *pthreadattr, size *uintptr) int32 {
132 return libcCall(unsafe.Pointer(funcPC(pthread_attr_getstacksize_trampoline)), unsafe.Pointer(&attr))
133 }
134 func pthread_attr_getstacksize_trampoline()
135
136
137
138 func pthread_attr_setdetachstate(attr *pthreadattr, state int) int32 {
139 return libcCall(unsafe.Pointer(funcPC(pthread_attr_setdetachstate_trampoline)), unsafe.Pointer(&attr))
140 }
141 func pthread_attr_setdetachstate_trampoline()
142
143
144
145 func pthread_create(attr *pthreadattr, start uintptr, arg unsafe.Pointer) int32 {
146 return libcCall(unsafe.Pointer(funcPC(pthread_create_trampoline)), unsafe.Pointer(&attr))
147 }
148 func pthread_create_trampoline()
149
150
151
152 func raise(sig uint32) {
153 libcCall(unsafe.Pointer(funcPC(raise_trampoline)), unsafe.Pointer(&sig))
154 }
155 func raise_trampoline()
156
157
158
159 func pthread_self() (t pthread) {
160 libcCall(unsafe.Pointer(funcPC(pthread_self_trampoline)), unsafe.Pointer(&t))
161 return
162 }
163 func pthread_self_trampoline()
164
165 func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) (unsafe.Pointer, int) {
166 args := struct {
167 addr unsafe.Pointer
168 n uintptr
169 prot, flags, fd int32
170 off uint32
171 ret1 unsafe.Pointer
172 ret2 int
173 }{addr, n, prot, flags, fd, off, nil, 0}
174 libcCall(unsafe.Pointer(funcPC(mmap_trampoline)), unsafe.Pointer(&args))
175 return args.ret1, args.ret2
176 }
177 func mmap_trampoline()
178
179
180
181 func munmap(addr unsafe.Pointer, n uintptr) {
182 libcCall(unsafe.Pointer(funcPC(munmap_trampoline)), unsafe.Pointer(&addr))
183 }
184 func munmap_trampoline()
185
186
187
188 func madvise(addr unsafe.Pointer, n uintptr, flags int32) {
189 libcCall(unsafe.Pointer(funcPC(madvise_trampoline)), unsafe.Pointer(&addr))
190 }
191 func madvise_trampoline()
192
193
194
195 func read(fd int32, p unsafe.Pointer, n int32) int32 {
196 return libcCall(unsafe.Pointer(funcPC(read_trampoline)), unsafe.Pointer(&fd))
197 }
198 func read_trampoline()
199
200 func pipe() (r, w int32, errno int32) {
201 var p [2]int32
202 errno = libcCall(unsafe.Pointer(funcPC(pipe_trampoline)), noescape(unsafe.Pointer(&p)))
203 return p[0], p[1], errno
204 }
205 func pipe_trampoline()
206
207
208
209 func closefd(fd int32) int32 {
210 return libcCall(unsafe.Pointer(funcPC(close_trampoline)), unsafe.Pointer(&fd))
211 }
212 func close_trampoline()
213
214
215
216
217
218
219 func exit(code int32) {
220 libcCall(unsafe.Pointer(funcPC(exit_trampoline)), unsafe.Pointer(&code))
221 }
222 func exit_trampoline()
223
224
225
226 func usleep(usec uint32) {
227 libcCall(unsafe.Pointer(funcPC(usleep_trampoline)), unsafe.Pointer(&usec))
228 }
229 func usleep_trampoline()
230
231
232
233 func write(fd uintptr, p unsafe.Pointer, n int32) int32 {
234 return libcCall(unsafe.Pointer(funcPC(write_trampoline)), unsafe.Pointer(&fd))
235 }
236 func write_trampoline()
237
238
239
240 func open(name *byte, mode, perm int32) (ret int32) {
241 return libcCall(unsafe.Pointer(funcPC(open_trampoline)), unsafe.Pointer(&name))
242 }
243 func open_trampoline()
244
245
246
247 func nanotime() int64 {
248 var r struct {
249 t int64
250 numer, denom uint32
251 }
252 libcCall(unsafe.Pointer(funcPC(nanotime_trampoline)), unsafe.Pointer(&r))
253
254
255
256 t := r.t
257 if r.numer != 1 {
258 t *= int64(r.numer)
259 }
260 if r.denom != 1 {
261 t /= int64(r.denom)
262 }
263 return t
264 }
265 func nanotime_trampoline()
266
267
268
269 func walltime() (int64, int32) {
270 var t timeval
271 libcCall(unsafe.Pointer(funcPC(walltime_trampoline)), unsafe.Pointer(&t))
272 return int64(t.tv_sec), 1000 * t.tv_usec
273 }
274 func walltime_trampoline()
275
276
277
278 func sigaction(sig uint32, new *usigactiont, old *usigactiont) {
279 libcCall(unsafe.Pointer(funcPC(sigaction_trampoline)), unsafe.Pointer(&sig))
280 }
281 func sigaction_trampoline()
282
283
284
285 func sigprocmask(how uint32, new *sigset, old *sigset) {
286 libcCall(unsafe.Pointer(funcPC(sigprocmask_trampoline)), unsafe.Pointer(&how))
287 }
288 func sigprocmask_trampoline()
289
290
291
292 func sigaltstack(new *stackt, old *stackt) {
293 if new != nil && new.ss_flags&_SS_DISABLE != 0 && new.ss_size == 0 {
294
295
296
297
298 new.ss_size = 32768
299 }
300 libcCall(unsafe.Pointer(funcPC(sigaltstack_trampoline)), unsafe.Pointer(&new))
301 }
302 func sigaltstack_trampoline()
303
304
305
306 func raiseproc(sig uint32) {
307 libcCall(unsafe.Pointer(funcPC(raiseproc_trampoline)), unsafe.Pointer(&sig))
308 }
309 func raiseproc_trampoline()
310
311
312
313 func setitimer(mode int32, new, old *itimerval) {
314 libcCall(unsafe.Pointer(funcPC(setitimer_trampoline)), unsafe.Pointer(&mode))
315 }
316 func setitimer_trampoline()
317
318
319
320 func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32 {
321 return libcCall(unsafe.Pointer(funcPC(sysctl_trampoline)), unsafe.Pointer(&mib))
322 }
323 func sysctl_trampoline()
324
325
326
327 func fcntl(fd, cmd, arg int32) int32 {
328 return libcCall(unsafe.Pointer(funcPC(fcntl_trampoline)), unsafe.Pointer(&fd))
329 }
330 func fcntl_trampoline()
331
332
333
334 func kqueue() int32 {
335 v := libcCall(unsafe.Pointer(funcPC(kqueue_trampoline)), nil)
336 return v
337 }
338 func kqueue_trampoline()
339
340
341
342 func kevent(kq int32, ch *keventt, nch int32, ev *keventt, nev int32, ts *timespec) int32 {
343 return libcCall(unsafe.Pointer(funcPC(kevent_trampoline)), unsafe.Pointer(&kq))
344 }
345 func kevent_trampoline()
346
347
348
349 func pthread_mutex_init(m *pthreadmutex, attr *pthreadmutexattr) int32 {
350 return libcCall(unsafe.Pointer(funcPC(pthread_mutex_init_trampoline)), unsafe.Pointer(&m))
351 }
352 func pthread_mutex_init_trampoline()
353
354
355
356 func pthread_mutex_lock(m *pthreadmutex) int32 {
357 return libcCall(unsafe.Pointer(funcPC(pthread_mutex_lock_trampoline)), unsafe.Pointer(&m))
358 }
359 func pthread_mutex_lock_trampoline()
360
361
362
363 func pthread_mutex_unlock(m *pthreadmutex) int32 {
364 return libcCall(unsafe.Pointer(funcPC(pthread_mutex_unlock_trampoline)), unsafe.Pointer(&m))
365 }
366 func pthread_mutex_unlock_trampoline()
367
368
369
370 func pthread_cond_init(c *pthreadcond, attr *pthreadcondattr) int32 {
371 return libcCall(unsafe.Pointer(funcPC(pthread_cond_init_trampoline)), unsafe.Pointer(&c))
372 }
373 func pthread_cond_init_trampoline()
374
375
376
377 func pthread_cond_wait(c *pthreadcond, m *pthreadmutex) int32 {
378 return libcCall(unsafe.Pointer(funcPC(pthread_cond_wait_trampoline)), unsafe.Pointer(&c))
379 }
380 func pthread_cond_wait_trampoline()
381
382
383
384 func pthread_cond_timedwait_relative_np(c *pthreadcond, m *pthreadmutex, t *timespec) int32 {
385 return libcCall(unsafe.Pointer(funcPC(pthread_cond_timedwait_relative_np_trampoline)), unsafe.Pointer(&c))
386 }
387 func pthread_cond_timedwait_relative_np_trampoline()
388
389
390
391 func pthread_cond_signal(c *pthreadcond) int32 {
392 return libcCall(unsafe.Pointer(funcPC(pthread_cond_signal_trampoline)), unsafe.Pointer(&c))
393 }
394 func pthread_cond_signal_trampoline()
395
396
397 func exitThread(wait *uint32) {
398 }
399
400
401 func closeonexec(fd int32) {
402 fcntl(fd, _F_SETFD, _FD_CLOEXEC)
403 }
404
405
406 func setNonblock(fd int32) {
407 flags := fcntl(fd, _F_GETFL, 0)
408 fcntl(fd, _F_SETFL, flags|_O_NONBLOCK)
409 }
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
View as plain text