From b1af5393d9eaa9360f6d08e36653c383394d8b9a Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 2 Jun 2017 15:56:35 -0700 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Carlos Eduardo Seo Reviewed-by: Lynn Boger --- src/runtime/cgo/asm_ppc64x.s | 4 ++++ src/runtime/rt0_linux_ppc64le.s | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/runtime/cgo/asm_ppc64x.s b/src/runtime/cgo/asm_ppc64x.s index dded1be399..1cf27ddc96 100644 --- a/src/runtime/cgo/asm_ppc64x.s +++ b/src/runtime/cgo/asm_ppc64x.s @@ -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 diff --git a/src/runtime/rt0_linux_ppc64le.s b/src/runtime/rt0_linux_ppc64le.s index bcbc9c7b31..81b991349a 100644 --- a/src/runtime/rt0_linux_ppc64le.s +++ b/src/runtime/rt0_linux_ppc64le.s @@ -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 -- 2.50.0