From 1e51b1fac3b65562ed4d6cf357f96665da55fed1 Mon Sep 17 00:00:00 2001 From: "Paul E. Murphy" Date: Thu, 30 Mar 2023 11:11:39 -0500 Subject: [PATCH] runtime/cgo: preserve nonvolatile VRs when crosscalling into Go on PPC64 ELFv1 and ELFv2 declare V20-V31 as nonvolatile (callee save) registers. Go does not. Preserve them before calling into Go. Change-Id: If60a6d8f71b51b1136a86eab2b90d964900becd7 Reviewed-on: https://go-review.googlesource.com/c/go/+/480657 Auto-Submit: Carlos Amedee Reviewed-by: Dmitri Shuralyov Run-TryBot: Paul Murphy Reviewed-by: Carlos Amedee Reviewed-by: Lynn Boger TryBot-Result: Gopher Robot --- src/runtime/cgo/asm_ppc64x.s | 112 +++-------------------------------- 1 file changed, 9 insertions(+), 103 deletions(-) diff --git a/src/runtime/cgo/asm_ppc64x.s b/src/runtime/cgo/asm_ppc64x.s index 7752feb650..c258c7c2a0 100644 --- a/src/runtime/cgo/asm_ppc64x.s +++ b/src/runtime/cgo/asm_ppc64x.s @@ -6,6 +6,7 @@ #include "textflag.h" #include "asm_ppc64x.h" +#include "abi_ppc64x.h" #ifdef GO_PPC64X_HAS_FUNCDESC // crosscall2 is marked with go:cgo_export_static. On AIX, this creates and exports @@ -33,20 +34,14 @@ TEXT ·set_crosscall2(SB),NOSPLIT,$0-0 // The value of R2 is saved on the new stack frame, and not // the caller's frame due to issue #43228. TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0 - // Start with standard C stack frame layout and linkage - MOVD LR, R0 - MOVD R0, 16(R1) // Save LR in caller's frame - MOVW CR, R0 // Save CR in caller's frame - MOVW R0, 8(R1) - - BL saveregs2<>(SB) - - MOVDU R1, (-288-3*8-FIXED_FRAME)(R1) - // Save the caller's R2 + // Start with standard C stack frame layout and linkage, allocate + // 32 bytes of argument space, save callee-save regs, and set R0 to $0. + STACK_AND_SAVE_HOST_TO_GO_ABI(32) + // The above will not preserve R2 (TOC). Save it in case Go is + // compiled without a TOC pointer (e.g -buildmode=default). MOVD R2, 24(R1) - // Initialize Go ABI environment - BL runtime·reginit(SB) + // Load the current g. BL runtime·load_g(SB) #ifdef GO_PPC64X_HAS_FUNCDESC @@ -64,96 +59,7 @@ nil_fn: MOVD R6, FIXED_FRAME+16(R1) // ctxt uintptr BL runtime·cgocallback(SB) - // Restore the caller's R2 + // Restore the old frame, and R2. MOVD 24(R1), R2 - ADD $(288+3*8+FIXED_FRAME), R1 - - BL restoreregs2<>(SB) - - MOVW 8(R1), R0 - MOVFL R0, $0xff - MOVD 16(R1), R0 - MOVD R0, LR - RET - -TEXT saveregs2<>(SB),NOSPLIT|NOFRAME,$0 - // O=-288; for R in R{14..31}; do echo "\tMOVD\t$R, $O(R1)"|sed s/R30/g/; ((O+=8)); done; for F in F{14..31}; do echo "\tFMOVD\t$F, $O(R1)"; ((O+=8)); done - MOVD R14, -288(R1) - MOVD R15, -280(R1) - MOVD R16, -272(R1) - MOVD R17, -264(R1) - MOVD R18, -256(R1) - MOVD R19, -248(R1) - MOVD R20, -240(R1) - MOVD R21, -232(R1) - MOVD R22, -224(R1) - MOVD R23, -216(R1) - MOVD R24, -208(R1) - MOVD R25, -200(R1) - MOVD R26, -192(R1) - MOVD R27, -184(R1) - MOVD R28, -176(R1) - MOVD R29, -168(R1) - MOVD g, -160(R1) - MOVD R31, -152(R1) - FMOVD F14, -144(R1) - FMOVD F15, -136(R1) - FMOVD F16, -128(R1) - FMOVD F17, -120(R1) - FMOVD F18, -112(R1) - FMOVD F19, -104(R1) - FMOVD F20, -96(R1) - FMOVD F21, -88(R1) - FMOVD F22, -80(R1) - FMOVD F23, -72(R1) - FMOVD F24, -64(R1) - FMOVD F25, -56(R1) - FMOVD F26, -48(R1) - FMOVD F27, -40(R1) - FMOVD F28, -32(R1) - FMOVD F29, -24(R1) - FMOVD F30, -16(R1) - FMOVD F31, -8(R1) - - RET - -TEXT restoreregs2<>(SB),NOSPLIT|NOFRAME,$0 - // O=-288; for R in R{14..31}; do echo "\tMOVD\t$O(R1), $R"|sed s/R30/g/; ((O+=8)); done; for F in F{14..31}; do echo "\tFMOVD\t$O(R1), $F"; ((O+=8)); done - MOVD -288(R1), R14 - MOVD -280(R1), R15 - MOVD -272(R1), R16 - MOVD -264(R1), R17 - MOVD -256(R1), R18 - MOVD -248(R1), R19 - MOVD -240(R1), R20 - MOVD -232(R1), R21 - MOVD -224(R1), R22 - MOVD -216(R1), R23 - MOVD -208(R1), R24 - MOVD -200(R1), R25 - MOVD -192(R1), R26 - MOVD -184(R1), R27 - MOVD -176(R1), R28 - MOVD -168(R1), R29 - MOVD -160(R1), g - MOVD -152(R1), R31 - FMOVD -144(R1), F14 - FMOVD -136(R1), F15 - FMOVD -128(R1), F16 - FMOVD -120(R1), F17 - FMOVD -112(R1), F18 - FMOVD -104(R1), F19 - FMOVD -96(R1), F20 - FMOVD -88(R1), F21 - FMOVD -80(R1), F22 - FMOVD -72(R1), F23 - FMOVD -64(R1), F24 - FMOVD -56(R1), F25 - FMOVD -48(R1), F26 - FMOVD -40(R1), F27 - FMOVD -32(R1), F28 - FMOVD -24(R1), F29 - FMOVD -16(R1), F30 - FMOVD -8(R1), F31 - + UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(32) RET -- 2.50.0