]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: move libcall to stack for runtime syscalls on AIX
authorClément Chigot <clement.chigot@atos.net>
Wed, 17 Apr 2019 11:32:19 +0000 (13:32 +0200)
committerIan Lance Taylor <iant@golang.org>
Thu, 18 Apr 2019 00:07:22 +0000 (00:07 +0000)
As the stackguard was increased on AIX by CL 157117, every syscalls can
now have libcall directly on the stack. This fixes some concurrency bugs
which seems to occur when semasleep is interrupted by a SIGPROF signal.

Change-Id: I905a9618d13ef227dad6f8328b0f958f2f917a5b
Reviewed-on: https://go-review.googlesource.com/c/go/+/172359
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/os2_aix.go

index 47cb1290fe9b1aa3edbc19c266a35daef6ae8cab..750c8c6115e8b87a421927f9a19ba51119f5202d 100644 (file)
@@ -169,12 +169,13 @@ func syscall0(fn *libFunc) (r, err uintptr) {
                resetLibcall = false // See comment in sys_darwin.go:libcCall
        }
 
-       c := &mp.libcall
-       c.fn = uintptr(unsafe.Pointer(fn))
-       c.n = 0
-       c.args = uintptr(noescape(unsafe.Pointer(&fn))) // it's unused but must be non-nil, otherwise crashes
+       c := libcall{
+               fn:   uintptr(unsafe.Pointer(fn)),
+               n:    0,
+               args: uintptr(unsafe.Pointer(&fn)), // it's unused but must be non-nil, otherwise crashes
+       }
 
-       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c))
+       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
 
        if resetLibcall {
                mp.libcallsp = 0
@@ -199,12 +200,13 @@ func syscall1(fn *libFunc, a0 uintptr) (r, err uintptr) {
                resetLibcall = false // See comment in sys_darwin.go:libcCall
        }
 
-       c := &gp.m.libcall
-       c.fn = uintptr(unsafe.Pointer(fn))
-       c.n = 1
-       c.args = uintptr(noescape(unsafe.Pointer(&a0)))
+       c := libcall{
+               fn:   uintptr(unsafe.Pointer(fn)),
+               n:    1,
+               args: uintptr(unsafe.Pointer(&a0)),
+       }
 
-       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c))
+       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
 
        if resetLibcall {
                mp.libcallsp = 0
@@ -230,12 +232,13 @@ func syscall2(fn *libFunc, a0, a1 uintptr) (r, err uintptr) {
                resetLibcall = false // See comment in sys_darwin.go:libcCall
        }
 
-       c := &gp.m.libcall
-       c.fn = uintptr(unsafe.Pointer(fn))
-       c.n = 2
-       c.args = uintptr(noescape(unsafe.Pointer(&a0)))
+       c := libcall{
+               fn:   uintptr(unsafe.Pointer(fn)),
+               n:    2,
+               args: uintptr(unsafe.Pointer(&a0)),
+       }
 
-       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c))
+       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
 
        if resetLibcall {
                mp.libcallsp = 0
@@ -261,12 +264,13 @@ func syscall3(fn *libFunc, a0, a1, a2 uintptr) (r, err uintptr) {
                resetLibcall = false // See comment in sys_darwin.go:libcCall
        }
 
-       c := &gp.m.libcall
-       c.fn = uintptr(unsafe.Pointer(fn))
-       c.n = 3
-       c.args = uintptr(noescape(unsafe.Pointer(&a0)))
+       c := libcall{
+               fn:   uintptr(unsafe.Pointer(fn)),
+               n:    3,
+               args: uintptr(unsafe.Pointer(&a0)),
+       }
 
-       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c))
+       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
 
        if resetLibcall {
                mp.libcallsp = 0
@@ -292,12 +296,13 @@ func syscall4(fn *libFunc, a0, a1, a2, a3 uintptr) (r, err uintptr) {
                resetLibcall = false // See comment in sys_darwin.go:libcCall
        }
 
-       c := &gp.m.libcall
-       c.fn = uintptr(unsafe.Pointer(fn))
-       c.n = 4
-       c.args = uintptr(noescape(unsafe.Pointer(&a0)))
+       c := libcall{
+               fn:   uintptr(unsafe.Pointer(fn)),
+               n:    4,
+               args: uintptr(unsafe.Pointer(&a0)),
+       }
 
-       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c))
+       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
 
        if resetLibcall {
                mp.libcallsp = 0
@@ -323,12 +328,13 @@ func syscall5(fn *libFunc, a0, a1, a2, a3, a4 uintptr) (r, err uintptr) {
                resetLibcall = false // See comment in sys_darwin.go:libcCall
        }
 
-       c := &gp.m.libcall
-       c.fn = uintptr(unsafe.Pointer(fn))
-       c.n = 5
-       c.args = uintptr(noescape(unsafe.Pointer(&a0)))
+       c := libcall{
+               fn:   uintptr(unsafe.Pointer(fn)),
+               n:    5,
+               args: uintptr(unsafe.Pointer(&a0)),
+       }
 
-       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c))
+       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
 
        if resetLibcall {
                mp.libcallsp = 0
@@ -354,12 +360,13 @@ func syscall6(fn *libFunc, a0, a1, a2, a3, a4, a5 uintptr) (r, err uintptr) {
                resetLibcall = false // See comment in sys_darwin.go:libcCall
        }
 
-       c := &gp.m.libcall
-       c.fn = uintptr(unsafe.Pointer(fn))
-       c.n = 6
-       c.args = uintptr(noescape(unsafe.Pointer(&a0)))
+       c := libcall{
+               fn:   uintptr(unsafe.Pointer(fn)),
+               n:    6,
+               args: uintptr(unsafe.Pointer(&a0)),
+       }
 
-       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c))
+       asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c))
 
        if resetLibcall {
                mp.libcallsp = 0