mirror of https://github.com/golang/go.git
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 <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>
This commit is contained in:
parent
c6116bea03
commit
1e51b1fac3
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue