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

[Xen-ia64-devel] [PATCH 07/12] Xen: Make events.c portable for ia64/xen support.



Remove x86 dependency in drivers/xen/events.c for ia64/xen support.
Introduce xen_irqs_disabled() to hide regs->flags
Introduce xen_do_IRQ() to hide regs->orig_ax.
Add one rmb() because on ia64 xchg() isn't barrier.

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
 drivers/xen/events.c             |   13 +++++++------
 include/asm-x86/xen/hypervisor.h |   10 ++++++++++
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index c50d499..2396b44 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -469,7 +469,7 @@ irqreturn_t xen_debug_interrupt(int irq, void *dev_id)
        for_each_online_cpu(i) {
                struct vcpu_info *v = per_cpu(xen_vcpu, i);
                printk("%d: masked=%d pending=%d event_sel %08lx\n  ", i,
-                       (get_irq_regs() && i == cpu) ? !(get_irq_regs()->flags 
& X86_EFLAGS_IF) : v->evtchn_upcall_mask,
+                       (get_irq_regs() && i == cpu) ? 
xen_irqs_disabled(get_irq_regs()) : v->evtchn_upcall_mask,
                        v->evtchn_upcall_pending,
                        v->evtchn_pending_sel);
        }
@@ -527,7 +527,10 @@ void xen_evtchn_do_upcall(struct pt_regs *regs)
                if (__get_cpu_var(nesting_count)++)
                        goto out;
 
-               /* NB. No need for a barrier here -- XCHG is a barrier on x86. 
*/
+#ifndef CONFIG_X86 /* No need for a barrier -- XCHG is a barrier on x86. */
+               /* Clear master flag /before/ clearing selector flag. */
+               rmb();
+#endif
                pending_words = xchg(&vcpu_info->evtchn_pending_sel, 0);
                while (pending_words != 0) {
                        unsigned long pending_bits;
@@ -539,10 +542,8 @@ void xen_evtchn_do_upcall(struct pt_regs *regs)
                                int port = (word_idx * BITS_PER_LONG) + bit_idx;
                                int irq = evtchn_to_irq[port];
 
-                               if (irq != -1) {
-                                       regs->orig_ax = ~irq;
-                                       do_IRQ(regs);
-                               }
+                               if (irq != -1)
+                                       xen_do_IRQ(irq, regs);
                        }
                }
 
diff --git a/include/asm-x86/xen/hypervisor.h b/include/asm-x86/xen/hypervisor.h
index 8e15dd2..767a361 100644
--- a/include/asm-x86/xen/hypervisor.h
+++ b/include/asm-x86/xen/hypervisor.h
@@ -61,6 +61,16 @@ extern struct start_info *xen_start_info;
 /* Force a proper event-channel callback from Xen. */
 extern void force_evtchn_callback(void);
 
+/* macro to avoid header inclusion dependncy hell */
+#define xen_irqs_disabled(regs)        (!((regs)->flags & X86_EFLAGS_IF))
+
+/* macro to avoid header inclusion dependncy hell */
+#define xen_do_IRQ(irq, regs)                  \
+       do {                                    \
+               (regs)->orig_ax = ~(irq);       \
+               do_IRQ(regs);                   \
+       } while (0)
+
 /* Turn jiffies into Xen system time. */
 u64 jiffies_to_st(unsigned long jiffies);
 
-- 
1.5.3


_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.