This patch adds an --sve command line option to allow the Scalable
Vector Extension to be enabled when creating a guest.

This requires use of the new KVM_ARM_VCPU_FINALIZE ioctl before the
vcpu is runnable, so a new hook kvm_cpu__configure_features() is
added to provide an appropiate place to do this work.

The kernel does not enable SVE by default, and for now kvmtool
adopts the same policy: without --sve, SVE is not enabled for the
guest even if the host supports it.

Signed-off-by: Dave Martin <dave.mar...@arm.com>
---
 arm/aarch32/include/kvm/kvm-cpu-arch.h    |  5 +++++
 arm/aarch64/include/kvm/kvm-config-arch.h |  4 +++-
 arm/aarch64/include/kvm/kvm-cpu-arch.h    |  7 ++++++-
 arm/aarch64/kvm-cpu.c                     | 19 +++++++++++++++++++
 arm/include/arm-common/kvm-config-arch.h  |  1 +
 arm/kvm-cpu.c                             |  3 +++
 6 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/arm/aarch32/include/kvm/kvm-cpu-arch.h 
b/arm/aarch32/include/kvm/kvm-cpu-arch.h
index d28ea67..04740d4 100644
--- a/arm/aarch32/include/kvm/kvm-cpu-arch.h
+++ b/arm/aarch32/include/kvm/kvm-cpu-arch.h
@@ -13,4 +13,9 @@
 #define ARM_CPU_ID             0, 0, 0
 #define ARM_CPU_ID_MPIDR       5
 
+static inline int kvm_cpu__configure_features(struct kvm_cpu *vcpu)
+{
+       return 0;
+}
+
 #endif /* KVM__KVM_CPU_ARCH_H */
diff --git a/arm/aarch64/include/kvm/kvm-config-arch.h 
b/arm/aarch64/include/kvm/kvm-config-arch.h
index 04be43d..50b7aae 100644
--- a/arm/aarch64/include/kvm/kvm-config-arch.h
+++ b/arm/aarch64/include/kvm/kvm-config-arch.h
@@ -8,7 +8,9 @@
                        "Create PMUv3 device"),                         \
        OPT_U64('\0', "kaslr-seed", &(cfg)->kaslr_seed,                 \
                        "Specify random seed for Kernel Address Space " \
-                       "Layout Randomization (KASLR)"),
+                       "Layout Randomization (KASLR)"),                \
+       OPT_BOOLEAN('\0', "sve", &(cfg)->has_sve,                       \
+                       "Enable SVE for the guest"),
 
 #include "arm-common/kvm-config-arch.h"
 
diff --git a/arm/aarch64/include/kvm/kvm-cpu-arch.h 
b/arm/aarch64/include/kvm/kvm-cpu-arch.h
index a9d8563..7f2bfb9 100644
--- a/arm/aarch64/include/kvm/kvm-cpu-arch.h
+++ b/arm/aarch64/include/kvm/kvm-cpu-arch.h
@@ -8,13 +8,18 @@
 #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))            
\
+              (!!(kvm)->cfg.arch.has_pmuv3 << KVM_ARM_VCPU_PMU_V3) |           
\
+              (!!(kvm)->cfg.arch.has_sve << KVM_ARM_VCPU_SVE))                 
\
 }
 
+
+
 #define ARM_MPIDR_HWID_BITMASK 0xFF00FFFFFFUL
 #define ARM_CPU_ID             3, 0, 0, 0
 #define ARM_CPU_ID_MPIDR       5
 #define ARM_CPU_CTRL           3, 0, 1, 0
 #define ARM_CPU_CTRL_SCTLR_EL1 0
 
+int kvm_cpu__configure_features(struct kvm_cpu *vcpu);
+
 #endif /* KVM__KVM_CPU_ARCH_H */
diff --git a/arm/aarch64/kvm-cpu.c b/arm/aarch64/kvm-cpu.c
index 0aaefaf..43eb69e 100644
--- a/arm/aarch64/kvm-cpu.c
+++ b/arm/aarch64/kvm-cpu.c
@@ -128,6 +128,25 @@ static void reset_vcpu_aarch64(struct kvm_cpu *vcpu)
        }
 }
 
+static int configure_sve(struct kvm_cpu *vcpu)
+{
+       int feature = KVM_ARM_VCPU_SVE;
+
+       if (ioctl(vcpu->vcpu_fd, KVM_ARM_VCPU_FINALIZE, &feature))
+               return -1;
+
+       return 0;
+}
+
+int kvm_cpu__configure_features(struct kvm_cpu *vcpu)
+{
+       if (vcpu->kvm->cfg.arch.has_sve)
+               if (configure_sve(vcpu))
+                       return -1;
+
+       return 0;
+}
+
 void kvm_cpu__reset_vcpu(struct kvm_cpu *vcpu)
 {
        if (vcpu->kvm->cfg.arch.aarch32_guest)
diff --git a/arm/include/arm-common/kvm-config-arch.h 
b/arm/include/arm-common/kvm-config-arch.h
index 5734c46..bdab680 100644
--- a/arm/include/arm-common/kvm-config-arch.h
+++ b/arm/include/arm-common/kvm-config-arch.h
@@ -12,6 +12,7 @@ struct kvm_config_arch {
        u64             kaslr_seed;
        enum irqchip_type irqchip;
        u64             fw_addr;
+       bool            has_sve;
 };
 
 int irqchip_parser(const struct option *opt, const char *arg, int unset);
diff --git a/arm/kvm-cpu.c b/arm/kvm-cpu.c
index 7780251..91d5241 100644
--- a/arm/kvm-cpu.c
+++ b/arm/kvm-cpu.c
@@ -122,6 +122,9 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, 
unsigned long cpu_id)
        vcpu->cpu_compatible    = target->compatible;
        vcpu->is_running        = true;
 
+       if (kvm_cpu__configure_features(vcpu))
+               die("Unable to configure requested vcpu features");
+
        return vcpu;
 }
 
-- 
2.1.4

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to