Merge tag 'kvmarm-6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm...
[platform/kernel/linux-rpi.git] / arch / arm64 / kvm / guest.c
index 26a2ebc..20280a5 100644 (file)
@@ -590,11 +590,16 @@ static unsigned long num_core_regs(const struct kvm_vcpu *vcpu)
        return copy_core_reg_indices(vcpu, NULL);
 }
 
-/**
- * ARM64 versions of the TIMER registers, always available on arm64
- */
+static const u64 timer_reg_list[] = {
+       KVM_REG_ARM_TIMER_CTL,
+       KVM_REG_ARM_TIMER_CNT,
+       KVM_REG_ARM_TIMER_CVAL,
+       KVM_REG_ARM_PTIMER_CTL,
+       KVM_REG_ARM_PTIMER_CNT,
+       KVM_REG_ARM_PTIMER_CVAL,
+};
 
-#define NUM_TIMER_REGS 3
+#define NUM_TIMER_REGS ARRAY_SIZE(timer_reg_list)
 
 static bool is_timer_reg(u64 index)
 {
@@ -602,6 +607,9 @@ static bool is_timer_reg(u64 index)
        case KVM_REG_ARM_TIMER_CTL:
        case KVM_REG_ARM_TIMER_CNT:
        case KVM_REG_ARM_TIMER_CVAL:
+       case KVM_REG_ARM_PTIMER_CTL:
+       case KVM_REG_ARM_PTIMER_CNT:
+       case KVM_REG_ARM_PTIMER_CVAL:
                return true;
        }
        return false;
@@ -609,14 +617,11 @@ static bool is_timer_reg(u64 index)
 
 static int copy_timer_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
 {
-       if (put_user(KVM_REG_ARM_TIMER_CTL, uindices))
-               return -EFAULT;
-       uindices++;
-       if (put_user(KVM_REG_ARM_TIMER_CNT, uindices))
-               return -EFAULT;
-       uindices++;
-       if (put_user(KVM_REG_ARM_TIMER_CVAL, uindices))
-               return -EFAULT;
+       for (int i = 0; i < NUM_TIMER_REGS; i++) {
+               if (put_user(timer_reg_list[i], uindices))
+                       return -EFAULT;
+               uindices++;
+       }
 
        return 0;
 }
@@ -957,7 +962,9 @@ int kvm_arm_vcpu_arch_set_attr(struct kvm_vcpu *vcpu,
 
        switch (attr->group) {
        case KVM_ARM_VCPU_PMU_V3_CTRL:
+               mutex_lock(&vcpu->kvm->arch.config_lock);
                ret = kvm_arm_pmu_v3_set_attr(vcpu, attr);
+               mutex_unlock(&vcpu->kvm->arch.config_lock);
                break;
        case KVM_ARM_VCPU_TIMER_CTRL:
                ret = kvm_arm_timer_set_attr(vcpu, attr);