]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: correct caller PC/SP offsets in walltime1/nanotime1
authorCherry Zhang <cherryyz@google.com>
Tue, 11 Feb 2020 20:09:39 +0000 (15:09 -0500)
committerCherry Zhang <cherryyz@google.com>
Thu, 13 Feb 2020 19:49:45 +0000 (19:49 +0000)
In walltime1/nanotime1, we save the caller's PC and SP for stack
unwinding. The code does that assumed zero frame size. Now that
the frame size is not zero, correct the offset. Rewrite it in a
way that doesn't depend on hard-coded frame size.

May fix #37127.

Change-Id: I47d6d54fc3499d7d5946c3f6a2dbd24fbd679de1
Reviewed-on: https://go-review.googlesource.com/c/go/+/219118
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/sys_linux_386.s
src/runtime/sys_linux_amd64.s

index 8e05acf89485a029d4abe98679eb56722adbb5e7..1b28098ad94ae0096ee2a6fe4d002303a2318464 100644 (file)
@@ -233,9 +233,9 @@ TEXT runtime·walltime1(SB), NOSPLIT, $0-12
        MOVL    g_m(AX), SI // SI unchanged by C code.
 
        // Set vdsoPC and vdsoSP for SIGPROF traceback.
-       MOVL    0(SP), DX
-       MOVL    DX, m_vdsoPC(SI)
-       LEAL    sec+0(SP), DX
+       LEAL    sec+0(FP), DX
+       MOVL    -4(DX), CX
+       MOVL    CX, m_vdsoPC(SI)
        MOVL    DX, m_vdsoSP(SI)
 
        CMPL    AX, m_curg(SI)  // Only switch if on curg.
@@ -296,9 +296,9 @@ TEXT runtime·nanotime1(SB), NOSPLIT, $0-8
        MOVL    g_m(AX), SI // SI unchanged by C code.
 
        // Set vdsoPC and vdsoSP for SIGPROF traceback.
-       MOVL    0(SP), DX
-       MOVL    DX, m_vdsoPC(SI)
-       LEAL    ret+0(SP), DX
+       LEAL    ret+0(FP), DX
+       MOVL    -4(DX), CX
+       MOVL    CX, m_vdsoPC(SI)
        MOVL    DX, m_vdsoSP(SI)
 
        CMPL    AX, m_curg(SI)  // Only switch if on curg.
index 9493101460de5d37375d241d980aea1f9906488a..58d3bc54b49ed14441deb0372264309d0f832c4e 100644 (file)
@@ -221,9 +221,9 @@ TEXT runtime·walltime1(SB),NOSPLIT,$8-12
        MOVQ    g_m(AX), BX // BX unchanged by C code.
 
        // Set vdsoPC and vdsoSP for SIGPROF traceback.
-       MOVQ    0(SP), DX
-       MOVQ    DX, m_vdsoPC(BX)
-       LEAQ    sec+0(SP), DX
+       LEAQ    sec+0(FP), DX
+       MOVQ    -8(DX), CX
+       MOVQ    CX, m_vdsoPC(BX)
        MOVQ    DX, m_vdsoSP(BX)
 
        CMPQ    AX, m_curg(BX)  // Only switch if on curg.
@@ -275,9 +275,9 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$8-8
        MOVQ    g_m(AX), BX // BX unchanged by C code.
 
        // Set vdsoPC and vdsoSP for SIGPROF traceback.
-       MOVQ    0(SP), DX
-       MOVQ    DX, m_vdsoPC(BX)
-       LEAQ    ret+0(SP), DX
+       LEAQ    ret+0(FP), DX
+       MOVQ    -8(DX), CX
+       MOVQ    CX, m_vdsoPC(BX)
        MOVQ    DX, m_vdsoSP(BX)
 
        CMPQ    AX, m_curg(BX)  // Only switch if on curg.