Source file src/runtime/os2_aix.go
1
2
3
4
5
6
7
8
9
10
11 package runtime
12
13 import (
14 "unsafe"
15 )
16
17
18
19
20
21
22
23
24 var (
25 libc___n_pthread,
26 libc___mod_init libFunc
27 )
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 var (
106
107 libc__Errno,
108 libc_clock_gettime,
109 libc_close,
110 libc_exit,
111 libc_getpid,
112 libc_getsystemcfg,
113 libc_kill,
114 libc_madvise,
115 libc_malloc,
116 libc_mmap,
117 libc_munmap,
118 libc_open,
119 libc_pipe,
120 libc_raise,
121 libc_read,
122 libc_sched_yield,
123 libc_sem_init,
124 libc_sem_post,
125 libc_sem_timedwait,
126 libc_sem_wait,
127 libc_setitimer,
128 libc_sigaction,
129 libc_sigaltstack,
130 libc_sysconf,
131 libc_usleep,
132 libc_write,
133
134 libpthread___pth_init,
135 libpthread_attr_destroy,
136 libpthread_attr_init,
137 libpthread_attr_getstacksize,
138 libpthread_attr_setstacksize,
139 libpthread_attr_setdetachstate,
140 libpthread_attr_setstackaddr,
141 libpthread_create,
142 libpthread_sigthreadmask libFunc
143 )
144
145 type libFunc uintptr
146
147
148
149 var asmsyscall6 libFunc
150
151
152
153
154
155
156
157
158 func syscall0(fn *libFunc) (r, err uintptr) {
159 gp := getg()
160 mp := gp.m
161 resetLibcall := true
162 if mp.libcallsp == 0 {
163 mp.libcallg.set(gp)
164 mp.libcallpc = getcallerpc()
165
166
167 mp.libcallsp = getcallersp()
168 } else {
169 resetLibcall = false
170 }
171
172 c := libcall{
173 fn: uintptr(unsafe.Pointer(fn)),
174 n: 0,
175 args: uintptr(unsafe.Pointer(&fn)),
176 }
177
178 asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
179
180 if resetLibcall {
181 mp.libcallsp = 0
182 }
183
184 return c.r1, c.err
185 }
186
187
188
189 func syscall1(fn *libFunc, a0 uintptr) (r, err uintptr) {
190 gp := getg()
191 mp := gp.m
192 resetLibcall := true
193 if mp.libcallsp == 0 {
194 mp.libcallg.set(gp)
195 mp.libcallpc = getcallerpc()
196
197
198 mp.libcallsp = getcallersp()
199 } else {
200 resetLibcall = false
201 }
202
203 c := libcall{
204 fn: uintptr(unsafe.Pointer(fn)),
205 n: 1,
206 args: uintptr(unsafe.Pointer(&a0)),
207 }
208
209 asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
210
211 if resetLibcall {
212 mp.libcallsp = 0
213 }
214
215 return c.r1, c.err
216 }
217
218
219
220
221 func syscall2(fn *libFunc, a0, a1 uintptr) (r, err uintptr) {
222 gp := getg()
223 mp := gp.m
224 resetLibcall := true
225 if mp.libcallsp == 0 {
226 mp.libcallg.set(gp)
227 mp.libcallpc = getcallerpc()
228
229
230 mp.libcallsp = getcallersp()
231 } else {
232 resetLibcall = false
233 }
234
235 c := libcall{
236 fn: uintptr(unsafe.Pointer(fn)),
237 n: 2,
238 args: uintptr(unsafe.Pointer(&a0)),
239 }
240
241 asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
242
243 if resetLibcall {
244 mp.libcallsp = 0
245 }
246
247 return c.r1, c.err
248 }
249
250
251
252
253 func syscall3(fn *libFunc, a0, a1, a2 uintptr) (r, err uintptr) {
254 gp := getg()
255 mp := gp.m
256 resetLibcall := true
257 if mp.libcallsp == 0 {
258 mp.libcallg.set(gp)
259 mp.libcallpc = getcallerpc()
260
261
262 mp.libcallsp = getcallersp()
263 } else {
264 resetLibcall = false
265 }
266
267 c := libcall{
268 fn: uintptr(unsafe.Pointer(fn)),
269 n: 3,
270 args: uintptr(unsafe.Pointer(&a0)),
271 }
272
273 asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
274
275 if resetLibcall {
276 mp.libcallsp = 0
277 }
278
279 return c.r1, c.err
280 }
281
282
283
284
285 func syscall4(fn *libFunc, a0, a1, a2, a3 uintptr) (r, err uintptr) {
286 gp := getg()
287 mp := gp.m
288 resetLibcall := true
289 if mp.libcallsp == 0 {
290 mp.libcallg.set(gp)
291 mp.libcallpc = getcallerpc()
292
293
294 mp.libcallsp = getcallersp()
295 } else {
296 resetLibcall = false
297 }
298
299 c := libcall{
300 fn: uintptr(unsafe.Pointer(fn)),
301 n: 4,
302 args: uintptr(unsafe.Pointer(&a0)),
303 }
304
305 asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
306
307 if resetLibcall {
308 mp.libcallsp = 0
309 }
310
311 return c.r1, c.err
312 }
313
314
315
316
317 func syscall5(fn *libFunc, a0, a1, a2, a3, a4 uintptr) (r, err uintptr) {
318 gp := getg()
319 mp := gp.m
320 resetLibcall := true
321 if mp.libcallsp == 0 {
322 mp.libcallg.set(gp)
323 mp.libcallpc = getcallerpc()
324
325
326 mp.libcallsp = getcallersp()
327 } else {
328 resetLibcall = false
329 }
330
331 c := libcall{
332 fn: uintptr(unsafe.Pointer(fn)),
333 n: 5,
334 args: uintptr(unsafe.Pointer(&a0)),
335 }
336
337 asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
338
339 if resetLibcall {
340 mp.libcallsp = 0
341 }
342
343 return c.r1, c.err
344 }
345
346
347
348
349 func syscall6(fn *libFunc, a0, a1, a2, a3, a4, a5 uintptr) (r, err uintptr) {
350 gp := getg()
351 mp := gp.m
352 resetLibcall := true
353 if mp.libcallsp == 0 {
354 mp.libcallg.set(gp)
355 mp.libcallpc = getcallerpc()
356
357
358 mp.libcallsp = getcallersp()
359 } else {
360 resetLibcall = false
361 }
362
363 c := libcall{
364 fn: uintptr(unsafe.Pointer(fn)),
365 n: 6,
366 args: uintptr(unsafe.Pointer(&a0)),
367 }
368
369 asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
370
371 if resetLibcall {
372 mp.libcallsp = 0
373 }
374
375 return c.r1, c.err
376 }
377
378 func exit1(code int32)
379
380
381 func exit(code int32) {
382 _g_ := getg()
383
384
385
386 if _g_ != nil {
387 syscall1(&libc_exit, uintptr(code))
388 return
389 }
390 exit1(code)
391 }
392
393 func write1(fd, p uintptr, n int32) int32
394
395
396 func write(fd uintptr, p unsafe.Pointer, n int32) int32 {
397 _g_ := getg()
398
399
400
401 if _g_ != nil {
402 r, _ := syscall3(&libc_write, uintptr(fd), uintptr(p), uintptr(n))
403 return int32(r)
404 }
405 return write1(fd, uintptr(p), n)
406
407 }
408
409
410 func read(fd int32, p unsafe.Pointer, n int32) int32 {
411 r, _ := syscall3(&libc_read, uintptr(fd), uintptr(p), uintptr(n))
412 return int32(r)
413 }
414
415
416 func open(name *byte, mode, perm int32) int32 {
417 r, _ := syscall3(&libc_open, uintptr(unsafe.Pointer(name)), uintptr(mode), uintptr(perm))
418 return int32(r)
419 }
420
421
422 func closefd(fd int32) int32 {
423 r, _ := syscall1(&libc_close, uintptr(fd))
424 return int32(r)
425 }
426
427
428 func pipe(fd *int32) int32 {
429 r, _ := syscall1(&libc_pipe, uintptr(unsafe.Pointer(fd)))
430 return int32(r)
431 }
432
433
434
435
436
437
438
439 func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) (unsafe.Pointer, int) {
440 r, err0 := syscall6(&libc_mmap, uintptr(addr), uintptr(n), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(off))
441 if r == ^uintptr(0) {
442 return nil, int(err0)
443 }
444 return unsafe.Pointer(r), int(err0)
445 }
446
447
448 func munmap(addr unsafe.Pointer, n uintptr) {
449 r, err := syscall2(&libc_munmap, uintptr(addr), uintptr(n))
450 if int32(r) == -1 {
451 println("syscall munmap failed: ", hex(err))
452 throw("syscall munmap")
453 }
454 }
455
456
457 func madvise(addr unsafe.Pointer, n uintptr, flags int32) {
458 r, err := syscall3(&libc_madvise, uintptr(addr), uintptr(n), uintptr(flags))
459 if int32(r) == -1 {
460 println("syscall madvise failed: ", hex(err))
461 throw("syscall madvise")
462 }
463 }
464
465 func sigaction1(sig, new, old uintptr)
466
467
468 func sigaction(sig uintptr, new, old *sigactiont) {
469 _g_ := getg()
470
471
472
473 if _g_ != nil {
474 r, err := syscall3(&libc_sigaction, sig, uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old)))
475 if int32(r) == -1 {
476 println("Sigaction failed for sig: ", sig, " with error:", hex(err))
477 throw("syscall sigaction")
478 }
479 return
480 }
481
482 sigaction1(sig, uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old)))
483 }
484
485
486 func sigaltstack(new, old *stackt) {
487 r, err := syscall2(&libc_sigaltstack, uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old)))
488 if int32(r) == -1 {
489 println("syscall sigaltstack failed: ", hex(err))
490 throw("syscall sigaltstack")
491 }
492 }
493
494
495 func getsystemcfg(label uint) uintptr {
496 r, _ := syscall1(&libc_getsystemcfg, uintptr(label))
497 return r
498 }
499
500 func usleep1(us uint32)
501
502
503 func usleep(us uint32) {
504 _g_ := getg()
505
506
507
508 if _g_ != nil && _g_.m != nil {
509 r, err := syscall1(&libc_usleep, uintptr(us))
510 if int32(r) == -1 {
511 println("syscall usleep failed: ", hex(err))
512 throw("syscall usleep")
513 }
514 return
515 }
516 usleep1(us)
517 }
518
519
520 func clock_gettime(clockid int32, tp *timespec) int32 {
521 r, _ := syscall2(&libc_clock_gettime, uintptr(clockid), uintptr(unsafe.Pointer(tp)))
522 return int32(r)
523 }
524
525
526 func setitimer(mode int32, new, old *itimerval) {
527 r, err := syscall3(&libc_setitimer, uintptr(mode), uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old)))
528 if int32(r) == -1 {
529 println("syscall setitimer failed: ", hex(err))
530 throw("syscall setitimer")
531 }
532 }
533
534
535 func malloc(size uintptr) unsafe.Pointer {
536 r, _ := syscall1(&libc_malloc, size)
537 return unsafe.Pointer(r)
538 }
539
540
541 func sem_init(sem *semt, pshared int32, value uint32) int32 {
542 r, _ := syscall3(&libc_sem_init, uintptr(unsafe.Pointer(sem)), uintptr(pshared), uintptr(value))
543 return int32(r)
544 }
545
546
547 func sem_wait(sem *semt) (int32, int32) {
548 r, err := syscall1(&libc_sem_wait, uintptr(unsafe.Pointer(sem)))
549 return int32(r), int32(err)
550 }
551
552
553 func sem_post(sem *semt) int32 {
554 r, _ := syscall1(&libc_sem_post, uintptr(unsafe.Pointer(sem)))
555 return int32(r)
556 }
557
558
559 func sem_timedwait(sem *semt, timeout *timespec) (int32, int32) {
560 r, err := syscall2(&libc_sem_timedwait, uintptr(unsafe.Pointer(sem)), uintptr(unsafe.Pointer(timeout)))
561 return int32(r), int32(err)
562 }
563
564
565 func raise(sig uint32) {
566 r, err := syscall1(&libc_raise, uintptr(sig))
567 if int32(r) == -1 {
568 println("syscall raise failed: ", hex(err))
569 throw("syscall raise")
570 }
571 }
572
573
574 func raiseproc(sig uint32) {
575 pid, err := syscall0(&libc_getpid)
576 if int32(pid) == -1 {
577 println("syscall getpid failed: ", hex(err))
578 throw("syscall raiseproc")
579 }
580
581 syscall2(&libc_kill, pid, uintptr(sig))
582 }
583
584 func osyield1()
585
586
587 func osyield() {
588 _g_ := getg()
589
590
591
592 if _g_ != nil && _g_.m != nil {
593 r, err := syscall0(&libc_sched_yield)
594 if int32(r) == -1 {
595 println("syscall osyield failed: ", hex(err))
596 throw("syscall osyield")
597 }
598 return
599 }
600 osyield1()
601 }
602
603
604 func sysconf(name int32) uintptr {
605 r, _ := syscall1(&libc_sysconf, uintptr(name))
606 if int32(r) == -1 {
607 throw("syscall sysconf")
608 }
609 return r
610
611 }
612
613
614
615
616
617 func pthread_attr_destroy(attr *pthread_attr) int32 {
618 r, _ := syscall1(&libpthread_attr_destroy, uintptr(unsafe.Pointer(attr)))
619 return int32(r)
620 }
621
622 func pthread_attr_init1(attr uintptr) int32
623
624
625 func pthread_attr_init(attr *pthread_attr) int32 {
626 _g_ := getg()
627
628
629
630 if _g_ != nil {
631 r, _ := syscall1(&libpthread_attr_init, uintptr(unsafe.Pointer(attr)))
632 return int32(r)
633 }
634
635 return pthread_attr_init1(uintptr(unsafe.Pointer(attr)))
636 }
637
638 func pthread_attr_setdetachstate1(attr uintptr, state int32) int32
639
640
641 func pthread_attr_setdetachstate(attr *pthread_attr, state int32) int32 {
642 _g_ := getg()
643
644
645
646 if _g_ != nil {
647 r, _ := syscall2(&libpthread_attr_setdetachstate, uintptr(unsafe.Pointer(attr)), uintptr(state))
648 return int32(r)
649 }
650
651 return pthread_attr_setdetachstate1(uintptr(unsafe.Pointer(attr)), state)
652 }
653
654
655 func pthread_attr_setstackaddr(attr *pthread_attr, stk unsafe.Pointer) int32 {
656 r, _ := syscall2(&libpthread_attr_setstackaddr, uintptr(unsafe.Pointer(attr)), uintptr(stk))
657 return int32(r)
658 }
659
660
661 func pthread_attr_getstacksize(attr *pthread_attr, size *uint64) int32 {
662 r, _ := syscall2(&libpthread_attr_getstacksize, uintptr(unsafe.Pointer(attr)), uintptr(unsafe.Pointer(size)))
663 return int32(r)
664 }
665
666 func pthread_attr_setstacksize1(attr uintptr, size uint64) int32
667
668
669 func pthread_attr_setstacksize(attr *pthread_attr, size uint64) int32 {
670 _g_ := getg()
671
672
673
674 if _g_ != nil {
675 r, _ := syscall2(&libpthread_attr_setstacksize, uintptr(unsafe.Pointer(attr)), uintptr(size))
676 return int32(r)
677 }
678
679 return pthread_attr_setstacksize1(uintptr(unsafe.Pointer(attr)), size)
680 }
681
682 func pthread_create1(tid, attr, fn, arg uintptr) int32
683
684
685 func pthread_create(tid *pthread, attr *pthread_attr, fn *funcDescriptor, arg unsafe.Pointer) int32 {
686 _g_ := getg()
687
688
689
690 if _g_ != nil {
691 r, _ := syscall4(&libpthread_create, uintptr(unsafe.Pointer(tid)), uintptr(unsafe.Pointer(attr)), uintptr(unsafe.Pointer(fn)), uintptr(arg))
692 return int32(r)
693 }
694
695 return pthread_create1(uintptr(unsafe.Pointer(tid)), uintptr(unsafe.Pointer(attr)), uintptr(unsafe.Pointer(fn)), uintptr(arg))
696 }
697
698
699
700 func sigprocmask1(how, new, old uintptr)
701
702
703 func sigprocmask(how int32, new, old *sigset) {
704 _g_ := getg()
705
706
707
708 if _g_ != nil && _g_.m != nil {
709 r, err := syscall3(&libpthread_sigthreadmask, uintptr(how), uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old)))
710 if int32(r) != 0 {
711 println("syscall sigthreadmask failed: ", hex(err))
712 throw("syscall sigthreadmask")
713 }
714 return
715 }
716 sigprocmask1(uintptr(how), uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old)))
717
718 }
719
View as plain text