aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorCherry Mui <cherryyz@google.com>2025-11-24 15:29:27 -0500
committerCherry Mui <cherryyz@google.com>2025-11-24 15:29:37 -0500
commitafd1721fc5a158928f11d81916be1ca41f67e514 (patch)
tree80a4cf57f9e5ba9b9fd8443b70ee8b1dc0e5f743 /src/runtime
parenta9914886da5cd659210b1d1edd8eccefc85c3146 (diff)
parent02d1f3a06bc6900ad5c1b7c11b1fd38cbddef395 (diff)
downloadgo-afd1721fc5a158928f11d81916be1ca41f67e514.tar.xz
[dev.simd] all: merge master (02d1f3a) into dev.simd
Merge List: + 2025-11-24 02d1f3a06b runtime: respect GOTRACEBACK for user-triggered runtime panics + 2025-11-24 a593ca9d65 runtime/cgo: add support for `any` param and return type + 2025-11-24 89552911b3 cmd/compile, internal/buildcfg: enable regABI on s390x, and add s390x + 2025-11-24 2fe0ba8d52 internal/bytealg: port bytealg functions to reg ABI on s390x + 2025-11-24 4529c8fba6 runtime: port memmove, memclr to register ABI on s390x + 2025-11-24 58a48a3e3b internal/runtime/syscall: Syscall changes for s390x regabi + 2025-11-24 2a185fae7e reflect, runtime: add reflect support for regabi on s390x + 2025-11-24 e92d2964fa runtime: mark race functions on s390x as ABIInternal + 2025-11-24 41af98eb83 runtime: add runtime changes for register ABI on s390x + 2025-11-24 85e6080089 cmd/internal/obj: set morestack arg spilling and regabi prologue on s390x + 2025-11-24 24697419c5 cmd/compile: update s390x CALL* ops + 2025-11-24 81242d034c cmd/compile/internal/s390x: add initial spill support + 2025-11-24 73b6aa0fec cmd/compile/internal: add register ABI information for s390x + 2025-11-24 1036f6f485 internal/abi: define s390x ABI constants + 2025-11-24 2e5d12a277 cmd/compile: document register-based ABI for s390x Change-Id: I57b4ae6f9b65d99958b9fe5974205770e18f7788
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/asm_s390x.s129
-rw-r--r--src/runtime/cgocall.go3
-rw-r--r--src/runtime/memclr_s390x.s8
-rw-r--r--src/runtime/memmove_s390x.s8
-rw-r--r--src/runtime/race_s390x.s26
-rw-r--r--src/runtime/runtime1.go2
-rw-r--r--src/runtime/stkframe.go2
-rw-r--r--src/runtime/stubs_s390x.go7
-rw-r--r--src/runtime/tls_s390x.s2
9 files changed, 149 insertions, 38 deletions
diff --git a/src/runtime/asm_s390x.s b/src/runtime/asm_s390x.s
index bb29845f58..791ea80bc2 100644
--- a/src/runtime/asm_s390x.s
+++ b/src/runtime/asm_s390x.s
@@ -160,7 +160,7 @@ nocgo:
MOVD $0, 1(R0)
RET
-DATA runtime·mainPC+0(SB)/8,$runtime·main(SB)
+DATA runtime·mainPC+0(SB)/8,$runtime·main<ABIInternal>(SB)
GLOBL runtime·mainPC(SB),RODATA,$8
TEXT runtime·breakpoint(SB),NOSPLIT|NOFRAME,$0-0
@@ -205,25 +205,29 @@ TEXT gogo<>(SB), NOSPLIT|NOFRAME, $0
// Switch to m->g0's stack, call fn(g).
// Fn must never return. It should gogo(&g->sched)
// to keep running g.
-TEXT runtime·mcall(SB), NOSPLIT, $-8-8
+TEXT runtime·mcall<ABIInternal>(SB), NOSPLIT, $-8-8
+#ifdef GOEXPERIMENT_regabiargs
+ MOVD R2, R12 // context
+#else
+ MOVD fn+0(FP), R12 // context
+#endif
// Save caller state in g->sched
MOVD R15, (g_sched+gobuf_sp)(g)
MOVD LR, (g_sched+gobuf_pc)(g)
MOVD $0, (g_sched+gobuf_lr)(g)
// Switch to m->g0 & its stack, call fn.
- MOVD g, R3
- MOVD g_m(g), R8
- MOVD m_g0(R8), g
+ MOVD g, R2
+ MOVD g_m(g), R4
+ MOVD m_g0(R4), g
BL runtime·save_g(SB)
- CMP g, R3
+ CMP g, R2
BNE 2(PC)
BR runtime·badmcall(SB)
- MOVD fn+0(FP), R12 // context
MOVD 0(R12), R4 // code pointer
MOVD (g_sched+gobuf_sp)(g), R15 // sp = m->g0->sched.sp
SUB $16, R15
- MOVD R3, 8(R15)
+ MOVD R2, 8(R15)
MOVD $0, 0(R15)
BL (R4)
BR runtime·badmcall2(SB)
@@ -292,18 +296,18 @@ noswitch:
// func switchToCrashStack0(fn func())
TEXT runtime·switchToCrashStack0<ABIInternal>(SB), NOSPLIT, $0-8
- MOVD fn+0(FP), R12 // context
- MOVD g_m(g), R4 // curm
+ MOVD R2, R12 // context
+ MOVD g_m(g), R2 // curm
// set g to gcrash
MOVD $runtime·gcrash(SB), g // g = &gcrash
BL runtime·save_g(SB)
- MOVD R4, g_m(g) // g.m = curm
- MOVD g, m_g0(R4) // curm.g0 = g
+ MOVD R2, g_m(g) // g.m = curm
+ MOVD g, m_g0(R2) // curm.g0 = g
// switch to crashstack
- MOVD (g_stack+stack_hi)(g), R4
- ADD $(-4*8), R4, R15
+ MOVD (g_stack+stack_hi)(g), R2
+ ADD $(-4*8), R2, R15
// call target function
MOVD 0(R12), R3 // code pointer
@@ -446,10 +450,14 @@ tailArgs: /* copy remaining bytes */ \
EXRL $callfnMVC<>(SB), R5; \
callFunction: \
MOVD f+8(FP), R12; \
- MOVD (R12), R8; \
+ MOVD regArgs+40(FP), R10; \
+ BL ·unspillArgs(SB); \
+ MOVD (R12), R10; \
PCDATA $PCDATA_StackMapIndex, $0; \
- BL (R8); \
+ BL (R10); \
/* copy return values back */ \
+ MOVD regArgs+40(FP), R10; \
+ BL ·spillArgs(SB); \
MOVD stackArgsType+0(FP), R7; \
MOVD stackArgs+16(FP), R6; \
MOVWZ stackArgsSize+24(FP), R5; \
@@ -466,11 +474,12 @@ callFunction: \
// to reflectcallmove. It does not follow the Go ABI; it expects its
// arguments in registers.
TEXT callRet<>(SB), NOSPLIT, $40-0
+ NO_LOCAL_POINTERS;
MOVD R7, 8(R15)
MOVD R6, 16(R15)
MOVD R4, 24(R15)
MOVD R5, 32(R15)
- MOVD $0, 40(R15)
+ MOVD R10, 40(R15)
BL runtime·reflectcallmove(SB)
RET
@@ -754,15 +763,80 @@ TEXT runtime·cputicks(SB),NOSPLIT,$0-8
MOVD R3, ret+0(FP)
RET
+#ifdef GOEXPERIMENT_regabiargs
+// spillArgs stores return values from registers to a *internal/abi.RegArgs in R10.
+TEXT runtime·spillArgs(SB),NOSPLIT,$0-0
+ MOVD R2, 0(R10)
+ MOVD R3, 8(R10)
+ MOVD R4, 16(R10)
+ MOVD R5, 24(R10)
+ MOVD R6, 32(R10)
+ MOVD R7, 40(R10)
+ MOVD R8, 48(R10)
+ MOVD R9, 56(R10)
+ FMOVD F0, 64(R10)
+ FMOVD F1, 72(R10)
+ FMOVD F2, 80(R10)
+ FMOVD F3, 88(R10)
+ FMOVD F4, 96(R10)
+ FMOVD F5, 104(R10)
+ FMOVD F6, 112(R10)
+ FMOVD F7, 120(R10)
+ FMOVD F8, 128(R10)
+ FMOVD F9, 136(R10)
+ FMOVD F10, 144(R10)
+ FMOVD F11, 152(R10)
+ FMOVD F12, 160(R10)
+ FMOVD F13, 168(R10)
+ FMOVD F14, 176(R10)
+ FMOVD F15, 184(R10)
+ RET
+
+// unspillArgs loads args into registers from a *internal/abi.RegArgs in R10.
+TEXT runtime·unspillArgs(SB),NOSPLIT,$0-0
+ MOVD 0(R10), R2
+ MOVD 8(R10), R3
+ MOVD 16(R10), R4
+ MOVD 24(R10), R5
+ MOVD 32(R10), R6
+ MOVD 40(R10), R7
+ MOVD 48(R10), R8
+ MOVD 56(R10), R9
+ FMOVD 64(R10), F0
+ FMOVD 72(R10), F1
+ FMOVD 80(R10), F2
+ FMOVD 88(R10), F3
+ FMOVD 96(R10), F4
+ FMOVD 104(R10), F5
+ FMOVD 112(R10), F6
+ FMOVD 120(R10), F7
+ FMOVD 128(R10), F8
+ FMOVD 136(R10), F9
+ FMOVD 144(R10), F10
+ FMOVD 152(R10), F11
+ FMOVD 160(R10), F12
+ FMOVD 168(R10), F13
+ FMOVD 176(R10), F14
+ FMOVD 184(R10), F15
+ RET
+#else
+
+TEXT runtime·spillArgs(SB),NOSPLIT,$0-0
+ RET
+
+TEXT runtime·unspillArgs(SB),NOSPLIT,$0-0
+ RET
+#endif
+
// AES hashing not implemented for s390x
-TEXT runtime·memhash(SB),NOSPLIT|NOFRAME,$0-32
- JMP runtime·memhashFallback(SB)
-TEXT runtime·strhash(SB),NOSPLIT|NOFRAME,$0-24
- JMP runtime·strhashFallback(SB)
-TEXT runtime·memhash32(SB),NOSPLIT|NOFRAME,$0-24
- JMP runtime·memhash32Fallback(SB)
-TEXT runtime·memhash64(SB),NOSPLIT|NOFRAME,$0-24
- JMP runtime·memhash64Fallback(SB)
+TEXT runtime·memhash<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-32
+ JMP runtime·memhashFallback<ABIInternal>(SB)
+TEXT runtime·strhash<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24
+ JMP runtime·strhashFallback<ABIInternal>(SB)
+TEXT runtime·memhash32<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24
+ JMP runtime·memhash32Fallback<ABIInternal>(SB)
+TEXT runtime·memhash64<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24
+ JMP runtime·memhash64Fallback<ABIInternal>(SB)
// Called from cgo wrappers, this function returns g->m->curg.stack.hi.
// Must obey the gcc calling convention.
@@ -902,8 +976,7 @@ TEXT runtime·panicBounds<ABIInternal>(SB),NOSPLIT,$144-0
// skip R14 aka LR @ 136
// skip R15 aka SP @ 144
- MOVD R14, 8(R15) // PC immediately after call to panicBounds
- ADD $24, R15, R0 // pointer to save area
- MOVD R0, 16(R15)
+ MOVD R14, R2 // PC immediately after call to panicBounds
+ ADD $24, R15, R3 // pointer to save area
CALL runtime·panicBounds64<ABIInternal>(SB)
RET
diff --git a/src/runtime/cgocall.go b/src/runtime/cgocall.go
index f01353ffa6..55e7bdbdb5 100644
--- a/src/runtime/cgocall.go
+++ b/src/runtime/cgocall.go
@@ -796,6 +796,9 @@ func cgoCheckResult(val any) {
ep := efaceOf(&val)
t := ep._type
+ if t == nil {
+ return
+ }
cgoCheckArg(t, ep.data, !t.IsDirectIface(), false, cgoResultFail)
}
diff --git a/src/runtime/memclr_s390x.s b/src/runtime/memclr_s390x.s
index 392057565e..919423edf7 100644
--- a/src/runtime/memclr_s390x.s
+++ b/src/runtime/memclr_s390x.s
@@ -7,10 +7,14 @@
// See memclrNoHeapPointers Go doc for important implementation constraints.
// func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr)
-TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT|NOFRAME,$0-16
+TEXT runtime·memclrNoHeapPointers<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-16
+#ifndef GOEXPERIMENT_regabiargs
MOVD ptr+0(FP), R4
MOVD n+8(FP), R5
-
+#else
+ MOVD R2, R4
+ MOVD R3, R5
+#endif
CMPBGE R5, $32, clearge32
start:
diff --git a/src/runtime/memmove_s390x.s b/src/runtime/memmove_s390x.s
index f4c2b87d92..28c6a5dab2 100644
--- a/src/runtime/memmove_s390x.s
+++ b/src/runtime/memmove_s390x.s
@@ -7,10 +7,16 @@
// See memmove Go doc for important implementation constraints.
// func memmove(to, from unsafe.Pointer, n uintptr)
-TEXT runtime·memmove(SB),NOSPLIT|NOFRAME,$0-24
+TEXT runtime·memmove<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24
+#ifndef GOEXPERIMENT_regabiargs
MOVD to+0(FP), R6
MOVD from+8(FP), R4
MOVD n+16(FP), R5
+#else
+ MOVD R4, R5
+ MOVD R3, R4
+ MOVD R2, R6
+#endif
CMPBEQ R6, R4, done
diff --git a/src/runtime/race_s390x.s b/src/runtime/race_s390x.s
index 3dfda9e733..d5a0bbedac 100644
--- a/src/runtime/race_s390x.s
+++ b/src/runtime/race_s390x.s
@@ -25,10 +25,14 @@
// func runtime·raceread(addr uintptr)
// Called from instrumented code.
-TEXT runtime·raceread(SB), NOSPLIT, $0-8
+TEXT runtime·raceread<ABIInternal>(SB), NOSPLIT, $0-8
// void __tsan_read(ThreadState *thr, void *addr, void *pc);
MOVD $__tsan_read(SB), R1
+#ifndef GOEXPERIMENT_regabiargs
MOVD addr+0(FP), R3
+#else
+ MOVD R2, R3
+#endif
MOVD R14, R4
JMP racecalladdr<>(SB)
@@ -46,10 +50,14 @@ TEXT runtime·racereadpc(SB), NOSPLIT, $0-24
// func runtime·racewrite(addr uintptr)
// Called from instrumented code.
-TEXT runtime·racewrite(SB), NOSPLIT, $0-8
+TEXT runtime·racewrite<ABIInternal>(SB), NOSPLIT, $0-8
// void __tsan_write(ThreadState *thr, void *addr, void *pc);
MOVD $__tsan_write(SB), R1
+#ifndef GOEXPERIMENT_regabiargs
MOVD addr+0(FP), R3
+#else
+ MOVD R2, R3
+#endif
MOVD R14, R4
JMP racecalladdr<>(SB)
@@ -67,10 +75,15 @@ TEXT runtime·racewritepc(SB), NOSPLIT, $0-24
// func runtime·racereadrange(addr, size uintptr)
// Called from instrumented code.
-TEXT runtime·racereadrange(SB), NOSPLIT, $0-16
+TEXT runtime·racereadrange<ABIInternal>(SB), NOSPLIT, $0-16
// void __tsan_read_range(ThreadState *thr, void *addr, uintptr size, void *pc);
MOVD $__tsan_read_range(SB), R1
+#ifndef GOEXPERIMENT_regabiargs
LMG addr+0(FP), R3, R4
+#else
+ MOVD R3, R4
+ MOVD R2, R3
+#endif
MOVD R14, R5
JMP racecalladdr<>(SB)
@@ -91,10 +104,15 @@ TEXT runtime·racereadrangepc1(SB), NOSPLIT, $0-24
// func runtime·racewriterange(addr, size uintptr)
// Called from instrumented code.
-TEXT runtime·racewriterange(SB), NOSPLIT, $0-16
+TEXT runtime·racewriterange<ABIInternal>(SB), NOSPLIT, $0-16
// void __tsan_write_range(ThreadState *thr, void *addr, uintptr size, void *pc);
MOVD $__tsan_write_range(SB), R1
+#ifndef GOEXPERIMENT_regabiargs
LMG addr+0(FP), R3, R4
+#else
+ MOVD R3, R4
+ MOVD R2, R3
+#endif
MOVD R14, R5
JMP racecalladdr<>(SB)
diff --git a/src/runtime/runtime1.go b/src/runtime/runtime1.go
index 43e4c14236..64ee4c8d2e 100644
--- a/src/runtime/runtime1.go
+++ b/src/runtime/runtime1.go
@@ -39,7 +39,7 @@ func gotraceback() (level int32, all, crash bool) {
gp := getg()
t := atomic.Load(&traceback_cache)
crash = t&tracebackCrash != 0
- all = gp.m.throwing >= throwTypeUser || t&tracebackAll != 0
+ all = gp.m.throwing > throwTypeUser || t&tracebackAll != 0
if gp.m.traceback != 0 {
level = int32(gp.m.traceback)
} else if gp.m.throwing >= throwTypeRuntime {
diff --git a/src/runtime/stkframe.go b/src/runtime/stkframe.go
index 819b7f6c7d..d6e7e0371c 100644
--- a/src/runtime/stkframe.go
+++ b/src/runtime/stkframe.go
@@ -234,7 +234,7 @@ func (frame *stkframe) getStackMap(debug bool) (locals, args bitvector, objs []s
}
// stack objects.
- if (GOARCH == "amd64" || GOARCH == "arm64" || GOARCH == "loong64" || GOARCH == "ppc64" || GOARCH == "ppc64le" || GOARCH == "riscv64") &&
+ if (GOARCH == "amd64" || GOARCH == "arm64" || GOARCH == "loong64" || GOARCH == "ppc64" || GOARCH == "ppc64le" || GOARCH == "riscv64" || GOARCH == "s390x") &&
unsafe.Sizeof(abi.RegArgs{}) > 0 && isReflect {
// For reflect.makeFuncStub and reflect.methodValueCall,
// we need to fake the stack object record.
diff --git a/src/runtime/stubs_s390x.go b/src/runtime/stubs_s390x.go
index a2b07ff8aa..6d704e8200 100644
--- a/src/runtime/stubs_s390x.go
+++ b/src/runtime/stubs_s390x.go
@@ -8,6 +8,13 @@ package runtime
func load_g()
func save_g()
+// Used by reflectcall and the reflect package.
+//
+// Spills/loads arguments in registers to/from an internal/abi.RegArgs
+// respectively. Does not follow the Go ABI.
+func spillArgs()
+func unspillArgs()
+
// getfp returns the frame pointer register of its caller or 0 if not implemented.
// TODO: Make this a compiler intrinsic
func getfp() uintptr { return 0 }
diff --git a/src/runtime/tls_s390x.s b/src/runtime/tls_s390x.s
index cb6a21c114..388e7b88bd 100644
--- a/src/runtime/tls_s390x.s
+++ b/src/runtime/tls_s390x.s
@@ -19,7 +19,7 @@
//
// If !iscgo, this is a no-op.
//
-// NOTE: setg_gcc<> assume this clobbers only R10 and R11.
+// NOTE: setg_gcc<> and mcall assume this clobbers only R10 and R11.
TEXT runtime·save_g(SB),NOSPLIT|NOFRAME,$0-0
MOVB runtime·iscgo(SB), R10
CMPBEQ R10, $0, nocgo