[kernel] r7627 - in dists/trunk/linux-2.6/debian/patches: features/all/vserver features/all/xen series

Bastian Blank waldi at costa.debian.org
Thu Oct 19 09:08:51 UTC 2006


Author: waldi
Date: Thu Oct 19 09:08:49 2006
New Revision: 7627

Added:
   dists/trunk/linux-2.6/debian/patches/features/all/xen/fedora-36252.patch
      - copied, changed from r7471, /dists/trunk/linux-2.6/debian/patches/features/all/xen/fedora-36175.patch
Removed:
   dists/trunk/linux-2.6/debian/patches/features/all/vserver/vs2.0.2.1-t8.patch
   dists/trunk/linux-2.6/debian/patches/features/all/xen/fedora-36175.patch
Modified:
   dists/trunk/linux-2.6/debian/patches/series/1-extra
   dists/trunk/linux-2.6/debian/patches/series/2-extra
   dists/trunk/linux-2.6/debian/patches/series/3-extra

Log:
* debian/patches/features/all/vserver/vs2.0.2.1-t8.patch,
  debian/patches/features/all/xen/fedora-36175.patch: Remove.
* debian/patches/features/all/xen/fedora-36252.patch: Add.
* debian/patches/series/1-extra, debian/patches/series/2-extra,
  debian/patches/series/3-extra: Update.


Copied: dists/trunk/linux-2.6/debian/patches/features/all/xen/fedora-36252.patch (from r7471, /dists/trunk/linux-2.6/debian/patches/features/all/xen/fedora-36175.patch)
==============================================================================
--- /dists/trunk/linux-2.6/debian/patches/features/all/xen/fedora-36175.patch	(original)
+++ dists/trunk/linux-2.6/debian/patches/features/all/xen/fedora-36252.patch	Thu Oct 19 09:08:49 2006
@@ -1,5 +1,5 @@
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/boot-xen/Makefile linux-2.6.18-xen/arch/i386/boot-xen/Makefile
---- linux-2.6.18/arch/i386/boot-xen/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/boot-xen/Makefile linux-2.6.18-xen/arch/i386/boot-xen/Makefile
+--- linux-2.6.18.1/arch/i386/boot-xen/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/boot-xen/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,21 @@
 +
@@ -23,9 +23,9 @@
 +	install -m0664 .config $(INSTALL_ROOT)/boot/config-$(XINSTALL_NAME)$(INSTALL_SUFFIX)
 +	install -m0664 System.map $(INSTALL_ROOT)/boot/System.map-$(XINSTALL_NAME)$(INSTALL_SUFFIX)
 +	ln -f -s vmlinuz-$(XINSTALL_NAME)$(INSTALL_SUFFIX) $(INSTALL_ROOT)/boot/vmlinuz-$(VERSION).$(PATCHLEVEL)$(XENGUEST)$(INSTALL_SUFFIX)
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/Kconfig linux-2.6.18-xen/arch/i386/Kconfig
---- linux-2.6.18/arch/i386/Kconfig	2006-09-20 05:42:06.000000000 +0200
-+++ linux-2.6.18-xen/arch/i386/Kconfig	2006-09-04 16:31:00.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/Kconfig linux-2.6.18-xen/arch/i386/Kconfig
+--- linux-2.6.18.1/arch/i386/Kconfig	2006-09-20 05:42:06.000000000 +0200
++++ linux-2.6.18-xen/arch/i386/Kconfig	2006-09-22 16:38:35.000000000 +0200
 @@ -16,6 +16,7 @@
  
  config GENERIC_TIME
@@ -306,8 +306,8 @@
  config KTIME_SCALAR
  	bool
  	default y
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/Kconfig.cpu linux-2.6.18-xen/arch/i386/Kconfig.cpu
---- linux-2.6.18/arch/i386/Kconfig.cpu	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/Kconfig.cpu linux-2.6.18-xen/arch/i386/Kconfig.cpu
+--- linux-2.6.18.1/arch/i386/Kconfig.cpu	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/Kconfig.cpu	2006-09-04 16:31:00.000000000 +0200
 @@ -251,7 +251,7 @@
  
@@ -325,8 +325,8 @@
 -	depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1 || MGEODE_LX) && !X86_NUMAQ
 +	depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1 || MGEODE_LX) && !X86_NUMAQ && !X86_XEN
  	default y
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/Kconfig.debug linux-2.6.18-xen/arch/i386/Kconfig.debug
---- linux-2.6.18/arch/i386/Kconfig.debug	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/Kconfig.debug linux-2.6.18-xen/arch/i386/Kconfig.debug
+--- linux-2.6.18.1/arch/i386/Kconfig.debug	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/Kconfig.debug	2006-09-04 16:31:00.000000000 +0200
 @@ -79,6 +79,7 @@
  config DOUBLEFAULT
@@ -336,8 +336,8 @@
  	help
            This option allows trapping of rare doublefault exceptions that
            would otherwise cause a system to silently reboot. Disabling this
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/acpi/boot-xen.c linux-2.6.18-xen/arch/i386/kernel/acpi/boot-xen.c
---- linux-2.6.18/arch/i386/kernel/acpi/boot-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/acpi/boot-xen.c linux-2.6.18-xen/arch/i386/kernel/acpi/boot-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/acpi/boot-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/acpi/boot-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,1168 @@
 +/*
@@ -1508,8 +1508,8 @@
 +
 +	return 0;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/acpi/Makefile linux-2.6.18-xen/arch/i386/kernel/acpi/Makefile
---- linux-2.6.18/arch/i386/kernel/acpi/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/acpi/Makefile linux-2.6.18-xen/arch/i386/kernel/acpi/Makefile
+--- linux-2.6.18.1/arch/i386/kernel/acpi/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/acpi/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -6,3 +6,7 @@
  obj-y				+= cstate.o processor.o
@@ -1519,8 +1519,8 @@
 +include $(srctree)/scripts/Makefile.xen
 +obj-y := $(call cherrypickxen, $(obj-y), $(src))
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/alternative.c linux-2.6.18-xen/arch/i386/kernel/alternative.c
---- linux-2.6.18/arch/i386/kernel/alternative.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/alternative.c linux-2.6.18-xen/arch/i386/kernel/alternative.c
+--- linux-2.6.18.1/arch/i386/kernel/alternative.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/alternative.c	2006-09-04 16:31:00.000000000 +0200
 @@ -4,7 +4,11 @@
  #include <asm/alternative.h>
@@ -1546,8 +1546,8 @@
  			DPRINTK("%s: vsyscall fixup: %p => %p\n",
  				__FUNCTION__, a->instr, instr);
  		}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/apic-xen.c linux-2.6.18-xen/arch/i386/kernel/apic-xen.c
---- linux-2.6.18/arch/i386/kernel/apic-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/apic-xen.c linux-2.6.18-xen/arch/i386/kernel/apic-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/apic-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/apic-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,160 @@
 +/*
@@ -1710,8 +1710,8 @@
 +
 +	return 0;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/asm-offsets.c linux-2.6.18-xen/arch/i386/kernel/asm-offsets.c
---- linux-2.6.18/arch/i386/kernel/asm-offsets.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/asm-offsets.c linux-2.6.18-xen/arch/i386/kernel/asm-offsets.c
+--- linux-2.6.18.1/arch/i386/kernel/asm-offsets.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/asm-offsets.c	2006-09-04 16:31:00.000000000 +0200
 @@ -66,9 +66,14 @@
  	OFFSET(pbe_orig_address, pbe, orig_address);
@@ -1729,8 +1729,8 @@
  
  	DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
  	DEFINE(VDSO_PRELINK, VDSO_PRELINK);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/cpu/common-xen.c linux-2.6.18-xen/arch/i386/kernel/cpu/common-xen.c
---- linux-2.6.18/arch/i386/kernel/cpu/common-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/cpu/common-xen.c linux-2.6.18-xen/arch/i386/kernel/cpu/common-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/cpu/common-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/cpu/common-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,739 @@
 +#include <linux/init.h>
@@ -2472,8 +2472,8 @@
 +	per_cpu(cpu_tlbstate, cpu).active_mm = &init_mm;
 +}
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/cpu/Makefile linux-2.6.18-xen/arch/i386/kernel/cpu/Makefile
---- linux-2.6.18/arch/i386/kernel/cpu/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/cpu/Makefile linux-2.6.18-xen/arch/i386/kernel/cpu/Makefile
+--- linux-2.6.18.1/arch/i386/kernel/cpu/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/cpu/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -17,3 +17,8 @@
  
@@ -2484,8 +2484,8 @@
 +include $(srctree)/scripts/Makefile.xen
 +obj-y := $(call cherrypickxen, $(obj-y), $(src))
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/cpu/mtrr/main-xen.c linux-2.6.18-xen/arch/i386/kernel/cpu/mtrr/main-xen.c
---- linux-2.6.18/arch/i386/kernel/cpu/mtrr/main-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/cpu/mtrr/main-xen.c linux-2.6.18-xen/arch/i386/kernel/cpu/mtrr/main-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/cpu/mtrr/main-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/cpu/mtrr/main-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,197 @@
 +#include <linux/init.h>
@@ -2685,8 +2685,8 @@
 +}
 +
 +subsys_initcall(mtrr_init);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/cpu/mtrr/Makefile linux-2.6.18-xen/arch/i386/kernel/cpu/mtrr/Makefile
---- linux-2.6.18/arch/i386/kernel/cpu/mtrr/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/cpu/mtrr/Makefile linux-2.6.18-xen/arch/i386/kernel/cpu/mtrr/Makefile
+--- linux-2.6.18.1/arch/i386/kernel/cpu/mtrr/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/cpu/mtrr/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -3,3 +3,10 @@
  obj-y		+= cyrix.o
@@ -2699,14 +2699,14 @@
 +obj-y := $(call filterxen, $(obj-y), $(n-obj-xen))
 +obj-y := $(call cherrypickxen, $(obj-y))
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/early_printk-xen.c linux-2.6.18-xen/arch/i386/kernel/early_printk-xen.c
---- linux-2.6.18/arch/i386/kernel/early_printk-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/early_printk-xen.c linux-2.6.18-xen/arch/i386/kernel/early_printk-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/early_printk-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/early_printk-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,2 @@
 +
 +#include "../../x86_64/kernel/early_printk-xen.c"
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/entry.S linux-2.6.18-xen/arch/i386/kernel/entry.S
---- linux-2.6.18/arch/i386/kernel/entry.S	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/entry.S linux-2.6.18-xen/arch/i386/kernel/entry.S
+--- linux-2.6.18.1/arch/i386/kernel/entry.S	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/entry.S	2006-09-21 01:33:31.000000000 +0200
 @@ -269,7 +269,7 @@
  	CFI_STARTPROC simple
@@ -2735,8 +2735,8 @@
  	pushfl;					\
  	pushl $__KERNEL_CS;			\
  	pushl $sysenter_past_esp
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/entry-xen.S linux-2.6.18-xen/arch/i386/kernel/entry-xen.S
---- linux-2.6.18/arch/i386/kernel/entry-xen.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/entry-xen.S linux-2.6.18-xen/arch/i386/kernel/entry-xen.S
+--- linux-2.6.18.1/arch/i386/kernel/entry-xen.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/entry-xen.S	2006-09-21 01:33:31.000000000 +0200
 @@ -0,0 +1,1213 @@
 +/*
@@ -3952,8 +3952,8 @@
 +#include "syscall_table.S"
 +
 +syscall_table_size=(.-sys_call_table)
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/fixup.c linux-2.6.18-xen/arch/i386/kernel/fixup.c
---- linux-2.6.18/arch/i386/kernel/fixup.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/fixup.c linux-2.6.18-xen/arch/i386/kernel/fixup.c
+--- linux-2.6.18.1/arch/i386/kernel/fixup.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/fixup.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,92 @@
 +/******************************************************************************
@@ -4048,8 +4048,8 @@
 +	return 0;
 +}
 +__initcall(fixup_init);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/head-xen.S linux-2.6.18-xen/arch/i386/kernel/head-xen.S
---- linux-2.6.18/arch/i386/kernel/head-xen.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/head-xen.S linux-2.6.18-xen/arch/i386/kernel/head-xen.S
+--- linux-2.6.18.1/arch/i386/kernel/head-xen.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/head-xen.S	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,200 @@
 +
@@ -4252,8 +4252,8 @@
 +	ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,       .asciz, "no")
 +#endif
 +	ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz, "generic")
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/init_task-xen.c linux-2.6.18-xen/arch/i386/kernel/init_task-xen.c
---- linux-2.6.18/arch/i386/kernel/init_task-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/init_task-xen.c linux-2.6.18-xen/arch/i386/kernel/init_task-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/init_task-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/init_task-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,51 @@
 +#include <linux/mm.h>
@@ -4307,8 +4307,8 @@
 +DEFINE_PER_CPU(struct tss_struct, init_tss) ____cacheline_internodealigned_in_smp = INIT_TSS;
 +#endif
 +
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/io_apic-xen.c linux-2.6.18-xen/arch/i386/kernel/io_apic-xen.c
---- linux-2.6.18/arch/i386/kernel/io_apic-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/io_apic-xen.c linux-2.6.18-xen/arch/i386/kernel/io_apic-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/io_apic-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/io_apic-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,2771 @@
 +/*
@@ -7082,8 +7082,8 @@
 +}
 +
 +#endif /* CONFIG_ACPI */
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/ioport-xen.c linux-2.6.18-xen/arch/i386/kernel/ioport-xen.c
---- linux-2.6.18/arch/i386/kernel/ioport-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/ioport-xen.c linux-2.6.18-xen/arch/i386/kernel/ioport-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/ioport-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/ioport-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,121 @@
 +/*
@@ -7207,8 +7207,8 @@
 +	set_iopl_mask(t->iopl);
 +	return 0;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/irq-xen.c linux-2.6.18-xen/arch/i386/kernel/irq-xen.c
---- linux-2.6.18/arch/i386/kernel/irq-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/irq-xen.c linux-2.6.18-xen/arch/i386/kernel/irq-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/irq-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/irq-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,324 @@
 +/*
@@ -7535,8 +7535,8 @@
 +}
 +#endif
 +
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/ldt-xen.c linux-2.6.18-xen/arch/i386/kernel/ldt-xen.c
---- linux-2.6.18/arch/i386/kernel/ldt-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/ldt-xen.c linux-2.6.18-xen/arch/i386/kernel/ldt-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/ldt-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/ldt-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,270 @@
 +/*
@@ -7809,8 +7809,8 @@
 +	}
 +	return ret;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/Makefile linux-2.6.18-xen/arch/i386/kernel/Makefile
---- linux-2.6.18/arch/i386/kernel/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/Makefile linux-2.6.18-xen/arch/i386/kernel/Makefile
+--- linux-2.6.18.1/arch/i386/kernel/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/Makefile	2006-09-21 01:33:31.000000000 +0200
 @@ -44,6 +44,12 @@
  
@@ -7855,8 +7855,8 @@
 +obj-y := $(call cherrypickxen, $(obj-y))
 +extra-y := $(call cherrypickxen, $(extra-y))
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/microcode-xen.c linux-2.6.18-xen/arch/i386/kernel/microcode-xen.c
---- linux-2.6.18/arch/i386/kernel/microcode-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/microcode-xen.c linux-2.6.18-xen/arch/i386/kernel/microcode-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/microcode-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/microcode-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,147 @@
 +/*
@@ -8006,8 +8006,8 @@
 +module_init(microcode_init)
 +module_exit(microcode_exit)
 +MODULE_ALIAS_MISCDEV(MICROCODE_MINOR);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/mpparse-xen.c linux-2.6.18-xen/arch/i386/kernel/mpparse-xen.c
---- linux-2.6.18/arch/i386/kernel/mpparse-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/mpparse-xen.c linux-2.6.18-xen/arch/i386/kernel/mpparse-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/mpparse-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/mpparse-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,1185 @@
 +/*
@@ -9195,8 +9195,8 @@
 +
 +#endif /* CONFIG_X86_IO_APIC */
 +#endif /* CONFIG_ACPI */
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/pci-dma-xen.c linux-2.6.18-xen/arch/i386/kernel/pci-dma-xen.c
---- linux-2.6.18/arch/i386/kernel/pci-dma-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/pci-dma-xen.c linux-2.6.18-xen/arch/i386/kernel/pci-dma-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/pci-dma-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/pci-dma-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,379 @@
 +/*
@@ -9578,8 +9578,8 @@
 +		swiotlb_sync_single_for_device(dev, dma_handle, size, direction);
 +}
 +EXPORT_SYMBOL(dma_sync_single_for_device);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/process-xen.c linux-2.6.18-xen/arch/i386/kernel/process-xen.c
---- linux-2.6.18/arch/i386/kernel/process-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/process-xen.c linux-2.6.18-xen/arch/i386/kernel/process-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/process-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/process-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,812 @@
 +/*
@@ -10394,8 +10394,8 @@
 +		sp -= get_random_int() % 8192;
 +	return sp & ~0xf;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/quirks-xen.c linux-2.6.18-xen/arch/i386/kernel/quirks-xen.c
---- linux-2.6.18/arch/i386/kernel/quirks-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/quirks-xen.c linux-2.6.18-xen/arch/i386/kernel/quirks-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/quirks-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/quirks-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,47 @@
 +/*
@@ -10445,10 +10445,10 @@
 +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_E7525_MCH,	quirk_intel_irqbalance);
 +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_E7520_MCH,	quirk_intel_irqbalance);
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/setup-xen.c linux-2.6.18-xen/arch/i386/kernel/setup-xen.c
---- linux-2.6.18/arch/i386/kernel/setup-xen.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/arch/i386/kernel/setup-xen.c	2006-09-21 01:33:31.000000000 +0200
-@@ -0,0 +1,1830 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/setup-xen.c linux-2.6.18-xen/arch/i386/kernel/setup-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/setup-xen.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/i386/kernel/setup-xen.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,1832 @@
 +/*
 + *  linux/arch/i386/kernel/setup.c
 + *
@@ -10606,6 +10606,9 @@
 +#endif
 +struct e820map e820;
 +static void __init e820_setup_gap(struct e820entry *e820, int nr_map);
++#ifdef CONFIG_XEN
++struct e820map machine_e820;
++#endif
 +
 +extern void early_cpu_init(void);
 +extern void generic_apic_probe(char *);
@@ -11834,13 +11837,15 @@
 +#ifdef CONFIG_XEN_PRIVILEGED_GUEST
 +	struct xen_memory_map memmap;
 +
-+	map = (struct e820entry *)__get_free_page(GFP_ATOMIC);
-+	nr_map = E820MAX;
-+
++	map = machine_e820.map;
 +	memmap.nr_entries = E820MAX;
++
 +	set_xen_guest_handle(memmap.buffer, map);
 +
-+	BUG_ON(HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap));
++	if(HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap))
++		BUG();
++	machine_e820.nr_map = memmap.nr_entries;
++	nr_map = memmap.nr_entries;
 +	e820_setup_gap(map, memmap.nr_entries);
 +#endif
 +
@@ -11879,9 +11884,6 @@
 +#endif
 +		}
 +	}
-+#ifdef CONFIG_XEN
-+	free_page((unsigned long)map);
-+#endif
 +}
 +
 +/*
@@ -12279,8 +12281,8 @@
 + * c-basic-offset:8
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/smp-xen.c linux-2.6.18-xen/arch/i386/kernel/smp-xen.c
---- linux-2.6.18/arch/i386/kernel/smp-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/smp-xen.c linux-2.6.18-xen/arch/i386/kernel/smp-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/smp-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/smp-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,624 @@
 +/*
@@ -12907,8 +12909,8 @@
 +	return IRQ_HANDLED;
 +}
 +
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/swiotlb.c linux-2.6.18-xen/arch/i386/kernel/swiotlb.c
---- linux-2.6.18/arch/i386/kernel/swiotlb.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/swiotlb.c linux-2.6.18-xen/arch/i386/kernel/swiotlb.c
+--- linux-2.6.18.1/arch/i386/kernel/swiotlb.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/swiotlb.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,672 @@
 +/*
@@ -13583,8 +13585,8 @@
 +EXPORT_SYMBOL(swiotlb_unmap_page);
 +EXPORT_SYMBOL(swiotlb_dma_mapping_error);
 +EXPORT_SYMBOL(swiotlb_dma_supported);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/sysenter.c linux-2.6.18-xen/arch/i386/kernel/sysenter.c
---- linux-2.6.18/arch/i386/kernel/sysenter.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/sysenter.c linux-2.6.18-xen/arch/i386/kernel/sysenter.c
+--- linux-2.6.18.1/arch/i386/kernel/sysenter.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/sysenter.c	2006-09-04 16:31:00.000000000 +0200
 @@ -23,6 +23,10 @@
  #include <asm/pgtable.h>
@@ -13645,8 +13647,8 @@
  
  	if (!boot_cpu_has(X86_FEATURE_SEP)) {
  		memcpy(syscall_page,
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/time-xen.c linux-2.6.18-xen/arch/i386/kernel/time-xen.c
---- linux-2.6.18/arch/i386/kernel/time-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/time-xen.c linux-2.6.18-xen/arch/i386/kernel/time-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/time-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/time-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,1101 @@
 +/*
@@ -14750,8 +14752,8 @@
 +	return 0;
 +}
 +__initcall(xen_sysctl_init);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/traps.c linux-2.6.18-xen/arch/i386/kernel/traps.c
---- linux-2.6.18/arch/i386/kernel/traps.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/traps.c linux-2.6.18-xen/arch/i386/kernel/traps.c
+--- linux-2.6.18.1/arch/i386/kernel/traps.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/traps.c	2006-09-04 16:31:00.000000000 +0200
 @@ -642,18 +642,11 @@
  
@@ -14773,8 +14775,8 @@
  }
  
  static void unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/traps-xen.c linux-2.6.18-xen/arch/i386/kernel/traps-xen.c
---- linux-2.6.18/arch/i386/kernel/traps-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/traps-xen.c linux-2.6.18-xen/arch/i386/kernel/traps-xen.c
+--- linux-2.6.18.1/arch/i386/kernel/traps-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/traps-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,1184 @@
 +/*
@@ -15961,8 +15963,8 @@
 +}
 +__setup("call_trace=", call_trace_setup);
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/tsc.c linux-2.6.18-xen/arch/i386/kernel/tsc.c
---- linux-2.6.18/arch/i386/kernel/tsc.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/tsc.c linux-2.6.18-xen/arch/i386/kernel/tsc.c
+--- linux-2.6.18.1/arch/i386/kernel/tsc.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/tsc.c	2006-09-04 16:31:00.000000000 +0200
 @@ -101,6 +101,7 @@
  	return (cyc * cyc2ns_scale) >> CYC2NS_SCALE_FACTOR;
@@ -15980,8 +15982,8 @@
  
  static unsigned long calculate_cpu_khz(void)
  {
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/vm86.c linux-2.6.18-xen/arch/i386/kernel/vm86.c
---- linux-2.6.18/arch/i386/kernel/vm86.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/vm86.c linux-2.6.18-xen/arch/i386/kernel/vm86.c
+--- linux-2.6.18.1/arch/i386/kernel/vm86.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/vm86.c	2006-09-04 16:31:00.000000000 +0200
 @@ -97,7 +97,9 @@
  struct pt_regs * FASTCALL(save_v86_state(struct kernel_vm86_regs * regs));
@@ -16037,8 +16039,8 @@
  
  	tsk->thread.screen_bitmap = info->screen_bitmap;
  	if (info->flags & VM86_SCREEN_BITMAP)
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/vmlinux.lds.S linux-2.6.18-xen/arch/i386/kernel/vmlinux.lds.S
---- linux-2.6.18/arch/i386/kernel/vmlinux.lds.S	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/vmlinux.lds.S linux-2.6.18-xen/arch/i386/kernel/vmlinux.lds.S
+--- linux-2.6.18.1/arch/i386/kernel/vmlinux.lds.S	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/kernel/vmlinux.lds.S	2006-09-04 16:31:00.000000000 +0200
 @@ -13,6 +13,12 @@
  OUTPUT_ARCH(i386)
@@ -16078,8 +16080,8 @@
 +
 +  NOTES
  }
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/kernel/vsyscall-note-xen.S linux-2.6.18-xen/arch/i386/kernel/vsyscall-note-xen.S
---- linux-2.6.18/arch/i386/kernel/vsyscall-note-xen.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/kernel/vsyscall-note-xen.S linux-2.6.18-xen/arch/i386/kernel/vsyscall-note-xen.S
+--- linux-2.6.18.1/arch/i386/kernel/vsyscall-note-xen.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/kernel/vsyscall-note-xen.S	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,32 @@
 +/*
@@ -16114,8 +16116,8 @@
 +NOTE_KERNELCAP_BEGIN(1, 1)
 +NOTE_KERNELCAP(1, "nosegneg")  /* Change 1 back to 0 when glibc is fixed! */
 +NOTE_KERNELCAP_END
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/lib/delay.c linux-2.6.18-xen/arch/i386/lib/delay.c
---- linux-2.6.18/arch/i386/lib/delay.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/lib/delay.c linux-2.6.18-xen/arch/i386/lib/delay.c
+--- linux-2.6.18.1/arch/i386/lib/delay.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/lib/delay.c	2006-09-04 16:31:00.000000000 +0200
 @@ -61,6 +61,7 @@
  	delay_fn = delay_tsc;
@@ -16134,8 +16136,8 @@
  void __delay(unsigned long loops)
  {
  	delay_fn(loops);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/mach-xen/irqflags.c linux-2.6.18-xen/arch/i386/mach-xen/irqflags.c
---- linux-2.6.18/arch/i386/mach-xen/irqflags.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/mach-xen/irqflags.c linux-2.6.18-xen/arch/i386/mach-xen/irqflags.c
+--- linux-2.6.18.1/arch/i386/mach-xen/irqflags.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/mach-xen/irqflags.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,99 @@
 +#include <linux/module.h>
@@ -16237,8 +16239,8 @@
 +	return flags;
 +}
 +EXPORT_SYMBOL(__raw_local_irq_save);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/mach-xen/Makefile linux-2.6.18-xen/arch/i386/mach-xen/Makefile
---- linux-2.6.18/arch/i386/mach-xen/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/mach-xen/Makefile linux-2.6.18-xen/arch/i386/mach-xen/Makefile
+--- linux-2.6.18.1/arch/i386/mach-xen/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/mach-xen/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,5 @@
 +#
@@ -16246,8 +16248,8 @@
 +#
 +
 +obj-y				:= setup.o irqflags.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/mach-xen/setup.c linux-2.6.18-xen/arch/i386/mach-xen/setup.c
---- linux-2.6.18/arch/i386/mach-xen/setup.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/mach-xen/setup.c linux-2.6.18-xen/arch/i386/mach-xen/setup.c
+--- linux-2.6.18.1/arch/i386/mach-xen/setup.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/mach-xen/setup.c	2006-09-21 01:33:31.000000000 +0200
 @@ -0,0 +1,154 @@
 +/*
@@ -16404,8 +16406,8 @@
 +void __init pre_setup_arch_hook(void)
 +{
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/Makefile linux-2.6.18-xen/arch/i386/Makefile
---- linux-2.6.18/arch/i386/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/Makefile linux-2.6.18-xen/arch/i386/Makefile
+--- linux-2.6.18.1/arch/i386/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -48,6 +48,11 @@
  
@@ -16463,8 +16465,8 @@
  	       arch/$(ARCH)/boot/image.iso \
  	       arch/$(ARCH)/boot/mtools.conf
 +CLEAN_FILES += vmlinuz vmlinux-stripped
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/mm/fault-xen.c linux-2.6.18-xen/arch/i386/mm/fault-xen.c
---- linux-2.6.18/arch/i386/mm/fault-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/mm/fault-xen.c linux-2.6.18-xen/arch/i386/mm/fault-xen.c
+--- linux-2.6.18.1/arch/i386/mm/fault-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/mm/fault-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,770 @@
 +/*
@@ -17237,8 +17239,8 @@
 +	}
 +}
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/mm/highmem-xen.c linux-2.6.18-xen/arch/i386/mm/highmem-xen.c
---- linux-2.6.18/arch/i386/mm/highmem-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/mm/highmem-xen.c linux-2.6.18-xen/arch/i386/mm/highmem-xen.c
+--- linux-2.6.18.1/arch/i386/mm/highmem-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/mm/highmem-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,133 @@
 +#include <linux/highmem.h>
@@ -17374,8 +17376,8 @@
 +EXPORT_SYMBOL(kmap_atomic);
 +EXPORT_SYMBOL(kunmap_atomic);
 +EXPORT_SYMBOL(kmap_atomic_to_page);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/mm/hypervisor.c linux-2.6.18-xen/arch/i386/mm/hypervisor.c
---- linux-2.6.18/arch/i386/mm/hypervisor.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/mm/hypervisor.c linux-2.6.18-xen/arch/i386/mm/hypervisor.c
+--- linux-2.6.18.1/arch/i386/mm/hypervisor.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/mm/hypervisor.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,457 @@
 +/******************************************************************************
@@ -17835,8 +17837,8 @@
 +		mach_lp, (u64)entry_a | ((u64)entry_b<<32));
 +}
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/mm/init-xen.c linux-2.6.18-xen/arch/i386/mm/init-xen.c
---- linux-2.6.18/arch/i386/mm/init-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/mm/init-xen.c linux-2.6.18-xen/arch/i386/mm/init-xen.c
+--- linux-2.6.18.1/arch/i386/mm/init-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/mm/init-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,851 @@
 +/*
@@ -18690,10 +18692,10 @@
 +}
 +#endif
 +
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/mm/ioremap-xen.c linux-2.6.18-xen/arch/i386/mm/ioremap-xen.c
---- linux-2.6.18/arch/i386/mm/ioremap-xen.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/arch/i386/mm/ioremap-xen.c	2006-09-04 16:31:00.000000000 +0200
-@@ -0,0 +1,439 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/mm/ioremap-xen.c linux-2.6.18-xen/arch/i386/mm/ioremap-xen.c
+--- linux-2.6.18.1/arch/i386/mm/ioremap-xen.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/i386/mm/ioremap-xen.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,443 @@
 +/*
 + * arch/i386/mm/ioremap.c
 + *
@@ -18725,6 +18727,8 @@
 +{
 +	mmu_update_t **v = (mmu_update_t **)data;
 +
++	BUG_ON(!pte_none(*pte));
++
 +	(*v)->ptr = ((u64)pfn_to_mfn(page_to_pfn(pmd_page)) <<
 +		     PAGE_SHIFT) | ((unsigned long)pte & ~PAGE_MASK);
 +	(*v)++;
@@ -18806,12 +18810,14 @@
 +			   pgprot_t prot,
 +			   domid_t  domid)
 +{
-+	/* Same as remap_pfn_range(). */
-+	vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
++	if (xen_feature(XENFEAT_auto_translated_physmap))
++		return remap_pfn_range(vma, address, mfn, size, prot);
 +
 +	if (domid == DOMID_SELF)
 +		return -EINVAL;
 +
++	vma->vm_flags |= VM_IO | VM_RESERVED;
++
 +	vma->vm_mm->context.has_foreign_mappings = 1;
 +
 +	return __direct_remap_pfn_range(
@@ -19133,8 +19139,8 @@
 +		--nrpages;
 +	}
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/mm/Makefile linux-2.6.18-xen/arch/i386/mm/Makefile
---- linux-2.6.18/arch/i386/mm/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/mm/Makefile linux-2.6.18-xen/arch/i386/mm/Makefile
+--- linux-2.6.18.1/arch/i386/mm/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/mm/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -8,3 +8,11 @@
  obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
@@ -19148,8 +19154,8 @@
 +
 +obj-y := $(call cherrypickxen, $(obj-y))
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/mm/pageattr.c linux-2.6.18-xen/arch/i386/mm/pageattr.c
---- linux-2.6.18/arch/i386/mm/pageattr.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/mm/pageattr.c linux-2.6.18-xen/arch/i386/mm/pageattr.c
+--- linux-2.6.18.1/arch/i386/mm/pageattr.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/mm/pageattr.c	2006-09-04 16:31:00.000000000 +0200
 @@ -84,7 +84,7 @@
  	unsigned long flags;
@@ -19160,8 +19166,8 @@
  		return;
  
  	spin_lock_irqsave(&pgd_lock, flags);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/mm/pgtable-xen.c linux-2.6.18-xen/arch/i386/mm/pgtable-xen.c
---- linux-2.6.18/arch/i386/mm/pgtable-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/mm/pgtable-xen.c linux-2.6.18-xen/arch/i386/mm/pgtable-xen.c
+--- linux-2.6.18.1/arch/i386/mm/pgtable-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/mm/pgtable-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,699 @@
 +/*
@@ -19863,8 +19869,8 @@
 +	    !mm->context.has_foreign_mappings)
 +		mm_unpin(mm);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/oprofile/Makefile linux-2.6.18-xen/arch/i386/oprofile/Makefile
---- linux-2.6.18/arch/i386/oprofile/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/oprofile/Makefile linux-2.6.18-xen/arch/i386/oprofile/Makefile
+--- linux-2.6.18.1/arch/i386/oprofile/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/oprofile/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -6,7 +6,11 @@
  		oprofilefs.o oprofile_stats.o  \
@@ -19878,8 +19884,8 @@
  					   op_model_ppro.o op_model_p4.o
  oprofile-$(CONFIG_X86_IO_APIC)		+= nmi_timer_int.o
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/oprofile/xenoprof.c linux-2.6.18-xen/arch/i386/oprofile/xenoprof.c
---- linux-2.6.18/arch/i386/oprofile/xenoprof.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/oprofile/xenoprof.c linux-2.6.18-xen/arch/i386/oprofile/xenoprof.c
+--- linux-2.6.18.1/arch/i386/oprofile/xenoprof.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/oprofile/xenoprof.c	2006-09-21 01:33:31.000000000 +0200
 @@ -0,0 +1,584 @@
 +/**
@@ -20466,8 +20472,8 @@
 +        }
 +
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/pci/irq-xen.c linux-2.6.18-xen/arch/i386/pci/irq-xen.c
---- linux-2.6.18/arch/i386/pci/irq-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/pci/irq-xen.c linux-2.6.18-xen/arch/i386/pci/irq-xen.c
+--- linux-2.6.18.1/arch/i386/pci/irq-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/pci/irq-xen.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,1206 @@
 +/*
@@ -21676,8 +21682,8 @@
 +
 +	return count;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/pci/Makefile linux-2.6.18-xen/arch/i386/pci/Makefile
---- linux-2.6.18/arch/i386/pci/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/pci/Makefile linux-2.6.18-xen/arch/i386/pci/Makefile
+--- linux-2.6.18.1/arch/i386/pci/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/pci/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -4,6 +4,10 @@
  obj-$(CONFIG_PCI_MMCONFIG)	+= mmconfig.o direct.o
@@ -21699,8 +21705,8 @@
 +include $(srctree)/scripts/Makefile.xen
 +obj-y := $(call cherrypickxen, $(obj-y))
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/pci/pcifront.c linux-2.6.18-xen/arch/i386/pci/pcifront.c
---- linux-2.6.18/arch/i386/pci/pcifront.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/pci/pcifront.c linux-2.6.18-xen/arch/i386/pci/pcifront.c
+--- linux-2.6.18.1/arch/i386/pci/pcifront.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/i386/pci/pcifront.c	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,55 @@
 +/*
@@ -21758,8 +21764,8 @@
 +}
 +
 +arch_initcall(pcifront_x86_stub_init);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/i386/power/Makefile linux-2.6.18-xen/arch/i386/power/Makefile
---- linux-2.6.18/arch/i386/power/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/i386/power/Makefile linux-2.6.18-xen/arch/i386/power/Makefile
+--- linux-2.6.18.1/arch/i386/power/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/i386/power/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -1,2 +1,4 @@
 -obj-$(CONFIG_PM)		+= cpu.o
@@ -21767,8 +21773,8 @@
 +obj-$(CONFIG_SOFTWARE_SUSPEND)	+= cpu.o
 +obj-$(CONFIG_ACPI_SLEEP)	+= cpu.o
  obj-$(CONFIG_SOFTWARE_SUSPEND)	+= swsusp.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/dig/setup.c linux-2.6.18-xen/arch/ia64/dig/setup.c
---- linux-2.6.18/arch/ia64/dig/setup.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/dig/setup.c linux-2.6.18-xen/arch/ia64/dig/setup.c
+--- linux-2.6.18.1/arch/ia64/dig/setup.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/dig/setup.c	2006-09-21 01:33:31.000000000 +0200
 @@ -24,6 +24,8 @@
  #include <asm/machvec.h>
@@ -21799,8 +21805,8 @@
 +	xen_start_info->console.domU.evtchn = 0;
 +#endif
  }
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/hp/sim/Makefile linux-2.6.18-xen/arch/ia64/hp/sim/Makefile
---- linux-2.6.18/arch/ia64/hp/sim/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/hp/sim/Makefile linux-2.6.18-xen/arch/ia64/hp/sim/Makefile
+--- linux-2.6.18.1/arch/ia64/hp/sim/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/hp/sim/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -14,3 +14,5 @@
  obj-$(CONFIG_HP_SIMSERIAL) += simserial.o
@@ -21808,10 +21814,10 @@
  obj-$(CONFIG_HP_SIMSCSI) += simscsi.o
 +obj-$(CONFIG_XEN) += simserial.o
 +obj-$(CONFIG_XEN) += hpsim_console.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/Kconfig linux-2.6.18-xen/arch/ia64/Kconfig
---- linux-2.6.18/arch/ia64/Kconfig	2006-09-20 05:42:06.000000000 +0200
-+++ linux-2.6.18-xen/arch/ia64/Kconfig	2006-09-21 01:33:31.000000000 +0200
-@@ -58,6 +58,20 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/Kconfig linux-2.6.18-xen/arch/ia64/Kconfig
+--- linux-2.6.18.1/arch/ia64/Kconfig	2006-09-20 05:42:06.000000000 +0200
++++ linux-2.6.18-xen/arch/ia64/Kconfig	2006-10-17 15:01:58.000000000 +0200
+@@ -58,6 +58,34 @@
  	bool
  	default y
  
@@ -21829,10 +21835,24 @@
 +	help
 +	  vDSO paravirtualization
 +
++config XEN_IA64_EXPOSE_P2M
++	bool "Xen/IA64 exposure p2m table"
++	depends on XEN
++	default y
++	help
++	  expose p2m from xen
++
++config XEN_IA64_EXPOSE_P2M_USE_DTR
++	bool "Xen/IA64 map p2m table with dtr"
++	depends on XEN_IA64_EXPOSE_P2M
++	default y
++	help
++	  use dtr to map the exposed p2m table
++
  config SCHED_NO_NO_OMIT_FRAME_POINTER
  	bool
  	default y
-@@ -465,6 +479,21 @@
+@@ -465,6 +493,21 @@
  	bool
  	default PCI
  
@@ -21854,7 +21874,7 @@
  source "drivers/pci/pcie/Kconfig"
  
  source "drivers/pci/Kconfig"
-@@ -528,3 +557,34 @@
+@@ -528,3 +571,34 @@
  source "security/Kconfig"
  
  source "crypto/Kconfig"
@@ -21889,8 +21909,8 @@
 +endif
 +
 +source "drivers/xen/Kconfig"
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/kernel/asm-offsets.c linux-2.6.18-xen/arch/ia64/kernel/asm-offsets.c
---- linux-2.6.18/arch/ia64/kernel/asm-offsets.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/kernel/asm-offsets.c linux-2.6.18-xen/arch/ia64/kernel/asm-offsets.c
+--- linux-2.6.18.1/arch/ia64/kernel/asm-offsets.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/kernel/asm-offsets.c	2006-09-04 16:31:00.000000000 +0200
 @@ -268,4 +268,29 @@
  	DEFINE(IA64_TIME_SOURCE_MMIO64, TIME_SOURCE_MMIO64);
@@ -21922,8 +21942,8 @@
 +	DEFINE_MAPPED_REG_OFS(XSI_BANK1_R16_OFS, bank1_regs[0]);
 +#endif /* CONFIG_XEN */
  }
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/kernel/entry.S linux-2.6.18-xen/arch/ia64/kernel/entry.S
---- linux-2.6.18/arch/ia64/kernel/entry.S	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/kernel/entry.S linux-2.6.18-xen/arch/ia64/kernel/entry.S
+--- linux-2.6.18.1/arch/ia64/kernel/entry.S	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/kernel/entry.S	2006-09-21 01:33:31.000000000 +0200
 @@ -180,7 +180,7 @@
   *	called.  The code starting at .map relies on this.  The rest of the code
@@ -22044,8 +22064,8 @@
  	;;
  	mov ar.unat=r9
  	br.many b7
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/kernel/gate.lds.S linux-2.6.18-xen/arch/ia64/kernel/gate.lds.S
---- linux-2.6.18/arch/ia64/kernel/gate.lds.S	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/kernel/gate.lds.S linux-2.6.18-xen/arch/ia64/kernel/gate.lds.S
+--- linux-2.6.18.1/arch/ia64/kernel/gate.lds.S	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/kernel/gate.lds.S	2006-09-04 16:31:00.000000000 +0200
 @@ -43,6 +43,28 @@
  				    __start_gate_brl_fsys_bubble_down_patchlist = .;
@@ -22076,8 +22096,8 @@
    }									:readable
    .IA_64.unwind_info		: { *(.IA_64.unwind_info*) }
    .IA_64.unwind			: { *(.IA_64.unwind*) }			:readable :unwind
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/kernel/gate.S linux-2.6.18-xen/arch/ia64/kernel/gate.S
---- linux-2.6.18/arch/ia64/kernel/gate.S	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/kernel/gate.S linux-2.6.18-xen/arch/ia64/kernel/gate.S
+--- linux-2.6.18.1/arch/ia64/kernel/gate.S	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/kernel/gate.S	2006-09-04 16:31:00.000000000 +0200
 @@ -6,13 +6,15 @@
   * 	David Mosberger-Tang <davidm at hpl.hp.com>
@@ -22248,8 +22268,8 @@
  (p9)	mov r8=ENOSYS
  	FSYS_RETURN
  END(__kernel_syscall_via_epc)
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/kernel/head.S linux-2.6.18-xen/arch/ia64/kernel/head.S
---- linux-2.6.18/arch/ia64/kernel/head.S	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/kernel/head.S linux-2.6.18-xen/arch/ia64/kernel/head.S
+--- linux-2.6.18.1/arch/ia64/kernel/head.S	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/kernel/head.S	2006-09-21 01:33:31.000000000 +0200
 @@ -367,6 +367,12 @@
  	;;
@@ -22264,8 +22284,8 @@
  #ifdef CONFIG_SMP
  (isAP)	br.call.sptk.many rp=start_secondary
  .ret0:
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/kernel/iosapic.c linux-2.6.18-xen/arch/ia64/kernel/iosapic.c
---- linux-2.6.18/arch/ia64/kernel/iosapic.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/kernel/iosapic.c linux-2.6.18-xen/arch/ia64/kernel/iosapic.c
+--- linux-2.6.18.1/arch/ia64/kernel/iosapic.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/kernel/iosapic.c	2006-09-04 16:31:00.000000000 +0200
 @@ -159,6 +159,65 @@
  static int iosapic_kmalloc_ok;
@@ -22353,8 +22373,8 @@
  	if (pcat_compat) {
  		/*
  		 * Disable the compatibility mode interrupts (8259 style),
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/kernel/irq_ia64.c linux-2.6.18-xen/arch/ia64/kernel/irq_ia64.c
---- linux-2.6.18/arch/ia64/kernel/irq_ia64.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/kernel/irq_ia64.c linux-2.6.18-xen/arch/ia64/kernel/irq_ia64.c
+--- linux-2.6.18.1/arch/ia64/kernel/irq_ia64.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/kernel/irq_ia64.c	2006-09-04 16:31:00.000000000 +0200
 @@ -30,6 +30,9 @@
  #include <linux/smp_lock.h>
@@ -22658,8 +22678,8 @@
  #ifdef CONFIG_SMP
  	phys_cpu_id = cpu_physical_id(cpu);
  #else
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/kernel/pal.S linux-2.6.18-xen/arch/ia64/kernel/pal.S
---- linux-2.6.18/arch/ia64/kernel/pal.S	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/kernel/pal.S linux-2.6.18-xen/arch/ia64/kernel/pal.S
+--- linux-2.6.18.1/arch/ia64/kernel/pal.S	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/kernel/pal.S	2006-09-04 16:31:00.000000000 +0200
 @@ -16,6 +16,7 @@
  #include <asm/processor.h>
@@ -22687,8 +22707,8 @@
  
  /*
   * Make a PAL call using the stacked registers calling convention.
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/kernel/patch.c linux-2.6.18-xen/arch/ia64/kernel/patch.c
---- linux-2.6.18/arch/ia64/kernel/patch.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/kernel/patch.c linux-2.6.18-xen/arch/ia64/kernel/patch.c
+--- linux-2.6.18.1/arch/ia64/kernel/patch.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/kernel/patch.c	2006-09-04 16:31:00.000000000 +0200
 @@ -184,6 +184,73 @@
  	ia64_srlz_i();
@@ -22775,9 +22795,9 @@
  	ia64_patch_vtop(START(vtop), END(vtop));
  	ia64_patch_mckinley_e9(START(mckinley_e9), END(mckinley_e9));
  }
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/kernel/setup.c linux-2.6.18-xen/arch/ia64/kernel/setup.c
---- linux-2.6.18/arch/ia64/kernel/setup.c	2006-09-20 05:42:06.000000000 +0200
-+++ linux-2.6.18-xen/arch/ia64/kernel/setup.c	2006-09-04 16:31:00.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/kernel/setup.c linux-2.6.18-xen/arch/ia64/kernel/setup.c
+--- linux-2.6.18.1/arch/ia64/kernel/setup.c	2006-09-20 05:42:06.000000000 +0200
++++ linux-2.6.18-xen/arch/ia64/kernel/setup.c	2006-10-17 15:01:58.000000000 +0200
 @@ -60,6 +60,10 @@
  #include <asm/system.h>
  #include <asm/unistd.h>
@@ -22789,11 +22809,13 @@
  
  #if defined(CONFIG_SMP) && (IA64_CPU_SIZE > PAGE_SIZE)
  # error "struct cpuinfo_ia64 too big!"
-@@ -70,6 +74,22 @@
+@@ -70,6 +74,24 @@
  EXPORT_SYMBOL(__per_cpu_offset);
  #endif
  
 +#ifdef CONFIG_XEN
++unsigned long kernel_start_pa;
++
 +static int
 +xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
 +{
@@ -22812,7 +22834,7 @@
  extern void ia64_setup_printk_clock(void);
  
  DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info);
-@@ -176,15 +196,33 @@
+@@ -176,15 +198,33 @@
  	return 0;
  }
  
@@ -22847,7 +22869,7 @@
  				struct rsvd_region tmp;
  				tmp = rsvd_region[j];
  				rsvd_region[j] = rsvd_region[j + 1];
-@@ -192,6 +230,36 @@
+@@ -192,6 +232,36 @@
  			}
  		}
  	}
@@ -22884,7 +22906,7 @@
  }
  
  /*
-@@ -242,6 +310,14 @@
+@@ -242,6 +312,14 @@
  	rsvd_region[n].end   = (unsigned long) ia64_imva(_end);
  	n++;
  
@@ -22899,7 +22921,7 @@
  #ifdef CONFIG_BLK_DEV_INITRD
  	if (ia64_boot_param->initrd_start) {
  		rsvd_region[n].start = (unsigned long)__va(ia64_boot_param->initrd_start);
-@@ -333,6 +409,16 @@
+@@ -333,6 +411,16 @@
  {
  	int earlycons = 0;
  
@@ -22916,12 +22938,13 @@
  #ifdef CONFIG_SERIAL_SGI_L1_CONSOLE
  	{
  		extern int sn_serial_console_early_setup(void);
-@@ -402,6 +488,14 @@
+@@ -402,6 +490,15 @@
  {
  	unw_init();
  
 +#ifdef CONFIG_XEN
 +	if (is_running_on_xen()) {
++		kernel_start_pa = KERNEL_START - ia64_tpa(KERNEL_START);
 +		setup_xen_features();
 +		/* Register a call for panic conditions. */
 +		atomic_notifier_chain_register(&panic_notifier_list, &xen_panic_block);
@@ -22931,7 +22954,7 @@
  	ia64_patch_vtop((u64) __start___vtop_patchlist, (u64) __end___vtop_patchlist);
  
  	*cmdline_p = __va(ia64_boot_param->command_line);
-@@ -478,6 +572,23 @@
+@@ -478,6 +575,23 @@
  			conswitchp = &vga_con;
  # endif
  	}
@@ -22955,7 +22978,7 @@
  #endif
  
  	/* enable IA-64 Machine Check Abort Handling unless disabled */
-@@ -486,6 +597,9 @@
+@@ -486,6 +600,9 @@
  
  	platform_setup(cmdline_p);
  	paging_init();
@@ -22965,7 +22988,7 @@
  }
  
  /*
-@@ -870,6 +984,15 @@
+@@ -870,6 +987,15 @@
  	/* size of physical stacked register partition plus 8 bytes: */
  	__get_cpu_var(ia64_phys_stacked_size_p8) = num_phys_stacked*8 + 8;
  	platform_cpu_init();
@@ -22981,8 +23004,8 @@
  	pm_idle = default_idle;
  }
  
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/Makefile linux-2.6.18-xen/arch/ia64/Makefile
---- linux-2.6.18/arch/ia64/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/Makefile linux-2.6.18-xen/arch/ia64/Makefile
+--- linux-2.6.18.1/arch/ia64/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/Makefile	2006-09-04 16:31:00.000000000 +0200
 @@ -45,6 +45,12 @@
  endif
@@ -23024,8 +23047,8 @@
  
  define archhelp
    echo '* compressed	- Build compressed kernel image'
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/mm/ioremap.c linux-2.6.18-xen/arch/ia64/mm/ioremap.c
---- linux-2.6.18/arch/ia64/mm/ioremap.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/mm/ioremap.c linux-2.6.18-xen/arch/ia64/mm/ioremap.c
+--- linux-2.6.18.1/arch/ia64/mm/ioremap.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/ia64/mm/ioremap.c	2006-09-04 16:31:00.000000000 +0200
 @@ -16,6 +16,9 @@
  static inline void __iomem *
@@ -23037,14 +23060,14 @@
  	return (void __iomem *) (__IA64_UNCACHED_OFFSET | offset);
  }
  
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/xen/drivers/README linux-2.6.18-xen/arch/ia64/xen/drivers/README
---- linux-2.6.18/arch/ia64/xen/drivers/README	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/drivers/README linux-2.6.18-xen/arch/ia64/xen/drivers/README
+--- linux-2.6.18.1/arch/ia64/xen/drivers/README	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/ia64/xen/drivers/README	2006-09-04 16:31:00.000000000 +0200
 @@ -0,0 +1,2 @@
 +This is a temporary location for source/Makefiles that need to be
 +patched/reworked in drivers/xen to work with xenlinux/ia64.
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/xen/hypercall.S linux-2.6.18-xen/arch/ia64/xen/hypercall.S
---- linux-2.6.18/arch/ia64/xen/hypercall.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/hypercall.S linux-2.6.18-xen/arch/ia64/xen/hypercall.S
+--- linux-2.6.18.1/arch/ia64/xen/hypercall.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/ia64/xen/hypercall.S	2006-09-04 16:31:01.000000000 +0200
 @@ -0,0 +1,413 @@
 +/*
@@ -23460,10 +23483,10 @@
 +	;; 
 +END(xen_ssm_i_1)
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/xen/hypervisor.c linux-2.6.18-xen/arch/ia64/xen/hypervisor.c
---- linux-2.6.18/arch/ia64/xen/hypervisor.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/arch/ia64/xen/hypervisor.c	2006-09-04 16:31:01.000000000 +0200
-@@ -0,0 +1,833 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/hypervisor.c linux-2.6.18-xen/arch/ia64/xen/hypervisor.c
+--- linux-2.6.18.1/arch/ia64/xen/hypervisor.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/ia64/xen/hypervisor.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,1052 @@
 +/******************************************************************************
 + * include/asm-ia64/shadow.h
 + *
@@ -23506,59 +23529,11 @@
 +int running_on_xen;
 +EXPORT_SYMBOL(running_on_xen);
 +
-+//XXX xen/ia64 copy_from_guest() is broken.
-+//    This is a temporal work around until it is fixed.
-+//    used by balloon.c netfront.c
-+
-+// get_xen_guest_handle is defined only when __XEN_TOOLS__ is defined
-+// if the definition in arch-ia64.h is changed, this must be updated.
-+#define get_xen_guest_handle(val, hnd)  do { val = (hnd).p; } while (0)
-+
-+int
-+ia64_xenmem_reservation_op(unsigned long op,
-+			   struct xen_memory_reservation* reservation__)
-+{
-+	struct xen_memory_reservation reservation = *reservation__;
-+	unsigned long* frame_list;
-+	unsigned long nr_extents = reservation__->nr_extents;
-+	int ret = 0;
-+	get_xen_guest_handle(frame_list, reservation__->extent_start);
-+
-+	BUG_ON(op != XENMEM_increase_reservation &&
-+	       op != XENMEM_decrease_reservation &&
-+	       op != XENMEM_populate_physmap);
-+
-+	while (nr_extents > 0) {
-+		int tmp_ret;
-+		volatile unsigned long dummy;
-+
-+		set_xen_guest_handle(reservation.extent_start, frame_list);
-+		reservation.nr_extents = nr_extents;
-+
-+		dummy = frame_list[0];// re-install tlb entry before hypercall
-+		tmp_ret = ____HYPERVISOR_memory_op(op, &reservation);
-+		if (tmp_ret < 0) {
-+			if (ret == 0) {
-+				ret = tmp_ret;
-+			}
-+			break;
-+		}
-+		if (tmp_ret == 0) {
-+			//XXX dirty work around for skbuff_ctor()
-+			//    of a non-privileged domain, 
-+			if ((op == XENMEM_increase_reservation ||
-+			     op == XENMEM_populate_physmap) &&
-+			    !is_initial_xendomain() &&
-+			    reservation.extent_order > 0)
-+				return ret;
-+		}
-+		frame_list += tmp_ret;
-+		nr_extents -= tmp_ret;
-+		ret += tmp_ret;
-+	}
-+	return ret;
-+}
-+EXPORT_SYMBOL(ia64_xenmem_reservation_op);
++#ifdef CONFIG_XEN_IA64_EXPOSE_P2M
++static int p2m_expose_init(void);
++#else
++#define p2m_expose_init() (-ENOSYS)
++#endif
 +
 +//XXX same as i386, x86_64 contiguous_bitmap_set(), contiguous_bitmap_clear()
 +// move those to lib/contiguous_bitmap?
@@ -23837,8 +23812,6 @@
 +int
 +HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count)
 +{
-+	__u64 va1, va2, pa1, pa2;
-+
 +	if (cmd == GNTTABOP_map_grant_ref) {
 +		unsigned int i;
 +		for (i = 0; i < count; i++) {
@@ -23846,29 +23819,7 @@
 +				(struct gnttab_map_grant_ref*)uop + i);
 +		}
 +	}
-+	va1 = (__u64)uop & PAGE_MASK;
-+	pa1 = pa2 = 0;
-+	if ((REGION_NUMBER(va1) == 5) &&
-+	    ((va1 - KERNEL_START) >= KERNEL_TR_PAGE_SIZE)) {
-+		pa1 = ia64_tpa(va1);
-+		if (cmd <= GNTTABOP_transfer) {
-+			static uint32_t uop_size[GNTTABOP_transfer + 1] = {
-+				sizeof(struct gnttab_map_grant_ref),
-+				sizeof(struct gnttab_unmap_grant_ref),
-+				sizeof(struct gnttab_setup_table),
-+				sizeof(struct gnttab_dump_table),
-+				sizeof(struct gnttab_transfer),
-+			};
-+			va2 = (__u64)uop + (uop_size[cmd] * count) - 1;
-+			va2 &= PAGE_MASK;
-+			if (va1 != va2) {
-+				/* maximum size of uop is 2pages */
-+				BUG_ON(va2 > va1 + PAGE_SIZE);
-+				pa2 = ia64_tpa(va2);
-+			}
-+		}
-+	}
-+	return ____HYPERVISOR_grant_table_op(cmd, uop, count, pa1, pa2);
++	return xencomm_mini_hypercall_grant_table_op(cmd, uop, count);
 +}
 +EXPORT_SYMBOL(HYPERVISOR_grant_table_op);
 +
@@ -23992,6 +23943,10 @@
 +	       privcmd_resource_min, privcmd_resource_max, 
 +	       (privcmd_resource_max - privcmd_resource_min) >> 20);
 +	BUG_ON(privcmd_resource_min >= privcmd_resource_max);
++
++	// XXX this should be somewhere appropriate
++	(void)p2m_expose_init();
++
 +	return 0;
 +}
 +late_initcall(xen_ia64_privcmd_init);
@@ -24012,6 +23967,7 @@
 +};
 +
 +struct xen_ia64_privcmd_vma {
++	int				is_privcmd_mmapped;
 +	struct xen_ia64_privcmd_range*	range;
 +
 +	unsigned long			num_entries;
@@ -24150,12 +24106,15 @@
 +static void
 +xen_ia64_privcmd_vma_open(struct vm_area_struct* vma)
 +{
++	struct xen_ia64_privcmd_vma* old_privcmd_vma = (struct xen_ia64_privcmd_vma*)vma->vm_private_data;
 +	struct xen_ia64_privcmd_vma* privcmd_vma = (struct xen_ia64_privcmd_vma*)vma->vm_private_data;
 +	struct xen_ia64_privcmd_range* privcmd_range = privcmd_vma->range;
 +
 +	atomic_inc(&privcmd_range->ref_count);
 +	// vm_op->open() can't fail.
 +	privcmd_vma = kmalloc(sizeof(*privcmd_vma), GFP_KERNEL | __GFP_NOFAIL);
++	// copy original value if necessary
++	privcmd_vma->is_privcmd_mmapped = old_privcmd_vma->is_privcmd_mmapped;
 +
 +	__xen_ia64_privcmd_vma_open(vma, privcmd_vma, privcmd_range);
 +}
@@ -24191,6 +24150,14 @@
 +}
 +
 +int
++privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma)
++{
++	struct xen_ia64_privcmd_vma* privcmd_vma =
++		(struct xen_ia64_privcmd_vma *)vma->vm_private_data;
++	return (xchg(&privcmd_vma->is_privcmd_mmapped, 1) == 0);
++}
++
++int
 +privcmd_mmap(struct file * file, struct vm_area_struct * vma)
 +{
 +	int error;
@@ -24215,6 +24182,8 @@
 +	if (privcmd_vma == NULL) {
 +		goto out_enomem1;
 +	}
++	privcmd_vma->is_privcmd_mmapped = 0;
++
 +	res = kzalloc(sizeof(*res), GFP_KERNEL);
 +	if (res == NULL) {
 +		goto out_enomem1;
@@ -24297,22 +24266,296 @@
 +	/* Just trigger a tick.  */
 +	ia64_cpu_local_tick();
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/xen/Makefile linux-2.6.18-xen/arch/ia64/xen/Makefile
---- linux-2.6.18/arch/ia64/xen/Makefile	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/arch/ia64/xen/Makefile	2006-09-04 16:31:00.000000000 +0200
-@@ -0,0 +1,8 @@
++
++///////////////////////////////////////////////////////////////////////////
++// expose p2m table
++#ifdef CONFIG_XEN_IA64_EXPOSE_P2M
++#include <linux/cpu.h>
++#include <asm/uaccess.h>
++
++int p2m_initialized __read_mostly = 0;
++
++unsigned long p2m_min_low_pfn __read_mostly;
++unsigned long p2m_max_low_pfn __read_mostly;
++unsigned long p2m_convert_min_pfn __read_mostly;
++unsigned long p2m_convert_max_pfn __read_mostly;
++
++static struct resource p2m_resource = {
++	.name    = "Xen p2m table",
++	.flags   = IORESOURCE_MEM,
++};
++static unsigned long p2m_assign_start_pfn __read_mostly;
++static unsigned long p2m_assign_end_pfn __read_mostly;
++volatile const pte_t* p2m_pte __read_mostly;
++
++#define GRNULE_PFN	PTRS_PER_PTE
++static unsigned long p2m_granule_pfn __read_mostly = GRNULE_PFN;
++
++#define ROUNDDOWN(x, y)  ((x) & ~((y) - 1))
++#define ROUNDUP(x, y)    (((x) + (y) - 1) & ~((y) - 1))
++
++#define P2M_PREFIX	"Xen p2m: "
++
++static int xen_ia64_p2m_expose __read_mostly = 1;
++module_param(xen_ia64_p2m_expose, int, 0);
++MODULE_PARM_DESC(xen_ia64_p2m_expose,
++                 "enable/disable xen/ia64 p2m exposure optimization\n");
++
++#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
++static int xen_ia64_p2m_expose_use_dtr __read_mostly = 1;
++module_param(xen_ia64_p2m_expose_use_dtr, int, 0);
++MODULE_PARM_DESC(xen_ia64_p2m_expose_use_dtr,
++                 "use/unuse dtr to map exposed p2m table\n");
++
++static const int p2m_page_shifts[] = {
++	_PAGE_SIZE_4K,
++	_PAGE_SIZE_8K,
++	_PAGE_SIZE_16K,
++	_PAGE_SIZE_64K,
++	_PAGE_SIZE_256K,
++	_PAGE_SIZE_1M,
++	_PAGE_SIZE_4M,
++	_PAGE_SIZE_16M,
++	_PAGE_SIZE_64M,
++	_PAGE_SIZE_256M,
++};
++
++struct p2m_itr_arg {
++	unsigned long vaddr;
++	unsigned long pteval;
++	unsigned long log_page_size;
++};
++static struct p2m_itr_arg p2m_itr_arg __read_mostly;
++
++// This should be in asm-ia64/kregs.h
++#define IA64_TR_P2M_TABLE	3
++
++static void
++p2m_itr(void* info)
++{
++	struct p2m_itr_arg* arg = (struct p2m_itr_arg*)info;
++	ia64_itr(0x2, IA64_TR_P2M_TABLE,
++	         arg->vaddr, arg->pteval, arg->log_page_size);
++	ia64_srlz_d();
++}
++
++static int
++p2m_expose_dtr_call(struct notifier_block *self,
++                    unsigned long event, void* ptr)
++{
++	unsigned int cpu = (unsigned int)(long)ptr;
++	if (event != CPU_ONLINE)
++		return 0;
++	if (!(p2m_initialized && xen_ia64_p2m_expose_use_dtr))
++		smp_call_function_single(cpu, &p2m_itr, &p2m_itr_arg, 1, 1);
++	return 0;
++}
++
++static struct notifier_block p2m_expose_dtr_hotplug_notifier = {
++	.notifier_call = p2m_expose_dtr_call,
++	.next          = NULL,
++	.priority      = 0
++};
++#endif
++
++static int
++p2m_expose_init(void)
++{
++	unsigned long num_pfn;
++	unsigned long size = 0;
++	unsigned long p2m_size = 0;
++	unsigned long align = ~0UL;
++	int error = 0;
++#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
++	int i;
++	unsigned long page_size;
++	unsigned long log_page_size = 0;
++#endif
++
++	if (!xen_ia64_p2m_expose)
++		return -ENOSYS;
++	if (p2m_initialized)
++		return 0;
++
++#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
++	error = register_cpu_notifier(&p2m_expose_dtr_hotplug_notifier);
++	if (error < 0)
++		return error;
++#endif
++
++	lock_cpu_hotplug();
++	if (p2m_initialized)
++		goto out;
++
++#ifdef CONFIG_DISCONTIGMEM
++	p2m_min_low_pfn = min_low_pfn;
++	p2m_max_low_pfn = max_low_pfn;
++#else
++	p2m_min_low_pfn = 0;
++	p2m_max_low_pfn = max_pfn;
++#endif
++
++#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
++	if (xen_ia64_p2m_expose_use_dtr) {
++		unsigned long granule_pfn = 0;
++		p2m_size = p2m_max_low_pfn - p2m_min_low_pfn;
++		for (i = 0;
++		     i < sizeof(p2m_page_shifts)/sizeof(p2m_page_shifts[0]);
++		     i++) {
++			log_page_size = p2m_page_shifts[i];
++			page_size = 1UL << log_page_size;
++			if (page_size < p2m_size)
++				continue;
++
++			granule_pfn = max(page_size >> PAGE_SHIFT,
++			                  p2m_granule_pfn);
++			p2m_convert_min_pfn = ROUNDDOWN(p2m_min_low_pfn,
++			                                granule_pfn);
++			p2m_convert_max_pfn = ROUNDUP(p2m_max_low_pfn,
++			                              granule_pfn);
++			num_pfn = p2m_convert_max_pfn - p2m_convert_min_pfn;
++			size = num_pfn << PAGE_SHIFT;
++			p2m_size = num_pfn / PTRS_PER_PTE;
++			p2m_size = ROUNDUP(p2m_size, granule_pfn << PAGE_SHIFT);
++			if (p2m_size == page_size)
++				break;
++		}
++		if (p2m_size != page_size) {
++			printk(KERN_ERR "p2m_size != page_size\n");
++			error = -EINVAL;
++			goto out;
++		}
++		align = max(privcmd_resource_align, granule_pfn << PAGE_SHIFT);
++	} else
++#endif
++	{
++		BUG_ON(p2m_granule_pfn & (p2m_granule_pfn - 1));
++		p2m_convert_min_pfn = ROUNDDOWN(p2m_min_low_pfn,
++		                                p2m_granule_pfn);
++		p2m_convert_max_pfn = ROUNDUP(p2m_max_low_pfn, p2m_granule_pfn);
++		num_pfn = p2m_convert_max_pfn - p2m_convert_min_pfn;
++		size = num_pfn << PAGE_SHIFT;
++		p2m_size = num_pfn / PTRS_PER_PTE;
++		p2m_size = ROUNDUP(p2m_size, p2m_granule_pfn << PAGE_SHIFT);
++		align = max(privcmd_resource_align,
++		            p2m_granule_pfn << PAGE_SHIFT);
++	}
++	
++	// use privcmd region
++	error = allocate_resource(&iomem_resource, &p2m_resource, p2m_size,
++	                          privcmd_resource_min, privcmd_resource_max,
++	                          align, NULL, NULL);
++	if (error) {
++		printk(KERN_ERR P2M_PREFIX
++		       "can't allocate region for p2m exposure "
++		       "[0x%016lx, 0x%016lx) 0x%016lx\n",
++		       p2m_convert_min_pfn, p2m_convert_max_pfn, p2m_size);
++		goto out;
++	}
++
++	p2m_assign_start_pfn = p2m_resource.start >> PAGE_SHIFT;
++	p2m_assign_end_pfn = p2m_resource.end >> PAGE_SHIFT;
++	
++	error = HYPERVISOR_expose_p2m(p2m_convert_min_pfn,
++	                              p2m_assign_start_pfn,
++	                              size, p2m_granule_pfn);
++	if (error) {
++		printk(KERN_ERR P2M_PREFIX "failed expose p2m hypercall %d\n",
++		       error);
++		printk(KERN_ERR P2M_PREFIX "conv 0x%016lx assign 0x%016lx "
++		       "size 0x%016lx granule 0x%016lx\n",
++		       p2m_convert_min_pfn, p2m_assign_start_pfn,
++		       size, p2m_granule_pfn);;
++		release_resource(&p2m_resource);
++		goto out;
++	}
++	p2m_pte = (volatile const pte_t*)pfn_to_kaddr(p2m_assign_start_pfn);
++#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
++	if (xen_ia64_p2m_expose_use_dtr) {
++		p2m_itr_arg.vaddr = (unsigned long)__va(p2m_assign_start_pfn
++		                                        << PAGE_SHIFT);
++		p2m_itr_arg.pteval = pte_val(pfn_pte(p2m_assign_start_pfn,
++		                                     PAGE_KERNEL));
++		p2m_itr_arg.log_page_size = log_page_size;
++		smp_mb();
++		smp_call_function(&p2m_itr, &p2m_itr_arg, 1, 1);
++		p2m_itr(&p2m_itr_arg);
++	}
++#endif	
++	smp_mb();
++	p2m_initialized = 1;
++	printk(P2M_PREFIX "assign p2m table of [0x%016lx, 0x%016lx)\n",
++	       p2m_convert_min_pfn << PAGE_SHIFT,
++	       p2m_convert_max_pfn << PAGE_SHIFT);
++	printk(P2M_PREFIX "to [0x%016lx, 0x%016lx) (%ld KBytes)\n",
++	       p2m_assign_start_pfn << PAGE_SHIFT,
++	       p2m_assign_end_pfn << PAGE_SHIFT,
++	       p2m_size / 1024);
++out:
++	unlock_cpu_hotplug();
++	return error;
++}
++
++#ifdef notyet
++void
++p2m_expose_cleanup(void)
++{
++	BUG_ON(!p2m_initialized);
++#ifdef CONFIG_XEN_IA64_EXPOSE_P2M_USE_DTR
++	unregister_cpu_notifier(&p2m_expose_dtr_hotplug_notifier);
++#endif
++	release_resource(&p2m_resource);
++}
++#endif
++
++//XXX inlinize?
++unsigned long
++p2m_phystomach(unsigned long gpfn)
++{
++	volatile const pte_t* pte;
++	unsigned long mfn;
++	unsigned long pteval;
++	
++	if (!p2m_initialized ||
++	    gpfn < p2m_min_low_pfn || gpfn > p2m_max_low_pfn
++	    /* || !pfn_valid(gpfn) */)
++		return INVALID_MFN;
++	pte = p2m_pte + (gpfn - p2m_convert_min_pfn);
++
++	mfn = INVALID_MFN;
++	if (likely(__get_user(pteval, (unsigned long __user *)pte) == 0 &&
++	           pte_present(__pte(pteval)) &&
++	           pte_pfn(__pte(pteval)) != (INVALID_MFN >> PAGE_SHIFT)))
++		mfn = (pteval & _PFN_MASK) >> PAGE_SHIFT;
++
++	return mfn;
++}
++
++EXPORT_SYMBOL_GPL(p2m_initialized);
++EXPORT_SYMBOL_GPL(p2m_min_low_pfn);
++EXPORT_SYMBOL_GPL(p2m_max_low_pfn);
++EXPORT_SYMBOL_GPL(p2m_convert_min_pfn);
++EXPORT_SYMBOL_GPL(p2m_convert_max_pfn);
++EXPORT_SYMBOL_GPL(p2m_pte);
++EXPORT_SYMBOL_GPL(p2m_phystomach);
++#endif
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/Makefile linux-2.6.18-xen/arch/ia64/xen/Makefile
+--- linux-2.6.18.1/arch/ia64/xen/Makefile	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/ia64/xen/Makefile	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,9 @@
 +#
 +# Makefile for Xen components
 +#
 +
 +obj-y := hypercall.o xenivt.o xenentry.o xensetup.o xenpal.o xenhpski.o \
-+	 hypervisor.o pci-dma-xen.o util.o
++	 hypervisor.o pci-dma-xen.o util.o xencomm.o xcom_hcall.o \
++	 xcom_privcmd.o
 +
 +pci-dma-xen-y := ../../i386/kernel/pci-dma-xen.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/xen/util.c linux-2.6.18-xen/arch/ia64/xen/util.c
---- linux-2.6.18/arch/ia64/xen/util.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/arch/ia64/xen/util.c	2006-09-04 16:31:01.000000000 +0200
-@@ -0,0 +1,115 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/util.c linux-2.6.18-xen/arch/ia64/xen/util.c
+--- linux-2.6.18.1/arch/ia64/xen/util.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/ia64/xen/util.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,117 @@
 +/******************************************************************************
 + * arch/ia64/xen/util.c
 + * This file is the ia64 counterpart of drivers/xen/util.c
@@ -24342,6 +24585,8 @@
 +#include <linux/vmalloc.h>
 +#include <asm/uaccess.h>
 +#include <xen/driver_util.h>
++#include <xen/interface/memory.h>
++#include <asm/hypercall.h>
 +
 +struct vm_struct *alloc_vm_area(unsigned long size)
 +{
@@ -24428,8 +24673,1333 @@
 + *  tab-width: 8
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/xen/xenentry.S linux-2.6.18-xen/arch/ia64/xen/xenentry.S
---- linux-2.6.18/arch/ia64/xen/xenentry.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/xcom_hcall.c linux-2.6.18-xen/arch/ia64/xen/xcom_hcall.c
+--- linux-2.6.18.1/arch/ia64/xen/xcom_hcall.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/ia64/xen/xcom_hcall.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,469 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ *
++ *          Tristan Gingold <tristan.gingold at bull.net>
++ */
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/gfp.h>
++#include <linux/module.h>
++#include <xen/interface/xen.h>
++#include <xen/interface/dom0_ops.h>
++#include <xen/interface/memory.h>
++#include <xen/interface/xencomm.h>
++#include <xen/interface/version.h>
++#include <xen/interface/sched.h>
++#include <xen/interface/event_channel.h>
++#include <xen/interface/physdev.h>
++#include <xen/interface/grant_table.h>
++#include <xen/interface/callback.h>
++#include <xen/interface/acm_ops.h>
++#include <xen/interface/hvm/params.h>
++#include <xen/public/privcmd.h>
++#include <asm/hypercall.h>
++#include <asm/page.h>
++#include <asm/uaccess.h>
++#include <asm/xen/xencomm.h>
++
++/* Xencomm notes:
++ * This file defines hypercalls to be used by xencomm.  The hypercalls simply
++ * create inlines descriptors for pointers and then call the raw arch hypercall
++ * xencomm_arch_hypercall_XXX
++ *
++ * If the arch wants to directly use these hypercalls, simply define macros
++ * in asm/hypercall.h, eg:
++ *  #define HYPERVISOR_sched_op xencomm_hypercall_sched_op
++ * 
++ * The arch may also define HYPERVISOR_xxx as a function and do more operations
++ * before/after doing the hypercall.
++ *
++ * Note: because only inline descriptors are created these functions must only
++ * be called with in kernel memory parameters.
++ */
++
++int
++xencomm_hypercall_console_io(int cmd, int count, char *str)
++{
++	return xencomm_arch_hypercall_console_io
++		(cmd, count, xencomm_create_inline(str));
++}
++
++int
++xencomm_hypercall_event_channel_op(int cmd, void *op)
++{
++	return xencomm_arch_hypercall_event_channel_op
++		(cmd, xencomm_create_inline(op));
++}
++
++int
++xencomm_hypercall_xen_version(int cmd, void *arg)
++{
++	switch (cmd) {
++	case XENVER_version:
++	case XENVER_extraversion:
++	case XENVER_compile_info:
++	case XENVER_capabilities:
++	case XENVER_changeset:
++	case XENVER_platform_parameters:
++	case XENVER_pagesize:
++	case XENVER_get_features:
++		break;
++	default:
++		printk("%s: unknown version cmd %d\n", __func__, cmd);
++		return -ENOSYS;
++	}
++
++	return xencomm_arch_hypercall_xen_version
++		(cmd, xencomm_create_inline(arg));
++}
++
++int
++xencomm_hypercall_physdev_op(int cmd, void *op)
++{
++	return xencomm_arch_hypercall_physdev_op
++		(cmd, xencomm_create_inline(op));
++}
++
++static void *
++xencommize_grant_table_op(unsigned int cmd, void *op, unsigned int count)
++{
++	switch (cmd) {
++	case GNTTABOP_map_grant_ref:
++	case GNTTABOP_unmap_grant_ref:
++		break;
++	case GNTTABOP_setup_table:
++	{
++		struct gnttab_setup_table *setup = op;
++		struct xencomm_handle *frame_list;
++
++		frame_list = xencomm_create_inline
++			(xen_guest_handle(setup->frame_list));
++
++		set_xen_guest_handle(setup->frame_list, (void *)frame_list);
++		break;
++	}
++	case GNTTABOP_dump_table:
++	case GNTTABOP_transfer:
++	case GNTTABOP_copy:
++		break;
++	default:
++		printk("%s: unknown grant table op %d\n", __func__, cmd);
++		BUG();
++	}
++
++	return  xencomm_create_inline(op);
++}
++
++int
++xencomm_hypercall_grant_table_op(unsigned int cmd, void *op, unsigned int count)
++{
++	void *desc = xencommize_grant_table_op (cmd, op, count);
++
++	return xencomm_arch_hypercall_grant_table_op(cmd, desc, count);
++}
++
++int
++xencomm_hypercall_sched_op(int cmd, void *arg)
++{
++	switch (cmd) {
++	case SCHEDOP_yield:
++	case SCHEDOP_block:
++	case SCHEDOP_shutdown:
++	case SCHEDOP_poll:
++	case SCHEDOP_remote_shutdown:
++		break;
++	default:
++		printk("%s: unknown sched op %d\n", __func__, cmd);
++		return -ENOSYS;
++	}
++	
++	return xencomm_arch_hypercall_sched_op(cmd, xencomm_create_inline(arg));
++}
++
++int
++xencomm_hypercall_multicall(void *call_list, int nr_calls)
++{
++	int i;
++	multicall_entry_t *mce;
++
++	for (i = 0; i < nr_calls; i++) {
++		mce = (multicall_entry_t *)call_list + i;
++
++		switch (mce->op) {
++		case __HYPERVISOR_update_va_mapping:
++		case __HYPERVISOR_mmu_update:
++			/* No-op on ia64.  */
++			break;
++		case __HYPERVISOR_grant_table_op:
++			mce->args[1] = (unsigned long)xencommize_grant_table_op
++				(mce->args[0], (void *)mce->args[1],
++				 mce->args[2]);
++			break;
++		case __HYPERVISOR_memory_op:
++		default:
++			printk("%s: unhandled multicall op entry op %lu\n",
++			       __func__, mce->op);
++			return -ENOSYS;
++		}
++	}
++
++	return xencomm_arch_hypercall_multicall
++		(xencomm_create_inline(call_list), nr_calls);
++}
++
++int
++xencomm_hypercall_callback_op(int cmd, void *arg)
++{
++	switch (cmd)
++	{
++	case CALLBACKOP_register:
++	case CALLBACKOP_unregister:
++		break;
++	default:
++		printk("%s: unknown callback op %d\n", __func__, cmd);
++		return -ENOSYS;
++	}
++
++	return xencomm_arch_hypercall_callback_op
++		(cmd, xencomm_create_inline(arg));
++}
++
++static void
++xencommize_memory_reservation (xen_memory_reservation_t *mop)
++{
++	struct xencomm_handle *desc;
++
++	desc = xencomm_create_inline(xen_guest_handle(mop->extent_start));
++	set_xen_guest_handle(mop->extent_start, (void *)desc);
++}
++
++int
++xencomm_hypercall_memory_op(unsigned int cmd, void *arg)
++{
++	switch (cmd) {
++	case XENMEM_increase_reservation:
++	case XENMEM_decrease_reservation:
++	case XENMEM_populate_physmap:
++		xencommize_memory_reservation((xen_memory_reservation_t *)arg);
++		break;
++		
++	case XENMEM_maximum_ram_page:
++		break;
++
++	case XENMEM_exchange:
++		xencommize_memory_reservation
++			(&((xen_memory_exchange_t *)arg)->in);
++		xencommize_memory_reservation
++			(&((xen_memory_exchange_t *)arg)->out);
++		break;
++
++	default:
++		printk("%s: unknown memory op %d\n", __func__, cmd);
++		return -ENOSYS;
++	}
++
++	return xencomm_arch_hypercall_memory_op
++		(cmd, xencomm_create_inline(arg));
++}
++
++unsigned long
++xencomm_hypercall_hvm_op(int cmd, void *arg)
++{
++	switch (cmd) {
++	case HVMOP_set_param:
++	case HVMOP_get_param:
++		break;
++	default:
++		printk("%s: unknown hvm op %d\n", __func__, cmd);
++		return -ENOSYS;
++	}
++
++	return xencomm_arch_hypercall_hvm_op(cmd, xencomm_create_inline(arg));
++}
++
++int
++xencomm_hypercall_suspend(unsigned long srec)
++{
++	struct sched_shutdown arg;
++
++	arg.reason = SHUTDOWN_suspend;
++
++	return xencomm_arch_hypercall_suspend(xencomm_create_inline(&arg));
++}
++
++int
++xencomm_mini_hypercall_event_channel_op(int cmd, void *op)
++{
++	struct xencomm_mini xc_area[2];
++	int nbr_area = 2;
++	struct xencomm_handle *desc;
++	int rc;
++
++	rc = xencomm_create_mini(xc_area, &nbr_area,
++	                         op, sizeof(evtchn_op_t), &desc);
++	if (rc)
++		return rc;
++
++	return xencomm_arch_hypercall_event_channel_op(cmd, desc);
++}
++EXPORT_SYMBOL(xencomm_mini_hypercall_event_channel_op);
++
++static int
++xencommize_mini_grant_table_op(struct xencomm_mini *xc_area, int *nbr_area,
++                               unsigned int cmd, void *op, unsigned int count,
++                               struct xencomm_handle **desc)
++{
++	struct xencomm_handle *desc1;
++	unsigned int argsize;
++	int rc;
++
++	switch (cmd) {
++	case GNTTABOP_map_grant_ref:
++		argsize = sizeof(struct gnttab_map_grant_ref);
++		break;
++	case GNTTABOP_unmap_grant_ref:
++		argsize = sizeof(struct gnttab_unmap_grant_ref);
++		break;
++	case GNTTABOP_setup_table:
++	{
++		struct gnttab_setup_table *setup = op;
++
++		argsize = sizeof(*setup);
++
++		if (count != 1)
++			return -EINVAL;
++		rc = xencomm_create_mini
++			(xc_area, nbr_area,
++			 xen_guest_handle(setup->frame_list),
++			 setup->nr_frames 
++			 * sizeof(*xen_guest_handle(setup->frame_list)),
++			 &desc1);
++		if (rc)
++			return rc;
++		set_xen_guest_handle(setup->frame_list, (void *)desc1);
++		break;
++	}
++	case GNTTABOP_dump_table:
++		argsize = sizeof(struct gnttab_dump_table);
++		break;
++	case GNTTABOP_transfer:
++		argsize = sizeof(struct gnttab_transfer);
++		break;
++	default:
++		printk("%s: unknown mini grant table op %d\n", __func__, cmd);
++		BUG();
++	}
++
++	rc = xencomm_create_mini(xc_area, nbr_area, op, count * argsize, desc);
++	if (rc)
++		return rc;
++
++	return 0;
++}
++
++int
++xencomm_mini_hypercall_grant_table_op(unsigned int cmd, void *op,
++                                      unsigned int count)
++{
++	int rc;
++	struct xencomm_handle *desc;
++	int nbr_area = 2;
++	struct xencomm_mini xc_area[2];
++
++	rc = xencommize_mini_grant_table_op(xc_area, &nbr_area,
++	                                    cmd, op, count, &desc);
++	if (rc)
++		return rc;
++
++	return xencomm_arch_hypercall_grant_table_op(cmd, desc, count);
++}
++EXPORT_SYMBOL(xencomm_mini_hypercall_grant_table_op);
++
++int
++xencomm_mini_hypercall_multicall(void *call_list, int nr_calls)
++{
++	int i;
++	multicall_entry_t *mce;
++	int nbr_area = 2 + nr_calls * 3;
++	struct xencomm_mini xc_area[nbr_area];
++	struct xencomm_handle *desc;
++	int rc;
++
++	for (i = 0; i < nr_calls; i++) {
++		mce = (multicall_entry_t *)call_list + i;
++
++		switch (mce->op) {
++		case __HYPERVISOR_update_va_mapping:
++		case __HYPERVISOR_mmu_update:
++			/* No-op on ia64.  */
++			break;
++		case __HYPERVISOR_grant_table_op:
++			rc = xencommize_mini_grant_table_op
++				(xc_area, &nbr_area,
++				 mce->args[0], (void *)mce->args[1],
++				 mce->args[2], &desc);
++			if (rc)
++				return rc;
++			mce->args[1] = (unsigned long)desc;
++			break;
++		case __HYPERVISOR_memory_op:
++		default:
++			printk("%s: unhandled multicall op entry op %lu\n",
++			       __func__, mce->op);
++			return -ENOSYS;
++		}
++	}
++
++	rc = xencomm_create_mini(xc_area, &nbr_area, call_list,
++	                         nr_calls * sizeof(multicall_entry_t), &desc);
++	if (rc)
++		return rc;
++
++	return xencomm_arch_hypercall_multicall(desc, nr_calls);
++}
++EXPORT_SYMBOL(xencomm_mini_hypercall_multicall);
++
++static int
++xencommize_mini_memory_reservation(struct xencomm_mini *area, int *nbr_area,
++                                   xen_memory_reservation_t *mop)
++{
++	struct xencomm_handle *desc;
++	int rc;
++
++	rc = xencomm_create_mini
++		(area, nbr_area,
++		 xen_guest_handle(mop->extent_start),
++		 mop->nr_extents 
++		 * sizeof(*xen_guest_handle(mop->extent_start)),
++		 &desc);
++	if (rc)
++		return rc;
++
++	set_xen_guest_handle(mop->extent_start, (void *)desc);
++
++	return 0;
++}
++
++int
++xencomm_mini_hypercall_memory_op(unsigned int cmd, void *arg)
++{
++	int nbr_area = 4;
++	struct xencomm_mini xc_area[4];
++	struct xencomm_handle *desc;
++	int rc;
++	unsigned int argsize;
++
++	switch (cmd) {
++	case XENMEM_increase_reservation:
++	case XENMEM_decrease_reservation:
++	case XENMEM_populate_physmap:
++		argsize = sizeof(xen_memory_reservation_t);
++		rc = xencommize_mini_memory_reservation
++			(xc_area, &nbr_area, (xen_memory_reservation_t *)arg);
++		if (rc)
++			return rc;
++		break;
++		
++	case XENMEM_maximum_ram_page:
++		argsize = 0;
++		break;
++
++	case XENMEM_exchange:
++		argsize = sizeof(xen_memory_exchange_t);
++		rc = xencommize_mini_memory_reservation
++			(xc_area, &nbr_area,
++			 &((xen_memory_exchange_t *)arg)->in);
++		if (rc)
++			return rc;
++		rc = xencommize_mini_memory_reservation
++			(xc_area, &nbr_area,
++			 &((xen_memory_exchange_t *)arg)->out);
++		if (rc)
++			return rc;
++		break;
++
++	default:
++		printk("%s: unknown mini memory op %d\n", __func__, cmd);
++		return -ENOSYS;
++	}
++
++	rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
++	if (rc)
++		return rc;
++
++	return xencomm_arch_hypercall_memory_op(cmd, desc);
++}
++EXPORT_SYMBOL(xencomm_mini_hypercall_memory_op);
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/xcom_privcmd.c linux-2.6.18-xen/arch/ia64/xen/xcom_privcmd.c
+--- linux-2.6.18.1/arch/ia64/xen/xcom_privcmd.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/ia64/xen/xcom_privcmd.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,600 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ *
++ * Authors: Hollis Blanchard <hollisb at us.ibm.com>
++ *          Tristan Gingold <tristan.gingold at bull.net>
++ */
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/gfp.h>
++#include <linux/module.h>
++#include <xen/interface/xen.h>
++#include <xen/interface/dom0_ops.h>
++#define __XEN__
++#include <xen/interface/domctl.h>
++#include <xen/interface/sysctl.h>
++#include <xen/interface/memory.h>
++#include <xen/interface/version.h>
++#include <xen/interface/event_channel.h>
++#include <xen/interface/acm_ops.h>
++#include <xen/interface/hvm/params.h>
++#include <xen/public/privcmd.h>
++#include <asm/hypercall.h>
++#include <asm/page.h>
++#include <asm/uaccess.h>
++#include <asm/xen/xencomm.h>
++
++#define ROUND_DIV(v,s) (((v) + (s) - 1) / (s))
++
++static int
++xencomm_privcmd_dom0_op(privcmd_hypercall_t *hypercall)
++{
++	dom0_op_t kern_op;
++	dom0_op_t __user *user_op = (dom0_op_t __user *)hypercall->arg[0];
++	struct xencomm_handle *op_desc;
++	struct xencomm_handle *desc = NULL;
++	int ret = 0;
++
++	if (copy_from_user(&kern_op, user_op, sizeof(dom0_op_t)))
++		return -EFAULT;
++
++	if (kern_op.interface_version != DOM0_INTERFACE_VERSION)
++		return -EACCES;
++
++	op_desc = xencomm_create_inline(&kern_op);
++
++	switch (kern_op.cmd) {
++	default:
++		printk("%s: unknown dom0 cmd %d\n", __func__, kern_op.cmd);
++		return -ENOSYS;
++	}
++
++	if (ret) {
++		/* error mapping the nested pointer */
++		return ret;
++	}
++
++	ret = xencomm_arch_hypercall_dom0_op(op_desc);
++
++	/* FIXME: should we restore the handle?  */
++	if (copy_to_user(user_op, &kern_op, sizeof(dom0_op_t)))
++		ret = -EFAULT;
++
++	if (desc)
++		xencomm_free(desc);
++	return ret;
++}
++
++static int
++xencomm_privcmd_sysctl(privcmd_hypercall_t *hypercall)
++{
++	xen_sysctl_t kern_op;
++	xen_sysctl_t __user *user_op;
++	struct xencomm_handle *op_desc;
++	struct xencomm_handle *desc = NULL;
++	struct xencomm_handle *desc1 = NULL;
++	int ret = 0;
++
++	user_op = (xen_sysctl_t __user *)hypercall->arg[0];
++
++	if (copy_from_user(&kern_op, user_op, sizeof(xen_sysctl_t)))
++		return -EFAULT;
++
++	if (kern_op.interface_version != XEN_SYSCTL_INTERFACE_VERSION)
++		return -EACCES;
++
++	op_desc = xencomm_create_inline(&kern_op);
++
++	switch (kern_op.cmd) {
++	case XEN_SYSCTL_readconsole:
++		ret = xencomm_create(
++			xen_guest_handle(kern_op.u.readconsole.buffer),
++			kern_op.u.readconsole.count,
++			&desc, GFP_KERNEL);
++		set_xen_guest_handle(kern_op.u.readconsole.buffer,
++		                     (void *)desc);
++		break;
++	case XEN_SYSCTL_tbuf_op:
++	case XEN_SYSCTL_physinfo:
++	case XEN_SYSCTL_sched_id:
++		break;
++	case XEN_SYSCTL_perfc_op:
++		ret = xencomm_create(
++			xen_guest_handle(kern_op.u.perfc_op.desc),
++			kern_op.u.perfc_op.nr_counters *
++			sizeof(xen_sysctl_perfc_desc_t),
++			&desc, GFP_KERNEL);
++		if (ret)
++			return ret;
++		set_xen_guest_handle(kern_op.u.perfc_op.val,
++				     (void *)desc);
++		ret = xencomm_create(
++			xen_guest_handle(kern_op.u.perfc_op.val),
++			kern_op.u.perfc_op.nr_vals *
++			sizeof(xen_sysctl_perfc_desc_t),
++			&desc1, GFP_KERNEL);
++		if (ret)
++			xencomm_free(desc);
++		set_xen_guest_handle(kern_op.u.perfc_op.val,
++				     (void *)desc1);
++		break;
++	case XEN_SYSCTL_getdomaininfolist:
++		ret = xencomm_create(
++			xen_guest_handle(kern_op.u.getdomaininfolist.buffer),
++			kern_op.u.getdomaininfolist.max_domains *
++			sizeof(xen_domctl_getdomaininfo_t),
++			&desc, GFP_KERNEL);
++		set_xen_guest_handle(kern_op.u.getdomaininfolist.buffer,
++				     (void *)desc);
++		break;
++	default:
++		printk("%s: unknown sysctl cmd %d\n", __func__, kern_op.cmd);
++		return -ENOSYS;
++	}
++
++	if (ret) {
++		/* error mapping the nested pointer */
++		return ret;
++	}
++
++	ret = xencomm_arch_hypercall_sysctl(op_desc);
++
++	/* FIXME: should we restore the handle?  */
++	if (copy_to_user(user_op, &kern_op, sizeof(xen_sysctl_t)))
++		ret = -EFAULT;
++
++	if (desc)
++		xencomm_free(desc);
++	if (desc1)
++		xencomm_free(desc1);
++	return ret;
++}
++
++static int
++xencomm_privcmd_domctl(privcmd_hypercall_t *hypercall)
++{
++	xen_domctl_t kern_op;
++	xen_domctl_t __user *user_op;
++	struct xencomm_handle *op_desc;
++	struct xencomm_handle *desc = NULL;
++	int ret = 0;
++
++	user_op = (xen_domctl_t __user *)hypercall->arg[0];
++
++	if (copy_from_user(&kern_op, user_op, sizeof(xen_domctl_t)))
++		return -EFAULT;
++
++	if (kern_op.interface_version != XEN_DOMCTL_INTERFACE_VERSION)
++		return -EACCES;
++
++	op_desc = xencomm_create_inline(&kern_op);
++
++	switch (kern_op.cmd) {
++	case XEN_DOMCTL_createdomain:
++	case XEN_DOMCTL_destroydomain:
++	case XEN_DOMCTL_pausedomain:
++	case XEN_DOMCTL_unpausedomain:
++	case XEN_DOMCTL_getdomaininfo:
++		break;
++	case XEN_DOMCTL_getmemlist:
++	{
++		unsigned long nr_pages = kern_op.u.getmemlist.max_pfns;
++
++		ret = xencomm_create(
++			xen_guest_handle(kern_op.u.getmemlist.buffer),
++			nr_pages * sizeof(unsigned long),
++			&desc, GFP_KERNEL);
++		set_xen_guest_handle(kern_op.u.getmemlist.buffer,
++		                     (void *)desc);
++		break;
++	}
++	case XEN_DOMCTL_getpageframeinfo:
++		break;
++	case XEN_DOMCTL_getpageframeinfo2:
++		ret = xencomm_create(
++			xen_guest_handle(kern_op.u.getpageframeinfo2.array),
++			kern_op.u.getpageframeinfo2.num,
++			&desc, GFP_KERNEL);
++		set_xen_guest_handle(kern_op.u.getpageframeinfo2.array,
++		                     (void *)desc);
++		break;
++	case XEN_DOMCTL_shadow_op:
++		ret = xencomm_create(
++			xen_guest_handle(kern_op.u.shadow_op.dirty_bitmap),
++			ROUND_DIV(kern_op.u.shadow_op.pages, 8),
++			&desc, GFP_KERNEL);
++		set_xen_guest_handle(kern_op.u.shadow_op.dirty_bitmap,
++		                     (void *)desc);
++		break;
++	case XEN_DOMCTL_max_mem:
++		break;
++	case XEN_DOMCTL_setvcpucontext:
++	case XEN_DOMCTL_getvcpucontext:
++		ret = xencomm_create(
++			xen_guest_handle(kern_op.u.vcpucontext.ctxt),
++			sizeof(vcpu_guest_context_t),
++			&desc, GFP_KERNEL);
++		set_xen_guest_handle(kern_op.u.vcpucontext.ctxt, (void *)desc);
++		break;
++	case XEN_DOMCTL_getvcpuinfo:
++		break;
++	case XEN_DOMCTL_setvcpuaffinity:
++	case XEN_DOMCTL_getvcpuaffinity:
++		ret = xencomm_create(
++			xen_guest_handle(kern_op.u.vcpuaffinity.cpumap.bitmap),
++			ROUND_DIV(kern_op.u.vcpuaffinity.cpumap.nr_cpus, 8),
++			&desc, GFP_KERNEL);
++		set_xen_guest_handle(kern_op.u.vcpuaffinity.cpumap.bitmap,
++		                     (void *)desc);
++		break;
++	case XEN_DOMCTL_max_vcpus:
++	case XEN_DOMCTL_scheduler_op:
++	case XEN_DOMCTL_setdomainhandle:
++	case XEN_DOMCTL_setdebugging:
++	case XEN_DOMCTL_irq_permission:
++	case XEN_DOMCTL_iomem_permission:
++	case XEN_DOMCTL_ioport_permission:
++	case XEN_DOMCTL_hypercall_init:
++	case XEN_DOMCTL_arch_setup:
++	case XEN_DOMCTL_settimeoffset:
++		break;
++	default:
++		printk("%s: unknown domctl cmd %d\n", __func__, kern_op.cmd);
++		return -ENOSYS;
++	}
++
++	if (ret) {
++		/* error mapping the nested pointer */
++		return ret;
++	}
++
++	ret = xencomm_arch_hypercall_domctl (op_desc);
++
++	/* FIXME: should we restore the handle?  */
++	if (copy_to_user(user_op, &kern_op, sizeof(xen_domctl_t)))
++		ret = -EFAULT;
++
++	if (desc)
++		xencomm_free(desc);
++	return ret;
++}
++
++static int
++xencomm_privcmd_acm_op(privcmd_hypercall_t *hypercall)
++{
++	int cmd = hypercall->arg[0];
++	void __user *arg = (void __user *)hypercall->arg[1];
++	struct xencomm_handle *op_desc;
++	struct xencomm_handle *desc = NULL;
++	int ret;
++
++	switch (cmd) {
++	case ACMOP_getssid:
++	{
++		struct acm_getssid kern_arg;
++
++		if (copy_from_user(&kern_arg, arg, sizeof (kern_arg)))
++			return -EFAULT;
++
++		op_desc = xencomm_create_inline(&kern_arg);
++
++		ret = xencomm_create(xen_guest_handle(kern_arg.ssidbuf),
++		                     kern_arg.ssidbuf_size, &desc, GFP_KERNEL);
++		if (ret)
++			return ret;
++
++		set_xen_guest_handle(kern_arg.ssidbuf, (void *)desc);
++
++		ret = xencomm_arch_hypercall_acm_op(cmd, op_desc);
++
++		xencomm_free(desc);
++
++		if (copy_to_user(arg, &kern_arg, sizeof (kern_arg)))
++			return -EFAULT;
++
++		return ret;
++	}
++	default:
++		printk("%s: unknown acm_op cmd %d\n", __func__, cmd);
++		return -ENOSYS;
++	}
++
++	return ret;
++}
++
++static int
++xencomm_privcmd_memory_op(privcmd_hypercall_t *hypercall)
++{
++	const unsigned long cmd = hypercall->arg[0];
++	int ret = 0;
++
++	switch (cmd) {
++	case XENMEM_increase_reservation:
++	case XENMEM_decrease_reservation:
++	case XENMEM_populate_physmap:
++	{
++		xen_memory_reservation_t kern_op;
++		xen_memory_reservation_t __user *user_op;
++		struct xencomm_handle *desc = NULL;
++		struct xencomm_handle *desc_op;
++
++		user_op = (xen_memory_reservation_t __user *)hypercall->arg[1];
++		if (copy_from_user(&kern_op, user_op,
++		                   sizeof(xen_memory_reservation_t)))
++			return -EFAULT;
++		desc_op = xencomm_create_inline(&kern_op);
++
++		if (xen_guest_handle(kern_op.extent_start)) {
++			void * addr;
++
++			addr = xen_guest_handle(kern_op.extent_start);
++			ret = xencomm_create
++				(addr,
++				 kern_op.nr_extents *
++				 sizeof(*xen_guest_handle
++					(kern_op.extent_start)),
++				 &desc, GFP_KERNEL);
++			if (ret)
++				return ret;
++			set_xen_guest_handle(kern_op.extent_start,
++			                     (void *)desc);
++		}
++
++		ret = xencomm_arch_hypercall_memory_op(cmd, desc_op);
++
++		if (desc)
++			xencomm_free(desc);
++
++		if (ret != 0)
++			return ret;
++
++		if (copy_to_user(user_op, &kern_op,
++		                 sizeof(xen_memory_reservation_t)))
++			return -EFAULT;
++
++		return ret;
++	}
++	case XENMEM_translate_gpfn_list:
++	{
++		xen_translate_gpfn_list_t kern_op;
++		xen_translate_gpfn_list_t __user *user_op;
++		struct xencomm_handle *desc_gpfn = NULL;
++		struct xencomm_handle *desc_mfn = NULL;
++		struct xencomm_handle *desc_op;
++		void *addr;
++
++		user_op = (xen_translate_gpfn_list_t __user *)
++			hypercall->arg[1];
++		if (copy_from_user(&kern_op, user_op,
++		                   sizeof(xen_translate_gpfn_list_t)))
++			return -EFAULT;
++		desc_op = xencomm_create_inline(&kern_op);
++
++		if (kern_op.nr_gpfns) {
++			/* gpfn_list.  */
++			addr = xen_guest_handle(kern_op.gpfn_list);
++
++			ret = xencomm_create(addr, kern_op.nr_gpfns *
++			                     sizeof(*xen_guest_handle
++			                            (kern_op.gpfn_list)),
++			                     &desc_gpfn, GFP_KERNEL);
++			if (ret)
++				return ret;
++			set_xen_guest_handle(kern_op.gpfn_list,
++			                     (void *)desc_gpfn);
++
++			/* mfn_list.  */
++			addr = xen_guest_handle(kern_op.mfn_list);
++
++			ret = xencomm_create(addr, kern_op.nr_gpfns *
++			                     sizeof(*xen_guest_handle
++			                            (kern_op.mfn_list)),
++			                     &desc_mfn, GFP_KERNEL);
++			if (ret)
++				return ret;
++			set_xen_guest_handle(kern_op.mfn_list,
++			                     (void *)desc_mfn);
++		}
++
++		ret = xencomm_arch_hypercall_memory_op(cmd, desc_op);
++
++		if (desc_gpfn)
++			xencomm_free(desc_gpfn);
++
++		if (desc_mfn)
++			xencomm_free(desc_mfn);
++
++		if (ret != 0)
++			return ret;
++
++		return ret;
++	}
++	default:
++		printk("%s: unknown memory op %lu\n", __func__, cmd);
++		ret = -ENOSYS;
++	}
++	return ret;
++}
++
++static int
++xencomm_privcmd_xen_version(privcmd_hypercall_t *hypercall)
++{
++	int cmd = hypercall->arg[0];
++	void __user *arg = (void __user *)hypercall->arg[1];
++	struct xencomm_handle *desc;
++	size_t argsize;
++	int rc;
++
++	switch (cmd) {
++	case XENVER_version:
++		/* do not actually pass an argument */
++		return xencomm_arch_hypercall_xen_version(cmd, 0);
++	case XENVER_extraversion:
++		argsize = sizeof(xen_extraversion_t);
++		break;
++	case XENVER_compile_info:
++		argsize = sizeof(xen_compile_info_t);
++		break;
++	case XENVER_capabilities:
++		argsize = sizeof(xen_capabilities_info_t);
++		break;
++	case XENVER_changeset:
++		argsize = sizeof(xen_changeset_info_t);
++		break;
++	case XENVER_platform_parameters:
++		argsize = sizeof(xen_platform_parameters_t);
++		break;
++	case XENVER_pagesize:
++		argsize = (arg == NULL) ? 0 : sizeof(void *);
++		break;
++	case XENVER_get_features:
++		argsize = (arg == NULL) ? 0 : sizeof(xen_feature_info_t);
++		break;
++
++	default:
++		printk("%s: unknown version op %d\n", __func__, cmd);
++		return -ENOSYS;
++	}
++
++	rc = xencomm_create(arg, argsize, &desc, GFP_KERNEL);
++	if (rc)
++		return rc;
++
++	rc = xencomm_arch_hypercall_xen_version(cmd, desc);
++
++	xencomm_free(desc);
++
++	return rc;
++}
++
++static int
++xencomm_privcmd_event_channel_op(privcmd_hypercall_t *hypercall)
++{
++	int cmd = hypercall->arg[0];
++	struct xencomm_handle *desc;
++	unsigned int argsize;
++	int ret;
++
++	switch (cmd) {
++	case EVTCHNOP_alloc_unbound:
++		argsize = sizeof(evtchn_alloc_unbound_t);
++		break;
++
++	case EVTCHNOP_status:
++		argsize = sizeof(evtchn_status_t);
++		break;
++
++	default:
++		printk("%s: unknown EVTCHNOP %d\n", __func__, cmd);
++		return -EINVAL;
++	}
++
++	ret = xencomm_create((void *)hypercall->arg[1], argsize,
++	                     &desc, GFP_KERNEL);
++	if (ret)
++		return ret;
++
++	ret = xencomm_arch_hypercall_event_channel_op(cmd, desc);
++
++	xencomm_free(desc);
++	return ret;
++}
++
++static int
++xencomm_privcmd_hvm_op(privcmd_hypercall_t *hypercall)
++{
++	int cmd = hypercall->arg[0];
++	struct xencomm_handle *desc;
++	unsigned int argsize;
++	int ret;
++
++	switch (cmd) {
++	case HVMOP_get_param:
++	case HVMOP_set_param:
++		argsize = sizeof(xen_hvm_param_t);
++		break;
++	default:
++		printk("%s: unknown HVMOP %d\n", __func__, cmd);
++		return -EINVAL;
++	}
++
++	ret = xencomm_create((void *)hypercall->arg[1], argsize,
++	                     &desc, GFP_KERNEL);
++	if (ret)
++		return ret;
++
++	ret = xencomm_arch_hypercall_hvm_op(cmd, desc);
++
++	xencomm_free(desc);
++	return ret;
++}
++
++static int
++xencomm_privcmd_sched_op(privcmd_hypercall_t *hypercall)
++{
++	int cmd = hypercall->arg[0];
++	struct xencomm_handle *desc;
++	unsigned int argsize;
++	int ret;
++
++	switch (cmd) {
++	case SCHEDOP_remote_shutdown:
++		argsize = sizeof(sched_remote_shutdown_t);
++		break;
++	default:
++		printk("%s: unknown SCHEDOP %d\n", __func__, cmd);
++		return -EINVAL;
++	}
++
++	ret = xencomm_create((void *)hypercall->arg[1], argsize,
++	                     &desc, GFP_KERNEL);
++	if (ret)
++		return ret;
++
++	ret = xencomm_arch_hypercall_sched_op(cmd, desc);
++
++	xencomm_free(desc);
++	return ret;
++}
++
++int
++privcmd_hypercall(privcmd_hypercall_t *hypercall)
++{
++	switch (hypercall->op) {
++	case __HYPERVISOR_dom0_op:
++		return xencomm_privcmd_dom0_op(hypercall);
++	case __HYPERVISOR_domctl:
++		return xencomm_privcmd_domctl(hypercall);
++	case __HYPERVISOR_sysctl:
++		return xencomm_privcmd_sysctl(hypercall);
++        case __HYPERVISOR_acm_op:
++		return xencomm_privcmd_acm_op(hypercall);
++	case __HYPERVISOR_xen_version:
++		return xencomm_privcmd_xen_version(hypercall);
++	case __HYPERVISOR_memory_op:
++		return xencomm_privcmd_memory_op(hypercall);
++	case __HYPERVISOR_event_channel_op:
++		return xencomm_privcmd_event_channel_op(hypercall);
++	case __HYPERVISOR_hvm_op:
++		return xencomm_privcmd_hvm_op(hypercall);
++	case __HYPERVISOR_sched_op:
++		return xencomm_privcmd_sched_op(hypercall);
++	default:
++		printk("%s: unknown hcall (%ld)\n", __func__, hypercall->op);
++		return -ENOSYS;
++	}
++}
++
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/xencomm.c linux-2.6.18-xen/arch/ia64/xen/xencomm.c
+--- linux-2.6.18.1/arch/ia64/xen/xencomm.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/ia64/xen/xencomm.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,244 @@
++/*
++ * Copyright (C) 2006 Hollis Blanchard <hollisb at us.ibm.com>, IBM Corporation
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ * 
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ * 
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ */
++
++#include <linux/gfp.h>
++#include <linux/mm.h>
++#include <asm/page.h>
++#include <asm/xen/xencomm.h>
++#include <xen/interface/xen.h>
++
++static int xencomm_debug = 0;
++
++/* Translate virtual address to physical address.  */
++unsigned long
++xencomm_vaddr_to_paddr(unsigned long vaddr)
++{
++	struct page *page;
++	struct vm_area_struct *vma;
++
++	if (vaddr == 0)
++		return 0;
++
++#ifdef __ia64__
++	if (REGION_NUMBER(vaddr) == 5) {
++		pgd_t *pgd;
++		pud_t *pud;
++		pmd_t *pmd;
++		pte_t *ptep;
++
++		/* On ia64, TASK_SIZE refers to current.  It is not initialized
++		   during boot.
++		   Furthermore the kernel is relocatable and __pa() doesn't
++		   work on  addresses.  */
++		if (vaddr >= KERNEL_START
++		    && vaddr < (KERNEL_START + KERNEL_TR_PAGE_SIZE)) {
++			extern unsigned long kernel_start_pa;
++			
++			return vaddr - kernel_start_pa;
++		}
++
++		/* In kernel area -- virtually mapped.  */
++		pgd = pgd_offset_k(vaddr);
++		if (pgd_none(*pgd) || pgd_bad(*pgd))
++			return ~0UL;
++
++		pud = pud_offset(pgd, vaddr);
++		if (pud_none(*pud) || pud_bad(*pud))
++			return ~0UL;
++
++		pmd = pmd_offset(pud, vaddr);
++		if (pmd_none(*pmd) || pmd_bad(*pmd))
++			return ~0UL;
++
++		ptep = pte_offset_kernel(pmd, vaddr);
++		if (!ptep)
++			return ~0UL;
++
++		return (pte_val(*ptep) & _PFN_MASK) | (vaddr & ~PAGE_MASK);
++	}
++#endif
++
++	if (vaddr > TASK_SIZE) {
++		/* kernel address */
++		return __pa(vaddr);
++	}
++
++	/* XXX double-check (lack of) locking */
++	vma = find_extend_vma(current->mm, vaddr);
++	if (!vma)
++		return ~0UL;
++
++	/* We assume the page is modified.  */
++	page = follow_page(vma, vaddr, FOLL_WRITE | FOLL_TOUCH);
++	if (!page)
++		return ~0UL;
++
++	return (page_to_pfn(page) << PAGE_SHIFT) | (vaddr & ~PAGE_MASK);
++}
++
++static int
++xencomm_init(struct xencomm_desc *desc, void *buffer, unsigned long bytes)
++{
++	unsigned long recorded = 0;
++	int i = 0;
++
++	BUG_ON((buffer == NULL) && (bytes > 0));
++
++	/* record the physical pages used */
++	if (buffer == NULL)
++		desc->nr_addrs = 0;
++
++	while ((recorded < bytes) && (i < desc->nr_addrs)) {
++		unsigned long vaddr = (unsigned long)buffer + recorded;
++		unsigned long paddr;
++		int offset;
++		int chunksz;
++
++		offset = vaddr % PAGE_SIZE; /* handle partial pages */
++		chunksz = min(PAGE_SIZE - offset, bytes - recorded);
++
++		paddr = xencomm_vaddr_to_paddr(vaddr);
++		if (paddr == ~0UL) {
++			printk("%s: couldn't translate vaddr %lx\n",
++			       __func__, vaddr);
++			return -EINVAL;
++		}
++
++		desc->address[i++] = paddr;
++		recorded += chunksz;
++	}
++
++	if (recorded < bytes) {
++		printk("%s: could only translate %ld of %ld bytes\n",
++		       __func__, recorded, bytes);
++		return -ENOSPC;
++	}
++
++	/* mark remaining addresses invalid (just for safety) */
++	while (i < desc->nr_addrs)
++		desc->address[i++] = XENCOMM_INVALID;
++
++	desc->magic = XENCOMM_MAGIC;
++
++	return 0;
++}
++
++static struct xencomm_desc *
++xencomm_alloc(gfp_t gfp_mask)
++{
++	struct xencomm_desc *desc;
++
++	desc = (struct xencomm_desc *)__get_free_page(gfp_mask);
++	if (desc == NULL)
++		panic("%s: page allocation failed\n", __func__);
++
++	desc->nr_addrs = (PAGE_SIZE - sizeof(struct xencomm_desc)) /
++	                 sizeof(*desc->address);
++
++	return desc;
++}
++
++void
++xencomm_free(struct xencomm_handle *desc)
++{
++	if (desc)
++		free_page((unsigned long)__va(desc));
++}
++
++int
++xencomm_create(void *buffer, unsigned long bytes,
++               struct xencomm_handle **ret, gfp_t gfp_mask)
++{
++	struct xencomm_desc *desc;
++	struct xencomm_handle *handle;
++	int rc;
++
++	if (xencomm_debug)
++		printk("%s: %p[%ld]\n", __func__, buffer, bytes);
++
++	if (buffer == NULL || bytes == 0) {
++		*ret = (struct xencomm_handle *)NULL;
++		return 0;
++	}
++
++	desc = xencomm_alloc(gfp_mask);
++	if (!desc) {
++		printk("%s failure\n", "xencomm_alloc");
++		return -ENOMEM;
++	}
++	handle = (struct xencomm_handle *)__pa(desc);
++
++	rc = xencomm_init(desc, buffer, bytes);
++	if (rc) {
++		printk("%s failure: %d\n", "xencomm_init", rc);
++		xencomm_free(handle);
++		return rc;
++	}
++
++	*ret = handle;
++	return 0;
++}
++
++/* "mini" routines, for stack-based communications: */
++
++static void *
++xencomm_alloc_mini(struct xencomm_mini *area, int *nbr_area)
++{
++	unsigned long base;
++	unsigned int pageoffset;
++
++	while (*nbr_area >= 0) {
++		/* Allocate an area.  */
++		(*nbr_area)--;
++
++		base = (unsigned long)(area + *nbr_area);
++		pageoffset = base % PAGE_SIZE;
++
++		/* If the area does not cross a page, use it.  */
++		if ((PAGE_SIZE - pageoffset) >= sizeof(struct xencomm_mini))
++			return &area[*nbr_area];
++	}
++	/* No more area.  */
++	return NULL;
++}
++
++int
++xencomm_create_mini(struct xencomm_mini *area, int *nbr_area,
++                    void *buffer, unsigned long bytes,
++                    struct xencomm_handle **ret)
++{
++	struct xencomm_desc *desc;
++	int rc;
++	unsigned long res;
++
++	desc = xencomm_alloc_mini(area, nbr_area);
++	if (!desc)
++		return -ENOMEM;
++	desc->nr_addrs = XENCOMM_MINI_ADDRS;
++
++	rc = xencomm_init(desc, buffer, bytes);
++	if (rc)
++		return rc;
++
++	res = xencomm_vaddr_to_paddr((unsigned long)desc);
++	if (res == ~0UL)
++		return -EINVAL;
++
++	*ret = (struct xencomm_handle*)res;
++	return 0;
++}
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/xenentry.S linux-2.6.18-xen/arch/ia64/xen/xenentry.S
+--- linux-2.6.18.1/arch/ia64/xen/xenentry.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/ia64/xen/xenentry.S	2006-09-04 16:31:01.000000000 +0200
 @@ -0,0 +1,867 @@
 +/*
@@ -25299,8 +26869,8 @@
 +#else
 +END(ia64_leave_kernel)
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/xen/xenhpski.c linux-2.6.18-xen/arch/ia64/xen/xenhpski.c
---- linux-2.6.18/arch/ia64/xen/xenhpski.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/xenhpski.c linux-2.6.18-xen/arch/ia64/xen/xenhpski.c
+--- linux-2.6.18.1/arch/ia64/xen/xenhpski.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/ia64/xen/xenhpski.c	2006-09-04 16:31:01.000000000 +0200
 @@ -0,0 +1,19 @@
 +
@@ -25322,8 +26892,8 @@
 +	return 1;
 +}
 +
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/xen/xenivt.S linux-2.6.18-xen/arch/ia64/xen/xenivt.S
---- linux-2.6.18/arch/ia64/xen/xenivt.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/xenivt.S linux-2.6.18-xen/arch/ia64/xen/xenivt.S
+--- linux-2.6.18.1/arch/ia64/xen/xenivt.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/ia64/xen/xenivt.S	2006-09-04 16:31:01.000000000 +0200
 @@ -0,0 +1,2169 @@
 +/*
@@ -27495,8 +29065,8 @@
 +	br.call.sptk.many b6=evtchn_do_upcall
 +END(xen_event_callback)
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/xen/xenminstate.h linux-2.6.18-xen/arch/ia64/xen/xenminstate.h
---- linux-2.6.18/arch/ia64/xen/xenminstate.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/xenminstate.h linux-2.6.18-xen/arch/ia64/xen/xenminstate.h
+--- linux-2.6.18.1/arch/ia64/xen/xenminstate.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/ia64/xen/xenminstate.h	2006-09-04 16:31:01.000000000 +0200
 @@ -0,0 +1,368 @@
 +
@@ -27867,8 +29437,8 @@
 +#else
 +#define SAVE_MIN		DO_SAVE_MIN(     , mov r30=r0, )
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/xen/xenpal.S linux-2.6.18-xen/arch/ia64/xen/xenpal.S
---- linux-2.6.18/arch/ia64/xen/xenpal.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/xenpal.S linux-2.6.18-xen/arch/ia64/xen/xenpal.S
+--- linux-2.6.18.1/arch/ia64/xen/xenpal.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/ia64/xen/xenpal.S	2006-09-04 16:31:01.000000000 +0200
 @@ -0,0 +1,76 @@
 +/*
@@ -27947,10 +29517,10 @@
 +	srlz.d				// seralize restoration of psr.l
 +	br.ret.sptk.many b0
 +END(xen_pal_call_static)
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/ia64/xen/xensetup.S linux-2.6.18-xen/arch/ia64/xen/xensetup.S
---- linux-2.6.18/arch/ia64/xen/xensetup.S	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/arch/ia64/xen/xensetup.S	2006-09-04 16:31:01.000000000 +0200
-@@ -0,0 +1,54 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/ia64/xen/xensetup.S linux-2.6.18-xen/arch/ia64/xen/xensetup.S
+--- linux-2.6.18.1/arch/ia64/xen/xensetup.S	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/ia64/xen/xensetup.S	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,53 @@
 +/*
 + * Support routines for Xen
 + *
@@ -27975,12 +29545,11 @@
 +	
 +	mov cr.iva=r10
 +
-+#if XSI_BASE != 0xf100000000000000UL
-+	/* Backward compatibility.  */
-+(isBP)	mov r2=0x600
++	/* Set xsi base.  */
++#define FW_HYPERCALL_SET_SHARED_INFO_VA			0x600
++(isBP)	mov r2=FW_HYPERCALL_SET_SHARED_INFO_VA
 +(isBP)	movl r28=XSI_BASE;;
 +(isBP)	break 0x1000;;
-+#endif
 +
 +	br.ret.sptk.many rp
 +	;;
@@ -27990,23 +29559,23 @@
 +
 +/* Stub for suspend.
 +   Just force the stacked registers to be written in memory.  */	
-+GLOBAL_ENTRY(HYPERVISOR_suspend)
++GLOBAL_ENTRY(xencomm_arch_hypercall_suspend)
++	mov r15=r32
++	;; 
 +	alloc r20=ar.pfs,0,0,0,0
-+	mov r14=2
-+	mov r15=r12
-+	;;
++	mov r2=__HYPERVISOR_sched_op
++	;; 
 +	/* We don't want to deal with RSE.  */
 +	flushrs
-+	mov r2=__HYPERVISOR_sched_op
-+	st4 [r12]=r14
++	mov r14=2 // SCHEDOP_shutdown
 +	;;
 +	break 0x1000
 +	;; 
 +	mov ar.pfs=r20
 +	br.ret.sptk.many b0
-+END(HYPERVISOR_suspend)
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/um/kernel/physmem.c linux-2.6.18-xen/arch/um/kernel/physmem.c
---- linux-2.6.18/arch/um/kernel/physmem.c	2006-09-20 05:42:06.000000000 +0200
++END(xencomm_arch_hypercall_suspend)
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/um/kernel/physmem.c linux-2.6.18-xen/arch/um/kernel/physmem.c
+--- linux-2.6.18.1/arch/um/kernel/physmem.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/um/kernel/physmem.c	2006-09-04 16:31:02.000000000 +0200
 @@ -226,7 +226,7 @@
  EXPORT_SYMBOL(physmem_remove_mapping);
@@ -28026,8 +29595,8 @@
  }
  
  int is_remapped(void *virt)
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/ia32/ia32entry-xen.S linux-2.6.18-xen/arch/x86_64/ia32/ia32entry-xen.S
---- linux-2.6.18/arch/x86_64/ia32/ia32entry-xen.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/ia32/ia32entry-xen.S linux-2.6.18-xen/arch/x86_64/ia32/ia32entry-xen.S
+--- linux-2.6.18.1/arch/x86_64/ia32/ia32entry-xen.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/ia32/ia32entry-xen.S	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,743 @@
 +/*
@@ -28773,8 +30342,8 @@
 +	.quad compat_sys_vmsplice
 +	.quad compat_sys_move_pages
 +ia32_syscall_end:		
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/ia32/Makefile linux-2.6.18-xen/arch/x86_64/ia32/Makefile
---- linux-2.6.18/arch/x86_64/ia32/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/ia32/Makefile linux-2.6.18-xen/arch/x86_64/ia32/Makefile
+--- linux-2.6.18.1/arch/x86_64/ia32/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/x86_64/ia32/Makefile	2006-09-04 16:31:03.000000000 +0200
 @@ -27,9 +27,25 @@
  			   -Wl,-soname=linux-gate.so.1 -o $@ \
@@ -28804,8 +30373,8 @@
 +
 +obj-y := $(call cherrypickxen, $(obj-y))
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/ia32/syscall32_syscall-xen.S linux-2.6.18-xen/arch/x86_64/ia32/syscall32_syscall-xen.S
---- linux-2.6.18/arch/x86_64/ia32/syscall32_syscall-xen.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/ia32/syscall32_syscall-xen.S linux-2.6.18-xen/arch/x86_64/ia32/syscall32_syscall-xen.S
+--- linux-2.6.18.1/arch/x86_64/ia32/syscall32_syscall-xen.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/ia32/syscall32_syscall-xen.S	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,28 @@
 +/* 32bit VDSOs mapped into user space. */
@@ -28836,8 +30405,8 @@
 +syscall32_sysenter:
 +	.incbin "arch/x86_64/ia32/vsyscall-sysenter.so"
 +syscall32_sysenter_end:
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/ia32/syscall32-xen.c linux-2.6.18-xen/arch/x86_64/ia32/syscall32-xen.c
---- linux-2.6.18/arch/x86_64/ia32/syscall32-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/ia32/syscall32-xen.c linux-2.6.18-xen/arch/x86_64/ia32/syscall32-xen.c
+--- linux-2.6.18.1/arch/x86_64/ia32/syscall32-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/ia32/syscall32-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,128 @@
 +/* Copyright 2002,2003 Andi Kleen, SuSE Labs */
@@ -28968,8 +30537,8 @@
 +	wrmsrl(MSR_CSTAR, ia32_cstar_target);
 +#endif
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/ia32/vsyscall-int80.S linux-2.6.18-xen/arch/x86_64/ia32/vsyscall-int80.S
---- linux-2.6.18/arch/x86_64/ia32/vsyscall-int80.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/ia32/vsyscall-int80.S linux-2.6.18-xen/arch/x86_64/ia32/vsyscall-int80.S
+--- linux-2.6.18.1/arch/x86_64/ia32/vsyscall-int80.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/ia32/vsyscall-int80.S	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,58 @@
 +/*
@@ -29030,8 +30599,8 @@
 + */
 +#define SYSCALL_ENTER_KERNEL    int $0x80
 +#include "vsyscall-sigreturn.S"
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/ia32/vsyscall-sigreturn.S linux-2.6.18-xen/arch/x86_64/ia32/vsyscall-sigreturn.S
---- linux-2.6.18/arch/x86_64/ia32/vsyscall-sigreturn.S	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/ia32/vsyscall-sigreturn.S linux-2.6.18-xen/arch/x86_64/ia32/vsyscall-sigreturn.S
+--- linux-2.6.18.1/arch/x86_64/ia32/vsyscall-sigreturn.S	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/x86_64/ia32/vsyscall-sigreturn.S	2006-09-04 16:31:03.000000000 +0200
 @@ -139,5 +139,5 @@
  	.align 4
@@ -29040,9 +30609,9 @@
 -#include "../../i386/kernel/vsyscall-note.S"
 +#include <vsyscall-note.S>
  
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/Kconfig linux-2.6.18-xen/arch/x86_64/Kconfig
---- linux-2.6.18/arch/x86_64/Kconfig	2006-09-20 05:42:06.000000000 +0200
-+++ linux-2.6.18-xen/arch/x86_64/Kconfig	2006-09-21 01:33:31.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/Kconfig linux-2.6.18-xen/arch/x86_64/Kconfig
+--- linux-2.6.18.1/arch/x86_64/Kconfig	2006-09-20 05:42:06.000000000 +0200
++++ linux-2.6.18-xen/arch/x86_64/Kconfig	2006-09-22 16:38:35.000000000 +0200
 @@ -30,6 +30,7 @@
  
  config STACKTRACE_SUPPORT
@@ -29233,16 +30802,16 @@
 +source "drivers/xen/Kconfig"
 +
  source "lib/Kconfig"
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/acpi/Makefile linux-2.6.18-xen/arch/x86_64/kernel/acpi/Makefile
---- linux-2.6.18/arch/x86_64/kernel/acpi/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/acpi/Makefile linux-2.6.18-xen/arch/x86_64/kernel/acpi/Makefile
+--- linux-2.6.18.1/arch/x86_64/kernel/acpi/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/x86_64/kernel/acpi/Makefile	2006-09-04 16:31:03.000000000 +0200
 @@ -7,3 +7,4 @@
  processor-y		:= ../../../i386/kernel/acpi/processor.o ../../../i386/kernel/acpi/cstate.o
  endif
  
 +boot-$(CONFIG_XEN)		:= ../../../i386/kernel/acpi/boot-xen.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/apic-xen.c linux-2.6.18-xen/arch/x86_64/kernel/apic-xen.c
---- linux-2.6.18/arch/x86_64/kernel/apic-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/apic-xen.c linux-2.6.18-xen/arch/x86_64/kernel/apic-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/apic-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/apic-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,197 @@
 +/*
@@ -29442,8 +31011,8 @@
 +
 +	return 1;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/asm-offsets.c linux-2.6.18-xen/arch/x86_64/kernel/asm-offsets.c
---- linux-2.6.18/arch/x86_64/kernel/asm-offsets.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/asm-offsets.c linux-2.6.18-xen/arch/x86_64/kernel/asm-offsets.c
+--- linux-2.6.18.1/arch/x86_64/kernel/asm-offsets.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/x86_64/kernel/asm-offsets.c	2006-09-04 16:31:03.000000000 +0200
 @@ -67,8 +67,10 @@
  	DEFINE(pbe_address, offsetof(struct pbe, address));
@@ -29456,8 +31025,8 @@
  	BLANK();
  	DEFINE(crypto_tfm_ctx_offset, offsetof(struct crypto_tfm, __crt_ctx));
  	return 0;
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/e820-xen.c linux-2.6.18-xen/arch/x86_64/kernel/e820-xen.c
---- linux-2.6.18/arch/x86_64/kernel/e820-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/e820-xen.c linux-2.6.18-xen/arch/x86_64/kernel/e820-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/e820-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/e820-xen.c	2006-09-21 01:33:31.000000000 +0200
 @@ -0,0 +1,757 @@
 +/* 
@@ -30217,8 +31786,8 @@
 +	printk(KERN_INFO "Allocating PCI resources starting at %lx (gap: %lx:%lx)\n",
 +		pci_mem_start, gapstart, gapsize);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/early_printk-xen.c linux-2.6.18-xen/arch/x86_64/kernel/early_printk-xen.c
---- linux-2.6.18/arch/x86_64/kernel/early_printk-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/early_printk-xen.c linux-2.6.18-xen/arch/x86_64/kernel/early_printk-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/early_printk-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/early_printk-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,304 @@
 +
@@ -30525,9 +32094,9 @@
 +}
 +
 +__setup("earlyprintk=", setup_early_printk);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/entry-xen.S linux-2.6.18-xen/arch/x86_64/kernel/entry-xen.S
---- linux-2.6.18/arch/x86_64/kernel/entry-xen.S	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/arch/x86_64/kernel/entry-xen.S	2006-09-04 16:31:03.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/entry-xen.S linux-2.6.18-xen/arch/x86_64/kernel/entry-xen.S
+--- linux-2.6.18.1/arch/x86_64/kernel/entry-xen.S	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/x86_64/kernel/entry-xen.S	2006-09-22 16:38:35.000000000 +0200
 @@ -0,0 +1,1213 @@
 +/*
 + *  linux/arch/x86_64/entry.S
@@ -31742,8 +33311,8 @@
 +	CFI_ENDPROC
 +ENDPROC(arch_unwind_init_running)
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/genapic_xen.c linux-2.6.18-xen/arch/x86_64/kernel/genapic_xen.c
---- linux-2.6.18/arch/x86_64/kernel/genapic_xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/genapic_xen.c linux-2.6.18-xen/arch/x86_64/kernel/genapic_xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/genapic_xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/genapic_xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,176 @@
 +/*
@@ -31922,8 +33491,8 @@
 +	.cpu_mask_to_apicid = xen_cpu_mask_to_apicid,
 +	.phys_pkg_id = phys_pkg_id,
 +};
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/genapic-xen.c linux-2.6.18-xen/arch/x86_64/kernel/genapic-xen.c
---- linux-2.6.18/arch/x86_64/kernel/genapic-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/genapic-xen.c linux-2.6.18-xen/arch/x86_64/kernel/genapic-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/genapic-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/genapic-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,143 @@
 +/*
@@ -32069,8 +33638,8 @@
 +	xen_send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL);
 +#endif
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/head64-xen.c linux-2.6.18-xen/arch/x86_64/kernel/head64-xen.c
---- linux-2.6.18/arch/x86_64/kernel/head64-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/head64-xen.c linux-2.6.18-xen/arch/x86_64/kernel/head64-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/head64-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/head64-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,161 @@
 +/*
@@ -32234,8 +33803,8 @@
 +	setup_boot_cpu_data();
 +	start_kernel();
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/head-xen.S linux-2.6.18-xen/arch/x86_64/kernel/head-xen.S
---- linux-2.6.18/arch/x86_64/kernel/head-xen.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/head-xen.S linux-2.6.18-xen/arch/x86_64/kernel/head-xen.S
+--- linux-2.6.18.1/arch/x86_64/kernel/head-xen.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/head-xen.S	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,191 @@
 +/*
@@ -32429,8 +33998,8 @@
 +	ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .quad,  hypercall_page)
 +	ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .asciz, "writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel")
 +	ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz, "generic")
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/init_task.c linux-2.6.18-xen/arch/x86_64/kernel/init_task.c
---- linux-2.6.18/arch/x86_64/kernel/init_task.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/init_task.c linux-2.6.18-xen/arch/x86_64/kernel/init_task.c
+--- linux-2.6.18.1/arch/x86_64/kernel/init_task.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/x86_64/kernel/init_task.c	2006-09-04 16:31:03.000000000 +0200
 @@ -37,6 +37,8 @@
  struct task_struct init_task = INIT_TASK(init_task);
@@ -32449,8 +34018,8 @@
  
  /* Copies of the original ist values from the tss are only accessed during
   * debugging, no special alignment required.
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/io_apic-xen.c linux-2.6.18-xen/arch/x86_64/kernel/io_apic-xen.c
---- linux-2.6.18/arch/x86_64/kernel/io_apic-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/io_apic-xen.c linux-2.6.18-xen/arch/x86_64/kernel/io_apic-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/io_apic-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/io_apic-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,2263 @@
 +/*
@@ -34716,8 +36285,8 @@
 +}
 +#endif
 +#endif /* !CONFIG_XEN */
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/ioport-xen.c linux-2.6.18-xen/arch/x86_64/kernel/ioport-xen.c
---- linux-2.6.18/arch/x86_64/kernel/ioport-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/ioport-xen.c linux-2.6.18-xen/arch/x86_64/kernel/ioport-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/ioport-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/ioport-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,99 @@
 +/*
@@ -34819,8 +36388,8 @@
 +
 +	return 0;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/irqflags-xen.c linux-2.6.18-xen/arch/x86_64/kernel/irqflags-xen.c
---- linux-2.6.18/arch/x86_64/kernel/irqflags-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/irqflags-xen.c linux-2.6.18-xen/arch/x86_64/kernel/irqflags-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/irqflags-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/irqflags-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,100 @@
 +#include <linux/module.h>
@@ -34923,8 +36492,8 @@
 +	return disabled;
 +}
 +EXPORT_SYMBOL(raw_irqs_disabled);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/irq-xen.c linux-2.6.18-xen/arch/x86_64/kernel/irq-xen.c
---- linux-2.6.18/arch/x86_64/kernel/irq-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/irq-xen.c linux-2.6.18-xen/arch/x86_64/kernel/irq-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/irq-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/irq-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,198 @@
 +/*
@@ -35125,8 +36694,8 @@
 +        printk("unexpected IRQ trap at vector %02x\n", irq);
 +}
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/ldt-xen.c linux-2.6.18-xen/arch/x86_64/kernel/ldt-xen.c
---- linux-2.6.18/arch/x86_64/kernel/ldt-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/ldt-xen.c linux-2.6.18-xen/arch/x86_64/kernel/ldt-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/ldt-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/ldt-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,282 @@
 +/*
@@ -35411,8 +36980,8 @@
 +	}
 +	return ret;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/Makefile linux-2.6.18-xen/arch/x86_64/kernel/Makefile
---- linux-2.6.18/arch/x86_64/kernel/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/Makefile linux-2.6.18-xen/arch/x86_64/kernel/Makefile
+--- linux-2.6.18.1/arch/x86_64/kernel/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/x86_64/kernel/Makefile	2006-09-04 16:31:03.000000000 +0200
 @@ -21,11 +21,13 @@
  obj-$(CONFIG_X86_CPUID)		+= cpuid.o
@@ -35448,8 +37017,8 @@
 +obj-y := $(call cherrypickxen, $(obj-y))
 +extra-y := $(call cherrypickxen, $(extra-y))
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/mpparse-xen.c linux-2.6.18-xen/arch/x86_64/kernel/mpparse-xen.c
---- linux-2.6.18/arch/x86_64/kernel/mpparse-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/mpparse-xen.c linux-2.6.18-xen/arch/x86_64/kernel/mpparse-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/mpparse-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/mpparse-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,1011 @@
 +/*
@@ -36463,8 +38032,8 @@
 +
 +#endif /*CONFIG_X86_IO_APIC*/
 +#endif /*CONFIG_ACPI*/
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/pci-swiotlb-xen.c linux-2.6.18-xen/arch/x86_64/kernel/pci-swiotlb-xen.c
---- linux-2.6.18/arch/x86_64/kernel/pci-swiotlb-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/pci-swiotlb-xen.c linux-2.6.18-xen/arch/x86_64/kernel/pci-swiotlb-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/pci-swiotlb-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/pci-swiotlb-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,54 @@
 +/* Glue code to lib/swiotlb.c */
@@ -36521,10 +38090,10 @@
 +	}
 +#endif
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/process-xen.c linux-2.6.18-xen/arch/x86_64/kernel/process-xen.c
---- linux-2.6.18/arch/x86_64/kernel/process-xen.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/arch/x86_64/kernel/process-xen.c	2006-09-04 16:31:03.000000000 +0200
-@@ -0,0 +1,794 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/process-xen.c linux-2.6.18-xen/arch/x86_64/kernel/process-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/process-xen.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/x86_64/kernel/process-xen.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,793 @@
 +/*
 + *  linux/arch/x86-64/kernel/process.c
 + *
@@ -36865,7 +38434,6 @@
 +	struct user_desc ud = { 
 +		.base_addr = addr,
 +		.limit = 0xfffff,
-+		.contents = (3 << 3), /* user */
 +		.seg_32bit = 1,
 +		.limit_in_pages = 1,
 +		.useable = 1,
@@ -37319,8 +38887,8 @@
 +{
 +}
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/setup64-xen.c linux-2.6.18-xen/arch/x86_64/kernel/setup64-xen.c
---- linux-2.6.18/arch/x86_64/kernel/setup64-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/setup64-xen.c linux-2.6.18-xen/arch/x86_64/kernel/setup64-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/setup64-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/setup64-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,361 @@
 +/* 
@@ -37684,10 +39252,10 @@
 +
 +	fpu_init(); 
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/setup-xen.c linux-2.6.18-xen/arch/x86_64/kernel/setup-xen.c
---- linux-2.6.18/arch/x86_64/kernel/setup-xen.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/arch/x86_64/kernel/setup-xen.c	2006-09-21 01:33:31.000000000 +0200
-@@ -0,0 +1,1638 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/setup-xen.c linux-2.6.18-xen/arch/x86_64/kernel/setup-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/setup-xen.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/x86_64/kernel/setup-xen.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,1637 @@
 +/*
 + *  linux/arch/x86-64/kernel/setup.c
 + *
@@ -37756,14 +39324,13 @@
 +#include <asm/dmi.h>
 +#ifdef CONFIG_XEN
 +#include <linux/percpu.h>
++#include <linux/pfn.h>
 +#include <xen/interface/physdev.h>
 +#include "setup_arch_pre.h"
 +#include <asm/hypervisor.h>
 +#include <xen/interface/nmi.h>
 +#include <xen/features.h>
 +#include <xen/xencons.h>
-+#define PFN_UP(x)       (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
-+#define PFN_PHYS(x)     ((x) << PAGE_SHIFT)
 +#include <asm/mach-xen/setup_arch_post.h>
 +#include <xen/interface/memory.h>
 +
@@ -37840,6 +39407,9 @@
 +
 +struct edid_info edid_info;
 +struct e820map e820;
++#ifdef CONFIG_XEN
++struct e820map machine_e820;
++#endif
 +
 +extern int root_mountflags;
 +
@@ -38267,7 +39837,6 @@
 +
 +void __init setup_arch(char **cmdline_p)
 +{
-+	struct e820entry *machine_e820;
 +	struct xen_memory_map memmap;
 +
 +#ifdef CONFIG_XEN
@@ -38574,14 +40143,14 @@
 +	probe_roms();
 +#ifdef CONFIG_XEN
 +	if (is_initial_xendomain()) {
-+		machine_e820 = alloc_bootmem_low_pages(PAGE_SIZE);
-+
 +		memmap.nr_entries = E820MAX;
-+		set_xen_guest_handle(memmap.buffer, machine_e820);
++		set_xen_guest_handle(memmap.buffer, machine_e820.map);
 +
-+		BUG_ON(HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap));
++		if (HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap))
++			BUG();
++		machine_e820.nr_map = memmap.nr_entries;
 +
-+		e820_reserve_resources(machine_e820, memmap.nr_entries);
++		e820_reserve_resources(machine_e820.map, machine_e820.nr_map);
 +	}
 +#else
 +	e820_reserve_resources(e820.map, e820.nr_map);
@@ -38597,10 +40166,8 @@
 +	}
 +
 +#ifdef CONFIG_XEN
-+	if (is_initial_xendomain()) {
-+		e820_setup_gap(machine_e820, memmap.nr_entries);
-+		free_bootmem(__pa(machine_e820), PAGE_SIZE);
-+	}
++	if (is_initial_xendomain())
++		e820_setup_gap(machine_e820.map, machine_e820.nr_map);
 +#else
 +	e820_setup_gap(e820.map, e820.nr_map);
 +#endif
@@ -39326,8 +40893,8 @@
 +}
 +device_initcall(add_pcspkr);
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/smp-xen.c linux-2.6.18-xen/arch/x86_64/kernel/smp-xen.c
---- linux-2.6.18/arch/x86_64/kernel/smp-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/smp-xen.c linux-2.6.18-xen/arch/x86_64/kernel/smp-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/smp-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/smp-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,600 @@
 +/*
@@ -39930,9 +41497,9 @@
 +	return 0; /* Should not happen */
 +#endif
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/traps-xen.c linux-2.6.18-xen/arch/x86_64/kernel/traps-xen.c
---- linux-2.6.18/arch/x86_64/kernel/traps-xen.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/arch/x86_64/kernel/traps-xen.c	2006-09-04 16:31:03.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/traps-xen.c linux-2.6.18-xen/arch/x86_64/kernel/traps-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/traps-xen.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/x86_64/kernel/traps-xen.c	2006-09-22 16:38:35.000000000 +0200
 @@ -0,0 +1,1173 @@
 +/*
 + *  linux/arch/x86-64/traps.c
@@ -41107,8 +42674,8 @@
 +}
 +__setup("call_trace=", call_trace_setup);
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/vmlinux.lds.S linux-2.6.18-xen/arch/x86_64/kernel/vmlinux.lds.S
---- linux-2.6.18/arch/x86_64/kernel/vmlinux.lds.S	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/vmlinux.lds.S linux-2.6.18-xen/arch/x86_64/kernel/vmlinux.lds.S
+--- linux-2.6.18.1/arch/x86_64/kernel/vmlinux.lds.S	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/x86_64/kernel/vmlinux.lds.S	2006-09-21 01:33:31.000000000 +0200
 @@ -13,6 +13,12 @@
  OUTPUT_ARCH(i386:x86-64)
@@ -41191,8 +42758,8 @@
 +
 +  NOTES
  }
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/vsyscall-xen.c linux-2.6.18-xen/arch/x86_64/kernel/vsyscall-xen.c
---- linux-2.6.18/arch/x86_64/kernel/vsyscall-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/vsyscall-xen.c linux-2.6.18-xen/arch/x86_64/kernel/vsyscall-xen.c
+--- linux-2.6.18.1/arch/x86_64/kernel/vsyscall-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/vsyscall-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,239 @@
 +/*
@@ -41434,8 +43001,8 @@
 +}
 +
 +__initcall(vsyscall_init);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/kernel/xen_entry.S linux-2.6.18-xen/arch/x86_64/kernel/xen_entry.S
---- linux-2.6.18/arch/x86_64/kernel/xen_entry.S	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/kernel/xen_entry.S linux-2.6.18-xen/arch/x86_64/kernel/xen_entry.S
+--- linux-2.6.18.1/arch/x86_64/kernel/xen_entry.S	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/kernel/xen_entry.S	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,40 @@
 +/*
@@ -41478,8 +43045,8 @@
 +VGCF_IN_SYSCALL = (1<<8)
 +        
 +	
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/Makefile linux-2.6.18-xen/arch/x86_64/Makefile
---- linux-2.6.18/arch/x86_64/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/Makefile linux-2.6.18-xen/arch/x86_64/Makefile
+--- linux-2.6.18.1/arch/x86_64/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/x86_64/Makefile	2006-09-04 16:31:02.000000000 +0200
 @@ -32,6 +32,10 @@
  cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona)
@@ -41522,8 +43089,8 @@
  
  archclean:
  	$(Q)$(MAKE) $(clean)=$(boot)
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/mm/fault-xen.c linux-2.6.18-xen/arch/x86_64/mm/fault-xen.c
---- linux-2.6.18/arch/x86_64/mm/fault-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/mm/fault-xen.c linux-2.6.18-xen/arch/x86_64/mm/fault-xen.c
+--- linux-2.6.18.1/arch/x86_64/mm/fault-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/mm/fault-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,723 @@
 +/*
@@ -42249,8 +43816,8 @@
 +	return 1;
 +}
 +__setup("pagefaulttrace", enable_pagefaulttrace);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/mm/init-xen.c linux-2.6.18-xen/arch/x86_64/mm/init-xen.c
---- linux-2.6.18/arch/x86_64/mm/init-xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/mm/init-xen.c linux-2.6.18-xen/arch/x86_64/mm/init-xen.c
+--- linux-2.6.18.1/arch/x86_64/mm/init-xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/arch/x86_64/mm/init-xen.c	2006-09-04 16:31:03.000000000 +0200
 @@ -0,0 +1,1200 @@
 +/*
@@ -43453,8 +45020,8 @@
 +{
 +	return (addr >= VSYSCALL_START) && (addr < VSYSCALL_END);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/mm/Makefile linux-2.6.18-xen/arch/x86_64/mm/Makefile
---- linux-2.6.18/arch/x86_64/mm/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/mm/Makefile linux-2.6.18-xen/arch/x86_64/mm/Makefile
+--- linux-2.6.18.1/arch/x86_64/mm/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/x86_64/mm/Makefile	2006-09-04 16:31:03.000000000 +0200
 @@ -9,3 +9,13 @@
  obj-$(CONFIG_ACPI_NUMA) += srat.o
@@ -43470,10 +45037,10 @@
 +
 +obj-y := $(call cherrypickxen, $(obj-y))
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/mm/pageattr-xen.c linux-2.6.18-xen/arch/x86_64/mm/pageattr-xen.c
---- linux-2.6.18/arch/x86_64/mm/pageattr-xen.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/arch/x86_64/mm/pageattr-xen.c	2006-09-04 16:31:03.000000000 +0200
-@@ -0,0 +1,396 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/mm/pageattr-xen.c linux-2.6.18-xen/arch/x86_64/mm/pageattr-xen.c
+--- linux-2.6.18.1/arch/x86_64/mm/pageattr-xen.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/arch/x86_64/mm/pageattr-xen.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,398 @@
 +/* 
 + * Copyright 2002 Andi Kleen, SuSE Labs. 
 + * Thanks to Ben LaHaise for precious feedback.
@@ -43797,11 +45364,13 @@
 +	 */
 +#ifndef CONFIG_XEN
 + 	BUG_ON(PageReserved(kpte_page));
++#else
++	if(!PageReserved(kpte_page))
 +#endif
-+	if (page_private(kpte_page) == 0) {
-+		save_page(kpte_page);
-+		revert_page(address, ref_prot);
-+	}
++		if (page_private(kpte_page) == 0) {
++			save_page(kpte_page);
++			revert_page(address, ref_prot);
++		}
 +	return 0;
 +} 
 +
@@ -43870,8 +45439,8 @@
 +
 +EXPORT_SYMBOL(change_page_attr);
 +EXPORT_SYMBOL(global_flush_tlb);
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/oprofile/Makefile linux-2.6.18-xen/arch/x86_64/oprofile/Makefile
---- linux-2.6.18/arch/x86_64/oprofile/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/oprofile/Makefile linux-2.6.18-xen/arch/x86_64/oprofile/Makefile
+--- linux-2.6.18.1/arch/x86_64/oprofile/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/x86_64/oprofile/Makefile	2006-09-04 16:31:03.000000000 +0200
 @@ -11,9 +11,12 @@
  	oprofilefs.o oprofile_stats.o \
@@ -43887,8 +45456,8 @@
 -
 +endif
  oprofile-y = $(DRIVER_OBJS) $(addprefix ../../i386/oprofile/, $(OPROFILE-y))
-diff -urN -x .hg -x .hgtags linux-2.6.18/arch/x86_64/pci/Makefile linux-2.6.18-xen/arch/x86_64/pci/Makefile
---- linux-2.6.18/arch/x86_64/pci/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/arch/x86_64/pci/Makefile linux-2.6.18-xen/arch/x86_64/pci/Makefile
+--- linux-2.6.18.1/arch/x86_64/pci/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/arch/x86_64/pci/Makefile	2006-09-04 16:31:03.000000000 +0200
 @@ -15,11 +15,23 @@
  
@@ -43914,8 +45483,8 @@
 +
 +obj-y := $(call cherrypickxen, $(obj-y))
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/acpi/Kconfig linux-2.6.18-xen/drivers/acpi/Kconfig
---- linux-2.6.18/drivers/acpi/Kconfig	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/acpi/Kconfig linux-2.6.18-xen/drivers/acpi/Kconfig
+--- linux-2.6.18.1/drivers/acpi/Kconfig	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/acpi/Kconfig	2006-09-04 16:31:03.000000000 +0200
 @@ -45,7 +45,7 @@
  
@@ -43934,8 +45503,8 @@
  	default y
  	help
  	  The Power Management Timer is available on all ACPI-capable,
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/char/hangcheck-timer.c linux-2.6.18-xen/drivers/char/hangcheck-timer.c
---- linux-2.6.18/drivers/char/hangcheck-timer.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/char/hangcheck-timer.c linux-2.6.18-xen/drivers/char/hangcheck-timer.c
+--- linux-2.6.18.1/drivers/char/hangcheck-timer.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/char/hangcheck-timer.c	2006-09-04 16:31:04.000000000 +0200
 @@ -117,7 +117,7 @@
  __setup("hcheck_dump_tasks", hangcheck_parse_dump_tasks);
@@ -43946,8 +45515,8 @@
  # define HAVE_MONOTONIC
  # define TIMER_FREQ 1000000000ULL
  #elif defined(CONFIG_IA64)
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/char/mem.c linux-2.6.18-xen/drivers/char/mem.c
---- linux-2.6.18/drivers/char/mem.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/char/mem.c linux-2.6.18-xen/drivers/char/mem.c
+--- linux-2.6.18.1/drivers/char/mem.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/char/mem.c	2006-09-04 16:31:04.000000000 +0200
 @@ -101,6 +101,7 @@
  }
@@ -43983,8 +45552,8 @@
  
  static const struct file_operations kmem_fops = {
  	.llseek		= memory_lseek,
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/char/tpm/Kconfig linux-2.6.18-xen/drivers/char/tpm/Kconfig
---- linux-2.6.18/drivers/char/tpm/Kconfig	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/char/tpm/Kconfig linux-2.6.18-xen/drivers/char/tpm/Kconfig
+--- linux-2.6.18.1/drivers/char/tpm/Kconfig	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/char/tpm/Kconfig	2006-09-04 16:31:04.000000000 +0200
 @@ -31,7 +31,7 @@
  
@@ -44010,8 +45579,8 @@
 +	  will be called tpm_xenu.
  
 +endmenu
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/char/tpm/Makefile linux-2.6.18-xen/drivers/char/tpm/Makefile
---- linux-2.6.18/drivers/char/tpm/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/char/tpm/Makefile linux-2.6.18-xen/drivers/char/tpm/Makefile
+--- linux-2.6.18.1/drivers/char/tpm/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/char/tpm/Makefile	2006-09-04 16:31:04.000000000 +0200
 @@ -9,3 +9,5 @@
  obj-$(CONFIG_TCG_NSC) += tpm_nsc.o
@@ -44019,8 +45588,8 @@
  obj-$(CONFIG_TCG_INFINEON) += tpm_infineon.o
 +obj-$(CONFIG_TCG_XEN) += tpm_xenu.o
 +tpm_xenu-y = tpm_xen.o tpm_vtpm.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/char/tpm/tpm.c linux-2.6.18-xen/drivers/char/tpm/tpm.c
---- linux-2.6.18/drivers/char/tpm/tpm.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/char/tpm/tpm.c linux-2.6.18-xen/drivers/char/tpm/tpm.c
+--- linux-2.6.18.1/drivers/char/tpm/tpm.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/char/tpm/tpm.c	2006-09-04 16:31:04.000000000 +0200
 @@ -30,7 +30,9 @@
  
@@ -44142,8 +45711,8 @@
  	return ret_size;
  }
  EXPORT_SYMBOL_GPL(tpm_read);
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/char/tpm/tpm.h linux-2.6.18-xen/drivers/char/tpm/tpm.h
---- linux-2.6.18/drivers/char/tpm/tpm.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/char/tpm/tpm.h linux-2.6.18-xen/drivers/char/tpm/tpm.h
+--- linux-2.6.18.1/drivers/char/tpm/tpm.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/char/tpm/tpm.h	2006-09-21 01:33:31.000000000 +0200
 @@ -61,6 +61,7 @@
  	const u8 req_complete_mask;
@@ -44173,8 +45742,8 @@
  extern void tpm_get_timeouts(struct tpm_chip *);
  extern void tpm_gen_interrupt(struct tpm_chip *);
  extern void tpm_continue_selftest(struct tpm_chip *);
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/char/tpm/tpm_vtpm.c linux-2.6.18-xen/drivers/char/tpm/tpm_vtpm.c
---- linux-2.6.18/drivers/char/tpm/tpm_vtpm.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/char/tpm/tpm_vtpm.c linux-2.6.18-xen/drivers/char/tpm/tpm_vtpm.c
+--- linux-2.6.18.1/drivers/char/tpm/tpm_vtpm.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/char/tpm/tpm_vtpm.c	2006-09-04 16:31:04.000000000 +0200
 @@ -0,0 +1,547 @@
 +/*
@@ -44724,8 +46293,8 @@
 +	tpm_remove_hardware(dev);
 +	kfree(vtpms);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/char/tpm/tpm_vtpm.h linux-2.6.18-xen/drivers/char/tpm/tpm_vtpm.h
---- linux-2.6.18/drivers/char/tpm/tpm_vtpm.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/char/tpm/tpm_vtpm.h linux-2.6.18-xen/drivers/char/tpm/tpm_vtpm.h
+--- linux-2.6.18.1/drivers/char/tpm/tpm_vtpm.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/char/tpm/tpm_vtpm.h	2006-09-04 16:31:04.000000000 +0200
 @@ -0,0 +1,68 @@
 +#ifndef TPM_VTPM_H
@@ -44796,8 +46365,8 @@
 +}
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/char/tpm/tpm_xen.c linux-2.6.18-xen/drivers/char/tpm/tpm_xen.c
---- linux-2.6.18/drivers/char/tpm/tpm_xen.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/char/tpm/tpm_xen.c linux-2.6.18-xen/drivers/char/tpm/tpm_xen.c
+--- linux-2.6.18.1/drivers/char/tpm/tpm_xen.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/char/tpm/tpm_xen.c	2006-09-04 16:31:04.000000000 +0200
 @@ -0,0 +1,756 @@
 +/*
@@ -45556,9 +47125,9 @@
 +module_init(tpmif_init);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/char/tty_io.c linux-2.6.18-xen/drivers/char/tty_io.c
---- linux-2.6.18/drivers/char/tty_io.c	2006-09-20 05:42:06.000000000 +0200
-+++ linux-2.6.18-xen/drivers/char/tty_io.c	2006-09-04 16:31:04.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/char/tty_io.c linux-2.6.18-xen/drivers/char/tty_io.c
+--- linux-2.6.18.1/drivers/char/tty_io.c	2006-09-20 05:42:06.000000000 +0200
++++ linux-2.6.18-xen/drivers/char/tty_io.c	2006-09-22 16:38:35.000000000 +0200
 @@ -130,6 +130,8 @@
     vt.c for deeply disgusting hack reasons */
  DEFINE_MUTEX(tty_mutex);
@@ -45594,8 +47163,8 @@
  #endif
  	return 0;
  }
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/firmware/Kconfig linux-2.6.18-xen/drivers/firmware/Kconfig
---- linux-2.6.18/drivers/firmware/Kconfig	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/firmware/Kconfig linux-2.6.18-xen/drivers/firmware/Kconfig
+--- linux-2.6.18.1/drivers/firmware/Kconfig	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/firmware/Kconfig	2006-09-04 16:31:04.000000000 +0200
 @@ -7,7 +7,7 @@
  
@@ -45606,8 +47175,8 @@
  	help
  	  Say Y or M here if you want to enable BIOS Enhanced Disk Drive
  	  Services real mode BIOS calls to determine which disk
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/ide/ide-lib.c linux-2.6.18-xen/drivers/ide/ide-lib.c
---- linux-2.6.18/drivers/ide/ide-lib.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/ide/ide-lib.c linux-2.6.18-xen/drivers/ide/ide-lib.c
+--- linux-2.6.18.1/drivers/ide/ide-lib.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/ide/ide-lib.c	2006-09-04 16:31:04.000000000 +0200
 @@ -408,10 +408,10 @@
  {
@@ -45624,8 +47193,8 @@
  			addr = HWIF(drive)->pci_dev->dma_mask;
  	}
  
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/Makefile linux-2.6.18-xen/drivers/Makefile
---- linux-2.6.18/drivers/Makefile	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/Makefile linux-2.6.18-xen/drivers/Makefile
+--- linux-2.6.18.1/drivers/Makefile	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/Makefile	2006-09-04 16:31:03.000000000 +0200
 @@ -31,6 +31,7 @@
  obj-$(CONFIG_NUBUS)		+= nubus/
@@ -45635,8 +47204,8 @@
  obj-$(CONFIG_IDE)		+= ide/
  obj-$(CONFIG_FC4)		+= fc4/
  obj-$(CONFIG_SCSI)		+= scsi/
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/oprofile/buffer_sync.c linux-2.6.18-xen/drivers/oprofile/buffer_sync.c
---- linux-2.6.18/drivers/oprofile/buffer_sync.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/oprofile/buffer_sync.c linux-2.6.18-xen/drivers/oprofile/buffer_sync.c
+--- linux-2.6.18.1/drivers/oprofile/buffer_sync.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/oprofile/buffer_sync.c	2006-09-04 16:31:08.000000000 +0200
 @@ -6,6 +6,10 @@
   *
@@ -45758,8 +47327,8 @@
  				}
  			}
  		}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/oprofile/cpu_buffer.c linux-2.6.18-xen/drivers/oprofile/cpu_buffer.c
---- linux-2.6.18/drivers/oprofile/cpu_buffer.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/oprofile/cpu_buffer.c linux-2.6.18-xen/drivers/oprofile/cpu_buffer.c
+--- linux-2.6.18.1/drivers/oprofile/cpu_buffer.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/oprofile/cpu_buffer.c	2006-09-04 16:31:08.000000000 +0200
 @@ -6,6 +6,10 @@
   *
@@ -45870,8 +47439,8 @@
  /*
   * This serves to avoid cpu buffer overflow, and makes sure
   * the task mortuary progresses
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/oprofile/cpu_buffer.h linux-2.6.18-xen/drivers/oprofile/cpu_buffer.h
---- linux-2.6.18/drivers/oprofile/cpu_buffer.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/oprofile/cpu_buffer.h linux-2.6.18-xen/drivers/oprofile/cpu_buffer.h
+--- linux-2.6.18.1/drivers/oprofile/cpu_buffer.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/oprofile/cpu_buffer.h	2006-09-04 16:31:08.000000000 +0200
 @@ -36,7 +36,7 @@
  	volatile unsigned long tail_pos;
@@ -45895,8 +47464,8 @@
 +#define CPU_DOMAIN_SWITCH       4
  
  #endif /* OPROFILE_CPU_BUFFER_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/oprofile/event_buffer.h linux-2.6.18-xen/drivers/oprofile/event_buffer.h
---- linux-2.6.18/drivers/oprofile/event_buffer.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/oprofile/event_buffer.h linux-2.6.18-xen/drivers/oprofile/event_buffer.h
+--- linux-2.6.18.1/drivers/oprofile/event_buffer.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/oprofile/event_buffer.h	2006-09-04 16:31:08.000000000 +0200
 @@ -29,15 +29,20 @@
  #define CPU_SWITCH_CODE 		2
@@ -45920,8 +47489,8 @@
  /* add data to the event buffer */
  void add_event_entry(unsigned long data);
   
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/oprofile/oprof.c linux-2.6.18-xen/drivers/oprofile/oprof.c
---- linux-2.6.18/drivers/oprofile/oprof.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/oprofile/oprof.c linux-2.6.18-xen/drivers/oprofile/oprof.c
+--- linux-2.6.18.1/drivers/oprofile/oprof.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/oprofile/oprof.c	2006-09-04 16:31:08.000000000 +0200
 @@ -5,6 +5,10 @@
   * @remark Read the file COPYING
@@ -45976,8 +47545,8 @@
  int oprofile_setup(void)
  {
  	int err;
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/oprofile/oprof.h linux-2.6.18-xen/drivers/oprofile/oprof.h
---- linux-2.6.18/drivers/oprofile/oprof.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/oprofile/oprof.h linux-2.6.18-xen/drivers/oprofile/oprof.h
+--- linux-2.6.18.1/drivers/oprofile/oprof.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/oprofile/oprof.h	2006-09-04 16:31:08.000000000 +0200
 @@ -35,5 +35,8 @@
  void oprofile_timer_init(struct oprofile_operations * ops);
@@ -45988,8 +47557,8 @@
 +int oprofile_set_passive(int passive_domains[], unsigned int pdomains);
   
  #endif /* OPROF_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/oprofile/oprofile_files.c linux-2.6.18-xen/drivers/oprofile/oprofile_files.c
---- linux-2.6.18/drivers/oprofile/oprofile_files.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/oprofile/oprofile_files.c linux-2.6.18-xen/drivers/oprofile/oprofile_files.c
+--- linux-2.6.18.1/drivers/oprofile/oprofile_files.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/oprofile/oprofile_files.c	2006-09-04 16:31:08.000000000 +0200
 @@ -5,15 +5,21 @@
   * @remark Read the file COPYING
@@ -46224,8 +47793,8 @@
  	oprofilefs_create_file(sb, root, "buffer", &event_buffer_fops);
  	oprofilefs_create_ulong(sb, root, "buffer_size", &fs_buffer_size);
  	oprofilefs_create_ulong(sb, root, "buffer_watershed", &fs_buffer_watershed);
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/pci/Kconfig linux-2.6.18-xen/drivers/pci/Kconfig
---- linux-2.6.18/drivers/pci/Kconfig	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/pci/Kconfig linux-2.6.18-xen/drivers/pci/Kconfig
+--- linux-2.6.18.1/drivers/pci/Kconfig	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/drivers/pci/Kconfig	2006-09-04 16:31:08.000000000 +0200
 @@ -5,6 +5,7 @@
  	bool "Message Signaled Interrupts (MSI and MSI-X)"
@@ -46235,9 +47804,9 @@
  	help
  	   This allows device drivers to enable MSI (Message Signaled
  	   Interrupts).  Message Signaled Interrupts enable a device to
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/serial/Kconfig linux-2.6.18-xen/drivers/serial/Kconfig
---- linux-2.6.18/drivers/serial/Kconfig	2006-09-20 05:42:06.000000000 +0200
-+++ linux-2.6.18-xen/drivers/serial/Kconfig	2006-09-04 16:31:10.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/serial/Kconfig linux-2.6.18-xen/drivers/serial/Kconfig
+--- linux-2.6.18.1/drivers/serial/Kconfig	2006-09-20 05:42:06.000000000 +0200
++++ linux-2.6.18-xen/drivers/serial/Kconfig	2006-09-22 16:38:35.000000000 +0200
 @@ -11,6 +11,7 @@
  config SERIAL_8250
  	tristate "8250/16550 and compatible serial support"
@@ -46246,10 +47815,10 @@
  	select SERIAL_CORE
  	---help---
  	  This selects whether you want to include the driver for the standard
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/balloon/balloon.c linux-2.6.18-xen/drivers/xen/balloon/balloon.c
---- linux-2.6.18/drivers/xen/balloon/balloon.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/balloon/balloon.c	2006-09-04 16:31:13.000000000 +0200
-@@ -0,0 +1,625 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/balloon/balloon.c linux-2.6.18-xen/drivers/xen/balloon/balloon.c
+--- linux-2.6.18.1/drivers/xen/balloon/balloon.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/balloon/balloon.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,637 @@
 +/******************************************************************************
 + * balloon.c
 + *
@@ -46785,75 +48354,87 @@
 +	return 0;
 +}
 +
-+struct page *balloon_alloc_empty_page_range(unsigned long nr_pages)
++struct page **alloc_empty_pages_and_pagevec(int nr_pages)
 +{
-+	unsigned long vstart, flags;
-+	unsigned int  order = get_order(nr_pages * PAGE_SIZE);
-+	int ret;
-+	unsigned long i;
-+	struct page *page;
++	unsigned long vaddr, flags;
++	struct page *page, **pagevec;
++	int i, ret;
 +
-+	vstart = __get_free_pages(GFP_KERNEL, order);
-+	if (vstart == 0)
++	pagevec = kmalloc(sizeof(page) * nr_pages, GFP_KERNEL);
++	if (pagevec == NULL)
 +		return NULL;
 +
-+	scrub_pages(vstart, 1 << order);
-+
-+	balloon_lock(flags);
-+	if (xen_feature(XENFEAT_auto_translated_physmap)) {
-+		unsigned long gmfn = __pa(vstart) >> PAGE_SHIFT;
-+		struct xen_memory_reservation reservation = {
-+			.nr_extents   = 1,
-+			.extent_order = order,
-+			.domid        = DOMID_SELF
-+		};
-+		set_xen_guest_handle(reservation.extent_start, &gmfn);
-+		ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-+					   &reservation);
-+		if (ret == -ENOSYS)
-+			goto err;
-+		BUG_ON(ret != 1);
-+	} else {
-+		ret = apply_to_page_range(&init_mm, vstart, PAGE_SIZE << order,
-+					  dealloc_pte_fn, NULL);
-+		if (ret == -ENOSYS)
++	for (i = 0; i < nr_pages; i++) {
++		page = pagevec[i] = alloc_page(GFP_KERNEL);
++		if (page == NULL)
 +			goto err;
-+		BUG_ON(ret);
-+	}
-+	current_pages -= 1UL << order;
-+	totalram_pages = current_pages;
-+	balloon_unlock(flags);
 +
-+	schedule_work(&balloon_worker);
++		vaddr = (unsigned long)page_address(page);
 +
-+	flush_tlb_all();
++		scrub_pages(vaddr, 1);
 +
-+	page = virt_to_page(vstart);
++		balloon_lock(flags);
 +
-+	for (i = 0; i < (1UL << order); i++)
-+		init_page_count(page + i);
++		if (xen_feature(XENFEAT_auto_translated_physmap)) {
++			unsigned long gmfn = page_to_pfn(page);
++			struct xen_memory_reservation reservation = {
++				.nr_extents   = 1,
++				.extent_order = 0,
++				.domid        = DOMID_SELF
++			};
++			set_xen_guest_handle(reservation.extent_start, &gmfn);
++			ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
++						   &reservation);
++			if (ret == 1)
++				ret = 0; /* success */
++		} else {
++			ret = apply_to_page_range(&init_mm, vaddr, PAGE_SIZE,
++						  dealloc_pte_fn, NULL);
++		}
 +
-+	return page;
++		if (ret != 0) {
++			balloon_unlock(flags);
++			__free_page(page);
++			goto err;
++		}
++
++		totalram_pages = --current_pages;
++
++		balloon_unlock(flags);
++	}
++
++ out:
++	schedule_work(&balloon_worker);
++	flush_tlb_all();
++	return pagevec;
 +
 + err:
-+	free_pages(vstart, order);
++	balloon_lock(flags);
++	while (--i >= 0)
++		balloon_append(pagevec[i]);
 +	balloon_unlock(flags);
-+	return NULL;
++	kfree(pagevec);
++	pagevec = NULL;
++	goto out;
 +}
 +
-+void balloon_dealloc_empty_page_range(
-+	struct page *page, unsigned long nr_pages)
++void free_empty_pages_and_pagevec(struct page **pagevec, int nr_pages)
 +{
-+	unsigned long i, flags;
-+	unsigned int  order = get_order(nr_pages * PAGE_SIZE);
++	unsigned long flags;
++	int i;
++
++	if (pagevec == NULL)
++		return;
 +
 +	balloon_lock(flags);
-+	for (i = 0; i < (1UL << order); i++) {
-+		BUG_ON(page_count(page + i) != 1);
-+		balloon_append(page + i);
++	for (i = 0; i < nr_pages; i++) {
++		BUG_ON(page_count(pagevec[i]) != 1);
++		balloon_append(pagevec[i]);
 +	}
 +	balloon_unlock(flags);
 +
++	kfree(pagevec);
++
 +	schedule_work(&balloon_worker);
 +}
 +
@@ -46870,21 +48451,21 @@
 +}
 +
 +EXPORT_SYMBOL_GPL(balloon_update_driver_allowance);
-+EXPORT_SYMBOL_GPL(balloon_alloc_empty_page_range);
-+EXPORT_SYMBOL_GPL(balloon_dealloc_empty_page_range);
++EXPORT_SYMBOL_GPL(alloc_empty_pages_and_pagevec);
++EXPORT_SYMBOL_GPL(free_empty_pages_and_pagevec);
 +EXPORT_SYMBOL_GPL(balloon_release_driver_page);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/balloon/Makefile linux-2.6.18-xen/drivers/xen/balloon/Makefile
---- linux-2.6.18/drivers/xen/balloon/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/balloon/Makefile linux-2.6.18-xen/drivers/xen/balloon/Makefile
+--- linux-2.6.18.1/drivers/xen/balloon/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/balloon/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,2 @@
 +
 +obj-y += balloon.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blkback/blkback.c linux-2.6.18-xen/drivers/xen/blkback/blkback.c
---- linux-2.6.18/drivers/xen/blkback/blkback.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/blkback/blkback.c	2006-09-04 16:31:13.000000000 +0200
-@@ -0,0 +1,567 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blkback/blkback.c linux-2.6.18-xen/drivers/xen/blkback/blkback.c
+--- linux-2.6.18.1/drivers/xen/blkback/blkback.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/blkback/blkback.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,549 @@
 +/******************************************************************************
 + * arch/xen/drivers/blkif/backend/main.c
 + * 
@@ -46944,8 +48525,6 @@
 +module_param_named(reqs, blkif_reqs, int, 0);
 +MODULE_PARM_DESC(reqs, "Number of blkback requests to allocate");
 +
-+static int mmap_pages;
-+
 +/* Run-time switchable: /sys/module/blkback/parameters/ */
 +static unsigned int log_stats = 0;
 +static unsigned int debug_lvl = 0;
@@ -46975,8 +48554,7 @@
 +
 +#define BLKBACK_INVALID_HANDLE (~0)
 +
-+static unsigned long mmap_vstart;
-+static unsigned long *pending_vaddrs;
++static struct page **pending_pages;
 +static grant_handle_t *pending_grant_handles;
 +
 +static inline int vaddr_pagenr(pending_req_t *req, int seg)
@@ -46986,7 +48564,8 @@
 +
 +static inline unsigned long vaddr(pending_req_t *req, int seg)
 +{
-+	return pending_vaddrs[vaddr_pagenr(req, seg)];
++	unsigned long pfn = page_to_pfn(pending_pages[vaddr_pagenr(req, seg)]);
++	return (unsigned long)pfn_to_kaddr(pfn);
 +}
 +
 +#define pending_handle(_req, _seg) \
@@ -47394,66 +48973,50 @@
 +
 +static int __init blkif_init(void)
 +{
-+	struct page *page;
-+	int i;
++	int i, mmap_pages;
 +
 +	if (!is_running_on_xen())
 +		return -ENODEV;
 +
 +	mmap_pages            = blkif_reqs * BLKIF_MAX_SEGMENTS_PER_REQUEST;
 +
-+#ifdef CONFIG_XEN_IA64_DOM0_NON_VP
-+	extern unsigned long alloc_empty_foreign_map_page_range(
-+		unsigned long pages);
-+	mmap_vstart = (unsigned long)
-+		alloc_empty_foreign_map_page_range(mmap_pages);
-+#else /* ! ia64 */
-+	page = balloon_alloc_empty_page_range(mmap_pages);
-+	if (page == NULL)
-+		return -ENOMEM;
-+	mmap_vstart = (unsigned long)pfn_to_kaddr(page_to_pfn(page));
-+#endif
-+
 +	pending_reqs          = kmalloc(sizeof(pending_reqs[0]) *
 +					blkif_reqs, GFP_KERNEL);
 +	pending_grant_handles = kmalloc(sizeof(pending_grant_handles[0]) *
 +					mmap_pages, GFP_KERNEL);
-+	pending_vaddrs        = kmalloc(sizeof(pending_vaddrs[0]) *
-+					mmap_pages, GFP_KERNEL);
-+	if (!pending_reqs || !pending_grant_handles || !pending_vaddrs) {
-+		kfree(pending_reqs);
-+		kfree(pending_grant_handles);
-+		kfree(pending_vaddrs);
-+		printk("%s: out of memory\n", __FUNCTION__);
-+		return -ENOMEM;
-+	}
++	pending_pages         = alloc_empty_pages_and_pagevec(mmap_pages);
 +
-+	blkif_interface_init();
-+	
-+	printk("%s: reqs=%d, pages=%d, mmap_vstart=0x%lx\n",
-+	       __FUNCTION__, blkif_reqs, mmap_pages, mmap_vstart);
-+	BUG_ON(mmap_vstart == 0);
-+	for (i = 0; i < mmap_pages; i++) {
-+		pending_vaddrs[i] = mmap_vstart + (i << PAGE_SHIFT);
++	if (!pending_reqs || !pending_grant_handles || !pending_pages)
++		goto out_of_memory;
++
++	for (i = 0; i < mmap_pages; i++)
 +		pending_grant_handles[i] = BLKBACK_INVALID_HANDLE;
-+	}
++
++	blkif_interface_init();
 +
 +	memset(pending_reqs, 0, sizeof(pending_reqs));
 +	INIT_LIST_HEAD(&pending_free);
 +
 +	for (i = 0; i < blkif_reqs; i++)
 +		list_add_tail(&pending_reqs[i].free_list, &pending_free);
-+    
++
 +	blkif_xenbus_init();
 +
 +	return 0;
++
++ out_of_memory:
++	kfree(pending_reqs);
++	kfree(pending_grant_handles);
++	free_empty_pages_and_pagevec(pending_pages, mmap_pages);
++	printk("%s: out of memory\n", __FUNCTION__);
++	return -ENOMEM;
 +}
 +
 +module_init(blkif_init);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blkback/common.h linux-2.6.18-xen/drivers/xen/blkback/common.h
---- linux-2.6.18/drivers/xen/blkback/common.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blkback/common.h linux-2.6.18-xen/drivers/xen/blkback/common.h
+--- linux-2.6.18.1/drivers/xen/blkback/common.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/blkback/common.h	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,133 @@
 +/* 
@@ -47589,8 +49152,8 @@
 +int blkif_schedule(void *arg);
 +
 +#endif /* __BLKIF__BACKEND__COMMON_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blkback/interface.c linux-2.6.18-xen/drivers/xen/blkback/interface.c
---- linux-2.6.18/drivers/xen/blkback/interface.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blkback/interface.c linux-2.6.18-xen/drivers/xen/blkback/interface.c
+--- linux-2.6.18.1/drivers/xen/blkback/interface.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/blkback/interface.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,171 @@
 +/******************************************************************************
@@ -47764,15 +49327,15 @@
 +	blkif_cachep = kmem_cache_create("blkif_cache", sizeof(blkif_t), 
 +					 0, 0, NULL, NULL);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blkback/Makefile linux-2.6.18-xen/drivers/xen/blkback/Makefile
---- linux-2.6.18/drivers/xen/blkback/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blkback/Makefile linux-2.6.18-xen/drivers/xen/blkback/Makefile
+--- linux-2.6.18.1/drivers/xen/blkback/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/blkback/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,3 @@
 +obj-$(CONFIG_XEN_BLKDEV_BACKEND) := blkbk.o
 +
 +blkbk-y	:= blkback.o xenbus.o interface.o vbd.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blkback/vbd.c linux-2.6.18-xen/drivers/xen/blkback/vbd.c
---- linux-2.6.18/drivers/xen/blkback/vbd.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blkback/vbd.c linux-2.6.18-xen/drivers/xen/blkback/vbd.c
+--- linux-2.6.18.1/drivers/xen/blkback/vbd.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/blkback/vbd.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,119 @@
 +/******************************************************************************
@@ -47894,8 +49457,8 @@
 + out:
 +	return rc;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blkback/xenbus.c linux-2.6.18-xen/drivers/xen/blkback/xenbus.c
---- linux-2.6.18/drivers/xen/blkback/xenbus.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blkback/xenbus.c linux-2.6.18-xen/drivers/xen/blkback/xenbus.c
+--- linux-2.6.18.1/drivers/xen/blkback/xenbus.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/blkback/xenbus.c	2006-09-21 01:33:31.000000000 +0200
 @@ -0,0 +1,468 @@
 +/*  Xenbus code for blkif backend
@@ -48366,10 +49929,10 @@
 +{
 +	xenbus_register_backend(&blkback);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blkfront/blkfront.c linux-2.6.18-xen/drivers/xen/blkfront/blkfront.c
---- linux-2.6.18/drivers/xen/blkfront/blkfront.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/blkfront/blkfront.c	2006-09-21 01:33:31.000000000 +0200
-@@ -0,0 +1,842 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blkfront/blkfront.c linux-2.6.18-xen/drivers/xen/blkfront/blkfront.c
+--- linux-2.6.18.1/drivers/xen/blkfront/blkfront.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/blkfront/blkfront.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,846 @@
 +/******************************************************************************
 + * blkfront.c
 + * 
@@ -48645,7 +50208,7 @@
 +			xenbus_dev_fatal(dev, -ENODEV, "bdget failed");
 +
 +		mutex_lock(&bd->bd_mutex);
-+		if (info->users > 0 && system_state == SYSTEM_RUNNING)
++		if (info->users > 0)
 +			xenbus_dev_error(dev, -EBUSY,
 +					 "Device in use; refusing to close");
 +		else
@@ -48727,9 +50290,11 @@
 +	blk_stop_queue(info->rq);
 +	/* No more gnttab callback work. */
 +	gnttab_cancel_free_callback(&info->callback);
-+	flush_scheduled_work();
 +	spin_unlock_irqrestore(&blkif_io_lock, flags);
 +
++	/* Flush gnttab callback work. Must be done with no locks held. */
++	flush_scheduled_work();
++
 +	xlvbd_del(info);
 +
 +	xenbus_frontend_closed(dev);
@@ -49086,9 +50651,11 @@
 +		blk_stop_queue(info->rq);
 +	/* No more gnttab callback work. */
 +	gnttab_cancel_free_callback(&info->callback);
-+	flush_scheduled_work();
 +	spin_unlock_irq(&blkif_io_lock);
 +
++	/* Flush gnttab callback work. Must be done with no locks held. */
++	flush_scheduled_work();
++
 +	/* Free resources associated with old device channel. */
 +	if (info->ring_ref != GRANT_INVALID_REF) {
 +		gnttab_end_foreign_access(info->ring_ref, 0,
@@ -49212,8 +50779,8 @@
 +module_exit(xlblk_exit);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blkfront/block.h linux-2.6.18-xen/drivers/xen/blkfront/block.h
---- linux-2.6.18/drivers/xen/blkfront/block.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blkfront/block.h linux-2.6.18-xen/drivers/xen/blkfront/block.h
+--- linux-2.6.18.1/drivers/xen/blkfront/block.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/blkfront/block.h	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,154 @@
 +/******************************************************************************
@@ -49370,8 +50937,8 @@
 +void xlvbd_del(struct blkfront_info *info);
 +
 +#endif /* __XEN_DRIVERS_BLOCK_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blkfront/Kconfig linux-2.6.18-xen/drivers/xen/blkfront/Kconfig
---- linux-2.6.18/drivers/xen/blkfront/Kconfig	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blkfront/Kconfig linux-2.6.18-xen/drivers/xen/blkfront/Kconfig
+--- linux-2.6.18.1/drivers/xen/blkfront/Kconfig	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/blkfront/Kconfig	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,6 @@
 +
@@ -49380,8 +50947,8 @@
 +	depends on ARCH_XEN
 +	help
 +	  Block device driver for Xen
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blkfront/Makefile linux-2.6.18-xen/drivers/xen/blkfront/Makefile
---- linux-2.6.18/drivers/xen/blkfront/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blkfront/Makefile linux-2.6.18-xen/drivers/xen/blkfront/Makefile
+--- linux-2.6.18.1/drivers/xen/blkfront/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/blkfront/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,5 @@
 +
@@ -49389,8 +50956,8 @@
 +
 +xenblk-objs := blkfront.o vbd.o
 +
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blkfront/vbd.c linux-2.6.18-xen/drivers/xen/blkfront/vbd.c
---- linux-2.6.18/drivers/xen/blkfront/vbd.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blkfront/vbd.c linux-2.6.18-xen/drivers/xen/blkfront/vbd.c
+--- linux-2.6.18.1/drivers/xen/blkfront/vbd.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/blkfront/vbd.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,318 @@
 +/******************************************************************************
@@ -49711,10 +51278,10 @@
 +	blk_cleanup_queue(info->rq);
 +	info->rq = NULL;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blktap/blktap.c linux-2.6.18-xen/drivers/xen/blktap/blktap.c
---- linux-2.6.18/drivers/xen/blktap/blktap.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/blktap/blktap.c	2006-09-04 16:31:13.000000000 +0200
-@@ -0,0 +1,1444 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blktap/blktapmain.c linux-2.6.18-xen/drivers/xen/blktap/blktapmain.c
+--- linux-2.6.18.1/drivers/xen/blktap/blktapmain.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/blktap/blktapmain.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,1393 @@
 +/******************************************************************************
 + * drivers/xen/blktap/blktap.c
 + * 
@@ -49761,7 +51328,6 @@
 +#include <linux/kernel.h>
 +#include <linux/fs.h>
 +#include <linux/mm.h>
-+#include <linux/miscdevice.h>
 +#include <linux/errno.h>
 +#include <linux/major.h>
 +#include <linux/gfp.h>
@@ -49771,6 +51337,30 @@
 +#define MAX_TAP_DEV 100     /*the maximum number of tapdisk ring devices    */
 +#define MAX_DEV_NAME 100    /*the max tapdisk ring device name e.g. blktap0 */
 +
++
++struct class *xen_class;
++EXPORT_SYMBOL_GPL(xen_class);
++
++/*
++ * Setup the xen class.  This should probably go in another file, but
++ * since blktap is the only user of it so far, it gets to keep it.
++ */
++int setup_xen_class(void)
++{
++	int ret;
++
++	if (xen_class)
++		return 0;
++
++	xen_class = class_create(THIS_MODULE, "xen");
++	if ((ret = IS_ERR(xen_class))) {
++		xen_class = NULL;
++		return ret;
++	}
++
++	return 0;
++}
++
 +/*
 + * The maximum number of requests that can be outstanding at any time
 + * is determined by 
@@ -49816,20 +51406,15 @@
 +	unsigned long *idx_map;       /*Record the user ring id to kern 
 +					[req id, idx] tuple                  */
 +	blkif_t *blkif;               /*Associate blkif with tapdev          */
++	int sysfs_set;                /*Set if it has a class device.        */
 +} tap_blkif_t;
 +
-+/*Private data struct associated with the inode*/
-+typedef struct private_info {
-+	int idx;
-+} private_info_t;
-+
 +/*Data struct handed back to userspace for tapdisk device to VBD mapping*/
 +typedef struct domid_translate {
 +	unsigned short domid;
 +	unsigned short busid;
 +} domid_translate_t ;
 +
-+
 +static domid_translate_t  translate_domid[MAX_TAP_DEV];
 +static tap_blkif_t *tapfds[MAX_TAP_DEV];
 +
@@ -49884,16 +51469,18 @@
 +
 +#define BLKBACK_INVALID_HANDLE (~0)
 +
-+typedef struct mmap_page {
-+	unsigned long start;
-+	struct page *mpage;
-+} mmap_page_t;
++static struct page **foreign_pages[MAX_DYNAMIC_MEM];
++static inline unsigned long idx_to_kaddr(
++	unsigned int mmap_idx, unsigned int req_idx, unsigned int sg_idx)
++{
++	unsigned int arr_idx = req_idx*BLKIF_MAX_SEGMENTS_PER_REQUEST + sg_idx;
++	unsigned long pfn = page_to_pfn(foreign_pages[mmap_idx][arr_idx]);
++	return (unsigned long)pfn_to_kaddr(pfn);
++}
 +
-+static mmap_page_t mmap_start[MAX_DYNAMIC_MEM];
 +static unsigned short mmap_alloc = 0;
 +static unsigned short mmap_lock = 0;
 +static unsigned short mmap_inuse = 0;
-+static unsigned long *pending_addrs[MAX_DYNAMIC_MEM];
 +
 +/******************************************************************
 + * GRANT HANDLES
@@ -49916,15 +51503,13 @@
 +    + (_i)])
 +
 +
-+static int blktap_read_ufe_ring(int idx); /*local prototypes*/
++static int blktap_read_ufe_ring(tap_blkif_t *info); /*local prototypes*/
 +
-+#define BLKTAP_MINOR 0  /*/dev/xen/blktap resides at device number
-+			  major=254, minor numbers begin at 0            */ 
-+#define BLKTAP_DEV_MAJOR 254         /* TODO: Make major number dynamic  *
-+                                      * and create devices in the kernel *
-+				      */
++#define BLKTAP_MINOR 0  /*/dev/xen/blktap has a dynamic major */
 +#define BLKTAP_DEV_DIR  "/dev/xen"
 +
++static int blktap_major;
++
 +/* blktap IOCTLs: */
 +#define BLKTAP_IOCTL_KICK_FE         1
 +#define BLKTAP_IOCTL_KICK_BE         2 /* currently unused */
@@ -49980,7 +51565,8 @@
 +{
 +	int i;
 +	for (i = 0; i < MAX_PENDING_REQS; i++)
-+		if (idx_map[i] == INVALID_REQ) return i;
++		if (idx_map[i] == INVALID_REQ)
++			return i;
 +
 +	return INVALID_REQ;
 +}
@@ -50027,8 +51613,6 @@
 +                        unsigned int cmd, unsigned long arg);
 +static unsigned int blktap_poll(struct file *file, poll_table *wait);
 +
-+struct miscdevice *set_misc(int minor, char *name, int dev);
-+
 +static struct file_operations blktap_fops = {
 +	.owner   = THIS_MODULE,
 +	.poll    = blktap_poll,
@@ -50060,6 +51644,16 @@
 +	
 +done:
 +	spin_unlock_irqrestore(&pending_free_lock, flags);
++
++	/*
++	 * We are protected by having the dev_pending set.
++	 */
++	if (!tapfds[i]->sysfs_set && xen_class) {
++		class_device_create(xen_class, NULL,
++				    MKDEV(blktap_major, ret), NULL,
++				    "blktap%d", ret);
++		tapfds[i]->sysfs_set = 1;
++	}
 +	return ret;
 +}
 +
@@ -50085,9 +51679,8 @@
 +	info = tapfds[idx];
 +	if ( (idx > 0) && (idx < MAX_TAP_DEV) && (info->pid > 0) ) {
 +		ptask = find_task_by_pid(info->pid);
-+		if (ptask) { 
++		if (ptask)
 +			info->status = CLEANSHUTDOWN;
-+ 		}
 +	}
 +	info->blkif = NULL;
 +	return;
@@ -50098,7 +51691,6 @@
 +	blkif_sring_t *sring;
 +	int idx = iminor(inode) - BLKTAP_MINOR;
 +	tap_blkif_t *info;
-+	private_info_t *prv;
 +	int i;
 +	
 +	if (tapfds[idx] == NULL) {
@@ -50126,9 +51718,7 @@
 +	SHARED_RING_INIT(sring);
 +	FRONT_RING_INIT(&info->ufe_ring, sring, PAGE_SIZE);
 +	
-+	prv = kzalloc(sizeof(private_info_t),GFP_KERNEL);
-+	prv->idx = idx;
-+	filp->private_data = prv;
++	filp->private_data = info;
 +	info->vma = NULL;
 +
 +	info->idx_map = kmalloc(sizeof(unsigned long) * MAX_PENDING_REQS, 
@@ -50149,17 +51739,16 @@
 +
 +static int blktap_release(struct inode *inode, struct file *filp)
 +{
-+	int idx = iminor(inode) - BLKTAP_MINOR;
-+	tap_blkif_t *info;
++	tap_blkif_t *info = filp->private_data;
 +	
-+	if (tapfds[idx] == NULL) {
++	/* can this ever happen? - sdr */
++	if (!info) {
 +		WPRINTK("Trying to free device that doesn't exist "
-+		       "[/dev/xen/blktap%d]\n",idx);
-+		return -1;
++		       "[/dev/xen/blktap%d]\n",iminor(inode) - BLKTAP_MINOR);
++		return -EBADF;
 +	}
-+	info = tapfds[idx];
 +	info->dev_inuse = 0;
-+	DPRINTK("Freeing device [/dev/xen/blktap%d]\n",idx);
++	DPRINTK("Freeing device [/dev/xen/blktap%d]\n",info->minor);
 +
 +	/* Free the ring page. */
 +	ClearPageReserved(virt_to_page(info->ufe_ring.sring));
@@ -50173,8 +51762,6 @@
 +		info->vma = NULL;
 +	}
 +	
-+	if (filp->private_data) kfree(filp->private_data);
-+
 +	if ( (info->status != CLEANSHUTDOWN) && (info->blkif != NULL) ) {
 +		kthread_stop(info->blkif->xenblkd);
 +		info->blkif->xenblkd = NULL;
@@ -50207,16 +51794,12 @@
 +	int size;
 +	struct page **map;
 +	int i;
-+	private_info_t *prv;
-+	tap_blkif_t *info;
++	tap_blkif_t *info = filp->private_data;
 +
-+	/*Retrieve the dev info*/
-+	prv = (private_info_t *)filp->private_data;
-+	if (prv == NULL) {
++	if (info == NULL) {
 +		WPRINTK("blktap: mmap, retrieving idx failed\n");
 +		return -ENOMEM;
 +	}
-+	info = tapfds[prv->idx];
 +	
 +	vma->vm_flags |= VM_RESERVED;
 +	vma->vm_ops = &blktap_vm_ops;
@@ -50272,20 +51855,17 @@
 +static int blktap_ioctl(struct inode *inode, struct file *filp,
 +                        unsigned int cmd, unsigned long arg)
 +{
-+	int idx = iminor(inode) - BLKTAP_MINOR;
++	tap_blkif_t *info = filp->private_data;
++
 +	switch(cmd) {
 +	case BLKTAP_IOCTL_KICK_FE: 
 +	{
 +		/* There are fe messages to process. */
-+		return blktap_read_ufe_ring(idx);
++		return blktap_read_ufe_ring(info);
 +	}
 +	case BLKTAP_IOCTL_SETMODE:
 +	{
-+		tap_blkif_t *info = tapfds[idx];
-+		
-+		if ( (idx > 0) && (idx < MAX_TAP_DEV) 
-+		     && (tapfds[idx] != NULL) ) 
-+		{
++		if (info) {
 +			if (BLKTAP_MODE_VALID(arg)) {
 +				info->mode = arg;
 +				/* XXX: may need to flush rings here. */
@@ -50298,11 +51878,7 @@
 +	}
 +	case BLKTAP_IOCTL_PRINT_IDXS:
 +        {
-+		tap_blkif_t *info = tapfds[idx];
-+		
-+		if ( (idx > 0) && (idx < MAX_TAP_DEV) 
-+		     && (tapfds[idx] != NULL) ) 
-+		{
++		if (info) {
 +			printk("User Rings: \n-----------\n");
 +			printk("UF: rsp_cons: %2d, req_prod_prv: %2d "
 +				"| req_prod: %2d, rsp_prod: %2d\n",
@@ -50315,11 +51891,7 @@
 +        }
 +	case BLKTAP_IOCTL_SENDPID:
 +	{
-+		tap_blkif_t *info = tapfds[idx];
-+		
-+		if ( (idx > 0) && (idx < MAX_TAP_DEV) 
-+		     && (tapfds[idx] != NULL) ) 
-+		{
++		if (info) {
 +			info->pid = (pid_t)arg;
 +			DPRINTK("blktap: pid received %d\n", 
 +			       info->pid);
@@ -50347,26 +51919,38 @@
 +	case BLKTAP_IOCTL_FREEINTF:
 +	{
 +		unsigned long dev = arg;
-+		tap_blkif_t *info = NULL;
++		unsigned long flags;
++
++		/* Looking at another device */
++		info = NULL;
 +
-+		if ( (dev > 0) && (dev < MAX_TAP_DEV) ) info = tapfds[dev];
++		if ( (dev > 0) && (dev < MAX_TAP_DEV) )
++			info = tapfds[dev];
 +
++		spin_lock_irqsave(&pending_free_lock, flags);
 +		if ( (info != NULL) && (info->dev_pending) )
 +			info->dev_pending = 0;
++		spin_unlock_irqrestore(&pending_free_lock, flags);
++
 +		return 0;
 +	}
 +	case BLKTAP_IOCTL_MINOR:
 +	{
 +		unsigned long dev = arg;
-+		tap_blkif_t *info = NULL;
++
++		/* Looking at another device */
++		info = NULL;
 +		
-+		if ( (dev > 0) && (dev < MAX_TAP_DEV) ) info = tapfds[dev];
++		if ( (dev > 0) && (dev < MAX_TAP_DEV) )
++			info = tapfds[dev];
 +		
-+		if (info != NULL) return info->minor;
-+		else return -1;
++		if (info != NULL)
++			return info->minor;
++		else
++			return -1;
 +	}
 +	case BLKTAP_IOCTL_MAJOR:
-+		return BLKTAP_DEV_MAJOR;
++		return blktap_major;
 +
 +	case BLKTAP_QUERY_ALLOC_REQS:
 +	{
@@ -50378,25 +51962,21 @@
 +	return -ENOIOCTLCMD;
 +}
 +
-+static unsigned int blktap_poll(struct file *file, poll_table *wait)
++static unsigned int blktap_poll(struct file *filp, poll_table *wait)
 +{
-+	private_info_t *prv;
-+	tap_blkif_t *info;
++	tap_blkif_t *info = filp->private_data;
 +	
-+	/*Retrieve the dev info*/
-+	prv = (private_info_t *)file->private_data;
-+	if (prv == NULL) {
++	if (!info) {
 +		WPRINTK(" poll, retrieving idx failed\n");
 +		return 0;
 +	}
-+	
-+	if (prv->idx == 0) return 0;
-+	
-+	info = tapfds[prv->idx];
-+	
-+	poll_wait(file, &info->wait, wait);
++
++	/* do not work on the control device */
++	if (!info->minor)
++		return 0;
++
++	poll_wait(filp, &info->wait, wait);
 +	if (info->ufe_ring.req_prod_pvt != info->ufe_ring.sring->req_prod) {
-+		flush_tlb_all();
 +		RING_PUSH_REQUESTS(&info->ufe_ring);
 +		return POLLIN | POLLRDNORM;
 +	}
@@ -50407,11 +51987,14 @@
 +{
 +	tap_blkif_t *info;
 +
-+	if (idx == 0) return;
++	if (idx == 0)
++		return;
 +	
 +	info = tapfds[idx];
 +	
-+	if (info != NULL) wake_up_interruptible(&info->wait);
++	if (info != NULL)
++		wake_up_interruptible(&info->wait);
++
 +	return;
 +}
 +
@@ -50428,66 +52011,21 @@
 +static int req_increase(void)
 +{
 +	int i, j;
-+	struct page *page;
-+	unsigned long flags;
-+	int ret;
-+
-+	spin_lock_irqsave(&pending_free_lock, flags);
 +
-+	ret = -EINVAL;
 +	if (mmap_alloc >= MAX_PENDING_REQS || mmap_lock) 
-+		goto done;
-+
-+#ifdef __ia64__
-+	extern unsigned long alloc_empty_foreign_map_page_range(
-+		unsigned long pages);
-+	mmap_start[mmap_alloc].start = (unsigned long)
-+		alloc_empty_foreign_map_page_range(mmap_pages);
-+#else /* ! ia64 */
-+	page = balloon_alloc_empty_page_range(mmap_pages);
-+	ret = -ENOMEM;
-+	if (page == NULL) {
-+		printk("%s balloon_alloc_empty_page_range gave NULL\n", __FUNCTION__);
-+		goto done;
-+	}
-+
-+	/* Pin all of the pages. */
-+	for (i=0; i<mmap_pages; i++)
-+		get_page(&page[i]);
-+
-+	mmap_start[mmap_alloc].start = 
-+		(unsigned long)pfn_to_kaddr(page_to_pfn(page));
-+	mmap_start[mmap_alloc].mpage = page;
-+
-+#endif
-+
-+	pending_reqs[mmap_alloc]  = kzalloc(sizeof(pending_req_t) *
-+					blkif_reqs, GFP_KERNEL);
-+	pending_addrs[mmap_alloc] = kzalloc(sizeof(unsigned long) *
-+					mmap_pages, GFP_KERNEL);
-+
-+	ret = -ENOMEM;
-+	if (!pending_reqs[mmap_alloc] || !pending_addrs[mmap_alloc]) {
-+		kfree(pending_reqs[mmap_alloc]);
-+		kfree(pending_addrs[mmap_alloc]);
-+		WPRINTK("%s: out of memory\n", __FUNCTION__);
-+		ret = -ENOMEM;
-+		goto done;
-+	}
-+
-+	ret = 0;
++		return -EINVAL;
 +
-+	DPRINTK("%s: reqs=%d, pages=%d, mmap_vstart=0x%lx\n",
-+	        __FUNCTION__, blkif_reqs, mmap_pages, 
-+	       mmap_start[mmap_alloc].start);
++	pending_reqs[mmap_alloc]  = kzalloc(sizeof(pending_req_t)
++					    * blkif_reqs, GFP_KERNEL);
++	foreign_pages[mmap_alloc] = alloc_empty_pages_and_pagevec(mmap_pages);
 +
-+	BUG_ON(mmap_start[mmap_alloc].start == 0);
++	if (!pending_reqs[mmap_alloc] || !foreign_pages[mmap_alloc])
++		goto out_of_memory;
 +
-+	for (i = 0; i < mmap_pages; i++) 
-+		pending_addrs[mmap_alloc][i] = 
-+			mmap_start[mmap_alloc].start + (i << PAGE_SHIFT);
++	DPRINTK("%s: reqs=%d, pages=%d\n",
++		__FUNCTION__, blkif_reqs, mmap_pages);
 +
-+	for (i = 0; i < MAX_PENDING_REQS ; i++) {
++	for (i = 0; i < MAX_PENDING_REQS; i++) {
 +		list_add_tail(&pending_reqs[mmap_alloc][i].free_list, 
 +			      &pending_free);
 +		pending_reqs[mmap_alloc][i].mem_idx = mmap_alloc;
@@ -50498,65 +52036,28 @@
 +
 +	mmap_alloc++;
 +	DPRINTK("# MMAPs increased to %d\n",mmap_alloc);
-+ done:
-+	spin_unlock_irqrestore(&pending_free_lock, flags);
-+	return ret;
-+}
-+
-+static void mmap_req_del(int mmap)
-+{
-+	int i;
-+	struct page *page;
-+
-+	/*Spinlock already acquired*/
-+	kfree(pending_reqs[mmap]);
-+	kfree(pending_addrs[mmap]);
-+
-+#ifdef __ia64__
-+	/*Not sure what goes here yet!*/
-+#else
-+
-+	/* Unpin all of the pages. */
-+	page = mmap_start[mmap].mpage;
-+	for (i=0; i<mmap_pages; i++)
-+		put_page(&page[i]);
-+
-+	balloon_dealloc_empty_page_range(mmap_start[mmap].mpage, mmap_pages);
-+#endif
-+
-+	mmap_lock = 0;
-+	DPRINTK("# MMAPs decreased to %d\n",mmap_alloc);
-+	mmap_alloc--;
++	return 0;
++
++ out_of_memory:
++	free_empty_pages_and_pagevec(foreign_pages[mmap_alloc], mmap_pages);
++	kfree(pending_reqs[mmap_alloc]);
++	WPRINTK("%s: out of memory\n", __FUNCTION__);
++	return -ENOMEM;
 +}
 +
-+/*N.B. Currently unused - will be accessed via sysfs*/
-+static void req_decrease(void)
++static void mmap_req_del(int mmap)
 +{
-+	pending_req_t *req;
-+	int i;
-+	unsigned long flags;
++	BUG_ON(!spin_is_locked(&pending_free_lock));
 +
-+	spin_lock_irqsave(&pending_free_lock, flags);
++	kfree(pending_reqs[mmap]);
++	pending_reqs[mmap] = NULL;
 +
-+	DPRINTK("Req decrease called.\n");
-+	if (mmap_lock || mmap_alloc == 1) 
-+		goto done;
++	free_empty_pages_and_pagevec(foreign_pages[mmap_alloc], mmap_pages);
++	foreign_pages[mmap] = NULL;
 +
-+	mmap_lock = 1;
-+	mmap_inuse = MAX_PENDING_REQS;
-+	
-+        /*Go through reqs and remove any that aren't in use*/
-+	for (i = 0; i < MAX_PENDING_REQS ; i++) {
-+		req = &pending_reqs[mmap_alloc-1][i];
-+		if (req->inuse == 0) {
-+			list_del(&req->free_list);
-+			mmap_inuse--;
-+		}
-+	}
-+	if (mmap_inuse == 0) mmap_req_del(mmap_alloc-1);
-+ done:
-+	spin_unlock_irqrestore(&pending_free_lock, flags);
-+	return;
++	mmap_lock = 0;
++	DPRINTK("# MMAPs decreased to %d\n",mmap_alloc);
++	mmap_alloc--;
 +}
 +
 +static pending_req_t* alloc_req(void)
@@ -50623,7 +52124,7 @@
 +	mmap_idx = req->mem_idx;
 +
 +	for (i = 0; i < req->nr_pages; i++) {
-+		kvaddr = MMAP_VADDR(mmap_start[mmap_idx].start, k_idx, i);
++		kvaddr = idx_to_kaddr(mmap_idx, k_idx, i);
 +		uvaddr = MMAP_VADDR(info->user_vstart, u_idx, i);
 +
 +		khandle = &pending_handle(mmap_idx, k_idx, i);
@@ -50632,7 +52133,7 @@
 +			continue;
 +		}
 +		gnttab_set_unmap_op(&unmap[invcount], 
-+			MMAP_VADDR(mmap_start[mmap_idx].start, k_idx, i), 
++				    idx_to_kaddr(mmap_idx, k_idx, i), 
 +				    GNTMAP_host_map, khandle->kernel);
 +		invcount++;
 +
@@ -50718,7 +52219,7 @@
 + * COMPLETION CALLBACK -- Called by user level ioctl()
 + */
 +
-+static int blktap_read_ufe_ring(int idx)
++static int blktap_read_ufe_ring(tap_blkif_t *info)
 +{
 +	/* This is called to read responses from the UFE ring. */
 +	RING_IDX i, j, rp;
@@ -50726,12 +52227,9 @@
 +	blkif_t *blkif=NULL;
 +	int pending_idx, usr_idx, mmap_idx;
 +	pending_req_t *pending_req;
-+	tap_blkif_t *info;
 +	
-+	info = tapfds[idx];
-+	if (info == NULL) {
++	if (!info)
 +		return 0;
-+	}
 +
 +	/* We currently only forward packets in INTERCEPT_FE mode. */
 +	if (!(info->mode & BLKTAP_MODE_INTERCEPT_FE))
@@ -50769,9 +52267,8 @@
 +			struct page *pg;
 +			int offset;
 +
-+			uvaddr  = MMAP_VADDR(info->user_vstart, usr_idx, j);
-+			kvaddr = MMAP_VADDR(mmap_start[mmap_idx].start, 
-+					    pending_idx, j);
++			uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, j);
++			kvaddr = idx_to_kaddr(mmap_idx, pending_idx, j);
 +
 +			pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
 +			ClearPageReserved(pg);
@@ -50779,7 +52276,7 @@
 +				>> PAGE_SHIFT;
 +			map[offset] = NULL;
 +		}
-+		fast_flush_area(pending_req, pending_idx, usr_idx, idx);
++		fast_flush_area(pending_req, pending_idx, usr_idx, info->minor);
 +		make_response(blkif, pending_req->id, resp->operation,
 +			      resp->status);
 +		info->idx_map[usr_idx] = INVALID_REQ;
@@ -50953,8 +52450,7 @@
 +		uint32_t flags;
 +
 +		uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, i);
-+		kvaddr = MMAP_VADDR(mmap_start[mmap_idx].start, 
-+				    pending_idx, i);
++		kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i);
 +		page = virt_to_page(kvaddr);
 +
 +		sector = req->sector_number + (8*i);
@@ -51006,8 +52502,7 @@
 +		struct page *pg;
 +
 +		uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, i/2);
-+		kvaddr = MMAP_VADDR(mmap_start[mmap_idx].start, 
-+				    pending_idx, i/2);
++		kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i/2);
 +
 +		if (unlikely(map[i].status != 0)) {
 +			WPRINTK("invalid kernel buffer -- "
@@ -51037,8 +52532,7 @@
 +		unsigned long kvaddr;
 +		struct page *pg;
 +
-+		kvaddr = MMAP_VADDR(mmap_start[mmap_idx].start, 
-+				    pending_idx, i);
++		kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i);
 +		pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
 +		SetPageReserved(pg);
 +	}
@@ -51132,16 +52626,20 @@
 +	/*Create the blktap devices, but do not map memory or waitqueue*/
 +	for(i = 0; i < MAX_TAP_DEV; i++) translate_domid[i].domid = 0xFFFF;
 +
-+	ret = register_chrdev(BLKTAP_DEV_MAJOR,"blktap",&blktap_fops);
++	/* Dynamically allocate a major for this device */
++	ret = register_chrdev(0, "blktap", &blktap_fops);
 +
 +	if ( (ret < 0) ) {
 +		WPRINTK("Couldn't register /dev/xen/blktap\n");
 +		return -ENOMEM;
 +	}	
 +	
++	blktap_major = ret;
++
 +	for(i = 0; i < MAX_TAP_DEV; i++ ) {
 +		info = tapfds[i] = kzalloc(sizeof(tap_blkif_t),GFP_KERNEL);
-+		if(tapfds[i] == NULL) return -ENOMEM;
++		if(tapfds[i] == NULL)
++			return -ENOMEM;
 +		info->minor = i;
 +		info->pid = 0;
 +		info->blkif = NULL;
@@ -51151,6 +52649,24 @@
 +		DPRINTK("Created misc_dev [/dev/xen/blktap%d]\n",i);
 +	}
 +	
++	/* Make sure the xen class exists */
++	if (!setup_xen_class()) {
++		/*
++		 * This will allow udev to create the blktap ctrl device.
++		 * We only want to create blktap0 first.  We don't want
++		 * to flood the sysfs system with needless blktap devices.
++		 * We only create the device when a request of a new device is
++		 * made.
++		 */
++		class_device_create(xen_class, NULL,
++				    MKDEV(blktap_major, 0), NULL,
++				    "blktap0");
++		tapfds[0]->sysfs_set = 1;
++	} else {
++		/* this is bad, but not fatal */
++		WPRINTK("blktap: sysfs xen_class not created\n");
++	}
++
 +	DPRINTK("Blktap device successfully created\n");
 +
 +	return 0;
@@ -51159,8 +52675,8 @@
 +module_init(blkif_init);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blktap/common.h linux-2.6.18-xen/drivers/xen/blktap/common.h
---- linux-2.6.18/drivers/xen/blktap/common.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blktap/common.h linux-2.6.18-xen/drivers/xen/blktap/common.h
+--- linux-2.6.18.1/drivers/xen/blktap/common.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/blktap/common.h	2006-09-21 01:33:31.000000000 +0200
 @@ -0,0 +1,120 @@
 +/* 
@@ -51283,8 +52799,8 @@
 +void signal_tapdisk(int idx);
 +
 +#endif /* __BLKIF__BACKEND__COMMON_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blktap/interface.c linux-2.6.18-xen/drivers/xen/blktap/interface.c
---- linux-2.6.18/drivers/xen/blktap/interface.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blktap/interface.c linux-2.6.18-xen/drivers/xen/blktap/interface.c
+--- linux-2.6.18.1/drivers/xen/blktap/interface.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/blktap/interface.c	2006-09-21 01:33:31.000000000 +0200
 @@ -0,0 +1,164 @@
 +/******************************************************************************
@@ -51451,17 +52967,20 @@
 +	blkif_cachep = kmem_cache_create("blktapif_cache", sizeof(blkif_t), 
 +					 0, 0, NULL, NULL);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blktap/Makefile linux-2.6.18-xen/drivers/xen/blktap/Makefile
---- linux-2.6.18/drivers/xen/blktap/Makefile	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/blktap/Makefile	2006-09-04 16:31:13.000000000 +0200
-@@ -0,0 +1,3 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blktap/Makefile linux-2.6.18-xen/drivers/xen/blktap/Makefile
+--- linux-2.6.18.1/drivers/xen/blktap/Makefile	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/blktap/Makefile	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,6 @@
 +LINUXINCLUDE += -I../xen/include/public/io
-+obj-y	:= xenbus.o interface.o blktap.o 
 +
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/blktap/xenbus.c linux-2.6.18-xen/drivers/xen/blktap/xenbus.c
---- linux-2.6.18/drivers/xen/blktap/xenbus.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/blktap/xenbus.c	2006-09-21 01:33:31.000000000 +0200
-@@ -0,0 +1,367 @@
++obj-$(CONFIG_XEN_BLKDEV_TAP) := blktap.o
++
++blktap-y	:= xenbus.o interface.o blktapmain.o 
++
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/blktap/xenbus.c linux-2.6.18-xen/drivers/xen/blktap/xenbus.c
+--- linux-2.6.18.1/drivers/xen/blktap/xenbus.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/blktap/xenbus.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,366 @@
 +/* drivers/xen/blktap/xenbus.c
 + *
 + * Xenbus code for blktap
@@ -51737,7 +53256,6 @@
 +			kthread_stop(be->blkif->xenblkd);
 +			be->blkif->xenblkd = NULL;
 +		}
-+		tap_blkif_unmap(be->blkif);
 +		xenbus_switch_state(dev, XenbusStateClosing);
 +		break;
 +
@@ -51829,14 +53347,14 @@
 +{
 +	xenbus_register_backend(&blktap);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/char/Makefile linux-2.6.18-xen/drivers/xen/char/Makefile
---- linux-2.6.18/drivers/xen/char/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/char/Makefile linux-2.6.18-xen/drivers/xen/char/Makefile
+--- linux-2.6.18.1/drivers/xen/char/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/char/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,2 @@
 +
 +obj-y	:= mem.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/char/mem.c linux-2.6.18-xen/drivers/xen/char/mem.c
---- linux-2.6.18/drivers/xen/char/mem.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/char/mem.c linux-2.6.18-xen/drivers/xen/char/mem.c
+--- linux-2.6.18.1/drivers/xen/char/mem.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/char/mem.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,180 @@
 +/*
@@ -52019,8 +53537,8 @@
 +	.mmap		= mmap_mem,
 +	.open		= open_mem,
 +};
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/console/console.c linux-2.6.18-xen/drivers/xen/console/console.c
---- linux-2.6.18/drivers/xen/console/console.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/console/console.c linux-2.6.18-xen/drivers/xen/console/console.c
+--- linux-2.6.18.1/drivers/xen/console/console.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/console/console.c	2006-09-21 01:33:31.000000000 +0200
 @@ -0,0 +1,688 @@
 +/******************************************************************************
@@ -52711,14 +54229,14 @@
 +module_init(xencons_init);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/console/Makefile linux-2.6.18-xen/drivers/xen/console/Makefile
---- linux-2.6.18/drivers/xen/console/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/console/Makefile linux-2.6.18-xen/drivers/xen/console/Makefile
+--- linux-2.6.18.1/drivers/xen/console/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/console/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,2 @@
 +
 +obj-y	:= console.o xencons_ring.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/console/xencons_ring.c linux-2.6.18-xen/drivers/xen/console/xencons_ring.c
---- linux-2.6.18/drivers/xen/console/xencons_ring.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/console/xencons_ring.c linux-2.6.18-xen/drivers/xen/console/xencons_ring.c
+--- linux-2.6.18.1/drivers/xen/console/xencons_ring.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/console/xencons_ring.c	2006-09-21 01:33:31.000000000 +0200
 @@ -0,0 +1,143 @@
 +/* 
@@ -52864,8 +54382,8 @@
 +{
 +	(void)xencons_ring_init();
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/core/cpu_hotplug.c linux-2.6.18-xen/drivers/xen/core/cpu_hotplug.c
---- linux-2.6.18/drivers/xen/core/cpu_hotplug.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/core/cpu_hotplug.c linux-2.6.18-xen/drivers/xen/core/cpu_hotplug.c
+--- linux-2.6.18.1/drivers/xen/core/cpu_hotplug.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/core/cpu_hotplug.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,188 @@
 +
@@ -53056,8 +54574,8 @@
 +{
 +	xenbus_allowed_cpumask = cpu_present_map;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/core/evtchn.c linux-2.6.18-xen/drivers/xen/core/evtchn.c
---- linux-2.6.18/drivers/xen/core/evtchn.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/core/evtchn.c linux-2.6.18-xen/drivers/xen/core/evtchn.c
+--- linux-2.6.18.1/drivers/xen/core/evtchn.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/core/evtchn.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,868 @@
 +/******************************************************************************
@@ -53928,8 +55446,8 @@
 +		irq_desc[pirq_to_irq(i)].chip    = &pirq_type;
 +	}
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/core/features.c linux-2.6.18-xen/drivers/xen/core/features.c
---- linux-2.6.18/drivers/xen/core/features.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/core/features.c linux-2.6.18-xen/drivers/xen/core/features.c
+--- linux-2.6.18.1/drivers/xen/core/features.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/core/features.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,30 @@
 +/******************************************************************************
@@ -53962,8 +55480,8 @@
 +			xen_features[i*32+j] = !!(fi.submap & 1<<j);
 +	}
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/core/gnttab.c linux-2.6.18-xen/drivers/xen/core/gnttab.c
---- linux-2.6.18/drivers/xen/core/gnttab.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/core/gnttab.c linux-2.6.18-xen/drivers/xen/core/gnttab.c
+--- linux-2.6.18.1/drivers/xen/core/gnttab.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/core/gnttab.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,483 @@
 +/******************************************************************************
@@ -54449,8 +55967,8 @@
 +#ifdef CONFIG_XEN
 +core_initcall(gnttab_init);
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/core/hypervisor_sysfs.c linux-2.6.18-xen/drivers/xen/core/hypervisor_sysfs.c
---- linux-2.6.18/drivers/xen/core/hypervisor_sysfs.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/core/hypervisor_sysfs.c linux-2.6.18-xen/drivers/xen/core/hypervisor_sysfs.c
+--- linux-2.6.18.1/drivers/xen/core/hypervisor_sysfs.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/core/hypervisor_sysfs.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,59 @@
 +/*
@@ -54512,8 +56030,8 @@
 +
 +device_initcall(hypervisor_subsys_init);
 +EXPORT_SYMBOL_GPL(hypervisor_subsys);
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/core/Makefile linux-2.6.18-xen/drivers/xen/core/Makefile
---- linux-2.6.18/drivers/xen/core/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/core/Makefile linux-2.6.18-xen/drivers/xen/core/Makefile
+--- linux-2.6.18.1/drivers/xen/core/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/core/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,13 @@
 +#
@@ -54529,8 +56047,8 @@
 +obj-$(CONFIG_XEN_SKBUFF)	+= skbuff.o
 +obj-$(CONFIG_XEN_REBOOT)	+= reboot.o
 +obj-$(CONFIG_XEN_SMPBOOT)	+= smpboot.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/core/reboot.c linux-2.6.18-xen/drivers/xen/core/reboot.c
---- linux-2.6.18/drivers/xen/core/reboot.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/core/reboot.c linux-2.6.18-xen/drivers/xen/core/reboot.c
+--- linux-2.6.18.1/drivers/xen/core/reboot.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/core/reboot.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,384 @@
 +#define __KERNEL_SYSCALLS__
@@ -54917,10 +56435,10 @@
 +}
 +
 +subsys_initcall(setup_shutdown_event);
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/core/skbuff.c linux-2.6.18-xen/drivers/xen/core/skbuff.c
---- linux-2.6.18/drivers/xen/core/skbuff.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/core/skbuff.c	2006-09-04 16:31:13.000000000 +0200
-@@ -0,0 +1,139 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/core/skbuff.c linux-2.6.18-xen/drivers/xen/core/skbuff.c
+--- linux-2.6.18.1/drivers/xen/core/skbuff.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/core/skbuff.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,144 @@
 +
 +#include <linux/module.h>
 +#include <linux/version.h>
@@ -54940,7 +56458,12 @@
 +/*static*/ kmem_cache_t *skbuff_cachep;
 +EXPORT_SYMBOL(skbuff_cachep);
 +
-+#define MAX_SKBUFF_ORDER 4
++/* Allow up to 64kB or page-sized packets (whichever is greater). */
++#if PAGE_SHIFT < 16
++#define MAX_SKBUFF_ORDER (16 - PAGE_SHIFT)
++#else
++#define MAX_SKBUFF_ORDER 0
++#endif
 +static kmem_cache_t *skbuff_order_cachep[MAX_SKBUFF_ORDER + 1];
 +
 +static struct {
@@ -55060,8 +56583,8 @@
 +core_initcall(skbuff_init);
 +
 +EXPORT_SYMBOL(__dev_alloc_skb);
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/core/smpboot.c linux-2.6.18-xen/drivers/xen/core/smpboot.c
---- linux-2.6.18/drivers/xen/core/smpboot.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/core/smpboot.c linux-2.6.18-xen/drivers/xen/core/smpboot.c
+--- linux-2.6.18.1/drivers/xen/core/smpboot.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/core/smpboot.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,429 @@
 +/*
@@ -55493,8 +57016,8 @@
 +	return -EINVAL;
 +}
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/core/xen_proc.c linux-2.6.18-xen/drivers/xen/core/xen_proc.c
---- linux-2.6.18/drivers/xen/core/xen_proc.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/core/xen_proc.c linux-2.6.18-xen/drivers/xen/core/xen_proc.c
+--- linux-2.6.18.1/drivers/xen/core/xen_proc.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/core/xen_proc.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,18 @@
 +
@@ -55515,8 +57038,8 @@
 +{
 +	remove_proc_entry(name, xen_base);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/core/xen_sysfs.c linux-2.6.18-xen/drivers/xen/core/xen_sysfs.c
---- linux-2.6.18/drivers/xen/core/xen_sysfs.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/core/xen_sysfs.c linux-2.6.18-xen/drivers/xen/core/xen_sysfs.c
+--- linux-2.6.18.1/drivers/xen/core/xen_sysfs.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/core/xen_sysfs.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,378 @@
 +/*
@@ -55897,9 +57420,9 @@
 +
 +module_init(hyper_sysfs_init);
 +module_exit(hyper_sysfs_exit);
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/evtchn/evtchn.c linux-2.6.18-xen/drivers/xen/evtchn/evtchn.c
---- linux-2.6.18/drivers/xen/evtchn/evtchn.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/evtchn/evtchn.c	2006-09-04 16:31:13.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/evtchn/evtchn.c linux-2.6.18-xen/drivers/xen/evtchn/evtchn.c
+--- linux-2.6.18.1/drivers/xen/evtchn/evtchn.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/evtchn/evtchn.c	2006-10-17 15:01:58.000000000 +0200
 @@ -0,0 +1,456 @@
 +/******************************************************************************
 + * evtchn.c
@@ -56321,7 +57844,7 @@
 +};
 +
 +static struct miscdevice evtchn_miscdev = {
-+	.minor        = EVTCHN_MINOR,
++	.minor        = MISC_DYNAMIC_MINOR,
 +	.name         = "evtchn",
 +	.fops         = &evtchn_fops,
 +};
@@ -56357,14 +57880,14 @@
 +module_exit(evtchn_cleanup);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/evtchn/Makefile linux-2.6.18-xen/drivers/xen/evtchn/Makefile
---- linux-2.6.18/drivers/xen/evtchn/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/evtchn/Makefile linux-2.6.18-xen/drivers/xen/evtchn/Makefile
+--- linux-2.6.18.1/drivers/xen/evtchn/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/evtchn/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,2 @@
 +
 +obj-y	:= evtchn.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/Kconfig linux-2.6.18-xen/drivers/xen/Kconfig
---- linux-2.6.18/drivers/xen/Kconfig	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/Kconfig linux-2.6.18-xen/drivers/xen/Kconfig
+--- linux-2.6.18.1/drivers/xen/Kconfig	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/Kconfig	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,260 @@
 +#
@@ -56627,8 +58150,8 @@
 +	depends on SMP
 +
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/Makefile linux-2.6.18-xen/drivers/xen/Makefile
---- linux-2.6.18/drivers/xen/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/Makefile linux-2.6.18-xen/drivers/xen/Makefile
+--- linux-2.6.18.1/drivers/xen/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,17 @@
 +obj-y	+= core/
@@ -56648,9 +58171,9 @@
 +obj-$(CONFIG_XEN_NETDEV_FRONTEND)	+= netfront/
 +obj-$(CONFIG_XEN_PCIDEV_BACKEND)	+= pciback/
 +obj-$(CONFIG_XEN_PCIDEV_FRONTEND)	+= pcifront/
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/netback/common.h linux-2.6.18-xen/drivers/xen/netback/common.h
---- linux-2.6.18/drivers/xen/netback/common.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/netback/common.h	2006-09-04 16:31:13.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/netback/common.h linux-2.6.18-xen/drivers/xen/netback/common.h
+--- linux-2.6.18.1/drivers/xen/netback/common.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/netback/common.h	2006-10-19 11:01:25.000000000 +0200
 @@ -0,0 +1,141 @@
 +/******************************************************************************
 + * arch/xen/drivers/netif/backend/common.h
@@ -56760,7 +58283,7 @@
 +
 +void netif_disconnect(netif_t *netif);
 +
-+netif_t *netif_alloc(domid_t domid, unsigned int handle, u8 be_mac[ETH_ALEN]);
++netif_t *netif_alloc(domid_t domid, unsigned int handle);
 +int netif_map(netif_t *netif, unsigned long tx_ring_ref,
 +	      unsigned long rx_ring_ref, unsigned int evtchn);
 +
@@ -56793,10 +58316,10 @@
 +}
 +
 +#endif /* __NETIF__BACKEND__COMMON_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/netback/interface.c linux-2.6.18-xen/drivers/xen/netback/interface.c
---- linux-2.6.18/drivers/xen/netback/interface.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/netback/interface.c	2006-09-04 16:31:13.000000000 +0200
-@@ -0,0 +1,339 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/netback/interface.c linux-2.6.18-xen/drivers/xen/netback/interface.c
+--- linux-2.6.18.1/drivers/xen/netback/interface.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/netback/interface.c	2006-10-19 11:01:25.000000000 +0200
+@@ -0,0 +1,352 @@
 +/******************************************************************************
 + * arch/xen/drivers/netif/backend/interface.c
 + * 
@@ -56833,6 +58356,24 @@
 +#include <linux/ethtool.h>
 +#include <linux/rtnetlink.h>
 +
++/*
++ * Module parameter 'queue_length':
++ * 
++ * Enables queuing in the network stack when a client has run out of receive
++ * descriptors. Although this feature can improve receive bandwidth by avoiding
++ * packet loss, it can also result in packets sitting in the 'tx_queue' for
++ * unbounded time. This is bad if those packets hold onto foreign resources.
++ * For example, consider a packet that holds onto resources belonging to the
++ * guest for which it is queued (e.g., packet received on vif1.0, destined for
++ * vif1.1 which is not activated in the guest): in this situation the guest
++ * will never be destroyed, unless vif1.1 is taken down (which flushes the
++ * 'tx_queue').
++ * 
++ * Only set this parameter to non-zero value if you know what you are doing!
++ */
++static unsigned long netbk_queue_length = 0;
++module_param_named(queue_length, netbk_queue_length, ulong, 0);
++
 +static void __netif_up(netif_t *netif)
 +{
 +	enable_irq(netif->irq);
@@ -56843,6 +58384,7 @@
 +{
 +	disable_irq(netif->irq);
 +	netif_deschedule_work(netif);
++	del_timer_sync(&netif->credit_timeout);
 +}
 +
 +static int net_open(struct net_device *dev)
@@ -56906,7 +58448,7 @@
 +	.get_link = ethtool_op_get_link,
 +};
 +
-+netif_t *netif_alloc(domid_t domid, unsigned int handle, u8 be_mac[ETH_ALEN])
++netif_t *netif_alloc(domid_t domid, unsigned int handle)
 +{
 +	int err = 0, i;
 +	struct net_device *dev;
@@ -56933,6 +58475,7 @@
 +	netif->credit_bytes = netif->remaining_credit = ~0UL;
 +	netif->credit_usec  = 0UL;
 +	init_timer(&netif->credit_timeout);
++	netif->credit_timeout.expires = jiffies;
 +
 +	dev->hard_start_xmit = netif_be_start_xmit;
 +	dev->get_stats       = netif_be_get_stats;
@@ -56943,26 +58486,19 @@
 +
 +	SET_ETHTOOL_OPS(dev, &network_ethtool_ops);
 +
-+	/*
-+	 * Reduce default TX queuelen so that each guest interface only
-+	 * allows it to eat around 6.4MB of host memory.
-+	 */
-+	dev->tx_queue_len = 100;
++	dev->tx_queue_len = netbk_queue_length;
++	if (dev->tx_queue_len != 0)
++		printk(KERN_WARNING "netbk: WARNING: device '%s' has non-zero "
++		       "queue length (%lu)!\n", dev->name, dev->tx_queue_len);
 +
-+	for (i = 0; i < ETH_ALEN; i++)
-+		if (be_mac[i] != 0)
-+			break;
-+	if (i == ETH_ALEN) {
-+		/*
-+		 * Initialise a dummy MAC address. We choose the numerically
-+		 * largest non-broadcast address to prevent the address getting
-+		 * stolen by an Ethernet bridge for STP purposes.
-+		 * (FE:FF:FF:FF:FF:FF)
-+		 */ 
-+		memset(dev->dev_addr, 0xFF, ETH_ALEN);
-+		dev->dev_addr[0] &= ~0x01;
-+	} else
-+		memcpy(dev->dev_addr, be_mac, ETH_ALEN);
++	/*
++	 * Initialise a dummy MAC address. We choose the numerically
++	 * largest non-broadcast address to prevent the address getting
++	 * stolen by an Ethernet bridge for STP purposes.
++	 * (FE:FF:FF:FF:FF:FF)
++	 */ 
++	memset(dev->dev_addr, 0xFF, ETH_ALEN);
++	dev->dev_addr[0] &= ~0x01;
 +
 +	rtnl_lock();
 +	err = register_netdevice(dev);
@@ -57136,10 +58672,10 @@
 +	}
 +	netif_free(netif);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/netback/loopback.c linux-2.6.18-xen/drivers/xen/netback/loopback.c
---- linux-2.6.18/drivers/xen/netback/loopback.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/netback/loopback.c	2006-09-04 16:31:13.000000000 +0200
-@@ -0,0 +1,260 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/netback/loopback.c linux-2.6.18-xen/drivers/xen/netback/loopback.c
+--- linux-2.6.18.1/drivers/xen/netback/loopback.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/netback/loopback.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,320 @@
 +/******************************************************************************
 + * netback/loopback.c
 + * 
@@ -57194,8 +58730,10 @@
 +#include <linux/skbuff.h>
 +#include <linux/ethtool.h>
 +#include <net/dst.h>
++#include <net/xfrm.h>		/* secpath_reset() */
++#include <asm/hypervisor.h>	/* is_initial_xendomain() */
 +
-+static int nloopbacks = 8;
++static int nloopbacks = -1;
 +module_param(nloopbacks, int, 0);
 +MODULE_PARM_DESC(nloopbacks, "Number of netback-loopback devices to create");
 +
@@ -57218,10 +58756,60 @@
 +	return 0;
 +}
 +
++#ifdef CONFIG_X86
++static int is_foreign(unsigned long pfn)
++{
++	/* NB. Play it safe for auto-translation mode. */
++	return (xen_feature(XENFEAT_auto_translated_physmap) ||
++		(phys_to_machine_mapping[pfn] & FOREIGN_FRAME_BIT));
++}
++#else
++/* How to detect a foreign mapping? Play it safe. */
++#define is_foreign(pfn)	(1)
++#endif
++
++static int skb_remove_foreign_references(struct sk_buff *skb)
++{
++	struct page *page;
++	unsigned long pfn;
++	int i, off;
++	char *vaddr;
++
++	BUG_ON(skb_shinfo(skb)->frag_list);
++
++	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
++		pfn = page_to_pfn(skb_shinfo(skb)->frags[i].page);
++		if (!is_foreign(pfn))
++			continue;
++		
++		page = alloc_page(GFP_ATOMIC | __GFP_NOWARN);
++		if (unlikely(!page))
++			return 0;
++
++		vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]);
++		off = skb_shinfo(skb)->frags[i].page_offset;
++		memcpy(page_address(page) + off,
++		       vaddr + off,
++		       skb_shinfo(skb)->frags[i].size);
++		kunmap_skb_frag(vaddr);
++
++		put_page(skb_shinfo(skb)->frags[i].page);
++		skb_shinfo(skb)->frags[i].page = page;
++	}
++
++	return 1;
++}
++
 +static int loopback_start_xmit(struct sk_buff *skb, struct net_device *dev)
 +{
 +	struct net_private *np = netdev_priv(dev);
 +
++	if (!skb_remove_foreign_references(skb)) {
++		np->stats.tx_dropped++;
++		dev_kfree_skb(skb);
++		return 0;
++	}
++
 +	dst_release(skb->dst);
 +	skb->dst = NULL;
 +
@@ -57251,6 +58839,11 @@
 +	skb->protocol = eth_type_trans(skb, dev);
 +	skb->dev      = dev;
 +	dev->last_rx  = jiffies;
++
++	/* Flush netfilter context: rx'ed skbuffs not expected to have any. */
++	nf_reset(skb);
++	secpath_reset(skb);
++
 +	netif_rx(skb);
 +
 +	return 0;
@@ -57380,6 +58973,9 @@
 +{
 +	int i, err = 0;
 +
++	if (nloopbacks == -1)
++		nloopbacks = is_initial_xendomain() ? 4 : 0;
++
 +	for (i = 0; i < nloopbacks; i++)
 +		if ((err = make_loopback(i)) != 0)
 +			break;
@@ -57400,8 +58996,8 @@
 +module_exit(loopback_exit);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/netback/Makefile linux-2.6.18-xen/drivers/xen/netback/Makefile
---- linux-2.6.18/drivers/xen/netback/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/netback/Makefile linux-2.6.18-xen/drivers/xen/netback/Makefile
+--- linux-2.6.18.1/drivers/xen/netback/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/netback/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,5 @@
 +obj-$(CONFIG_XEN_NETDEV_BACKEND) := netbk.o
@@ -57409,10 +59005,10 @@
 +
 +netbk-y   := netback.o xenbus.o interface.o
 +netloop-y := loopback.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/netback/netback.c linux-2.6.18-xen/drivers/xen/netback/netback.c
---- linux-2.6.18/drivers/xen/netback/netback.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/netback/netback.c	2006-09-04 16:31:13.000000000 +0200
-@@ -0,0 +1,1498 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/netback/netback.c linux-2.6.18-xen/drivers/xen/netback/netback.c
+--- linux-2.6.18.1/drivers/xen/netback/netback.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/netback/netback.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,1509 @@
 +/******************************************************************************
 + * drivers/xen/netback/netback.c
 + * 
@@ -57486,14 +59082,15 @@
 +
 +static struct sk_buff_head rx_queue;
 +
-+static unsigned long mmap_vstart;
-+#define MMAP_VADDR(_req) (mmap_vstart + ((_req) * PAGE_SIZE))
-+
-+static void *rx_mmap_area;
++static struct page **mmap_pages;
++static inline unsigned long idx_to_kaddr(unsigned int idx)
++{
++	return (unsigned long)pfn_to_kaddr(page_to_pfn(mmap_pages[idx]));
++}
 +
 +#define PKT_PROT_LEN 64
 +
-+static struct {
++static struct pending_tx_info {
 +	netif_tx_request_t req;
 +	netif_t *netif;
 +} pending_tx_info[MAX_PENDING_REQS];
@@ -57633,7 +59230,7 @@
 +		copy = len >= PAGE_SIZE ? PAGE_SIZE : len;
 +		zero = len >= PAGE_SIZE ? 0 : __GFP_ZERO;
 +
-+		page = alloc_page(GFP_ATOMIC | zero);
++		page = alloc_page(GFP_ATOMIC | __GFP_NOWARN | zero);
 +		if (unlikely(!page))
 +			goto err_free;
 +
@@ -57789,14 +59386,22 @@
 +		   flipped. */
 +		meta->copy = 1;
 +		copy_gop = npo->copy + npo->copy_prod++;
-+		copy_gop->source.domid = DOMID_SELF;
++		copy_gop->flags = GNTCOPY_dest_gref;
++		if (PageForeign(page)) {
++			struct pending_tx_info *src_pend =
++				&pending_tx_info[page->index];
++			copy_gop->source.domid = src_pend->netif->domid;
++			copy_gop->source.u.ref = src_pend->req.gref;
++			copy_gop->flags |= GNTCOPY_source_gref;
++		} else {
++			copy_gop->source.domid = DOMID_SELF;
++			copy_gop->source.u.gmfn = old_mfn;
++		}
 +		copy_gop->source.offset = offset;
-+		copy_gop->source.u.gmfn = old_mfn;
 +		copy_gop->dest.domid = netif->domid;
 +		copy_gop->dest.offset = 0;
 +		copy_gop->dest.u.ref = req->gref;
 +		copy_gop->len = size;
-+		copy_gop->flags = GNTCOPY_dest_gref;
 +	} else {
 +		meta->copy = 0;
 +		if (!xen_feature(XENFEAT_auto_translated_physmap)) {
@@ -58208,10 +59813,27 @@
 +}
 +
 +
++static void tx_add_credit(netif_t *netif)
++{
++	unsigned long max_burst;
++
++	/*
++	 * Allow a burst big enough to transmit a jumbo packet of up to 128kB.
++	 * Otherwise the interface can seize up due to insufficient credit.
++	 */
++	max_burst = RING_GET_REQUEST(&netif->tx, netif->tx.req_cons)->size;
++	max_burst = min(max_burst, 131072UL);
++	max_burst = max(max_burst, netif->credit_bytes);
++
++	netif->remaining_credit = min(netif->remaining_credit +
++				      netif->credit_bytes,
++				      max_burst);
++}
++
 +static void tx_credit_callback(unsigned long data)
 +{
 +	netif_t *netif = (netif_t *)data;
-+	netif->remaining_credit = netif->credit_bytes;
++	tx_add_credit(netif);
 +	netif_schedule_work(netif);
 +}
 +
@@ -58235,7 +59857,7 @@
 +	gop = tx_unmap_ops;
 +	while (dc != dp) {
 +		pending_idx = dealloc_ring[MASK_PEND_IDX(dc++)];
-+		gnttab_set_unmap_op(gop, MMAP_VADDR(pending_idx),
++		gnttab_set_unmap_op(gop, idx_to_kaddr(pending_idx),
 +				    GNTMAP_host_map,
 +				    grant_tx_handle[pending_idx]);
 +		gop++;
@@ -58273,20 +59895,28 @@
 +	netif_put(netif);
 +}
 +
-+static int netbk_count_requests(netif_t *netif, netif_tx_request_t *txp,
-+				int work_to_do)
++static int netbk_count_requests(netif_t *netif, netif_tx_request_t *first,
++				netif_tx_request_t *txp, int work_to_do)
 +{
-+	netif_tx_request_t *first = txp;
 +	RING_IDX cons = netif->tx.req_cons;
 +	int frags = 0;
 +
-+	while (txp->flags & NETTXF_more_data) {
++	if (!(first->flags & NETTXF_more_data))
++		return 0;
++
++	do {
 +		if (frags >= work_to_do) {
 +			DPRINTK("Need more frags\n");
 +			return -frags;
 +		}
 +
-+		txp = RING_GET_REQUEST(&netif->tx, cons + frags);
++		if (unlikely(frags >= MAX_SKB_FRAGS)) {
++			DPRINTK("Too many frags\n");
++			return -frags;
++		}
++
++		memcpy(txp, RING_GET_REQUEST(&netif->tx, cons + frags),
++		       sizeof(*txp));
 +		if (txp->size > first->size) {
 +			DPRINTK("Frags galore\n");
 +			return -frags;
@@ -58300,30 +59930,28 @@
 +				txp->offset, txp->size);
 +			return -frags;
 +		}
-+	}
++	} while ((txp++)->flags & NETTXF_more_data);
 +
 +	return frags;
 +}
 +
 +static gnttab_map_grant_ref_t *netbk_get_requests(netif_t *netif,
 +						  struct sk_buff *skb,
++						  netif_tx_request_t *txp,
 +						  gnttab_map_grant_ref_t *mop)
 +{
 +	struct skb_shared_info *shinfo = skb_shinfo(skb);
 +	skb_frag_t *frags = shinfo->frags;
-+	netif_tx_request_t *txp;
 +	unsigned long pending_idx = *((u16 *)skb->data);
-+	RING_IDX cons = netif->tx.req_cons;
 +	int i, start;
 +
 +	/* Skip first skb fragment if it is on same page as header fragment. */
 +	start = ((unsigned long)shinfo->frags[0].page == pending_idx);
 +
-+	for (i = start; i < shinfo->nr_frags; i++) {
-+		txp = RING_GET_REQUEST(&netif->tx, cons++);
++	for (i = start; i < shinfo->nr_frags; i++, txp++) {
 +		pending_idx = pending_ring[MASK_PEND_IDX(pending_cons++)];
 +
-+		gnttab_set_map_op(mop++, MMAP_VADDR(pending_idx),
++		gnttab_set_map_op(mop++, idx_to_kaddr(pending_idx),
 +				  GNTMAP_host_map | GNTMAP_readonly,
 +				  txp->gref, netif->domid);
 +
@@ -58356,7 +59984,7 @@
 +		netif_put(netif);
 +	} else {
 +		set_phys_to_machine(
-+			__pa(MMAP_VADDR(pending_idx)) >> PAGE_SHIFT,
++			__pa(idx_to_kaddr(pending_idx)) >> PAGE_SHIFT,
 +			FOREIGN_FRAME(mop->dev_bus_addr >> PAGE_SHIFT));
 +		grant_tx_handle[pending_idx] = mop->handle;
 +	}
@@ -58373,7 +60001,7 @@
 +		newerr = (++mop)->status;
 +		if (likely(!newerr)) {
 +			set_phys_to_machine(
-+				__pa(MMAP_VADDR(pending_idx))>>PAGE_SHIFT,
++				__pa(idx_to_kaddr(pending_idx))>>PAGE_SHIFT,
 +				FOREIGN_FRAME(mop->dev_bus_addr>>PAGE_SHIFT));
 +			grant_tx_handle[pending_idx] = mop->handle;
 +			/* Had a previous error? Invalidate this fragment. */
@@ -58421,7 +60049,7 @@
 +
 +		pending_idx = (unsigned long)frag->page;
 +		txp = &pending_tx_info[pending_idx].req;
-+		frag->page = virt_to_page(MMAP_VADDR(pending_idx));
++		frag->page = virt_to_page(idx_to_kaddr(pending_idx));
 +		frag->size = txp->size;
 +		frag->page_offset = txp->offset;
 +
@@ -58434,7 +60062,7 @@
 +int netbk_get_extras(netif_t *netif, struct netif_extra_info *extras,
 +		     int work_to_do)
 +{
-+	struct netif_extra_info *extra;
++	struct netif_extra_info extra;
 +	RING_IDX cons = netif->tx.req_cons;
 +
 +	do {
@@ -58443,18 +60071,18 @@
 +			return -EBADR;
 +		}
 +
-+		extra = (struct netif_extra_info *)
-+			RING_GET_REQUEST(&netif->tx, cons);
-+		if (unlikely(!extra->type ||
-+			     extra->type >= XEN_NETIF_EXTRA_TYPE_MAX)) {
++		memcpy(&extra, RING_GET_REQUEST(&netif->tx, cons),
++		       sizeof(extra));
++		if (unlikely(!extra.type ||
++			     extra.type >= XEN_NETIF_EXTRA_TYPE_MAX)) {
 +			netif->tx.req_cons = ++cons;
-+			DPRINTK("Invalid extra type: %d\n", extra->type);
++			DPRINTK("Invalid extra type: %d\n", extra.type);
 +			return -EINVAL;
 +		}
 +
-+		memcpy(&extras[extra->type - 1], extra, sizeof(*extra));
++		memcpy(&extras[extra.type - 1], &extra, sizeof(extra));
 +		netif->tx.req_cons = ++cons;
-+	} while (extra->flags & XEN_NETIF_EXTRA_FLAG_MORE);
++	} while (extra.flags & XEN_NETIF_EXTRA_FLAG_MORE);
 +
 +	return work_to_do;
 +}
@@ -58489,6 +60117,7 @@
 +	struct sk_buff *skb;
 +	netif_t *netif;
 +	netif_tx_request_t txreq;
++	netif_tx_request_t txfrags[MAX_SKB_FRAGS];
 +	struct netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1];
 +	u16 pending_idx;
 +	RING_IDX i;
@@ -58517,6 +60146,7 @@
 +		i = netif->tx.req_cons;
 +		rmb(); /* Ensure that we see the request before we copy it. */
 +		memcpy(&txreq, RING_GET_REQUEST(&netif->tx, i), sizeof(txreq));
++
 +		/* Credit-based scheduling. */
 +		if (txreq.size > netif->remaining_credit) {
 +			unsigned long now = jiffies;
@@ -58525,25 +60155,27 @@
 +				msecs_to_jiffies(netif->credit_usec / 1000);
 +
 +			/* Timer could already be pending in rare cases. */
-+			if (timer_pending(&netif->credit_timeout))
-+				break;
++			if (timer_pending(&netif->credit_timeout)) {
++				netif_put(netif);
++				continue;
++			}
 +
 +			/* Passed the point where we can replenish credit? */
 +			if (time_after_eq(now, next_credit)) {
 +				netif->credit_timeout.expires = now;
-+				netif->remaining_credit = netif->credit_bytes;
++				tx_add_credit(netif);
 +			}
 +
 +			/* Still too big to send right now? Set a callback. */
 +			if (txreq.size > netif->remaining_credit) {
-+				netif->remaining_credit = 0;
 +				netif->credit_timeout.data     =
 +					(unsigned long)netif;
 +				netif->credit_timeout.function =
 +					tx_credit_callback;
 +				__mod_timer(&netif->credit_timeout,
 +					    next_credit);
-+				break;
++				netif_put(netif);
++				continue;
 +			}
 +		}
 +		netif->remaining_credit -= txreq.size;
@@ -58562,19 +60194,13 @@
 +			}
 +		}
 +
-+		ret = netbk_count_requests(netif, &txreq, work_to_do);
++		ret = netbk_count_requests(netif, &txreq, txfrags, work_to_do);
 +		if (unlikely(ret < 0)) {
 +			netbk_tx_err(netif, &txreq, i - ret);
 +			continue;
 +		}
 +		i += ret;
 +
-+		if (unlikely(ret > MAX_SKB_FRAGS)) {
-+			DPRINTK("Too many frags\n");
-+			netbk_tx_err(netif, &txreq, i);
-+			continue;
-+		}
-+
 +		if (unlikely(txreq.size < ETH_HLEN)) {
 +			DPRINTK("Bad packet size: %d\n", txreq.size);
 +			netbk_tx_err(netif, &txreq, i);
@@ -58617,7 +60243,7 @@
 +			}
 +		}
 +
-+		gnttab_set_map_op(mop, MMAP_VADDR(pending_idx),
++		gnttab_set_map_op(mop, idx_to_kaddr(pending_idx),
 +				  GNTMAP_host_map | GNTMAP_readonly,
 +				  txreq.gref, netif->domid);
 +		mop++;
@@ -58643,7 +60269,7 @@
 +
 +		pending_cons++;
 +
-+		mop = netbk_get_requests(netif, skb, mop);
++		mop = netbk_get_requests(netif, skb, txfrags, mop);
 +
 +		netif->tx.req_cons = i;
 +		netif_schedule_work(netif);
@@ -58676,8 +60302,8 @@
 +		}
 +
 +		data_len = skb->len;
-+		memcpy(skb->data, 
-+		       (void *)(MMAP_VADDR(pending_idx)|txp->offset),
++		memcpy(skb->data,
++		       (void *)(idx_to_kaddr(pending_idx)|txp->offset),
 +		       data_len);
 +		if (data_len < txp->size) {
 +			/* Append the packet payload as a fragment. */
@@ -58731,18 +60357,9 @@
 +
 +static void netif_page_release(struct page *page)
 +{
-+	u16 pending_idx = page - virt_to_page(mmap_vstart);
-+
-+	/* Ready for next use. */
-+	init_page_count(page);
-+
-+	netif_idx_release(pending_idx);
-+}
-+
-+static void netif_rx_page_release(struct page *page)
-+{
 +	/* Ready for next use. */
 +	init_page_count(page);
++	netif_idx_release(page->index);
 +}
 +
 +irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs)
@@ -58862,27 +60479,17 @@
 +	init_timer(&net_timer);
 +	net_timer.data = 0;
 +	net_timer.function = net_alarm;
-+    
-+	page = balloon_alloc_empty_page_range(MAX_PENDING_REQS);
-+	if (page == NULL)
-+		return -ENOMEM;
 +
-+	mmap_vstart = (unsigned long)pfn_to_kaddr(page_to_pfn(page));
++	mmap_pages = alloc_empty_pages_and_pagevec(MAX_PENDING_REQS);
++	if (mmap_pages == NULL) {
++		printk("%s: out of memory\n", __FUNCTION__);
++		return -ENOMEM;
++	}
 +
 +	for (i = 0; i < MAX_PENDING_REQS; i++) {
-+		page = virt_to_page(MMAP_VADDR(i));
-+		init_page_count(page);
++		page = mmap_pages[i];
 +		SetPageForeign(page, netif_page_release);
-+	}
-+
-+	page = balloon_alloc_empty_page_range(NET_RX_RING_SIZE);
-+	BUG_ON(page == NULL);
-+	rx_mmap_area = pfn_to_kaddr(page_to_pfn(page));
-+
-+	for (i = 0; i < NET_RX_RING_SIZE; i++) {
-+		page = virt_to_page(rx_mmap_area + (i * PAGE_SIZE));
-+		init_page_count(page);
-+		SetPageForeign(page, netif_rx_page_release);
++		page->index = i;
 +	}
 +
 +	pending_cons = 0;
@@ -58911,10 +60518,10 @@
 +module_init(netback_init);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/netback/xenbus.c linux-2.6.18-xen/drivers/xen/netback/xenbus.c
---- linux-2.6.18/drivers/xen/netback/xenbus.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/netback/xenbus.c	2006-09-21 01:33:31.000000000 +0200
-@@ -0,0 +1,473 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/netback/xenbus.c linux-2.6.18-xen/drivers/xen/netback/xenbus.c
+--- linux-2.6.18.1/drivers/xen/netback/xenbus.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/netback/xenbus.c	2006-10-19 11:01:25.000000000 +0200
+@@ -0,0 +1,438 @@
 +/*  Xenbus code for netif backend
 +    Copyright (C) 2005 Rusty Russell <rusty at rustcorp.com.au>
 +    Copyright (C) 2005 XenSource Ltd
@@ -58945,29 +60552,20 @@
 +    printk("netback/xenbus (%s:%d) " fmt ".\n", __FUNCTION__, __LINE__, ##args)
 +#endif
 +
-+struct backend_info
-+{
++struct backend_info {
 +	struct xenbus_device *dev;
 +	netif_t *netif;
-+	struct xenbus_watch backend_watch;
 +	enum xenbus_state frontend_state;
 +};
 +
 +static int connect_rings(struct backend_info *);
 +static void connect(struct backend_info *);
-+static void maybe_connect(struct backend_info *);
-+static void backend_changed(struct xenbus_watch *, const char **,
-+			    unsigned int);
++static void backend_create_netif(struct backend_info *be);
 +
 +static int netback_remove(struct xenbus_device *dev)
 +{
 +	struct backend_info *be = dev->dev.driver_data;
 +
-+	if (be->backend_watch.node) {
-+		unregister_xenbus_watch(&be->backend_watch);
-+		kfree(be->backend_watch.node);
-+		be->backend_watch.node = NULL;
-+	}
 +	if (be->netif) {
 +		netif_disconnect(be->netif);
 +		be->netif = NULL;
@@ -58980,8 +60578,7 @@
 +
 +/**
 + * Entry point to this code when a new device is created.  Allocate the basic
-+ * structures, and watch the store waiting for the hotplug scripts to tell us
-+ * the device's handle.  Switch to InitWait.
++ * structures and switch to InitWait.
 + */
 +static int netback_probe(struct xenbus_device *dev,
 +			 const struct xenbus_device_id *id)
@@ -59000,11 +60597,6 @@
 +	be->dev = dev;
 +	dev->dev.driver_data = be;
 +
-+	err = xenbus_watch_path2(dev, dev->nodename, "handle",
-+				 &be->backend_watch, backend_changed);
-+	if (err)
-+		goto fail;
-+
 +	do {
 +		err = xenbus_transaction_start(&xbt);
 +		if (err) {
@@ -59025,7 +60617,8 @@
 +			goto abort_transaction;
 +		}
 +
-+		err = xenbus_printf(xbt, dev->nodename, "feature-rx-copy", "%d", 1);
++		err = xenbus_printf(xbt, dev->nodename,
++				    "feature-rx-copy", "%d", 1);
 +		if (err) {
 +			message = "writing feature-copying";
 +			goto abort_transaction;
@@ -59040,9 +60633,11 @@
 +	}
 +
 +	err = xenbus_switch_state(dev, XenbusStateInitWait);
-+	if (err) {
++	if (err)
 +		goto fail;
-+	}
++
++	/* This kicks hotplug scripts, so do it immediately. */
++	backend_create_netif(be);
 +
 +	return 0;
 +
@@ -59092,48 +60687,30 @@
 +}
 +
 +
-+/**
-+ * Callback received when the hotplug scripts have placed the handle node.
-+ * Read it, and create a netif structure.  If the frontend is ready, connect.
-+ */
-+static void backend_changed(struct xenbus_watch *watch,
-+			    const char **vec, unsigned int len)
++static void backend_create_netif(struct backend_info *be)
 +{
 +	int err;
 +	long handle;
-+	struct backend_info *be
-+		= container_of(watch, struct backend_info, backend_watch);
 +	struct xenbus_device *dev = be->dev;
 +
-+	DPRINTK("");
++	if (be->netif != NULL)
++		return;
 +
 +	err = xenbus_scanf(XBT_NIL, dev->nodename, "handle", "%li", &handle);
-+	if (XENBUS_EXIST_ERR(err)) {
-+		/* Since this watch will fire once immediately after it is
-+		   registered, we expect this.  Ignore it, and wait for the
-+		   hotplug scripts. */
-+		return;
-+	}
 +	if (err != 1) {
 +		xenbus_dev_fatal(dev, err, "reading handle");
 +		return;
 +	}
 +
-+	if (be->netif == NULL) {
-+		u8 be_mac[ETH_ALEN] = { 0, 0, 0, 0, 0, 0 };
-+
-+		be->netif = netif_alloc(dev->otherend_id, handle, be_mac);
-+		if (IS_ERR(be->netif)) {
-+			err = PTR_ERR(be->netif);
-+			be->netif = NULL;
-+			xenbus_dev_fatal(dev, err, "creating interface");
-+			return;
-+		}
-+
-+		kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
-+
-+		maybe_connect(be);
++	be->netif = netif_alloc(dev->otherend_id, handle);
++	if (IS_ERR(be->netif)) {
++		err = PTR_ERR(be->netif);
++		be->netif = NULL;
++		xenbus_dev_fatal(dev, err, "creating interface");
++		return;
 +	}
++
++	kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
 +}
 +
 +
@@ -59166,11 +60743,9 @@
 +		break;
 +
 +	case XenbusStateConnected:
-+		if (!be->netif) {
-+			/* reconnect: setup be->netif */
-+			backend_changed(&be->backend_watch, NULL, 0);
-+		}
-+		maybe_connect(be);
++		backend_create_netif(be);
++		if (be->netif)
++			connect(be);
 +		break;
 +
 +	case XenbusStateClosing:
@@ -59196,15 +60771,6 @@
 +}
 +
 +
-+/* ** Connection ** */
-+
-+
-+static void maybe_connect(struct backend_info *be)
-+{
-+	if (be->netif && (be->frontend_state == XenbusStateConnected))
-+		connect(be);
-+}
-+
 +static void xen_net_read_rate(struct xenbus_device *dev,
 +			      unsigned long *bytes, unsigned long *usec)
 +{
@@ -59283,6 +60849,10 @@
 +	be->netif->remaining_credit = be->netif->credit_bytes;
 +
 +	xenbus_switch_state(dev, XenbusStateConnected);
++
++	/* May not get a kick from the frontend, so start the tx_queue now. */
++	if (!netbk_can_queue(be->netif->dev))
++		netif_start_queue(be->netif->dev);
 +}
 +
 +
@@ -59320,14 +60890,16 @@
 +	}
 +	be->netif->copying_receiver = !!rx_copy;
 +
-+	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-rx-notify", "%d",
-+			 &val) < 0)
-+		val = 0;
-+	if (val)
-+		be->netif->can_queue = 1;
-+	else
-+		/* Must be non-zero for pfifo_fast to work. */
-+		be->netif->dev->tx_queue_len = 1;
++	if (be->netif->dev->tx_queue_len != 0) {
++		if (xenbus_scanf(XBT_NIL, dev->otherend,
++				 "feature-rx-notify", "%d", &val) < 0)
++			val = 0;
++		if (val)
++			be->netif->can_queue = 1;
++		else
++			/* Must be non-zero for pfifo_fast to work. */
++			be->netif->dev->tx_queue_len = 1;
++	}
 +
 +	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg", "%d", &val) < 0)
 +		val = 0;
@@ -59388,8 +60960,8 @@
 +{
 +	xenbus_register_backend(&netback);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/netfront/Kconfig linux-2.6.18-xen/drivers/xen/netfront/Kconfig
---- linux-2.6.18/drivers/xen/netfront/Kconfig	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/netfront/Kconfig linux-2.6.18-xen/drivers/xen/netfront/Kconfig
+--- linux-2.6.18.1/drivers/xen/netfront/Kconfig	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/netfront/Kconfig	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,6 @@
 +
@@ -59398,18 +60970,18 @@
 +	depends on NETDEVICES && ARCH_XEN
 +	help
 +	  Network driver for Xen
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/netfront/Makefile linux-2.6.18-xen/drivers/xen/netfront/Makefile
---- linux-2.6.18/drivers/xen/netfront/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/netfront/Makefile linux-2.6.18-xen/drivers/xen/netfront/Makefile
+--- linux-2.6.18.1/drivers/xen/netfront/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/netfront/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,4 @@
 +
 +obj-$(CONFIG_XEN_NETDEV_FRONTEND)	:= xennet.o
 +
 +xennet-objs := netfront.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/netfront/netfront.c linux-2.6.18-xen/drivers/xen/netfront/netfront.c
---- linux-2.6.18/drivers/xen/netfront/netfront.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/netfront/netfront.c	2006-09-21 01:33:31.000000000 +0200
-@@ -0,0 +1,2076 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/netfront/netfront.c linux-2.6.18-xen/drivers/xen/netfront/netfront.c
+--- linux-2.6.18.1/drivers/xen/netfront/netfront.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/netfront/netfront.c	2006-10-19 11:01:25.000000000 +0200
+@@ -0,0 +1,2138 @@
 +/******************************************************************************
 + * Virtual network driver for conversing with remote driver backends.
 + *
@@ -59458,6 +61030,7 @@
 +#include <linux/in.h>
 +#include <linux/if_ether.h>
 +#include <linux/io.h>
++#include <linux/moduleparam.h>
 +#include <net/sock.h>
 +#include <net/pkt_sched.h>
 +#include <net/arp.h>
@@ -59475,20 +61048,64 @@
 +#include <xen/interface/grant_table.h>
 +#include <xen/gnttab.h>
 +
++/*
++ * Mutually-exclusive module options to select receive data path:
++ *  rx_copy : Packets are copied by network backend into local memory
++ *  rx_flip : Page containing packet data is transferred to our ownership
++ * For fully-virtualised guests there is no option - copying must be used.
++ * For paravirtualised guests, flipping is the default.
++ */
++#ifdef CONFIG_XEN
++static int MODPARM_rx_copy = 0;
++module_param_named(rx_copy, MODPARM_rx_copy, bool, 0);
++MODULE_PARM_DESC(rx_copy, "Copy packets from network card (rather than flip)");
++static int MODPARM_rx_flip = 0;
++module_param_named(rx_flip, MODPARM_rx_flip, bool, 0);
++MODULE_PARM_DESC(rx_flip, "Flip packets from network card (rather than copy)");
++#else
++static const int MODPARM_rx_copy = 1;
++static const int MODPARM_rx_flip = 0;
++#endif
++
 +#define RX_COPY_THRESHOLD 256
 +
 +/* If we don't have GSO, fake things up so that we never try to use it. */
-+#ifndef NETIF_F_GSO
-+#define netif_needs_gso(dev, skb)	0
-+#define dev_disable_gso_features(dev)	((void)0)
-+#else
++#if defined(NETIF_F_GSO)
 +#define HAVE_GSO			1
++#define HAVE_TSO			1 /* TSO is a subset of GSO */
 +static inline void dev_disable_gso_features(struct net_device *dev)
 +{
 +	/* Turn off all GSO bits except ROBUST. */
 +	dev->features &= (1 << NETIF_F_GSO_SHIFT) - 1;
 +	dev->features |= NETIF_F_GSO_ROBUST;
 +}
++#elif defined(NETIF_F_TSO)
++#define HAVE_TSO                       1
++#define gso_size tso_size
++#define gso_segs tso_segs
++static inline void dev_disable_gso_features(struct net_device *dev)
++{
++       /* Turn off all TSO bits. */
++       dev->features &= ~NETIF_F_TSO;
++}
++static inline int skb_is_gso(const struct sk_buff *skb)
++{
++        return skb_shinfo(skb)->tso_size;
++}
++static inline int skb_gso_ok(struct sk_buff *skb, int features)
++{
++        return (features & NETIF_F_TSO);
++}
++
++static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
++{
++        return skb_is_gso(skb) &&
++               (!skb_gso_ok(skb, dev->features) ||
++                unlikely(skb->ip_summed != CHECKSUM_HW));
++}
++#else
++#define netif_needs_gso(dev, skb)	0
++#define dev_disable_gso_features(dev)	((void)0)
 +#endif
 +
 +#define GRANT_INVALID_REF	0
@@ -59508,7 +61125,6 @@
 +	spinlock_t   tx_lock;
 +	spinlock_t   rx_lock;
 +
-+	unsigned int handle;
 +	unsigned int evtchn, irq;
 +	unsigned int copying_receiver;
 +
@@ -59532,7 +61148,7 @@
 +	grant_ref_t gref_tx_head;
 +	grant_ref_t grant_tx_ref[NET_TX_RING_SIZE + 1];
 +	grant_ref_t gref_rx_head;
-+	grant_ref_t grant_rx_ref[NET_TX_RING_SIZE];
++	grant_ref_t grant_rx_ref[NET_RX_RING_SIZE];
 +
 +	struct xenbus_device *xbdev;
 +	int tx_ring_ref;
@@ -59597,9 +61213,8 @@
 +#define WPRINTK(fmt, args...)				\
 +	printk(KERN_WARNING "netfront: " fmt, ##args)
 +
-+static int talk_to_backend(struct xenbus_device *, struct netfront_info *);
 +static int setup_device(struct xenbus_device *, struct netfront_info *);
-+static struct net_device *create_netdev(int, int, struct xenbus_device *);
++static struct net_device *create_netdev(struct xenbus_device *);
 +
 +static void netfront_closing(struct xenbus_device *);
 +
@@ -59609,7 +61224,7 @@
 +static void close_netdev(struct netfront_info *);
 +static void netif_free(struct netfront_info *);
 +
-+static void network_connect(struct net_device *);
++static int network_connect(struct net_device *);
 +static void network_tx_buf_gc(struct net_device *);
 +static void network_alloc_rx_buffers(struct net_device *);
 +static int send_fake_arp(struct net_device *);
@@ -59632,8 +61247,7 @@
 +/**
 + * Entry point to this code when a new device is created.  Allocate the basic
 + * structures and the ring buffers for communication with the backend, and
-+ * inform the backend of the appropriate details for those.  Switch to
-+ * Connected state.
++ * inform the backend of the appropriate details for those.
 + */
 +static int __devinit netfront_probe(struct xenbus_device *dev,
 +				    const struct xenbus_device_id *id)
@@ -59641,31 +61255,8 @@
 +	int err;
 +	struct net_device *netdev;
 +	struct netfront_info *info;
-+	unsigned int handle;
-+	unsigned feature_rx_copy;
-+
-+	err = xenbus_scanf(XBT_NIL, dev->nodename, "handle", "%u", &handle);
-+	if (err != 1) {
-+		xenbus_dev_fatal(dev, err, "reading handle");
-+		return err;
-+	}
-+
-+#ifndef CONFIG_XEN
-+	err = xenbus_scanf(XBT_NIL, dev->otherend, "feature-rx-copy", "%u",
-+			   &feature_rx_copy);
-+	if (err != 1) {
-+		xenbus_dev_fatal(dev, err, "reading feature-rx-copy");
-+		return err;
-+	}
-+	if (!feature_rx_copy) {
-+		xenbus_dev_fatal(dev, 0, "need a copy-capable backend");
-+		return -EINVAL;
-+	}
-+#else
-+	feature_rx_copy = 0;
-+#endif
 +
-+	netdev = create_netdev(handle, feature_rx_copy, dev);
++	netdev = create_netdev(dev);
 +	if (IS_ERR(netdev)) {
 +		err = PTR_ERR(netdev);
 +		xenbus_dev_fatal(dev, err, "creating netdev");
@@ -59675,20 +61266,13 @@
 +	info = netdev_priv(netdev);
 +	dev->dev.driver_data = info;
 +
-+	err = talk_to_backend(dev, info);
-+	if (err)
-+		goto fail_backend;
-+
 +	err = open_netdev(info);
 +	if (err)
-+		goto fail_open;
++		goto fail;
 +
 +	return 0;
 +
-+ fail_open:
-+	xennet_sysfs_delif(info->netdev);
-+	unregister_netdev(netdev);
-+ fail_backend:
++ fail:
 +	free_netdev(netdev);
 +	dev->dev.driver_data = NULL;
 +	return err;
@@ -59708,7 +61292,7 @@
 +	DPRINTK("%s\n", dev->nodename);
 +
 +	netif_disconnect_backend(info);
-+	return talk_to_backend(dev, info);
++	return 0;
 +}
 +
 +static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
@@ -59797,7 +61381,7 @@
 +		goto abort_transaction;
 +	}
 +
-+#ifdef HAVE_GSO
++#ifdef HAVE_TSO
 +	err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4", "%d", 1);
 +	if (err) {
 +		message = "writing feature-gso-tcpv4";
@@ -59819,7 +61403,7 @@
 +	xenbus_transaction_end(xbt, 1);
 +	xenbus_dev_fatal(dev, err, "%s", message);
 + destroy_ring:
-+	netif_free(info);
++	netif_disconnect_backend(info);
 + out:
 +	return err;
 +}
@@ -59909,7 +61493,10 @@
 +		break;
 +
 +	case XenbusStateInitWait:
-+		network_connect(netdev);
++		if (network_connect(netdev) != 0) {
++			netif_free(np);
++			break;
++		}
 +		xenbus_switch_state(dev, XenbusStateConnected);
 +		(void)send_fake_arp(netdev);
 +		break;
@@ -60154,7 +61741,7 @@
 +		} else {
 +			gnttab_grant_foreign_access_ref(ref,
 +							np->xbdev->otherend_id,
-+							pfn,
++							pfn_to_mfn(pfn),
 +							0);
 +		}
 +
@@ -60329,7 +61916,7 @@
 +		tx->flags |= NETTXF_data_validated;
 +#endif
 +
-+#ifdef HAVE_GSO
++#ifdef HAVE_TSO
 +	if (skb_is_gso(skb)) {
 +		struct netif_extra_info *gso = (struct netif_extra_info *)
 +			RING_GET_REQUEST(&np->tx, ++i);
@@ -60483,6 +62070,7 @@
 +			if (net_ratelimit())
 +				WPRINTK("rx->offset: %x, size: %u\n",
 +					rx->offset, rx->status);
++			xennet_move_rx_slot(np, skb, ref);
 +			err = -EINVAL;
 +			goto next;
 +		}
@@ -60493,7 +62081,8 @@
 +		 * situation to the system controller to reboot the backed.
 +		 */
 +		if (ref == GRANT_INVALID_REF) {
-+			WPRINTK("Bad rx response id %d.\n", rx->id);
++			if (net_ratelimit())
++				WPRINTK("Bad rx response id %d.\n", rx->id);
 +			err = -EINVAL;
 +			goto next;
 +		}
@@ -60565,6 +62154,9 @@
 +		err = -E2BIG;
 +	}
 +
++	if (unlikely(err))
++		np->rx.rsp_cons = cons + frags;
++
 +	*pages_flipped_p = pages_flipped;
 +
 +	return err;
@@ -60617,12 +62209,14 @@
 +		return -EINVAL;
 +	}
 +
-+#ifdef HAVE_GSO
++#ifdef HAVE_TSO
 +	skb_shinfo(skb)->gso_size = gso->u.gso.size;
++#ifdef HAVE_GSO
 +	skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
 +
 +	/* Header must be checked, and gso_segs computed. */
 +	skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
++#endif
 +	skb_shinfo(skb)->gso_segs = 0;
 +
 +	return 0;
@@ -60667,9 +62261,9 @@
 +	rp = np->rx.sring->rsp_prod;
 +	rmb(); /* Ensure we see queued responses up to 'rp'. */
 +
-+	for (i = np->rx.rsp_cons, work_done = 0;
-+	     (i != rp) && (work_done < budget);
-+	     np->rx.rsp_cons = ++i, work_done++) {
++	i = np->rx.rsp_cons;
++	work_done = 0;
++	while ((i != rp) && (work_done < budget)) {
 +		memcpy(rx, RING_GET_RESPONSE(&np->rx, i), sizeof(*rx));
 +		memset(extras, 0, sizeof(extras));
 +
@@ -60677,12 +62271,11 @@
 +					   &pages_flipped);
 +
 +		if (unlikely(err)) {
-+err:
-+			i = np->rx.rsp_cons + skb_queue_len(&tmpq) - 1;
-+			work_done--;
++err:	
 +			while ((skb = __skb_dequeue(&tmpq)))
 +				__skb_queue_tail(&errq, skb);
 +			np->stats.rx_errors++;
++			i = np->rx.rsp_cons;
 +			continue;
 +		}
 +
@@ -60694,6 +62287,7 @@
 +
 +			if (unlikely(xennet_set_skb_gso(skb, gso))) {
 +				__skb_queue_head(&tmpq, skb);
++				np->rx.rsp_cons += skb_queue_len(&tmpq);
 +				goto err;
 +			}
 +		}
@@ -60757,6 +62351,9 @@
 +		np->stats.rx_bytes += skb->len;
 +
 +		__skb_queue_tail(&rxq, skb);
++
++		np->rx.rsp_cons = ++i;
++		work_done++;
 +	}
 +
 +	if (pages_flipped) {
@@ -60973,7 +62570,7 @@
 +
 +static int xennet_set_tso(struct net_device *dev, u32 data)
 +{
-+#ifdef HAVE_GSO
++#ifdef HAVE_TSO
 +	if (data) {
 +		struct netfront_info *np = netdev_priv(dev);
 +		int val;
@@ -61004,16 +62601,41 @@
 +		xennet_set_tso(dev, 1);
 +}
 +
-+static void network_connect(struct net_device *dev)
++static int network_connect(struct net_device *dev)
 +{
 +	struct netfront_info *np = netdev_priv(dev);
-+	int i, requeue_idx;
++	int i, requeue_idx, err;
 +	struct sk_buff *skb;
 +	grant_ref_t ref;
 +	netif_rx_request_t *req;
++	unsigned int feature_rx_copy, feature_rx_flip;
++
++	err = xenbus_scanf(XBT_NIL, np->xbdev->otherend,
++			   "feature-rx-copy", "%u", &feature_rx_copy);
++	if (err != 1)
++		feature_rx_copy = 0;
++	err = xenbus_scanf(XBT_NIL, np->xbdev->otherend,
++			   "feature-rx-flip", "%u", &feature_rx_flip);
++	if (err != 1)
++		feature_rx_flip = 1;
++
++	/*
++	 * Copy packets on receive path if:
++	 *  (a) This was requested by user, and the backend supports it; or
++	 *  (b) Flipping was requested, but this is unsupported by the backend.
++	 */
++	np->copying_receiver = ((MODPARM_rx_copy && feature_rx_copy) ||
++				(MODPARM_rx_flip && !feature_rx_flip));
++
++	err = talk_to_backend(np->xbdev, np);
++	if (err)
++		return err;
 +
 +	xennet_set_features(dev);
 +
++	IPRINTK("device %s has %sing receive path.\n",
++		dev->name, np->copying_receiver ? "copy" : "flipp");
++
 +	spin_lock_irq(&np->tx_lock);
 +	spin_lock(&np->rx_lock);
 +
@@ -61044,7 +62666,8 @@
 +		} else {
 +			gnttab_grant_foreign_access_ref(
 +				ref, np->xbdev->otherend_id,
-+				page_to_pfn(skb_shinfo(skb)->frags->page),
++				pfn_to_mfn(page_to_pfn(skb_shinfo(skb)->
++						       frags->page)),
 +				0);
 +		}
 +		req->gref = ref;
@@ -61068,6 +62691,8 @@
 +
 +	spin_unlock(&np->rx_lock);
 +	spin_unlock_irq(&np->tx_lock);
++
++	return 0;
 +}
 +
 +static void netif_uninit(struct net_device *dev)
@@ -61233,8 +62858,7 @@
 +{
 +}
 +
-+static struct net_device * __devinit
-+create_netdev(int handle, int copying_receiver, struct xenbus_device *dev)
++static struct net_device * __devinit create_netdev(struct xenbus_device *dev)
 +{
 +	int i, err = 0;
 +	struct net_device *netdev = NULL;
@@ -61248,9 +62872,7 @@
 +	}
 +
 +	np                   = netdev_priv(netdev);
-+	np->handle           = handle;
 +	np->xbdev            = dev;
-+	np->copying_receiver = copying_receiver;
 +
 +	netif_carrier_off(netdev);
 +
@@ -61381,10 +63003,12 @@
 +
 +	err = xennet_sysfs_addif(info->netdev);
 +	if (err) {
-+		/* This can be non-fatal: it only means no tuning parameters */
++		unregister_netdev(info->netdev);
 +		printk(KERN_WARNING "%s: add sysfs failed err=%d\n",
 +		       __FUNCTION__, err);
++		return err;
 +	}
++
 +	return 0;
 +}
 +
@@ -61465,6 +63089,16 @@
 +	if (!is_running_on_xen())
 +		return -ENODEV;
 +
++#ifdef CONFIG_XEN
++	if (MODPARM_rx_flip && MODPARM_rx_copy) {
++		WPRINTK("Cannot specify both rx_copy and rx_flip.\n");
++		return -EINVAL;
++	}
++
++	if (!MODPARM_rx_flip && !MODPARM_rx_copy)
++		MODPARM_rx_flip = 1; /* Default is to flip. */
++#endif
++
 +	if (is_initial_xendomain())
 +		return 0;
 +
@@ -61486,8 +63120,8 @@
 +module_exit(netif_exit);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/conf_space.c linux-2.6.18-xen/drivers/xen/pciback/conf_space.c
---- linux-2.6.18/drivers/xen/pciback/conf_space.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/conf_space.c linux-2.6.18-xen/drivers/xen/pciback/conf_space.c
+--- linux-2.6.18.1/drivers/xen/pciback/conf_space.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/conf_space.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,425 @@
 +/*
@@ -61915,8 +63549,8 @@
 +{
 +	return pciback_config_capability_init();
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/conf_space_capability.c linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability.c
---- linux-2.6.18/drivers/xen/pciback/conf_space_capability.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/conf_space_capability.c linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability.c
+--- linux-2.6.18.1/drivers/xen/pciback/conf_space_capability.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,71 @@
 +/*
@@ -61990,8 +63624,8 @@
 +
 +	return 0;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/conf_space_capability.h linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability.h
---- linux-2.6.18/drivers/xen/pciback/conf_space_capability.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/conf_space_capability.h linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability.h
+--- linux-2.6.18.1/drivers/xen/pciback/conf_space_capability.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability.h	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,23 @@
 +/*
@@ -62017,8 +63651,8 @@
 +};
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/conf_space_capability_pm.c linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability_pm.c
---- linux-2.6.18/drivers/xen/pciback/conf_space_capability_pm.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/conf_space_capability_pm.c linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability_pm.c
+--- linux-2.6.18.1/drivers/xen/pciback/conf_space_capability_pm.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability_pm.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,113 @@
 +/*
@@ -62134,8 +63768,8 @@
 +	.capability = PCI_CAP_ID_PM,
 +	.fields = caplist_pm,
 +};
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/conf_space_capability_vpd.c linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability_vpd.c
---- linux-2.6.18/drivers/xen/pciback/conf_space_capability_vpd.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/conf_space_capability_vpd.c linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability_vpd.c
+--- linux-2.6.18.1/drivers/xen/pciback/conf_space_capability_vpd.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/conf_space_capability_vpd.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,42 @@
 +/*
@@ -62180,8 +63814,8 @@
 +	.capability = PCI_CAP_ID_VPD,
 +	.fields = caplist_vpd,
 +};
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/conf_space.h linux-2.6.18-xen/drivers/xen/pciback/conf_space.h
---- linux-2.6.18/drivers/xen/pciback/conf_space.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/conf_space.h linux-2.6.18-xen/drivers/xen/pciback/conf_space.h
+--- linux-2.6.18.1/drivers/xen/pciback/conf_space.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/conf_space.h	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,126 @@
 +/*
@@ -62310,8 +63944,8 @@
 +int pciback_config_capability_add_fields(struct pci_dev *dev);
 +
 +#endif				/* __XEN_PCIBACK_CONF_SPACE_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/conf_space_header.c linux-2.6.18-xen/drivers/xen/pciback/conf_space_header.c
---- linux-2.6.18/drivers/xen/pciback/conf_space_header.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/conf_space_header.c linux-2.6.18-xen/drivers/xen/pciback/conf_space_header.c
+--- linux-2.6.18.1/drivers/xen/pciback/conf_space_header.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/conf_space_header.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,299 @@
 +/*
@@ -62613,8 +64247,8 @@
 +      out:
 +	return err;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/conf_space_quirks.c linux-2.6.18-xen/drivers/xen/pciback/conf_space_quirks.c
---- linux-2.6.18/drivers/xen/pciback/conf_space_quirks.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/conf_space_quirks.c linux-2.6.18-xen/drivers/xen/pciback/conf_space_quirks.c
+--- linux-2.6.18.1/drivers/xen/pciback/conf_space_quirks.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/conf_space_quirks.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,128 @@
 +/*
@@ -62745,8 +64379,8 @@
 +      out:
 +	return ret;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/conf_space_quirks.h linux-2.6.18-xen/drivers/xen/pciback/conf_space_quirks.h
---- linux-2.6.18/drivers/xen/pciback/conf_space_quirks.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/conf_space_quirks.h linux-2.6.18-xen/drivers/xen/pciback/conf_space_quirks.h
+--- linux-2.6.18.1/drivers/xen/pciback/conf_space_quirks.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/conf_space_quirks.h	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,35 @@
 +/*
@@ -62784,8 +64418,8 @@
 +int pciback_field_is_dup(struct pci_dev *dev, int reg);
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/Makefile linux-2.6.18-xen/drivers/xen/pciback/Makefile
---- linux-2.6.18/drivers/xen/pciback/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/Makefile linux-2.6.18-xen/drivers/xen/pciback/Makefile
+--- linux-2.6.18.1/drivers/xen/pciback/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,15 @@
 +obj-$(CONFIG_XEN_PCIDEV_BACKEND) += pciback.o
@@ -62803,8 +64437,8 @@
 +ifeq ($(CONFIG_XEN_PCIDEV_BE_DEBUG),y)
 +EXTRA_CFLAGS += -DDEBUG
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/passthrough.c linux-2.6.18-xen/drivers/xen/pciback/passthrough.c
---- linux-2.6.18/drivers/xen/pciback/passthrough.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/passthrough.c linux-2.6.18-xen/drivers/xen/pciback/passthrough.c
+--- linux-2.6.18.1/drivers/xen/pciback/passthrough.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/passthrough.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,157 @@
 +/*
@@ -62964,8 +64598,8 @@
 +	kfree(dev_data);
 +	pdev->pci_dev_data = NULL;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/pciback.h linux-2.6.18-xen/drivers/xen/pciback/pciback.h
---- linux-2.6.18/drivers/xen/pciback/pciback.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/pciback.h linux-2.6.18-xen/drivers/xen/pciback/pciback.h
+--- linux-2.6.18.1/drivers/xen/pciback/pciback.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/pciback.h	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,93 @@
 +/*
@@ -63061,8 +64695,8 @@
 +
 +extern int verbose_request;
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/pciback_ops.c linux-2.6.18-xen/drivers/xen/pciback/pciback_ops.c
---- linux-2.6.18/drivers/xen/pciback/pciback_ops.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/pciback_ops.c linux-2.6.18-xen/drivers/xen/pciback/pciback_ops.c
+--- linux-2.6.18.1/drivers/xen/pciback/pciback_ops.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/pciback_ops.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,95 @@
 +/*
@@ -63160,8 +64794,8 @@
 +
 +	return IRQ_HANDLED;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/pci_stub.c linux-2.6.18-xen/drivers/xen/pciback/pci_stub.c
---- linux-2.6.18/drivers/xen/pciback/pci_stub.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/pci_stub.c linux-2.6.18-xen/drivers/xen/pciback/pci_stub.c
+--- linux-2.6.18.1/drivers/xen/pciback/pci_stub.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/pci_stub.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,916 @@
 +/*
@@ -64080,8 +65714,8 @@
 +module_exit(pciback_cleanup);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/slot.c linux-2.6.18-xen/drivers/xen/pciback/slot.c
---- linux-2.6.18/drivers/xen/pciback/slot.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/slot.c linux-2.6.18-xen/drivers/xen/pciback/slot.c
+--- linux-2.6.18.1/drivers/xen/pciback/slot.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/slot.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,151 @@
 +/*
@@ -64235,8 +65869,8 @@
 +	kfree(slot_dev);
 +	pdev->pci_dev_data = NULL;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/vpci.c linux-2.6.18-xen/drivers/xen/pciback/vpci.c
---- linux-2.6.18/drivers/xen/pciback/vpci.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/vpci.c linux-2.6.18-xen/drivers/xen/pciback/vpci.c
+--- linux-2.6.18.1/drivers/xen/pciback/vpci.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/vpci.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,204 @@
 +/*
@@ -64443,8 +66077,8 @@
 +	kfree(vpci_dev);
 +	pdev->pci_dev_data = NULL;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pciback/xenbus.c linux-2.6.18-xen/drivers/xen/pciback/xenbus.c
---- linux-2.6.18/drivers/xen/pciback/xenbus.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pciback/xenbus.c linux-2.6.18-xen/drivers/xen/pciback/xenbus.c
+--- linux-2.6.18.1/drivers/xen/pciback/xenbus.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pciback/xenbus.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,458 @@
 +/*
@@ -64905,8 +66539,8 @@
 +{
 +	xenbus_unregister_driver(&xenbus_pciback_driver);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pcifront/Makefile linux-2.6.18-xen/drivers/xen/pcifront/Makefile
---- linux-2.6.18/drivers/xen/pcifront/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pcifront/Makefile linux-2.6.18-xen/drivers/xen/pcifront/Makefile
+--- linux-2.6.18.1/drivers/xen/pcifront/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pcifront/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,7 @@
 +obj-y += pcifront.o
@@ -64916,8 +66550,8 @@
 +ifeq ($(CONFIG_XEN_PCIDEV_FE_DEBUG),y)
 +EXTRA_CFLAGS += -DDEBUG
 +endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pcifront/pci.c linux-2.6.18-xen/drivers/xen/pcifront/pci.c
---- linux-2.6.18/drivers/xen/pcifront/pci.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pcifront/pci.c linux-2.6.18-xen/drivers/xen/pcifront/pci.c
+--- linux-2.6.18.1/drivers/xen/pcifront/pci.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pcifront/pci.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,46 @@
 +/*
@@ -64966,8 +66600,8 @@
 +
 +	spin_unlock(&pcifront_dev_lock);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pcifront/pcifront.h linux-2.6.18-xen/drivers/xen/pcifront/pcifront.h
---- linux-2.6.18/drivers/xen/pcifront/pcifront.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pcifront/pcifront.h linux-2.6.18-xen/drivers/xen/pcifront/pcifront.h
+--- linux-2.6.18.1/drivers/xen/pcifront/pcifront.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pcifront/pcifront.h	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,40 @@
 +/*
@@ -65010,8 +66644,8 @@
 +void pcifront_free_roots(struct pcifront_device *pdev);
 +
 +#endif	/* __XEN_PCIFRONT_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pcifront/pci_op.c linux-2.6.18-xen/drivers/xen/pcifront/pci_op.c
---- linux-2.6.18/drivers/xen/pcifront/pci_op.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pcifront/pci_op.c linux-2.6.18-xen/drivers/xen/pcifront/pci_op.c
+--- linux-2.6.18.1/drivers/xen/pcifront/pci_op.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pcifront/pci_op.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,273 @@
 +/*
@@ -65287,8 +66921,8 @@
 +		kfree(bus_entry);
 +	}
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/pcifront/xenbus.c linux-2.6.18-xen/drivers/xen/pcifront/xenbus.c
---- linux-2.6.18/drivers/xen/pcifront/xenbus.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/pcifront/xenbus.c linux-2.6.18-xen/drivers/xen/pcifront/xenbus.c
+--- linux-2.6.18.1/drivers/xen/pcifront/xenbus.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/pcifront/xenbus.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,295 @@
 +/*
@@ -65586,16 +67220,16 @@
 +
 +/* Initialize after the Xen PCI Frontend Stub is initialized */
 +subsys_initcall(pcifront_init);
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/privcmd/Makefile linux-2.6.18-xen/drivers/xen/privcmd/Makefile
---- linux-2.6.18/drivers/xen/privcmd/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/privcmd/Makefile linux-2.6.18-xen/drivers/xen/privcmd/Makefile
+--- linux-2.6.18.1/drivers/xen/privcmd/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/privcmd/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,2 @@
 +
 +obj-$(CONFIG_XEN_PRIVCMD)	:= privcmd.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/privcmd/privcmd.c linux-2.6.18-xen/drivers/xen/privcmd/privcmd.c
---- linux-2.6.18/drivers/xen/privcmd/privcmd.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/privcmd/privcmd.c	2006-09-04 16:31:13.000000000 +0200
-@@ -0,0 +1,266 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/privcmd/privcmd.c linux-2.6.18-xen/drivers/xen/privcmd/privcmd.c
+--- linux-2.6.18.1/drivers/xen/privcmd/privcmd.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/privcmd/privcmd.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,283 @@
 +/******************************************************************************
 + * privcmd.c
 + * 
@@ -65632,6 +67266,10 @@
 +static struct proc_dir_entry *privcmd_intf;
 +static struct proc_dir_entry *capabilities_intf;
 +
++#ifndef HAVE_ARCH_PRIVCMD_MMAP
++static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma);
++#endif
++
 +static int privcmd_ioctl(struct inode *inode, struct file *file,
 +			 unsigned int cmd, unsigned long data)
 +{
@@ -65680,27 +67318,18 @@
 +				: "r8", "r10", "memory" );
 +		}
 +#elif defined (__ia64__)
-+		__asm__ __volatile__ (
-+			";; mov r14=%2; mov r15=%3; "
-+			"mov r16=%4; mov r17=%5; mov r18=%6;"
-+			"mov r2=%1; break 0x1000;; mov %0=r8 ;;"
-+			: "=r" (ret)
-+			: "r" (hypercall.op),
-+			"r" (hypercall.arg[0]),
-+			"r" (hypercall.arg[1]),
-+			"r" (hypercall.arg[2]),
-+			"r" (hypercall.arg[3]),
-+			"r" (hypercall.arg[4])
-+			: "r14","r15","r16","r17","r18","r2","r8","memory");
++		ret = privcmd_hypercall(&hypercall);
 +#endif
 +	}
 +	break;
 +
 +	case IOCTL_PRIVCMD_MMAP: {
-+#define PRIVCMD_MMAP_SZ 32
 +		privcmd_mmap_t mmapcmd;
-+		privcmd_mmap_entry_t msg[PRIVCMD_MMAP_SZ];
++		privcmd_mmap_entry_t msg;
 +		privcmd_mmap_entry_t __user *p;
++		struct mm_struct *mm = current->mm;
++		struct vm_area_struct *vma;
++		unsigned long va;
 +		int i, rc;
 +
 +		if (!is_initial_xendomain())
@@ -65710,47 +67339,60 @@
 +			return -EFAULT;
 +
 +		p = mmapcmd.entry;
++		if (copy_from_user(&msg, p, sizeof(msg)))
++			return -EFAULT;
 +
-+		for (i = 0; i < mmapcmd.num;
-+		     i += PRIVCMD_MMAP_SZ, p += PRIVCMD_MMAP_SZ) {
-+			int j, n = ((mmapcmd.num-i)>PRIVCMD_MMAP_SZ)?
-+				PRIVCMD_MMAP_SZ:(mmapcmd.num-i);
++		down_read(&mm->mmap_sem);
 +
-+			if (copy_from_user(&msg, p,
-+					   n*sizeof(privcmd_mmap_entry_t)))
-+				return -EFAULT;
-+     
-+			for (j = 0; j < n; j++) {
-+				struct vm_area_struct *vma = 
-+					find_vma( current->mm, msg[j].va );
-+
-+				if (!vma)
-+					return -EINVAL;
-+
-+				if (msg[j].va > PAGE_OFFSET)
-+					return -EINVAL;
-+
-+				if ((msg[j].va + (msg[j].npages << PAGE_SHIFT))
-+				    > vma->vm_end )
-+					return -EINVAL;
-+
-+				if ((rc = direct_remap_pfn_range(
-+					vma,
-+					msg[j].va&PAGE_MASK, 
-+					msg[j].mfn, 
-+					msg[j].npages<<PAGE_SHIFT, 
-+					vma->vm_page_prot,
-+					mmapcmd.dom)) < 0)
-+					return rc;
-+			}
++		vma = find_vma(mm, msg.va);
++		rc = -EINVAL;
++		if (!vma || (msg.va != vma->vm_start) ||
++		    !privcmd_enforce_singleshot_mapping(vma))
++			goto mmap_out;
++
++		va = vma->vm_start;
++
++		for (i = 0; i < mmapcmd.num; i++) {
++			rc = -EFAULT;
++			if (copy_from_user(&msg, p, sizeof(msg)))
++				goto mmap_out;
++
++			/* Do not allow range to wrap the address space. */
++			rc = -EINVAL;
++			if ((msg.npages > (LONG_MAX >> PAGE_SHIFT)) ||
++			    ((unsigned long)(msg.npages << PAGE_SHIFT) >= -va))
++				goto mmap_out;
++
++			/* Range chunks must be contiguous in va space. */
++			if ((msg.va != va) ||
++			    ((msg.va+(msg.npages<<PAGE_SHIFT)) > vma->vm_end))
++				goto mmap_out;
++
++			if ((rc = direct_remap_pfn_range(
++				vma,
++				msg.va & PAGE_MASK, 
++				msg.mfn, 
++				msg.npages << PAGE_SHIFT, 
++				vma->vm_page_prot,
++				mmapcmd.dom)) < 0)
++				goto mmap_out;
++
++			p++;
++			va += msg.npages << PAGE_SHIFT;
 +		}
-+		ret = 0;
++
++		rc = 0;
++
++	mmap_out:
++		up_read(&mm->mmap_sem);
++		ret = rc;
 +	}
 +	break;
 +
 +	case IOCTL_PRIVCMD_MMAPBATCH: {
 +		privcmd_mmapbatch_t m;
-+		struct vm_area_struct *vma = NULL;
++		struct mm_struct *mm = current->mm;
++		struct vm_area_struct *vma;
 +		xen_pfn_t __user *p;
 +		unsigned long addr, mfn;
 +		int i;
@@ -65758,37 +67400,31 @@
 +		if (!is_initial_xendomain())
 +			return -EPERM;
 +
-+		if (copy_from_user(&m, udata, sizeof(m))) {
-+			ret = -EFAULT;
-+			goto batch_err;
-+		}
-+
-+		if (m.dom == DOMID_SELF) {
-+			ret = -EINVAL;
-+			goto batch_err;
-+		}
++		if (copy_from_user(&m, udata, sizeof(m)))
++			return -EFAULT;
 +
-+		vma = find_vma(current->mm, m.addr);
-+		if (!vma) {
-+			ret = -EINVAL;
-+			goto batch_err;
-+		}
++		if ((m.num <= 0) || (m.num > (LONG_MAX >> PAGE_SHIFT)))
++			return -EINVAL;
 +
-+		if (m.addr > PAGE_OFFSET) {
-+			ret = -EFAULT;
-+			goto batch_err;
-+		}
++		down_read(&mm->mmap_sem);
 +
-+		if ((m.addr + (m.num<<PAGE_SHIFT)) > vma->vm_end) {
-+			ret = -EFAULT;
-+			goto batch_err;
++		vma = find_vma(mm, m.addr);
++		if (!vma ||
++		    (m.addr != vma->vm_start) ||
++		    ((m.addr + ((unsigned long)m.num<<PAGE_SHIFT)) !=
++		     vma->vm_end) ||
++		    !privcmd_enforce_singleshot_mapping(vma)) {
++			up_read(&mm->mmap_sem);
++			return -EINVAL;
 +		}
 +
 +		p = m.arr;
 +		addr = m.addr;
 +		for (i = 0; i < m.num; i++, addr += PAGE_SIZE, p++) {
-+			if (get_user(mfn, p))
++			if (get_user(mfn, p)) {
++				up_read(&mm->mmap_sem);
 +				return -EFAULT;
++			}
 +
 +			ret = direct_remap_pfn_range(vma, addr & PAGE_MASK,
 +						     mfn, PAGE_SIZE,
@@ -65797,15 +67433,8 @@
 +				put_user(0xF0000000 | mfn, p);
 +		}
 +
++		up_read(&mm->mmap_sem);
 +		ret = 0;
-+		break;
-+
-+	batch_err:
-+		printk("batch_err ret=%d vma=%p addr=%lx "
-+		       "num=%d arr=%p %lx-%lx\n", 
-+		       ret, vma, (unsigned long)m.addr, m.num, m.arr,
-+		       vma ? vma->vm_start : 0, vma ? vma->vm_end : 0);
-+		break;
 +	}
 +	break;
 +
@@ -65818,13 +67447,35 @@
 +}
 +
 +#ifndef HAVE_ARCH_PRIVCMD_MMAP
++static struct page *privcmd_nopage(struct vm_area_struct *vma,
++				   unsigned long address,
++				   int *type)
++{
++	return NOPAGE_SIGBUS;
++}
++
++static struct vm_operations_struct privcmd_vm_ops = {
++	.nopage = privcmd_nopage
++};
++
 +static int privcmd_mmap(struct file * file, struct vm_area_struct * vma)
 +{
++	/* Unsupported for auto-translate guests. */
++	if (xen_feature(XENFEAT_auto_translated_physmap))
++		return -ENOSYS;
++
 +	/* DONTCOPY is essential for Xen as copy_page_range is broken. */
 +	vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTCOPY | VM_PFNMAP;
++	vma->vm_ops = &privcmd_vm_ops;
++	vma->vm_private_data = NULL;
 +
 +	return 0;
 +}
++
++static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma)
++{
++	return (xchg(&vma->vm_private_data, (void *)1) == NULL);
++}
 +#endif
 +
 +static struct file_operations privcmd_file_ops = {
@@ -65862,10 +67513,10 @@
 +}
 +
 +__initcall(privcmd_init);
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/tpmback/common.h linux-2.6.18-xen/drivers/xen/tpmback/common.h
---- linux-2.6.18/drivers/xen/tpmback/common.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/tpmback/common.h	2006-09-04 16:31:13.000000000 +0200
-@@ -0,0 +1,84 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/tpmback/common.h linux-2.6.18-xen/drivers/xen/tpmback/common.h
+--- linux-2.6.18.1/drivers/xen/tpmback/common.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/tpmback/common.h	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,86 @@
 +/******************************************************************************
 + * drivers/xen/tpmback/common.h
 + */
@@ -65913,11 +67564,10 @@
 +	atomic_t refcnt;
 +
 +	struct backend_info *bi;
-+	unsigned long mmap_vstart;
 +
 +	grant_handle_t shmem_handle;
 +	grant_ref_t shmem_ref;
-+	struct page *pagerange;
++	struct page **mmap_pages;
 +
 +	char devname[20];
 +} tpmif_t;
@@ -65947,13 +67597,16 @@
 +
 +extern int num_frontends;
 +
-+#define MMAP_VADDR(t,_req) ((t)->mmap_vstart + ((_req) * PAGE_SIZE))
++static inline unsigned long idx_to_kaddr(tpmif_t *t, unsigned int idx)
++{
++	return (unsigned long)pfn_to_kaddr(page_to_pfn(t->mmap_pages[idx]));
++}
 +
 +#endif /* __TPMIF__BACKEND__COMMON_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/tpmback/interface.c linux-2.6.18-xen/drivers/xen/tpmback/interface.c
---- linux-2.6.18/drivers/xen/tpmback/interface.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/tpmback/interface.c	2006-09-04 16:31:13.000000000 +0200
-@@ -0,0 +1,177 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/tpmback/interface.c linux-2.6.18-xen/drivers/xen/tpmback/interface.c
+--- linux-2.6.18.1/drivers/xen/tpmback/interface.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/tpmback/interface.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,182 @@
 + /*****************************************************************************
 + * drivers/xen/tpmback/interface.c
 + *
@@ -65981,8 +67634,8 @@
 +	tpmif_t *tpmif;
 +
 +	tpmif = kmem_cache_alloc(tpmif_cachep, GFP_KERNEL);
-+	if (!tpmif)
-+		return ERR_PTR(-ENOMEM);
++	if (tpmif == NULL)
++		goto out_of_memory;
 +
 +	memset(tpmif, 0, sizeof (*tpmif));
 +	tpmif->domid = domid;
@@ -65991,22 +67644,27 @@
 +	snprintf(tpmif->devname, sizeof(tpmif->devname), "tpmif%d", domid);
 +	atomic_set(&tpmif->refcnt, 1);
 +
-+	tpmif->pagerange = balloon_alloc_empty_page_range(TPMIF_TX_RING_SIZE);
-+	BUG_ON(tpmif->pagerange == NULL);
-+	tpmif->mmap_vstart = (unsigned long)pfn_to_kaddr(
-+	                                    page_to_pfn(tpmif->pagerange));
++	tpmif->mmap_pages = alloc_empty_pages_and_pagevec(TPMIF_TX_RING_SIZE);
++	if (tpmif->mmap_pages == NULL)
++		goto out_of_memory;
 +
 +	list_add(&tpmif->tpmif_list, &tpmif_list);
 +	num_frontends++;
 +
 +	return tpmif;
++
++ out_of_memory:
++	if (tpmif != NULL)
++		kmem_cache_free(tpmif_cachep, tpmif);
++	printk("%s: out of memory\n", __FUNCTION__);
++	return ERR_PTR(-ENOMEM);
 +}
 +
 +static void free_tpmif(tpmif_t * tpmif)
 +{
 +	num_frontends--;
 +	list_del(&tpmif->tpmif_list);
-+	balloon_dealloc_empty_page_range(tpmif->pagerange, TPMIF_TX_RING_SIZE);
++	free_empty_pages_and_pagevec(tpmif->mmap_pages, TPMIF_TX_RING_SIZE);
 +	kmem_cache_free(tpmif_cachep, tpmif);
 +}
 +
@@ -66131,17 +67789,17 @@
 +{
 +	kmem_cache_destroy(tpmif_cachep);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/tpmback/Makefile linux-2.6.18-xen/drivers/xen/tpmback/Makefile
---- linux-2.6.18/drivers/xen/tpmback/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/tpmback/Makefile linux-2.6.18-xen/drivers/xen/tpmback/Makefile
+--- linux-2.6.18.1/drivers/xen/tpmback/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/tpmback/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,4 @@
 +
 +obj-$(CONFIG_XEN_TPMDEV_BACKEND)	+= tpmbk.o
 +
 +tpmbk-y += tpmback.o interface.o xenbus.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/tpmback/tpmback.c linux-2.6.18-xen/drivers/xen/tpmback/tpmback.c
---- linux-2.6.18/drivers/xen/tpmback/tpmback.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/tpmback/tpmback.c	2006-09-04 16:31:13.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/tpmback/tpmback.c linux-2.6.18-xen/drivers/xen/tpmback/tpmback.c
+--- linux-2.6.18.1/drivers/xen/tpmback/tpmback.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/tpmback/tpmback.c	2006-10-17 15:01:58.000000000 +0200
 @@ -0,0 +1,944 @@
 +/******************************************************************************
 + * drivers/xen/tpmback/tpmback.c
@@ -66398,7 +68056,7 @@
 +			return 0;
 +		}
 +
-+		gnttab_set_map_op(&map_op, MMAP_VADDR(tpmif, i),
++		gnttab_set_map_op(&map_op, idx_to_kaddr(tpmif, i),
 +				  GNTMAP_host_map, tx->ref, tpmif->domid);
 +
 +		if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
@@ -66415,7 +68073,7 @@
 +
 +		tocopy = min_t(size_t, size - offset, PAGE_SIZE);
 +
-+		if (copy_from_buffer((void *)(MMAP_VADDR(tpmif, i) |
++		if (copy_from_buffer((void *)(idx_to_kaddr(tpmif, i) |
 +					      (tx->addr & ~PAGE_MASK)),
 +				     &data[offset], tocopy, isuserbuffer)) {
 +			tpmif_put(tpmif);
@@ -66423,7 +68081,7 @@
 +		}
 +		tx->size = tocopy;
 +
-+		gnttab_set_unmap_op(&unmap_op, MMAP_VADDR(tpmif, i),
++		gnttab_set_unmap_op(&unmap_op, idx_to_kaddr(tpmif, i),
 +				    GNTMAP_host_map, handle);
 +
 +		if (unlikely
@@ -66536,7 +68194,7 @@
 +
 +		tx = &tpmif->tx->ring[i].req;
 +
-+		gnttab_set_map_op(&map_op, MMAP_VADDR(tpmif, i),
++		gnttab_set_map_op(&map_op, idx_to_kaddr(tpmif, i),
 +				  GNTMAP_host_map, tx->ref, tpmif->domid);
 +
 +		if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
@@ -66559,10 +68217,10 @@
 +		}
 +
 +		DPRINTK("Copying from mapped memory at %08lx\n",
-+			(unsigned long)(MMAP_VADDR(tpmif, i) |
++			(unsigned long)(idx_to_kaddr(tpmif, i) |
 +					(tx->addr & ~PAGE_MASK)));
 +
-+		src = (void *)(MMAP_VADDR(tpmif, i) |
++		src = (void *)(idx_to_kaddr(tpmif, i) |
 +			       ((tx->addr & ~PAGE_MASK) + pg_offset));
 +		if (copy_to_buffer(&buffer[offset],
 +				   src, to_copy, isuserbuffer)) {
@@ -66573,7 +68231,7 @@
 +			tpmif->domid, buffer[offset], buffer[offset + 1],
 +			buffer[offset + 2], buffer[offset + 3]);
 +
-+		gnttab_set_unmap_op(&unmap_op, MMAP_VADDR(tpmif, i),
++		gnttab_set_unmap_op(&unmap_op, idx_to_kaddr(tpmif, i),
 +				    GNTMAP_host_map, handle);
 +
 +		if (unlikely
@@ -67087,8 +68745,8 @@
 +}
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/tpmback/xenbus.c linux-2.6.18-xen/drivers/xen/tpmback/xenbus.c
---- linux-2.6.18/drivers/xen/tpmback/xenbus.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/tpmback/xenbus.c linux-2.6.18-xen/drivers/xen/tpmback/xenbus.c
+--- linux-2.6.18.1/drivers/xen/tpmback/xenbus.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/tpmback/xenbus.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,287 @@
 +/*  Xenbus code for tpmif backend
@@ -67378,8 +69036,8 @@
 +{
 +	xenbus_unregister_driver(&tpmback);
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/util.c linux-2.6.18-xen/drivers/xen/util.c
---- linux-2.6.18/drivers/xen/util.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/util.c linux-2.6.18-xen/drivers/xen/util.c
+--- linux-2.6.18.1/drivers/xen/util.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/util.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,70 @@
 +
@@ -67452,8 +69110,8 @@
 +	preempt_enable();
 +}
 +EXPORT_SYMBOL_GPL(unlock_vm_area);
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/xenbus/Makefile linux-2.6.18-xen/drivers/xen/xenbus/Makefile
---- linux-2.6.18/drivers/xen/xenbus/Makefile	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/xenbus/Makefile linux-2.6.18-xen/drivers/xen/xenbus/Makefile
+--- linux-2.6.18.1/drivers/xen/xenbus/Makefile	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/xenbus/Makefile	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,12 @@
 +obj-y	+= xenbus.o
@@ -67468,8 +69126,8 @@
 +xenbus-objs += xenbus_xs.o
 +xenbus-objs += xenbus_probe.o
 +obj-$(CONFIG_XEN_XENBUS_DEV) += xenbus_dev.o
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/xenbus/xenbus_backend_client.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_backend_client.c
---- linux-2.6.18/drivers/xen/xenbus/xenbus_backend_client.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/xenbus/xenbus_backend_client.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_backend_client.c
+--- linux-2.6.18.1/drivers/xen/xenbus/xenbus_backend_client.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/xenbus/xenbus_backend_client.c	2006-09-21 01:33:31.000000000 +0200
 @@ -0,0 +1,147 @@
 +/******************************************************************************
@@ -67619,8 +69277,8 @@
 +EXPORT_SYMBOL_GPL(xenbus_dev_is_online);
 +
 +MODULE_LICENSE("Dual BSD/GPL");
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/xenbus/xenbus_client.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_client.c
---- linux-2.6.18/drivers/xen/xenbus/xenbus_client.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/xenbus/xenbus_client.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_client.c
+--- linux-2.6.18.1/drivers/xen/xenbus/xenbus_client.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/xenbus/xenbus_client.c	2006-09-21 01:33:31.000000000 +0200
 @@ -0,0 +1,299 @@
 +/******************************************************************************
@@ -67922,8 +69580,8 @@
 +	return result;
 +}
 +EXPORT_SYMBOL_GPL(xenbus_read_driver_state);
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/xenbus/xenbus_comms.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_comms.c
---- linux-2.6.18/drivers/xen/xenbus/xenbus_comms.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/xenbus/xenbus_comms.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_comms.c
+--- linux-2.6.18.1/drivers/xen/xenbus/xenbus_comms.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/xenbus/xenbus_comms.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,203 @@
 +/******************************************************************************
@@ -68129,8 +69787,8 @@
 +
 +	return 0;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/xenbus/xenbus_comms.h linux-2.6.18-xen/drivers/xen/xenbus/xenbus_comms.h
---- linux-2.6.18/drivers/xen/xenbus/xenbus_comms.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/xenbus/xenbus_comms.h linux-2.6.18-xen/drivers/xen/xenbus/xenbus_comms.h
+--- linux-2.6.18.1/drivers/xen/xenbus/xenbus_comms.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/xenbus/xenbus_comms.h	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,45 @@
 +/*
@@ -68178,8 +69836,8 @@
 +extern int xen_store_evtchn;
 +
 +#endif /* _XENBUS_COMMS_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/xenbus/xenbus_dev.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_dev.c
---- linux-2.6.18/drivers/xen/xenbus/xenbus_dev.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/xenbus/xenbus_dev.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_dev.c
+--- linux-2.6.18.1/drivers/xen/xenbus/xenbus_dev.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/xenbus/xenbus_dev.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,356 @@
 +/*
@@ -68538,10 +70196,10 @@
 +
 +	return 0;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/xenbus/xenbus_probe.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_probe.c
---- linux-2.6.18/drivers/xen/xenbus/xenbus_probe.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/drivers/xen/xenbus/xenbus_probe.c	2006-09-21 01:33:31.000000000 +0200
-@@ -0,0 +1,1176 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/xenbus/xenbus_probe.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_probe.c
+--- linux-2.6.18.1/drivers/xen/xenbus/xenbus_probe.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/drivers/xen/xenbus/xenbus_probe.c	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,1190 @@
 +/******************************************************************************
 + * Talks to Xen Store to figure out what devices we have.
 + *
@@ -68867,6 +70525,20 @@
 +	DPRINTK("state is %d (%s), %s, %s", state, xenbus_strstate(state),
 +		dev->otherend_watch.node, vec[XS_WATCH_PATH]);
 +
++	/*
++	 * Ignore xenbus transitions during shutdown. This prevents us doing
++	 * work that can fail e.g., when the rootfs is gone.
++	 */
++	if (system_state > SYSTEM_RUNNING) {
++		struct xen_bus_type *bus = bus;
++		bus = container_of(dev->dev.bus, struct xen_bus_type, bus);
++		/* If we're frontend, drive the state machine to Closed. */
++		/* This should cause the backend to release our resources. */
++		if ((bus == &xenbus_frontend) && (state == XenbusStateClosing))
++			xenbus_frontend_closed(dev);
++		return;
++	}
++
 +	if (drv->otherend_changed)
 +		drv->otherend_changed(dev, state);
 +}
@@ -69718,8 +71390,8 @@
 +
 +late_initcall(boot_wait_for_devices);
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/drivers/xen/xenbus/xenbus_xs.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_xs.c
---- linux-2.6.18/drivers/xen/xenbus/xenbus_xs.c	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/drivers/xen/xenbus/xenbus_xs.c linux-2.6.18-xen/drivers/xen/xenbus/xenbus_xs.c
+--- linux-2.6.18.1/drivers/xen/xenbus/xenbus_xs.c	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/drivers/xen/xenbus/xenbus_xs.c	2006-09-04 16:31:13.000000000 +0200
 @@ -0,0 +1,853 @@
 +/******************************************************************************
@@ -70575,8 +72247,8 @@
 +
 +	return 0;
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/fs/Kconfig linux-2.6.18-xen/fs/Kconfig
---- linux-2.6.18/fs/Kconfig	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/fs/Kconfig linux-2.6.18-xen/fs/Kconfig
+--- linux-2.6.18.1/fs/Kconfig	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/fs/Kconfig	2006-09-04 16:31:13.000000000 +0200
 @@ -865,6 +865,7 @@
  config HUGETLBFS
@@ -70586,8 +72258,8 @@
  	help
  	  hugetlbfs is a filesystem backing for HugeTLB pages, based on
  	  ramfs. For architectures that support it, say Y here and read
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-generic/vmlinux.lds.h linux-2.6.18-xen/include/asm-generic/vmlinux.lds.h
---- linux-2.6.18/include/asm-generic/vmlinux.lds.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-generic/vmlinux.lds.h linux-2.6.18-xen/include/asm-generic/vmlinux.lds.h
+--- linux-2.6.18.1/include/asm-generic/vmlinux.lds.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-generic/vmlinux.lds.h	2006-09-21 01:33:31.000000000 +0200
 @@ -194,3 +194,6 @@
  		.stab.index 0 : { *(.stab.index) }			\
@@ -70596,8 +72268,8 @@
 +
 +#define NOTES								\
 +		.notes : { *(.note.*) } :note
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/apic.h linux-2.6.18-xen/include/asm-i386/apic.h
---- linux-2.6.18/include/asm-i386/apic.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/apic.h linux-2.6.18-xen/include/asm-i386/apic.h
+--- linux-2.6.18.1/include/asm-i386/apic.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-i386/apic.h	2006-09-04 16:31:16.000000000 +0200
 @@ -119,10 +119,12 @@
  
@@ -70612,8 +72284,8 @@
  
  extern int timer_over_8254;
  
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/fixmap.h linux-2.6.18-xen/include/asm-i386/fixmap.h
---- linux-2.6.18/include/asm-i386/fixmap.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/fixmap.h linux-2.6.18-xen/include/asm-i386/fixmap.h
+--- linux-2.6.18.1/include/asm-i386/fixmap.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-i386/fixmap.h	2006-09-21 01:33:32.000000000 +0200
 @@ -19,6 +19,7 @@
   * Leave one empty page between vmalloc'ed areas and
@@ -70623,8 +72295,8 @@
  #define __FIXADDR_TOP	0xfffff000
  
  #ifndef __ASSEMBLY__
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-default/mach_traps.h linux-2.6.18-xen/include/asm-i386/mach-default/mach_traps.h
---- linux-2.6.18/include/asm-i386/mach-default/mach_traps.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-default/mach_traps.h linux-2.6.18-xen/include/asm-i386/mach-default/mach_traps.h
+--- linux-2.6.18.1/include/asm-i386/mach-default/mach_traps.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-i386/mach-default/mach_traps.h	2006-09-04 16:31:16.000000000 +0200
 @@ -15,6 +15,18 @@
  	outb(reason, 0x61);
@@ -70645,8 +72317,8 @@
  static inline unsigned char get_nmi_reason(void)
  {
  	return inb(0x61);
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/agp.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/agp.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/agp.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/agp.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/agp.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/agp.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/agp.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,37 @@
 +#ifndef AGP_H
@@ -70686,8 +72358,8 @@
 +	dma_free_coherent(NULL,PAGE_SIZE<<(order),(table),virt_to_bus(table))
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/desc.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/desc.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/desc.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/desc.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/desc.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/desc.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/desc.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,164 @@
 +#ifndef __ARCH_DESC_H
@@ -70854,8 +72526,8 @@
 +#endif /* !__ASSEMBLY__ */
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/dma-mapping.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/dma-mapping.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/dma-mapping.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/dma-mapping.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/dma-mapping.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/dma-mapping.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/dma-mapping.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,151 @@
 +#ifndef _ASM_I386_DMA_MAPPING_H
@@ -71009,8 +72681,8 @@
 +				  dma_addr_t device_addr, size_t size);
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/fixmap.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/fixmap.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/fixmap.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/fixmap.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/fixmap.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/fixmap.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/fixmap.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,156 @@
 +/*
@@ -71169,8 +72841,8 @@
 +
 +#endif /* !__ASSEMBLY__ */
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/floppy.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/floppy.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/floppy.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/floppy.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/floppy.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/floppy.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/floppy.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,147 @@
 +/*
@@ -71320,8 +72992,8 @@
 +#define EXTRA_FLOPPY_PARAMS
 +
 +#endif /* __ASM_XEN_I386_FLOPPY_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/highmem.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/highmem.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/highmem.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/highmem.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/highmem.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/highmem.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/highmem.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,80 @@
 +/*
@@ -71404,8 +73076,8 @@
 +#endif /* __KERNEL__ */
 +
 +#endif /* _ASM_HIGHMEM_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/hw_irq.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/hw_irq.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/hw_irq.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/hw_irq.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/hw_irq.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/hw_irq.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/hw_irq.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,72 @@
 +#ifndef _ASM_HW_IRQ_H
@@ -71480,8 +73152,8 @@
 +#define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
 +
 +#endif /* _ASM_HW_IRQ_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/hypercall.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/hypercall.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/hypercall.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/hypercall.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/hypercall.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/hypercall.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/hypercall.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,389 @@
 +/******************************************************************************
@@ -71873,8 +73545,8 @@
 +
 +
 +#endif /* __HYPERCALL_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/hypervisor.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/hypervisor.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/hypervisor.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/hypervisor.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/hypervisor.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/hypervisor.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/hypervisor.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,234 @@
 +/******************************************************************************
@@ -72111,8 +73783,8 @@
 +}
 +
 +#endif /* __HYPERVISOR_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/io.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/io.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/io.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/io.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/io.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/io.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/io.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,389 @@
 +#ifndef _ASM_IO_H
@@ -72504,8 +74176,8 @@
 +#define ARCH_HAS_DEV_MEM
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/irqflags.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/irqflags.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/irqflags.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/irqflags.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/irqflags.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/irqflags.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/irqflags.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,80 @@
 +/*
@@ -72588,8 +74260,8 @@
 +#endif
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/kmap_types.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/kmap_types.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/kmap_types.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/kmap_types.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/kmap_types.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,31 @@
 +#ifndef _ASM_KMAP_TYPES_H
@@ -72623,8 +74295,8 @@
 +#undef D
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/maddr.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/maddr.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/maddr.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/maddr.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/maddr.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/maddr.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/maddr.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,160 @@
 +#ifndef _I386_MADDR_H
@@ -72787,8 +74459,8 @@
 +#define __pte_ma(x)	((pte_t) { (x) } )
 +
 +#endif /* _I386_MADDR_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/mmu_context.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/mmu_context.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/mmu_context.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/mmu_context.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/mmu_context.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/mmu_context.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/mmu_context.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,108 @@
 +#ifndef __I386_SCHED_H
@@ -72899,8 +74571,8 @@
 +}
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/mmu.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/mmu.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/mmu.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/mmu.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/mmu.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/mmu.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/mmu.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,29 @@
 +#ifndef __i386_MMU_H
@@ -72932,8 +74604,8 @@
 +#define arch_dup_mmap(mm, oldmm) ((void)(oldmm), _arch_dup_mmap(mm))
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/page.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/page.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/page.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/page.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/page.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/page.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/page.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,220 @@
 +#ifndef _I386_PAGE_H
@@ -73156,8 +74828,8 @@
 +#endif /* __KERNEL__ */
 +
 +#endif /* _I386_PAGE_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/param.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/param.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/param.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/param.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/param.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/param.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/param.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,23 @@
 +#ifndef _ASMi386_PARAM_H
@@ -73183,8 +74855,8 @@
 +#define COMMAND_LINE_SIZE 256
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/pci.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pci.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/pci.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/pci.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pci.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/pci.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pci.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,153 @@
 +#ifndef __i386_PCI_H
@@ -73340,8 +75012,8 @@
 +#define pcibios_scan_all_fns(a, b)	1
 +
 +#endif /* __i386_PCI_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/pgalloc.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgalloc.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/pgalloc.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgalloc.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgalloc.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgalloc.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgalloc.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,63 @@
 +#ifndef _I386_PGALLOC_H
@@ -73407,8 +75079,8 @@
 +#define check_pgt_cache()	do { } while (0)
 +
 +#endif /* _I386_PGALLOC_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/pgtable-2level-defs.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-2level-defs.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/pgtable-2level-defs.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgtable-2level-defs.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-2level-defs.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgtable-2level-defs.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-2level-defs.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,21 @@
 +#ifndef _I386_PGTABLE_2LEVEL_DEFS_H
@@ -73432,8 +75104,8 @@
 +#define PTRS_PER_PTE	1024
 +
 +#endif /* _I386_PGTABLE_2LEVEL_DEFS_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/pgtable-2level.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-2level.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/pgtable-2level.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgtable-2level.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-2level.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgtable-2level.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-2level.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,87 @@
 +#ifndef _I386_PGTABLE_2LEVEL_H
@@ -73523,8 +75195,8 @@
 +void vmalloc_sync_all(void);
 +
 +#endif /* _I386_PGTABLE_2LEVEL_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/pgtable-3level-defs.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-3level-defs.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/pgtable-3level-defs.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgtable-3level-defs.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-3level-defs.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgtable-3level-defs.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-3level-defs.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,25 @@
 +#ifndef _I386_PGTABLE_3LEVEL_DEFS_H
@@ -73552,8 +75224,8 @@
 +#define PTRS_PER_PTE	512
 +
 +#endif /* _I386_PGTABLE_3LEVEL_DEFS_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/pgtable-3level.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-3level.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/pgtable-3level.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgtable-3level.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-3level.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgtable-3level.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable-3level.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,185 @@
 +#ifndef _I386_PGTABLE_3LEVEL_H
@@ -73741,8 +75413,8 @@
 +#define vmalloc_sync_all() ((void)0)
 +
 +#endif /* _I386_PGTABLE_3LEVEL_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/pgtable.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/pgtable.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgtable.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/pgtable.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/pgtable.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,508 @@
 +#ifndef _I386_PGTABLE_H
@@ -74253,8 +75925,8 @@
 +#include <asm-generic/pgtable.h>
 +
 +#endif /* _I386_PGTABLE_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/processor.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/processor.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/processor.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/processor.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/processor.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/processor.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/processor.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,741 @@
 +/*
@@ -74998,8 +76670,8 @@
 +extern int sysenter_setup(void);
 +
 +#endif /* __ASM_I386_PROCESSOR_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/ptrace.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/ptrace.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/ptrace.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/ptrace.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/ptrace.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/ptrace.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/ptrace.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,90 @@
 +#ifndef _I386_PTRACE_H
@@ -75092,8 +76764,8 @@
 +#endif /* __KERNEL__ */
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/scatterlist.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/scatterlist.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/scatterlist.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/scatterlist.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/scatterlist.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/scatterlist.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/scatterlist.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,22 @@
 +#ifndef _I386_SCATTERLIST_H
@@ -75118,8 +76790,8 @@
 +#define ISA_DMA_THRESHOLD (0x00ffffff)
 +
 +#endif /* !(_I386_SCATTERLIST_H) */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/segment.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/segment.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/segment.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/segment.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/segment.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/segment.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/segment.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,117 @@
 +#ifndef _ASM_SEGMENT_H
@@ -75239,8 +76911,8 @@
 +#define IDT_ENTRIES 256
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/setup.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/setup.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/setup.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/setup.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/setup.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/setup.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/setup.h	2006-09-21 01:33:32.000000000 +0200
 @@ -0,0 +1,81 @@
 +/*
@@ -75324,8 +76996,8 @@
 +#endif /* __ASSEMBLY__ */
 +
 +#endif /* _i386_SETUP_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/smp.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/smp.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/smp.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/smp.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/smp.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/smp.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/smp.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,103 @@
 +#ifndef __ASM_SMP_H
@@ -75431,8 +77103,8 @@
 +
 +#endif
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/spinlock.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/spinlock.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/spinlock.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/spinlock.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/spinlock.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/spinlock.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/spinlock.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,202 @@
 +#ifndef __ASM_SPINLOCK_H
@@ -75637,8 +77309,8 @@
 +}
 +
 +#endif /* __ASM_SPINLOCK_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/swiotlb.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/swiotlb.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/swiotlb.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/swiotlb.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/swiotlb.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/swiotlb.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/swiotlb.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,41 @@
 +#ifndef _ASM_SWIOTLB_H
@@ -75682,8 +77354,8 @@
 +#endif
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/synch_bitops.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/synch_bitops.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/synch_bitops.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/synch_bitops.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/synch_bitops.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/synch_bitops.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/synch_bitops.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,141 @@
 +#ifndef __XEN_SYNCH_BITOPS_H__
@@ -75827,8 +77499,8 @@
 +#define synch_cmpxchg_subword synch_cmpxchg
 +
 +#endif /* __XEN_SYNCH_BITOPS_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/system.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/system.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/system.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/system.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/system.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/system.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/system.h	2006-09-21 01:33:32.000000000 +0200
 @@ -0,0 +1,491 @@
 +#ifndef __ASM_SYSTEM_H
@@ -76322,8 +77994,8 @@
 +void default_idle(void);
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/timer.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/timer.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/timer.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/timer.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/timer.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/timer.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/timer.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,70 @@
 +#ifndef _ASMi386_TIMER_H
@@ -76396,8 +78068,8 @@
 +extern struct init_timer_opts timer_pmtmr_init;
 +#endif
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/tlbflush.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/tlbflush.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/tlbflush.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/tlbflush.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/tlbflush.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/tlbflush.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/tlbflush.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,101 @@
 +#ifndef _I386_TLBFLUSH_H
@@ -76501,8 +78173,8 @@
 +}
 +
 +#endif /* _I386_TLBFLUSH_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/asm/vga.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/vga.h
---- linux-2.6.18/include/asm-i386/mach-xen/asm/vga.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/asm/vga.h linux-2.6.18-xen/include/asm-i386/mach-xen/asm/vga.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/asm/vga.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/asm/vga.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,20 @@
 +/*
@@ -76525,8 +78197,8 @@
 +#define vga_writeb(x,y) (*(y) = (x))
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/irq_vectors.h linux-2.6.18-xen/include/asm-i386/mach-xen/irq_vectors.h
---- linux-2.6.18/include/asm-i386/mach-xen/irq_vectors.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/irq_vectors.h linux-2.6.18-xen/include/asm-i386/mach-xen/irq_vectors.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/irq_vectors.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/irq_vectors.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,125 @@
 +/*
@@ -76654,8 +78326,8 @@
 +#define irq_to_dynirq(_x)	((_x) - DYNIRQ_BASE)
 +
 +#endif /* _ASM_IRQ_VECTORS_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/mach_traps.h linux-2.6.18-xen/include/asm-i386/mach-xen/mach_traps.h
---- linux-2.6.18/include/asm-i386/mach-xen/mach_traps.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/mach_traps.h linux-2.6.18-xen/include/asm-i386/mach-xen/mach_traps.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/mach_traps.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/mach_traps.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,33 @@
 +/*
@@ -76691,8 +78363,8 @@
 +static inline void reassert_nmi(void) {}
 +
 +#endif /* !_MACH_TRAPS_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/mach-xen/setup_arch.h linux-2.6.18-xen/include/asm-i386/mach-xen/setup_arch.h
---- linux-2.6.18/include/asm-i386/mach-xen/setup_arch.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/mach-xen/setup_arch.h linux-2.6.18-xen/include/asm-i386/mach-xen/setup_arch.h
+--- linux-2.6.18.1/include/asm-i386/mach-xen/setup_arch.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-i386/mach-xen/setup_arch.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,5 @@
 +/* Hook to call BIOS initialisation function */
@@ -76700,8 +78372,8 @@
 +#define ARCH_SETUP machine_specific_arch_setup();
 +
 +void __init machine_specific_arch_setup(void);
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/pgtable-2level-defs.h linux-2.6.18-xen/include/asm-i386/pgtable-2level-defs.h
---- linux-2.6.18/include/asm-i386/pgtable-2level-defs.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/pgtable-2level-defs.h linux-2.6.18-xen/include/asm-i386/pgtable-2level-defs.h
+--- linux-2.6.18.1/include/asm-i386/pgtable-2level-defs.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-i386/pgtable-2level-defs.h	2006-09-04 16:31:16.000000000 +0200
 @@ -1,6 +1,8 @@
  #ifndef _I386_PGTABLE_2LEVEL_DEFS_H
@@ -76712,8 +78384,8 @@
  /*
   * traditional i386 two-level paging structure:
   */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-i386/pgtable-3level-defs.h linux-2.6.18-xen/include/asm-i386/pgtable-3level-defs.h
---- linux-2.6.18/include/asm-i386/pgtable-3level-defs.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-i386/pgtable-3level-defs.h linux-2.6.18-xen/include/asm-i386/pgtable-3level-defs.h
+--- linux-2.6.18.1/include/asm-i386/pgtable-3level-defs.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-i386/pgtable-3level-defs.h	2006-09-04 16:31:16.000000000 +0200
 @@ -1,6 +1,8 @@
  #ifndef _I386_PGTABLE_3LEVEL_DEFS_H
@@ -76724,8 +78396,8 @@
  /*
   * PGDIR_SHIFT determines what a top-level page table entry can map
   */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/agp.h linux-2.6.18-xen/include/asm-ia64/agp.h
---- linux-2.6.18/include/asm-ia64/agp.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/agp.h linux-2.6.18-xen/include/asm-ia64/agp.h
+--- linux-2.6.18.1/include/asm-ia64/agp.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/agp.h	2006-09-04 16:31:16.000000000 +0200
 @@ -19,13 +19,49 @@
  #define flush_agp_cache()		mb()
@@ -76781,8 +78453,8 @@
 +#endif	/* CONFIG_XEN */
  
  #endif /* _ASM_IA64_AGP_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/dma-mapping.h linux-2.6.18-xen/include/asm-ia64/dma-mapping.h
---- linux-2.6.18/include/asm-ia64/dma-mapping.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/dma-mapping.h linux-2.6.18-xen/include/asm-ia64/dma-mapping.h
+--- linux-2.6.18.1/include/asm-ia64/dma-mapping.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/dma-mapping.h	2006-09-21 01:33:32.000000000 +0200
 @@ -7,19 +7,68 @@
   */
@@ -76905,14 +78577,14 @@
 +}
 +
  #endif /* _ASM_IA64_DMA_MAPPING_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/fixmap.h linux-2.6.18-xen/include/asm-ia64/fixmap.h
---- linux-2.6.18/include/asm-ia64/fixmap.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/fixmap.h linux-2.6.18-xen/include/asm-ia64/fixmap.h
+--- linux-2.6.18.1/include/asm-ia64/fixmap.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-ia64/fixmap.h	2006-09-04 16:31:16.000000000 +0200
 @@ -0,0 +1,2 @@
 +#define clear_fixmap(x)	do {} while (0)
 +#define	set_fixmap(x,y)	do {} while (0)
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/gcc_intrin.h linux-2.6.18-xen/include/asm-ia64/gcc_intrin.h
---- linux-2.6.18/include/asm-ia64/gcc_intrin.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/gcc_intrin.h linux-2.6.18-xen/include/asm-ia64/gcc_intrin.h
+--- linux-2.6.18.1/include/asm-ia64/gcc_intrin.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/gcc_intrin.h	2006-09-04 16:31:16.000000000 +0200
 @@ -26,7 +26,7 @@
  
@@ -77103,8 +78775,8 @@
 +#define __ia64_get_psr_i()	(__ia64_getreg(_IA64_REG_PSR) & 0x4000UL)
 +
  #endif /* _ASM_IA64_GCC_INTRIN_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/hw_irq.h linux-2.6.18-xen/include/asm-ia64/hw_irq.h
---- linux-2.6.18/include/asm-ia64/hw_irq.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/hw_irq.h linux-2.6.18-xen/include/asm-ia64/hw_irq.h
+--- linux-2.6.18.1/include/asm-ia64/hw_irq.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/hw_irq.h	2006-09-04 16:31:16.000000000 +0200
 @@ -15,7 +15,11 @@
  #include <asm/ptrace.h>
@@ -77131,9 +78803,9 @@
  	platform_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0);
  }
  
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/hypercall.h linux-2.6.18-xen/include/asm-ia64/hypercall.h
---- linux-2.6.18/include/asm-ia64/hypercall.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/include/asm-ia64/hypercall.h	2006-09-21 01:33:32.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/hypercall.h linux-2.6.18-xen/include/asm-ia64/hypercall.h
+--- linux-2.6.18.1/include/asm-ia64/hypercall.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/include/asm-ia64/hypercall.h	2006-10-17 15:01:58.000000000 +0200
 @@ -0,0 +1,423 @@
 +/******************************************************************************
 + * hypercall.h
@@ -77170,12 +78842,13 @@
 +#ifndef __HYPERCALL_H__
 +#define __HYPERCALL_H__
 +
-+#include <linux/string.h> /* memcpy() */
-+
 +#ifndef __HYPERVISOR_H__
 +# error "please don't include this file directly"
 +#endif
 +
++#include <asm/xen/xcom_hcall.h>
++struct xencomm_handle;
++
 +/*
 + * Assembler stubs for hyper-calls.
 + */
@@ -77294,157 +78967,117 @@
 +	(type)__res;                                            \
 +})
 +
-+static inline int
-+HYPERVISOR_sched_op_compat(
-+    int cmd, unsigned long arg)
-+{
-+	return _hypercall2(int, sched_op_compat, cmd, arg);
-+}
 +
 +static inline int
-+HYPERVISOR_sched_op(
-+	int cmd, void *arg)
++xencomm_arch_hypercall_sched_op(int cmd, struct xencomm_handle *arg)
 +{
 +	return _hypercall2(int, sched_op, cmd, arg);
 +}
 +
 +static inline long
-+HYPERVISOR_set_timer_op(
-+    u64 timeout)
++HYPERVISOR_set_timer_op(u64 timeout)
 +{
-+    unsigned long timeout_hi = (unsigned long)(timeout>>32);
-+    unsigned long timeout_lo = (unsigned long)timeout;
-+    return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi);
++	unsigned long timeout_hi = (unsigned long)(timeout >> 32);
++	unsigned long timeout_lo = (unsigned long)timeout;
++	return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi);
 +}
 +
 +static inline int
-+HYPERVISOR_dom0_op(
-+    dom0_op_t *dom0_op)
++xencomm_arch_hypercall_dom0_op(struct xencomm_handle *op)
 +{
-+    dom0_op->interface_version = DOM0_INTERFACE_VERSION;
-+    return _hypercall1(int, dom0_op, dom0_op);
++	return _hypercall1(int, dom0_op, op);
 +}
 +
 +static inline int
-+HYPERVISOR_multicall(
-+    void *call_list, int nr_calls)
++xencomm_arch_hypercall_sysctl(struct xencomm_handle *op)
 +{
-+    return _hypercall2(int, multicall, call_list, nr_calls);
++	return _hypercall1(int, sysctl, op);
 +}
 +
-+//XXX xen/ia64 copy_from_guest() is broken.
-+//    This is a temporal work around until it is fixed.
 +static inline int
-+____HYPERVISOR_memory_op(
-+    unsigned int cmd, void *arg)
++xencomm_arch_hypercall_domctl(struct xencomm_handle *op)
 +{
-+    return _hypercall2(int, memory_op, cmd, arg);
++	return _hypercall1(int, domctl, op);
 +}
 +
-+#include <xen/interface/memory.h>
-+#ifdef CONFIG_VMX_GUEST
-+# define ia64_xenmem_reservation_op(op, xmr) (0)
-+#else
-+int ia64_xenmem_reservation_op(unsigned long op,
-+		   struct xen_memory_reservation* reservation__);
-+#endif
 +static inline int
-+HYPERVISOR_memory_op(
-+    unsigned int cmd, void *arg)
++xencomm_arch_hypercall_multicall(struct xencomm_handle *call_list,
++				 int nr_calls)
 +{
-+    switch (cmd) {
-+    case XENMEM_increase_reservation:
-+    case XENMEM_decrease_reservation:
-+    case XENMEM_populate_physmap:
-+        return ia64_xenmem_reservation_op(cmd, 
-+                                          (struct xen_memory_reservation*)arg);
-+    default:
-+        return ____HYPERVISOR_memory_op(cmd, arg);
-+    }
-+    /* NOTREACHED */
++	return _hypercall2(int, multicall, call_list, nr_calls);
 +}
 +
 +static inline int
-+HYPERVISOR_event_channel_op(
-+    int cmd, void *arg)
++xencomm_arch_hypercall_memory_op(unsigned int cmd, struct xencomm_handle *arg)
 +{
-+    int rc = _hypercall2(int, event_channel_op, cmd, arg);
-+    if (unlikely(rc == -ENOSYS)) {
-+        struct evtchn_op op;
-+        op.cmd = cmd;
-+        memcpy(&op.u, arg, sizeof(op.u));
-+        rc = _hypercall1(int, event_channel_op_compat, &op);
-+    }
-+    return rc;
++	return _hypercall2(int, memory_op, cmd, arg);
 +}
 +
 +static inline int
-+HYPERVISOR_acm_op(
-+	unsigned int cmd, void *arg)
++xencomm_arch_hypercall_event_channel_op(int cmd, struct xencomm_handle *arg)
 +{
-+    return _hypercall2(int, acm_op, cmd, arg);
++	return _hypercall2(int, event_channel_op, cmd, arg);
 +}
 +
 +static inline int
-+HYPERVISOR_xen_version(
-+    int cmd, void *arg)
++xencomm_arch_hypercall_acm_op(unsigned int cmd, struct xencomm_handle *arg)
 +{
-+    return _hypercall2(int, xen_version, cmd, arg);
++	return _hypercall2(int, acm_op, cmd, arg);
 +}
 +
 +static inline int
-+HYPERVISOR_console_io(
-+    int cmd, int count, char *str)
++xencomm_arch_hypercall_xen_version(int cmd, struct xencomm_handle *arg)
 +{
-+    return _hypercall3(int, console_io, cmd, count, str);
++	return _hypercall2(int, xen_version, cmd, arg);
 +}
 +
 +static inline int
-+HYPERVISOR_physdev_op(
-+    int cmd, void *arg)
++xencomm_arch_hypercall_console_io(int cmd, int count,
++                                  struct xencomm_handle *str)
 +{
-+    int rc = _hypercall2(int, physdev_op, cmd, arg);
-+    if (unlikely(rc == -ENOSYS)) {
-+        struct physdev_op op;
-+        op.cmd = cmd;
-+        memcpy(&op.u, arg, sizeof(op.u));
-+        rc = _hypercall1(int, physdev_op_compat, &op);
-+    }
-+    return rc;
++	return _hypercall3(int, console_io, cmd, count, str);
++}
++
++static inline int
++xencomm_arch_hypercall_physdev_op(int cmd, struct xencomm_handle *arg)
++{
++	return _hypercall2(int, physdev_op, cmd, arg);
 +}
 +
-+//XXX __HYPERVISOR_grant_table_op is used for this hypercall constant.
 +static inline int
-+____HYPERVISOR_grant_table_op(
-+    unsigned int cmd, void *uop, unsigned int count,
-+    unsigned long pa1, unsigned long pa2)
++xencomm_arch_hypercall_grant_table_op(unsigned int cmd,
++                                      struct xencomm_handle *uop,
++                                      unsigned int count)
 +{
-+    return _hypercall5(int, grant_table_op, cmd, uop, count, pa1, pa2);
++	return _hypercall3(int, grant_table_op, cmd, uop, count);
 +}
 +
 +int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count);
 +
++extern int xencomm_arch_hypercall_suspend(struct xencomm_handle *arg);
++
 +static inline int
-+HYPERVISOR_vcpu_op(
-+	int cmd, int vcpuid, void *extra_args)
++xencomm_arch_hypercall_callback_op(int cmd, struct xencomm_handle *arg)
 +{
-+    return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args);
++	return _hypercall2(int, callback_op, cmd, arg);
 +}
 +
-+extern int HYPERVISOR_suspend(unsigned long srec);
-+
 +static inline unsigned long
-+HYPERVISOR_hvm_op(
-+	int cmd, void *arg)
++xencomm_arch_hypercall_hvm_op(int cmd, void *arg)
 +{
 +	return _hypercall2(unsigned long, hvm_op, cmd, arg);
 +}
 +
 +static inline int
-+HYPERVISOR_callback_op(
-+	int cmd, void *arg)
++HYPERVISOR_physdev_op(int cmd, void *arg)
 +{
-+	return _hypercall2(int, callback_op, cmd, arg);
++	switch (cmd) {
++	case PHYSDEVOP_eoi:
++		return _hypercall1(int, ia64_fast_eoi,
++		                   ((struct physdev_eoi *)arg)->irq);
++	default:
++		return xencomm_hypercall_physdev_op(cmd, arg);
++	}
 +}
 +
 +extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs);
@@ -77554,14 +79187,53 @@
 +	return ret;
 +}
 +
++#ifdef CONFIG_XEN_IA64_EXPOSE_P2M
++static inline unsigned long
++HYPERVISOR_expose_p2m(unsigned long conv_start_gpfn,
++                      unsigned long assign_start_gpfn,
++                      unsigned long expose_size, unsigned long granule_pfn)
++{
++	return _hypercall5(unsigned long, ia64_dom0vp_op,
++	                   IA64_DOM0VP_expose_p2m, conv_start_gpfn,
++	                   assign_start_gpfn, expose_size, granule_pfn);
++}
++#endif
++
 +// for balloon driver
 +#define HYPERVISOR_update_va_mapping(va, new_val, flags) (0)
 +
++/* Use xencomm to do hypercalls.  */
++#ifdef MODULE
++#define HYPERVISOR_sched_op xencomm_mini_hypercall_sched_op
++#define HYPERVISOR_event_channel_op xencomm_mini_hypercall_event_channel_op
++#define HYPERVISOR_callback_op xencomm_mini_hypercall_callback_op
++#define HYPERVISOR_multicall xencomm_mini_hypercall_multicall
++#define HYPERVISOR_xen_version xencomm_mini_hypercall_xen_version
++#define HYPERVISOR_console_io xencomm_mini_hypercall_console_io
++#define HYPERVISOR_hvm_op xencomm_mini_hypercall_hvm_op
++#ifdef CONFIG_VMX_GUEST
++#define HYPERVISOR_memory_op 0
++#else
++#define HYPERVISOR_memory_op xencomm_mini_hypercall_memory_op
++#endif
++#else
++#define HYPERVISOR_sched_op xencomm_hypercall_sched_op
++#define HYPERVISOR_event_channel_op xencomm_hypercall_event_channel_op
++#define HYPERVISOR_callback_op xencomm_hypercall_callback_op
++#define HYPERVISOR_multicall xencomm_hypercall_multicall
++#define HYPERVISOR_xen_version xencomm_hypercall_xen_version
++#define HYPERVISOR_console_io xencomm_hypercall_console_io
++#define HYPERVISOR_hvm_op xencomm_hypercall_hvm_op
++#define HYPERVISOR_memory_op xencomm_hypercall_memory_op
++#endif
++
++#define HYPERVISOR_suspend xencomm_hypercall_suspend
++
 +#endif /* __HYPERCALL_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/hypervisor.h linux-2.6.18-xen/include/asm-ia64/hypervisor.h
---- linux-2.6.18/include/asm-ia64/hypervisor.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/include/asm-ia64/hypervisor.h	2006-09-21 01:33:32.000000000 +0200
-@@ -0,0 +1,218 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/hypervisor.h linux-2.6.18-xen/include/asm-ia64/hypervisor.h
+--- linux-2.6.18.1/include/asm-ia64/hypervisor.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/include/asm-ia64/hypervisor.h	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,208 @@
 +/******************************************************************************
 + * hypervisor.h
 + * 
@@ -77638,9 +79310,6 @@
 +{
 +	int rc = HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
 +
-+	if (rc == -ENOSYS)
-+		rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
-+
 +	return rc;
 +}
 +
@@ -77650,9 +79319,6 @@
 +{
 +	int rc = HYPERVISOR_sched_op(SCHEDOP_block, NULL);
 +
-+	if (rc == -ENOSYS)
-+		rc = HYPERVISOR_sched_op_compat(SCHEDOP_block, 0);
-+
 +	return rc;
 +}
 +
@@ -77666,9 +79332,6 @@
 +
 +	int rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
 +
-+	if (rc == -ENOSYS)
-+		rc = HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason);
-+
 +	return rc;
 +}
 +
@@ -77685,8 +79348,6 @@
 +
 +	set_xen_guest_handle(sched_poll.ports, ports);
 +	rc = HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll);
-+	if (rc == -ENOSYS)
-+		rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
 +
 +	return rc;
 +}
@@ -77703,6 +79364,7 @@
 +			   pgprot_t prot,
 +			   domid_t  domid);
 +struct file;
++int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma);
 +int privcmd_mmap(struct file * file, struct vm_area_struct * vma);
 +#define HAVE_ARCH_PRIVCMD_MMAP
 +
@@ -77780,8 +79442,8 @@
 +#endif
 +
 +#endif /* __HYPERVISOR_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/intel_intrin.h linux-2.6.18-xen/include/asm-ia64/intel_intrin.h
---- linux-2.6.18/include/asm-ia64/intel_intrin.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/intel_intrin.h linux-2.6.18-xen/include/asm-ia64/intel_intrin.h
+--- linux-2.6.18.1/include/asm-ia64/intel_intrin.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/intel_intrin.h	2006-09-04 16:31:16.000000000 +0200
 @@ -16,8 +16,10 @@
  		 	 * intrinsic
@@ -77906,8 +79568,8 @@
  #define __builtin_trap()	__break(0);
  
  #endif /* _ASM_IA64_INTEL_INTRIN_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/io.h linux-2.6.18-xen/include/asm-ia64/io.h
---- linux-2.6.18/include/asm-ia64/io.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/io.h linux-2.6.18-xen/include/asm-ia64/io.h
+--- linux-2.6.18.1/include/asm-ia64/io.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/io.h	2006-09-04 16:31:16.000000000 +0200
 @@ -66,9 +66,11 @@
  #define PIO_RESERVED		__IA64_UNCACHED_OFFSET
@@ -77963,8 +79625,8 @@
  
  # endif /* KERNEL */
  
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/iosapic.h linux-2.6.18-xen/include/asm-ia64/iosapic.h
---- linux-2.6.18/include/asm-ia64/iosapic.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/iosapic.h linux-2.6.18-xen/include/asm-ia64/iosapic.h
+--- linux-2.6.18.1/include/asm-ia64/iosapic.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/iosapic.h	2006-09-04 16:31:16.000000000 +0200
 @@ -53,6 +53,7 @@
  
@@ -77982,8 +79644,8 @@
  
  static inline void iosapic_eoi(char __iomem *iosapic, u32 vector)
  {
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/irq.h linux-2.6.18-xen/include/asm-ia64/irq.h
---- linux-2.6.18/include/asm-ia64/irq.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/irq.h linux-2.6.18-xen/include/asm-ia64/irq.h
+--- linux-2.6.18.1/include/asm-ia64/irq.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/irq.h	2006-09-04 16:31:16.000000000 +0200
 @@ -11,8 +11,39 @@
   * 02/29/00     D.Mosberger	moved most things into hw_irq.h
@@ -78025,8 +79687,8 @@
  
  static __inline__ int
  irq_canonicalize (int irq)
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/machvec_dig.h linux-2.6.18-xen/include/asm-ia64/machvec_dig.h
---- linux-2.6.18/include/asm-ia64/machvec_dig.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/machvec_dig.h linux-2.6.18-xen/include/asm-ia64/machvec_dig.h
+--- linux-2.6.18.1/include/asm-ia64/machvec_dig.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/machvec_dig.h	2006-09-21 01:33:32.000000000 +0200
 @@ -13,4 +13,19 @@
  #define platform_name		"dig"
@@ -78048,10 +79710,10 @@
 +#endif
 +
  #endif /* _ASM_IA64_MACHVEC_DIG_h */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/maddr.h linux-2.6.18-xen/include/asm-ia64/maddr.h
---- linux-2.6.18/include/asm-ia64/maddr.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/include/asm-ia64/maddr.h	2006-09-21 01:33:32.000000000 +0200
-@@ -0,0 +1,92 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/maddr.h linux-2.6.18-xen/include/asm-ia64/maddr.h
+--- linux-2.6.18.1/include/asm-ia64/maddr.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/include/asm-ia64/maddr.h	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,107 @@
 +#ifndef _ASM_IA64_MADDR_H
 +#define _ASM_IA64_MADDR_H
 +
@@ -78064,11 +79726,26 @@
 +
 +#define INVALID_P2M_ENTRY       (~0UL)
 +
++#ifdef CONFIG_XEN_IA64_EXPOSE_P2M
++extern int p2m_initialized;
++extern unsigned long p2m_min_low_pfn;
++extern unsigned long p2m_max_low_pfn;
++extern unsigned long p2m_convert_min_pfn;
++extern unsigned long p2m_convert_max_pfn;
++extern volatile const pte_t* p2m_pte;
++unsigned long p2m_phystomach(unsigned long gpfn);
++#else
++#define p2m_initialized		(0)
++#define p2m_phystomach(gpfn)	INVALID_MFN
++#endif
++
 +/* XXX xen page size != page size */
 +static inline unsigned long
 +pfn_to_mfn_for_dma(unsigned long pfn)
 +{
 +	unsigned long mfn;
++	if (p2m_initialized)
++		return p2m_phystomach(pfn);
 +	mfn = HYPERVISOR_phystomach(pfn);
 +	BUG_ON(mfn == 0); // XXX
 +	BUG_ON(mfn == INVALID_P2M_ENTRY); // XXX
@@ -78144,8 +79821,8 @@
 +typedef unsigned long maddr_t;	// to compile netback, netfront
 +
 +#endif /* _ASM_IA64_MADDR_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/meminit.h linux-2.6.18-xen/include/asm-ia64/meminit.h
---- linux-2.6.18/include/asm-ia64/meminit.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/meminit.h linux-2.6.18-xen/include/asm-ia64/meminit.h
+--- linux-2.6.18.1/include/asm-ia64/meminit.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/meminit.h	2006-09-04 16:31:16.000000000 +0200
 @@ -16,10 +16,15 @@
   * 	- command line string
@@ -78163,8 +79840,8 @@
  
  struct rsvd_region {
  	unsigned long start;	/* virtual address of beginning of element */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/page.h linux-2.6.18-xen/include/asm-ia64/page.h
---- linux-2.6.18/include/asm-ia64/page.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/page.h linux-2.6.18-xen/include/asm-ia64/page.h
+--- linux-2.6.18.1/include/asm-ia64/page.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/page.h	2006-09-21 01:33:32.000000000 +0200
 @@ -126,7 +126,9 @@
  # define pfn_valid(pfn)		(((pfn) >= min_low_pfn) && ((pfn) < max_low_pfn) && ia64_pfn_valid(pfn))
@@ -78230,8 +79907,8 @@
 +#endif /* __ASSEMBLY__ */
  # endif /* __KERNEL__ */
  #endif /* _ASM_IA64_PAGE_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/pal.h linux-2.6.18-xen/include/asm-ia64/pal.h
---- linux-2.6.18/include/asm-ia64/pal.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/pal.h linux-2.6.18-xen/include/asm-ia64/pal.h
+--- linux-2.6.18.1/include/asm-ia64/pal.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/pal.h	2006-09-04 16:31:16.000000000 +0200
 @@ -82,6 +82,7 @@
  #ifndef __ASSEMBLY__
@@ -78241,8 +79918,8 @@
  #include <asm/fpu.h>
  
  /*
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/pgalloc.h linux-2.6.18-xen/include/asm-ia64/pgalloc.h
---- linux-2.6.18/include/asm-ia64/pgalloc.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/pgalloc.h linux-2.6.18-xen/include/asm-ia64/pgalloc.h
+--- linux-2.6.18.1/include/asm-ia64/pgalloc.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/pgalloc.h	2006-09-04 16:31:16.000000000 +0200
 @@ -125,7 +125,11 @@
  static inline void
@@ -78256,8 +79933,8 @@
  }
  
  static inline void
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/privop.h linux-2.6.18-xen/include/asm-ia64/privop.h
---- linux-2.6.18/include/asm-ia64/privop.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/privop.h linux-2.6.18-xen/include/asm-ia64/privop.h
+--- linux-2.6.18.1/include/asm-ia64/privop.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-ia64/privop.h	2006-09-04 16:31:17.000000000 +0200
 @@ -0,0 +1,59 @@
 +#ifndef _ASM_IA64_PRIVOP_H
@@ -78319,8 +79996,8 @@
 +#endif /* !__ASSEMBLY */
 +
 +#endif /* _ASM_IA64_PRIVOP_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/processor.h linux-2.6.18-xen/include/asm-ia64/processor.h
---- linux-2.6.18/include/asm-ia64/processor.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/processor.h linux-2.6.18-xen/include/asm-ia64/processor.h
+--- linux-2.6.18.1/include/asm-ia64/processor.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/processor.h	2006-09-04 16:31:17.000000000 +0200
 @@ -18,6 +18,7 @@
  #include <asm/kregs.h>
@@ -78330,8 +80007,8 @@
  
  #define IA64_NUM_DBG_REGS	8
  /*
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/synch_bitops.h linux-2.6.18-xen/include/asm-ia64/synch_bitops.h
---- linux-2.6.18/include/asm-ia64/synch_bitops.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/synch_bitops.h linux-2.6.18-xen/include/asm-ia64/synch_bitops.h
+--- linux-2.6.18.1/include/asm-ia64/synch_bitops.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-ia64/synch_bitops.h	2006-09-04 16:31:17.000000000 +0200
 @@ -0,0 +1,61 @@
 +#ifndef __XEN_SYNCH_BITOPS_H__
@@ -78395,8 +80072,8 @@
 +#define synch_cmpxchg_subword synch_cmpxchg
 +
 +#endif /* __XEN_SYNCH_BITOPS_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/system.h linux-2.6.18-xen/include/asm-ia64/system.h
---- linux-2.6.18/include/asm-ia64/system.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/system.h linux-2.6.18-xen/include/asm-ia64/system.h
+--- linux-2.6.18.1/include/asm-ia64/system.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-ia64/system.h	2006-09-04 16:31:17.000000000 +0200
 @@ -123,7 +123,7 @@
  #define __local_irq_save(x)			\
@@ -78416,10 +80093,10 @@
  
  #define irqs_disabled()				\
  ({						\
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-ia64/xen/privop.h linux-2.6.18-xen/include/asm-ia64/xen/privop.h
---- linux-2.6.18/include/asm-ia64/xen/privop.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/include/asm-ia64/xen/privop.h	2006-09-04 16:31:17.000000000 +0200
-@@ -0,0 +1,304 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/xen/privop.h linux-2.6.18-xen/include/asm-ia64/xen/privop.h
+--- linux-2.6.18.1/include/asm-ia64/xen/privop.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/include/asm-ia64/xen/privop.h	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,301 @@
 +#ifndef _ASM_IA64_XEN_PRIVOP_H
 +#define _ASM_IA64_XEN_PRIVOP_H
 +
@@ -78436,12 +80113,9 @@
 +
 +#define IA64_PARAVIRTUALIZED
 +
-+#if 0
-+#undef XSI_BASE
 +/* At 1 MB, before per-cpu space but still addressable using addl instead
 +   of movl. */
 +#define XSI_BASE				0xfffffffffff00000
-+#endif
 +
 +/* Address of mapped regs.  */
 +#define XMAPPEDREGS_BASE		(XSI_BASE + XSI_SIZE)
@@ -78724,8 +80398,147 @@
 +#define	ia64_pal_call_static		xen_pal_call_static
 +
 +#endif /* _ASM_IA64_XEN_PRIVOP_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-um/page.h linux-2.6.18-xen/include/asm-um/page.h
---- linux-2.6.18/include/asm-um/page.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/xen/xcom_hcall.h linux-2.6.18-xen/include/asm-ia64/xen/xcom_hcall.h
+--- linux-2.6.18.1/include/asm-ia64/xen/xcom_hcall.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/include/asm-ia64/xen/xcom_hcall.h	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,74 @@
++/*
++ * Copyright (C) 2006 Tristan Gingold <tristan.gingold at bull.net>, Bull SAS
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ * 
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ * 
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ */
++
++#ifndef _LINUX_XENCOMM_HCALL_H_
++#define _LINUX_XENCOMM_HCALL_H_
++
++/* These function creates inline descriptor for the parameters and
++   calls the corresponding xencomm_arch_hypercall_X.
++   Architectures should defines HYPERVISOR_xxx as xencomm_hypercall_xxx unless
++   they want to use their own wrapper.  */
++extern int xencomm_hypercall_console_io(int cmd, int count, char *str);
++
++extern int xencomm_hypercall_event_channel_op(int cmd, void *op);
++
++extern int xencomm_hypercall_xen_version(int cmd, void *arg);
++
++extern int xencomm_hypercall_physdev_op(int cmd, void *op);
++
++extern int xencomm_hypercall_grant_table_op(unsigned int cmd, void *op,
++                                            unsigned int count);
++
++extern int xencomm_hypercall_sched_op(int cmd, void *arg);
++
++extern int xencomm_hypercall_multicall(void *call_list, int nr_calls);
++
++extern int xencomm_hypercall_callback_op(int cmd, void *arg);
++
++extern int xencomm_hypercall_memory_op(unsigned int cmd, void *arg);
++
++extern unsigned long xencomm_hypercall_hvm_op(int cmd, void *arg);
++
++extern int xencomm_hypercall_suspend(unsigned long srec);
++
++/* Using mini xencomm.  */
++extern int xencomm_mini_hypercall_console_io(int cmd, int count, char *str);
++
++extern int xencomm_mini_hypercall_event_channel_op(int cmd, void *op);
++
++extern int xencomm_mini_hypercall_xen_version(int cmd, void *arg);
++
++extern int xencomm_mini_hypercall_physdev_op(int cmd, void *op);
++
++extern int xencomm_mini_hypercall_grant_table_op(unsigned int cmd, void *op,
++                                                 unsigned int count);
++
++extern int xencomm_mini_hypercall_sched_op(int cmd, void *arg);
++
++extern int xencomm_mini_hypercall_multicall(void *call_list, int nr_calls);
++
++extern int xencomm_mini_hypercall_callback_op(int cmd, void *arg);
++
++extern int xencomm_mini_hypercall_memory_op(unsigned int cmd, void *arg);
++
++/* For privcmd.  Locally declare argument type to avoid include storm.
++   Type coherency will be checked within privcmd.c  */
++struct privcmd_hypercall;
++extern int privcmd_hypercall(struct privcmd_hypercall *hypercall);
++
++#endif /* _LINUX_XENCOMM_HCALL_H_ */
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-ia64/xen/xencomm.h linux-2.6.18-xen/include/asm-ia64/xen/xencomm.h
+--- linux-2.6.18.1/include/asm-ia64/xen/xencomm.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/include/asm-ia64/xen/xencomm.h	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,57 @@
++/*
++ * Copyright (C) 2006 Hollis Blanchard <hollisb at us.ibm.com>, IBM Corporation
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ * 
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ * 
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ */
++
++#ifndef _LINUX_XENCOMM_H_
++#define _LINUX_XENCOMM_H_
++
++#include <xen/interface/xencomm.h>
++
++#define XENCOMM_MINI_ADDRS 3
++struct xencomm_mini {
++	struct xencomm_desc _desc;
++	uint64_t address[XENCOMM_MINI_ADDRS];
++};
++
++/* To avoid additionnal virt to phys conversion, an opaque structure is
++   presented.  */
++struct xencomm_handle;
++
++extern int xencomm_create(void *buffer, unsigned long bytes,
++                          struct xencomm_handle **desc, gfp_t type);
++extern void xencomm_free(struct xencomm_handle *desc);
++
++extern int xencomm_create_mini(struct xencomm_mini *area, int *nbr_area,
++                               void *buffer, unsigned long bytes,
++                               struct xencomm_handle **ret);
++
++/* Translate virtual address to physical address.  */
++extern unsigned long xencomm_vaddr_to_paddr(unsigned long vaddr);
++
++/* Inline version.  To be used only on linear space (kernel space).  */
++static inline struct xencomm_handle *
++xencomm_create_inline(void *buffer)
++{
++	unsigned long paddr;
++
++	paddr = xencomm_vaddr_to_paddr((unsigned long)buffer);
++	return (struct xencomm_handle *)(paddr | XENCOMM_INLINE_FLAG);
++}
++
++#define xen_guest_handle(hnd)  ((hnd).p)
++
++#endif /* _LINUX_XENCOMM_H_ */
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-um/page.h linux-2.6.18-xen/include/asm-um/page.h
+--- linux-2.6.18.1/include/asm-um/page.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-um/page.h	2006-09-04 16:31:18.000000000 +0200
 @@ -114,7 +114,7 @@
  extern struct page *arch_validate(struct page *page, gfp_t mask, int order);
@@ -78736,8 +80549,8 @@
  #define HAVE_ARCH_FREE_PAGE
  
  #include <asm-generic/memory_model.h>
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/apic.h linux-2.6.18-xen/include/asm-x86_64/apic.h
---- linux-2.6.18/include/asm-x86_64/apic.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/apic.h linux-2.6.18-xen/include/asm-x86_64/apic.h
+--- linux-2.6.18.1/include/asm-x86_64/apic.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-x86_64/apic.h	2006-09-04 16:31:18.000000000 +0200
 @@ -98,11 +98,13 @@
  extern int disable_timer_pin_1;
@@ -78753,8 +80566,8 @@
  
  #endif /* CONFIG_X86_LOCAL_APIC */
  
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/ipi.h linux-2.6.18-xen/include/asm-x86_64/ipi.h
---- linux-2.6.18/include/asm-x86_64/ipi.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/ipi.h linux-2.6.18-xen/include/asm-x86_64/ipi.h
+--- linux-2.6.18.1/include/asm-x86_64/ipi.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/asm-x86_64/ipi.h	2006-09-21 01:33:32.000000000 +0200
 @@ -49,6 +49,7 @@
  	return SET_APIC_DEST_FIELD(mask);
@@ -78771,8 +80584,8 @@
 +#endif /* CONFIG_XEN_UNPRIVILEGED_GUEST */
  
  #endif /* __ASM_IPI_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/arch_hooks.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/arch_hooks.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/arch_hooks.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/arch_hooks.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/arch_hooks.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/arch_hooks.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/arch_hooks.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,27 @@
 +#ifndef _ASM_ARCH_HOOKS_H
@@ -78802,8 +80615,8 @@
 +extern void mca_nmi_hook(void);
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/bootsetup.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/bootsetup.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/bootsetup.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/bootsetup.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/bootsetup.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/bootsetup.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/bootsetup.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,42 @@
 +
@@ -78848,8 +80661,8 @@
 +#define RAMDISK_LOAD_FLAG		0x4000	
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/desc.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/desc.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/desc.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/desc.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/desc.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/desc.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/desc.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,263 @@
 +/* Written 2000 by Andi Kleen */ 
@@ -79115,8 +80928,8 @@
 +#endif /* !__ASSEMBLY__ */
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/dma-mapping.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/dma-mapping.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/dma-mapping.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/dma-mapping.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/dma-mapping.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/dma-mapping.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/dma-mapping.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,208 @@
 +#ifndef _X8664_DMA_MAPPING_H
@@ -79327,8 +81140,8 @@
 +#endif /* _X8664_DMA_MAPPING_H */
 +
 +#include <asm-i386/mach-xen/asm/dma-mapping.h>
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/dmi.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/dmi.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/dmi.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/dmi.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/dmi.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/dmi.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/dmi.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,29 @@
 +#ifndef _ASM_DMI_H
@@ -79360,8 +81173,8 @@
 +#define dmi_iounmap bt_iounmap
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/e820.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/e820.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/e820.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/e820.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/e820.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/e820.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/e820.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,64 @@
 +/*
@@ -79428,8 +81241,8 @@
 +#endif/*!__ASSEMBLY__*/
 +
 +#endif/*__E820_HEADER*/
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/fixmap.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/fixmap.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/fixmap.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/fixmap.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/fixmap.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/fixmap.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/fixmap.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,113 @@
 +/*
@@ -79545,8 +81358,8 @@
 +}
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/floppy.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/floppy.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/floppy.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/floppy.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/floppy.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/floppy.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/floppy.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,206 @@
 +/*
@@ -79755,8 +81568,8 @@
 +#define EXTRA_FLOPPY_PARAMS
 +
 +#endif /* __ASM_XEN_X86_64_FLOPPY_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/hw_irq.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/hw_irq.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/hw_irq.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/hw_irq.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/hw_irq.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/hw_irq.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/hw_irq.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,136 @@
 +#ifndef _ASM_HW_IRQ_H
@@ -79895,8 +81708,8 @@
 +#endif
 +
 +#endif /* _ASM_HW_IRQ_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/hypercall.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/hypercall.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/hypercall.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/hypercall.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/hypercall.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/hypercall.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/hypercall.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,389 @@
 +/******************************************************************************
@@ -80288,14 +82101,14 @@
 +}
 +
 +#endif /* __HYPERCALL_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/hypervisor.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/hypervisor.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/hypervisor.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/hypervisor.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/hypervisor.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/hypervisor.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/hypervisor.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,2 @@
 +
 +#include <asm-i386/mach-xen/asm/hypervisor.h>
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/io.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/io.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/io.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/io.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/io.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/io.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/io.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,327 @@
 +#ifndef _ASM_IO_H
@@ -80625,8 +82438,8 @@
 +#define ARCH_HAS_DEV_MEM
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/irqflags.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/irqflags.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/irqflags.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/irqflags.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/irqflags.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/irqflags.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/irqflags.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,65 @@
 +/*
@@ -80694,8 +82507,8 @@
 +#endif
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/irq.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/irq.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/irq.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/irq.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/irq.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/irq.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/irq.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,38 @@
 +#ifndef _ASM_IRQ_H
@@ -80736,8 +82549,8 @@
 +#define __ARCH_HAS_DO_SOFTIRQ 1
 +
 +#endif /* _ASM_IRQ_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/maddr.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/maddr.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/maddr.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/maddr.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/maddr.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/maddr.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/maddr.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,139 @@
 +#ifndef _X86_64_MADDR_H
@@ -80879,8 +82692,8 @@
 +
 +#endif /* _X86_64_MADDR_H */
 +
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/mmu_context.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/mmu_context.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/mmu_context.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/mmu_context.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/mmu_context.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/mmu_context.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/mmu_context.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,135 @@
 +#ifndef __X86_64_MMU_CONTEXT_H
@@ -81018,8 +82831,8 @@
 +}
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/mmu.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/mmu.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/mmu.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/mmu.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/mmu.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/mmu.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/mmu.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,38 @@
 +#ifndef __x86_64_MMU_H
@@ -81060,8 +82873,8 @@
 +#endif
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/msr.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/msr.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/msr.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/msr.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/msr.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/msr.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/msr.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,399 @@
 +#ifndef X86_64_MSR_H
@@ -81463,8 +83276,8 @@
 +#define MSR_P4_U2L_ESCR1 		0x3b1
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/nmi.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/nmi.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/nmi.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/nmi.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/nmi.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/nmi.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/nmi.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,93 @@
 +/*
@@ -81560,8 +83373,8 @@
 +#define NMI_INVALID	3
 +
 +#endif /* ASM_NMI_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/page.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/page.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/page.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/page.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/page.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/page.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/page.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,208 @@
 +#ifndef _X86_64_PAGE_H
@@ -81772,8 +83585,8 @@
 +#endif /* __KERNEL__ */
 +
 +#endif /* _X86_64_PAGE_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/param.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/param.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/param.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/param.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/param.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/param.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/param.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,22 @@
 +#ifndef _ASMx86_64_PARAM_H
@@ -81798,8 +83611,8 @@
 +#define MAXHOSTNAMELEN	64	/* max length of hostname */
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/pci.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/pci.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/pci.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/pci.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/pci.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/pci.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/pci.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,173 @@
 +#ifndef __x8664_PCI_H
@@ -81975,8 +83788,8 @@
 +#define pcibios_scan_all_fns(a, b)	1
 +
 +#endif /* __x8664_PCI_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/pgalloc.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/pgalloc.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/pgalloc.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/pgalloc.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/pgalloc.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/pgalloc.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/pgalloc.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,226 @@
 +#ifndef _X86_64_PGALLOC_H
@@ -82205,8 +84018,8 @@
 +#define __pud_free_tlb(tlb,x)   pud_free((x))
 +
 +#endif /* _X86_64_PGALLOC_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/pgtable.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/pgtable.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/pgtable.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/pgtable.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/pgtable.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/pgtable.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/pgtable.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,558 @@
 +#ifndef _X86_64_PGTABLE_H
@@ -82767,8 +84580,8 @@
 +#include <asm-generic/pgtable.h>
 +
 +#endif /* _X86_64_PGTABLE_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/processor.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/processor.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/processor.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/processor.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/processor.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/processor.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/processor.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,504 @@
 +/*
@@ -83275,8 +85088,8 @@
 +#define HAVE_ARCH_PICK_MMAP_LAYOUT 1
 +
 +#endif /* __ASM_X86_64_PROCESSOR_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/ptrace.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/ptrace.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/ptrace.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/ptrace.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/ptrace.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/ptrace.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/ptrace.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,125 @@
 +#ifndef _X86_64_PTRACE_H
@@ -83404,8 +85217,8 @@
 +#endif
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/smp.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/smp.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/smp.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/smp.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/smp.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/smp.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/smp.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,150 @@
 +#ifndef __ASM_SMP_H
@@ -83558,14 +85371,14 @@
 +
 +#endif
 +
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/synch_bitops.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/synch_bitops.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/synch_bitops.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/synch_bitops.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/synch_bitops.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/synch_bitops.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/synch_bitops.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,2 @@
 +
 +#include <asm-i386/mach-xen/asm/synch_bitops.h>
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/system.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/system.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/system.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/system.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/system.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/system.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/system.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,264 @@
 +#ifndef __ASM_SYSTEM_H
@@ -83832,8 +85645,8 @@
 +extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/timer.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/timer.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/timer.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/timer.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/timer.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/timer.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/timer.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,67 @@
 +#ifndef _ASMi386_TIMER_H
@@ -83903,8 +85716,8 @@
 +extern struct init_timer_opts timer_pmtmr_init;
 +#endif
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/tlbflush.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/tlbflush.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/tlbflush.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/tlbflush.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/tlbflush.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/tlbflush.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/tlbflush.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,103 @@
 +#ifndef _X8664_TLBFLUSH_H
@@ -84010,8 +85823,8 @@
 +}
 +
 +#endif /* _X8664_TLBFLUSH_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/vga.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/vga.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/vga.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/vga.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/vga.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/vga.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/vga.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,20 @@
 +/*
@@ -84034,8 +85847,8 @@
 +#define vga_writeb(x,y) (*(y) = (x))
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/asm/xor.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/xor.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/asm/xor.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/xor.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/xor.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/asm/xor.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/asm/xor.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,328 @@
 +/*
@@ -84366,8 +86179,8 @@
 +   We may also be able to load into the L1 only depending on how the cpu
 +   deals with a load to a line that is being prefetched.  */
 +#define XOR_SELECT_TEMPLATE(FASTEST) (&xor_block_sse)
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/irq_vectors.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/irq_vectors.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/irq_vectors.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/irq_vectors.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/irq_vectors.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/irq_vectors.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/irq_vectors.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,123 @@
 +/*
@@ -84493,8 +86306,8 @@
 +#define irq_to_dynirq(_x)	((_x) - DYNIRQ_BASE)
 +
 +#endif /* _ASM_IRQ_VECTORS_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/mach_time.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/mach_time.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/mach_time.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/mach_time.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/mach_time.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/mach_time.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/mach_time.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,111 @@
 +/*
@@ -84608,8 +86421,8 @@
 +}
 +
 +#endif /* !_MACH_TIME_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/mach_timer.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/mach_timer.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/mach_timer.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/mach_timer.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/mach_timer.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/mach_timer.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/mach_timer.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,48 @@
 +/*
@@ -84660,8 +86473,8 @@
 +}
 +
 +#endif /* !_MACH_TIMER_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/setup_arch_post.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/setup_arch_post.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/setup_arch_post.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/setup_arch_post.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/setup_arch_post.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/setup_arch_post.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/setup_arch_post.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,58 @@
 +/**
@@ -84722,8 +86535,8 @@
 +	}
 +#endif
 +}
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/asm-x86_64/mach-xen/setup_arch_pre.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/setup_arch_pre.h
---- linux-2.6.18/include/asm-x86_64/mach-xen/setup_arch_pre.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/asm-x86_64/mach-xen/setup_arch_pre.h linux-2.6.18-xen/include/asm-x86_64/mach-xen/setup_arch_pre.h
+--- linux-2.6.18.1/include/asm-x86_64/mach-xen/setup_arch_pre.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/asm-x86_64/mach-xen/setup_arch_pre.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,5 @@
 +/* Hook to call BIOS initialisation function */
@@ -84731,8 +86544,8 @@
 +#define ARCH_SETUP machine_specific_arch_setup();
 +
 +static void __init machine_specific_arch_setup(void);
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/linux/elfnote.h linux-2.6.18-xen/include/linux/elfnote.h
---- linux-2.6.18/include/linux/elfnote.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/linux/elfnote.h linux-2.6.18-xen/include/linux/elfnote.h
+--- linux-2.6.18.1/include/linux/elfnote.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/linux/elfnote.h	2006-09-04 16:31:18.000000000 +0200
 @@ -0,0 +1,90 @@
 +#ifndef _LINUX_ELFNOTE_H
@@ -84825,8 +86638,8 @@
 +#endif	/* __ASSEMBLER__ */
 +
 +#endif /* _LINUX_ELFNOTE_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/linux/gfp.h linux-2.6.18-xen/include/linux/gfp.h
---- linux-2.6.18/include/linux/gfp.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/linux/gfp.h linux-2.6.18-xen/include/linux/gfp.h
+--- linux-2.6.18.1/include/linux/gfp.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/linux/gfp.h	2006-09-04 16:31:18.000000000 +0200
 @@ -99,7 +99,11 @@
   */
@@ -84841,8 +86654,8 @@
  #endif
  
  extern struct page *
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/linux/highmem.h linux-2.6.18-xen/include/linux/highmem.h
---- linux-2.6.18/include/linux/highmem.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/linux/highmem.h linux-2.6.18-xen/include/linux/highmem.h
+--- linux-2.6.18.1/include/linux/highmem.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/linux/highmem.h	2006-09-04 16:31:18.000000000 +0200
 @@ -24,10 +24,16 @@
  
@@ -84861,8 +86674,8 @@
  
  static inline void *kmap(struct page *page)
  {
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/linux/interrupt.h linux-2.6.18-xen/include/linux/interrupt.h
---- linux-2.6.18/include/linux/interrupt.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/linux/interrupt.h linux-2.6.18-xen/include/linux/interrupt.h
+--- linux-2.6.18.1/include/linux/interrupt.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/linux/interrupt.h	2006-09-04 16:31:18.000000000 +0200
 @@ -166,6 +166,12 @@
  
@@ -84877,8 +86690,8 @@
  #ifndef __ARCH_SET_SOFTIRQ_PENDING
  #define set_softirq_pending(x) (local_softirq_pending() = (x))
  #define or_softirq_pending(x)  (local_softirq_pending() |= (x))
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/linux/mm.h linux-2.6.18-xen/include/linux/mm.h
---- linux-2.6.18/include/linux/mm.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/linux/mm.h linux-2.6.18-xen/include/linux/mm.h
+--- linux-2.6.18.1/include/linux/mm.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/linux/mm.h	2006-09-04 16:31:19.000000000 +0200
 @@ -164,6 +164,9 @@
  #define VM_NONLINEAR	0x00800000	/* Is non-linear (remap_file_pages) */
@@ -84904,8 +86717,8 @@
  #ifdef CONFIG_PROC_FS
  void vm_stat_account(struct mm_struct *, unsigned long, struct file *, long);
  #else
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/linux/oprofile.h linux-2.6.18-xen/include/linux/oprofile.h
---- linux-2.6.18/include/linux/oprofile.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/linux/oprofile.h linux-2.6.18-xen/include/linux/oprofile.h
+--- linux-2.6.18.1/include/linux/oprofile.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/linux/oprofile.h	2006-09-04 16:31:19.000000000 +0200
 @@ -16,6 +16,10 @@
  #include <linux/types.h>
@@ -84939,8 +86752,22 @@
  
  /**
   * Create a file of the given name as a child of the given root, with
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/linux/skbuff.h linux-2.6.18-xen/include/linux/skbuff.h
---- linux-2.6.18/include/linux/skbuff.h	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/linux/pfn.h linux-2.6.18-xen/include/linux/pfn.h
+--- linux-2.6.18.1/include/linux/pfn.h	2006-09-20 05:42:06.000000000 +0200
++++ linux-2.6.18-xen/include/linux/pfn.h	2006-10-17 15:01:58.000000000 +0200
+@@ -4,6 +4,10 @@
+ #define PFN_ALIGN(x)	(((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK)
+ #define PFN_UP(x)	(((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
+ #define PFN_DOWN(x)	((x) >> PAGE_SHIFT)
++#if defined(CONFIG_X86_XEN) && defined(CONFIG_X86_PAE)
++#define PFN_PHYS(x)	((unsigned long long)(x) << PAGE_SHIFT)
++#else
+ #define PFN_PHYS(x)	((x) << PAGE_SHIFT)
++#endif
+ 
+ #endif
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/linux/skbuff.h linux-2.6.18-xen/include/linux/skbuff.h
+--- linux-2.6.18.1/include/linux/skbuff.h	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/include/linux/skbuff.h	2006-09-04 16:31:19.000000000 +0200
 @@ -203,6 +203,8 @@
   *	@local_df: allow local fragmentation
@@ -84993,10 +86820,10 @@
  
  /**
   *	dev_alloc_skb - allocate an skbuff for receiving
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/balloon.h linux-2.6.18-xen/include/xen/balloon.h
---- linux-2.6.18/include/xen/balloon.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/include/xen/balloon.h	2006-09-04 16:31:19.000000000 +0200
-@@ -0,0 +1,67 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/balloon.h linux-2.6.18-xen/include/xen/balloon.h
+--- linux-2.6.18.1/include/xen/balloon.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/include/xen/balloon.h	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,57 @@
 +/******************************************************************************
 + * balloon.h
 + *
@@ -85037,23 +86864,13 @@
 + * Inform the balloon driver that it should allow some slop for device-driver
 + * memory activities.
 + */
-+void
-+balloon_update_driver_allowance(
-+	long delta);
-+
-+/* Allocate an empty low-memory page range. */
-+struct page *
-+balloon_alloc_empty_page_range(
-+	unsigned long nr_pages);
++void balloon_update_driver_allowance(long delta);
 +
-+/* Deallocate an empty page range, adding to the balloon. */
-+void
-+balloon_dealloc_empty_page_range(
-+	struct page *page, unsigned long nr_pages);
++/* Allocate/free a set of empty pages in low memory (i.e., no RAM mapped). */
++struct page **alloc_empty_pages_and_pagevec(int nr_pages);
++void free_empty_pages_and_pagevec(struct page **pagevec, int nr_pages);
 +
-+void
-+balloon_release_driver_page(
-+	struct page *page);
++void balloon_release_driver_page(struct page *page);
 +
 +/*
 + * Prevent the balloon driver from changing the memory reservation during
@@ -85064,8 +86881,8 @@
 +#define balloon_unlock(__flags) spin_unlock_irqrestore(&balloon_lock, __flags)
 +
 +#endif /* __ASM_BALLOON_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/cpu_hotplug.h linux-2.6.18-xen/include/xen/cpu_hotplug.h
---- linux-2.6.18/include/xen/cpu_hotplug.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/cpu_hotplug.h linux-2.6.18-xen/include/xen/cpu_hotplug.h
+--- linux-2.6.18.1/include/xen/cpu_hotplug.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/cpu_hotplug.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,43 @@
 +#ifndef __XEN_CPU_HOTPLUG_H__
@@ -85111,8 +86928,8 @@
 +#endif /* !defined(CONFIG_HOTPLUG_CPU) */
 +
 +#endif /* __XEN_CPU_HOTPLUG_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/driver_util.h linux-2.6.18-xen/include/xen/driver_util.h
---- linux-2.6.18/include/xen/driver_util.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/driver_util.h linux-2.6.18-xen/include/xen/driver_util.h
+--- linux-2.6.18.1/include/xen/driver_util.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/driver_util.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,15 @@
 +
@@ -85130,8 +86947,8 @@
 +extern void unlock_vm_area(struct vm_struct *area);
 +
 +#endif /* __ASM_XEN_DRIVER_UTIL_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/evtchn.h linux-2.6.18-xen/include/xen/evtchn.h
---- linux-2.6.18/include/xen/evtchn.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/evtchn.h linux-2.6.18-xen/include/xen/evtchn.h
+--- linux-2.6.18.1/include/xen/evtchn.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/evtchn.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,113 @@
 +/******************************************************************************
@@ -85247,8 +87064,8 @@
 +extern void notify_remote_via_irq(int irq);
 +
 +#endif /* __ASM_EVTCHN_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/features.h linux-2.6.18-xen/include/xen/features.h
---- linux-2.6.18/include/xen/features.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/features.h linux-2.6.18-xen/include/xen/features.h
+--- linux-2.6.18.1/include/xen/features.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/features.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,20 @@
 +/******************************************************************************
@@ -85271,8 +87088,8 @@
 +#define xen_feature(flag)	(xen_features[flag])
 +
 +#endif /* __ASM_XEN_FEATURES_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/foreign_page.h linux-2.6.18-xen/include/xen/foreign_page.h
---- linux-2.6.18/include/xen/foreign_page.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/foreign_page.h linux-2.6.18-xen/include/xen/foreign_page.h
+--- linux-2.6.18.1/include/xen/foreign_page.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/foreign_page.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,30 @@
 +/******************************************************************************
@@ -85305,8 +87122,8 @@
 +	( (void (*) (struct page *)) (page)->mapping )
 +
 +#endif /* __ASM_XEN_FOREIGN_PAGE_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/gnttab.h linux-2.6.18-xen/include/xen/gnttab.h
---- linux-2.6.18/include/xen/gnttab.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/gnttab.h linux-2.6.18-xen/include/xen/gnttab.h
+--- linux-2.6.18.1/include/xen/gnttab.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/gnttab.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,150 @@
 +/******************************************************************************
@@ -85459,8 +87276,8 @@
 +}
 +
 +#endif /* __ASM_GNTTAB_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/hvm.h linux-2.6.18-xen/include/xen/hvm.h
---- linux-2.6.18/include/xen/hvm.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/hvm.h linux-2.6.18-xen/include/xen/hvm.h
+--- linux-2.6.18.1/include/xen/hvm.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/hvm.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,24 @@
 +/* Simple wrappers around HVM functions */
@@ -85487,8 +87304,8 @@
 +}
 +
 +#endif /* XEN_HVM_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/hypervisor_sysfs.h linux-2.6.18-xen/include/xen/hypervisor_sysfs.h
---- linux-2.6.18/include/xen/hypervisor_sysfs.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/hypervisor_sysfs.h linux-2.6.18-xen/include/xen/hypervisor_sysfs.h
+--- linux-2.6.18.1/include/xen/hypervisor_sysfs.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/hypervisor_sysfs.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,32 @@
 +/*
@@ -85523,8 +87340,8 @@
 +};
 +
 +#endif /* _HYP_SYSFS_H_ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/acm.h linux-2.6.18-xen/include/xen/interface/acm.h
---- linux-2.6.18/include/xen/interface/acm.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/acm.h linux-2.6.18-xen/include/xen/interface/acm.h
+--- linux-2.6.18.1/include/xen/interface/acm.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/acm.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,187 @@
 +/*
@@ -85714,8 +87531,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/acm_ops.h linux-2.6.18-xen/include/xen/interface/acm_ops.h
---- linux-2.6.18/include/xen/interface/acm_ops.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/acm_ops.h linux-2.6.18-xen/include/xen/interface/acm_ops.h
+--- linux-2.6.18.1/include/xen/interface/acm_ops.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/acm_ops.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,102 @@
 +/*
@@ -85820,10 +87637,10 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/arch-ia64.h linux-2.6.18-xen/include/xen/interface/arch-ia64.h
---- linux-2.6.18/include/xen/interface/arch-ia64.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/include/xen/interface/arch-ia64.h	2006-09-04 16:31:19.000000000 +0200
-@@ -0,0 +1,448 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/arch-ia64.h linux-2.6.18-xen/include/xen/interface/arch-ia64.h
+--- linux-2.6.18.1/include/xen/interface/arch-ia64.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/include/xen/interface/arch-ia64.h	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,444 @@
 +/******************************************************************************
 + * arch-ia64/hypervisor-if.h
 + * 
@@ -85874,18 +87691,6 @@
 +
 +typedef unsigned long xen_ulong_t;
 +
-+#define GPFN_MEM          (0UL << 56) /* Guest pfn is normal mem */
-+#define GPFN_FRAME_BUFFER (1UL << 56) /* VGA framebuffer */
-+#define GPFN_LOW_MMIO     (2UL << 56) /* Low MMIO range */
-+#define GPFN_PIB          (3UL << 56) /* PIB base */
-+#define GPFN_IOSAPIC      (4UL << 56) /* IOSAPIC base */
-+#define GPFN_LEGACY_IO    (5UL << 56) /* Legacy I/O base */
-+#define GPFN_GFW          (6UL << 56) /* Guest Firmware */
-+#define GPFN_HIGH_MMIO    (7UL << 56) /* High MMIO range */
-+
-+#define GPFN_IO_MASK     (7UL << 56)  /* Guest pfn is I/O type */
-+#define GPFN_INV_MASK    (31UL << 59) /* Guest pfn is invalid */
-+
 +#define INVALID_MFN       (~0UL)
 +
 +#define MEM_G   (1UL << 30)
@@ -86162,33 +87967,33 @@
 +typedef struct vcpu_guest_context vcpu_guest_context_t;
 +DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
 +
-+// dom0 vp op
++/* dom0 vp op */
 +#define __HYPERVISOR_ia64_dom0vp_op     __HYPERVISOR_arch_0
-+#define IA64_DOM0VP_ioremap             0       // map io space in machine
-+                                                // address to dom0 physical
-+                                                // address space.
-+                                                // currently physical
-+                                                // assignedg address equals to
-+                                                // machine address
-+#define IA64_DOM0VP_phystomach          1       // convert a pseudo physical
-+                                                // page frame number
-+                                                // to the corresponding
-+                                                // machine page frame number.
-+                                                // if no page is assigned,
-+                                                // INVALID_MFN or GPFN_INV_MASK
-+                                                // is returned depending on
-+                                                // domain's non-vti/vti mode.
-+#define IA64_DOM0VP_machtophys          3       // convert a machine page
-+                                                // frame number
-+                                                // to the corresponding
-+                                                // pseudo physical page frame
-+                                                // number of the caller domain
-+#define IA64_DOM0VP_zap_physmap         17      // unmap and free pages
-+                                                // contained in the specified
-+                                                // pseudo physical region
-+#define IA64_DOM0VP_add_physmap         18      // assigne machine page frane
-+                                                // to dom0's pseudo physical
-+                                                // address space.
++/*  Map io space in machine address to dom0 physical address space.
++    Currently physical assigned address equals to machine address.  */
++#define IA64_DOM0VP_ioremap             0
++
++/* Convert a pseudo physical page frame number to the corresponding
++   machine page frame number. If no page is assigned, INVALID_MFN or
++   GPFN_INV_MASK is returned depending on domain's non-vti/vti mode.  */
++#define IA64_DOM0VP_phystomach          1
++
++/* Convert a machine page frame number to the corresponding pseudo physical
++   page frame number of the caller domain.  */
++#define IA64_DOM0VP_machtophys          3
++
++/* Reserved for future use.  */
++#define IA64_DOM0VP_iounmap             4
++
++/* Unmap and free pages contained in the specified pseudo physical region.  */
++#define IA64_DOM0VP_zap_physmap         5
++
++/* Assign machine page frame to dom0's pseudo physical address space.  */
++#define IA64_DOM0VP_add_physmap         6
++
++/* expose the p2m table into domain */
++#define IA64_DOM0VP_expose_p2m          7
++
 +// flags for page assignement to pseudo physical address space
 +#define _ASSIGN_readonly                0
 +#define ASSIGN_readonly                 (1UL << _ASSIGN_readonly)
@@ -86221,15 +88026,12 @@
 +
 +#endif /* !__ASSEMBLY__ */
 +
-+/* Address of shared_info in domain virtual space.
-+   This is the default address, for compatibility only.  */
-+#define XSI_BASE			0xf100000000000000
-+
 +/* Size of the shared_info area (this is not related to page size).  */
 +#define XSI_SHIFT			14
 +#define XSI_SIZE			(1 << XSI_SHIFT)
 +/* Log size of mapped_regs area (64 KB - only 4KB is used).  */
 +#define XMAPPEDREGS_SHIFT		12
++#define XMAPPEDREGS_SIZE		(1 << XMAPPEDREGS_SHIFT)
 +/* Offset of XASI (Xen arch shared info) wrt XSI_BASE.  */
 +#define XMAPPEDREGS_OFS			XSI_SIZE
 +
@@ -86261,6 +88063,17 @@
 +#define HYPERPRIVOP_GET_PSR		0x19
 +#define HYPERPRIVOP_MAX			0x19
 +
++/* Fast and light hypercalls.  */
++#define __HYPERVISOR_ia64_fast_eoi	0x0200
++
++/* Xencomm macros.  */
++#define XENCOMM_INLINE_MASK 0xf800000000000000UL
++#define XENCOMM_INLINE_FLAG 0x8000000000000000UL
++
++#define XENCOMM_IS_INLINE(addr) \
++  (((unsigned long)(addr) & XENCOMM_INLINE_MASK) == XENCOMM_INLINE_FLAG)
++#define XENCOMM_INLINE_ADDR(addr) \
++  ((unsigned long)(addr) & ~XENCOMM_INLINE_MASK)
 +#endif /* __HYPERVISOR_IF_IA64_H__ */
 +
 +/*
@@ -86272,8 +88085,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/arch-powerpc.h linux-2.6.18-xen/include/xen/interface/arch-powerpc.h
---- linux-2.6.18/include/xen/interface/arch-powerpc.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/arch-powerpc.h linux-2.6.18-xen/include/xen/interface/arch-powerpc.h
+--- linux-2.6.18.1/include/xen/interface/arch-powerpc.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/arch-powerpc.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,115 @@
 +/*
@@ -86391,8 +88204,8 @@
 +#endif
 +
 +#endif
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/arch-x86_32.h linux-2.6.18-xen/include/xen/interface/arch-x86_32.h
---- linux-2.6.18/include/xen/interface/arch-x86_32.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/arch-x86_32.h linux-2.6.18-xen/include/xen/interface/arch-x86_32.h
+--- linux-2.6.18.1/include/xen/interface/arch-x86_32.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/arch-x86_32.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,255 @@
 +/******************************************************************************
@@ -86650,8 +88463,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/arch-x86_64.h linux-2.6.18-xen/include/xen/interface/arch-x86_64.h
---- linux-2.6.18/include/xen/interface/arch-x86_64.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/arch-x86_64.h linux-2.6.18-xen/include/xen/interface/arch-x86_64.h
+--- linux-2.6.18.1/include/xen/interface/arch-x86_64.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/arch-x86_64.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,322 @@
 +/******************************************************************************
@@ -86976,8 +88789,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/callback.h linux-2.6.18-xen/include/xen/interface/callback.h
---- linux-2.6.18/include/xen/interface/callback.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/callback.h linux-2.6.18-xen/include/xen/interface/callback.h
+--- linux-2.6.18.1/include/xen/interface/callback.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/callback.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,74 @@
 +/******************************************************************************
@@ -87054,8 +88867,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/dom0_ops.h linux-2.6.18-xen/include/xen/interface/dom0_ops.h
---- linux-2.6.18/include/xen/interface/dom0_ops.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/dom0_ops.h linux-2.6.18-xen/include/xen/interface/dom0_ops.h
+--- linux-2.6.18.1/include/xen/interface/dom0_ops.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/dom0_ops.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,102 @@
 +/******************************************************************************
@@ -87160,8 +88973,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/domctl.h linux-2.6.18-xen/include/xen/interface/domctl.h
---- linux-2.6.18/include/xen/interface/domctl.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/domctl.h linux-2.6.18-xen/include/xen/interface/domctl.h
+--- linux-2.6.18.1/include/xen/interface/domctl.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/domctl.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,392 @@
 +/******************************************************************************
@@ -87556,8 +89369,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/elfnote.h linux-2.6.18-xen/include/xen/interface/elfnote.h
---- linux-2.6.18/include/xen/interface/elfnote.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/elfnote.h linux-2.6.18-xen/include/xen/interface/elfnote.h
+--- linux-2.6.18.1/include/xen/interface/elfnote.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/elfnote.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,133 @@
 +/******************************************************************************
@@ -87693,8 +89506,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/event_channel.h linux-2.6.18-xen/include/xen/interface/event_channel.h
---- linux-2.6.18/include/xen/interface/event_channel.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/event_channel.h linux-2.6.18-xen/include/xen/interface/event_channel.h
+--- linux-2.6.18.1/include/xen/interface/event_channel.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/event_channel.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,233 @@
 +/******************************************************************************
@@ -87930,8 +89743,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/features.h linux-2.6.18-xen/include/xen/interface/features.h
---- linux-2.6.18/include/xen/interface/features.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/features.h linux-2.6.18-xen/include/xen/interface/features.h
+--- linux-2.6.18.1/include/xen/interface/features.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/features.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,53 @@
 +/******************************************************************************
@@ -87987,8 +89800,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/grant_table.h linux-2.6.18-xen/include/xen/interface/grant_table.h
---- linux-2.6.18/include/xen/interface/grant_table.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/grant_table.h linux-2.6.18-xen/include/xen/interface/grant_table.h
+--- linux-2.6.18.1/include/xen/interface/grant_table.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/grant_table.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,362 @@
 +/******************************************************************************
@@ -88353,8 +90166,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/hvm/e820.h linux-2.6.18-xen/include/xen/interface/hvm/e820.h
---- linux-2.6.18/include/xen/interface/hvm/e820.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/hvm/e820.h linux-2.6.18-xen/include/xen/interface/hvm/e820.h
+--- linux-2.6.18.1/include/xen/interface/hvm/e820.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/hvm/e820.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,32 @@
 +#ifndef __XEN_PUBLIC_HVM_E820_H__
@@ -88389,8 +90202,8 @@
 +#define HVM_BELOW_4G_MMIO_LENGTH    ((1ULL << 32) - HVM_BELOW_4G_MMIO_START)
 +
 +#endif /* __XEN_PUBLIC_HVM_E820_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/hvm/hvm_info_table.h linux-2.6.18-xen/include/xen/interface/hvm/hvm_info_table.h
---- linux-2.6.18/include/xen/interface/hvm/hvm_info_table.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/hvm/hvm_info_table.h linux-2.6.18-xen/include/xen/interface/hvm/hvm_info_table.h
+--- linux-2.6.18.1/include/xen/interface/hvm/hvm_info_table.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/hvm/hvm_info_table.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,22 @@
 +/******************************************************************************
@@ -88415,8 +90228,8 @@
 +};
 +
 +#endif /* __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/hvm/ioreq.h linux-2.6.18-xen/include/xen/interface/hvm/ioreq.h
---- linux-2.6.18/include/xen/interface/hvm/ioreq.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/hvm/ioreq.h linux-2.6.18-xen/include/xen/interface/hvm/ioreq.h
+--- linux-2.6.18.1/include/xen/interface/hvm/ioreq.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/hvm/ioreq.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,99 @@
 +/*
@@ -88518,8 +90331,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/hvm/params.h linux-2.6.18-xen/include/xen/interface/hvm/params.h
---- linux-2.6.18/include/xen/interface/hvm/params.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/hvm/params.h linux-2.6.18-xen/include/xen/interface/hvm/params.h
+--- linux-2.6.18.1/include/xen/interface/hvm/params.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/hvm/params.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,24 @@
 +#ifndef __XEN_PUBLIC_HVM_PARAMS_H__
@@ -88546,8 +90359,8 @@
 +DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t);
 +
 +#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/hvm/vmx_assist.h linux-2.6.18-xen/include/xen/interface/hvm/vmx_assist.h
---- linux-2.6.18/include/xen/interface/hvm/vmx_assist.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/hvm/vmx_assist.h linux-2.6.18-xen/include/xen/interface/hvm/vmx_assist.h
+--- linux-2.6.18.1/include/xen/interface/hvm/vmx_assist.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/hvm/vmx_assist.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,98 @@
 +/*
@@ -88648,8 +90461,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/io/blkif.h linux-2.6.18-xen/include/xen/interface/io/blkif.h
---- linux-2.6.18/include/xen/interface/io/blkif.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/io/blkif.h linux-2.6.18-xen/include/xen/interface/io/blkif.h
+--- linux-2.6.18.1/include/xen/interface/io/blkif.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/io/blkif.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,87 @@
 +/******************************************************************************
@@ -88739,8 +90552,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/io/console.h linux-2.6.18-xen/include/xen/interface/io/console.h
---- linux-2.6.18/include/xen/interface/io/console.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/io/console.h linux-2.6.18-xen/include/xen/interface/io/console.h
+--- linux-2.6.18.1/include/xen/interface/io/console.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/io/console.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,33 @@
 +/******************************************************************************
@@ -88776,8 +90589,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/io/netif.h linux-2.6.18-xen/include/xen/interface/io/netif.h
---- linux-2.6.18/include/xen/interface/io/netif.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/io/netif.h linux-2.6.18-xen/include/xen/interface/io/netif.h
+--- linux-2.6.18.1/include/xen/interface/io/netif.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/io/netif.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,166 @@
 +/******************************************************************************
@@ -88946,8 +90759,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/io/pciif.h linux-2.6.18-xen/include/xen/interface/io/pciif.h
---- linux-2.6.18/include/xen/interface/io/pciif.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/io/pciif.h linux-2.6.18-xen/include/xen/interface/io/pciif.h
+--- linux-2.6.18.1/include/xen/interface/io/pciif.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/io/pciif.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,55 @@
 +/*
@@ -89005,9 +90818,9 @@
 +};
 +
 +#endif /* __XEN_PCI_COMMON_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/io/ring.h linux-2.6.18-xen/include/xen/interface/io/ring.h
---- linux-2.6.18/include/xen/interface/io/ring.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/include/xen/interface/io/ring.h	2006-09-04 16:31:19.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/io/ring.h linux-2.6.18-xen/include/xen/interface/io/ring.h
+--- linux-2.6.18.1/include/xen/interface/io/ring.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/include/xen/interface/io/ring.h	2006-10-17 15:01:58.000000000 +0200
 @@ -0,0 +1,273 @@
 +/******************************************************************************
 + * ring.h
@@ -89036,7 +90849,7 @@
 + * power of two (so we can mask with (size-1) to loop around).
 + */
 +#define __RING_SIZE(_s, _sz) \
-+    (__RD32(((_sz) - (long)&(_s)->ring + (long)(_s)) / sizeof((_s)->ring[0])))
++    (__RD32(((_sz) - (long)(_s)->ring + (long)(_s)) / sizeof((_s)->ring[0])))
 +
 +/*
 + * Macros to make the correct C datatypes for a new kind of ring.
@@ -89282,8 +91095,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/io/tpmif.h linux-2.6.18-xen/include/xen/interface/io/tpmif.h
---- linux-2.6.18/include/xen/interface/io/tpmif.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/io/tpmif.h linux-2.6.18-xen/include/xen/interface/io/tpmif.h
+--- linux-2.6.18.1/include/xen/interface/io/tpmif.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/io/tpmif.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,59 @@
 +/******************************************************************************
@@ -89345,8 +91158,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/io/xenbus.h linux-2.6.18-xen/include/xen/interface/io/xenbus.h
---- linux-2.6.18/include/xen/interface/io/xenbus.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/io/xenbus.h linux-2.6.18-xen/include/xen/interface/io/xenbus.h
+--- linux-2.6.18.1/include/xen/interface/io/xenbus.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/io/xenbus.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,45 @@
 +/*****************************************************************************
@@ -89394,8 +91207,8 @@
 +typedef enum xenbus_state XenbusState;
 +
 +#endif /* _XEN_PUBLIC_IO_XENBUS_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/io/xs_wire.h linux-2.6.18-xen/include/xen/interface/io/xs_wire.h
---- linux-2.6.18/include/xen/interface/io/xs_wire.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/io/xs_wire.h linux-2.6.18-xen/include/xen/interface/io/xs_wire.h
+--- linux-2.6.18.1/include/xen/interface/io/xs_wire.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/io/xs_wire.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,97 @@
 +/*
@@ -89495,8 +91308,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/memory.h linux-2.6.18-xen/include/xen/interface/memory.h
---- linux-2.6.18/include/xen/interface/memory.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/memory.h linux-2.6.18-xen/include/xen/interface/memory.h
+--- linux-2.6.18.1/include/xen/interface/memory.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/memory.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,243 @@
 +/******************************************************************************
@@ -89742,8 +91555,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/nmi.h linux-2.6.18-xen/include/xen/interface/nmi.h
---- linux-2.6.18/include/xen/interface/nmi.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/nmi.h linux-2.6.18-xen/include/xen/interface/nmi.h
+--- linux-2.6.18.1/include/xen/interface/nmi.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/nmi.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,60 @@
 +/******************************************************************************
@@ -89806,8 +91619,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/physdev.h linux-2.6.18-xen/include/xen/interface/physdev.h
---- linux-2.6.18/include/xen/interface/physdev.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/physdev.h linux-2.6.18-xen/include/xen/interface/physdev.h
+--- linux-2.6.18.1/include/xen/interface/physdev.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/physdev.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,149 @@
 +
@@ -89959,8 +91772,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/platform.h linux-2.6.18-xen/include/xen/interface/platform.h
---- linux-2.6.18/include/xen/interface/platform.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/platform.h linux-2.6.18-xen/include/xen/interface/platform.h
+--- linux-2.6.18.1/include/xen/interface/platform.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/platform.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,125 @@
 +/******************************************************************************
@@ -90088,8 +91901,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/sched.h linux-2.6.18-xen/include/xen/interface/sched.h
---- linux-2.6.18/include/xen/interface/sched.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/sched.h linux-2.6.18-xen/include/xen/interface/sched.h
+--- linux-2.6.18.1/include/xen/interface/sched.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/sched.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,103 @@
 +/******************************************************************************
@@ -90195,8 +92008,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/sysctl.h linux-2.6.18-xen/include/xen/interface/sysctl.h
---- linux-2.6.18/include/xen/interface/sysctl.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/sysctl.h linux-2.6.18-xen/include/xen/interface/sysctl.h
+--- linux-2.6.18.1/include/xen/interface/sysctl.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/sysctl.h	2006-09-04 16:31:19.000000000 +0200
 @@ -0,0 +1,151 @@
 +/******************************************************************************
@@ -90350,8 +92163,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/trace.h linux-2.6.18-xen/include/xen/interface/trace.h
---- linux-2.6.18/include/xen/interface/trace.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/trace.h linux-2.6.18-xen/include/xen/interface/trace.h
+--- linux-2.6.18.1/include/xen/interface/trace.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/trace.h	2006-09-04 16:31:20.000000000 +0200
 @@ -0,0 +1,87 @@
 +/******************************************************************************
@@ -90441,8 +92254,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/vcpu.h linux-2.6.18-xen/include/xen/interface/vcpu.h
---- linux-2.6.18/include/xen/interface/vcpu.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/vcpu.h linux-2.6.18-xen/include/xen/interface/vcpu.h
+--- linux-2.6.18.1/include/xen/interface/vcpu.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/vcpu.h	2006-09-04 16:31:20.000000000 +0200
 @@ -0,0 +1,121 @@
 +/******************************************************************************
@@ -90566,8 +92379,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/version.h linux-2.6.18-xen/include/xen/interface/version.h
---- linux-2.6.18/include/xen/interface/version.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/version.h linux-2.6.18-xen/include/xen/interface/version.h
+--- linux-2.6.18.1/include/xen/interface/version.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/version.h	2006-09-04 16:31:20.000000000 +0200
 @@ -0,0 +1,73 @@
 +/******************************************************************************
@@ -90643,8 +92456,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/xencomm.h linux-2.6.18-xen/include/xen/interface/xencomm.h
---- linux-2.6.18/include/xen/interface/xencomm.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/xencomm.h linux-2.6.18-xen/include/xen/interface/xencomm.h
+--- linux-2.6.18.1/include/xen/interface/xencomm.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/xencomm.h	2006-09-04 16:31:20.000000000 +0200
 @@ -0,0 +1,37 @@
 +/*
@@ -90684,8 +92497,8 @@
 +};
 +
 +#endif /* _XEN_XENCOMM_H_ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/xen-compat.h linux-2.6.18-xen/include/xen/interface/xen-compat.h
---- linux-2.6.18/include/xen/interface/xen-compat.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/xen-compat.h linux-2.6.18-xen/include/xen/interface/xen-compat.h
+--- linux-2.6.18.1/include/xen/interface/xen-compat.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/xen-compat.h	2006-09-04 16:31:20.000000000 +0200
 @@ -0,0 +1,26 @@
 +/******************************************************************************
@@ -90714,8 +92527,8 @@
 +#endif
 +
 +#endif /* __XEN_PUBLIC_XEN_COMPAT_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/xen.h linux-2.6.18-xen/include/xen/interface/xen.h
---- linux-2.6.18/include/xen/interface/xen.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/xen.h linux-2.6.18-xen/include/xen/interface/xen.h
+--- linux-2.6.18.1/include/xen/interface/xen.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/xen.h	2006-09-21 01:33:32.000000000 +0200
 @@ -0,0 +1,581 @@
 +/******************************************************************************
@@ -91299,8 +93112,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/interface/xenoprof.h linux-2.6.18-xen/include/xen/interface/xenoprof.h
---- linux-2.6.18/include/xen/interface/xenoprof.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/interface/xenoprof.h linux-2.6.18-xen/include/xen/interface/xenoprof.h
+--- linux-2.6.18.1/include/xen/interface/xenoprof.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/interface/xenoprof.h	2006-09-21 01:33:32.000000000 +0200
 @@ -0,0 +1,110 @@
 +/******************************************************************************
@@ -91413,8 +93226,8 @@
 + * indent-tabs-mode: nil
 + * End:
 + */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/pcifront.h linux-2.6.18-xen/include/xen/pcifront.h
---- linux-2.6.18/include/xen/pcifront.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/pcifront.h linux-2.6.18-xen/include/xen/pcifront.h
+--- linux-2.6.18.1/include/xen/pcifront.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/pcifront.h	2006-09-04 16:31:20.000000000 +0200
 @@ -0,0 +1,76 @@
 +/*
@@ -91493,10 +93306,10 @@
 +#endif /* __KERNEL__ */
 +
 +#endif /* __XEN_ASM_PCIFRONT_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/public/evtchn.h linux-2.6.18-xen/include/xen/public/evtchn.h
---- linux-2.6.18/include/xen/public/evtchn.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.18-xen/include/xen/public/evtchn.h	2006-09-04 16:31:20.000000000 +0200
-@@ -0,0 +1,91 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/public/evtchn.h linux-2.6.18-xen/include/xen/public/evtchn.h
+--- linux-2.6.18.1/include/xen/public/evtchn.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.18-xen/include/xen/public/evtchn.h	2006-10-17 15:01:58.000000000 +0200
+@@ -0,0 +1,88 @@
 +/******************************************************************************
 + * evtchn.h
 + * 
@@ -91532,9 +93345,6 @@
 +#ifndef __LINUX_PUBLIC_EVTCHN_H__
 +#define __LINUX_PUBLIC_EVTCHN_H__
 +
-+/* /dev/xen/evtchn resides at device number major=10, minor=201 */
-+#define EVTCHN_MINOR 201
-+
 +/*
 + * Bind a fresh port to VIRQ @virq.
 + * Return allocated port.
@@ -91588,8 +93398,8 @@
 +	_IOC(_IOC_NONE, 'E', 5, 0)
 +
 +#endif /* __LINUX_PUBLIC_EVTCHN_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/public/privcmd.h linux-2.6.18-xen/include/xen/public/privcmd.h
---- linux-2.6.18/include/xen/public/privcmd.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/public/privcmd.h linux-2.6.18-xen/include/xen/public/privcmd.h
+--- linux-2.6.18.1/include/xen/public/privcmd.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/public/privcmd.h	2006-09-04 16:31:20.000000000 +0200
 @@ -0,0 +1,79 @@
 +/******************************************************************************
@@ -91671,8 +93481,8 @@
 +	_IOC(_IOC_NONE, 'P', 3, sizeof(privcmd_mmapbatch_t))
 +
 +#endif /* __LINUX_PUBLIC_PRIVCMD_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/xenbus.h linux-2.6.18-xen/include/xen/xenbus.h
---- linux-2.6.18/include/xen/xenbus.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/xenbus.h linux-2.6.18-xen/include/xen/xenbus.h
+--- linux-2.6.18.1/include/xen/xenbus.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/xenbus.h	2006-09-21 01:33:32.000000000 +0200
 @@ -0,0 +1,306 @@
 +/******************************************************************************
@@ -91981,8 +93791,8 @@
 +int xenbus_frontend_closed(struct xenbus_device *dev);
 +
 +#endif /* _XEN_XENBUS_H */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/xencons.h linux-2.6.18-xen/include/xen/xencons.h
---- linux-2.6.18/include/xen/xencons.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/xencons.h linux-2.6.18-xen/include/xen/xencons.h
+--- linux-2.6.18.1/include/xen/xencons.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/xencons.h	2006-09-21 01:33:32.000000000 +0200
 @@ -0,0 +1,17 @@
 +#ifndef __ASM_XENCONS_H__
@@ -92002,8 +93812,8 @@
 +int xencons_ring_send(const char *data, unsigned len);
 +
 +#endif /* __ASM_XENCONS_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/include/xen/xen_proc.h linux-2.6.18-xen/include/xen/xen_proc.h
---- linux-2.6.18/include/xen/xen_proc.h	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/include/xen/xen_proc.h linux-2.6.18-xen/include/xen/xen_proc.h
+--- linux-2.6.18.1/include/xen/xen_proc.h	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/include/xen/xen_proc.h	2006-09-04 16:31:20.000000000 +0200
 @@ -0,0 +1,12 @@
 +
@@ -92018,8 +93828,8 @@
 +	const char *name);
 +
 +#endif /* __ASM_XEN_PROC_H__ */
-diff -urN -x .hg -x .hgtags linux-2.6.18/kernel/fork.c linux-2.6.18-xen/kernel/fork.c
---- linux-2.6.18/kernel/fork.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/kernel/fork.c linux-2.6.18-xen/kernel/fork.c
+--- linux-2.6.18.1/kernel/fork.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/kernel/fork.c	2006-09-05 10:45:48.000000000 +0200
 @@ -276,6 +276,9 @@
  		if (retval)
@@ -92031,8 +93841,8 @@
  	retval = 0;
  out:
  	up_write(&mm->mmap_sem);
-diff -urN -x .hg -x .hgtags linux-2.6.18/kernel/irq/manage.c linux-2.6.18-xen/kernel/irq/manage.c
---- linux-2.6.18/kernel/irq/manage.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/kernel/irq/manage.c linux-2.6.18-xen/kernel/irq/manage.c
+--- linux-2.6.18.1/kernel/irq/manage.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/kernel/irq/manage.c	2006-09-04 16:31:20.000000000 +0200
 @@ -350,7 +350,6 @@
  	struct irqaction **p;
@@ -92042,8 +93852,8 @@
  	if (irq >= NR_IRQS)
  		return;
  
-diff -urN -x .hg -x .hgtags linux-2.6.18/kernel/Kconfig.preempt linux-2.6.18-xen/kernel/Kconfig.preempt
---- linux-2.6.18/kernel/Kconfig.preempt	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/kernel/Kconfig.preempt linux-2.6.18-xen/kernel/Kconfig.preempt
+--- linux-2.6.18.1/kernel/Kconfig.preempt	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/kernel/Kconfig.preempt	2006-09-04 16:31:20.000000000 +0200
 @@ -35,6 +35,7 @@
  
@@ -92053,8 +93863,8 @@
  	help
  	  This option reduces the latency of the kernel by making
  	  all kernel code (that is not executing in a critical section)
-diff -urN -x .hg -x .hgtags linux-2.6.18/lib/Kconfig.debug linux-2.6.18-xen/lib/Kconfig.debug
---- linux-2.6.18/lib/Kconfig.debug	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/lib/Kconfig.debug linux-2.6.18-xen/lib/Kconfig.debug
+--- linux-2.6.18.1/lib/Kconfig.debug	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/lib/Kconfig.debug	2006-09-04 16:31:20.000000000 +0200
 @@ -325,7 +325,7 @@
  
@@ -92065,21 +93875,19 @@
  	depends on !MODULES || !(MIPS || PPC || SUPERH || V850)
  	help
  	  If you say Y here the resulting kernel image will be slightly larger
-diff -urN -x .hg -x .hgtags linux-2.6.18/lib/Makefile linux-2.6.18-xen/lib/Makefile
---- linux-2.6.18/lib/Makefile	2006-09-20 05:42:06.000000000 +0200
-+++ linux-2.6.18-xen/lib/Makefile	2006-09-21 01:33:32.000000000 +0200
-@@ -52,6 +52,9 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/lib/Makefile linux-2.6.18-xen/lib/Makefile
+--- linux-2.6.18.1/lib/Makefile	2006-09-20 05:42:06.000000000 +0200
++++ linux-2.6.18-xen/lib/Makefile	2006-10-17 15:01:59.000000000 +0200
+@@ -52,6 +52,7 @@
  obj-$(CONFIG_AUDIT_GENERIC) += audit.o
  
  obj-$(CONFIG_SWIOTLB) += swiotlb.o
-+ifneq ($(CONFIG_XEN_IA64_DOM0_NON_VP),y)
 +swiotlb-$(CONFIG_XEN) := ../arch/i386/kernel/swiotlb.o
-+endif
  
  hostprogs-y	:= gen_crc32table
  clean-files	:= crc32table.h
-diff -urN -x .hg -x .hgtags linux-2.6.18/mm/highmem.c linux-2.6.18-xen/mm/highmem.c
---- linux-2.6.18/mm/highmem.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/mm/highmem.c linux-2.6.18-xen/mm/highmem.c
+--- linux-2.6.18.1/mm/highmem.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/mm/highmem.c	2006-09-04 16:31:20.000000000 +0200
 @@ -142,6 +142,17 @@
  	return vaddr;
@@ -92099,10 +93907,18 @@
  void fastcall *kmap_high(struct page *page)
  {
  	unsigned long vaddr;
-diff -urN -x .hg -x .hgtags linux-2.6.18/mm/Kconfig linux-2.6.18-xen/mm/Kconfig
---- linux-2.6.18/mm/Kconfig	2006-09-20 05:42:06.000000000 +0200
-+++ linux-2.6.18-xen/mm/Kconfig	2006-09-04 16:31:20.000000000 +0200
-@@ -127,11 +127,14 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/mm/Kconfig linux-2.6.18-xen/mm/Kconfig
+--- linux-2.6.18.1/mm/Kconfig	2006-09-20 05:42:06.000000000 +0200
++++ linux-2.6.18-xen/mm/Kconfig	2006-09-22 16:38:35.000000000 +0200
+@@ -116,7 +116,6 @@
+ config MEMORY_HOTPLUG
+ 	bool "Allow for memory hot-add"
+ 	depends on SPARSEMEM && HOTPLUG && !SOFTWARE_SUSPEND && ARCH_ENABLE_MEMORY_HOTPLUG
+-	depends on (IA64 || X86 || PPC64)
+ 
+ comment "Memory hotplug is currently incompatible with Software Suspend"
+ 	depends on SPARSEMEM && HOTPLUG && SOFTWARE_SUSPEND
+@@ -127,11 +126,14 @@
  # Default to 4 for wider testing, though 8 might be more appropriate.
  # ARM's adjust_pte (unused if VIPT) depends on mm-wide page_table_lock.
  # PA-RISC 7xxx's spinlock_t would enlarge struct page from 32 to 44 bytes.
@@ -92117,19 +93933,28 @@
  	default "4"
  
  #
-diff -urN -x .hg -x .hgtags linux-2.6.18/mm/memory.c linux-2.6.18-xen/mm/memory.c
---- linux-2.6.18/mm/memory.c	2006-09-20 05:42:06.000000000 +0200
-+++ linux-2.6.18-xen/mm/memory.c	2006-09-04 16:31:20.000000000 +0200
-@@ -390,7 +390,7 @@
- 
- 	if (unlikely(vma->vm_flags & VM_PFNMAP)) {
- 		unsigned long off = (addr - vma->vm_start) >> PAGE_SHIFT;
--		if (pfn == vma->vm_pgoff + off)
-+		if ((pfn == vma->vm_pgoff + off) || !pfn_valid(pfn))
- 			return NULL;
- 		if (!is_cow_mapping(vma->vm_flags))
- 			return NULL;
-@@ -1030,6 +1030,26 @@
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/mm/memory.c linux-2.6.18-xen/mm/memory.c
+--- linux-2.6.18.1/mm/memory.c	2006-09-20 05:42:06.000000000 +0200
++++ linux-2.6.18-xen/mm/memory.c	2006-10-17 15:01:59.000000000 +0200
+@@ -403,7 +403,8 @@
+ 	 * and that the resulting page looks ok.
+ 	 */
+ 	if (unlikely(!pfn_valid(pfn))) {
+-		print_bad_pte(vma, pte, addr);
++		if (!(vma->vm_flags & VM_RESERVED))
++			print_bad_pte(vma, pte, addr);
+ 		return NULL;
+ 	}
+ 
+@@ -891,6 +892,7 @@
+ 		tlb_finish_mmu(tlb, address, end);
+ 	return end;
+ }
++EXPORT_SYMBOL(zap_page_range);
+ 
+ /*
+  * Do a quick page-table lookup for a single page.
+@@ -1030,6 +1032,26 @@
  			continue;
  		}
  
@@ -92156,7 +93981,7 @@
  		if (!vma || (vma->vm_flags & (VM_IO | VM_PFNMAP))
  				|| !(vm_flags & vma->vm_flags))
  			return i ? : -EFAULT;
-@@ -1369,6 +1389,102 @@
+@@ -1369,6 +1391,102 @@
  }
  EXPORT_SYMBOL(remap_pfn_range);
  
@@ -92259,8 +94084,8 @@
  /*
   * handle_pte_fault chooses page fault handler according to an entry
   * which was read non-atomically.  Before making any commitment, on
-diff -urN -x .hg -x .hgtags linux-2.6.18/mm/mmap.c linux-2.6.18-xen/mm/mmap.c
---- linux-2.6.18/mm/mmap.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/mm/mmap.c linux-2.6.18-xen/mm/mmap.c
+--- linux-2.6.18.1/mm/mmap.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/mm/mmap.c	2006-09-21 01:33:32.000000000 +0200
 @@ -1963,6 +1963,10 @@
  	unsigned long nr_accounted = 0;
@@ -92273,9 +94098,9 @@
  	lru_add_drain();
  	flush_cache_mm(mm);
  	tlb = tlb_gather_mmu(mm, 1);
-diff -urN -x .hg -x .hgtags linux-2.6.18/mm/page_alloc.c linux-2.6.18-xen/mm/page_alloc.c
---- linux-2.6.18/mm/page_alloc.c	2006-09-20 05:42:06.000000000 +0200
-+++ linux-2.6.18-xen/mm/page_alloc.c	2006-09-04 16:31:20.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/mm/page_alloc.c linux-2.6.18-xen/mm/page_alloc.c
+--- linux-2.6.18.1/mm/page_alloc.c	2006-10-19 11:01:25.000000000 +0200
++++ linux-2.6.18-xen/mm/page_alloc.c	2006-10-17 15:01:59.000000000 +0200
 @@ -443,7 +443,8 @@
  	int i;
  	int reserved = 0;
@@ -92296,9 +94121,9 @@
  
  	if (PageAnon(page))
  		page->mapping = NULL;
-diff -urN -x .hg -x .hgtags linux-2.6.18/net/core/dev.c linux-2.6.18-xen/net/core/dev.c
---- linux-2.6.18/net/core/dev.c	2006-09-20 05:42:06.000000000 +0200
-+++ linux-2.6.18-xen/net/core/dev.c	2006-09-04 16:31:20.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/net/core/dev.c linux-2.6.18-xen/net/core/dev.c
+--- linux-2.6.18.1/net/core/dev.c	2006-10-19 11:01:25.000000000 +0200
++++ linux-2.6.18-xen/net/core/dev.c	2006-10-17 15:01:59.000000000 +0200
 @@ -118,6 +118,12 @@
  #include <linux/err.h>
  #include <linux/ctype.h>
@@ -92369,7 +94194,7 @@
  	/* GSO will handle the following emulations directly. */
  	if (netif_needs_gso(dev, skb))
  		goto gso;
-@@ -1796,6 +1845,19 @@
+@@ -1798,6 +1847,19 @@
  	}
  #endif
  
@@ -92389,7 +94214,7 @@
  	list_for_each_entry_rcu(ptype, &ptype_all, list) {
  		if (!ptype->dev || ptype->dev == skb->dev) {
  			if (pt_prev) 
-@@ -3582,6 +3644,7 @@
+@@ -3584,6 +3646,7 @@
  EXPORT_SYMBOL(net_enable_timestamp);
  EXPORT_SYMBOL(net_disable_timestamp);
  EXPORT_SYMBOL(dev_get_flags);
@@ -92397,8 +94222,8 @@
  
  #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
  EXPORT_SYMBOL(br_handle_frame_hook);
-diff -urN -x .hg -x .hgtags linux-2.6.18/net/core/skbuff.c linux-2.6.18-xen/net/core/skbuff.c
---- linux-2.6.18/net/core/skbuff.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/net/core/skbuff.c linux-2.6.18-xen/net/core/skbuff.c
+--- linux-2.6.18.1/net/core/skbuff.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/net/core/skbuff.c	2006-09-04 16:31:21.000000000 +0200
 @@ -139,6 +139,7 @@
   *	Buffers may only be allocated from interrupts using a @gfp_mask of
@@ -92470,8 +94295,8 @@
  	C(pkt_type);
  	C(ip_summed);
  	C(priority);
-diff -urN -x .hg -x .hgtags linux-2.6.18/net/ipv4/netfilter/ip_nat_proto_tcp.c linux-2.6.18-xen/net/ipv4/netfilter/ip_nat_proto_tcp.c
---- linux-2.6.18/net/ipv4/netfilter/ip_nat_proto_tcp.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/net/ipv4/netfilter/ip_nat_proto_tcp.c linux-2.6.18-xen/net/ipv4/netfilter/ip_nat_proto_tcp.c
+--- linux-2.6.18.1/net/ipv4/netfilter/ip_nat_proto_tcp.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/net/ipv4/netfilter/ip_nat_proto_tcp.c	2006-09-04 16:31:22.000000000 +0200
 @@ -129,7 +129,12 @@
  	if (hdrsize < sizeof(*hdr))
@@ -92487,8 +94312,8 @@
  					ip_nat_cheat_check(oldport ^ 0xFFFF,
  							   newport,
  							   hdr->check));
-diff -urN -x .hg -x .hgtags linux-2.6.18/net/ipv4/netfilter/ip_nat_proto_udp.c linux-2.6.18-xen/net/ipv4/netfilter/ip_nat_proto_udp.c
---- linux-2.6.18/net/ipv4/netfilter/ip_nat_proto_udp.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/net/ipv4/netfilter/ip_nat_proto_udp.c linux-2.6.18-xen/net/ipv4/netfilter/ip_nat_proto_udp.c
+--- linux-2.6.18.1/net/ipv4/netfilter/ip_nat_proto_udp.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/net/ipv4/netfilter/ip_nat_proto_udp.c	2006-09-04 16:31:22.000000000 +0200
 @@ -114,7 +114,12 @@
  		portptr = &hdr->dest;
@@ -92504,8 +94329,8 @@
  					ip_nat_cheat_check(*portptr ^ 0xFFFF,
  							   newport,
  							   hdr->check));
-diff -urN -x .hg -x .hgtags linux-2.6.18/net/ipv4/xfrm4_output.c linux-2.6.18-xen/net/ipv4/xfrm4_output.c
---- linux-2.6.18/net/ipv4/xfrm4_output.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/net/ipv4/xfrm4_output.c linux-2.6.18-xen/net/ipv4/xfrm4_output.c
+--- linux-2.6.18.1/net/ipv4/xfrm4_output.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/net/ipv4/xfrm4_output.c	2006-09-04 16:31:23.000000000 +0200
 @@ -18,6 +18,8 @@
  #include <net/xfrm.h>
@@ -92527,8 +94352,8 @@
  	if (skb->ip_summed == CHECKSUM_HW) {
  		err = skb_checksum_help(skb, 0);
  		if (err)
-diff -urN -x .hg -x .hgtags linux-2.6.18/net/ipv6/addrconf.c linux-2.6.18-xen/net/ipv6/addrconf.c
---- linux-2.6.18/net/ipv6/addrconf.c	2006-09-20 05:42:06.000000000 +0200
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/net/ipv6/addrconf.c linux-2.6.18-xen/net/ipv6/addrconf.c
+--- linux-2.6.18.1/net/ipv6/addrconf.c	2006-09-20 05:42:06.000000000 +0200
 +++ linux-2.6.18-xen/net/ipv6/addrconf.c	2006-09-04 16:31:23.000000000 +0200
 @@ -2514,6 +2514,7 @@
  	spin_lock_bh(&ifp->lock);
@@ -92546,8 +94371,8 @@
  	    (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
  		struct in6_addr all_routers;
  
-diff -urN -x .hg -x .hgtags linux-2.6.18/scripts/Makefile.xen linux-2.6.18-xen/scripts/Makefile.xen
---- linux-2.6.18/scripts/Makefile.xen	1970-01-01 01:00:00.000000000 +0100
+diff -urN -x .hg -x .hgtags linux-2.6.18.1/scripts/Makefile.xen linux-2.6.18-xen/scripts/Makefile.xen
+--- linux-2.6.18.1/scripts/Makefile.xen	1970-01-01 01:00:00.000000000 +0100
 +++ linux-2.6.18-xen/scripts/Makefile.xen	2006-09-04 16:31:23.000000000 +0200
 @@ -0,0 +1,14 @@
 +

Modified: dists/trunk/linux-2.6/debian/patches/series/1-extra
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1-extra	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/1-extra	Thu Oct 19 09:08:49 2006
@@ -1,5 +1,4 @@
 + debian/vserver-version.patch *_vserver *_xen-vserver
-+ features/all/vserver/vs2.0.2.1-t8.patch *_vserver *_xen-vserver
 + mips-tulip.patch mipsel
 + mips-tulip_dc21143.patch mipsel
 + mips-dec-scsi.patch mipsel

Modified: dists/trunk/linux-2.6/debian/patches/series/2-extra
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/2-extra	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/2-extra	Thu Oct 19 09:08:49 2006
@@ -1,6 +1,4 @@
 + hppa.patch hppa
-+ features/all/xen/vserver-clash.patch *_xen-vserver
-+ features/all/xen/fedora-36175.patch *_xen *_xen-vserver
 + m68k-2.6.18.patch m68k
 + m68k-as.patch m68k
 + m68k-macro.patch m68k

Modified: dists/trunk/linux-2.6/debian/patches/series/3-extra
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/3-extra	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/3-extra	Thu Oct 19 09:08:49 2006
@@ -1,5 +1,5 @@
 + hppa-fix-cross-compile.patch hppa
-- features/all/vserver/vs2.0.2.1-t8.patch *_vserver *_xen-vserver
 + features/all/vserver/vs2.0.2.2-rc2.patch *_vserver *_xen-vserver
 + features/all/vserver/bindmount-dev.patch *_vserver *_xen-vserver
-
++ features/all/xen/vserver-clash.patch *_xen-vserver
++ features/all/xen/fedora-36252.patch *_xen *_xen-vserver



More information about the Kernel-svn-changes mailing list