powerpc/64s: Clear PCR on boot [Linux 3.16.60]

This Linux kernel change "powerpc/64s: Clear PCR on boot" is included in the Linux 3.16.60 release. This change is authored by Michael Neuling <mikey [at] neuling.org> on Fri May 18 11:37:42 2018 +1000. The commit for this change in Linux stable tree is a167f7a (patch) which is from upstream commit faf37c4. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream faf37c4.

powerpc/64s: Clear PCR on boot

commit faf37c44a105f3608115785f17cbbf3500f8bc71 upstream.

Clear the PCR (Processor Compatibility Register) on boot to ensure we
are not running in a compatibility mode.

We've seen this cause problems when a crash (and kdump) occurs while
running compat mode guests. The kdump kernel then runs with the PCR
set and causes problems. The symptom in the kdump kernel (also seen in
petitboot after fast-reboot) is early userspace programs taking
sigills on newer instructions (seen in libc).

Signed-off-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
[bwh: Backported to 3.16: Drop changes in __{setup,restore}_cpu_power9
 and __restore_cpu_cpufeatures()]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>

There are 4 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 arch/powerpc/kernel/cpu_setup_power.S | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/powerpc/kernel/cpu_setup_power.S b/arch/powerpc/kernel/cpu_setup_power.S
index 4673353..4fadf57 100644
--- a/arch/powerpc/kernel/cpu_setup_power.S
+++ b/arch/powerpc/kernel/cpu_setup_power.S
@@ -27,6 +27,7 @@ _GLOBAL(__setup_cpu_power7)
    beqlr
    li  r0,0
    mtspr   SPRN_LPID,r0
+   mtspr   SPRN_PCR,r0
    mfspr   r3,SPRN_LPCR
    bl  __init_LPCR
    bl  __init_tlb_power7
@@ -40,6 +41,7 @@ _GLOBAL(__restore_cpu_power7)
    beqlr
    li  r0,0
    mtspr   SPRN_LPID,r0
+   mtspr   SPRN_PCR,r0
    mfspr   r3,SPRN_LPCR
    bl  __init_LPCR
    bl  __init_tlb_power7
@@ -55,6 +57,7 @@ _GLOBAL(__setup_cpu_power8)
    beqlr
    li  r0,0
    mtspr   SPRN_LPID,r0
+   mtspr   SPRN_PCR,r0
    mfspr   r3,SPRN_LPCR
    ori r3, r3, LPCR_PECEDH
    bl  __init_LPCR
@@ -74,6 +77,7 @@ _GLOBAL(__restore_cpu_power8)
    beqlr
    li  r0,0
    mtspr   SPRN_LPID,r0
+   mtspr   SPRN_PCR,r0
    mfspr   r3,SPRN_LPCR
    ori r3, r3, LPCR_PECEDH
    bl  __init_LPCR

Leave a Reply

Your email address will not be published. Required fields are marked *