Merge branch 'kvm-ppc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus...
authorRadim Krčmář <rkrcmar@redhat.com>
Thu, 14 Sep 2017 15:21:10 +0000 (17:21 +0200)
committerRadim Krčmář <rkrcmar@redhat.com>
Thu, 14 Sep 2017 15:21:10 +0000 (17:21 +0200)
Bug fixes for stable.

arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/book3s_hv_rm_xive.c
arch/powerpc/kvm/book3s_hv_rmhandlers.S
arch/powerpc/kvm/book3s_xive.c
arch/powerpc/kvm/book3s_xive_template.c

index 18e974a34fced58328ecb062fee539279f3df7cd..a7177c284f9b6da3da735bcf26baf78396814a4b 100644 (file)
@@ -4212,11 +4212,13 @@ static int kvmhv_configure_mmu(struct kvm *kvm, struct kvm_ppc_mmuv3_cfg *cfg)
        if ((cfg->process_table & PRTS_MASK) > 24)
                return -EINVAL;
 
+       mutex_lock(&kvm->lock);
        kvm->arch.process_table = cfg->process_table;
        kvmppc_setup_partition_table(kvm);
 
        lpcr = (cfg->flags & KVM_PPC_MMUV3_GTSE) ? LPCR_GTSE : 0;
        kvmppc_update_lpcr(kvm, lpcr, LPCR_GTSE);
+       mutex_unlock(&kvm->lock);
 
        return 0;
 }
index abf5f01b6eb1f04b05d0643ddc46bb8ded237d8f..5b81a807d742c8b11018ead176b60590064f5d7f 100644 (file)
@@ -38,7 +38,6 @@ static inline void __iomem *get_tima_phys(void)
 #define __x_tima               get_tima_phys()
 #define __x_eoi_page(xd)       ((void __iomem *)((xd)->eoi_page))
 #define __x_trig_page(xd)      ((void __iomem *)((xd)->trig_page))
-#define __x_readb      __raw_rm_readb
 #define __x_writeb     __raw_rm_writeb
 #define __x_readw      __raw_rm_readw
 #define __x_readq      __raw_rm_readq
index 663a4a861e7f3600903c61df65240fe32e58e5d3..17936f82d3c787c38327f41186f634d043d843a9 100644 (file)
@@ -771,6 +771,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
 
 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
 BEGIN_FTR_SECTION
+       /*
+        * NOTE THAT THIS TRASHES ALL NON-VOLATILE REGISTERS INCLUDING CR
+        */
        bl      kvmppc_restore_tm
 END_FTR_SECTION_IFSET(CPU_FTR_TM)
 #endif
@@ -1630,6 +1633,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
 
 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
 BEGIN_FTR_SECTION
+       /*
+        * NOTE THAT THIS TRASHES ALL NON-VOLATILE REGISTERS INCLUDING CR
+        */
        bl      kvmppc_save_tm
 END_FTR_SECTION_IFSET(CPU_FTR_TM)
 #endif
@@ -1749,7 +1755,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
        /*
         * Are we running hash or radix ?
         */
-       beq     cr2,3f
+       ld      r5, VCPU_KVM(r9)
+       lbz     r0, KVM_RADIX(r5)
+       cmpwi   cr2, r0, 0
+       beq     cr2, 3f
 
        /* Radix: Handle the case where the guest used an illegal PID */
        LOAD_REG_ADDR(r4, mmu_base_pid)
@@ -2466,6 +2475,9 @@ _GLOBAL(kvmppc_h_cede)            /* r3 = vcpu pointer, r11 = msr, r13 = paca */
 
 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
 BEGIN_FTR_SECTION
+       /*
+        * NOTE THAT THIS TRASHES ALL NON-VOLATILE REGISTERS INCLUDING CR
+        */
        ld      r9, HSTATE_KVM_VCPU(r13)
        bl      kvmppc_save_tm
 END_FTR_SECTION_IFSET(CPU_FTR_TM)
@@ -2578,6 +2590,9 @@ kvm_end_cede:
 
 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
 BEGIN_FTR_SECTION
+       /*
+        * NOTE THAT THIS TRASHES ALL NON-VOLATILE REGISTERS INCLUDING CR
+        */
        bl      kvmppc_restore_tm
 END_FTR_SECTION_IFSET(CPU_FTR_TM)
 #endif
index 08b200a0bbcec8c47a3128f4685ffcbfad261552..13304622ab1c78682fa18f06120f5eb0970f57fb 100644 (file)
@@ -48,7 +48,6 @@
 #define __x_tima               xive_tima
 #define __x_eoi_page(xd)       ((void __iomem *)((xd)->eoi_mmio))
 #define __x_trig_page(xd)      ((void __iomem *)((xd)->trig_mmio))
-#define __x_readb      __raw_readb
 #define __x_writeb     __raw_writeb
 #define __x_readw      __raw_readw
 #define __x_readq      __raw_readq
index d1ed2c41b5d246dde6d53c34530bc30dc63656b9..c7a5deadd1cc782ddd45667c9fc29f96166e85e7 100644 (file)
@@ -28,7 +28,8 @@ static void GLUE(X_PFX,ack_pending)(struct kvmppc_xive_vcpu *xc)
         * bit.
         */
        if (cpu_has_feature(CPU_FTR_POWER9_DD1)) {
-               u8 pipr = __x_readb(__x_tima + TM_QW1_OS + TM_PIPR);
+               __be64 qw1 = __x_readq(__x_tima + TM_QW1_OS);
+               u8 pipr = be64_to_cpu(qw1) & 0xff;
                if (pipr >= xc->hw_cppr)
                        return;
        }
@@ -336,7 +337,6 @@ X_STATIC unsigned long GLUE(X_PFX,h_ipoll)(struct kvm_vcpu *vcpu, unsigned long
        struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
        u8 pending = xc->pending;
        u32 hirq;
-       u8 pipr;
 
        pr_devel("H_IPOLL(server=%ld)\n", server);
 
@@ -353,7 +353,8 @@ X_STATIC unsigned long GLUE(X_PFX,h_ipoll)(struct kvm_vcpu *vcpu, unsigned long
                pending = 0xff;
        } else {
                /* Grab pending interrupt if any */
-               pipr = __x_readb(__x_tima + TM_QW1_OS + TM_PIPR);
+               __be64 qw1 = __x_readq(__x_tima + TM_QW1_OS);
+               u8 pipr = be64_to_cpu(qw1) & 0xff;
                if (pipr < 8)
                        pending |= 1 << pipr;
        }