Skip to content

Commit 319d1a9

Browse files
author
Marc Zyngier
committed
Merge branch kvm-arm64/6.6/generic-vcpu into kvmarm-master/next
* kvm-arm64/6.6/generic-vcpu: : . : Cleanup the obsolete vcpu target abstraction, courtesy of Oliver. : From the cover letter: : : "kvm_vcpu_init::target is quite useless at this point. We don't do any : uarch-specific emulation in the first place, and require userspace : select the 'generic' vCPU target on all but a few implementations. : : Small series to (1) clean up usage of the target value in the kernel and : (2) switch to the 'generic' target on implementations that previously : had their own target values. The implementation-specific values are : still tolerated, though, to avoid UAPI breakage." : . KVM: arm64: Always return generic v8 as the preferred target KVM: arm64: Replace vCPU target with a configuration flag KVM: arm64: Remove pointless check for changed init target KVM: arm64: Delete pointless switch statement in kvm_reset_vcpu() Signed-off-by: Marc Zyngier <maz@kernel.org>
2 parents 6eaae19 + 5346f7e commit 319d1a9

File tree

5 files changed

+25
-47
lines changed

5 files changed

+25
-47
lines changed

arch/arm64/include/asm/kvm_host.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -567,8 +567,7 @@ struct kvm_vcpu_arch {
567567
/* Cache some mmu pages needed inside spinlock regions */
568568
struct kvm_mmu_memory_cache mmu_page_cache;
569569

570-
/* Target CPU and feature flags */
571-
int target;
570+
/* feature flags */
572571
DECLARE_BITMAP(features, KVM_VCPU_MAX_FEATURES);
573572

574573
/* Virtual SError ESR to restore when HCR_EL2.VSE is set */
@@ -669,6 +668,8 @@ struct kvm_vcpu_arch {
669668
#define VCPU_SVE_FINALIZED __vcpu_single_flag(cflags, BIT(1))
670669
/* PTRAUTH exposed to guest */
671670
#define GUEST_HAS_PTRAUTH __vcpu_single_flag(cflags, BIT(2))
671+
/* KVM_ARM_VCPU_INIT completed */
672+
#define VCPU_INITIALIZED __vcpu_single_flag(cflags, BIT(3))
672673

673674
/* Exception pending */
674675
#define PENDING_EXCEPTION __vcpu_single_flag(iflags, BIT(0))
@@ -899,7 +900,6 @@ struct kvm_vcpu_stat {
899900
u64 exits;
900901
};
901902

902-
void kvm_vcpu_preferred_target(struct kvm_vcpu_init *init);
903903
unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu);
904904
int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices);
905905
int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);

arch/arm64/kvm/arm.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
365365
#endif
366366

367367
/* Force users to call KVM_ARM_VCPU_INIT */
368-
vcpu->arch.target = -1;
368+
vcpu_clear_flag(vcpu, VCPU_INITIALIZED);
369369
bitmap_zero(vcpu->arch.features, KVM_VCPU_MAX_FEATURES);
370370

371371
vcpu->arch.mmu_page_cache.gfp_zero = __GFP_ZERO;
@@ -574,7 +574,7 @@ unsigned long kvm_arch_vcpu_get_ip(struct kvm_vcpu *vcpu)
574574

575575
static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu)
576576
{
577-
return vcpu->arch.target >= 0;
577+
return vcpu_get_flag(vcpu, VCPU_INITIALIZED);
578578
}
579579

580580
/*
@@ -1058,7 +1058,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
10581058
* invalid. The VMM can try and fix it by issuing a
10591059
* KVM_ARM_VCPU_INIT if it really wants to.
10601060
*/
1061-
vcpu->arch.target = -1;
1061+
vcpu_clear_flag(vcpu, VCPU_INITIALIZED);
10621062
ret = ARM_EXCEPTION_IL;
10631063
}
10641064

@@ -1219,8 +1219,7 @@ static bool kvm_vcpu_init_changed(struct kvm_vcpu *vcpu,
12191219
{
12201220
unsigned long features = init->features[0];
12211221

1222-
return !bitmap_equal(vcpu->arch.features, &features, KVM_VCPU_MAX_FEATURES) ||
1223-
vcpu->arch.target != init->target;
1222+
return !bitmap_equal(vcpu->arch.features, &features, KVM_VCPU_MAX_FEATURES);
12241223
}
12251224

12261225
static int __kvm_vcpu_set_target(struct kvm_vcpu *vcpu,
@@ -1236,20 +1235,18 @@ static int __kvm_vcpu_set_target(struct kvm_vcpu *vcpu,
12361235
!bitmap_equal(kvm->arch.vcpu_features, &features, KVM_VCPU_MAX_FEATURES))
12371236
goto out_unlock;
12381237

1239-
vcpu->arch.target = init->target;
12401238
bitmap_copy(vcpu->arch.features, &features, KVM_VCPU_MAX_FEATURES);
12411239

12421240
/* Now we know what it is, we can reset it. */
12431241
ret = kvm_reset_vcpu(vcpu);
12441242
if (ret) {
1245-
vcpu->arch.target = -1;
12461243
bitmap_zero(vcpu->arch.features, KVM_VCPU_MAX_FEATURES);
12471244
goto out_unlock;
12481245
}
12491246

12501247
bitmap_copy(kvm->arch.vcpu_features, &features, KVM_VCPU_MAX_FEATURES);
12511248
set_bit(KVM_ARCH_FLAG_VCPU_FEATURES_CONFIGURED, &kvm->arch.flags);
1252-
1249+
vcpu_set_flag(vcpu, VCPU_INITIALIZED);
12531250
out_unlock:
12541251
mutex_unlock(&kvm->arch.config_lock);
12551252
return ret;
@@ -1260,14 +1257,15 @@ static int kvm_vcpu_set_target(struct kvm_vcpu *vcpu,
12601257
{
12611258
int ret;
12621259

1263-
if (init->target != kvm_target_cpu())
1260+
if (init->target != KVM_ARM_TARGET_GENERIC_V8 &&
1261+
init->target != kvm_target_cpu())
12641262
return -EINVAL;
12651263

12661264
ret = kvm_vcpu_init_check_features(vcpu, init);
12671265
if (ret)
12681266
return ret;
12691267

1270-
if (vcpu->arch.target == -1)
1268+
if (!kvm_vcpu_initialized(vcpu))
12711269
return __kvm_vcpu_set_target(vcpu, init);
12721270

12731271
if (kvm_vcpu_init_changed(vcpu, init))
@@ -1595,9 +1593,9 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
15951593
return kvm_vm_ioctl_set_device_addr(kvm, &dev_addr);
15961594
}
15971595
case KVM_ARM_PREFERRED_TARGET: {
1598-
struct kvm_vcpu_init init;
1599-
1600-
kvm_vcpu_preferred_target(&init);
1596+
struct kvm_vcpu_init init = {
1597+
.target = KVM_ARM_TARGET_GENERIC_V8,
1598+
};
16011599

16021600
if (copy_to_user(argp, &init, sizeof(init)))
16031601
return -EFAULT;

arch/arm64/kvm/guest.c

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -884,21 +884,6 @@ u32 __attribute_const__ kvm_target_cpu(void)
884884
return KVM_ARM_TARGET_GENERIC_V8;
885885
}
886886

887-
void kvm_vcpu_preferred_target(struct kvm_vcpu_init *init)
888-
{
889-
u32 target = kvm_target_cpu();
890-
891-
memset(init, 0, sizeof(*init));
892-
893-
/*
894-
* For now, we don't return any features.
895-
* In future, we might use features to return target
896-
* specific features available for the preferred
897-
* target type.
898-
*/
899-
init->target = (__u32)target;
900-
}
901-
902887
int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
903888
{
904889
return -EINVAL;

arch/arm64/kvm/hyp/nvhe/switch.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ static void early_exit_filter(struct kvm_vcpu *vcpu, u64 *exit_code)
236236
* KVM_ARM_VCPU_INIT, however, this is likely not possible for
237237
* protected VMs.
238238
*/
239-
vcpu->arch.target = -1;
239+
vcpu_clear_flag(vcpu, VCPU_INITIALIZED);
240240
*exit_code &= BIT(ARM_EXIT_WITH_SERROR_BIT);
241241
*exit_code |= ARM_EXCEPTION_IL;
242242
}

arch/arm64/kvm/reset.c

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -248,21 +248,16 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu)
248248
}
249249
}
250250

251-
switch (vcpu->arch.target) {
252-
default:
253-
if (vcpu_el1_is_32bit(vcpu)) {
254-
pstate = VCPU_RESET_PSTATE_SVC;
255-
} else if (vcpu_has_nv(vcpu)) {
256-
pstate = VCPU_RESET_PSTATE_EL2;
257-
} else {
258-
pstate = VCPU_RESET_PSTATE_EL1;
259-
}
260-
261-
if (kvm_vcpu_has_pmu(vcpu) && !kvm_arm_support_pmu_v3()) {
262-
ret = -EINVAL;
263-
goto out;
264-
}
265-
break;
251+
if (vcpu_el1_is_32bit(vcpu))
252+
pstate = VCPU_RESET_PSTATE_SVC;
253+
else if (vcpu_has_nv(vcpu))
254+
pstate = VCPU_RESET_PSTATE_EL2;
255+
else
256+
pstate = VCPU_RESET_PSTATE_EL1;
257+
258+
if (kvm_vcpu_has_pmu(vcpu) && !kvm_arm_support_pmu_v3()) {
259+
ret = -EINVAL;
260+
goto out;
266261
}
267262

268263
/* Reset core registers */

0 commit comments

Comments
 (0)