]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: align stack pointer in sigfwd
authorBryan C. Mills <bcmills@google.com>
Thu, 27 Oct 2016 21:36:39 +0000 (17:36 -0400)
committerBryan Mills <bcmills@google.com>
Tue, 1 Nov 2016 17:37:43 +0000 (17:37 +0000)
sigfwd calls an arbitrary C signal handler function.  The System V ABI
for x86_64 (and the most recent revision of the ABI for i386) requires
the stack to be 16-byte aligned.

Fixes: #17641
Change-Id: I77f53d4a8c29c1b0fe8cfbcc8d5381c4e6f75a6b
Reviewed-on: https://go-review.googlesource.com/32107
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
13 files changed:
misc/cgo/testcarchive/main2.c
src/runtime/sys_darwin_386.s
src/runtime/sys_darwin_amd64.s
src/runtime/sys_dragonfly_amd64.s
src/runtime/sys_freebsd_386.s
src/runtime/sys_freebsd_amd64.s
src/runtime/sys_linux_386.s
src/runtime/sys_linux_amd64.s
src/runtime/sys_netbsd_386.s
src/runtime/sys_netbsd_amd64.s
src/runtime/sys_openbsd_386.s
src/runtime/sys_openbsd_amd64.s
src/runtime/sys_solaris_amd64.s

index 372697760d96e93529579ea6c15ce32983cc4946..56f890cad485f76a2af5a612a082f65278961c5c 100644 (file)
@@ -7,8 +7,10 @@
 
 #include <setjmp.h>
 #include <signal.h>
+#include <stdarg.h>
 #include <stddef.h>
 #include <stdio.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/types.h>
@@ -46,11 +48,22 @@ static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
 static jmp_buf jmp;
 static char* nullPointer;
 
+// An arbitrary function which requires proper stack alignment; see
+// http://golang.org/issue/17641.
+static void callWithVarargs(void* dummy, ...) {
+       va_list args;
+       va_start(args, dummy);
+       va_end(args);
+}
+
 // Signal handler for SIGSEGV on a C thread.
 static void segvHandler(int signo, siginfo_t* info, void* ctxt) {
        sigset_t mask;
        int i;
 
+       // Call an arbitrary function that requires the stack to be properly aligned.
+       callWithVarargs("dummy arg", 3.1415);
+
        if (sigemptyset(&mask) < 0) {
                die("sigemptyset");
        }
index 45658d0ae66425c031aa99142d0b28f83c1ad627..200961f225e0680a65140b019b7636acdd9fb73b 100644 (file)
@@ -254,12 +254,12 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-16
        MOVL    info+8(FP), CX
        MOVL    ctx+12(FP), DX
        MOVL    SP, SI
-       SUBL    $32, SP         // align stack; handler might be C code
-       ANDL    $~15, SP
+       SUBL    $32, SP
+       ANDL    $~15, SP        // align stack: handler might be a C function
        MOVL    BX, 0(SP)
        MOVL    CX, 4(SP)
        MOVL    DX, 8(SP)
-       MOVL    SI, 12(SP)
+       MOVL    SI, 12(SP)      // save SI: handler might be a Go function
        CALL    AX
        MOVL    12(SP), AX
        MOVL    AX, SP
index a15ac3e1587f95d5cb987b39ea19074c5e29e34a..96fa5b97102378abf00170aa46dce9d9b919fa08 100644 (file)
@@ -219,15 +219,16 @@ TEXT runtime·sigaction(SB),NOSPLIT,$0-24
        RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
-       MOVQ fn+0(FP),    AX
-       MOVL sig+8(FP),   DI
-       MOVQ info+16(FP), SI
-       MOVQ ctx+24(FP),  DX
-       MOVQ SP, BP
-       SUBQ $64, SP
-       ANDQ $~15, SP     // alignment for x86_64 ABI
-       CALL AX
-       MOVQ BP, SP
+       MOVQ    fn+0(FP),    AX
+       MOVL    sig+8(FP),   DI
+       MOVQ    info+16(FP), SI
+       MOVQ    ctx+24(FP),  DX
+       PUSHQ   BP
+       MOVQ    SP, BP
+       ANDQ    $~15, SP     // alignment for x86_64 ABI
+       CALL    AX
+       MOVQ    BP, SP
+       POPQ    BP
        RET
 
 TEXT runtime·sigtramp(SB),NOSPLIT,$32
index fd960e608a64097f7c147893e00f2a4f1cd750c0..88c7f9dd8ac5ce1bcdad49539bac6fb587e4059a 100644 (file)
@@ -188,11 +188,16 @@ TEXT runtime·sigaction(SB),NOSPLIT,$-8
        RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
-       MOVL    sig+8(FP), DI
+       MOVQ    fn+0(FP),    AX
+       MOVL    sig+8(FP),   DI
        MOVQ    info+16(FP), SI
-       MOVQ    ctx+24(FP), DX
-       MOVQ    fn+0(FP), AX
+       MOVQ    ctx+24(FP),  DX
+       PUSHQ   BP
+       MOVQ    SP, BP
+       ANDQ    $~15, SP     // alignment for x86_64 ABI
        CALL    AX
+       MOVQ    BP, SP
+       POPQ    BP
        RET
 
 TEXT runtime·sigtramp(SB),NOSPLIT,$24
index 7f3cd56cad9c65978caf8f3f3f2da2ebaf2b0484..8b6ee1f2a6bd5cb445a9d6ac9d220a12f56c41f8 100644 (file)
@@ -208,14 +208,20 @@ TEXT runtime·sigaction(SB),NOSPLIT,$-4
        RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$12-16
-       MOVL    sig+4(FP), AX
-       MOVL    AX, 0(SP)
-       MOVL    info+8(FP), AX
-       MOVL    AX, 4(SP)
-       MOVL    ctx+12(FP), AX
-       MOVL    AX, 8(SP)
        MOVL    fn+0(FP), AX
+       MOVL    sig+4(FP), BX
+       MOVL    info+8(FP), CX
+       MOVL    ctx+12(FP), DX
+       MOVL    SP, SI
+       SUBL    $32, SP
+       ANDL    $~15, SP        // align stack: handler might be a C function
+       MOVL    BX, 0(SP)
+       MOVL    CX, 4(SP)
+       MOVL    DX, 8(SP)
+       MOVL    SI, 12(SP)      // save SI: handler might be a Go function
        CALL    AX
+       MOVL    12(SP), AX
+       MOVL    AX, SP
        RET
 
 TEXT runtime·sigtramp(SB),NOSPLIT,$12
index 118febde47664152ee2705de0ee69be663744631..19007dc401156db4be4d383306b358560244c78f 100644 (file)
@@ -184,11 +184,16 @@ TEXT runtime·sigaction(SB),NOSPLIT,$-8
        RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
-       MOVL    sig+8(FP), DI
+       MOVQ    fn+0(FP),    AX
+       MOVL    sig+8(FP),   DI
        MOVQ    info+16(FP), SI
-       MOVQ    ctx+24(FP), DX
-       MOVQ    fn+0(FP), AX
+       MOVQ    ctx+24(FP),  DX
+       PUSHQ   BP
+       MOVQ    SP, BP
+       ANDQ    $~15, SP     // alignment for x86_64 ABI
        CALL    AX
+       MOVQ    BP, SP
+       POPQ    BP
        RET
 
 TEXT runtime·sigtramp(SB),NOSPLIT,$24
index 86ca06fd2cf3fc6cf4cfc48a2eb4a635b9ba721c..1d798c741ed634ba7bbacbd7030507ac51001e95 100644 (file)
@@ -212,14 +212,20 @@ TEXT runtime·rt_sigaction(SB),NOSPLIT,$0
        RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$12-16
-       MOVL    sig+4(FP), AX
-       MOVL    AX, 0(SP)
-       MOVL    info+8(FP), AX
-       MOVL    AX, 4(SP)
-       MOVL    ctx+12(FP), AX
-       MOVL    AX, 8(SP)
        MOVL    fn+0(FP), AX
+       MOVL    sig+4(FP), BX
+       MOVL    info+8(FP), CX
+       MOVL    ctx+12(FP), DX
+       MOVL    SP, SI
+       SUBL    $32, SP
+       ANDL    $-15, SP        // align stack: handler might be a C function
+       MOVL    BX, 0(SP)
+       MOVL    CX, 4(SP)
+       MOVL    DX, 8(SP)
+       MOVL    SI, 12(SP)      // save SI: handler might be a Go function
        CALL    AX
+       MOVL    12(SP), AX
+       MOVL    AX, SP
        RET
 
 TEXT runtime·sigtramp(SB),NOSPLIT,$12
index ee7b0ffb3714bb12a65c46bf1117eae3806062ad..7f88e1db23e78ef1c441cf8adc0efbb946636491 100644 (file)
@@ -219,11 +219,16 @@ TEXT runtime·rt_sigaction(SB),NOSPLIT,$0-36
        RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
-       MOVL    sig+8(FP), DI
+       MOVQ    fn+0(FP),    AX
+       MOVL    sig+8(FP),   DI
        MOVQ    info+16(FP), SI
-       MOVQ    ctx+24(FP), DX
-       MOVQ    fn+0(FP), AX
+       MOVQ    ctx+24(FP),  DX
+       PUSHQ   BP
+       MOVQ    SP, BP
+       ANDQ    $~15, SP     // alignment for x86_64 ABI
        CALL    AX
+       MOVQ    BP, SP
+       POPQ    BP
        RET
 
 TEXT runtime·sigtramp(SB),NOSPLIT,$24
index a276001fe14f997b81b4f2ea55a394cc0210de03..50d35e5b5ca15df15e43deccb5afcfffa6ddb571 100644 (file)
@@ -216,14 +216,20 @@ TEXT runtime·sigaction(SB),NOSPLIT,$24
        RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$12-16
-       MOVL    sig+4(FP), AX
-       MOVL    AX, 0(SP)
-       MOVL    info+8(FP), AX
-       MOVL    AX, 4(SP)
-       MOVL    ctx+12(FP), AX
-       MOVL    AX, 8(SP)
        MOVL    fn+0(FP), AX
+       MOVL    sig+4(FP), BX
+       MOVL    info+8(FP), CX
+       MOVL    ctx+12(FP), DX
+       MOVL    SP, SI
+       SUBL    $32, SP
+       ANDL    $-15, SP        // align stack: handler might be a C function
+       MOVL    BX, 0(SP)
+       MOVL    CX, 4(SP)
+       MOVL    DX, 8(SP)
+       MOVL    SI, 12(SP)      // save SI: handler might be a Go function
        CALL    AX
+       MOVL    12(SP), AX
+       MOVL    AX, SP
        RET
 
 TEXT runtime·sigtramp(SB),NOSPLIT,$12
index e0dd85f2aa4a637bc1779898d5d64cc7ce54147d..2c50adb123d0a5127610f65a7264d76d49ec93b7 100644 (file)
@@ -238,11 +238,16 @@ TEXT runtime·sigaction(SB),NOSPLIT,$-8
        RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
-       MOVL    sig+8(FP), DI
+       MOVQ    fn+0(FP),    AX
+       MOVL    sig+8(FP),   DI
        MOVQ    info+16(FP), SI
-       MOVQ    ctx+24(FP), DX
-       MOVQ    fn+0(FP), AX
+       MOVQ    ctx+24(FP),  DX
+       PUSHQ   BP
+       MOVQ    SP, BP
+       ANDQ    $~15, SP     // alignment for x86_64 ABI
        CALL    AX
+       MOVQ    BP, SP
+       POPQ    BP
        RET
 
 TEXT runtime·sigtramp(SB),NOSPLIT,$32
index 9357d346d13edba3341321209c9e6adc6b420a0c..e96939508869c643aae36029c80c673cbdf7f0ad 100644 (file)
@@ -196,14 +196,20 @@ TEXT runtime·obsdsigprocmask(SB),NOSPLIT,$-4
        RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$12-16
-       MOVL    sig+4(FP), AX
-       MOVL    AX, 0(SP)
-       MOVL    info+8(FP), AX
-       MOVL    AX, 4(SP)
-       MOVL    ctx+12(FP), AX
-       MOVL    AX, 8(SP)
        MOVL    fn+0(FP), AX
+       MOVL    sig+4(FP), BX
+       MOVL    info+8(FP), CX
+       MOVL    ctx+12(FP), DX
+       MOVL    SP, SI
+       SUBL    $32, SP
+       ANDL    $~15, SP        // align stack: handler might be a C function
+       MOVL    BX, 0(SP)
+       MOVL    CX, 4(SP)
+       MOVL    DX, 8(SP)
+       MOVL    SI, 12(SP)      // save SI: handler might be a Go function
        CALL    AX
+       MOVL    12(SP), AX
+       MOVL    AX, SP
        RET
 
 TEXT runtime·sigtramp(SB),NOSPLIT,$12
index e22a2faeeb77ab53a983c92e1883820309dce824..01d6bd8e8538f84e4955e8856e5c6e8738b690c0 100644 (file)
@@ -229,11 +229,16 @@ TEXT runtime·obsdsigprocmask(SB),NOSPLIT,$0
        RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
-       MOVL    sig+8(FP), DI
+       MOVQ    fn+0(FP),    AX
+       MOVL    sig+8(FP),   DI
        MOVQ    info+16(FP), SI
-       MOVQ    ctx+24(FP), DX
-       MOVQ    fn+0(FP), AX
+       MOVQ    ctx+24(FP),  DX
+       PUSHQ   BP
+       MOVQ    SP, BP
+       ANDQ    $~15, SP     // alignment for x86_64 ABI
        CALL    AX
+       MOVQ    BP, SP
+       POPQ    BP
        RET
 
 TEXT runtime·sigtramp(SB),NOSPLIT,$24
index a36bd37ff0fe71b2c111876d738639afd4ba7762..c542db39862211224e92362193c5bc8a39cdda74 100644 (file)
@@ -290,11 +290,16 @@ exit:
        RET
 
 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
-       MOVL    sig+8(FP), DI
+       MOVQ    fn+0(FP),    AX
+       MOVL    sig+8(FP),   DI
        MOVQ    info+16(FP), SI
-       MOVQ    ctx+24(FP), DX
-       MOVQ    fn+0(FP), AX
+       MOVQ    ctx+24(FP),  DX
+       PUSHQ   BP
+       MOVQ    SP, BP
+       ANDQ    $~15, SP     // alignment for x86_64 ABI
        CALL    AX
+       MOVQ    BP, SP
+       POPQ    BP
        RET
 
 // Called from runtime·usleep (Go). Can be called on Go stack, on OS stack,