xref: /qemu/target/arm/arm-qmp-cmds.c (revision db31e49a565fc4c165fd98201721b313c3412c1f)
1ae50a770SPeter Xu /*
2ae50a770SPeter Xu  * QEMU monitor.c for ARM.
3ae50a770SPeter Xu  *
4ae50a770SPeter Xu  * Permission is hereby granted, free of charge, to any person obtaining a copy
5ae50a770SPeter Xu  * of this software and associated documentation files (the "Software"), to deal
6ae50a770SPeter Xu  * in the Software without restriction, including without limitation the rights
7ae50a770SPeter Xu  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8ae50a770SPeter Xu  * copies of the Software, and to permit persons to whom the Software is
9ae50a770SPeter Xu  * furnished to do so, subject to the following conditions:
10ae50a770SPeter Xu  *
11ae50a770SPeter Xu  * The above copyright notice and this permission notice shall be included in
12ae50a770SPeter Xu  * all copies or substantial portions of the Software.
13ae50a770SPeter Xu  *
14ae50a770SPeter Xu  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15ae50a770SPeter Xu  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16ae50a770SPeter Xu  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17ae50a770SPeter Xu  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18ae50a770SPeter Xu  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19ae50a770SPeter Xu  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20ae50a770SPeter Xu  * THE SOFTWARE.
21ae50a770SPeter Xu  */
22ae50a770SPeter Xu #include "qemu/osdep.h"
23ae50a770SPeter Xu #include "qmp-commands.h"
24db31e49aSPeter Xu #include "hw/boards.h"
25db31e49aSPeter Xu #include "kvm_arm.h"
26db31e49aSPeter Xu 
27db31e49aSPeter Xu static GICCapability *gic_cap_new(int version)
28db31e49aSPeter Xu {
29db31e49aSPeter Xu     GICCapability *cap = g_new0(GICCapability, 1);
30db31e49aSPeter Xu     cap->version = version;
31db31e49aSPeter Xu     /* by default, support none */
32db31e49aSPeter Xu     cap->emulated = false;
33db31e49aSPeter Xu     cap->kernel = false;
34db31e49aSPeter Xu     return cap;
35db31e49aSPeter Xu }
36db31e49aSPeter Xu 
37db31e49aSPeter Xu static GICCapabilityList *gic_cap_list_add(GICCapabilityList *head,
38db31e49aSPeter Xu                                            GICCapability *cap)
39db31e49aSPeter Xu {
40db31e49aSPeter Xu     GICCapabilityList *item = g_new0(GICCapabilityList, 1);
41db31e49aSPeter Xu     item->value = cap;
42db31e49aSPeter Xu     item->next = head;
43db31e49aSPeter Xu     return item;
44db31e49aSPeter Xu }
45db31e49aSPeter Xu 
46db31e49aSPeter Xu static inline void gic_cap_kvm_probe(GICCapability *v2, GICCapability *v3)
47db31e49aSPeter Xu {
48db31e49aSPeter Xu #ifdef CONFIG_KVM
49db31e49aSPeter Xu     int fdarray[3];
50db31e49aSPeter Xu 
51db31e49aSPeter Xu     if (!kvm_arm_create_scratch_host_vcpu(NULL, fdarray, NULL)) {
52db31e49aSPeter Xu         return;
53db31e49aSPeter Xu     }
54db31e49aSPeter Xu 
55db31e49aSPeter Xu     /* Test KVM GICv2 */
56db31e49aSPeter Xu     if (kvm_device_supported(fdarray[1], KVM_DEV_TYPE_ARM_VGIC_V2)) {
57db31e49aSPeter Xu         v2->kernel = true;
58db31e49aSPeter Xu     }
59db31e49aSPeter Xu 
60db31e49aSPeter Xu     /* Test KVM GICv3 */
61db31e49aSPeter Xu     if (kvm_device_supported(fdarray[1], KVM_DEV_TYPE_ARM_VGIC_V3)) {
62db31e49aSPeter Xu         v3->kernel = true;
63db31e49aSPeter Xu     }
64db31e49aSPeter Xu 
65db31e49aSPeter Xu     kvm_arm_destroy_scratch_host_vcpu(fdarray);
66db31e49aSPeter Xu #endif
67db31e49aSPeter Xu }
68ae50a770SPeter Xu 
69ae50a770SPeter Xu GICCapabilityList *qmp_query_gic_capabilities(Error **errp)
70ae50a770SPeter Xu {
71db31e49aSPeter Xu     GICCapabilityList *head = NULL;
72db31e49aSPeter Xu     GICCapability *v2 = gic_cap_new(2), *v3 = gic_cap_new(3);
73db31e49aSPeter Xu 
74db31e49aSPeter Xu     v2->emulated = true;
75db31e49aSPeter Xu     /* TODO: we'd change to true after we get emulated GICv3. */
76db31e49aSPeter Xu     v3->emulated = false;
77db31e49aSPeter Xu 
78db31e49aSPeter Xu     gic_cap_kvm_probe(v2, v3);
79db31e49aSPeter Xu 
80db31e49aSPeter Xu     head = gic_cap_list_add(head, v2);
81db31e49aSPeter Xu     head = gic_cap_list_add(head, v3);
82db31e49aSPeter Xu 
83db31e49aSPeter Xu     return head;
84ae50a770SPeter Xu }
85