[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-arm] [PATCH 10/13] target/arm/monitor: kvm: only return valid sve
From: |
Andrew Jones |
Subject: |
[Qemu-arm] [PATCH 10/13] target/arm/monitor: kvm: only return valid sve vector sets |
Date: |
Sun, 12 May 2019 10:36:21 +0200 |
While the TCG SVE implementation can implement all vector lengths
which are a quadword multiple, up to some maximum length, KVM can
only provide what the host supports, and not all multiples are
required to be supported by the architecture. With this patch
we extend the QMP query to ask KVM for the valid vectors when KVM
is enabled.
Signed-off-by: Andrew Jones <address@hidden>
---
target/arm/monitor.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/target/arm/monitor.c b/target/arm/monitor.c
index 8b2afa255c92..3e13dd7c7b7a 100644
--- a/target/arm/monitor.c
+++ b/target/arm/monitor.c
@@ -84,6 +84,41 @@ GICCapabilityList *qmp_query_gic_capabilities(Error **errp)
return head;
}
+#ifdef CONFIG_KVM
+static SVEVectorLengths *qmp_kvm_sve_vls_get(void)
+{
+ CPUArchState *env = mon_get_cpu_env();
+ ARMCPU *cpu = arm_env_get_cpu(env);
+ uint64_t sve_vls[KVM_ARM64_SVE_VLS_WORDS];
+ SVEVectorLengths *vls = g_new(SVEVectorLengths, 1);
+ intList **v = &vls->vls;
+ int ret, i;
+
+ ret = kvm_arm_get_sve_vls(CPU(cpu), sve_vls);
+ if (ret <= 0) {
+ *v = g_new0(intList, 1); /* one vl of 0 means none supported */
+ return vls;
+ }
+
+ for (i = KVM_ARM64_SVE_VQ_MIN; i <= ret; ++i) {
+ int bitval = (sve_vls[(i - KVM_ARM64_SVE_VQ_MIN) / 64] >>
+ ((i - KVM_ARM64_SVE_VQ_MIN) % 64)) & 1;
+ if (bitval) {
+ *v = g_new0(intList, 1);
+ (*v)->value = i;
+ v = &(*v)->next;
+ }
+ }
+
+ return vls;
+}
+#else
+static SVEVectorLengths *qmp_kvm_sve_vls_get(void)
+{
+ return NULL;
+}
+#endif
+
static SVEVectorLengths *qmp_sve_vls_get(void)
{
CPUArchState *env = mon_get_cpu_env();
@@ -130,7 +165,13 @@ static SVEVectorLengths
*qmp_sve_vls_dup_and_truncate(SVEVectorLengths *vls)
SVEVectorLengthsList *qmp_query_sve_vector_lengths(Error **errp)
{
SVEVectorLengthsList *vls_list = g_new0(SVEVectorLengthsList, 1);
- SVEVectorLengths *vls = qmp_sve_vls_get();
+ SVEVectorLengths *vls;
+
+ if (kvm_enabled()) {
+ vls = qmp_kvm_sve_vls_get();
+ } else {
+ vls = qmp_sve_vls_get();
+ }
while (vls) {
vls_list->value = vls;
--
2.20.1
- [Qemu-arm] [PATCH 00/13] target/arm/kvm: enable SVE in guests, Andrew Jones, 2019/05/12
- [Qemu-arm] [PATCH 01/13] target/arm/kvm64: fix error returns, Andrew Jones, 2019/05/12
- [Qemu-arm] [PATCH 10/13] target/arm/monitor: kvm: only return valid sve vector sets,
Andrew Jones <=
- [Qemu-arm] [PATCH 02/13] update-linux-headers: Add sve_context.h to asm-arm64, Andrew Jones, 2019/05/12
- [Qemu-arm] [PATCH 09/13] target/arm/kvm: Export kvm_arm_get_sve_vls, Andrew Jones, 2019/05/12
- [Qemu-arm] [PATCH 13/13] target/arm/kvm: host cpu: Add support for sve-vls-map, Andrew Jones, 2019/05/12
- [Qemu-arm] [PATCH 07/13] target/arm/kvm: max cpu: Allow sve max vector length setting, Andrew Jones, 2019/05/12
- [Qemu-arm] [PATCH 04/13] target/arm/kvm: Move the get/put of fpsimd registers out, Andrew Jones, 2019/05/12
- [Qemu-arm] [PATCH 06/13] target/arm/kvm: max cpu: Enable SVE when available, Andrew Jones, 2019/05/12