diff options
| author | Cherry Mui <cherryyz@google.com> | 2025-11-24 15:29:27 -0500 |
|---|---|---|
| committer | Cherry Mui <cherryyz@google.com> | 2025-11-24 15:29:37 -0500 |
| commit | afd1721fc5a158928f11d81916be1ca41f67e514 (patch) | |
| tree | 80a4cf57f9e5ba9b9fd8443b70ee8b1dc0e5f743 /src/runtime | |
| parent | a9914886da5cd659210b1d1edd8eccefc85c3146 (diff) | |
| parent | 02d1f3a06bc6900ad5c1b7c11b1fd38cbddef395 (diff) | |
| download | go-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.s | 129 | ||||
| -rw-r--r-- | src/runtime/cgocall.go | 3 | ||||
| -rw-r--r-- | src/runtime/memclr_s390x.s | 8 | ||||
| -rw-r--r-- | src/runtime/memmove_s390x.s | 8 | ||||
| -rw-r--r-- | src/runtime/race_s390x.s | 26 | ||||
| -rw-r--r-- | src/runtime/runtime1.go | 2 | ||||
| -rw-r--r-- | src/runtime/stkframe.go | 2 | ||||
| -rw-r--r-- | src/runtime/stubs_s390x.go | 7 | ||||
| -rw-r--r-- | src/runtime/tls_s390x.s | 2 |
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 |
