From: Mauri de Souza Meneguzzo Date: Fri, 23 Feb 2024 01:06:40 +0000 (+0000) Subject: runtime: add crash stack support for arm X-Git-Tag: go1.23rc1~1144 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=727e8d3863f45789e559d4a9d20286026cb5bb07;p=gostls13.git runtime: add crash stack support for arm Change-Id: Ide4002d1cf82f2daaf7261b367c391dedbbf7719 GitHub-Last-Rev: 80ee248c3e34529e7a522acc97db9fb69c82dffb GitHub-Pull-Request: golang/go#65308 Reviewed-on: https://go-review.googlesource.com/c/go/+/558699 Reviewed-by: Cherry Mui Reviewed-by: Michael Pratt LUCI-TryBot-Result: Go LUCI --- diff --git a/src/runtime/asm.s b/src/runtime/asm.s index 4833fae5e9..64b9e420b6 100644 --- a/src/runtime/asm.s +++ b/src/runtime/asm.s @@ -13,6 +13,7 @@ TEXT ·sigpanic0(SB),NOSPLIT,$0-0 TEXT ·mapinitnoop(SB),NOSPLIT,$0-0 RET +#ifndef GOARCH_arm #ifndef GOARCH_amd64 #ifndef GOARCH_arm64 #ifndef GOARCH_loong64 @@ -36,3 +37,4 @@ TEXT ·switchToCrashStack0(SB),NOSPLIT,$0-0 #endif #endif #endif +#endif diff --git a/src/runtime/asm_arm.s b/src/runtime/asm_arm.s index 31a0584fb5..4d57ec6062 100644 --- a/src/runtime/asm_arm.s +++ b/src/runtime/asm_arm.s @@ -333,6 +333,30 @@ noswitch: MOVW.P 4(R13), R14 // restore LR B (R0) +// func switchToCrashStack0(fn func()) +TEXT runtime·switchToCrashStack0(SB), NOSPLIT, $0-4 + MOVW fn+0(FP), R7 // context register + MOVW g_m(g), R1 // curm + + // set g to gcrash + MOVW $runtime·gcrash(SB), R0 + BL setg<>(SB) // g = &gcrash + MOVW R1, g_m(g) // g.m = curm + MOVW g, m_g0(R1) // curm.g0 = g + + // switch to crashstack + MOVW (g_stack+stack_hi)(g), R1 + SUB $(4*8), R1 + MOVW R1, R13 + + // call target function + MOVW 0(R7), R0 + BL (R0) + + // should never return + CALL runtime·abort(SB) + UNDEF + /* * support for morestack */ @@ -349,6 +373,14 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0 // Cannot grow scheduler stack (m->g0). MOVW g_m(g), R8 MOVW m_g0(R8), R4 + + // Called from f. + // Set g->sched to context in f. + MOVW R13, (g_sched+gobuf_sp)(g) + MOVW LR, (g_sched+gobuf_pc)(g) + MOVW R3, (g_sched+gobuf_lr)(g) + MOVW R7, (g_sched+gobuf_ctxt)(g) + CMP g, R4 BNE 3(PC) BL runtime·badmorestackg0(SB) @@ -361,13 +393,6 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0 BL runtime·badmorestackgsignal(SB) B runtime·abort(SB) - // Called from f. - // Set g->sched to context in f. - MOVW R13, (g_sched+gobuf_sp)(g) - MOVW LR, (g_sched+gobuf_pc)(g) - MOVW R3, (g_sched+gobuf_lr)(g) - MOVW R7, (g_sched+gobuf_ctxt)(g) - // Called from f. // Set m->morebuf to f's caller. MOVW R3, (m_morebuf+gobuf_pc)(R8) // f's caller's PC diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 538ed0a282..dc26cda992 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -579,7 +579,7 @@ func switchToCrashStack(fn func()) { // Disable crash stack on Windows for now. Apparently, throwing an exception // on a non-system-allocated crash stack causes EXCEPTION_STACK_OVERFLOW and // hangs the process (see issue 63938). -const crashStackImplemented = (GOARCH == "amd64" || GOARCH == "arm64" || GOARCH == "loong64" || GOARCH == "mips64" || GOARCH == "mips64le" || GOARCH == "ppc64" || GOARCH == "ppc64le" || GOARCH == "riscv64" || GOARCH == "s390x" || GOARCH == "wasm") && GOOS != "windows" +const crashStackImplemented = (GOARCH == "amd64" || GOARCH == "arm" || GOARCH == "arm64" || GOARCH == "loong64" || GOARCH == "mips64" || GOARCH == "mips64le" || GOARCH == "ppc64" || GOARCH == "ppc64le" || GOARCH == "riscv64" || GOARCH == "s390x" || GOARCH == "wasm") && GOOS != "windows" //go:noescape func switchToCrashStack0(fn func()) // in assembly