diff mbox

[v6,4/4] arm: implement query-gic-capabilities

Message ID 1458711153-15988-5-git-send-email-peterx@redhat.com
State New
Headers show

Commit Message

Peter Xu March 23, 2016, 5:32 a.m. UTC
For emulated GIC capabilities, currently only gicv2 is supported. We
need to add gicv3 in when emulated gicv3 ready. For KVM accelerated ARM
VM, we detect the capability bits by creating a scratch VM.

Signed-off-by: Peter Xu <peterx@redhat.com>
---
 target-arm/monitor.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 59 insertions(+), 1 deletion(-)

Comments

Sergey Fedorov March 23, 2016, 12:33 p.m. UTC | #1
On 23/03/16 08:32, Peter Xu wrote:
> diff --git a/target-arm/monitor.c b/target-arm/monitor.c
> index 254a9c9..4a2db59 100644
> --- a/target-arm/monitor.c
> +++ b/target-arm/monitor.c
> @@ -21,8 +21,66 @@
(snip)
>  GICCapabilityResult *qmp_query_gic_capabilities(Error **errp)
>  {
> -    return NULL;
> +    GICCapabilityResult *result = g_new0(GICCapabilityResult, 1);
> +    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. */

Maybewe'd better use'NOTE:' or 'TODO:' instead of 'FIXME:'?

> +    v3->emulated = false;
> +
> +#ifdef CONFIG_KVM
> +    {
> +        int fdarray[3];
> +
> +        if (!kvm_arm_create_scratch_host_vcpu(NULL, fdarray, NULL)) {
> +            goto out;
> +        }
> +
> +        /* Test KVM GICv2 */
> +        if (kvm_support_device(fdarray[1], KVM_DEV_TYPE_ARM_VGIC_V2)) {
> +            v2->kernel = true;
> +        }
> +
> +        /* Test KVM GICv3 */
> +        if (kvm_support_device(fdarray[1], KVM_DEV_TYPE_ARM_VGIC_V3)) {
> +            v3->kernel = true;
> +        }
> +
> +        kvm_arm_destroy_scratch_host_vcpu(fdarray);
> +out:
> +        ;
> +    }
> +#endif

Probably, it would be neater to put KVM part into a separate static
inline function.

Kind regards,
Sergey

> +
> +    head = gic_cap_list_add(head, v2);
> +    head = gic_cap_list_add(head, v3);
> +
> +    result->capabilities = head;
> +
> +    return result;
>  }
Peter Xu March 24, 2016, 2:20 a.m. UTC | #2
On Wed, Mar 23, 2016 at 03:33:25PM +0300, Sergey Fedorov wrote:
> On 23/03/16 08:32, Peter Xu wrote:
> > diff --git a/target-arm/monitor.c b/target-arm/monitor.c
> > index 254a9c9..4a2db59 100644
> > --- a/target-arm/monitor.c
> > +++ b/target-arm/monitor.c
> > @@ -21,8 +21,66 @@
> (snip)
> >  GICCapabilityResult *qmp_query_gic_capabilities(Error **errp)
> >  {
> > -    return NULL;
> > +    GICCapabilityResult *result = g_new0(GICCapabilityResult, 1);
> > +    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. */
> 
> Maybewe'd better use'NOTE:' or 'TODO:' instead of 'FIXME:'?

Right.

> 
> > +    v3->emulated = false;
> > +
> > +#ifdef CONFIG_KVM
> > +    {
> > +        int fdarray[3];
> > +
> > +        if (!kvm_arm_create_scratch_host_vcpu(NULL, fdarray, NULL)) {
> > +            goto out;
> > +        }
> > +
> > +        /* Test KVM GICv2 */
> > +        if (kvm_support_device(fdarray[1], KVM_DEV_TYPE_ARM_VGIC_V2)) {
> > +            v2->kernel = true;
> > +        }
> > +
> > +        /* Test KVM GICv3 */
> > +        if (kvm_support_device(fdarray[1], KVM_DEV_TYPE_ARM_VGIC_V3)) {
> > +            v3->kernel = true;
> > +        }
> > +
> > +        kvm_arm_destroy_scratch_host_vcpu(fdarray);
> > +out:
> > +        ;
> > +    }
> > +#endif
> 
> Probably, it would be neater to put KVM part into a separate static
> inline function.

Seems so. Will fix.

Thanks.

-- peterx
diff mbox

Patch

diff --git a/target-arm/monitor.c b/target-arm/monitor.c
index 254a9c9..4a2db59 100644
--- a/target-arm/monitor.c
+++ b/target-arm/monitor.c
@@ -21,8 +21,66 @@ 
  */
 #include "qemu/osdep.h"
 #include "qmp-commands.h"
+#include "hw/boards.h"
+#include "kvm_arm.h"
+
+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;
+}
 
 GICCapabilityResult *qmp_query_gic_capabilities(Error **errp)
 {
-    return NULL;
+    GICCapabilityResult *result = g_new0(GICCapabilityResult, 1);
+    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
+    {
+        int fdarray[3];
+
+        if (!kvm_arm_create_scratch_host_vcpu(NULL, fdarray, NULL)) {
+            goto out;
+        }
+
+        /* Test KVM GICv2 */
+        if (kvm_support_device(fdarray[1], KVM_DEV_TYPE_ARM_VGIC_V2)) {
+            v2->kernel = true;
+        }
+
+        /* Test KVM GICv3 */
+        if (kvm_support_device(fdarray[1], KVM_DEV_TYPE_ARM_VGIC_V3)) {
+            v3->kernel = true;
+        }
+
+        kvm_arm_destroy_scratch_host_vcpu(fdarray);
+out:
+        ;
+    }
+#endif
+
+    head = gic_cap_list_add(head, v2);
+    head = gic_cap_list_add(head, v3);
+
+    result->capabilities = head;
+
+    return result;
 }