提交 e849c3e9 编写于 作者: I Isaku Yamahata 提交者: Ingo Molnar

Xen: make events.c portable for ia64/xen support

Remove x86 dependency in drivers/xen/events.c for ia64/xen support
introducing include/asm/xen/events.h.
Introduce xen_irqs_disabled() to hide regs->flags
Introduce xen_do_IRQ() to hide regs->orig_ax.
make enum ipi_vector definition arch specific. ia64/xen needs four vectors.
Add one rmb() because on ia64 xchg() isn't barrier.
Signed-off-by: NIsaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: NJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
上级 e04d0d07
...@@ -469,7 +469,7 @@ irqreturn_t xen_debug_interrupt(int irq, void *dev_id) ...@@ -469,7 +469,7 @@ irqreturn_t xen_debug_interrupt(int irq, void *dev_id)
for_each_online_cpu(i) { for_each_online_cpu(i) {
struct vcpu_info *v = per_cpu(xen_vcpu, i); struct vcpu_info *v = per_cpu(xen_vcpu, i);
printk("%d: masked=%d pending=%d event_sel %08lx\n ", 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_upcall_pending,
v->evtchn_pending_sel); v->evtchn_pending_sel);
} }
...@@ -527,7 +527,10 @@ void xen_evtchn_do_upcall(struct pt_regs *regs) ...@@ -527,7 +527,10 @@ void xen_evtchn_do_upcall(struct pt_regs *regs)
if (__get_cpu_var(nesting_count)++) if (__get_cpu_var(nesting_count)++)
goto out; 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); pending_words = xchg(&vcpu_info->evtchn_pending_sel, 0);
while (pending_words != 0) { while (pending_words != 0) {
unsigned long pending_bits; unsigned long pending_bits;
...@@ -539,10 +542,8 @@ void xen_evtchn_do_upcall(struct pt_regs *regs) ...@@ -539,10 +542,8 @@ void xen_evtchn_do_upcall(struct pt_regs *regs)
int port = (word_idx * BITS_PER_LONG) + bit_idx; int port = (word_idx * BITS_PER_LONG) + bit_idx;
int irq = evtchn_to_irq[port]; int irq = evtchn_to_irq[port];
if (irq != -1) { if (irq != -1)
regs->orig_ax = ~irq; xen_do_IRQ(irq, regs);
do_IRQ(regs);
}
} }
} }
......
#ifndef __XEN_EVENTS_H
#define __XEN_EVENTS_H
enum ipi_vector {
XEN_RESCHEDULE_VECTOR,
XEN_CALL_FUNCTION_VECTOR,
XEN_NR_IPIS,
};
static inline int xen_irqs_disabled(struct pt_regs *regs)
{
return raw_irqs_disabled_flags(regs->flags);
}
static inline void xen_do_IRQ(int irq, struct pt_regs *regs)
{
regs->orig_ax = ~irq;
do_IRQ(regs);
}
#endif /* __XEN_EVENTS_H */
...@@ -5,13 +5,7 @@ ...@@ -5,13 +5,7 @@
#include <xen/interface/event_channel.h> #include <xen/interface/event_channel.h>
#include <asm/xen/hypercall.h> #include <asm/xen/hypercall.h>
#include <asm/xen/events.h>
enum ipi_vector {
XEN_RESCHEDULE_VECTOR,
XEN_CALL_FUNCTION_VECTOR,
XEN_NR_IPIS,
};
int bind_evtchn_to_irq(unsigned int evtchn); int bind_evtchn_to_irq(unsigned int evtchn);
int bind_evtchn_to_irqhandler(unsigned int evtchn, int bind_evtchn_to_irqhandler(unsigned int evtchn,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册