diff options
author | Cherry Mui <cherryyz@google.com> | 2022-04-15 12:23:06 -0400 |
---|---|---|
committer | Heschi Kreinick <heschi@google.com> | 2022-07-22 17:25:33 +0000 |
commit | c25b12fb815938d6fa894cd1552c3c78825c6254 (patch) | |
tree | fd03700071daf9378b080da6364e5f5ad4081b0a /src/runtime/time.go | |
parent | 1ed3c127daceaffb9aadc806ba60f0b51b47421b (diff) | |
download | go-c25b12fb815938d6fa894cd1552c3c78825c6254.tar.gz go-c25b12fb815938d6fa894cd1552c3c78825c6254.zip |
[release-branch.go1.17] runtime: use saved LR when unwinding through morestack
On LR machine, consider F calling G calling H, which grows stack.
The stack looks like
...
G's frame:
... locals ...
saved LR = return PC in F <- SP points here at morestack
H's frame (to be created)
At morestack, we save
gp.sched.pc = H's morestack call
gp.sched.sp = H's entry SP (the arrow above)
gp.sched.lr = return PC in G
Currently, when unwinding through morestack (if _TraceJumpStack
is set), we switch PC and SP but not LR. We then have
frame.pc = H's morestack call
frame.sp = H's entry SP (the arrow above)
As LR is not set, we load it from stack at *sp, so
frame.lr = return PC in F
As the SP hasn't decremented at the morestack call,
frame.fp = frame.sp = H's entry SP
Unwinding a frame, we have
frame.pc = old frame.lr = return PC in F
frame.sp = old frame.fp = H's entry SP a.k.a. G's SP
The PC and SP don't match. The unwinding will go off if F and G
have different frame sizes.
Fix this by preserving the LR when switching stack.
Also add code to detect infinite loop in unwinding.
TODO: add some test. I can reproduce the infinite loop (or throw
with added check) but the frequency is low.
Fixes #53111.
Updates #52116.
Change-Id: I6e1294f1c6e55f664c962767a1cf6c466a0c0eff
Reviewed-on: https://go-review.googlesource.com/c/go/+/400575
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Cherry Mui <cherryyz@google.com>
Reviewed-by: Eric Fang <eric.fang@arm.com>
Reviewed-by: Benny Siegert <bsiegert@gmail.com>
(cherry picked from commit 74f00094220f26c80fbaab6eca28c3a664897d24)
Reviewed-on: https://go-review.googlesource.com/c/go/+/408822
Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/runtime/time.go')
0 files changed, 0 insertions, 0 deletions