]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: jump to badmcall instead of calling it.
authorKeith Randall <khr@golang.org>
Thu, 29 Aug 2013 22:53:34 +0000 (15:53 -0700)
committerKeith Randall <khr@golang.org>
Thu, 29 Aug 2013 22:53:34 +0000 (15:53 -0700)
This replaces the mcall frame with the badmcall frame instead of
leaving the mcall frame on the stack and adding the badmcall frame.
Because mcall is no longer on the stack, traceback will now report what
called mcall, which is what we would like to see in this situation.

R=golang-dev, cshapiro
CC=golang-dev
https://golang.org/cl/13012044

src/pkg/runtime/asm_386.s
src/pkg/runtime/asm_amd64.s
src/pkg/runtime/asm_arm.s
src/pkg/runtime/proc.c

index c61b75cfb22fed7ceb86f2f1de21a6c585cec328..79f2e79296cf43aada97f263ce55a9db03585980 100644 (file)
@@ -181,14 +181,16 @@ TEXT runtime·mcall(SB), NOSPLIT, $0-4
        MOVL    m(CX), BX
        MOVL    m_g0(BX), SI
        CMPL    SI, AX  // if g == m->g0 call badmcall
-       JNE     2(PC)
-       CALL    runtime·badmcall(SB)
+       JNE     3(PC)
+       MOVL    $runtime·badmcall(SB), AX
+       JMP     AX
        MOVL    SI, g(CX)       // g = m->g0
        MOVL    (g_sched+gobuf_sp)(SI), SP      // sp = m->g0->sched.sp
        PUSHL   AX
        CALL    DI
        POPL    AX
-       CALL    runtime·badmcall2(SB)
+       MOVL    $runtime·badmcall2(SB), AX
+       JMP     AX
        RET
 
 /*
index fcc75a9229d1dde5e184e5337ecaed27fd3c20ee..a85056c9eae8461e272de557bf397a3e001a944b 100644 (file)
@@ -169,16 +169,16 @@ TEXT runtime·mcall(SB), NOSPLIT, $0-8
        MOVQ    m_g0(BX), SI
        CMPQ    SI, AX  // if g == m->g0 call badmcall
        JNE     3(PC)
-       ARGSIZE(0)
-       CALL    runtime·badmcall(SB)
+       MOVQ    $runtime·badmcall(SB), AX
+       JMP     AX
        MOVQ    SI, g(CX)       // g = m->g0
        MOVQ    (g_sched+gobuf_sp)(SI), SP      // sp = m->g0->sched.sp
        PUSHQ   AX
        ARGSIZE(8)
        CALL    DI
        POPQ    AX
-       ARGSIZE(0)
-       CALL    runtime·badmcall2(SB)
+       MOVQ    $runtime·badmcall2(SB), AX
+       JMP     AX
        RET
 
 /*
index 0d12b6a0d8c6bbca142e148e98f5a2f922c7ddc6..b66f80e2c6d711dccb38fd9db393f9fd5e254a28 100644 (file)
@@ -157,12 +157,13 @@ TEXT runtime·mcall(SB), NOSPLIT, $-4-4
        MOVW    g, R1
        MOVW    m_g0(m), g
        CMP     g, R1
-       BL.EQ   runtime·badmcall(SB)
+       B.NE    2(PC)
+       B       runtime·badmcall(SB)
        MOVW    (g_sched+gobuf_sp)(g), SP
        SUB     $8, SP
        MOVW    R1, 4(SP)
        BL      (R0)
-       BL      runtime·badmcall2(SB)
+       B       runtime·badmcall2(SB)
        RET
 
 /*
index dab62ad69bed79b97edd29519919429d9c3c60d0..d37014f3a511903d75d4d3c113d031355dc36918 100644 (file)
@@ -1997,14 +1997,16 @@ runtime·mcount(void)
 }
 
 void
-runtime·badmcall(void)  // called from assembly
+runtime·badmcall(void (*fn)(G*))  // called from assembly
 {
+       USED(fn); // TODO: print fn?
        runtime·throw("runtime: mcall called on m->g0 stack");
 }
 
 void
-runtime·badmcall2(void)  // called from assembly
+runtime·badmcall2(void (*fn)(G*))  // called from assembly
 {
+       USED(fn);
        runtime·throw("runtime: mcall function returned");
 }