Index: 20071119-ia64/xen/arch/ia64/xen/ivt.S
===================================================================
--- 20071119-ia64.orig/xen/arch/ia64/xen/ivt.S	2007-11-25 22:01:47.000000000 -0700
+++ 20071119-ia64/xen/arch/ia64/xen/ivt.S	2007-11-25 22:25:27.000000000 -0700
@@ -108,6 +108,58 @@
 // out: r22 = address << 59
 //      r23 = rr[6]
 //	r24 = XEN_EFI_RID
+branch_on_xen_memory2:
+	extr.u r22=r16,59,5
+	mov b1=r26
+	;;
+	cmp.eq.or p8,p0=0x1e,r22        // address == 0xf...
+	mov b2=r27
+	;;
+(p8)	br.cond.spnt branch_on_xen_memory2_xen
+	mov r25=XEN_EFI_RID
+	;;
+
+	movl r17=(__DIRTY_BITS|_PAGE_AR_RWX)
+	movl r23=6
+	;;
+	cmp.eq p8,p0=0x18,r22		// address == 0xc...
+	mov r23=rr[r23]
+	;;
+(p8)	movl r17=(__DIRTY_BITS|_PAGE_AR_RWX|_PAGE_PL_PRIV|_PAGE_MA_UC)
+	cmp.eq.or p8,p0=0x1c,r22	// address == 0xe...
+	;;
+	cmp.eq.and p8,p0=r25,r23	// rr[6] == XEN_EFI_RID
+	;;
+(p8)	br.cond.spnt branch_on_xen_memory2_efi
+	br.cond.spnt b2
+	;;
+
+branch_on_xen_memory2_efi:
+	movl r20=(IA64_GRANULE_SHIFT << 2)
+	br.cond.spnt b1
+	;;
+
+branch_on_xen_memory2_xen:
+	extr.u r18=r16,XEN_VIRT_UC_BIT,1
+	movl r17=PAGE_KERNEL
+	;;
+	cmp.ne p8,p0=r0,r18
+	movl r20=(PAGE_SHIFT << 2)
+	;;
+(p8)	dep r17=-1,r17,4,1
+	br.cond.spnt b1
+	;;
+
+// If it is not a Xen address, handle it via page_fault.
+//    !( ((r22 == 0x18 || r22 == 0x1c) && rr[6] == XEN_EFI_RID) ||
+//	 r22 == 0x1e )
+// Note that rr[6] == XEN_EFI_RID implies rr[7] == XEN_EFI_RID
+//
+// in:  r26 = Branch if a XEN address
+//	r27 = Branch otherwise
+// out: r22 = address << 59
+//      r23 = rr[6]
+//	r24 = XEN_EFI_RID
 branch_on_xen_memory:
 	extr.u r22=r16,59,5
 	mov r25=XEN_EFI_RID
