]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.16] runtime: set vdsoSP to caller's SP consistently
authorCherry Mui <cherryyz@google.com>
Wed, 22 Sep 2021 22:32:45 +0000 (18:32 -0400)
committerCherry Mui <cherryyz@google.com>
Mon, 7 Feb 2022 22:08:13 +0000 (22:08 +0000)
m.vdsoSP should be set to the SP of the caller of nanotime1,
instead of the SP of nanotime1 itself, which matches m.vdsoPC.
Otherwise the unmatched vdsoPC and vdsoSP would make the stack
trace look like recursive.

We already do it correctly on AMD64, 386, and RISCV64. This CL
fixes the rest.

Also incorporate CL 352509, skipping a flaky test.

Updates #47324, #50772.
Fixes #50780.

Change-Id: I98b6fcfbe9fc6bdd28b8fe2a1299b7c505371dd4
Reviewed-on: https://go-review.googlesource.com/c/go/+/337590
Trust: Cherry Mui <cherryyz@google.com>
Trust: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
(cherry picked from commit 217507eb035933bac6c990844f0d71d6000fd339)
Reviewed-on: https://go-review.googlesource.com/c/go/+/380716
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/pprof/pprof_test.go
src/runtime/sys_linux_arm.s
src/runtime/sys_linux_arm64.s
src/runtime/sys_linux_mips64x.s
src/runtime/sys_linux_ppc64x.s

index 0e0cccbc6a6a54f59bf10770453f2d957eac2fab..7bd28fc8bbf20c16965132220bc4077c05dd0fe0 100644 (file)
@@ -1458,3 +1458,38 @@ func TestTryAdd(t *testing.T) {
                })
        }
 }
+
+func TestTimeVDSO(t *testing.T) {
+       // Test that time functions have the right stack trace. In particular,
+       // it shouldn't be recursive.
+
+       if runtime.GOOS == "android" {
+               // Flaky on Android, issue 48655. VDSO may not be enabled.
+               testenv.SkipFlaky(t, 48655)
+       }
+
+       p := testCPUProfile(t, stackContains, []string{"time.now"}, avoidFunctions(), func(dur time.Duration) {
+               t0 := time.Now()
+               for {
+                       t := time.Now()
+                       if t.Sub(t0) >= dur {
+                               return
+                       }
+               }
+       })
+
+       // Check for recursive time.now sample.
+       for _, sample := range p.Sample {
+               var seenNow bool
+               for _, loc := range sample.Location {
+                       for _, line := range loc.Line {
+                               if line.Function.Name == "time.now" {
+                                       if seenNow {
+                                               t.Fatalf("unexpected recursive time.now")
+                                       }
+                                       seenNow = true
+                               }
+                       }
+               }
+       }
+}
index 475f52344c7e9b3113af1e4cd0a549aa09b5d35b..5ebff90e7600c6f6f35b7eec19e4759c6066fddd 100644 (file)
@@ -259,8 +259,9 @@ TEXT runtime·walltime1(SB),NOSPLIT,$8-12
        MOVW    R1, 4(R13)
        MOVW    R2, 8(R13)
 
+       MOVW    $ret-4(FP), R2 // caller's SP
        MOVW    LR, m_vdsoPC(R5)
-       MOVW    R13, m_vdsoSP(R5)
+       MOVW    R2, m_vdsoSP(R5)
 
        MOVW    m_curg(R5), R0
 
@@ -351,8 +352,9 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$8-8
        MOVW    R1, 4(R13)
        MOVW    R2, 8(R13)
 
+       MOVW    $ret-4(FP), R2 // caller's SP
        MOVW    LR, m_vdsoPC(R5)
-       MOVW    R13, m_vdsoSP(R5)
+       MOVW    R2, m_vdsoSP(R5)
 
        MOVW    m_curg(R5), R0
 
index 198a5bacefbb70725b1020b1628a8f9bfd1db9a2..27a285090e9561fd1ea57d8ed9abec59e5e4aade 100644 (file)
@@ -221,8 +221,9 @@ TEXT runtime·walltime1(SB),NOSPLIT,$24-12
        MOVD    R2, 8(RSP)
        MOVD    R3, 16(RSP)
 
+       MOVD    $ret-8(FP), R2 // caller's SP
        MOVD    LR, m_vdsoPC(R21)
-       MOVD    R20, m_vdsoSP(R21)
+       MOVD    R2, m_vdsoSP(R21)
 
        MOVD    m_curg(R21), R0
        CMP     g, R0
@@ -304,8 +305,9 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$24-8
        MOVD    R2, 8(RSP)
        MOVD    R3, 16(RSP)
 
+       MOVD    $ret-8(FP), R2 // caller's SP
        MOVD    LR, m_vdsoPC(R21)
-       MOVD    R20, m_vdsoSP(R21)
+       MOVD    R2, m_vdsoSP(R21)
 
        MOVD    m_curg(R21), R0
        CMP     g, R0
index c3e9f37694578e140cd38c7300b60bdc4b148db0..6450b2896a558ab9e23799aeefe3c90a5efade8b 100644 (file)
@@ -228,8 +228,9 @@ TEXT runtime·walltime1(SB),NOSPLIT,$16-12
        MOVV    R2, 8(R29)
        MOVV    R3, 16(R29)
 
+       MOVV    $ret-8(FP), R2 // caller's SP
        MOVV    R31, m_vdsoPC(R17)
-       MOVV    R29, m_vdsoSP(R17)
+       MOVV    R2, m_vdsoSP(R17)
 
        MOVV    m_curg(R17), R4
        MOVV    g, R5
@@ -297,8 +298,9 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$16-8
        MOVV    R2, 8(R29)
        MOVV    R3, 16(R29)
 
+       MOVV    $ret-8(FP), R2 // caller's SP
        MOVV    R31, m_vdsoPC(R17)
-       MOVV    R29, m_vdsoSP(R17)
+       MOVV    R2, m_vdsoSP(R17)
 
        MOVV    m_curg(R17), R4
        MOVV    g, R5
index 7be8c4c7242485df682ae19d99e3b4a4d30834b3..601ce20b7862d3953da041e56341c2fc2c3a7b3a 100644 (file)
@@ -204,8 +204,9 @@ TEXT runtime·walltime1(SB),NOSPLIT,$16-12
        MOVD    R5, 40(R1)
 
        MOVD    LR, R14
+       MOVD    $ret-FIXED_FRAME(FP), R5 // caller's SP
        MOVD    R14, m_vdsoPC(R21)
-       MOVD    R15, m_vdsoSP(R21)
+       MOVD    R5, m_vdsoSP(R21)
 
        MOVD    m_curg(R21), R6
        CMP     g, R6
@@ -296,9 +297,10 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$16-8
        MOVD    R4, 32(R1)
        MOVD    R5, 40(R1)
 
-       MOVD    LR, R14         // R14 is unchanged by C code
+       MOVD    LR, R14                         // R14 is unchanged by C code
+       MOVD    $ret-FIXED_FRAME(FP), R5        // caller's SP
        MOVD    R14, m_vdsoPC(R21)
-       MOVD    R15, m_vdsoSP(R21)
+       MOVD    R5, m_vdsoSP(R21)
 
        MOVD    m_curg(R21), R6
        CMP     g, R6