Skip to content
Snippets Groups Projects
Commit faf37c44 authored by Michael Neuling's avatar Michael Neuling Committed by Michael Ellerman
Browse files

powerpc/64s: Clear PCR on boot


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: default avatarMichael Neuling <mikey@neuling.org>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent c1d2a313
No related branches found
No related tags found
No related merge requests found
...@@ -28,6 +28,7 @@ _GLOBAL(__setup_cpu_power7) ...@@ -28,6 +28,7 @@ _GLOBAL(__setup_cpu_power7)
beqlr beqlr
li r0,0 li r0,0
mtspr SPRN_LPID,r0 mtspr SPRN_LPID,r0
mtspr SPRN_PCR,r0
mfspr r3,SPRN_LPCR mfspr r3,SPRN_LPCR
li r4,(LPCR_LPES1 >> LPCR_LPES_SH) li r4,(LPCR_LPES1 >> LPCR_LPES_SH)
bl __init_LPCR_ISA206 bl __init_LPCR_ISA206
...@@ -41,6 +42,7 @@ _GLOBAL(__restore_cpu_power7) ...@@ -41,6 +42,7 @@ _GLOBAL(__restore_cpu_power7)
beqlr beqlr
li r0,0 li r0,0
mtspr SPRN_LPID,r0 mtspr SPRN_LPID,r0
mtspr SPRN_PCR,r0
mfspr r3,SPRN_LPCR mfspr r3,SPRN_LPCR
li r4,(LPCR_LPES1 >> LPCR_LPES_SH) li r4,(LPCR_LPES1 >> LPCR_LPES_SH)
bl __init_LPCR_ISA206 bl __init_LPCR_ISA206
...@@ -57,6 +59,7 @@ _GLOBAL(__setup_cpu_power8) ...@@ -57,6 +59,7 @@ _GLOBAL(__setup_cpu_power8)
beqlr beqlr
li r0,0 li r0,0
mtspr SPRN_LPID,r0 mtspr SPRN_LPID,r0
mtspr SPRN_PCR,r0
mfspr r3,SPRN_LPCR mfspr r3,SPRN_LPCR
ori r3, r3, LPCR_PECEDH ori r3, r3, LPCR_PECEDH
li r4,0 /* LPES = 0 */ li r4,0 /* LPES = 0 */
...@@ -78,6 +81,7 @@ _GLOBAL(__restore_cpu_power8) ...@@ -78,6 +81,7 @@ _GLOBAL(__restore_cpu_power8)
beqlr beqlr
li r0,0 li r0,0
mtspr SPRN_LPID,r0 mtspr SPRN_LPID,r0
mtspr SPRN_PCR,r0
mfspr r3,SPRN_LPCR mfspr r3,SPRN_LPCR
ori r3, r3, LPCR_PECEDH ori r3, r3, LPCR_PECEDH
li r4,0 /* LPES = 0 */ li r4,0 /* LPES = 0 */
...@@ -99,6 +103,7 @@ _GLOBAL(__setup_cpu_power9) ...@@ -99,6 +103,7 @@ _GLOBAL(__setup_cpu_power9)
mtspr SPRN_PSSCR,r0 mtspr SPRN_PSSCR,r0
mtspr SPRN_LPID,r0 mtspr SPRN_LPID,r0
mtspr SPRN_PID,r0 mtspr SPRN_PID,r0
mtspr SPRN_PCR,r0
mfspr r3,SPRN_LPCR mfspr r3,SPRN_LPCR
LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE | LPCR_HEIC) LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE | LPCR_HEIC)
or r3, r3, r4 or r3, r3, r4
...@@ -123,6 +128,7 @@ _GLOBAL(__restore_cpu_power9) ...@@ -123,6 +128,7 @@ _GLOBAL(__restore_cpu_power9)
mtspr SPRN_PSSCR,r0 mtspr SPRN_PSSCR,r0
mtspr SPRN_LPID,r0 mtspr SPRN_LPID,r0
mtspr SPRN_PID,r0 mtspr SPRN_PID,r0
mtspr SPRN_PCR,r0
mfspr r3,SPRN_LPCR mfspr r3,SPRN_LPCR
LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE | LPCR_HEIC) LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE | LPCR_HEIC)
or r3, r3, r4 or r3, r3, r4
......
...@@ -101,6 +101,7 @@ static void __restore_cpu_cpufeatures(void) ...@@ -101,6 +101,7 @@ static void __restore_cpu_cpufeatures(void)
if (hv_mode) { if (hv_mode) {
mtspr(SPRN_LPID, 0); mtspr(SPRN_LPID, 0);
mtspr(SPRN_HFSCR, system_registers.hfscr); mtspr(SPRN_HFSCR, system_registers.hfscr);
mtspr(SPRN_PCR, 0);
} }
mtspr(SPRN_FSCR, system_registers.fscr); mtspr(SPRN_FSCR, system_registers.fscr);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment