]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: print a message on bad morestack
authorAustin Clements <austin@google.com>
Thu, 13 Oct 2016 14:44:57 +0000 (10:44 -0400)
committerAustin Clements <austin@google.com>
Mon, 17 Oct 2016 18:56:09 +0000 (18:56 +0000)
If morestack runs on the g0 or gsignal stack, it currently performs
some abort operation that typically produces a signal (e.g., it does
an INT $3 on x86). This is useful if you're running in a debugger, but
if you're not, the runtime tries to trap this signal, which is likely
to send the program into a deeper spiral of collapse and lead to very
confusing diagnostic output.

Help out people trying to debug without a debugger by making morestack
print an informative message before blowing up.

Change-Id: I2814c64509b137bfe20a00091d8551d18c2c4749
Reviewed-on: https://go-review.googlesource.com/31133
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/asm_386.s
src/runtime/asm_amd64.s
src/runtime/asm_amd64p32.s
src/runtime/asm_arm.s
src/runtime/asm_arm64.s
src/runtime/asm_mips64x.s
src/runtime/asm_ppc64x.s
src/runtime/asm_s390x.s
src/runtime/proc.go

index 56d495aede6f4b739372ea164cac3e6c9138536a..4ef738eacbf1664eec52c7cb69830a443888f35c 100644 (file)
@@ -354,13 +354,15 @@ TEXT runtime·morestack(SB),NOSPLIT,$0-0
        MOVL    g_m(BX), BX
        MOVL    m_g0(BX), SI
        CMPL    g(CX), SI
-       JNE     2(PC)
+       JNE     3(PC)
+       CALL    runtime·badmorestackg0(SB)
        INT     $3
 
        // Cannot grow signal stack.
        MOVL    m_gsignal(BX), SI
        CMPL    g(CX), SI
-       JNE     2(PC)
+       JNE     3(PC)
+       CALL    runtime·badmorestackgsignal(SB)
        INT     $3
 
        // Called from f.
index 8d992188de545536a868103100c1253ddc58ff23..34da3bda9f4ec8ce86f960c69a79de864706edf0 100644 (file)
@@ -331,13 +331,15 @@ TEXT runtime·morestack(SB),NOSPLIT,$0-0
        MOVQ    g_m(BX), BX
        MOVQ    m_g0(BX), SI
        CMPQ    g(CX), SI
-       JNE     2(PC)
+       JNE     3(PC)
+       CALL    runtime·badmorestackg0(SB)
        INT     $3
 
        // Cannot grow signal stack (m->gsignal).
        MOVQ    m_gsignal(BX), SI
        CMPQ    g(CX), SI
-       JNE     2(PC)
+       JNE     3(PC)
+       CALL    runtime·badmorestackgsignal(SB)
        INT     $3
 
        // Called from f.
index 0b42c666ae5bc71da2bca09541d0ef546c47cb3f..4e3c0cd2b67f017077ae9b5aa6a50691a51347ef 100644 (file)
@@ -249,13 +249,15 @@ TEXT runtime·morestack(SB),NOSPLIT,$0-0
        // Cannot grow scheduler stack (m->g0).
        MOVL    m_g0(BX), SI
        CMPL    g(CX), SI
-       JNE     2(PC)
+       JNE     3(PC)
+       CALL    runtime·badmorestackg0(SB)
        MOVL    0, AX
 
        // Cannot grow signal stack (m->gsignal).
        MOVL    m_gsignal(BX), SI
        CMPL    g(CX), SI
-       JNE     2(PC)
+       JNE     3(PC)
+       CALL    runtime·badmorestackgsignal(SB)
        MOVL    0, AX
 
        // Called from f.
index d768060af206c632afefe6a59b678411e117c1ef..0c7d580163c0366e7684a40de8149d71a2311ccb 100644 (file)
@@ -281,12 +281,16 @@ TEXT runtime·morestack(SB),NOSPLIT,$-4-0
        MOVW    g_m(g), R8
        MOVW    m_g0(R8), R4
        CMP     g, R4
-       BL.EQ   runtime·abort(SB)
+       BNE     3(PC)
+       BL      runtime·badmorestackg0(SB)
+       B       runtime·abort(SB)
 
        // Cannot grow signal stack (m->gsignal).
        MOVW    m_gsignal(R8), R4
        CMP     g, R4
-       BL.EQ   runtime·abort(SB)
+       BNE     3(PC)
+       BL      runtime·badmorestackgsignal(SB)
+       B       runtime·abort(SB)
 
        // Called from f.
        // Set g->sched to context in f.
index c46569f68ca700221aa91d0042226b24e7dc8329..bd2b18385e479804dafe34286e911f5713a82451 100644 (file)
@@ -256,13 +256,15 @@ TEXT runtime·morestack(SB),NOSPLIT,$-8-0
        MOVD    g_m(g), R8
        MOVD    m_g0(R8), R4
        CMP     g, R4
-       BNE     2(PC)
+       BNE     3(PC)
+       BL      runtime·badmorestackg0(SB)
        B       runtime·abort(SB)
 
        // Cannot grow signal stack (m->gsignal).
        MOVD    m_gsignal(R8), R4
        CMP     g, R4
-       BNE     2(PC)
+       BNE     3(PC)
+       BL      runtime·badmorestackgsignal(SB)
        B       runtime·abort(SB)
 
        // Called from f.
index 138181833cb39945b6a3c2ad484a97f691afe619..e29522367d5671c5dee45378c9ae53c7912d8181 100644 (file)
@@ -231,12 +231,14 @@ TEXT runtime·morestack(SB),NOSPLIT,$-8-0
        // Cannot grow scheduler stack (m->g0).
        MOVV    g_m(g), R7
        MOVV    m_g0(R7), R8
-       BNE     g, R8, 2(PC)
+       BNE     g, R8, 3(PC)
+       JAL     runtime·badmorestackg0(SB)
        JAL     runtime·abort(SB)
 
        // Cannot grow signal stack (m->gsignal).
        MOVV    m_gsignal(R7), R8
-       BNE     g, R8, 2(PC)
+       BNE     g, R8, 3(PC)
+       JAL     runtime·badmorestackgsignal(SB)
        JAL     runtime·abort(SB)
 
        // Called from f.
index 8b5ea4508278f5638341937874332c97999499c5..251dc1b564d0e399bacfd7a64784490e3e4526ce 100644 (file)
@@ -284,13 +284,15 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
        MOVD    g_m(g), R7
        MOVD    m_g0(R7), R8
        CMP     g, R8
-       BNE     2(PC)
+       BNE     3(PC)
+       BL      runtime·badmorestackg0(SB)
        BL      runtime·abort(SB)
 
        // Cannot grow signal stack (m->gsignal).
        MOVD    m_gsignal(R7), R8
        CMP     g, R8
-       BNE     2(PC)
+       BNE     3(PC)
+       BL      runtime·badmorestackgsignal(SB)
        BL      runtime·abort(SB)
 
        // Called from f.
index 70e3b5e85925968841e2b114828a3fb28c7cb977..9ed4d9186805820b9797495379071141dc4ebac0 100644 (file)
@@ -279,13 +279,15 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
        // Cannot grow scheduler stack (m->g0).
        MOVD    g_m(g), R7
        MOVD    m_g0(R7), R8
-       CMPBNE  g, R8, 2(PC)
+       CMPBNE  g, R8, 3(PC)
+       BL      runtime·badmorestackg0(SB)
        BL      runtime·abort(SB)
 
        // Cannot grow signal stack (m->gsignal).
        MOVD    m_gsignal(R7), R8
        CMP     g, R8
-       BNE     2(PC)
+       BNE     3(PC)
+       BL      runtime·badmorestackgsignal(SB)
        BL      runtime·abort(SB)
 
        // Called from f.
index cb0004d2333fc0b504b3415b48a5edb2fc0efdf7..937135961aaa91da979044f4fda150a2d4314d12 100644 (file)
@@ -381,6 +381,24 @@ func badreflectcall() {
        panic(plainError("arg size to reflect.call more than 1GB"))
 }
 
+var badmorestackg0Msg = "fatal: morestack on g0\n"
+
+//go:nosplit
+//go:nowritebarrierrec
+func badmorestackg0() {
+       sp := stringStructOf(&badmorestackg0Msg)
+       write(2, sp.str, int32(sp.len))
+}
+
+var badmorestackgsignalMsg = "fatal: morestack on gsignal\n"
+
+//go:nosplit
+//go:nowritebarrierrec
+func badmorestackgsignal() {
+       sp := stringStructOf(&badmorestackgsignalMsg)
+       write(2, sp.str, int32(sp.len))
+}
+
 func lockedOSThread() bool {
        gp := getg()
        return gp.lockedm != nil && gp.m.lockedg != nil