(bound to multiple guests?).
Signed-off-by: Keir Fraser <keir@xensource.com>
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;
#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)
{
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;
}
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 */
/* 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.
#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__ */