qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 2/4] kvm: Introduce kvm_arch_irqchip_create


From: Christoffer Dall
Subject: [Qemu-devel] [PATCH 2/4] kvm: Introduce kvm_arch_irqchip_create
Date: Fri, 23 Aug 2013 12:41:00 -0700

Introduce kvm_arch_irqchip_create an arch-specific hook in preparation
for architecture-specific use of the device control API to create IRQ
chips.

Following patches will implement the ARM irqchip create method to prefer
the device control API over the older KVM_CREATE_IRQCHIP API.

Signed-off-by: Christoffer Dall <address@hidden>
---
 include/sysemu/kvm.h |    4 ++++
 kvm-all.c            |   11 +++++++++--
 target-arm/kvm.c     |    5 +++++
 target-i386/kvm.c    |    5 +++++
 target-ppc/kvm.c     |    5 +++++
 target-s390x/kvm.c   |    5 +++++
 6 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index de74411..1e5847e 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -224,6 +224,10 @@ void kvm_arch_reset_vcpu(CPUState *cpu);
 int kvm_arch_on_sigbus_vcpu(CPUState *cpu, int code, void *addr);
 int kvm_arch_on_sigbus(int code, void *addr);
 
+/* return negative error on error, 0 if irq chip was not created, and positive
+ * number if it was created */
+int kvm_arch_irqchip_create(KVMState *s);
+
 void kvm_arch_init_irq_routing(KVMState *s);
 
 int kvm_set_irq(KVMState *s, int irq, int level);
diff --git a/kvm-all.c b/kvm-all.c
index 716860f..fe64f3b 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -1295,10 +1295,17 @@ static int kvm_irqchip_create(KVMState *s)
         return 0;
     }
 
-    ret = kvm_vm_ioctl(s, KVM_CREATE_IRQCHIP);
+    /* First probe and see if there's a arch-specific hook to create the
+     * in-kernel irqchip for us */
+    ret = kvm_arch_irqchip_create(s);
     if (ret < 0) {
-        fprintf(stderr, "Create kernel irqchip failed\n");
         return ret;
+    } else if (ret == 0) {
+        ret = kvm_vm_ioctl(s, KVM_CREATE_IRQCHIP);
+        if (ret < 0) {
+            fprintf(stderr, "Create kernel irqchip failed\n");
+            return ret;
+        }
     }
 
     kvm_kernel_irqchip = true;
diff --git a/target-arm/kvm.c b/target-arm/kvm.c
index b92e00d..2484d90 100644
--- a/target-arm/kvm.c
+++ b/target-arm/kvm.c
@@ -647,3 +647,8 @@ void kvm_arch_remove_all_hw_breakpoints(void)
 void kvm_arch_init_irq_routing(KVMState *s)
 {
 }
+
+int kvm_arch_irqchip_create(KVMState *s)
+{
+    return 0;
+}
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 376fc70..8a62161 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -2188,6 +2188,11 @@ bool kvm_arch_stop_on_emulation_error(CPUState *cs)
            ((env->segs[R_CS].selector  & 3) != 3);
 }
 
+int kvm_arch_irqchip_create(KVMState *s)
+{
+    return 0;
+}
+
 void kvm_arch_init_irq_routing(KVMState *s)
 {
     if (!kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) {
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
index 30a870e..15c92e8 100644
--- a/target-ppc/kvm.c
+++ b/target-ppc/kvm.c
@@ -1875,3 +1875,8 @@ int kvm_arch_on_sigbus(int code, void *addr)
 void kvm_arch_init_irq_routing(KVMState *s)
 {
 }
+
+int kvm_arch_irqchip_create(KVMState *s)
+{
+    return 0;
+}
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index 26d18e3..7f4dae9 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -893,6 +893,11 @@ void kvm_arch_init_irq_routing(KVMState *s)
 {
 }
 
+int kvm_arch_irqchip_create(KVMState *s)
+{
+    return 0;
+}
+
 int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
                                     int vq, bool assign)
 {
-- 
1.7.10.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]