]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.18] 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:32 +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 #54674.

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/+/425616

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 fd65969b628ac7eebc1d5972434d6b155c0e43ca..64121b11aa64024c2b5f7f438699ad7a1036eabe 100644 (file)
@@ -318,6 +318,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 ae14213999534c9bf490f1cd5e8170d10a34fc46..10ae161a13f5a04da5e56af503c2ffac627a247c 100644 (file)
@@ -338,6 +338,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 2a4837b3991b5b7577548ca15f8f6a46b1c2196f..c88bef6ed8620ac0b62c128bda2ece25fec6fae4 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)