Allow the host cpu type to enable SVE in guests with the sve-vls-map cpu property.
Signed-off-by: Andrew Jones <drjo...@redhat.com> --- target/arm/cpu.c | 1 + target/arm/cpu.h | 2 ++ target/arm/cpu64.c | 12 +++++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/target/arm/cpu.c b/target/arm/cpu.c index ea0e24bba8b6..a5c01ff42c78 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c @@ -2222,6 +2222,7 @@ static void arm_host_initfn(Object *obj) ARMCPU *cpu = ARM_CPU(obj); kvm_arm_set_cpu_features_from_host(cpu); + aarch64_add_sve_vls_map_property(obj); arm_cpu_post_init(obj); } diff --git a/target/arm/cpu.h b/target/arm/cpu.h index f0d0ce759ba8..13731ccb39f3 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -976,11 +976,13 @@ int aarch64_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq); void aarch64_sve_change_el(CPUARMState *env, int old_el, int new_el, bool el0_a64); +void aarch64_add_sve_vls_map_property(Object *obj); #else static inline void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq) { } static inline void aarch64_sve_change_el(CPUARMState *env, int o, int n, bool a) { } +void aarch64_add_sve_vls_map_property(Object *obj) { } #endif target_ulong do_arm_semihosting(CPUARMState *env); diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c index 94f3dd5b51e5..3b0b900a4d97 100644 --- a/target/arm/cpu64.c +++ b/target/arm/cpu64.c @@ -310,7 +310,8 @@ static void cpu_set_sve_vls_map(Object *obj, Visitor *v, const char *name, error_setg(&err, "SVE vector length map has unsupported lengths"); error_append_hint(&err, "Valid vector lengths in range [1-%d]\n", ARM_MAX_VQ); - } else if (cpu->sve_max_vq != ARM_MAX_VQ && cpu->sve_max_vq != -1 && + } else if (cpu->sve_max_vq && cpu->sve_max_vq != ARM_MAX_VQ && + cpu->sve_max_vq != -1 && cpu->sve_max_vq != arm_cpu_fls64(cpu->sve_vls_map)) { /* * If the user provides both sve-max-vq and sve-vls-map, with @@ -340,6 +341,12 @@ static void cpu_set_sve_vls_map(Object *obj, Visitor *v, const char *name, error_propagate(errp, err); } +void aarch64_add_sve_vls_map_property(Object *obj) +{ + object_property_add(obj, "sve-vls-map", "uint64", cpu_get_sve_vls_map, + cpu_set_sve_vls_map, NULL, NULL, &error_fatal); +} + /* -cpu max: if KVM is enabled, like -cpu host (best possible with this host); * otherwise, a CPU with as many features enabled as our emulation supports. * The version of '-cpu max' for qemu-system-arm is defined in cpu.c; @@ -437,8 +444,7 @@ static void aarch64_max_initfn(Object *obj) object_property_add(obj, "sve-max-vq", "uint32", cpu_max_get_sve_vq, cpu_max_set_sve_vq, NULL, NULL, &error_fatal); - object_property_add(obj, "sve-vls-map", "uint64", cpu_get_sve_vls_map, - cpu_set_sve_vls_map, NULL, NULL, &error_fatal); + aarch64_add_sve_vls_map_property(obj); } struct ARMCPUInfo { -- 2.20.1