Skip to content

Commit ccec445

Browse files
committed
KVM: PPC: Book3S HV: Sanitize special-purpose register values on guest exit
Thomas Huth discovered that a guest could cause a hard hang of a host CPU by setting the Instruction Authority Mask Register (IAMR) to a suitable value. It turns out that this is because when the code was added to context-switch the new special-purpose registers (SPRs) that were added in POWER8, we forgot to add code to ensure that they were restored to a sane value on guest exit. This adds code to set those registers where a bad value could compromise the execution of the host kernel to a suitable neutral value on guest exit. Cc: [email protected] # v3.14+ Fixes: b005255 Reported-by: Thomas Huth <[email protected]> Reviewed-by: David Gibson <[email protected]> Signed-off-by: Paul Mackerras <[email protected]>
1 parent 2680d6d commit ccec445

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

arch/powerpc/kvm/book3s_hv_rmhandlers.S

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,20 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
13701370
std r6, VCPU_ACOP(r9)
13711371
stw r7, VCPU_GUEST_PID(r9)
13721372
std r8, VCPU_WORT(r9)
1373+
/*
1374+
* Restore various registers to 0, where non-zero values
1375+
* set by the guest could disrupt the host.
1376+
*/
1377+
li r0, 0
1378+
mtspr SPRN_IAMR, r0
1379+
mtspr SPRN_CIABR, r0
1380+
mtspr SPRN_DAWRX, r0
1381+
mtspr SPRN_TCSCR, r0
1382+
mtspr SPRN_WORT, r0
1383+
/* Set MMCRS to 1<<31 to freeze and disable the SPMC counters */
1384+
li r0, 1
1385+
sldi r0, r0, 31
1386+
mtspr SPRN_MMCRS, r0
13731387
8:
13741388

13751389
/* Save and reset AMR and UAMOR before turning on the MMU */

0 commit comments

Comments
 (0)