runtime: add crash stack support for riscv64

Change-Id: Ib89a71e20f9c6b86c97814c75cb427e9bd7075e5
Reviewed-on: https://go-review.googlesource.com/c/go/+/538735
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: Joel Sing <joel@sing.id.au>
This commit is contained in:
Joel Sing 2023-11-01 01:34:33 +11:00
parent 285ac5a11e
commit cfe36fd122
5 changed files with 37 additions and 9 deletions

View file

@ -15,8 +15,10 @@ TEXT ·mapinitnoop<ABIInternal>(SB),NOSPLIT,$0-0
#ifndef GOARCH_amd64 #ifndef GOARCH_amd64
#ifndef GOARCH_arm64 #ifndef GOARCH_arm64
#ifndef GOARCH_riscv64
// stub to appease shared build mode. // stub to appease shared build mode.
TEXT ·switchToCrashStack0<ABIInternal>(SB),NOSPLIT,$0-0 TEXT ·switchToCrashStack0<ABIInternal>(SB),NOSPLIT,$0-0
UNDEF UNDEF
#endif #endif
#endif #endif
#endif

View file

@ -153,6 +153,30 @@ TEXT runtime·getcallerpc(SB),NOSPLIT|NOFRAME,$0-8
MOV T0, ret+0(FP) MOV T0, ret+0(FP)
RET RET
// func switchToCrashStack0(fn func())
TEXT runtime·switchToCrashStack0<ABIInternal>(SB), NOSPLIT, $0-8
MOV X10, CTXT // context register
MOV g_m(g), X11 // curm
// set g to gcrash
MOV $runtime·gcrash(SB), g // g = &gcrash
CALL runtime·save_g(SB) // clobbers X31
MOV X11, g_m(g) // g.m = curm
MOV g, m_g0(X11) // curm.g0 = g
// switch to crashstack
MOV (g_stack+stack_hi)(g), X11
ADD $(-4*8), X11
MOV X11, X2
// call target function
MOV 0(CTXT), X10
JALR X1, X10
// should never return
CALL runtime·abort(SB)
UNDEF
/* /*
* support for morestack * support for morestack
*/ */
@ -168,6 +192,13 @@ TEXT runtime·getcallerpc(SB),NOSPLIT|NOFRAME,$0-8
// func morestack() // func morestack()
TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0 TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
// Called from f.
// Set g->sched to context in f.
MOV X2, (g_sched+gobuf_sp)(g)
MOV T0, (g_sched+gobuf_pc)(g)
MOV RA, (g_sched+gobuf_lr)(g)
MOV CTXT, (g_sched+gobuf_ctxt)(g)
// Cannot grow scheduler stack (m->g0). // Cannot grow scheduler stack (m->g0).
MOV g_m(g), A0 MOV g_m(g), A0
MOV m_g0(A0), A1 MOV m_g0(A0), A1
@ -181,13 +212,6 @@ TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
CALL runtime·badmorestackgsignal(SB) CALL runtime·badmorestackgsignal(SB)
CALL runtime·abort(SB) CALL runtime·abort(SB)
// Called from f.
// Set g->sched to context in f.
MOV X2, (g_sched+gobuf_sp)(g)
MOV T0, (g_sched+gobuf_pc)(g)
MOV RA, (g_sched+gobuf_lr)(g)
MOV CTXT, (g_sched+gobuf_ctxt)(g)
// Called from f. // Called from f.
// Set m->morebuf to f's caller. // Set m->morebuf to f's caller.
MOV RA, (m_morebuf+gobuf_pc)(A0) // f's caller's PC MOV RA, (m_morebuf+gobuf_pc)(A0) // f's caller's PC

View file

@ -804,7 +804,7 @@ func TestG0StackOverflow(t *testing.T) {
if n := strings.Count(string(out), "morestack on g0\n"); n != 1 { if n := strings.Count(string(out), "morestack on g0\n"); n != 1 {
t.Fatalf("%s\n(exit status %v)", out, err) t.Fatalf("%s\n(exit status %v)", out, err)
} }
if runtime.GOARCH == "amd64" || runtime.GOARCH == "arm64" { if runtime.CrashStackImplemented {
// check for a stack trace // check for a stack trace
want := "runtime.stackOverflow" want := "runtime.stackOverflow"
if n := strings.Count(string(out), want); n < 5 { if n := strings.Count(string(out), want); n < 5 {

View file

@ -50,6 +50,8 @@ var MemclrNoHeapPointers = memclrNoHeapPointers
var CgoCheckPointer = cgoCheckPointer var CgoCheckPointer = cgoCheckPointer
const CrashStackImplemented = crashStackImplemented
const TracebackInnerFrames = tracebackInnerFrames const TracebackInnerFrames = tracebackInnerFrames
const TracebackOuterFrames = tracebackOuterFrames const TracebackOuterFrames = tracebackOuterFrames

View file

@ -574,7 +574,7 @@ func switchToCrashStack(fn func()) {
abort() abort()
} }
const crashStackImplemented = GOARCH == "amd64" || GOARCH == "arm64" const crashStackImplemented = GOARCH == "amd64" || GOARCH == "arm64" || GOARCH == "riscv64"
//go:noescape //go:noescape
func switchToCrashStack0(func()) // in assembly func switchToCrashStack0(func()) // in assembly