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