]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: make it possible to call syscall on solaris without g
authorShenghou Ma <minux@golang.org>
Fri, 20 Nov 2015 05:23:52 +0000 (00:23 -0500)
committerMinux Ma <minux@golang.org>
Fri, 20 Nov 2015 08:11:35 +0000 (08:11 +0000)
The nosplit stack is now much bigger, so we can afford to allocate
libcall on stack.

Fix asmsysvicall6 to not update errno if g == nil.

These two fixes TestCgoCallbackGC on solaris, which used to stuck
in a loop.

Change-Id: Id1b13be992dae9f059aa3d47ffffd37785300933
Reviewed-on: https://go-review.googlesource.com/17076
Run-TryBot: Minux Ma <minux@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/os_solaris.go
src/runtime/sys_solaris_amd64.s

index 9dbe38a32a6b23f15f26722c7e98bf468fb93579..fbf28863f794797524476c80507dcc10f81df97b 100644 (file)
@@ -31,71 +31,71 @@ var asmsysvicall6 libcFunc
 
 //go:nosplit
 func sysvicall0(fn *libcFunc) uintptr {
-       libcall := &getg().m.libcall
+       var libcall libcall
        libcall.fn = uintptr(unsafe.Pointer(fn))
        libcall.n = 0
        libcall.args = uintptr(unsafe.Pointer(fn)) // it's unused but must be non-nil, otherwise crashes
-       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
        return libcall.r1
 }
 
 //go:nosplit
 func sysvicall1(fn *libcFunc, a1 uintptr) uintptr {
-       libcall := &getg().m.libcall
+       var libcall libcall
        libcall.fn = uintptr(unsafe.Pointer(fn))
        libcall.n = 1
        // TODO(rsc): Why is noescape necessary here and below?
        libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
-       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
        return libcall.r1
 }
 
 //go:nosplit
 func sysvicall2(fn *libcFunc, a1, a2 uintptr) uintptr {
-       libcall := &getg().m.libcall
+       var libcall libcall
        libcall.fn = uintptr(unsafe.Pointer(fn))
        libcall.n = 2
        libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
-       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
        return libcall.r1
 }
 
 //go:nosplit
 func sysvicall3(fn *libcFunc, a1, a2, a3 uintptr) uintptr {
-       libcall := &getg().m.libcall
+       var libcall libcall
        libcall.fn = uintptr(unsafe.Pointer(fn))
        libcall.n = 3
        libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
-       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
        return libcall.r1
 }
 
 //go:nosplit
 func sysvicall4(fn *libcFunc, a1, a2, a3, a4 uintptr) uintptr {
-       libcall := &getg().m.libcall
+       var libcall libcall
        libcall.fn = uintptr(unsafe.Pointer(fn))
        libcall.n = 4
        libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
-       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
        return libcall.r1
 }
 
 //go:nosplit
 func sysvicall5(fn *libcFunc, a1, a2, a3, a4, a5 uintptr) uintptr {
-       libcall := &getg().m.libcall
+       var libcall libcall
        libcall.fn = uintptr(unsafe.Pointer(fn))
        libcall.n = 5
        libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
-       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
        return libcall.r1
 }
 
 //go:nosplit
 func sysvicall6(fn *libcFunc, a1, a2, a3, a4, a5, a6 uintptr) uintptr {
-       libcall := &getg().m.libcall
+       var libcall libcall
        libcall.fn = uintptr(unsafe.Pointer(fn))
        libcall.n = 6
        libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
-       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
+       asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
        return libcall.r1
 }
index 978c9ffeb4b5bd447a2fb3b83996cf51e5b5504c..179dfa305f81dd4d5707fe8ba20bb35309f514bc 100644 (file)
@@ -80,6 +80,8 @@ TEXT runtime·asmsysvicall6(SB),NOSPLIT,$0
 
        get_tls(CX)
        MOVQ    g(CX), BX
+       CMPQ    BX, $0
+       JEQ     skiperrno1
        MOVQ    g_m(BX), BX
        MOVQ    (m_mOS+mOS_perrno)(BX), DX
        CMPQ    DX, $0
@@ -108,6 +110,8 @@ skipargs:
 
        get_tls(CX)
        MOVQ    g(CX), BX
+       CMPQ    BX, $0
+       JEQ     skiperrno2
        MOVQ    g_m(BX), BX
        MOVQ    (m_mOS+mOS_perrno)(BX), AX
        CMPQ    AX, $0