]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/cgo: preserve nonvolatile VRs when crosscalling into Go on PPC64
authorPaul E. Murphy <murp@ibm.com>
Thu, 30 Mar 2023 16:11:39 +0000 (11:11 -0500)
committerGopher Robot <gobot@golang.org>
Thu, 4 May 2023 18:02:59 +0000 (18:02 +0000)
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 <carlos@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Run-TryBot: Paul Murphy <murp@ibm.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/runtime/cgo/asm_ppc64x.s

index 7752feb65047468c74f79e7d8c3b7b8f0a99e070..c258c7c2a080fd8e89df0f70171e1aca2649d29a 100644 (file)
@@ -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