]> Cypherpunks repositories - gostls13.git/commit
runtime: don't jump stack if at entry of systemstack
authorCherry Mui <cherryyz@google.com>
Fri, 30 Sep 2022 23:01:09 +0000 (19:01 -0400)
committerCherry Mui <cherryyz@google.com>
Wed, 5 Oct 2022 14:52:31 +0000 (14:52 +0000)
commit500bc6b8056ee2eaf7640610a48ffa00bdd896a5
treecdfca7175270da2d32a55bdb7709860376902a29
parent7d3a5a501c9f30ff6db3016dbfffcb70dacb9f55
runtime: don't jump stack if at entry of systemstack

The traceback code has special "jump stack" logic, to trace back
stack switches through systemstack. If we're at the entry of
systemstack, the stack switch hasn't happened, so don't jump to
user stack.

The jump stack logic is only used if we're on the g0 stack. It can
happen that we're at the entry of a recursive systemstack call on
the g0 stack. In we jump stack here, there will be two problems:
1. There are frames between entering the g0 stack and this
   recursive systemstack call. Those frames will be lost.
2. Worse, we switched frame.sp but frame.fp calculation will use
   the entry SP delta (0), which will be wrong, which in turn
   leads wrong frame.lr and things will go off.

For now, don't jump stack if we're at entry of systemstack (SP
delta is 0).

Using a per-PC SPWRITE marker may be a better fix. If we haven't
written the SP, we haven't switched the stack so we can just
unwind like a normal function.

May fix #55851.

Change-Id: I2b624c8c086b235b34d9c7d3cebd4a37264f00f8
Reviewed-on: https://go-review.googlesource.com/c/go/+/437299
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Cherry Mui <cherryyz@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
src/runtime/traceback.go