@samitouri / QOSamiQemu / commits / d25293068b

target/arm: Move kvm test out of cpu_arm_set_sve

Introduce a set of stub property callbacks for when we really don't want to be able to enable SVE. Register the real or stub funtions in aarch64_add_sve_properties depending on whether or not SVE is available. Adjust aarch64_a64fx_initfn to initialize the set of supported vector sizes before calling aarch64_add_sve_properties. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260216034432.23912-6-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Feb 26, 2026 at 11:27 UTC d25293068b039c44e37d8a6892c6ca4344776866
2 files changed +42 -8
target/arm/cpu64.c
+41 -7
@@ -300,6 +300,30 @@ static void cpu_arm_set_vq(Object *obj, Visitor *v, const char *name,
300 vq_map->init |= 1 << (vq - 1);
301 }
302
303 +static void prop_bool_get_false(Object *obj, Visitor *v, const char *name,
304 + void *opaque, Error **errp)
305 +{
306 + bool value = false;
307 + visit_type_bool(v, name, &value, errp);
308 +}
309 +
310 +static void prop_bool_set_false(Object *obj, Visitor *v, const char *name,
311 + void *opaque, Error **errp)
312 +{
313 + bool value;
314 +
315 + if (visit_type_bool(v, name, &value, errp) && value) {
316 + error_setg(errp, "'%s' feature not supported by %s on this host",
317 + name, current_accel_name());
318 + }
319 +}
320 +
321 +static void prop_add_stub_bool(Object *obj, const char *name)
322 +{
323 + object_property_add(obj, name, "bool", prop_bool_get_false,
324 + prop_bool_set_false, NULL, NULL);
325 +}
326 +
327 static bool cpu_arm_get_sve(Object *obj, Error **errp)
328 {
329 ARMCPU *cpu = ARM_CPU(obj);
@@ -309,12 +333,6 @@ static bool cpu_arm_get_sve(Object *obj, Error **errp)
333 static void cpu_arm_set_sve(Object *obj, bool value, Error **errp)
334 {
335 ARMCPU *cpu = ARM_CPU(obj);
312 -
313 - if (value && kvm_enabled() && !kvm_arm_sve_supported()) {
314 - error_setg(errp, "'sve' feature not supported by KVM on this host");
315 - return;
316 - }
317 -
336 FIELD_DP64_IDREG(&cpu->isar, ID_AA64PFR0, SVE, value);
337 }
338
@@ -471,7 +489,23 @@ void aarch64_add_sve_properties(Object *obj)
489 ARMCPU *cpu = ARM_CPU(obj);
490 uint32_t vq;
491
474 - object_property_add_bool(obj, "sve", cpu_arm_get_sve, cpu_arm_set_sve);
492 + /*
493 + * For hw virtualization, we have already probed the set of vector
494 + * lengths supported. If there are none, the host doesn't support
495 + * SVE at all. In which case we register a stub property, to allow
496 + * -cpu max,sve=off
497 + * to always be valid.
498 + *
499 + * For TCG, this function is only called for cpu models which
500 + * support SVE. The error message in the stub is written
501 + * assuming host virtualiation is being used.
502 + */
503 + if (cpu->sve_vq.supported) {
504 + object_property_add_bool(obj, "sve", cpu_arm_get_sve, cpu_arm_set_sve);
505 + } else {
506 + assert(!tcg_enabled());
507 + prop_add_stub_bool(obj, "sve");
508 + }
509
510 for (vq = 1; vq <= ARM_MAX_VQ; ++vq) {
511 char name[8];
target/arm/tcg/cpu64.c
+1 -1
@@ -524,10 +524,10 @@ static void aarch64_a64fx_initfn(Object *obj)
524 cpu->gic_pribits = 5;
525
526 /* The A64FX supports only 128, 256 and 512 bit vector lengths */
527 - aarch64_add_sve_properties(obj);
527 cpu->sve_vq.supported = (1 << 0) /* 128bit */
528 | (1 << 1) /* 256bit */
529 | (1 << 3); /* 512bit */
530 + aarch64_add_sve_properties(obj);
531
532 cpu->isar.reset_pmcr_el0 = 0x46014040;
533