@@ -6,9 +6,7 @@
#include "arm-common/kvm-cpu-arch.h"
#define ARM_VCPU_FEATURE_FLAGS(kvm, cpuid) { \
- [0] = ((!!(cpuid) << KVM_ARM_VCPU_POWER_OFF) | \
- (!!(kvm)->cfg.arch.aarch32_guest << KVM_ARM_VCPU_EL1_32BIT) | \
- (!!(kvm)->cfg.arch.has_pmuv3 << KVM_ARM_VCPU_PMU_V3)) \
+ [0] = (!!(cpuid) << KVM_ARM_VCPU_POWER_OFF), \
}
#define ARM_MPIDR_HWID_BITMASK 0xFF00FFFFFFUL
@@ -130,6 +130,18 @@ static void reset_vcpu_aarch64(struct kvm_cpu *vcpu)
void kvm_cpu__select_features(struct kvm *kvm, struct kvm_vcpu_init *init)
{
+ if (kvm->cfg.arch.aarch32_guest) {
+ if (!kvm__supports_extension(kvm, KVM_CAP_ARM_EL1_32BIT))
+ die("32bit guests are not supported\n");
+ init->features[0] |= 1UL << KVM_ARM_VCPU_EL1_32BIT;
+ }
+
+ if (kvm->cfg.arch.has_pmuv3) {
+ if (!kvm__supports_extension(kvm, KVM_CAP_ARM_PMU_V3))
+ die("PMUv3 is not supported");
+ init->features[0] |= 1UL << KVM_ARM_VCPU_PMU_V3;
+ }
+
/* Enable pointer authentication if available */
if (kvm__supports_extension(kvm, KVM_CAP_ARM_PTRAUTH_ADDRESS) &&
kvm__supports_extension(kvm, KVM_CAP_ARM_PTRAUTH_GENERIC)) {
@@ -46,14 +46,6 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id)
.features = ARM_VCPU_FEATURE_FLAGS(kvm, cpu_id)
};
- if (kvm->cfg.arch.aarch32_guest &&
- !kvm__supports_extension(kvm, KVM_CAP_ARM_EL1_32BIT))
- die("32bit guests are not supported\n");
-
- if (kvm->cfg.arch.has_pmuv3 &&
- !kvm__supports_extension(kvm, KVM_CAP_ARM_PMU_V3))
- die("PMUv3 is not supported");
-
vcpu = calloc(1, sizeof(struct kvm_cpu));
if (!vcpu)
return NULL;
KVM_CAP_ARM_EL1_32BIT and KVM_CAP_ARM_PMU_V3 are arm64 specific features. They are set based on arm64 specific command line options and they target arm64 hardware features. It makes little sense for kvmtool to set the features in the code that is shared between arm and arm64. Move the logic to set the feature bits to the arch specific function kvm_cpu__select_features(), which is already used by arm64 to set other arm64 specific features. Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com> --- arm/aarch64/include/kvm/kvm-cpu-arch.h | 4 +--- arm/aarch64/kvm-cpu.c | 12 ++++++++++++ arm/kvm-cpu.c | 8 -------- 3 files changed, 13 insertions(+), 11 deletions(-)