mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
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: Isaku Yamahata <yamahata@valinux.co.jp> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
e04d0d0767
commit
e849c3e9e0
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
22
include/asm-x86/xen/events.h
Normal file
22
include/asm-x86/xen/events.h
Normal file
@ -0,0 +1,22 @@
|
||||
#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 @@
|
||||
|
||||
#include <xen/interface/event_channel.h>
|
||||
#include <asm/xen/hypercall.h>
|
||||
|
||||
enum ipi_vector {
|
||||
XEN_RESCHEDULE_VECTOR,
|
||||
XEN_CALL_FUNCTION_VECTOR,
|
||||
|
||||
XEN_NR_IPIS,
|
||||
};
|
||||
#include <asm/xen/events.h>
|
||||
|
||||
int bind_evtchn_to_irq(unsigned int evtchn);
|
||||
int bind_evtchn_to_irqhandler(unsigned int evtchn,
|
||||
|
Loading…
Reference in New Issue
Block a user