Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 9 Nov 2020 21:58:10 +0000 (13:58 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 9 Nov 2020 21:58:10 +0000 (13:58 -0800)
Pull kvm fixes from Paolo Bonzini:
 "ARM:
   - fix compilation error when PMD and PUD are folded
   - fix regression in reads-as-zero behaviour of ID_AA64ZFR0_EL1
   - add aarch64 get-reg-list test

  x86:
   - fix semantic conflict between two series merged for 5.10
   - fix (and test) enforcement of paravirtual cpuid features

  selftests:
   - various cleanups to memory management selftests
   - new selftests testcase for performance of dirty logging"

* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (30 commits)
  KVM: selftests: allow two iterations of dirty_log_perf_test
  KVM: selftests: Introduce the dirty log perf test
  KVM: selftests: Make the number of vcpus global
  KVM: selftests: Make the per vcpu memory size global
  KVM: selftests: Drop pointless vm_create wrapper
  KVM: selftests: Add wrfract to common guest code
  KVM: selftests: Simplify demand_paging_test with timespec_diff_now
  KVM: selftests: Remove address rounding in guest code
  KVM: selftests: Factor code out of demand_paging_test
  KVM: selftests: Use a single binary for dirty/clear log test
  KVM: selftests: Always clear dirty bitmap after iteration
  KVM: selftests: Add blessed SVE registers to get-reg-list
  KVM: selftests: Add aarch64 get-reg-list test
  selftests: kvm: test enforcement of paravirtual cpuid features
  selftests: kvm: Add exception handling to selftests
  selftests: kvm: Clear uc so UCALL_NONE is being properly reported
  selftests: kvm: Fix the segment descriptor layout to match the actual layout
  KVM: x86: handle MSR_IA32_DEBUGCTLMSR with report_ignored_msrs
  kvm: x86: request masterclock update any time guest uses different msr
  kvm: x86: ensure pv_cpuid.features is initialized when enabling cap
  ...

1  2 
arch/arm64/kvm/sys_regs.c

@@@ -95,7 -95,7 +95,7 @@@ static bool __vcpu_read_sys_reg_from_cp
        case AMAIR_EL1:         *val = read_sysreg_s(SYS_AMAIR_EL12);   break;
        case CNTKCTL_EL1:       *val = read_sysreg_s(SYS_CNTKCTL_EL12); break;
        case ELR_EL1:           *val = read_sysreg_s(SYS_ELR_EL12);     break;
 -      case PAR_EL1:           *val = read_sysreg_s(SYS_PAR_EL1);      break;
 +      case PAR_EL1:           *val = read_sysreg_par();               break;
        case DACR32_EL2:        *val = read_sysreg_s(SYS_DACR32_EL2);   break;
        case IFSR32_EL2:        *val = read_sysreg_s(SYS_IFSR32_EL2);   break;
        case DBGVCR32_EL2:      *val = read_sysreg_s(SYS_DBGVCR32_EL2); break;
@@@ -1069,7 -1069,7 +1069,7 @@@ static bool trap_ptrauth(struct kvm_vcp
  static unsigned int ptrauth_visibility(const struct kvm_vcpu *vcpu,
                        const struct sys_reg_desc *rd)
  {
-       return vcpu_has_ptrauth(vcpu) ? 0 : REG_HIDDEN_USER | REG_HIDDEN_GUEST;
+       return vcpu_has_ptrauth(vcpu) ? 0 : REG_HIDDEN;
  }
  
  #define __PTRAUTH_KEY(k)                                              \
@@@ -1153,6 -1153,22 +1153,22 @@@ static u64 read_id_reg(const struct kvm
        return val;
  }
  
+ static unsigned int id_visibility(const struct kvm_vcpu *vcpu,
+                                 const struct sys_reg_desc *r)
+ {
+       u32 id = sys_reg((u32)r->Op0, (u32)r->Op1,
+                        (u32)r->CRn, (u32)r->CRm, (u32)r->Op2);
+       switch (id) {
+       case SYS_ID_AA64ZFR0_EL1:
+               if (!vcpu_has_sve(vcpu))
+                       return REG_RAZ;
+               break;
+       }
+       return 0;
+ }
  /* cpufeature ID register access trap handlers */
  
  static bool __access_id_reg(struct kvm_vcpu *vcpu,
@@@ -1171,7 -1187,9 +1187,9 @@@ static bool access_id_reg(struct kvm_vc
                          struct sys_reg_params *p,
                          const struct sys_reg_desc *r)
  {
-       return __access_id_reg(vcpu, p, r, false);
+       bool raz = sysreg_visible_as_raz(vcpu, r);
+       return __access_id_reg(vcpu, p, r, raz);
  }
  
  static bool access_raz_id_reg(struct kvm_vcpu *vcpu,
@@@ -1192,72 -1210,7 +1210,7 @@@ static unsigned int sve_visibility(cons
        if (vcpu_has_sve(vcpu))
                return 0;
  
-       return REG_HIDDEN_USER | REG_HIDDEN_GUEST;
- }
- /* Visibility overrides for SVE-specific ID registers */
- static unsigned int sve_id_visibility(const struct kvm_vcpu *vcpu,
-                                     const struct sys_reg_desc *rd)
- {
-       if (vcpu_has_sve(vcpu))
-               return 0;
-       return REG_HIDDEN_USER;
- }
- /* Generate the emulated ID_AA64ZFR0_EL1 value exposed to the guest */
- static u64 guest_id_aa64zfr0_el1(const struct kvm_vcpu *vcpu)
- {
-       if (!vcpu_has_sve(vcpu))
-               return 0;
-       return read_sanitised_ftr_reg(SYS_ID_AA64ZFR0_EL1);
- }
- static bool access_id_aa64zfr0_el1(struct kvm_vcpu *vcpu,
-                                  struct sys_reg_params *p,
-                                  const struct sys_reg_desc *rd)
- {
-       if (p->is_write)
-               return write_to_read_only(vcpu, p, rd);
-       p->regval = guest_id_aa64zfr0_el1(vcpu);
-       return true;
- }
- static int get_id_aa64zfr0_el1(struct kvm_vcpu *vcpu,
-               const struct sys_reg_desc *rd,
-               const struct kvm_one_reg *reg, void __user *uaddr)
- {
-       u64 val;
-       if (WARN_ON(!vcpu_has_sve(vcpu)))
-               return -ENOENT;
-       val = guest_id_aa64zfr0_el1(vcpu);
-       return reg_to_user(uaddr, &val, reg->id);
- }
- static int set_id_aa64zfr0_el1(struct kvm_vcpu *vcpu,
-               const struct sys_reg_desc *rd,
-               const struct kvm_one_reg *reg, void __user *uaddr)
- {
-       const u64 id = sys_reg_to_index(rd);
-       int err;
-       u64 val;
-       if (WARN_ON(!vcpu_has_sve(vcpu)))
-               return -ENOENT;
-       err = reg_from_user(&val, uaddr, id);
-       if (err)
-               return err;
-       /* This is what we mean by invariant: you can't change it. */
-       if (val != guest_id_aa64zfr0_el1(vcpu))
-               return -EINVAL;
-       return 0;
+       return REG_HIDDEN;
  }
  
  /*
@@@ -1299,13 -1252,17 +1252,17 @@@ static int __set_id_reg(const struct kv
  static int get_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
                      const struct kvm_one_reg *reg, void __user *uaddr)
  {
-       return __get_id_reg(vcpu, rd, uaddr, false);
+       bool raz = sysreg_visible_as_raz(vcpu, rd);
+       return __get_id_reg(vcpu, rd, uaddr, raz);
  }
  
  static int set_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
                      const struct kvm_one_reg *reg, void __user *uaddr)
  {
-       return __set_id_reg(vcpu, rd, uaddr, false);
+       bool raz = sysreg_visible_as_raz(vcpu, rd);
+       return __set_id_reg(vcpu, rd, uaddr, raz);
  }
  
  static int get_raz_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
@@@ -1397,6 -1354,7 +1354,7 @@@ static bool access_mte_regs(struct kvm_
        .access = access_id_reg,                \
        .get_user = get_id_reg,                 \
        .set_user = set_id_reg,                 \
+       .visibility = id_visibility,            \
  }
  
  /*
@@@ -1518,7 -1476,7 +1476,7 @@@ static const struct sys_reg_desc sys_re
        ID_SANITISED(ID_AA64PFR1_EL1),
        ID_UNALLOCATED(4,2),
        ID_UNALLOCATED(4,3),
-       { SYS_DESC(SYS_ID_AA64ZFR0_EL1), access_id_aa64zfr0_el1, .get_user = get_id_aa64zfr0_el1, .set_user = set_id_aa64zfr0_el1, .visibility = sve_id_visibility },
+       ID_SANITISED(ID_AA64ZFR0_EL1),
        ID_UNALLOCATED(4,5),
        ID_UNALLOCATED(4,6),
        ID_UNALLOCATED(4,7),
@@@ -2185,7 -2143,7 +2143,7 @@@ static void perform_access(struct kvm_v
        trace_kvm_sys_access(*vcpu_pc(vcpu), params, r);
  
        /* Check for regs disabled by runtime config */
-       if (sysreg_hidden_from_guest(vcpu, r)) {
+       if (sysreg_hidden(vcpu, r)) {
                kvm_inject_undefined(vcpu);
                return;
        }
@@@ -2684,7 -2642,7 +2642,7 @@@ int kvm_arm_sys_reg_get_reg(struct kvm_
                return get_invariant_sys_reg(reg->id, uaddr);
  
        /* Check for regs disabled by runtime config */
-       if (sysreg_hidden_from_user(vcpu, r))
+       if (sysreg_hidden(vcpu, r))
                return -ENOENT;
  
        if (r->get_user)
@@@ -2709,7 -2667,7 +2667,7 @@@ int kvm_arm_sys_reg_set_reg(struct kvm_
                return set_invariant_sys_reg(reg->id, uaddr);
  
        /* Check for regs disabled by runtime config */
-       if (sysreg_hidden_from_user(vcpu, r))
+       if (sysreg_hidden(vcpu, r))
                return -ENOENT;
  
        if (r->set_user)
@@@ -2780,7 -2738,7 +2738,7 @@@ static int walk_one_sys_reg(const struc
        if (!(rd->reg || rd->get_user))
                return 0;
  
-       if (sysreg_hidden_from_user(vcpu, rd))
+       if (sysreg_hidden(vcpu, rd))
                return 0;
  
        if (!copy_reg_to_user(rd, uind))