On Tue, 2006-03-21 at 22:31 -0800, Chris Wright wrote: > plain text document attachment (22-evtchn) > Support Xen event channels instead of the i8259 PIC. > > Event channels are used to inject events into the kernel, either from > the hypervisor or from another VM. The injected events are mapped to > interrupts. > > If an event needs to be injected, the hypervisor causes an upcall into > the kernel. The upcall handler then scans the event pending bitmap > and calls do_IRQ for each pending event. > > Signed-off-by: Ian Pratt <ian.pratt@xxxxxxxxxxxxx> > Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx> > Signed-off-by: Chris Wright <chrisw@xxxxxxxxxxxx> > --- > arch/i386/kernel/Makefile | 6 > arch/i386/mach-xen/evtchn.c | 844 ++++++++++++++++++++++++++++++++ > drivers/xen/core/Makefile | 2 > include/asm-i386/hw_irq.h | 4 > include/asm-i386/mach-xen/irq_vectors.h | 126 ++++ > include/xen/evtchn.h | 113 ++++ > 6 files changed, 1093 insertions(+), 2 deletions(-) > > --- xen-subarch-2.6.orig/arch/i386/kernel/Makefile > +++ xen-subarch-2.6/arch/i386/kernel/Makefile > @@ -5,7 +5,7 @@ > extra-y := head.o init_task.o vmlinux.lds > > obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \ > - ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \ > + ptrace.o time.o ioport.o ldt.o setup.o hw_irq.o sys_i386.o \ > pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \ > quirks.o i8237.o topology.o > > @@ -42,6 +42,10 @@ EXTRA_AFLAGS := -traditional > > obj-$(CONFIG_SCx200) += scx200.o > > +hw_irq-y := i8259.o > + > +hw_irq-$(CONFIG_XEN) := ../mach-xen/evtchn.o > + > # vsyscall.o contains the vsyscall DSO images as __initdata. > # We must build both images before we can assemble it. > # Note: kbuild does not track this dependency due to usage of .incbin > --- xen-subarch-2.6.orig/include/asm-i386/hw_irq.h > +++ xen-subarch-2.6/include/asm-i386/hw_irq.h > @@ -68,7 +68,9 @@ extern atomic_t irq_mis_count; > > #define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs)) > > -#if defined(CONFIG_X86_IO_APIC) > +#if defined(CONFIG_X86_XEN) > +extern void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i); > +#elif defined(CONFIG_X86_IO_APIC) > static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) > { > if (IO_APIC_IRQ(i)) > --- /dev/null > +++ xen-subarch-2.6/arch/i386/mach-xen/evtchn.c > @@ -0,0 +1,844 @@ > +/****************************************************************************** > + * evtchn.c > + * > + * Communication via Xen event channels. > + * > + * Copyright (c) 2002-2005, K A Fraser > + * > + * This file may be distributed separately from the Linux kernel, or > + * incorporated into other software packages, subject to the following license: > + * again no allowance for use inside the kernel > + */ > + > +#include <linux/config.h> > +#include <linux/module.h> > +#include <linux/irq.h> > +#include <linux/interrupt.h> > +#include <linux/sched.h> > +#include <linux/kernel_stat.h> > +#include <linux/version.h> this highly looks that it's not possible to be used outside the linux kernel so the license is odd > +/* Convenient shorthand for packed representation of an unbound IRQ. */ > +#define IRQ_UNBOUND mk_irq_info(IRQT_UNBOUND, 0, 0) > +/* Accessor macros for packed IRQ information. */ > +#define evtchn_from_irq(irq) ((u16)(irq_info[irq])) > +#define index_from_irq(irq) ((u8)(irq_info[irq] >> 16)) > +#define type_from_irq(irq) ((u8)(irq_info[irq] >> 24)) static inlines please > +#ifdef CONFIG_XEN_EVTCHN_DEVICE > + evtchn_device_upcall(port); > +#else > + mask_evtchn(port); > +#endif why this ifdef ? > +static int find_unbound_irq(void) > +{ > + int irq; > + > + for (irq = 0; irq < NR_IRQS; irq++) > + if (irq_bindcount[irq] == 0) > + break; > + > + if (irq == NR_IRQS) { > + printk(KERN_ERR "No available IRQ to bind to: increase NR_IRQS!\n"); there is no way to share interrupts? A shame > +EXPORT_SYMBOL(bind_virq_to_irqhandler); this is highly low level interfact, please make this and the others a _GPL export