]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.19] runtime: mark morestack_noctxt SPWRITE on LR architectures
authorCherry Mui <cherryyz@google.com>
Wed, 24 Aug 2022 22:33:21 +0000 (18:33 -0400)
committerHeschi Kreinick <heschi@google.com>
Wed, 31 Aug 2022 16:31:38 +0000 (16:31 +0000)
On LR architectures, morestack (and morestack_noctxt) are called
with a special calling convention, where the caller doesn't save
LR on stack but passes it as a register, which morestack will save
to g.sched.lr. The stack unwinder currently doesn't understand it,
and would fail to unwind from it. morestack already writes SP (as
it switches stack), but morestack_noctxt (which tailcalls
morestack) doesn't. If a profiling signal lands right in
morestack_noctxt, the unwinder will try to unwind the stack and
go off, and possibly crash.

Marking morestack_noctxt SPWRITE stops the unwinding.

Ideally we could teach the unwinder about the special calling
convention, or change the calling convention to be less special
(so the unwinder doesn't need to fetch a register from the signal
context). This is a stop-gap solution, to stop the unwinder from
crashing.

Updates #54332.
Fixes #54675.

Change-Id: I75295f2e27ddcf05f1ea0b541aedcb9000ae7576
Reviewed-on: https://go-review.googlesource.com/c/go/+/425396
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Cherry Mui <cherryyz@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
(cherry picked from commit e4be2ac79f3cc7219ae1cf8334463d11cae24e01)
Reviewed-on: https://go-review.googlesource.com/c/go/+/425615

src/runtime/asm_arm.s
src/runtime/asm_arm64.s
src/runtime/asm_mips64x.s
src/runtime/asm_mipsx.s
src/runtime/asm_ppc64x.s
src/runtime/asm_riscv64.s
src/runtime/asm_s390x.s

index b47184e36bc9801e1c2c2080b9a9ef629122304a..591ef2a399fb76711a609b1920d1ae32354439bd 100644 (file)
@@ -387,6 +387,13 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
        RET
 
 TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
+       // Force SPWRITE. This function doesn't actually write SP,
+       // but it is called with a special calling convention where
+       // the caller doesn't save LR on stack but passes it as a
+       // register (R3), and the unwinder currently doesn't understand.
+       // Make it SPWRITE to stop unwinding. (See issue 54332)
+       MOVW    R13, R13
+
        MOVW    $0, R7
        B runtime·morestack(SB)
 
index 7836ba1d96c01588a4aac93c23930d5587c2149a..7eb5bcfd21502b0fb18b209b33d65edf0c265daa 100644 (file)
@@ -320,6 +320,13 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
        UNDEF
 
 TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
+       // Force SPWRITE. This function doesn't actually write SP,
+       // but it is called with a special calling convention where
+       // the caller doesn't save LR on stack but passes it as a
+       // register (R3), and the unwinder currently doesn't understand.
+       // Make it SPWRITE to stop unwinding. (See issue 54332)
+       MOVD    RSP, RSP
+
        MOVW    $0, R26
        B runtime·morestack(SB)
 
index 3597ebec57c74ffad714f5fdc751d55c94032531..1abadb9c7df308857a84c30885c47c587f560df6 100644 (file)
@@ -258,6 +258,13 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
        UNDEF
 
 TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
+       // Force SPWRITE. This function doesn't actually write SP,
+       // but it is called with a special calling convention where
+       // the caller doesn't save LR on stack but passes it as a
+       // register (R3), and the unwinder currently doesn't understand.
+       // Make it SPWRITE to stop unwinding. (See issue 54332)
+       MOVV    R29, R29
+
        MOVV    R0, REGCTXT
        JMP     runtime·morestack(SB)
 
index 4a086b8eb302cf167f028351012b052c9ab9b4b8..877c1bb97b7bcf8bec5dcc287f44ccfc050abf13 100644 (file)
@@ -257,6 +257,13 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
        UNDEF
 
 TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0-0
+       // Force SPWRITE. This function doesn't actually write SP,
+       // but it is called with a special calling convention where
+       // the caller doesn't save LR on stack but passes it as a
+       // register (R3), and the unwinder currently doesn't understand.
+       // Make it SPWRITE to stop unwinding. (See issue 54332)
+       MOVW    R29, R29
+
        MOVW    R0, REGCTXT
        JMP     runtime·morestack(SB)
 
index c6bcf82ec06f33c9b471e486ac42d135a285532c..6a162eff0af583e47186400cb093bd7f9e904a9e 100644 (file)
@@ -334,6 +334,13 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
        UNDEF
 
 TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
+       // Force SPWRITE. This function doesn't actually write SP,
+       // but it is called with a special calling convention where
+       // the caller doesn't save LR on stack but passes it as a
+       // register (R5), and the unwinder currently doesn't understand.
+       // Make it SPWRITE to stop unwinding. (See issue 54332)
+       MOVD    R1, R1
+
        MOVD    R0, R11
        BR      runtime·morestack(SB)
 
index 00caa9f18a15b480bc23dd21f2641523c8e93f43..389851beb978738cc40c090eebb4387ab87617d9 100644 (file)
@@ -158,8 +158,8 @@ TEXT runtime·getcallerpc(SB),NOSPLIT|NOFRAME,$0-8
  */
 
 // Called during function prolog when more stack is needed.
-// Caller has already loaded:
-// R1: framesize, R2: argsize, R3: LR
+// Called with return address (i.e. caller's PC) in X5 (aka T0),
+// and the LR register contains the caller's LR.
 //
 // The traceback routines see morestack on a g0 as being
 // the top of a stack (for example, morestack calling newstack
@@ -209,6 +209,13 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
 
 // func morestack_noctxt()
 TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
+       // Force SPWRITE. This function doesn't actually write SP,
+       // but it is called with a special calling convention where
+       // the caller doesn't save LR on stack but passes it as a
+       // register, and the unwinder currently doesn't understand.
+       // Make it SPWRITE to stop unwinding. (See issue 54332)
+       MOV     X2, X2
+
        MOV     ZERO, CTXT
        JMP     runtime·morestack(SB)
 
index 9159a673721ff3aad7928c446ebfb136dee8c51c..334e1aa909d3ef7a554cd479aef99cdf36853560 100644 (file)
@@ -346,6 +346,13 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
        UNDEF
 
 TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
+       // Force SPWRITE. This function doesn't actually write SP,
+       // but it is called with a special calling convention where
+       // the caller doesn't save LR on stack but passes it as a
+       // register (R5), and the unwinder currently doesn't understand.
+       // Make it SPWRITE to stop unwinding. (See issue 54332)
+       MOVD    R15, R15
+
        MOVD    $0, R12
        BR      runtime·morestack(SB)