From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58225) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1abOWM-00022A-HA for qemu-devel@nongnu.org; Thu, 03 Mar 2016 03:22:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1abOWL-0001qC-NO for qemu-devel@nongnu.org; Thu, 03 Mar 2016 03:22:06 -0500 From: Peter Xu Date: Thu, 3 Mar 2016 16:21:12 +0800 Message-Id: <1456993272-32292-4-git-send-email-peterx@redhat.com> In-Reply-To: <1456993272-32292-1-git-send-email-peterx@redhat.com> References: <1456993272-32292-1-git-send-email-peterx@redhat.com> Subject: [Qemu-devel] [PATCH v2 3/3] arm: implement query-gic-capability List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: wei@redhat.com, peter.maydell@linaro.org, drjones@redhat.com, mdroth@linux.vnet.ibm.com, armbru@redhat.com, Peter Xu , abologna@redhat.com, qemu-arm@nongnu.org For emulated ARM VM, only gicv2 is supported. We need to add gicv3 in when emulated gicv3 ready. For KVM accelerated ARM VM, we detect the capability bits using ioctls. if we want to know GIC kernel capabilities, we need to make sure we have enabled KVM when querying (like, with "-enable-kvm"). Signed-off-by: Peter Xu --- target-arm/machine.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/target-arm/machine.c b/target-arm/machine.c index b3fa64c..98a4094 100644 --- a/target-arm/machine.c +++ b/target-arm/machine.c @@ -1,3 +1,4 @@ +#include #include "qemu/osdep.h" #include "hw/hw.h" #include "hw/boards.h" @@ -346,9 +347,54 @@ const char *gicv3_class_name(void) exit(1); } +static GICCapability *gic_cap_new(int version) +{ + GICCapability *cap = g_new0(GICCapability, 1); + cap->version = version; + /* by default, support none */ + cap->emulated = false; + cap->kernel = false; + return cap; +} + +static GICCapabilityList *gic_cap_list_add(GICCapabilityList *head, + GICCapability *cap) +{ + GICCapabilityList *item = g_new0(GICCapabilityList, 1); + item->value = cap; + item->next = head; + return item; +} + GICCapabilityList *qmp_query_gic_capability(Error **errp); GICCapabilityList *qmp_query_gic_capability(Error **errp) { - return NULL; + GICCapabilityList *head = NULL; + GICCapability *v2 = gic_cap_new(2), *v3 = gic_cap_new(3); + + v2->emulated = true; + /* FIXME: we'd change to true after we get emulated GICv3 */ + v3->emulated = false; + +#ifdef CONFIG_KVM + if (kvm_enabled()) { + /* Test KVM GICv2 */ + if (kvm_create_device(kvm_state, KVM_DEV_TYPE_ARM_VGIC_V2, + true) >= 0) { + v2->kernel = true; + } + + /* Test KVM GICv3 */ + if (kvm_create_device(kvm_state, KVM_DEV_TYPE_ARM_VGIC_V3, + true) >= 0) { + v3->kernel = true; + } + } +#endif + + head = gic_cap_list_add(head, v2); + head = gic_cap_list_add(head, v3); + + return head; } -- 2.4.3