]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: save context value in NetBSD sigtramp
authorIan Lance Taylor <iant@golang.org>
Thu, 21 Jan 2016 20:43:34 +0000 (12:43 -0800)
committerIan Lance Taylor <iant@golang.org>
Thu, 21 Jan 2016 23:24:41 +0000 (23:24 +0000)
On NetBSD a signal handler returns to the kernel by calling the
setcontext system call with the context passed to the signal handler.
The implementation of runtime·sigreturn_tramp for amd64, copied from the
NetBSD libc, expects that context address to be in r15.  That works in
the NetBSD libc because r15 is preserved across the call to the signal
handler.  It fails in the Go library because r15 is not preserved.
There are various ways to fix this; this one uses the simple approach,
essentially identical to the one in the NetBSD libc, of preserving r15
across the signal handler proper.

Looking at the code for 386 and arm suggests that they are OK.  However,
I have not actually tested them.

Update #14052.

Change-Id: I2b516b1d05fe5d3b8911e65ca761d621dc37fa1b
Reviewed-on: https://go-review.googlesource.com/18815
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/runtime/sys_netbsd_amd64.s

index 35a1b5dd00324a7d7a553f685f194a96487f7e28..fb21f1155ab4b01f56c70b08c93d45ff0496d9ac 100644 (file)
@@ -245,11 +245,13 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
        CALL    AX
        RET
 
-TEXT runtime·sigtramp(SB),NOSPLIT,$24
+TEXT runtime·sigtramp(SB),NOSPLIT,$32
        MOVQ    DI, 0(SP)   // signum
        MOVQ    SI, 8(SP)   // info
        MOVQ    DX, 16(SP)  // ctx
+       MOVQ    R15, 24(SP) // for sigreturn
        CALL    runtime·sigtrampgo(SB)
+       MOVQ    24(SP), R15
        RET
 
 TEXT runtime·mmap(SB),NOSPLIT,$0