KVM: PPC: Book3S HV: Fix setting of storage key in H_ENTER
authorRam Pai <linuxram@us.ibm.com>
Mon, 31 Jul 2017 21:39:59 +0000 (14:39 -0700)
committerPaul Mackerras <paulus@ozlabs.org>
Thu, 31 Aug 2017 02:36:44 +0000 (12:36 +1000)
In handling a H_ENTER hypercall, the code in kvmppc_do_h_enter
clobbers the high-order two bits of the storage key, which is stored
in a split field in the second doubleword of the HPTE.  Any storage
key number above 7 hence fails to operate correctly.

This makes sure we preserve all the bits of the storage key.

Acked-by: Balbir Singh <bsingharora@gmail.com>
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
arch/powerpc/include/asm/book3s/64/mmu-hash.h
arch/powerpc/kvm/book3s_hv_rm_mmu.c

index 6981a52b3887079fe2b2870b1fcc78b17e909878..5c6b18a71d55a68ab8ea4b9234520a465ee418d8 100644 (file)
 #define HPTE_R_C               ASM_CONST(0x0000000000000080)
 #define HPTE_R_R               ASM_CONST(0x0000000000000100)
 #define HPTE_R_KEY_LO          ASM_CONST(0x0000000000000e00)
+#define HPTE_R_KEY             (HPTE_R_KEY_LO | HPTE_R_KEY_HI)
 
 #define HPTE_V_1TB_SEG         ASM_CONST(0x4000000000000000)
 #define HPTE_V_VRMA_MASK       ASM_CONST(0x4001ffffff000000)
index 584c74c8119f0db6f4cb76023dfa07ee26a941bd..61c8248b41c3b5c190dea408fb089a76c76469df 100644 (file)
@@ -269,7 +269,7 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
        if (!realmode)
                local_irq_restore(irq_flags);
 
-       ptel &= ~(HPTE_R_PP0 - psize);
+       ptel &= HPTE_R_KEY | HPTE_R_PP0 | (psize-1);
        ptel |= pa;
 
        if (pa)