]> git.baikalelectronics.ru Git - kernel.git/commitdiff
Merge tag 'kvm-4.20-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 26 Oct 2018 00:57:35 +0000 (17:57 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 26 Oct 2018 00:57:35 +0000 (17:57 -0700)
Pull KVM updates from Radim Krčmář:
 "ARM:
   - Improved guest IPA space support (32 to 52 bits)

   - RAS event delivery for 32bit

   - PMU fixes

   - Guest entry hardening

   - Various cleanups

   - Port of dirty_log_test selftest

  PPC:
   - Nested HV KVM support for radix guests on POWER9. The performance
     is much better than with PR KVM. Migration and arbitrary level of
     nesting is supported.

   - Disable nested HV-KVM on early POWER9 chips that need a particular
     hardware bug workaround

   - One VM per core mode to prevent potential data leaks

   - PCI pass-through optimization

   - merge ppc-kvm topic branch and kvm-ppc-fixes to get a better base

  s390:
   - Initial version of AP crypto virtualization via vfio-mdev

   - Improvement for vfio-ap

   - Set the host program identifier

   - Optimize page table locking

  x86:
   - Enable nested virtualization by default

   - Implement Hyper-V IPI hypercalls

   - Improve #PF and #DB handling

   - Allow guests to use Enlightened VMCS

   - Add migration selftests for VMCS and Enlightened VMCS

   - Allow coalesced PIO accesses

   - Add an option to perform nested VMCS host state consistency check
     through hardware

   - Automatic tuning of lapic_timer_advance_ns

   - Many fixes, minor improvements, and cleanups"

* tag 'kvm-4.20-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (204 commits)
  KVM/nVMX: Do not validate that posted_intr_desc_addr is page aligned
  Revert "kvm: x86: optimize dr6 restore"
  KVM: PPC: Optimize clearing TCEs for sparse tables
  x86/kvm/nVMX: tweak shadow fields
  selftests/kvm: add missing executables to .gitignore
  KVM: arm64: Safety check PSTATE when entering guest and handle IL
  KVM: PPC: Book3S HV: Don't use streamlined entry path on early POWER9 chips
  arm/arm64: KVM: Enable 32 bits kvm vcpu events support
  arm/arm64: KVM: Rename function kvm_arch_dev_ioctl_check_extension()
  KVM: arm64: Fix caching of host MDCR_EL2 value
  KVM: VMX: enable nested virtualization by default
  KVM/x86: Use 32bit xor to clear registers in svm.c
  kvm: x86: Introduce KVM_CAP_EXCEPTION_PAYLOAD
  kvm: vmx: Defer setting of DR6 until #DB delivery
  kvm: x86: Defer setting of CR2 until #PF delivery
  kvm: x86: Add payload operands to kvm_multiple_exception
  kvm: x86: Add exception payload fields to kvm_vcpu_events
  kvm: x86: Add has_payload and payload to kvm_queued_exception
  KVM: Documentation: Fix omission in struct kvm_vcpu_events
  KVM: selftests: add Enlightened VMCS test
  ...

22 files changed:
1  2 
MAINTAINERS
arch/arm/include/asm/kvm_arm.h
arch/arm/include/asm/kvm_mmu.h
arch/arm64/include/asm/cpufeature.h
arch/arm64/include/asm/kvm_arm.h
arch/arm64/include/asm/kvm_host.h
arch/arm64/include/asm/kvm_mmu.h
arch/arm64/include/asm/ptrace.h
arch/arm64/kvm/guest.c
arch/arm64/kvm/hyp/sysreg-sr.c
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kvm/book3s_64_mmu_radix.c
arch/s390/Kconfig
arch/x86/include/asm/virtext.h
arch/x86/kvm/mmu.c
arch/x86/kvm/svm.c
arch/x86/kvm/vmx.c
drivers/s390/crypto/Makefile
include/linux/irqchip/arm-gic-v3.h
tools/arch/x86/include/uapi/asm/kvm.h
virt/kvm/arm/arm.c
virt/kvm/arm/mmu.c

diff --cc MAINTAINERS
Simple merge
Simple merge
index 847f01fa429dd4a90cf77249bff97266a8c5dd52,5ad1a54f98dcacbf5534617993af3ff875763e6c..1098ffc3d54b358d19c2e69b8df9ae9eb5fba031
@@@ -355,11 -358,8 +358,13 @@@ static inline int hyp_map_aux_data(void
  
  #define kvm_phys_to_vttbr(addr)               (addr)
  
+ static inline void kvm_set_ipa_limit(void) {}
 +static inline bool kvm_cpu_has_cnp(void)
 +{
 +      return false;
 +}
 +
  #endif        /* !__ASSEMBLY__ */
  
  #endif /* __ARM_KVM_MMU_H__ */
index 6db48d90ad63ddb3cf347ee0f757b889bf4dfe92,072cc1c970c22b6b4f79adb83a5c6928ca7c4c00..7e2ec64aa414aad5c774a42f9d9c748122d56b20
@@@ -536,7 -530,26 +536,28 @@@ void arm64_set_ssbd_mitigation(bool sta
  static inline void arm64_set_ssbd_mitigation(bool state) {}
  #endif
  
 +extern int do_emulate_mrs(struct pt_regs *regs, u32 sys_reg, u32 rt);
++
+ static inline u32 id_aa64mmfr0_parange_to_phys_shift(int parange)
+ {
+       switch (parange) {
+       case 0: return 32;
+       case 1: return 36;
+       case 2: return 40;
+       case 3: return 42;
+       case 4: return 44;
+       case 5: return 48;
+       case 6: return 52;
+       /*
+        * A future PE could use a value unknown to the kernel.
+        * However, by the "D10.1.4 Principles of the ID scheme
+        * for fields in ID registers", ARM DDI 0487C.a, any new
+        * value is guaranteed to be higher than what we know already.
+        * As a safe limit, we return the limit supported by the kernel.
+        */
+       default: return CONFIG_ARM64_PA_BITS;
+       }
+ }
  #endif /* __ASSEMBLY__ */
  
  #endif
index b476bc46f0abe2f2bf61002fcd4aa07e5ce697b4,6e324d1f12316600e0d433191162b745e42ba448..6f602af5263c20b6d1ded0cd4232c4b8b840b95f
  #define VTCR_EL2_COMMON_BITS  (VTCR_EL2_SH0_INNER | VTCR_EL2_ORGN0_WBWA | \
                                 VTCR_EL2_IRGN0_WBWA | VTCR_EL2_RES1)
  
- #ifdef CONFIG_ARM64_64K_PAGES
  /*
-  * Stage2 translation configuration:
-  * 64kB pages (TG0 = 1)
-  * 2 level page tables (SL = 1)
+  * VTCR_EL2:SL0 indicates the entry level for Stage2 translation.
+  * Interestingly, it depends on the page size.
+  * See D.10.2.121, VTCR_EL2, in ARM DDI 0487C.a
+  *
+  *    -----------------------------------------
+  *    | Entry level           |  4K  | 16K/64K |
+  *    ------------------------------------------
+  *    | Level: 0              |  2   |   -     |
+  *    ------------------------------------------
+  *    | Level: 1              |  1   |   2     |
+  *    ------------------------------------------
+  *    | Level: 2              |  0   |   1     |
+  *    ------------------------------------------
+  *    | Level: 3              |  -   |   0     |
+  *    ------------------------------------------
+  *
+  * The table roughly translates to :
+  *
+  *    SL0(PAGE_SIZE, Entry_level) = TGRAN_SL0_BASE - Entry_Level
+  *
+  * Where TGRAN_SL0_BASE is a magic number depending on the page size:
+  *    TGRAN_SL0_BASE(4K) = 2
+  *    TGRAN_SL0_BASE(16K) = 3
+  *    TGRAN_SL0_BASE(64K) = 3
+  * provided we take care of ruling out the unsupported cases and
+  * Entry_Level = 4 - Number_of_levels.
+  *
   */
- #define VTCR_EL2_TGRAN_FLAGS          (VTCR_EL2_TG0_64K | VTCR_EL2_SL0_LVL1)
- #define VTTBR_X_TGRAN_MAGIC           38
+ #ifdef CONFIG_ARM64_64K_PAGES
+ #define VTCR_EL2_TGRAN                        VTCR_EL2_TG0_64K
+ #define VTCR_EL2_TGRAN_SL0_BASE               3UL
  #elif defined(CONFIG_ARM64_16K_PAGES)
- /*
-  * Stage2 translation configuration:
-  * 16kB pages (TG0 = 2)
-  * 2 level page tables (SL = 1)
-  */
- #define VTCR_EL2_TGRAN_FLAGS          (VTCR_EL2_TG0_16K | VTCR_EL2_SL0_LVL1)
- #define VTTBR_X_TGRAN_MAGIC           42
+ #define VTCR_EL2_TGRAN                        VTCR_EL2_TG0_16K
+ #define VTCR_EL2_TGRAN_SL0_BASE               3UL
  #else /* 4K */
- /*
-  * Stage2 translation configuration:
-  * 4kB pages (TG0 = 0)
-  * 3 level page tables (SL = 1)
-  */
- #define VTCR_EL2_TGRAN_FLAGS          (VTCR_EL2_TG0_4K | VTCR_EL2_SL0_LVL1)
- #define VTTBR_X_TGRAN_MAGIC           37
+ #define VTCR_EL2_TGRAN                        VTCR_EL2_TG0_4K
+ #define VTCR_EL2_TGRAN_SL0_BASE               2UL
  #endif
  
- #define VTCR_EL2_FLAGS                        (VTCR_EL2_COMMON_BITS | VTCR_EL2_TGRAN_FLAGS)
- #define VTTBR_X                               (VTTBR_X_TGRAN_MAGIC - VTCR_EL2_T0SZ_IPA)
+ #define VTCR_EL2_LVLS_TO_SL0(levels)  \
+       ((VTCR_EL2_TGRAN_SL0_BASE - (4 - (levels))) << VTCR_EL2_SL0_SHIFT)
+ #define VTCR_EL2_SL0_TO_LVLS(sl0)     \
+       ((sl0) + 4 - VTCR_EL2_TGRAN_SL0_BASE)
+ #define VTCR_EL2_LVLS(vtcr)           \
+       VTCR_EL2_SL0_TO_LVLS(((vtcr) & VTCR_EL2_SL0_MASK) >> VTCR_EL2_SL0_SHIFT)
+ #define VTCR_EL2_FLAGS                        (VTCR_EL2_COMMON_BITS | VTCR_EL2_TGRAN)
+ #define VTCR_EL2_IPA(vtcr)            (64 - ((vtcr) & VTCR_EL2_T0SZ_MASK))
+ /*
+  * ARM VMSAv8-64 defines an algorithm for finding the translation table
+  * descriptors in section D4.2.8 in ARM DDI 0487C.a.
+  *
+  * The algorithm defines the expectations on the translation table
+  * addresses for each level, based on PAGE_SIZE, entry level
+  * and the translation table size (T0SZ). The variable "x" in the
+  * algorithm determines the alignment of a table base address at a given
+  * level and thus determines the alignment of VTTBR:BADDR for stage2
+  * page table entry level.
+  * Since the number of bits resolved at the entry level could vary
+  * depending on the T0SZ, the value of "x" is defined based on a
+  * Magic constant for a given PAGE_SIZE and Entry Level. The
+  * intermediate levels must be always aligned to the PAGE_SIZE (i.e,
+  * x = PAGE_SHIFT).
+  *
+  * The value of "x" for entry level is calculated as :
+  *    x = Magic_N - T0SZ
+  *
+  * where Magic_N is an integer depending on the page size and the entry
+  * level of the page table as below:
+  *
+  *    --------------------------------------------
+  *    | Entry level           |  4K    16K   64K |
+  *    --------------------------------------------
+  *    | Level: 0 (4 levels)   | 28   |  -  |  -  |
+  *    --------------------------------------------
+  *    | Level: 1 (3 levels)   | 37   | 31  | 25  |
+  *    --------------------------------------------
+  *    | Level: 2 (2 levels)   | 46   | 42  | 38  |
+  *    --------------------------------------------
+  *    | Level: 3 (1 level)    | -    | 53  | 51  |
+  *    --------------------------------------------
+  *
+  * We have a magic formula for the Magic_N below:
+  *
+  *  Magic_N(PAGE_SIZE, Level) = 64 - ((PAGE_SHIFT - 3) * Number_of_levels)
+  *
+  * where Number_of_levels = (4 - Level). We are only interested in the
+  * value for Entry_Level for the stage2 page table.
+  *
+  * So, given that T0SZ = (64 - IPA_SHIFT), we can compute 'x' as follows:
+  *
+  *    x = (64 - ((PAGE_SHIFT - 3) * Number_of_levels)) - (64 - IPA_SHIFT)
+  *      = IPA_SHIFT - ((PAGE_SHIFT - 3) * Number of levels)
+  *
+  * Here is one way to explain the Magic Formula:
+  *
+  *  x = log2(Size_of_Entry_Level_Table)
+  *
+  * Since, we can resolve (PAGE_SHIFT - 3) bits at each level, and another
+  * PAGE_SHIFT bits in the PTE, we have :
+  *
+  *  Bits_Entry_level = IPA_SHIFT - ((PAGE_SHIFT - 3) * (n - 1) + PAGE_SHIFT)
+  *                 = IPA_SHIFT - (PAGE_SHIFT - 3) * n - 3
+  *  where n = number of levels, and since each pointer is 8bytes, we have:
+  *
+  *  x = Bits_Entry_Level + 3
+  *    = IPA_SHIFT - (PAGE_SHIFT - 3) * n
+  *
+  * The only constraint here is that, we have to find the number of page table
+  * levels for a given IPA size (which we do, see stage2_pt_levels())
+  */
+ #define ARM64_VTTBR_X(ipa, levels)    ((ipa) - ((levels) * (PAGE_SHIFT - 3)))
  
- #define VTTBR_BADDR_MASK  (((UL(1) << (PHYS_MASK_SHIFT - VTTBR_X)) - 1) << VTTBR_X)
 +#define VTTBR_CNP_BIT     (UL(1))
  #define VTTBR_VMID_SHIFT  (UL(48))
  #define VTTBR_VMID_MASK(size) (_AT(u64, (1 << size) - 1) << VTTBR_VMID_SHIFT)
  
Simple merge
index 64337afbf124b44b39c429f34af1aabeeeb37720,77b1af9e64db1436a5d35ee026bed5f554c27fd0..658657367f2ff8d7b9d2349db6a114065da264c3
@@@ -517,10 -519,29 +519,34 @@@ static inline int hyp_map_aux_data(void
  
  #define kvm_phys_to_vttbr(addr)               phys_to_ttbr(addr)
  
+ /*
+  * Get the magic number 'x' for VTTBR:BADDR of this KVM instance.
+  * With v8.2 LVA extensions, 'x' should be a minimum of 6 with
+  * 52bit IPS.
+  */
+ static inline int arm64_vttbr_x(u32 ipa_shift, u32 levels)
+ {
+       int x = ARM64_VTTBR_X(ipa_shift, levels);
+       return (IS_ENABLED(CONFIG_ARM64_PA_BITS_52) && x < 6) ? 6 : x;
+ }
+ static inline u64 vttbr_baddr_mask(u32 ipa_shift, u32 levels)
+ {
+       unsigned int x = arm64_vttbr_x(ipa_shift, levels);
+       return GENMASK_ULL(PHYS_MASK_SHIFT - 1, x);
+ }
+ static inline u64 kvm_vttbr_baddr_mask(struct kvm *kvm)
+ {
+       return vttbr_baddr_mask(kvm_phys_shift(kvm), kvm_stage2_levels(kvm));
+ }
 +static inline bool kvm_cpu_has_cnp(void)
 +{
 +      return system_supports_cnp();
 +}
 +
  #endif /* __ASSEMBLY__ */
  #endif /* __ARM64_KVM_MMU_H__ */
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index e665aa7167cf9729aac82a075c358236d9f03aec,ccc6a01eb4f401563b916efe33fec8f219e57a46..4555077d69ce204148facb207f46ddf882483231
@@@ -1567,19 -1577,15 +1577,19 @@@ static int vmx_hv_remote_flush_tlb(stru
        if (to_kvm_vmx(kvm)->ept_pointers_match == EPT_POINTERS_CHECK)
                check_ept_pointer_match(kvm);
  
-       if (to_kvm_vmx(kvm)->ept_pointers_match != EPT_POINTERS_MATCH) {
-               ret = -ENOTSUPP;
-               goto out;
-       }
 +      /*
 +       * FLUSH_GUEST_PHYSICAL_ADDRESS_SPACE hypercall needs the address of the
 +       * base of EPT PML4 table, strip off EPT configuration information.
 +       */
-       ret = hyperv_flush_guest_mapping(
-                       to_vmx(kvm_get_vcpu(kvm, 0))->ept_pointer & PAGE_MASK);
+       if (to_kvm_vmx(kvm)->ept_pointers_match != EPT_POINTERS_MATCH) {
+               kvm_for_each_vcpu(i, vcpu, kvm)
+                       ret |= hyperv_flush_guest_mapping(
 -                              to_vmx(kvm_get_vcpu(kvm, i))->ept_pointer);
++                              to_vmx(kvm_get_vcpu(kvm, i))->ept_pointer & PAGE_MASK);
+       } else {
+               ret = hyperv_flush_guest_mapping(
 -                              to_vmx(kvm_get_vcpu(kvm, 0))->ept_pointer);
++                              to_vmx(kvm_get_vcpu(kvm, 0))->ept_pointer & PAGE_MASK);
+       }
  
- out:
        spin_unlock(&to_kvm_vmx(kvm)->ept_pointer_lock);
        return ret;
  }
Simple merge
Simple merge
Simple merge
index 150c8a69cdaf8233db1f94df624cca6e2812beaf,11b98b2b04868ccfafec37ab68401bb8ab85ae94..23774970c9df66fb771210df9374bf10c0abbffa
@@@ -544,9 -546,9 +546,9 @@@ static void update_vttbr(struct kvm *kv
  
        /* update vttbr to be used with the new vmid */
        pgd_phys = virt_to_phys(kvm->arch.pgd);
-       BUG_ON(pgd_phys & ~VTTBR_BADDR_MASK);
+       BUG_ON(pgd_phys & ~kvm_vttbr_baddr_mask(kvm));
        vmid = ((u64)(kvm->arch.vmid) << VTTBR_VMID_SHIFT) & VTTBR_VMID_MASK(kvm_vmid_bits);
 -      kvm->arch.vttbr = kvm_phys_to_vttbr(pgd_phys) | vmid;
 +      kvm->arch.vttbr = kvm_phys_to_vttbr(pgd_phys) | vmid | cnp;
  
        write_unlock(&kvm_vmid_lock);
  }
Simple merge