]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use saved state in SIGPROF handler for vDSO calls
authorHeschi Kreinick <heschi@google.com>
Wed, 18 Apr 2018 17:03:35 +0000 (13:03 -0400)
committerHeschi Kreinick <heschi@google.com>
Wed, 18 Apr 2018 17:35:42 +0000 (17:35 +0000)
VDSO calls do manual stack alignment, which doesn't get tracked in the
pcsp table. Without accurate pcsp information, backtracing them is
dangerous, and causes a crash in the SIGPROF handler. Fortunately,
https://golang.org/cl/97315 saves a clean state in m.vdsoPC/SP. Change
to use those if they're present, without attempting a normal backtrace.

Fixes #24925

Change-Id: I4b8501ae73a9d18209e22f839773c4fe6102a509
Reviewed-on: https://go-review.googlesource.com/107778
Run-TryBot: Heschi Kreinick <heschi@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/proc.go

index d99c8be1abed74df8080e60a3fae162b70c78150..b67d67a6f79eefaac198653fbf17089b13a4845b 100644 (file)
@@ -3716,7 +3716,7 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
        // transition. We simply require that g and SP match and that the PC is not
        // in gogo.
        traceback := true
-       if gp == nil || sp < gp.stack.lo || gp.stack.hi < sp || setsSP(pc) {
+       if gp == nil || sp < gp.stack.lo || gp.stack.hi < sp || setsSP(pc) || (mp != nil && mp.vdsoSP != 0) {
                traceback = false
        }
        var stk [maxCPUProfStack]uintptr