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