Skip to content

Commit 3eab754

Browse files
committed
runtime: correct caller PC/SP offsets in walltime1/nanotime1
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 <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Austin Clements <[email protected]>
1 parent 123f7dd commit 3eab754

File tree

2 files changed

+12
-12
lines changed

2 files changed

+12
-12
lines changed

src/runtime/sys_linux_386.s

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,9 @@ TEXT runtime·walltime1(SB), NOSPLIT, $0-12
233233
MOVL g_m(AX), SI // SI unchanged by C code.
234234

235235
// Set vdsoPC and vdsoSP for SIGPROF traceback.
236-
MOVL 0(SP), DX
237-
MOVL DX, m_vdsoPC(SI)
238-
LEAL sec+0(SP), DX
236+
LEAL sec+0(FP), DX
237+
MOVL -4(DX), CX
238+
MOVL CX, m_vdsoPC(SI)
239239
MOVL DX, m_vdsoSP(SI)
240240

241241
CMPL AX, m_curg(SI) // Only switch if on curg.
@@ -296,9 +296,9 @@ TEXT runtime·nanotime1(SB), NOSPLIT, $0-8
296296
MOVL g_m(AX), SI // SI unchanged by C code.
297297

298298
// Set vdsoPC and vdsoSP for SIGPROF traceback.
299-
MOVL 0(SP), DX
300-
MOVL DX, m_vdsoPC(SI)
301-
LEAL ret+0(SP), DX
299+
LEAL ret+0(FP), DX
300+
MOVL -4(DX), CX
301+
MOVL CX, m_vdsoPC(SI)
302302
MOVL DX, m_vdsoSP(SI)
303303

304304
CMPL AX, m_curg(SI) // Only switch if on curg.

src/runtime/sys_linux_amd64.s

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -221,9 +221,9 @@ TEXT runtime·walltime1(SB),NOSPLIT,$8-12
221221
MOVQ g_m(AX), BX // BX unchanged by C code.
222222

223223
// Set vdsoPC and vdsoSP for SIGPROF traceback.
224-
MOVQ 0(SP), DX
225-
MOVQ DX, m_vdsoPC(BX)
226-
LEAQ sec+0(SP), DX
224+
LEAQ sec+0(FP), DX
225+
MOVQ -8(DX), CX
226+
MOVQ CX, m_vdsoPC(BX)
227227
MOVQ DX, m_vdsoSP(BX)
228228

229229
CMPQ AX, m_curg(BX) // Only switch if on curg.
@@ -275,9 +275,9 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$8-8
275275
MOVQ g_m(AX), BX // BX unchanged by C code.
276276

277277
// Set vdsoPC and vdsoSP for SIGPROF traceback.
278-
MOVQ 0(SP), DX
279-
MOVQ DX, m_vdsoPC(BX)
280-
LEAQ ret+0(SP), DX
278+
LEAQ ret+0(FP), DX
279+
MOVQ -8(DX), CX
280+
MOVQ CX, m_vdsoPC(BX)
281281
MOVQ DX, m_vdsoSP(BX)
282282

283283
CMPQ AX, m_curg(BX) // Only switch if on curg.

0 commit comments

Comments
 (0)