aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCherry Mui <cherryyz@google.com>2022-05-10 16:09:54 -0400
committerCherry Mui <cherryyz@google.com>2022-05-10 20:38:07 +0000
commitaeaf4b0e5b21ea0819b4e862ed86ce44760516bf (patch)
tree12c65f885af21f3bed05d347004afcb3d19ff5f3 /src
parent2ecf747e088fa6568621d719fbdf41c0d9221cc5 (diff)
downloadgo-aeaf4b0e5b21ea0819b4e862ed86ce44760516bf.tar.xz
runtime: not mark save_g NOFRAME on ARM
On ARM, when GOARM<=6 the TLS pointer is fetched via a call to a kernel helper. This call clobbers LR, even just temporarily. If the function is NOFRAME, if a profiling signal lands right after the call returns, the unwinder will find the wrong LR. Not mark it NOFRAME, so the LR will be saved in the usual way and stack unwinding should work. May fix #52829. Change-Id: I419a31dcf4afbcff8d7ab8f179eec3c477589e60 Reviewed-on: https://go-review.googlesource.com/c/go/+/405482 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com> Run-TryBot: Cherry Mui <cherryyz@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/runtime/tls_arm.s4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/runtime/tls_arm.s b/src/runtime/tls_arm.s
index 83fd37e6ec..d224c55452 100644
--- a/src/runtime/tls_arm.s
+++ b/src/runtime/tls_arm.s
@@ -29,10 +29,12 @@
// NOTE: runtime.gogo assumes that R1 is preserved by this function.
// runtime.mcall assumes this function only clobbers R0 and R11.
// Returns with g in R0.
-TEXT runtime·save_g(SB),NOSPLIT|NOFRAME,$0
+TEXT runtime·save_g(SB),NOSPLIT,$0
// If the host does not support MRC the linker will replace it with
// a call to runtime.read_tls_fallback which jumps to __kuser_get_tls.
// The replacement function saves LR in R11 over the call to read_tls_fallback.
+ // To make stack unwinding work, this function should NOT be marked as NOFRAME,
+ // as it may contain a call, which clobbers LR even just temporarily.
MRC 15, 0, R0, C13, C0, 3 // fetch TLS base pointer
BIC $3, R0 // Darwin/ARM might return unaligned pointer
MOVW runtime·tls_g(SB), R11