mirror of https://github.com/golang/go.git
runtime: use gp->sched.sp for stack overflow check
On x86 it is a few words lower on the stack than m->morebuf.sp so it is a more precise check. Enabling the check requires recording a valid gp->sched in reflect.call too. This is a good thing in general, since it will make stack traces during reflect.call work better, and it may be useful for preemption too. R=dvyukov CC=golang-dev https://golang.org/cl/10709043
This commit is contained in:
parent
4eb17ecd1f
commit
f0d73fbc7c
|
|
@ -254,6 +254,11 @@ TEXT reflect·call(SB), 7, $0
|
|||
MOVL g(CX), AX
|
||||
MOVL AX, (m_morebuf+gobuf_g)(BX)
|
||||
|
||||
// Save our own state as the PC and SP to restore
|
||||
// if this goroutine needs to be restarted.
|
||||
MOVL $reflect·call(SB), (g_sched+gobuf_pc)(AX)
|
||||
MOVL SP, (g_sched+gobuf_sp)(AX)
|
||||
|
||||
// Set up morestack arguments to call f on a new stack.
|
||||
// We set f's frame size to 1, as a hint to newstack
|
||||
// that this is a call from reflect·call.
|
||||
|
|
|
|||
|
|
@ -231,6 +231,11 @@ TEXT reflect·call(SB), 7, $0
|
|||
MOVQ AX, (m_morebuf+gobuf_sp)(BX)
|
||||
MOVQ g(CX), AX
|
||||
MOVQ AX, (m_morebuf+gobuf_g)(BX)
|
||||
|
||||
// Save our own state as the PC and SP to restore
|
||||
// if this goroutine needs to be restarted.
|
||||
MOVQ $reflect·call(SB), (g_sched+gobuf_pc)(AX)
|
||||
MOVQ SP, (g_sched+gobuf_sp)(AX)
|
||||
|
||||
// Set up morestack arguments to call f on a new stack.
|
||||
// We set f's frame size to 1, as a hint to newstack
|
||||
|
|
|
|||
|
|
@ -207,6 +207,13 @@ TEXT reflect·call(SB), 7, $-4
|
|||
MOVW SP, (m_morebuf+gobuf_sp)(m) // our caller's SP
|
||||
MOVW g, (m_morebuf+gobuf_g)(m)
|
||||
|
||||
// Save our own state as the PC and SP to restore
|
||||
// if this goroutine needs to be restarted.
|
||||
MOVW $reflect·call(SB), R11
|
||||
MOVW R11, (g_sched+gobuf_pc)(g)
|
||||
MOVW LR, (g_sched+gobuf_lr)(g)
|
||||
MOVW SP, (g_sched+gobuf_sp)(g)
|
||||
|
||||
// Set up morestack arguments to call f on a new stack.
|
||||
// We set f's frame size to 1, as a hint to newstack
|
||||
// that this is a call from reflect·call.
|
||||
|
|
|
|||
|
|
@ -215,7 +215,7 @@ runtime·newstack(void)
|
|||
if(!reflectcall)
|
||||
runtime·rewindmorestack(&gp->sched);
|
||||
|
||||
sp = m->morebuf.sp;
|
||||
sp = gp->sched.sp;
|
||||
if(thechar == '6' || thechar == '8') {
|
||||
// The call to morestack cost a word.
|
||||
sp -= sizeof(uintptr);
|
||||
|
|
|
|||
Loading…
Reference in New Issue