Commit b1af5393 authored by Ian Lance Taylor's avatar Ian Lance Taylor

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: default avatarCarlos Eduardo Seo <cseo@linux.vnet.ibm.com>
Reviewed-by: default avatarLynn Boger <laboger@linux.vnet.ibm.com>
parent 555d1e36
...@@ -16,6 +16,8 @@ TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0 ...@@ -16,6 +16,8 @@ TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
// Start with standard C stack frame layout and linkage // Start with standard C stack frame layout and linkage
MOVD LR, R0 MOVD LR, R0
MOVD R0, 16(R1) // Save LR in caller's frame 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 MOVD R2, 24(R1) // Save TOC in caller's frame
BL saveregs2<>(SB) BL saveregs2<>(SB)
...@@ -38,6 +40,8 @@ TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0 ...@@ -38,6 +40,8 @@ TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
BL restoreregs2<>(SB) BL restoreregs2<>(SB)
MOVD 24(R1), R2 MOVD 24(R1), R2
MOVD 8(R1), R0
MOVFL R0, $0xff
MOVD 16(R1), R0 MOVD 16(R1), R0
MOVD R0, LR MOVD R0, LR
RET RET
......
...@@ -8,6 +8,8 @@ TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT,$-8 ...@@ -8,6 +8,8 @@ TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT,$-8
// Start with standard C stack frame layout and linkage. // Start with standard C stack frame layout and linkage.
MOVD LR, R0 MOVD LR, R0
MOVD R0, 16(R1) // Save LR in caller's frame. 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. MOVD R2, 24(R1) // Save TOC in caller's frame.
MOVDU R1, -320(R1) // Allocate frame. MOVDU R1, -320(R1) // Allocate frame.
...@@ -120,6 +122,8 @@ done: ...@@ -120,6 +122,8 @@ done:
ADD $320, R1 ADD $320, R1
MOVD 24(R1), R2 MOVD 24(R1), R2
MOVD 8(R1), R0
MOVFL R0, $0xff
MOVD 16(R1), R0 MOVD 16(R1), R0
MOVD R0, LR MOVD R0, LR
RET RET
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment