Message ID | 1458711153-15988-5-git-send-email-peterx@redhat.com |
---|---|
State | New |
Headers | show |
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; > }
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 --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; }
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(-)