From cbaa8e5f93a9571c30271c0f6d7c874793ec49ce Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 17 Apr 2019 13:32:19 +0200 Subject: [PATCH] runtime: move libcall to stack for runtime syscalls on AIX 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 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/os2_aix.go | 77 +++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/src/runtime/os2_aix.go b/src/runtime/os2_aix.go index 47cb1290fe..750c8c6115 100644 --- a/src/runtime/os2_aix.go +++ b/src/runtime/os2_aix.go @@ -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 -- 2.48.1