mirror of
https://github.com/golang/go
synced 2024-11-17 21:44:43 -07:00
runtime: save and restore CR for ppc64le
C code expects CR2, CR3, and CR4 to be preserved across function calls. Preserve the entire CR register across function calls in _rt0_ppc64le_linux_lib and crosscall2. The standard ppc64le call frame uses 8(R1) as the place to save CR; emulate that. It's hard to write a reliable test for this as it requires writing C code that sets CR2, CR3, or CR4 across a call to a Go function. Change-Id: If39e771a5b574602b848227312e83598fe74eab7 Reviewed-on: https://go-review.googlesource.com/44733 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Carlos Eduardo Seo <cseo@linux.vnet.ibm.com> Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com>
This commit is contained in:
parent
555d1e36f9
commit
b1af5393d9
@ -16,6 +16,8 @@ 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
|
||||
MOVD R0, 8(R1)
|
||||
MOVD R2, 24(R1) // Save TOC in caller's frame
|
||||
|
||||
BL saveregs2<>(SB)
|
||||
@ -38,6 +40,8 @@ TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
|
||||
BL restoreregs2<>(SB)
|
||||
|
||||
MOVD 24(R1), R2
|
||||
MOVD 8(R1), R0
|
||||
MOVFL R0, $0xff
|
||||
MOVD 16(R1), R0
|
||||
MOVD R0, LR
|
||||
RET
|
||||
|
@ -8,6 +8,8 @@ TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT,$-8
|
||||
// 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
|
||||
MOVD R0, 8(R1)
|
||||
MOVD R2, 24(R1) // Save TOC in caller's frame.
|
||||
MOVDU R1, -320(R1) // Allocate frame.
|
||||
|
||||
@ -120,6 +122,8 @@ done:
|
||||
|
||||
ADD $320, R1
|
||||
MOVD 24(R1), R2
|
||||
MOVD 8(R1), R0
|
||||
MOVFL R0, $0xff
|
||||
MOVD 16(R1), R0
|
||||
MOVD R0, LR
|
||||
RET
|
||||
|
Loading…
Reference in New Issue
Block a user