target/arm/kvm: Let kvm_arm_vgic_probe() return a bitmap

Convert kvm_arm_vgic_probe() so that it returns a
bitmap of supported in-kernel emulation VGIC versions instead
of the max version: at the moment values can be v2 and v3.
This allows to expose the case where the host GICv3 also
supports GICv2 emulation. This will be useful to choose the
default version in KVM accelerated mode.

Signed-off-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20200311131618.7187-5-eric.auger@redhat.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Eric Auger 2020-03-11 14:16:16 +01:00 committed by Peter Maydell
parent 36bf4ec8c8
commit d45efe4782
3 changed files with 20 additions and 8 deletions

View File

@ -1554,11 +1554,18 @@ static void finalize_gic_version(VirtMachineState *vms)
vms->gic_version = VIRT_GIC_VERSION_3;
}
} else {
vms->gic_version = kvm_arm_vgic_probe();
if (!vms->gic_version) {
int probe_bitmap = kvm_arm_vgic_probe();
if (!probe_bitmap) {
error_report(
"Unable to determine GIC version supported by host");
exit(1);
} else {
if (probe_bitmap & KVM_ARM_VGIC_V3) {
vms->gic_version = VIRT_GIC_VERSION_3;
} else {
vms->gic_version = VIRT_GIC_VERSION_2;
}
}
}
} else if (vms->gic_version == VIRT_GIC_VERSION_NOSEL) {

View File

@ -874,15 +874,17 @@ int kvm_arch_irqchip_create(KVMState *s)
int kvm_arm_vgic_probe(void)
{
int val = 0;
if (kvm_create_device(kvm_state,
KVM_DEV_TYPE_ARM_VGIC_V3, true) == 0) {
return 3;
} else if (kvm_create_device(kvm_state,
KVM_DEV_TYPE_ARM_VGIC_V2, true) == 0) {
return 2;
} else {
return 0;
val |= KVM_ARM_VGIC_V3;
}
if (kvm_create_device(kvm_state,
KVM_DEV_TYPE_ARM_VGIC_V2, true) == 0) {
val |= KVM_ARM_VGIC_V2;
}
return val;
}
int kvm_arm_set_irq(int cpu, int irqtype, int irq, int level)

View File

@ -15,6 +15,9 @@
#include "exec/memory.h"
#include "qemu/error-report.h"
#define KVM_ARM_VGIC_V2 (1 << 0)
#define KVM_ARM_VGIC_V3 (1 << 1)
/**
* kvm_arm_vcpu_init:
* @cs: CPUState