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 */ 22*112ed241SMarkus Armbruster 23ae50a770SPeter Xu #include "qemu/osdep.h" 24db31e49aSPeter Xu #include "hw/boards.h" 25db31e49aSPeter Xu #include "kvm_arm.h" 26*112ed241SMarkus Armbruster #include "qapi/qapi-commands-misc.h" 27db31e49aSPeter Xu 28db31e49aSPeter Xu static GICCapability *gic_cap_new(int version) 29db31e49aSPeter Xu { 30db31e49aSPeter Xu GICCapability *cap = g_new0(GICCapability, 1); 31db31e49aSPeter Xu cap->version = version; 32db31e49aSPeter Xu /* by default, support none */ 33db31e49aSPeter Xu cap->emulated = false; 34db31e49aSPeter Xu cap->kernel = false; 35db31e49aSPeter Xu return cap; 36db31e49aSPeter Xu } 37db31e49aSPeter Xu 38db31e49aSPeter Xu static GICCapabilityList *gic_cap_list_add(GICCapabilityList *head, 39db31e49aSPeter Xu GICCapability *cap) 40db31e49aSPeter Xu { 41db31e49aSPeter Xu GICCapabilityList *item = g_new0(GICCapabilityList, 1); 42db31e49aSPeter Xu item->value = cap; 43db31e49aSPeter Xu item->next = head; 44db31e49aSPeter Xu return item; 45db31e49aSPeter Xu } 46db31e49aSPeter Xu 47db31e49aSPeter Xu static inline void gic_cap_kvm_probe(GICCapability *v2, GICCapability *v3) 48db31e49aSPeter Xu { 49db31e49aSPeter Xu #ifdef CONFIG_KVM 50db31e49aSPeter Xu int fdarray[3]; 51db31e49aSPeter Xu 52db31e49aSPeter Xu if (!kvm_arm_create_scratch_host_vcpu(NULL, fdarray, NULL)) { 53db31e49aSPeter Xu return; 54db31e49aSPeter Xu } 55db31e49aSPeter Xu 56db31e49aSPeter Xu /* Test KVM GICv2 */ 57db31e49aSPeter Xu if (kvm_device_supported(fdarray[1], KVM_DEV_TYPE_ARM_VGIC_V2)) { 58db31e49aSPeter Xu v2->kernel = true; 59db31e49aSPeter Xu } 60db31e49aSPeter Xu 61db31e49aSPeter Xu /* Test KVM GICv3 */ 62db31e49aSPeter Xu if (kvm_device_supported(fdarray[1], KVM_DEV_TYPE_ARM_VGIC_V3)) { 63db31e49aSPeter Xu v3->kernel = true; 64db31e49aSPeter Xu } 65db31e49aSPeter Xu 66db31e49aSPeter Xu kvm_arm_destroy_scratch_host_vcpu(fdarray); 67db31e49aSPeter Xu #endif 68db31e49aSPeter Xu } 69ae50a770SPeter Xu 70ae50a770SPeter Xu GICCapabilityList *qmp_query_gic_capabilities(Error **errp) 71ae50a770SPeter Xu { 72db31e49aSPeter Xu GICCapabilityList *head = NULL; 73db31e49aSPeter Xu GICCapability *v2 = gic_cap_new(2), *v3 = gic_cap_new(3); 74db31e49aSPeter Xu 75db31e49aSPeter Xu v2->emulated = true; 763b1a2225SPeter Maydell v3->emulated = true; 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