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
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
/*
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
/*
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
/*
}
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");
}