Extended PHYSDEVOP_irq_status_query to obtain sharing status
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 7 Jun 2006 14:46:05 +0000 (15:46 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 7 Jun 2006 14:46:05 +0000 (15:46 +0100)
(bound to multiple guests?).
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/irq.c
xen/arch/x86/physdev.c
xen/include/asm-x86/irq.h
xen/include/public/physdev.h

index d6d12841b6e5c87c2993048b4f54f051e39acebf..b12c2f5ba09a42328b5874f8e2739fa1454ac925 100644 (file)
@@ -402,6 +402,28 @@ int pirq_acktype(int irq)
     return 0;
 }
 
+int pirq_shared(int irq)
+{
+    unsigned int        vector;
+    irq_desc_t         *desc;
+    irq_guest_action_t *action;
+    unsigned long       flags;
+    int                 shared;
+
+    vector = irq_to_vector(irq);
+    if ( vector == 0 )
+        return 0;
+
+    desc = &irq_desc[vector];
+
+    spin_lock_irqsave(&desc->lock, flags);
+    action = (irq_guest_action_t *)desc->action;
+    shared = ((desc->status & IRQ_GUEST) && (action->nr_guests > 1));
+    spin_unlock_irqrestore(&desc->lock, flags);
+
+    return shared;
+}
+
 int pirq_guest_bind(struct vcpu *v, int irq, int will_share)
 {
     unsigned int        vector;
index 48d259c85d9068d566988d030bef9b5a8811a1dc..caf6f393e473652e4f9329ecfe628a263ce5fd04 100644 (file)
 #include <public/xen.h>
 #include <public/physdev.h>
 
-extern int
+int
 ioapic_guest_read(
     unsigned long physbase, unsigned int reg, u32 *pval);
-extern int
+int
 ioapic_guest_write(
     unsigned long physbase, unsigned int reg, u32 pval);
-extern int
-pirq_acktype(
-    int irq);
 
 long do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg)
 {
@@ -56,6 +53,8 @@ long do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg)
         irq_status_query.flags = 0;
         if ( pirq_acktype(irq) != 0 )
             irq_status_query.flags |= XENIRQSTAT_needs_eoi;
+        if ( pirq_shared(irq) )
+            irq_status_query.flags |= XENIRQSTAT_shared;
         ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0;
         break;
     }
index 4d64e53344e62e929c47b04d130ebc582ca551dd..33aff7150c4ea32c5f9779ba8a435acc018a1691 100644 (file)
@@ -46,4 +46,7 @@ extern unsigned long io_apic_irqs;
 extern atomic_t irq_err_count;
 extern atomic_t irq_mis_count;
 
+int pirq_acktype(int irq);
+int pirq_shared(int irq);
+
 #endif /* _ASM_HW_IRQ_H */
index 0fced1fdaf4c6980cc9b5a66c94055e8c5ba6d8d..7c53951b561a107ed8f90c061139a8bb6888b7f5 100644 (file)
@@ -37,7 +37,11 @@ DEFINE_XEN_GUEST_HANDLE(physdev_irq_status_query_t);
 
 /* Need to call PHYSDEVOP_eoi when the IRQ has been serviced? */
 #define _XENIRQSTAT_needs_eoi   (0)
-#define  XENIRQSTAT_needs_eoi   (1<<_XENIRQSTAT_needs_eoi)
+#define  XENIRQSTAT_needs_eoi   (1U<<_XENIRQSTAT_needs_eoi)
+
+/* Need to call PHYSDEVOP_eoi when the IRQ has been serviced? */
+#define _XENIRQSTAT_shared      (1)
+#define  XENIRQSTAT_shared      (1U<<_XENIRQSTAT_shared)
 
 /*
  * Set the current VCPU's I/O privilege level.
@@ -130,6 +134,7 @@ DEFINE_XEN_GUEST_HANDLE(physdev_op_t);
 #define PHYSDEVOP_APIC_WRITE             PHYSDEVOP_apic_write
 #define PHYSDEVOP_ASSIGN_VECTOR          PHYSDEVOP_alloc_irq_vector
 #define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi
+#define PHYSDEVOP_IRQ_SHARED             XENIRQSTAT_shared
 
 #endif /* __XEN_PUBLIC_PHYSDEV_H__ */