target/arm/cpu64: Validate sve vector lengths are supported
Future CPU types may specify which vector lengths are supported. We can apply nearly the same logic to validate those lengths as we do for KVM's supported vector lengths. We merge the code where we can, but unfortunately can't completely merge it because KVM requires all vector lengths, power-of-two or not, smaller than the maximum enabled length to also be enabled. The architecture only requires all the power-of-two lengths, though, so TCG will only enforce that. Signed-off-by: Andrew Jones <drjones@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210823160647.34028-5-drjones@redhat.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
5b65e5abea
commit
022707e5d6
|
@ -329,6 +329,15 @@ void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
/* Disabling a power-of-two disables all larger lengths. */
|
||||||
|
for (vq = 1; vq <= ARM_MAX_VQ; vq <<= 1) {
|
||||||
|
if (test_bit(vq - 1, cpu->sve_vq_init)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
max_vq = vq <= ARM_MAX_VQ ? vq - 1 : ARM_MAX_VQ;
|
max_vq = vq <= ARM_MAX_VQ ? vq - 1 : ARM_MAX_VQ;
|
||||||
bitmap_andnot(cpu->sve_vq_map, cpu->sve_vq_supported,
|
bitmap_andnot(cpu->sve_vq_map, cpu->sve_vq_supported,
|
||||||
cpu->sve_vq_init, max_vq);
|
cpu->sve_vq_init, max_vq);
|
||||||
|
@ -341,24 +350,6 @@ void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
|
||||||
"vector length must be enabled.\n");
|
"vector length must be enabled.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
/* Disabling a power-of-two disables all larger lengths. */
|
|
||||||
if (test_bit(0, cpu->sve_vq_init)) {
|
|
||||||
error_setg(errp, "cannot disable sve128");
|
|
||||||
error_append_hint(errp, "Disabling sve128 results in all "
|
|
||||||
"vector lengths being disabled.\n");
|
|
||||||
error_append_hint(errp, "With SVE enabled, at least one "
|
|
||||||
"vector length must be enabled.\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (vq = 2; vq <= ARM_MAX_VQ; vq <<= 1) {
|
|
||||||
if (test_bit(vq - 1, cpu->sve_vq_init)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
max_vq = vq <= ARM_MAX_VQ ? vq - 1 : ARM_MAX_VQ;
|
|
||||||
bitmap_complement(cpu->sve_vq_map, cpu->sve_vq_init, max_vq);
|
|
||||||
}
|
|
||||||
|
|
||||||
max_vq = find_last_bit(cpu->sve_vq_map, max_vq) + 1;
|
max_vq = find_last_bit(cpu->sve_vq_map, max_vq) + 1;
|
||||||
}
|
}
|
||||||
|
@ -393,49 +384,47 @@ void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
|
||||||
assert(max_vq != 0);
|
assert(max_vq != 0);
|
||||||
bitmap_clear(cpu->sve_vq_map, max_vq, ARM_MAX_VQ - max_vq);
|
bitmap_clear(cpu->sve_vq_map, max_vq, ARM_MAX_VQ - max_vq);
|
||||||
|
|
||||||
if (kvm_enabled()) {
|
/* Ensure the set of lengths matches what is supported. */
|
||||||
/* Ensure the set of lengths matches what KVM supports. */
|
|
||||||
bitmap_xor(tmp, cpu->sve_vq_map, cpu->sve_vq_supported, max_vq);
|
bitmap_xor(tmp, cpu->sve_vq_map, cpu->sve_vq_supported, max_vq);
|
||||||
if (!bitmap_empty(tmp, max_vq)) {
|
if (!bitmap_empty(tmp, max_vq)) {
|
||||||
vq = find_last_bit(tmp, max_vq) + 1;
|
vq = find_last_bit(tmp, max_vq) + 1;
|
||||||
if (test_bit(vq - 1, cpu->sve_vq_map)) {
|
if (test_bit(vq - 1, cpu->sve_vq_map)) {
|
||||||
if (cpu->sve_max_vq) {
|
if (cpu->sve_max_vq) {
|
||||||
error_setg(errp, "cannot set sve-max-vq=%d",
|
error_setg(errp, "cannot set sve-max-vq=%d", cpu->sve_max_vq);
|
||||||
cpu->sve_max_vq);
|
error_append_hint(errp, "This CPU does not support "
|
||||||
error_append_hint(errp, "This KVM host does not support "
|
"the vector length %d-bits.\n", vq * 128);
|
||||||
"the vector length %d-bits.\n",
|
|
||||||
vq * 128);
|
|
||||||
error_append_hint(errp, "It may not be possible to use "
|
error_append_hint(errp, "It may not be possible to use "
|
||||||
"sve-max-vq with this KVM host. Try "
|
"sve-max-vq with this CPU. Try "
|
||||||
"using only sve<N> properties.\n");
|
"using only sve<N> properties.\n");
|
||||||
} else {
|
} else {
|
||||||
error_setg(errp, "cannot enable sve%d", vq * 128);
|
error_setg(errp, "cannot enable sve%d", vq * 128);
|
||||||
error_append_hint(errp, "This KVM host does not support "
|
error_append_hint(errp, "This CPU does not support "
|
||||||
"the vector length %d-bits.\n",
|
"the vector length %d-bits.\n", vq * 128);
|
||||||
vq * 128);
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
if (kvm_enabled()) {
|
||||||
error_setg(errp, "cannot disable sve%d", vq * 128);
|
error_setg(errp, "cannot disable sve%d", vq * 128);
|
||||||
error_append_hint(errp, "The KVM host requires all "
|
error_append_hint(errp, "The KVM host requires all "
|
||||||
"supported vector lengths smaller "
|
"supported vector lengths smaller "
|
||||||
"than %d bits to also be enabled.\n",
|
"than %d bits to also be enabled.\n",
|
||||||
max_vq * 128);
|
max_vq * 128);
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/* Ensure all required powers-of-two are enabled. */
|
/* Ensure all required powers-of-two are enabled. */
|
||||||
for (vq = pow2floor(max_vq); vq >= 1; vq >>= 1) {
|
for (vq = pow2floor(max_vq); vq >= 1; vq >>= 1) {
|
||||||
if (!test_bit(vq - 1, cpu->sve_vq_map)) {
|
if (!test_bit(vq - 1, cpu->sve_vq_map)) {
|
||||||
error_setg(errp, "cannot disable sve%d", vq * 128);
|
error_setg(errp, "cannot disable sve%d", vq * 128);
|
||||||
error_append_hint(errp, "sve%d is required as it "
|
error_append_hint(errp, "sve%d is required as it "
|
||||||
"is a power-of-two length smaller than "
|
"is a power-of-two length smaller "
|
||||||
"the maximum, sve%d\n",
|
"than the maximum, sve%d\n",
|
||||||
vq * 128, max_vq * 128);
|
vq * 128, max_vq * 128);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now that we validated all our vector lengths, the only question
|
* Now that we validated all our vector lengths, the only question
|
||||||
|
|
Loading…
Reference in a new issue