Message ID | 20190512083624.8916-14-drjones@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/arm/kvm: enable SVE in guests | expand |
Andrew Jones <drjones@redhat.com> writes: > Allow the host cpu type to enable SVE in guests with the sve-vls-map > cpu property. > > Signed-off-by: Andrew Jones <drjones@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) { } qemu/target/arm/cpu.h:985:6: error: no previous prototype for ‘aarch64_add_sve_vls_map_property’ [-Werror=missing-prototypes] void aarch64_add_sve_vls_map_property(Object *obj) { } ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Did you forget static inline? > #endif > > target_ulong do_arm_semihosting(CPUARMState *env); [...]
On Mon, May 13, 2019 at 05:37:09PM +0200, Markus Armbruster wrote: > Andrew Jones <drjones@redhat.com> writes: > > > Allow the host cpu type to enable SVE in guests with the sve-vls-map > > cpu property. > > > > Signed-off-by: Andrew Jones <drjones@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) { } > > qemu/target/arm/cpu.h:985:6: error: no previous prototype for ‘aarch64_add_sve_vls_map_property’ [-Werror=missing-prototypes] > void aarch64_add_sve_vls_map_property(Object *obj) { } > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > Did you forget static inline? I sure did. Thanks for finding this! drew > > > #endif > > > > target_ulong do_arm_semihosting(CPUARMState *env); > [...]
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 {
Allow the host cpu type to enable SVE in guests with the sve-vls-map cpu property. Signed-off-by: Andrew Jones <drjones@redhat.com> --- target/arm/cpu.c | 1 + target/arm/cpu.h | 2 ++ target/arm/cpu64.c | 12 +++++++++--- 3 files changed, 12 insertions(+), 3 deletions(-)