ia64/xen-unstable

changeset 10143:f0f88d9c4c9e

[IA64] Final patch to make evtchn fully working for xen/ia64

OK, this is the last one of patch sets, which enables xen/ia64 to work
on event channel mechanism fully. Now user may observe /proc/interrupts
of dom0 as:

CPU0
34: 12 Phys-irq ide0
39: 0 Phys-irq acpi
45: 322 Phys-irq serial
48: 115006 Phys-irq peth0
49: 16269 Phys-irq ioc0
50: 31 Phys-irq ioc1
51: 2 Phys-irq ehci_hcd:usb1
52: 0 Phys-irq uhci_hcd:usb2
53: 55 Phys-irq uhci_hcd:usb3
256: 0 Dynamic-irq RESCHED0
257: 0 Dynamic-irq IPI0
258: 44572 Dynamic-irq timer0
259: 2316 Dynamic-irq xenbus
260: 8304 Dynamic-irq blkif-backend
261: 25947 Dynamic-irq vif3.0
ERR: 0

Based on this patch, dom0's performance is not affected, while domU's
network output is seen with several percents increase. More important,
now xen/ia64 can progress a base step towards driver domain support!

Signed-off-by Kevin Tian <kevin.tian@intel.com>
author awilliam@xenbuild.aw
date Tue May 23 09:17:57 2006 -0600 (2006-05-23)
parents 5be25952b50d
children 953753661a3b
files linux-2.6-xen-sparse/arch/ia64/kernel/iosapic.c linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c linux-2.6-xen-sparse/arch/ia64/kernel/setup.c linux-2.6-xen-sparse/arch/ia64/xen/drivers/coreMakefile linux-2.6-xen-sparse/arch/ia64/xen/drivers/xenia64_init.c linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S linux-2.6-xen-sparse/include/asm-ia64/hw_irq.h linux-2.6-xen-sparse/include/asm-ia64/irq.h xen/arch/ia64/linux-xen/entry.S xen/arch/ia64/xen/hyperprivop.S xen/arch/ia64/xen/irq.c
line diff
     1.1 --- a/linux-2.6-xen-sparse/arch/ia64/kernel/iosapic.c	Tue May 23 08:56:13 2006 -0600
     1.2 +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/iosapic.c	Tue May 23 09:17:57 2006 -0600
     1.3 @@ -670,6 +670,7 @@ register_intr (unsigned int gsi, int vec
     1.4  	iosapic_intr_info[vector].dmode    = delivery;
     1.5  	iosapic_intr_info[vector].trigger  = trigger;
     1.6  
     1.7 +#ifndef CONFIG_XEN
     1.8  	if (trigger == IOSAPIC_EDGE)
     1.9  		irq_type = &irq_type_iosapic_edge;
    1.10  	else
    1.11 @@ -682,6 +683,7 @@ register_intr (unsigned int gsi, int vec
    1.12  			       __FUNCTION__, vector, idesc->handler->typename, irq_type->typename);
    1.13  		idesc->handler = irq_type;
    1.14  	}
    1.15 +#endif
    1.16  	return 0;
    1.17  }
    1.18  
     2.1 --- a/linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c	Tue May 23 08:56:13 2006 -0600
     2.2 +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c	Tue May 23 09:17:57 2006 -0600
     2.3 @@ -229,6 +229,150 @@ static struct irqaction ipi_irqaction = 
     2.4  };
     2.5  #endif
     2.6  
     2.7 +#ifdef CONFIG_XEN
     2.8 +#include <xen/evtchn.h>
     2.9 +#include <xen/interface/callback.h>
    2.10 +
    2.11 +static char timer_name[NR_CPUS][15];
    2.12 +static char ipi_name[NR_CPUS][15];
    2.13 +static char resched_name[NR_CPUS][15];
    2.14 +
    2.15 +struct saved_irq {
    2.16 +	unsigned int irq;
    2.17 +	struct irqaction *action;
    2.18 +};
    2.19 +/* 16 should be far optimistic value, since only several percpu irqs
    2.20 + * are registered early.
    2.21 + */
    2.22 +#define MAX_LATE_IRQ	16
    2.23 +static struct saved_irq saved_percpu_irqs[MAX_LATE_IRQ];
    2.24 +static unsigned short late_irq_cnt = 0;
    2.25 +static unsigned short saved_irq_cnt = 0;
    2.26 +static int xen_slab_ready = 0;
    2.27 +
    2.28 +/* Dummy stub. Though we may check RESCHEDULE_VECTOR before __do_IRQ,
    2.29 + * it ends up to issue several memory accesses upon percpu data and
    2.30 + * thus adds unnecessary traffic to other paths.
    2.31 + */
    2.32 +irqreturn_t handle_reschedule(int irq, void *dev_id, struct pt_regs *regs)
    2.33 +{
    2.34 +
    2.35 +	return IRQ_HANDLED;
    2.36 +}
    2.37 +
    2.38 +static struct irqaction resched_irqaction = {
    2.39 +	.handler =	handle_reschedule,
    2.40 +	.flags =	SA_INTERRUPT,
    2.41 +	.name =		"RESCHED"
    2.42 +};
    2.43 +
    2.44 +/*
    2.45 + * This is xen version percpu irq registration, which needs bind
    2.46 + * to xen specific evtchn sub-system. One trick here is that xen
    2.47 + * evtchn binding interface depends on kmalloc because related
    2.48 + * port needs to be freed at device/cpu down. So we cache the
    2.49 + * registration on BSP before slab is ready and then deal them
    2.50 + * at later point. For rest instances happening after slab ready,
    2.51 + * we hook them to xen evtchn immediately.
    2.52 + *
    2.53 + * FIXME: MCA is not supported by far, and thus "nomca" boot param is
    2.54 + * required.
    2.55 + */
    2.56 +void
    2.57 +xen_register_percpu_irq (unsigned int irq, struct irqaction *action, int save)
    2.58 +{
    2.59 +	char name[15];
    2.60 +	unsigned int cpu = smp_processor_id();
    2.61 +	int ret = 0;
    2.62 +
    2.63 +	if (xen_slab_ready) {
    2.64 +		switch (irq) {
    2.65 +		case IA64_TIMER_VECTOR:
    2.66 +			sprintf(timer_name[cpu], "%s%d", action->name, cpu);
    2.67 +			ret = bind_virq_to_irqhandler(VIRQ_ITC, cpu,
    2.68 +				action->handler, action->flags,
    2.69 +				timer_name[cpu], action->dev_id);
    2.70 +			printk(KERN_INFO "register VIRQ_ITC (%s) to xen irq (%d)\n", name, ret);
    2.71 +			break;
    2.72 +		case IA64_IPI_RESCHEDULE:
    2.73 +			sprintf(resched_name[cpu], "%s%d", action->name, cpu);
    2.74 +			ret = bind_ipi_to_irqhandler(RESCHEDULE_VECTOR, cpu,
    2.75 +				action->handler, action->flags,
    2.76 +				resched_name[cpu], action->dev_id);
    2.77 +			printk(KERN_INFO "register RESCHEDULE_VECTOR (%s) to xen irq (%d)\n", name, ret);
    2.78 +			break;
    2.79 +		case IA64_IPI_VECTOR:
    2.80 +			sprintf(ipi_name[cpu], "%s%d", action->name, cpu);
    2.81 +			ret = bind_ipi_to_irqhandler(IPI_VECTOR, cpu,
    2.82 +				action->handler, action->flags,
    2.83 +				ipi_name[cpu], action->dev_id);
    2.84 +			printk(KERN_INFO "register IPI_VECTOR (%s) to xen irq (%d)\n", name, ret);
    2.85 +			break;
    2.86 +		default:
    2.87 +			printk(KERN_WARNING "Percpu irq %d is unsupported by xen!\n", irq);
    2.88 +			break;
    2.89 +		}
    2.90 +		BUG_ON(ret < 0);
    2.91 +	} 
    2.92 +
    2.93 +	/* For BSP, we cache registered percpu irqs, and then re-walk
    2.94 +	 * them when initializing APs
    2.95 +	 */
    2.96 +	if (!cpu && save) {
    2.97 +		BUG_ON(saved_irq_cnt == MAX_LATE_IRQ);
    2.98 +		saved_percpu_irqs[saved_irq_cnt].irq = irq;
    2.99 +		saved_percpu_irqs[saved_irq_cnt].action = action;
   2.100 +		saved_irq_cnt++;
   2.101 +		if (!xen_slab_ready)
   2.102 +			late_irq_cnt++;
   2.103 +	}
   2.104 +}
   2.105 +
   2.106 +void
   2.107 +xen_bind_early_percpu_irq (void)
   2.108 +{
   2.109 +	int i;
   2.110 +
   2.111 +	xen_slab_ready = 1;
   2.112 +	/* There's no race when accessing this cached array, since only
   2.113 +	 * BSP will face with such step shortly
   2.114 +	 */
   2.115 +	for (i = 0; i < late_irq_cnt; i++)
   2.116 +		xen_register_percpu_irq(saved_percpu_irqs[i].irq,
   2.117 +			saved_percpu_irqs[i].action, 0);
   2.118 +}
   2.119 +
   2.120 +/* FIXME: There's no obvious point to check whether slab is ready. So
   2.121 + * a hack is used here by utilizing a late time hook.
   2.122 + */
   2.123 +extern void (*late_time_init)(void);
   2.124 +extern char xen_event_callback;
   2.125 +extern void xen_init_IRQ(void);
   2.126 +
   2.127 +DECLARE_PER_CPU(int, ipi_to_irq[NR_IPIS]);
   2.128 +void xen_smp_intr_init(void)
   2.129 +{
   2.130 +#ifdef CONFIG_SMP
   2.131 +	unsigned int cpu = smp_processor_id();
   2.132 +	unsigned int i = 0;
   2.133 +	struct callback_register event = {
   2.134 +		.type = CALLBACKTYPE_event,
   2.135 +		.address = (unsigned long)&xen_event_callback,
   2.136 +	};
   2.137 +
   2.138 +	if (!cpu)
   2.139 +		return;
   2.140 +
   2.141 +	/* This should be piggyback when setup vcpu guest context */
   2.142 +	BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event));
   2.143 +
   2.144 +	for (i = 0; i < saved_irq_cnt; i++)
   2.145 +		xen_register_percpu_irq(saved_percpu_irqs[i].irq,
   2.146 +			saved_percpu_irqs[i].action, 0);
   2.147 +#endif /* CONFIG_SMP */
   2.148 +}
   2.149 +#endif /* CONFIG_XEN */
   2.150 +
   2.151  void
   2.152  register_percpu_irq (ia64_vector vec, struct irqaction *action)
   2.153  {
   2.154 @@ -237,6 +381,10 @@ register_percpu_irq (ia64_vector vec, st
   2.155  
   2.156  	for (irq = 0; irq < NR_IRQS; ++irq)
   2.157  		if (irq_to_vector(irq) == vec) {
   2.158 +#ifdef CONFIG_XEN
   2.159 +			if (running_on_xen)
   2.160 +				return xen_register_percpu_irq(vec, action, 1);
   2.161 +#endif
   2.162  			desc = irq_descp(irq);
   2.163  			desc->status |= IRQ_PER_CPU;
   2.164  			desc->handler = &irq_type_ia64_lsapic;
   2.165 @@ -248,7 +396,21 @@ register_percpu_irq (ia64_vector vec, st
   2.166  void __init
   2.167  init_IRQ (void)
   2.168  {
   2.169 +#ifdef CONFIG_XEN
   2.170 +	/* Maybe put into platform_irq_init later */
   2.171 +	struct callback_register event = {
   2.172 +		.type = CALLBACKTYPE_event,
   2.173 +		.address = (unsigned long)&xen_event_callback,
   2.174 +	};
   2.175 +	xen_init_IRQ();
   2.176 +	BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event));
   2.177 +	late_time_init = xen_bind_early_percpu_irq;
   2.178 +#ifdef CONFIG_SMP
   2.179 +	register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction);
   2.180 +#endif
   2.181 +#else /* CONFIG_XEN */
   2.182  	register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
   2.183 +#endif /* CONFIG_XEN */
   2.184  #ifdef CONFIG_SMP
   2.185  	register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
   2.186  #endif
   2.187 @@ -267,9 +429,32 @@ ia64_send_ipi (int cpu, int vector, int 
   2.188  
   2.189  #ifdef CONFIG_XEN
   2.190          if (running_on_xen) {
   2.191 -                extern void xen_send_ipi (int cpu, int vec);
   2.192 -                xen_send_ipi (cpu, vector);
   2.193 -                return;
   2.194 +		int irq = -1;
   2.195 +
   2.196 +		/* TODO: we need to call vcpu_up here */
   2.197 +		if (unlikely(vector == ap_wakeup_vector)) {
   2.198 +			extern void xen_send_ipi (int cpu, int vec);
   2.199 +			xen_send_ipi (cpu, vector);
   2.200 +			//vcpu_prepare_and_up(cpu);
   2.201 +			return;
   2.202 +		}
   2.203 +
   2.204 +		switch(vector) {
   2.205 +		case IA64_IPI_VECTOR:
   2.206 +			irq = per_cpu(ipi_to_irq, cpu)[IPI_VECTOR];
   2.207 +			break;
   2.208 +		case IA64_IPI_RESCHEDULE:
   2.209 +			irq = per_cpu(ipi_to_irq, cpu)[RESCHEDULE_VECTOR];
   2.210 +			break;
   2.211 +		default:
   2.212 +			printk(KERN_WARNING"Unsupported IPI type 0x%x\n", vector);
   2.213 +			irq = 0;
   2.214 +			break;
   2.215 +		}		
   2.216 +	
   2.217 +		BUG_ON(irq < 0);
   2.218 +		notify_remote_via_irq(irq);
   2.219 +		return;
   2.220          }
   2.221  #endif /* CONFIG_XEN */
   2.222  
     3.1 --- a/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c	Tue May 23 08:56:13 2006 -0600
     3.2 +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c	Tue May 23 09:17:57 2006 -0600
     3.3 @@ -923,6 +923,10 @@ cpu_init (void)
     3.4  	/* size of physical stacked register partition plus 8 bytes: */
     3.5  	__get_cpu_var(ia64_phys_stacked_size_p8) = num_phys_stacked*8 + 8;
     3.6  	platform_cpu_init();
     3.7 +#ifdef CONFIG_XEN
     3.8 +	/* Need to be moved into platform_cpu_init later */
     3.9 +	xen_smp_intr_init();
    3.10 +#endif
    3.11  	pm_idle = default_idle;
    3.12  }
    3.13  
     4.1 --- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/coreMakefile	Tue May 23 08:56:13 2006 -0600
     4.2 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/coreMakefile	Tue May 23 09:17:57 2006 -0600
     4.3 @@ -6,7 +6,7 @@ obj-y   := gnttab.o features.o
     4.4  obj-$(CONFIG_PROC_FS) += xen_proc.o
     4.5  
     4.6  ifeq ($(ARCH),ia64)
     4.7 -obj-y   += evtchn_ia64.o
     4.8 +obj-y   += evtchn.o
     4.9  obj-y   += xenia64_init.o
    4.10  ifeq ($(CONFIG_XEN_IA64_DOM0_VP),y)
    4.11  obj-$(CONFIG_NET)     += skbuff.o
     5.1 --- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/xenia64_init.c	Tue May 23 08:56:13 2006 -0600
     5.2 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/xenia64_init.c	Tue May 23 09:17:57 2006 -0600
     5.3 @@ -33,7 +33,6 @@ int xen_init(void)
     5.4  		s->arch.start_info_pfn, xen_start_info->nr_pages,
     5.5  		xen_start_info->flags);
     5.6  
     5.7 -	evtchn_init();
     5.8  	initialized = 1;
     5.9  	return 0;
    5.10  }
     6.1 --- a/linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S	Tue May 23 08:56:13 2006 -0600
     6.2 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S	Tue May 23 09:17:57 2006 -0600
     6.3 @@ -2130,5 +2130,32 @@ non_ia32_syscall:
     6.4  	mov rp=r15
     6.5  	br.ret.sptk.many rp
     6.6  END(dispatch_to_ia32_handler)
     6.7 +#endif /* CONFIG_IA32_SUPPORT */
     6.8  
     6.9 -#endif /* CONFIG_IA32_SUPPORT */
    6.10 +#ifdef CONFIG_XEN
    6.11 +	.section .text,"ax"
    6.12 +GLOBAL_ENTRY(xen_event_callback)
    6.13 +	mov r31=pr		// prepare to save predicates
    6.14 +	;;
    6.15 +	SAVE_MIN_WITH_COVER	// uses r31; defines r2 and r3
    6.16 +	;;
    6.17 +	movl r3=XSI_PSR_IC
    6.18 +	mov r14=1
    6.19 +	;;
    6.20 +	st4 [r3]=r14
    6.21 +	;;
    6.22 +	adds r3=8,r2		// set up second base pointer for SAVE_REST
    6.23 +	srlz.i			// ensure everybody knows psr.ic is back on
    6.24 +	;;
    6.25 +	SAVE_REST
    6.26 +	;;
    6.27 +	alloc r14=ar.pfs,0,0,1,0 // must be first in an insn group
    6.28 +	add out0=16,sp		// pass pointer to pt_regs as first arg
    6.29 +	;;
    6.30 +	srlz.d			// make sure we see the effect of cr.ivr
    6.31 +	movl r14=ia64_leave_kernel
    6.32 +	;;
    6.33 +	mov rp=r14
    6.34 +	br.call.sptk.many b6=evtchn_do_upcall
    6.35 +END(xen_event_callback)
    6.36 +#endif
     7.1 --- a/linux-2.6-xen-sparse/include/asm-ia64/hw_irq.h	Tue May 23 08:56:13 2006 -0600
     7.2 +++ b/linux-2.6-xen-sparse/include/asm-ia64/hw_irq.h	Tue May 23 09:17:57 2006 -0600
     7.3 @@ -15,7 +15,11 @@
     7.4  #include <asm/ptrace.h>
     7.5  #include <asm/smp.h>
     7.6  
     7.7 +#ifndef CONFIG_XEN
     7.8  typedef u8 ia64_vector;
     7.9 +#else
    7.10 +typedef u16 ia64_vector;
    7.11 +#endif
    7.12  
    7.13  /*
    7.14   * 0 special
    7.15 @@ -86,11 +90,15 @@ extern void free_irq_vector (int vector)
    7.16  extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect);
    7.17  extern void register_percpu_irq (ia64_vector vec, struct irqaction *action);
    7.18  
    7.19 +#ifndef CONFIG_XEN
    7.20  static inline void
    7.21  hw_resend_irq (struct hw_interrupt_type *h, unsigned int vector)
    7.22  {
    7.23  	platform_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0);
    7.24  }
    7.25 +#else
    7.26 +extern void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i);
    7.27 +#endif /* CONFIG_XEN */
    7.28  
    7.29  /*
    7.30   * Default implementations for the irq-descriptor API:
     8.1 --- a/linux-2.6-xen-sparse/include/asm-ia64/irq.h	Tue May 23 08:56:13 2006 -0600
     8.2 +++ b/linux-2.6-xen-sparse/include/asm-ia64/irq.h	Tue May 23 09:17:57 2006 -0600
     8.3 @@ -11,8 +11,39 @@
     8.4   * 02/29/00     D.Mosberger	moved most things into hw_irq.h
     8.5   */
     8.6  
     8.7 +#ifndef CONFIG_XEN
     8.8  #define NR_IRQS		256
     8.9  #define NR_IRQ_VECTORS	NR_IRQS
    8.10 +#else
    8.11 +/*
    8.12 + * The flat IRQ space is divided into two regions:
    8.13 + *  1. A one-to-one mapping of real physical IRQs. This space is only used
    8.14 + *     if we have physical device-access privilege. This region is at the 
    8.15 + *     start of the IRQ space so that existing device drivers do not need
    8.16 + *     to be modified to translate physical IRQ numbers into our IRQ space.
    8.17 + *  3. A dynamic mapping of inter-domain and Xen-sourced virtual IRQs. These
    8.18 + *     are bound using the provided bind/unbind functions.
    8.19 + */
    8.20 +
    8.21 +#define PIRQ_BASE		0
    8.22 +#define NR_PIRQS		256
    8.23 +
    8.24 +#define DYNIRQ_BASE		(PIRQ_BASE + NR_PIRQS)
    8.25 +#define NR_DYNIRQS		256
    8.26 +
    8.27 +#define NR_IRQS			(NR_PIRQS + NR_DYNIRQS)
    8.28 +#define NR_IRQ_VECTORS		NR_IRQS
    8.29 +
    8.30 +#define pirq_to_irq(_x)		((_x) + PIRQ_BASE)
    8.31 +#define irq_to_pirq(_x)		((_x) - PIRQ_BASE)
    8.32 +
    8.33 +#define dynirq_to_irq(_x)	((_x) + DYNIRQ_BASE)
    8.34 +#define irq_to_dynirq(_x)	((_x) - DYNIRQ_BASE)
    8.35 +
    8.36 +#define RESCHEDULE_VECTOR	0
    8.37 +#define IPI_VECTOR		1
    8.38 +#define NR_IPIS			2
    8.39 +#endif /* CONFIG_XEN */
    8.40  
    8.41  /*
    8.42   * IRQ line status macro IRQ_PER_CPU is used
     9.1 --- a/xen/arch/ia64/linux-xen/entry.S	Tue May 23 08:56:13 2006 -0600
     9.2 +++ b/xen/arch/ia64/linux-xen/entry.S	Tue May 23 09:17:57 2006 -0600
     9.3 @@ -906,17 +906,12 @@ GLOBAL_ENTRY(ia64_leave_kernel)
     9.4      ;;
     9.5  	alloc loc0=ar.pfs,0,1,1,0
     9.6  	adds out0=16,r12
     9.7 -    adds r7 = PT(EML_UNAT)+16,r12
     9.8 -	;;
     9.9 -    ld8 r7 = [r7]
    9.10 +	adds r7 = PT(EML_UNAT)+16,r12
    9.11  	;;
    9.12 -#if 0
    9.13 -leave_kernel_self:
    9.14 -    cmp.ne p8,p0 = r0, r7
    9.15 -(p8) br.sptk.few leave_kernel_self
    9.16 -	;; 
    9.17 -#endif
    9.18 -(pUStk)	br.call.sptk.many b0=deliver_pending_interrupt
    9.19 +	ld8 r7 = [r7]
    9.20 +	;;
    9.21 +(pUStk)	br.call.sptk.many b0=reflect_event
    9.22 +//(pUStk)	br.call.sptk.many b0=deliver_pending_interrupt
    9.23      ;;
    9.24  	mov ar.pfs=loc0
    9.25  	mov ar.unat=r7  /* load eml_unat  */
    10.1 --- a/xen/arch/ia64/xen/hyperprivop.S	Tue May 23 08:56:13 2006 -0600
    10.2 +++ b/xen/arch/ia64/xen/hyperprivop.S	Tue May 23 09:17:57 2006 -0600
    10.3 @@ -106,6 +106,11 @@ GLOBAL_ENTRY(fast_hyperprivop)
    10.4  	or r23=r23,r24; or r21=r21,r22;;
    10.5  	or r20=r23,r21;;
    10.6  1:	// when we get to here r20=~=interrupts pending
    10.7 +	// Check pending event indication
    10.8 +(p7)	adds r20=XSI_PSR_I_ADDR_OFS-XSI_PSR_IC_OFS,r18;;
    10.9 +(p7)	ld8 r20=[r20];;
   10.10 +(p7)	adds r20=-1,r20;;
   10.11 +(p7)	ld1 r20=[r20];;
   10.12  
   10.13  	// HYPERPRIVOP_RFI?
   10.14  	cmp.eq p7,p6=HYPERPRIVOP_RFI,r17
    11.1 --- a/xen/arch/ia64/xen/irq.c	Tue May 23 08:56:13 2006 -0600
    11.2 +++ b/xen/arch/ia64/xen/irq.c	Tue May 23 09:17:57 2006 -0600
    11.3 @@ -70,12 +70,14 @@
    11.4   */
    11.5  irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned = {
    11.6  	[0 ... NR_IRQS-1] = {
    11.7 -		.status = IRQ_DISABLED | IRQ_GUEST,
    11.8 +		.status = IRQ_DISABLED,
    11.9  		.handler = &no_irq_type,
   11.10  		.lock = SPIN_LOCK_UNLOCKED
   11.11  	}
   11.12  };
   11.13  
   11.14 +void __do_IRQ_guest(int irq);
   11.15 +
   11.16  /*
   11.17   * Special irq handlers.
   11.18   */
   11.19 @@ -167,9 +169,7 @@ fastcall unsigned int __do_IRQ(unsigned 
   11.20  	spin_lock(&desc->lock);
   11.21  
   11.22  	if (desc->status & IRQ_GUEST) {
   11.23 -		/* __do_IRQ_guest(irq); */
   11.24 -		vcpu_pend_interrupt(dom0->vcpu[0],irq);
   11.25 -		vcpu_wake(dom0->vcpu[0]);
   11.26 +		__do_IRQ_guest(irq);
   11.27  		spin_unlock(&desc->lock);
   11.28  		return 1;
   11.29  	}