]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.25/patches.xen/xen3-patch-2.6.27
Updated xen patches taken from suse.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.xen / xen3-patch-2.6.27
similarity index 92%
rename from src/patches/60036_xen3-patch-2.6.27.patch1
rename to src/patches/suse-2.6.27.25/patches.xen/xen3-patch-2.6.27
index 6df6f6e68246159cc595e1c751860e9a7fb094e7..8b91cdf7f1f1ac256794535e18ef2a1ffdad3dd7 100644 (file)
@@ -7,11 +7,9 @@ Patch-mainline: 2.6.27
 Acked-by: Jeff Mahoney <jeffm@suse.com>
 Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches.py
 
-Index: head-2008-12-01/arch/x86/Kconfig
-===================================================================
---- head-2008-12-01.orig/arch/x86/Kconfig      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/Kconfig   2008-12-01 11:49:07.000000000 +0100
-@@ -590,7 +590,7 @@ config CALGARY_IOMMU_ENABLED_BY_DEFAULT
+--- sle11-2009-06-04.orig/arch/x86/Kconfig     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/Kconfig  2009-06-04 10:21:39.000000000 +0200
+@@ -594,7 +594,7 @@ config CALGARY_IOMMU_ENABLED_BY_DEFAULT
  config AMD_IOMMU
        bool "AMD IOMMU support"
        select SWIOTLB
@@ -20,18 +18,18 @@ Index: head-2008-12-01/arch/x86/Kconfig
        help
          With this option you can enable support for AMD IOMMU hardware in
          your system. An IOMMU is a hardware component which provides
-@@ -625,8 +625,10 @@ config MAXSMP
+@@ -629,8 +629,10 @@ config MAXSMP
  
  config NR_CPUS
-       int "Maximum number of CPUs (2-512)" if !MAXSMP
+       int "Maximum number of CPUs (2-4096)"
 +      range 2 32 if XEN
-       range 2 512
+       range 2 4096
        depends on SMP
 +      default "32" if MAXSMP && XEN
        default "4096" if MAXSMP
        default "32" if X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000
        default "16" if X86_64_XEN
-@@ -1223,7 +1225,7 @@ config MTRR
+@@ -1227,7 +1229,7 @@ config MTRR
  config MTRR_SANITIZER
        bool
        prompt "MTRR cleanup support"
@@ -40,10 +38,8 @@ Index: head-2008-12-01/arch/x86/Kconfig
        help
          Convert MTRR layout from continuous to discrete, so X drivers can
          add writeback entries.
-Index: head-2008-12-01/arch/x86/Kconfig.debug
-===================================================================
---- head-2008-12-01.orig/arch/x86/Kconfig.debug        2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/arch/x86/Kconfig.debug     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/Kconfig.debug       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/arch/x86/Kconfig.debug    2009-06-04 10:21:39.000000000 +0200
 @@ -25,6 +25,7 @@ config STRICT_DEVMEM
  config X86_VERBOSE_BOOTUP
        bool "Enable verbose x86 bootup info messages"
@@ -52,7 +48,7 @@ Index: head-2008-12-01/arch/x86/Kconfig.debug
        help
          Enables the informational output from the decompression stage
          (e.g. bzImage) of the boot. If you disable this you will still
-@@ -166,7 +167,7 @@ config MMIOTRACE_HOOKS
+@@ -179,7 +180,7 @@ config MMIOTRACE_HOOKS
  
  config MMIOTRACE
        bool "Memory mapped IO tracing"
@@ -61,10 +57,8 @@ Index: head-2008-12-01/arch/x86/Kconfig.debug
        select TRACING
        select MMIOTRACE_HOOKS
        help
-Index: head-2008-12-01/arch/x86/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/Makefile     2008-12-01 11:36:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/Makefile  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/Makefile    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-06-04/arch/x86/Makefile 2009-06-04 10:21:39.000000000 +0200
 @@ -116,8 +116,8 @@ mflags-$(CONFIG_X86_VOYAGER)       := -Iinclud
  mcore-$(CONFIG_X86_VOYAGER)   := arch/x86/mach-voyager/
  
@@ -87,10 +81,8 @@ Index: head-2008-12-01/arch/x86/Makefile
  
  KBUILD_CFLAGS += $(mflags-y)
  KBUILD_AFLAGS += $(mflags-y)
-Index: head-2008-12-01/arch/x86/ia32/ia32entry-xen.S
-===================================================================
---- head-2008-12-01.orig/arch/x86/ia32/ia32entry-xen.S 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/ia32/ia32entry-xen.S      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/ia32/ia32entry-xen.S     2009-06-04 10:21:39.000000000 +0200
 @@ -15,6 +15,16 @@
  #include <asm/irqflags.h>
  #include <linux/linkage.h>
@@ -336,10 +328,8 @@ Index: head-2008-12-01/arch/x86/ia32/ia32entry-xen.S
 +      .quad sys_pipe2
 +      .quad sys_inotify_init1
  ia32_syscall_end:
-Index: head-2008-12-01/arch/x86/kernel/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/Makefile      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/Makefile   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/Makefile     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/Makefile  2009-06-04 10:21:39.000000000 +0200
 @@ -120,9 +120,10 @@ ifeq ($(CONFIG_X86_64),y)
  
          obj-$(CONFIG_PCI_MMCONFIG)    += mmconf-fam10h_64.o
@@ -349,15 +339,13 @@ Index: head-2008-12-01/arch/x86/kernel/Makefile
        time_64-$(CONFIG_XEN)           += time_32.o
  endif
  
--disabled-obj-$(CONFIG_XEN) := early-quirks.o hpet.o i8253.o i8259_$(BITS).o \
+-disabled-obj-$(CONFIG_XEN) := crash.o early-quirks.o hpet.o i8253.o i8259_$(BITS).o \
 -      pci-swiotlb_64.o reboot.o smpboot.o tlb_$(BITS).o tsc_$(BITS).o tsc_sync.o vsmp_64.o
-+disabled-obj-$(CONFIG_XEN) := bios_uv.o early-quirks.o hpet.o i8253.o \
++disabled-obj-$(CONFIG_XEN) := %_uv.o crash.o early-quirks.o hpet.o i8253.o \
 +      i8259.o irqinit_$(BITS).o pci-swiotlb_64.o reboot.o smpboot.o \
 +      tlb_$(BITS).o tsc.o tsc_sync.o vsmp_64.o
-Index: head-2008-12-01/arch/x86/kernel/acpi/boot.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/acpi/boot.c   2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/acpi/boot.c        2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/acpi/boot.c  2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/acpi/boot.c       2009-06-04 10:21:39.000000000 +0200
 @@ -951,7 +951,9 @@ void __init mp_register_ioapic(int id, u
        mp_ioapics[idx].mp_flags = MPC_APIC_USABLE;
        mp_ioapics[idx].mp_apicaddr = address;
@@ -395,10 +383,8 @@ Index: head-2008-12-01/arch/x86/kernel/acpi/boot.c
        /*
         * For GSI >= 64, use IRQ compression
         */
-Index: head-2008-12-01/arch/x86/kernel/acpi/sleep-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/acpi/sleep-xen.c      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/acpi/sleep-xen.c   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/acpi/sleep-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/acpi/sleep-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -9,6 +9,7 @@
  #include <linux/bootmem.h>
  #include <linux/dmi.h>
@@ -483,10 +469,8 @@ Index: head-2008-12-01/arch/x86/kernel/acpi/sleep-xen.c
                str = strchr(str, ',');
                if (str != NULL)
                        str += strspn(str, ", \t");
-Index: head-2008-12-01/arch/x86/kernel/apic_32-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/apic_32-xen.c 2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/apic_32-xen.c      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/apic_32-xen.c        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/apic_32-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -59,7 +59,10 @@ static cpumask_t timer_bcast_ipi;
  /*
   * Debug level, exported for io_apic.c
@@ -499,10 +483,8 @@ Index: head-2008-12-01/arch/x86/kernel/apic_32-xen.c
  
  #ifndef CONFIG_XEN
  static int modern_apic(void)
-Index: head-2008-12-01/arch/x86/kernel/apic_64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/apic_64-xen.c 2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/apic_64-xen.c      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/apic_64-xen.c        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/apic_64-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -39,7 +39,10 @@ int disable_apic;
  /*
   * Debug level, exported for io_apic.c
@@ -515,10 +497,8 @@ Index: head-2008-12-01/arch/x86/kernel/apic_64-xen.c
  
  /*
   * The guts of the apic timer interrupt
-Index: head-2008-12-01/arch/x86/kernel/asm-offsets_64.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/asm-offsets_64.c      2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/asm-offsets_64.c   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/asm-offsets_64.c     2008-11-25 12:35:54.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/asm-offsets_64.c  2009-06-04 10:21:39.000000000 +0200
 @@ -138,7 +138,7 @@ int main(void)
  
        BLANK();
@@ -528,10 +508,8 @@ Index: head-2008-12-01/arch/x86/kernel/asm-offsets_64.c
        BLANK();
        OFFSET(XEN_vcpu_info_mask, vcpu_info, evtchn_upcall_mask);
        OFFSET(XEN_vcpu_info_pending, vcpu_info, evtchn_upcall_pending);
-Index: head-2008-12-01/arch/x86/kernel/cpu/amd_64.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/cpu/amd_64.c  2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/cpu/amd_64.c       2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/cpu/amd_64.c 2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/arch/x86/kernel/cpu/amd_64.c      2009-06-04 10:21:39.000000000 +0200
 @@ -193,6 +193,7 @@ static void __cpuinit init_amd(struct cp
                fam10h_check_enable_mmcfg();
        }
@@ -548,10 +526,8 @@ Index: head-2008-12-01/arch/x86/kernel/cpu/amd_64.c
  }
  
  static struct cpu_dev amd_cpu_dev __cpuinitdata = {
-Index: head-2008-12-01/arch/x86/kernel/cpu/bugs_64.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/cpu/bugs_64.c 2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/cpu/bugs_64.c      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/cpu/bugs_64.c        2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/arch/x86/kernel/cpu/bugs_64.c     2009-06-04 10:21:39.000000000 +0200
 @@ -20,6 +20,7 @@ void __init check_bugs(void)
  #endif
        alternative_instructions();
@@ -566,10 +542,8 @@ Index: head-2008-12-01/arch/x86/kernel/cpu/bugs_64.c
                set_memory_4k((unsigned long)__va(0), 1);
 +#endif
  }
-Index: head-2008-12-01/arch/x86/kernel/cpu/common-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/cpu/common-xen.c      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/cpu/common-xen.c   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/cpu/common-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/cpu/common-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -13,6 +13,7 @@
  #include <asm/mtrr.h>
  #include <asm/mce.h>
@@ -632,10 +606,8 @@ Index: head-2008-12-01/arch/x86/kernel/cpu/common-xen.c
  
        if (!have_cpuid_p()) {
                /*
-Index: head-2008-12-01/arch/x86/kernel/cpu/common_64-xen.c
-===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-12-01/arch/x86/kernel/cpu/common_64-xen.c        2008-12-01 11:49:07.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/cpu/common_64-xen.c       2009-06-04 10:21:39.000000000 +0200
 @@ -0,0 +1,771 @@
 +#include <linux/init.h>
 +#include <linux/kernel.h>
@@ -1245,7 +1217,7 @@ Index: head-2008-12-01/arch/x86/kernel/cpu/common_64-xen.c
 +#ifdef CONFIG_IA32_EMULATION
 +      syscall32_cpu_init();
 +#else
-+      static /*const*/ struct callback_register __cpuinitdata cstar = {
++      static const struct callback_register __cpuinitconst cstar = {
 +              .type = CALLBACKTYPE_syscall32,
 +              .address = (unsigned long)ignore_sysret
 +      };
@@ -1408,11 +1380,9 @@ Index: head-2008-12-01/arch/x86/kernel/cpu/common_64-xen.c
 +      if (is_uv_system())
 +              uv_cpu_init();
 +}
-Index: head-2008-12-01/arch/x86/kernel/e820-xen.c
-===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-12-01/arch/x86/kernel/e820-xen.c 2008-12-01 11:49:07.000000000 +0100
-@@ -0,0 +1,1470 @@
++++ sle11-2009-06-04/arch/x86/kernel/e820-xen.c        2009-06-04 10:21:39.000000000 +0200
+@@ -0,0 +1,1545 @@
 +/*
 + * Handle the memory map.
 + * The functions here do the job until bootmem takes over.
@@ -1458,9 +1428,11 @@ Index: head-2008-12-01/arch/x86/kernel/e820-xen.c
 + * next kernel with full memory.
 + */
 +struct e820map e820;
++#ifndef CONFIG_XEN
 +struct e820map e820_saved;
-+#ifdef CONFIG_XEN
++#else
 +static struct e820map machine_e820;
++#define e820_saved machine_e820
 +#endif
 +
 +/* For PCI or other memory-mapped resources */
@@ -1858,7 +1830,7 @@ Index: head-2008-12-01/arch/x86/kernel/e820-xen.c
 +                                      u64 size, unsigned old_type,
 +                                      unsigned new_type)
 +{
-+      int i;
++      unsigned int i, x;
 +      u64 real_updated_size = 0;
 +
 +      BUG_ON(old_type == new_type);
@@ -1866,7 +1838,7 @@ Index: head-2008-12-01/arch/x86/kernel/e820-xen.c
 +      if (size > (ULLONG_MAX - start))
 +              size = ULLONG_MAX - start;
 +
-+      for (i = 0; i < e820.nr_map; i++) {
++      for (i = 0; i < e820x->nr_map; i++) {
 +              struct e820entry *ei = &e820x->map[i];
 +              u64 final_start, final_end;
 +              if (ei->type != old_type)
@@ -1883,14 +1855,23 @@ Index: head-2008-12-01/arch/x86/kernel/e820-xen.c
 +              final_end = min(start + size, ei->addr + ei->size);
 +              if (final_start >= final_end)
 +                      continue;
-+              e820_add_region(final_start, final_end - final_start,
-+                                       new_type);
++
++              x = e820x->nr_map;
++              if (x == ARRAY_SIZE(e820x->map)) {
++                      printk(KERN_ERR "Too many memory map entries!\n");
++                      break;
++              }
++              e820x->map[x].addr = final_start;
++              e820x->map[x].size = final_end - final_start;
++              e820x->map[x].type = new_type;
++              e820x->nr_map++;
++
 +              real_updated_size += final_end - final_start;
 +
-+              ei->size -= final_end - final_start;
 +              if (ei->addr < final_start)
 +                      continue;
 +              ei->addr = final_end;
++              ei->size -= final_end - final_start;
 +      }
 +      return real_updated_size;
 +}
@@ -1904,6 +1885,12 @@ Index: head-2008-12-01/arch/x86/kernel/e820-xen.c
 +static u64 __init e820_update_range_saved(u64 start, u64 size,
 +                                        unsigned old_type, unsigned new_type)
 +{
++#ifdef CONFIG_XEN
++      if (is_initial_xendomain())
++              return e820_update_range_map(&machine_e820,
++                                           phys_to_machine(start), size,
++                                           old_type, new_type);
++#endif
 +      return e820_update_range_map(&e820_saved, start, size, old_type,
 +                                   new_type);
 +}
@@ -2035,7 +2022,7 @@ Index: head-2008-12-01/arch/x86/kernel/e820-xen.c
 +                     "address range\n"
 +                     KERN_ERR "PCI: Unassigned devices with 32bit resource "
 +                     "registers may break!\n");
-+              found  = e820_search_gap(&gapstart, &gapsize, MAX_GAP_END, 0);
++              found = e820_search_gap(&gapstart, &gapsize, MAX_GAP_END, 0);
 +              BUG_ON(!found);
 +      }
 +#endif
@@ -2465,8 +2452,8 @@ Index: head-2008-12-01/arch/x86/kernel/e820-xen.c
 +                      continue;
 +              return addr;
 +      }
-+      return -1UL;
 +
++      return -1ULL;
 +}
 +
 +/*
@@ -2477,15 +2464,71 @@ Index: head-2008-12-01/arch/x86/kernel/e820-xen.c
 +      u64 size = 0;
 +      u64 addr;
 +      u64 start;
++#ifdef CONFIG_XEN
++      unsigned int order = get_order(sizet);
 +
-+      start = startt;
-+      while (size < sizet)
++      if (is_initial_xendomain()) {
++              sizet = PAGE_SIZE << order;
++              if (align < PAGE_SIZE)
++                      align = PAGE_SIZE;
++      }
++#endif
++      for (start = startt; ; start += size) {
 +              start = find_e820_area_size(start, &size, align);
++              if (!(start + 1))
++                      return 0;
++              if (size >= sizet)
++                      break;
++      }
 +
-+      if (size < sizet)
++#ifdef CONFIG_X86_32
++      if (start >= MAXMEM)
++              return 0;
++      if (start + size > MAXMEM)
++              size = MAXMEM - start;
++#endif
++#ifdef CONFIG_XEN
++      if ((start >> PAGE_SHIFT) >= xen_start_info->nr_pages)
 +              return 0;
++      if (PFN_UP(start + size) > xen_start_info->nr_pages)
++              size = ((u64)xen_start_info->nr_pages << PAGE_SHIFT) - start;
++#endif
 +
 +      addr = round_down(start + size - sizet, align);
++      if (addr < start)
++              return 0;
++#ifdef CONFIG_XEN
++      if (is_initial_xendomain()) {
++              int rc;
++              unsigned long max_initmap_pfn;
++
++              max_initmap_pfn = ALIGN(PFN_UP(__pa(xen_start_info->pt_base))
++                                             + xen_start_info->nr_pt_frames
++                                             + 1 + (1 << (19 - PAGE_SHIFT)),
++                                      1UL << (22 - PAGE_SHIFT));
++#ifdef CONFIG_X86_32
++              if ((addr >> PAGE_SHIFT)
++                  < max(max_initmap_pfn, max_pfn_mapped))
++                      rc = xen_create_contiguous_region((unsigned long)
++                                                        __va(addr),
++                                                        order, 32);
++#else
++              if ((addr >> PAGE_SHIFT) < max_pfn_mapped)
++                      rc = xen_create_contiguous_region((unsigned long)
++                                                        __va(addr),
++                                                        order, 32);
++              else if ((addr >> PAGE_SHIFT) < max_initmap_pfn)
++                      rc = xen_create_contiguous_region(__START_KERNEL_map
++                                                        + addr,
++                                                        order, 32);
++#endif
++              else
++                      rc = early_create_contiguous_region(addr >> PAGE_SHIFT,
++                                                          order, 32);
++              if (rc)
++                      return 0;
++      }
++#endif
 +      e820_update_range(addr, sizet, E820_RAM, E820_RESERVED);
 +      e820_update_range_saved(addr, sizet, E820_RAM, E820_RESERVED);
 +      printk(KERN_INFO "update e820 for early_reserve_e820\n");
@@ -2867,8 +2910,7 @@ Index: head-2008-12-01/arch/x86/kernel/e820-xen.c
 +              if (HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap))
 +                      BUG();
 +              machine_e820.nr_map = memmap.nr_entries;
-+      } else
-+              machine_e820 = e820;
++      }
 +#endif
 +
 +      return "Xen";
@@ -2879,13 +2921,14 @@ Index: head-2008-12-01/arch/x86/kernel/e820-xen.c
 +      char *who;
 +
 +      who = memory_setup();
-+      memcpy(&e820_saved, &e820, sizeof(struct e820map));
++#ifdef CONFIG_XEN
++      if (!is_initial_xendomain())
++#endif
++              memcpy(&e820_saved, &e820, sizeof(struct e820map));
 +      printk(KERN_INFO "Xen-provided physical RAM map:\n");
 +      e820_print_map(who);
 +}
-Index: head-2008-12-01/arch/x86/kernel/e820_32-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/e820_32-xen.c 2008-12-01 11:44:55.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/e820_32-xen.c        2009-03-16 16:38:05.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,873 +0,0 @@
 -#include <linux/kernel.h>
@@ -3761,9 +3804,7 @@ Index: head-2008-12-01/arch/x86/kernel/e820_32-xen.c
 -      print_memory_map("modified");
 -}
 -#endif
-Index: head-2008-12-01/arch/x86/kernel/e820_64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/e820_64-xen.c 2008-12-01 11:44:55.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/e820_64-xen.c        2009-03-16 16:38:05.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,1045 +0,0 @@
 -/*
@@ -4811,10 +4852,8 @@ Index: head-2008-12-01/arch/x86/kernel/e820_64-xen.c
 -              max_pfn << PAGE_SHIFT) - *addr;
 -      return i + 1;
 -}
-Index: head-2008-12-01/arch/x86/kernel/early_printk-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/early_printk-xen.c    2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/early_printk-xen.c 2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/early_printk-xen.c   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/early_printk-xen.c        2009-06-04 10:21:39.000000000 +0200
 @@ -225,7 +225,7 @@ static struct console simnow_console = {
  static struct console *early_console = &early_vga_console;
  static int early_console_initialized;
@@ -4824,10 +4863,8 @@ Index: head-2008-12-01/arch/x86/kernel/early_printk-xen.c
  {
        char buf[512];
        int n;
-Index: head-2008-12-01/arch/x86/kernel/entry_32-xen.S
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/entry_32-xen.S        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/entry_32-xen.S     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/entry_32-xen.S       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/entry_32-xen.S    2009-06-04 10:21:39.000000000 +0200
 @@ -51,15 +51,26 @@
  #include <asm/percpu.h>
  #include <asm/dwarf2.h>
@@ -4991,7 +5028,7 @@ Index: head-2008-12-01/arch/x86/kernel/entry_32-xen.S
        jmp resume_userspace
  END(syscall_exit_work)
        CFI_ENDPROC
-@@ -1109,10 +1147,10 @@ ENTRY(native_iret)
+@@ -1113,10 +1151,10 @@ ENTRY(native_iret)
  .previous
  END(native_iret)
  
@@ -5004,7 +5041,7 @@ Index: head-2008-12-01/arch/x86/kernel/entry_32-xen.S
  #endif
  
  KPROBE_ENTRY(int3)
-@@ -1261,6 +1299,77 @@ ENTRY(kernel_thread_helper)
+@@ -1265,6 +1303,77 @@ ENTRY(kernel_thread_helper)
        CFI_ENDPROC
  ENDPROC(kernel_thread_helper)
  
@@ -5082,7 +5119,7 @@ Index: head-2008-12-01/arch/x86/kernel/entry_32-xen.S
  #include <asm/alternative-asm.h>
  
        # pv syscall call handler stub
-@@ -1286,7 +1395,7 @@ ENTRY(ia32pv_cstar_target)
+@@ -1290,7 +1399,7 @@ ENTRY(ia32pv_cstar_target)
  .previous
        SAVE_ALL
        GET_THREAD_INFO(%ebp)
@@ -5091,7 +5128,7 @@ Index: head-2008-12-01/arch/x86/kernel/entry_32-xen.S
        jnz cstar_trace_entry
        cmpl $nr_syscalls,%eax
        jae cstar_badsys
-@@ -1320,29 +1429,21 @@ cstar_trace_entry:
+@@ -1324,29 +1433,21 @@ cstar_trace_entry:
        btl %eax,cstar_special
        jc .Lcstar_trace_special
  1:    movl %esp,%eax
@@ -5125,10 +5162,8 @@ Index: head-2008-12-01/arch/x86/kernel/entry_32-xen.S
        cmpl $nr_syscalls,%eax
        jb syscall_call
        jmp syscall_exit
-Index: head-2008-12-01/arch/x86/kernel/entry_64.S
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/entry_64.S    2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/entry_64.S 2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/entry_64.S   2009-06-04 00:00:00.000000000 +0200
++++ sle11-2009-06-04/arch/x86/kernel/entry_64.S        2009-06-04 10:21:39.000000000 +0200
 @@ -1409,7 +1409,7 @@ ENTRY(arch_unwind_init_running)
  ENDPROC(arch_unwind_init_running)
  #endif
@@ -5138,16 +5173,17 @@ Index: head-2008-12-01/arch/x86/kernel/entry_64.S
  ENTRY(xen_hypervisor_callback)
        zeroentry xen_do_hypervisor_callback
  END(xen_hypervisor_callback)
-@@ -1507,4 +1507,4 @@ ENTRY(xen_failsafe_callback)
+@@ -1507,7 +1507,7 @@ ENTRY(xen_failsafe_callback)
        CFI_ENDPROC
  END(xen_failsafe_callback)
  
 -#endif /* CONFIG_XEN */
 +#endif /* CONFIG_PARAVIRT_XEN */
-Index: head-2008-12-01/arch/x86/kernel/entry_64-xen.S
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/entry_64-xen.S        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/entry_64-xen.S     2008-12-01 11:49:07.000000000 +0100
+ #ifdef        CONFIG_KDB
+--- sle11-2009-06-04.orig/arch/x86/kernel/entry_64-xen.S       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/entry_64-xen.S    2009-06-04 10:21:39.000000000 +0200
 @@ -53,19 +53,130 @@
  #include <asm/hw_irq.h>
  #include <asm/page.h>
@@ -5601,10 +5637,18 @@ Index: head-2008-12-01/arch/x86/kernel/entry_64-xen.S
        pushq $0
        CFI_ADJUST_CFA_OFFSET 8 
        paranoidentry do_machine_check
-Index: head-2008-12-01/arch/x86/kernel/genapic_64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/genapic_64-xen.c      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/genapic_64-xen.c   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/fixup.c      2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/fixup.c   2009-06-04 10:21:39.000000000 +0200
+@@ -33,6 +33,7 @@
+ #include <linux/kernel.h>
+ #include <linux/delay.h>
+ #include <linux/version.h>
++#include <asm/traps.h>
+ #define DP(_f, _args...) printk(KERN_ALERT "  " _f "\n" , ## _args )
+--- sle11-2009-06-04.orig/arch/x86/kernel/genapic_64-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/genapic_64-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -58,7 +58,7 @@ void __init setup_apic_routing(void)
        else
  #endif
@@ -5620,10 +5664,8 @@ Index: head-2008-12-01/arch/x86/kernel/genapic_64-xen.c
  }
 +EXPORT_SYMBOL_GPL(is_uv_system);
  #endif
-Index: head-2008-12-01/arch/x86/kernel/genapic_xen_64.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/genapic_xen_64.c      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/genapic_xen_64.c   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/genapic_xen_64.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/genapic_xen_64.c  2009-06-04 10:21:39.000000000 +0200
 @@ -43,7 +43,7 @@ void xen_send_IPI_shortcut(unsigned int 
                __send_IPI_one(smp_processor_id(), vector);
                break;
@@ -5702,10 +5744,8 @@ Index: head-2008-12-01/arch/x86/kernel/genapic_xen_64.c
        ebx = cpuid_ebx(1);
        return ((ebx >> 24) & 0xFF) >> index_msb;
  }
-Index: head-2008-12-01/arch/x86/kernel/head-xen.c
-===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-12-01/arch/x86/kernel/head-xen.c 2008-12-01 11:49:07.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/head-xen.c        2009-06-04 10:21:39.000000000 +0200
 @@ -0,0 +1,57 @@
 +#include <linux/kernel.h>
 +#include <linux/init.h>
@@ -5764,10 +5804,8 @@ Index: head-2008-12-01/arch/x86/kernel/head-xen.c
 +      reserve_early_overlap_ok(lowmem, 0x100000, "BIOS reserved");
 +#endif
 +}
-Index: head-2008-12-01/arch/x86/kernel/head32-xen.c
-===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-12-01/arch/x86/kernel/head32-xen.c       2008-12-01 11:49:07.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/head32-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -0,0 +1,57 @@
 +/*
 + *  linux/arch/i386/kernel/head32.c -- prepare to run common code
@@ -5826,10 +5864,8 @@ Index: head-2008-12-01/arch/x86/kernel/head32-xen.c
 +
 +      start_kernel();
 +}
-Index: head-2008-12-01/arch/x86/kernel/head64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/head64-xen.c  2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/head64-xen.c       2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/head64-xen.c 2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/head64-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -32,7 +32,26 @@
  #include <asm/e820.h>
  #include <asm/bios_ebda.h>
@@ -5990,10 +6026,8 @@ Index: head-2008-12-01/arch/x86/kernel/head64-xen.c
  
        /*
         * At this point everything still needed from the boot loader
-Index: head-2008-12-01/arch/x86/kernel/head_64-xen.S
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/head_64-xen.S 2008-12-01 11:36:47.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/head_64-xen.S      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/head_64-xen.S        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/head_64-xen.S     2009-06-04 10:21:39.000000000 +0200
 @@ -95,53 +95,6 @@ NEXT_PAGE(hypercall_page)
  
  #undef NEXT_PAGE
@@ -6048,10 +6082,8 @@ Index: head-2008-12-01/arch/x86/kernel/head_64-xen.S
        .section .bss.page_aligned, "aw", @nobits
        .align PAGE_SIZE
  ENTRY(empty_zero_page)
-Index: head-2008-12-01/arch/x86/kernel/io_apic_32-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/io_apic_32-xen.c      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/io_apic_32-xen.c   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/io_apic_32-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/io_apic_32-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -25,6 +25,7 @@
  #include <linux/init.h>
  #include <linux/delay.h>
@@ -7675,10 +7707,8 @@ Index: head-2008-12-01/arch/x86/kernel/io_apic_32-xen.c
 +      }
 +}
 +#endif
-Index: head-2008-12-01/arch/x86/kernel/io_apic_64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/io_apic_64-xen.c      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/io_apic_64-xen.c   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/io_apic_64-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -45,6 +45,7 @@
  #include <asm/proto.h>
  #include <asm/acpi.h>
@@ -8442,10 +8472,8 @@ Index: head-2008-12-01/arch/x86/kernel/io_apic_64-xen.c
                } else {
                        ioapic_phys = (unsigned long)
                                alloc_bootmem_pages(PAGE_SIZE);
-Index: head-2008-12-01/arch/x86/kernel/ipi-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/ipi-xen.c     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/ipi-xen.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/ipi-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/ipi-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -8,7 +8,6 @@
  #include <linux/kernel_stat.h>
  #include <linux/mc146818rtc.h>
@@ -8481,10 +8509,8 @@ Index: head-2008-12-01/arch/x86/kernel/ipi-xen.c
  }
  #endif
  
-Index: head-2008-12-01/arch/x86/kernel/irq_32-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/irq_32-xen.c  2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/irq_32-xen.c       2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/irq_32-xen.c 2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/irq_32-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -48,6 +48,29 @@ void ack_bad_irq(unsigned int irq)
  #endif
  }
@@ -8806,10 +8832,8 @@ Index: head-2008-12-01/arch/x86/kernel/irq_32-xen.c
  #ifdef CONFIG_HOTPLUG_CPU
  
  void fixup_irqs(cpumask_t map)
-Index: head-2008-12-01/arch/x86/kernel/irq_64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/irq_64-xen.c  2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/irq_64-xen.c       2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/irq_64-xen.c 2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/irq_64-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -163,6 +163,34 @@ skip:
  }
  
@@ -8845,10 +8869,8 @@ Index: head-2008-12-01/arch/x86/kernel/irq_64-xen.c
   * do_IRQ handles all normal device IRQ's (the special
   * SMP cross-CPU interrupts have their own specific
   * handlers).
-Index: head-2008-12-01/arch/x86/kernel/ldt-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/ldt-xen.c     2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/ldt-xen.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/ldt-xen.c    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/ldt-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -20,9 +20,9 @@
  #include <asm/mmu_context.h>
  
@@ -8883,10 +8905,19 @@ Index: head-2008-12-01/arch/x86/kernel/ldt-xen.c
                preempt_enable();
  #endif
        }
-Index: head-2008-12-01/arch/x86/kernel/microcode-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/microcode-xen.c       2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/microcode-xen.c    2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/machine_kexec_32.c   2008-11-25 12:35:53.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/machine_kexec_32.c        2009-06-04 10:21:39.000000000 +0200
+@@ -68,6 +68,8 @@ void machine_kexec_setup_load_arg(xen_ke
+       xki->page_list[PA_PTE_0] = __ma(kexec_pte0);
+       xki->page_list[PA_PTE_1] = __ma(kexec_pte1);
++      if (image->type == KEXEC_TYPE_DEFAULT)
++              xki->page_list[PA_SWAP_PAGE] = page_to_phys(image->swap_page);
+ }
+ int __init machine_kexec_setup_resources(struct resource *hypervisor,
+--- sle11-2009-06-04.orig/arch/x86/kernel/microcode-xen.c      2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/microcode-xen.c   2009-06-04 10:21:39.000000000 +0200
 @@ -5,13 +5,14 @@
   *                  2006      Shaohua Li <shaohua.li@intel.com>
   *
@@ -8951,10 +8982,8 @@ Index: head-2008-12-01/arch/x86/kernel/microcode-xen.c
        return 0;
  }
  
-Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/mpparse-xen.c 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/mpparse-xen.c      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/mpparse-xen.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/mpparse-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -25,6 +25,9 @@
  #include <asm/proto.h>
  #include <asm/acpi.h>
@@ -8965,7 +8994,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
  
  #include <mach_apic.h>
  #ifdef CONFIG_X86_32
-@@ -32,28 +35,6 @@
+@@ -32,27 +35,10 @@
  #include <mach_mpparse.h>
  #endif
  
@@ -8990,11 +9019,14 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 -/*
 - * Intel MP BIOS table parsing routines:
 - */
--
++static void *_bus_to_virt(unsigned long ma)
++{
++      return is_ISA_range(ma, ma) ? isa_bus_to_virt(ma) : bus_to_virt(ma);
++}
  /*
   * Checksum an MP configuration block.
-  */
-@@ -68,20 +49,8 @@ static int __init mpf_checksum(unsigned 
+@@ -68,19 +54,7 @@ static int __init mpf_checksum(unsigned 
        return sum & 0xFF;
  }
  
@@ -9010,13 +9042,12 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 -    __cpuinitdata;
 -#endif
 -
- #ifndef CONFIG_XEN
 -static void __cpuinit MP_processor_info(struct mpc_config_processor *m)
 +static void __init MP_processor_info(struct mpc_config_processor *m)
  {
+ #ifndef CONFIG_XEN
        int apicid;
-       char *bootup_cpu = "";
-@@ -90,11 +59,12 @@ static void __cpuinit MP_processor_info(
+@@ -90,11 +64,12 @@ static void __cpuinit MP_processor_info(
                disabled_cpus++;
                return;
        }
@@ -9034,16 +9065,9 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
        if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
                bootup_cpu = " (Bootup-CPU)";
                boot_cpu_physical_apicid = m->mpc_apicid;
-@@ -104,24 +74,23 @@ static void __cpuinit MP_processor_info(
-       generic_processor_info(apicid, m->mpc_apicver);
- }
- #else
--static void __cpuinit MP_processor_info(struct mpc_config_processor *m)
-+static void __init MP_processor_info(struct mpc_config_processor *m)
- {
-       num_processors++;
+@@ -107,18 +82,17 @@ static void __cpuinit MP_processor_info(
+ #endif
  }
- #endif /* CONFIG_XEN */
  
 +#ifdef CONFIG_X86_IO_APIC
  static void __init MP_bus_info(struct mpc_config_bus *m)
@@ -9065,7 +9089,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
  
  #if MAX_MP_BUSSES < 256
        if (m->mpc_busid >= MAX_MP_BUSSES) {
-@@ -138,12 +107,10 @@ static void __init MP_bus_info(struct mp
+@@ -135,12 +109,10 @@ static void __init MP_bus_info(struct mp
                mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
  #endif
        } else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI) - 1) == 0) {
@@ -9081,7 +9105,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
  #if defined(CONFIG_EISA) || defined (CONFIG_MCA)
                mp_bus_id_to_type[m->mpc_busid] = MP_BUS_PCI;
        } else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA) - 1) == 0) {
-@@ -154,6 +121,7 @@ static void __init MP_bus_info(struct mp
+@@ -151,6 +123,7 @@ static void __init MP_bus_info(struct mp
        } else
                printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str);
  }
@@ -9089,7 +9113,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
  
  #ifdef CONFIG_X86_IO_APIC
  
-@@ -183,117 +151,111 @@ static void __init MP_ioapic_info(struct
+@@ -180,117 +153,111 @@ static void __init MP_ioapic_info(struct
        if (bad_ioapic(m->mpc_apicaddr))
                return;
  
@@ -9189,12 +9213,12 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 +              return 6;
 +      if (mp_irq->mp_dstirq != m->mpc_dstirq)
 +              return 7;
-+
-+      return 0;
-+}
  
 -static void __init smp_read_mpc_oem(struct mp_config_oemtable *oemtable,
 -                                  unsigned short oemsize)
++      return 0;
++}
++
 +static void __init MP_intsrc_info(struct mpc_config_intsrc *m)
  {
 -      int count = sizeof(*oemtable);  /* the header size */
@@ -9281,7 +9305,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
  
        if (memcmp(mpc->mpc_signature, MPC_SIGNATURE, 4)) {
                printk(KERN_ERR "MPTABLE: bad signature [%c%c%c%c]!\n",
-@@ -316,19 +278,41 @@ static int __init smp_read_mpc(struct mp
+@@ -313,19 +280,41 @@ static int __init smp_read_mpc(struct mp
        }
        memcpy(oem, mpc->mpc_oem, 8);
        oem[8] = 0;
@@ -9329,7 +9353,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
        /* save the local APIC address, it might be non-default */
        if (!acpi_lapic)
                mp_lapic_addr = mpc->mpc_lapic;
-@@ -336,12 +320,17 @@ static int __init smp_read_mpc(struct mp
+@@ -333,12 +322,17 @@ static int __init smp_read_mpc(struct mp
        if (early)
                return 1;
  
@@ -9350,7 +9374,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
        while (count < mpc->mpc_length) {
                switch (*mpt) {
                case MP_PROCESSOR:
-@@ -359,7 +348,9 @@ static int __init smp_read_mpc(struct mp
+@@ -356,7 +350,9 @@ static int __init smp_read_mpc(struct mp
                        {
                                struct mpc_config_bus *m =
                                    (struct mpc_config_bus *)mpt;
@@ -9360,7 +9384,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
                                mpt += sizeof(*m);
                                count += sizeof(*m);
                                break;
-@@ -405,10 +396,14 @@ static int __init smp_read_mpc(struct mp
+@@ -402,10 +398,14 @@ static int __init smp_read_mpc(struct mp
                        count = mpc->mpc_length;
                        break;
                }
@@ -9378,7 +9402,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
        setup_apic_routing();
        if (!num_processors)
                printk(KERN_ERR "MPTABLE: no processors registered!\n");
-@@ -434,7 +429,7 @@ static void __init construct_default_ioi
+@@ -431,7 +431,7 @@ static void __init construct_default_ioi
        intsrc.mpc_type = MP_INTSRC;
        intsrc.mpc_irqflag = 0; /* conforming */
        intsrc.mpc_srcbus = 0;
@@ -9387,7 +9411,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
  
        intsrc.mpc_irqtype = mp_INT;
  
-@@ -495,40 +490,11 @@ static void __init construct_default_ioi
+@@ -492,40 +492,11 @@ static void __init construct_default_ioi
        MP_intsrc_info(&intsrc);
  }
  
@@ -9430,7 +9454,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
  
        bus.mpc_type = MP_BUS;
        bus.mpc_busid = 0;
-@@ -557,7 +523,6 @@ static inline void __init construct_defa
+@@ -554,7 +525,6 @@ static inline void __init construct_defa
                MP_bus_info(&bus);
        }
  
@@ -9438,7 +9462,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
        ioapic.mpc_type = MP_IOAPIC;
        ioapic.mpc_apicid = 2;
        ioapic.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
-@@ -569,7 +534,42 @@ static inline void __init construct_defa
+@@ -566,7 +536,42 @@ static inline void __init construct_defa
         * We set up most of the low 16 IO-APIC pins according to MPS rules.
         */
        construct_default_ioirq_mptable(mpc_default_type);
@@ -9481,7 +9505,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
        lintsrc.mpc_type = MP_LINTSRC;
        lintsrc.mpc_irqflag = 0;        /* conforming */
        lintsrc.mpc_srcbusid = 0;
-@@ -587,10 +587,14 @@ static struct intel_mp_floating *mpf_fou
+@@ -584,10 +589,14 @@ static struct intel_mp_floating *mpf_fou
  /*
   * Scan the memory blocks for an SMP configuration block.
   */
@@ -9497,7 +9521,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
        if (acpi_lapic && early)
                return;
        /*
-@@ -607,7 +611,7 @@ static void __init __get_smp_config(unsi
+@@ -604,7 +613,7 @@ static void __init __get_smp_config(unsi
  
        printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n",
               mpf->mpf_specification);
@@ -9506,18 +9530,24 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
        if (mpf->mpf_feature2 & (1 << 7)) {
                printk(KERN_INFO "    IMCR and PIC compatibility mode.\n");
                pic_mode = 1;
-@@ -639,7 +643,9 @@ static void __init __get_smp_config(unsi
+@@ -635,8 +644,10 @@ static void __init __get_smp_config(unsi
+                * Read the physical hardware table.  Anything here will
                 * override the defaults.
                 */
-               if (!smp_read_mpc(isa_bus_to_virt(mpf->mpf_physptr), early)) {
+-              if (!smp_read_mpc(isa_bus_to_virt(mpf->mpf_physptr), early)) {
++              if (!smp_read_mpc(_bus_to_virt(mpf->mpf_physptr), early)) {
 +#ifdef CONFIG_X86_LOCAL_APIC
                        smp_found_config = 0;
 +#endif
                        printk(KERN_ERR
                               "BIOS bug, MP table errors detected!...\n");
                        printk(KERN_ERR "... disabling SMP support. "
-@@ -696,7 +702,8 @@ static int __init smp_scan_config(unsign
-       unsigned int *bp = isa_bus_to_virt(base);
+@@ -690,10 +701,11 @@ void __init get_smp_config(void)
+ static int __init smp_scan_config(unsigned long base, unsigned long length,
+                                 unsigned reserve)
+ {
+-      unsigned int *bp = isa_bus_to_virt(base);
++      unsigned int *bp = _bus_to_virt(base);
        struct intel_mp_floating *mpf;
  
 -      Dprintk("Scan SMP from %p for %ld bytes.\n", bp, length);
@@ -9526,7 +9556,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
        BUILD_BUG_ON(sizeof(*mpf) != 16);
  
        while (length > 0) {
-@@ -706,16 +713,22 @@ static int __init smp_scan_config(unsign
+@@ -703,16 +715,22 @@ static int __init smp_scan_config(unsign
                    !mpf_checksum((unsigned char *)bp, 16) &&
                    ((mpf->mpf_specification == 1)
                     || (mpf->mpf_specification == 4))) {
@@ -9552,7 +9582,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
                                /*
                                 * We cannot access to MPC table to compute
                                 * table size yet, as only few megabytes from
-@@ -725,27 +738,18 @@ static int __init smp_scan_config(unsign
+@@ -722,27 +740,18 @@ static int __init smp_scan_config(unsign
                                 * PAGE_SIZE from mpg->mpf_physptr yields BUG()
                                 * in reserve_bootmem.
                                 */
@@ -9567,8 +9597,8 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
                        }
  #else
                        printk(KERN_INFO "found SMP MP-table at [%p] %08lx\n",
-                               mpf, ((void *)bp - isa_bus_to_virt(base)) + base);
- #endif
+-                              mpf, ((void *)bp - isa_bus_to_virt(base)) + base);
+-#endif
 -#elif !defined(CONFIG_XEN)
 -                      if (!reserve)
 -                              return 1;
@@ -9577,13 +9607,14 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 -                      if (mpf->mpf_physptr)
 -                              reserve_bootmem_generic(mpf->mpf_physptr,
 -                                                      PAGE_SIZE);
--#endif
++                              mpf, ((void *)bp - _bus_to_virt(base)) + base);
+ #endif
 -              return 1;
 +                      return 1;
                }
                bp += 4;
                length -= 16;
-@@ -753,10 +757,15 @@ static int __init smp_scan_config(unsign
+@@ -750,12 +759,16 @@ static int __init smp_scan_config(unsign
        return 0;
  }
  
@@ -9592,15 +9623,16 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
  {
  #ifndef CONFIG_XEN
        unsigned int address;
-+
+ #endif
 +      if (x86_quirks->mach_find_smp_config) {
 +              if (x86_quirks->mach_find_smp_config(reserve))
 +                      return;
 +      }
- #endif
        /*
-@@ -805,300 +814,301 @@ void __init find_smp_config(void)
+        * FIXME: Linux assumes you have 640K of base ram..
+        * this continues the error...
+@@ -802,300 +815,297 @@ void __init find_smp_config(void)
        __find_smp_config(1);
  }
  
@@ -9743,12 +9775,12 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
  
 -#ifndef CONFIG_XEN
 -      set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
-+                              printk(KERN_INFO "OLD ");
++                              apic_printk(APIC_VERBOSE, "OLD ");
 +                              print_MP_intsrc_info(m);
 +                              i = get_MP_intsrc_index(m);
 +                              if (i > 0) {
 +                                      assign_to_mpc_intsrc(&mp_irqs[i], m);
-+                                      printk(KERN_INFO "NEW ");
++                                      apic_printk(APIC_VERBOSE, "NEW ");
 +                                      print_mp_irq_info(&mp_irqs[i]);
 +                              } else if (!i) {
 +                                      /* legacy, do nothing */
@@ -9801,7 +9833,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 +                      continue;
 +
 +              if (nr_m_spare > 0) {
-+                      printk(KERN_INFO "*NEW* found ");
++                      apic_printk(APIC_VERBOSE, "*NEW* found\n");
 +                      nr_m_spare--;
 +                      assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]);
 +                      m_spare[nr_m_spare] = NULL;
@@ -9897,7 +9929,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 +      alloc_mptable = 1;
 +      if (!p)
 +              return 0;
-+      mpc_new_length = PAGE_SIZE << get_order(memparse(p, &p));
++      mpc_new_length = memparse(p, &p);
 +      return 0;
  }
 +early_param("alloc_mptable", parse_alloc_mptable_opt);
@@ -9915,7 +9947,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 -       */
 -      mp_bus_id_to_type[MP_ISA_BUS] = MP_BUS_ISA;
 +      if (enable_update_mptable && alloc_mptable) {
-+              u64 startt = PAGE_SIZE;
++              u64 startt = 0;
 +#ifdef CONFIG_X86_TRAMPOLINE
 +              startt = TRAMPOLINE_BASE;
  #endif
@@ -9972,8 +10004,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 -              intsrc.mpc_dstirq = i;
 -
 -              MP_intsrc_info(&intsrc);
-+              mpc_new_phys = early_reserve_e820(startt, mpc_new_length,
-+                                                mpc_new_length);
++              mpc_new_phys = early_reserve_e820(startt, mpc_new_length, 4);
        }
  }
  
@@ -10019,7 +10050,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 -      /* Don't set up the ACPI SCI because it's already set up */
 -      if (acpi_gbl_FADT.sci_interrupt == gsi)
 -              return gsi;
-+      mpc = isa_bus_to_virt(mpf->mpf_physptr);
++      mpc = _bus_to_virt(mpf->mpf_physptr);
  
 -      ioapic = mp_find_ioapic(gsi);
 -      if (ioapic < 0) {
@@ -10030,7 +10061,7 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 +              return 0;
  
 -      ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
-+      printk(KERN_INFO "mpf: %lx\n", virt_to_phys(mpf));
++      printk(KERN_INFO "mpf: %lx\n", (long)arbitrary_virt_to_machine(mpf));
 +      printk(KERN_INFO "mpf_physptr: %x\n", mpf->mpf_physptr);
  
 -#ifndef CONFIG_X86_32
@@ -10077,9 +10108,6 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 -#else
 -              return gsi;
 -#endif
-+              if (xen_create_contiguous_region((unsigned long)phys_to_virt(mpc_new_phys),
-+                                               get_order(mpc_new_length), 32))
-+                      BUG();
 +              mpc_new_bus = phys_to_machine(mpc_new_phys);
 +              mpf->mpf_physptr = mpc_new_bus;
 +              mpc_new = phys_to_virt(mpc_new_phys);
@@ -10152,10 +10180,8 @@ Index: head-2008-12-01/arch/x86/kernel/mpparse-xen.c
 -#endif /* CONFIG_X86_IO_APIC */
 -#endif /* CONFIG_ACPI */
 +late_initcall(update_mp_table);
-Index: head-2008-12-01/arch/x86/kernel/nmi.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/nmi.c 2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/nmi.c      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/nmi.c        2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/arch/x86/kernel/nmi.c     2009-06-04 10:21:39.000000000 +0200
 @@ -27,7 +27,9 @@
  #include <linux/kdebug.h>
  #include <linux/smp.h>
@@ -10177,10 +10203,8 @@ Index: head-2008-12-01/arch/x86/kernel/nmi.c
  #ifdef CONFIG_X86_32
        timer_ack = 0;
  #endif
-Index: head-2008-12-01/arch/x86/kernel/pci-dma-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/pci-dma-xen.c 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/pci-dma-xen.c      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/pci-dma-xen.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/pci-dma-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -5,13 +5,13 @@
  
  #include <asm/proto.h>
@@ -10536,10 +10560,8 @@ Index: head-2008-12-01/arch/x86/kernel/pci-dma-xen.c
  
        no_iommu_init();
        return 0;
-Index: head-2008-12-01/arch/x86/kernel/pci-nommu-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/pci-nommu-xen.c       2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/pci-nommu-xen.c    2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/pci-nommu-xen.c      2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/pci-nommu-xen.c   2009-06-04 10:21:39.000000000 +0200
 @@ -79,18 +79,12 @@ gnttab_unmap_single(struct device *dev, 
        gnttab_dma_unmap_page(dma_addr);
  }
@@ -10560,10 +10582,8 @@ Index: head-2008-12-01/arch/x86/kernel/pci-nommu-xen.c
  };
  
  void __init no_iommu_init(void)
-Index: head-2008-12-01/arch/x86/kernel/probe_roms_32.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/probe_roms_32.c       2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/probe_roms_32.c    2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/probe_roms_32.c      2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/arch/x86/kernel/probe_roms_32.c   2009-06-04 10:21:39.000000000 +0200
 @@ -99,6 +99,11 @@ void __init probe_roms(void)
        unsigned char c;
        int i;
@@ -10585,10 +10605,8 @@ Index: head-2008-12-01/arch/x86/kernel/probe_roms_32.c
        if (romsignature(rom)) {
                length = extension_rom_resource.end - extension_rom_resource.start + 1;
                if (romchecksum(rom, length)) {
-Index: head-2008-12-01/arch/x86/kernel/process-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/process-xen.c 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/process-xen.c      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/process-xen.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/process-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -6,6 +6,13 @@
  #include <linux/sched.h>
  #include <linux/module.h>
@@ -10879,10 +10897,8 @@ Index: head-2008-12-01/arch/x86/kernel/process-xen.c
                return -1;
  
        boot_option_idle_override = 1;
-Index: head-2008-12-01/arch/x86/kernel/process_32-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/process_32-xen.c      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/process_32-xen.c   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/process_32-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/process_32-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -59,15 +59,11 @@
  #include <asm/tlbflush.h>
  #include <asm/cpu.h>
@@ -10986,10 +11002,8 @@ Index: head-2008-12-01/arch/x86/kernel/process_32-xen.c
                }
                tick_nohz_restart_sched_tick();
                preempt_enable_no_resched();
-Index: head-2008-12-01/arch/x86/kernel/process_64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/process_64-xen.c      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/process_64-xen.c   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/process_64-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/process_64-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -65,15 +65,6 @@ asmlinkage extern void ret_from_fork(voi
  
  unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED;
@@ -11172,10 +11186,8 @@ Index: head-2008-12-01/arch/x86/kernel/process_64-xen.c
                        if (gsindex)
                                rdmsrl(MSR_KERNEL_GS_BASE, base);
                        else
-Index: head-2008-12-01/arch/x86/kernel/quirks-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/quirks-xen.c  2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/quirks-xen.c       2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/quirks-xen.c 2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/quirks-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -63,6 +63,7 @@ static enum {
        ICH_FORCE_HPET_RESUME,
        VT8237_FORCE_HPET_RESUME,
@@ -11297,11 +11309,9 @@ Index: head-2008-12-01/arch/x86/kernel/quirks-xen.c
        default:
                break;
        }
-Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/setup-xen.c   2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/setup-xen.c        2008-12-01 11:49:07.000000000 +0100
-@@ -1,141 +1,1147 @@
+--- sle11-2009-06-04.orig/arch/x86/kernel/setup-xen.c  2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/setup-xen.c       2009-06-04 10:21:39.000000000 +0200
+@@ -1,141 +1,1131 @@
 -#include <linux/kernel.h>
 +/*
 + *  Copyright (C) 1995  Linus Torvalds
@@ -11524,7 +11534,7 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +EXPORT_SYMBOL(boot_cpu_data);
 +#ifndef CONFIG_XEN
 +static void set_mca_bus(int x)
- {
++{
 +#ifdef CONFIG_MCA
 +      MCA_bus = x;
 +#endif
@@ -11592,8 +11602,7 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +#ifdef CONFIG_EDD_MODULE
 +EXPORT_SYMBOL(edd);
 +#endif
- #ifndef CONFIG_XEN
--      int cpu;
++#ifndef CONFIG_XEN
 +/**
 + * copy_edd() - Copy the BIOS EDD information
 + *              from boot_params into a safe place.
@@ -11683,20 +11692,14 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +#endif
 +
 +static void __init reserve_initrd(void)
-+{
-+#ifndef CONFIG_XEN
+ {
+ #ifndef CONFIG_XEN
+-      int cpu;
 +      u64 ramdisk_image = boot_params.hdr.ramdisk_image;
 +      u64 ramdisk_size  = boot_params.hdr.ramdisk_size;
 +      u64 ramdisk_end   = ramdisk_image + ramdisk_size;
 +      u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT;
--      for_each_possible_cpu(cpu) {
--              per_cpu(x86_cpu_to_apicid, cpu) = x86_cpu_to_apicid_init[cpu];
--              per_cpu(x86_bios_cpu_apicid, cpu) =
--                                              x86_bios_cpu_apicid_init[cpu];
--#ifdef CONFIG_NUMA
--              per_cpu(x86_cpu_to_node_map, cpu) =
--                                              x86_cpu_to_node_map_init[cpu];
++
 +      if (!boot_params.hdr.type_of_loader ||
 +          !ramdisk_image || !ramdisk_size)
 +              return;         /* No initrd provided by bootloader */
@@ -11705,7 +11708,14 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +      unsigned long ramdisk_size  = xen_start_info->mod_len;
 +      unsigned long ramdisk_end   = ramdisk_image + ramdisk_size;
 +      unsigned long end_of_lowmem = max_low_pfn << PAGE_SHIFT;
-+
+-      for_each_possible_cpu(cpu) {
+-              per_cpu(x86_cpu_to_apicid, cpu) = x86_cpu_to_apicid_init[cpu];
+-              per_cpu(x86_bios_cpu_apicid, cpu) =
+-                                              x86_bios_cpu_apicid_init[cpu];
+-#ifdef CONFIG_NUMA
+-              per_cpu(x86_cpu_to_node_map, cpu) =
+-                                              x86_cpu_to_node_map_init[cpu];
 +      if (!xen_start_info->mod_start || !ramdisk_size)
 +              return;         /* No initrd provided by bootloader */
  #endif
@@ -11757,16 +11767,16 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +{
 +}
 +#endif /* CONFIG_BLK_DEV_INITRD */
--#ifdef CONFIG_HAVE_CPUMASK_OF_CPU_MAP
--cpumask_t *cpumask_of_cpu_map __read_mostly;
--EXPORT_SYMBOL(cpumask_of_cpu_map);
++
 +static void __init parse_setup_data(void)
 +{
 +#ifndef CONFIG_XEN
 +      struct setup_data *data;
 +      u64 pa_data;
-+
+-#ifdef CONFIG_HAVE_CPUMASK_OF_CPU_MAP
+-cpumask_t *cpumask_of_cpu_map __read_mostly;
+-EXPORT_SYMBOL(cpumask_of_cpu_map);
 +      if (boot_params.hdr.version < 0x0209)
 +              return;
 +      pa_data = boot_params.hdr.setup_data;
@@ -11794,11 +11804,7 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +      struct setup_data *data;
 +      u64 pa_data;
 +      int found = 0;
--      /* alloc_bootmem zeroes memory */
--      cpumask_of_cpu_map = alloc_bootmem_low(sizeof(cpumask_t) * nr_cpu_ids);
--      for (i = 0; i < nr_cpu_ids; i++)
--              cpu_set(i, cpumask_of_cpu_map[i]);
++
 +      if (boot_params.hdr.version < 0x0209)
 +              return;
 +      pa_data = boot_params.hdr.setup_data;
@@ -11812,7 +11818,11 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +      }
 +      if (!found)
 +              return;
-+
+-      /* alloc_bootmem zeroes memory */
+-      cpumask_of_cpu_map = alloc_bootmem_low(sizeof(cpumask_t) * nr_cpu_ids);
+-      for (i = 0; i < nr_cpu_ids; i++)
+-              cpu_set(i, cpumask_of_cpu_map[i]);
 +      sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
 +      memcpy(&e820_saved, &e820, sizeof(struct e820map));
 +      printk(KERN_INFO "extended physical RAM map:\n");
@@ -12000,22 +12010,22 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +
 +struct x86_quirks *x86_quirks __initdata = &default_x86_quirks;
 +
- /*
-- * Great future plan:
-- * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data.
-- * Always point %gs to its beginning
++/*
 + * Determine if we were loaded by an EFI loader.  If so, then we have also been
 + * passed the efi memmap, systab, etc., so we should use these data structures
 + * for initialization.  Note, the efi init code path is determined by the
 + * global efi_enabled. This allows the same kernel image to be used on existing
 + * systems (with a traditional BIOS) as well as on EFI systems.
-  */
--void __init setup_per_cpu_areas(void)
-+/*
++ */
+ /*
+- * Great future plan:
+- * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data.
+- * Always point %gs to its beginning
 + * setup_arch - architecture-specific boot-time initializations
 + *
 + * Note: On x86_64, fixmaps are ready for use even before this is called.
-+ */
+  */
+-void __init setup_per_cpu_areas(void)
 +
 +void __init setup_arch(char **cmdline_p)
  {
@@ -12103,7 +12113,9 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +                   "EL32",
 +#else
 +                   "EL64",
-+#endif
+ #endif
+-              if (!ptr)
+-                      panic("Cannot allocate cpu data for CPU %d\n", i);
 +       4)) {
 +              efi_enabled = 1;
 +              efi_reserve_early();
@@ -12144,9 +12156,7 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +#ifndef CONFIG_XEN
 +      if (!boot_params.hdr.root_flags)
 +              root_mountflags &= ~MS_RDONLY;
- #endif
--              if (!ptr)
--                      panic("Cannot allocate cpu data for CPU %d\n", i);
++#endif
 +      init_mm.start_code = (unsigned long) _text;
 +      init_mm.end_code = (unsigned long) _etext;
 +      init_mm.end_data = (unsigned long) _edata;
@@ -12266,21 +12276,6 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +#endif
 +
 +      /* max_pfn_mapped is updated here */
-+#ifdef CONFIG_X86_64_XEN
-+      /*
-+       * Due to the way initial table space gets calculated on Xen, we have
-+       * to call init_memory_mapping() with the larger end address first.
-+       */
-+      if (max_pfn > max_low_pfn)
-+              max_pfn_mapped = init_memory_mapping(1UL<<32,
-+                                                   max_pfn<<PAGE_SHIFT);
-+      max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT);
-+      if (max_pfn > max_low_pfn)
-+              /* can we preserve max_low_pfn ?*/
-+              max_low_pfn = max_pfn;
-+      else
-+              max_pfn_mapped = max_low_pfn_mapped;
-+#else
 +      max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT);
 +      max_pfn_mapped = max_low_pfn_mapped;
 +
@@ -12292,7 +12287,6 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +              max_low_pfn = max_pfn;
        }
 +#endif
-+#endif
  
 -      nr_cpu_ids = highest_cpu + 1;
 -      printk(KERN_DEBUG "NR_CPUS: %d, nr_cpu_ids: %d\n", NR_CPUS, nr_cpu_ids);
@@ -12539,9 +12533,7 @@ Index: head-2008-12-01/arch/x86/kernel/setup-xen.c
 +      return NOTIFY_DONE;
 +}
 +#endif /* !CONFIG_XEN */
-Index: head-2008-12-01/arch/x86/kernel/setup64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/setup64-xen.c 2008-12-01 11:44:55.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/setup64-xen.c        2009-03-16 16:38:05.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,370 +0,0 @@
 -/* 
@@ -12914,9 +12906,7 @@ Index: head-2008-12-01/arch/x86/kernel/setup64-xen.c
 -      if (is_uv_system())
 -              uv_cpu_init();
 -}
-Index: head-2008-12-01/arch/x86/kernel/setup_32-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/setup_32-xen.c        2008-12-01 11:44:55.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/setup_32-xen.c       2009-03-16 16:38:05.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,1151 +0,0 @@
 -/*
@@ -14070,9 +14060,7 @@ Index: head-2008-12-01/arch/x86/kernel/setup_32-xen.c
 -}
 -
 -subsys_initcall(request_standard_resources);
-Index: head-2008-12-01/arch/x86/kernel/setup_64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/setup_64-xen.c        2008-12-01 11:44:55.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/setup_64-xen.c       2009-03-16 16:38:05.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,1433 +0,0 @@
 -/*
@@ -15508,10 +15496,8 @@ Index: head-2008-12-01/arch/x86/kernel/setup_64-xen.c
 -      return 1;
 -}
 -__setup("clearcpuid=", setup_disablecpuid);
-Index: head-2008-12-01/arch/x86/kernel/setup_percpu-xen.c
-===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-12-01/arch/x86/kernel/setup_percpu-xen.c 2008-12-01 11:49:07.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/setup_percpu-xen.c        2009-06-04 10:21:39.000000000 +0200
 @@ -0,0 +1,385 @@
 +#include <linux/kernel.h>
 +#include <linux/module.h>
@@ -15898,10 +15884,8 @@ Index: head-2008-12-01/arch/x86/kernel/setup_percpu-xen.c
 +
 +#endif /* X86_64_NUMA */
 +
-Index: head-2008-12-01/arch/x86/kernel/smp-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/smp-xen.c     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/smp-xen.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/smp-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/smp-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -121,132 +121,14 @@ void xen_smp_send_reschedule(int cpu)
        send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
  }
@@ -16103,11 +16087,9 @@ Index: head-2008-12-01/arch/x86/kernel/smp-xen.c
  
        return IRQ_HANDLED;
  }
-Index: head-2008-12-01/arch/x86/kernel/time_32-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/time_32-xen.c 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/time_32-xen.c      2008-12-01 11:58:30.000000000 +0100
-@@ -470,7 +470,7 @@ irqreturn_t timer_interrupt(int irq, voi
+--- sle11-2009-06-04.orig/arch/x86/kernel/time_32-xen.c        2009-03-24 10:13:09.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/time_32-xen.c     2009-06-04 10:21:39.000000000 +0200
+@@ -468,7 +468,7 @@ irqreturn_t timer_interrupt(int irq, voi
  
        /* Keep nmi watchdog up to date */
  #ifdef __i386__
@@ -16116,7 +16098,7 @@ Index: head-2008-12-01/arch/x86/kernel/time_32-xen.c
  #else
        add_pda(irq0_irqs, 1);
  #endif
-@@ -748,9 +748,7 @@ void __init time_init(void)
+@@ -746,9 +746,7 @@ void __init time_init(void)
  
        update_wallclock();
  
@@ -16126,7 +16108,7 @@ Index: head-2008-12-01/arch/x86/kernel/time_32-xen.c
  
        /* Cannot request_irq() until kmem is initialised. */
        late_time_init = setup_cpu0_timer_irq;
-@@ -807,7 +805,8 @@ static void stop_hz_timer(void)
+@@ -805,7 +803,8 @@ static void stop_hz_timer(void)
  
        /* Leave ourselves in tick mode if rcu or softirq or timer pending. */
        if (rcu_needs_cpu(cpu) || local_softirq_pending() ||
@@ -16136,10 +16118,8 @@ Index: head-2008-12-01/arch/x86/kernel/time_32-xen.c
                cpu_clear(cpu, nohz_cpu_mask);
                j = jiffies + 1;
        }
-Index: head-2008-12-01/arch/x86/kernel/traps_32-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/traps_32-xen.c        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/traps_32-xen.c     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/traps_32-xen.c       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/traps_32-xen.c    2009-06-04 10:21:39.000000000 +0200
 @@ -1,5 +1,6 @@
  /*
   *  Copyright (C) 1991, 1992  Linus Torvalds
@@ -16716,10 +16696,8 @@ Index: head-2008-12-01/arch/x86/kernel/traps_32-xen.c
        unsigned long base = (kesp - uesp) & -THREAD_SIZE;
        unsigned long new_kesp = kesp - base;
        unsigned long lim_pages = (new_kesp | (THREAD_SIZE - 1)) >> PAGE_SHIFT;
-Index: head-2008-12-01/arch/x86/kernel/traps_64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/traps_64-xen.c        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/traps_64-xen.c     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/traps_64-xen.c       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/traps_64-xen.c    2009-06-04 10:21:39.000000000 +0200
 @@ -10,73 +10,56 @@
   * 'Traps.c' handles hardware traps and faults after we have saved some
   * state in 'entry.S'.
@@ -17680,10 +17658,8 @@ Index: head-2008-12-01/arch/x86/kernel/traps_64-xen.c
  static int __init code_bytes_setup(char *s)
  {
        code_bytes = simple_strtoul(s, NULL, 0);
-Index: head-2008-12-01/arch/x86/kernel/vsyscall_64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/vsyscall_64-xen.c     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/vsyscall_64-xen.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/kernel/vsyscall_64-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -42,7 +42,8 @@
  #include <asm/topology.h>
  #include <asm/vgtod.h>
@@ -17724,10 +17700,8 @@ Index: head-2008-12-01/arch/x86/kernel/vsyscall_64-xen.c
        hotcpu_notifier(cpu_vsyscall_notifier, 0);
        return 0;
  }
-Index: head-2008-12-01/arch/x86/mach-xen/setup.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/mach-xen/setup.c     2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/arch/x86/mach-xen/setup.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/mach-xen/setup.c    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/arch/x86/mach-xen/setup.c 2009-06-04 10:21:39.000000000 +0200
 @@ -17,6 +17,8 @@
  #include <xen/interface/callback.h>
  #include <xen/interface/memory.h>
@@ -17903,10 +17877,8 @@ Index: head-2008-12-01/arch/x86/mach-xen/setup.c
        }
 +#endif
  }
-Index: head-2008-12-01/arch/x86/mm/fault-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/mm/fault-xen.c       2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/mm/fault-xen.c    2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/mm/fault-xen.c      2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/mm/fault-xen.c   2009-06-04 10:21:39.000000000 +0200
 @@ -10,6 +10,7 @@
  #include <linux/string.h>
  #include <linux/types.h>
@@ -17965,7 +17937,7 @@ Index: head-2008-12-01/arch/x86/mm/fault-xen.c
  
        /*
         * We fault-in kernel-space virtual memory on-demand. The
-@@ -832,14 +837,10 @@ bad_area_nosemaphore:
+@@ -831,14 +836,10 @@ bad_area_nosemaphore:
                if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) &&
                    printk_ratelimit()) {
                        printk(
@@ -17983,7 +17955,7 @@ Index: head-2008-12-01/arch/x86/mm/fault-xen.c
                        print_vma_addr(" in ", regs->ip);
                        printk("\n");
                }
-@@ -947,81 +948,45 @@ LIST_HEAD(pgd_list);
+@@ -946,81 +947,45 @@ LIST_HEAD(pgd_list);
  void vmalloc_sync_all(void)
  {
  #ifdef CONFIG_X86_32
@@ -18092,11 +18064,82 @@ Index: head-2008-12-01/arch/x86/mm/fault-xen.c
        }
  #endif
  }
-Index: head-2008-12-01/arch/x86/mm/hypervisor.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/mm/hypervisor.c      2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/arch/x86/mm/hypervisor.c   2008-12-01 11:49:07.000000000 +0100
-@@ -837,42 +837,9 @@ int write_ldt_entry(struct desc_struct *
+--- sle11-2009-06-04.orig/arch/x86/mm/hypervisor.c     2009-05-14 11:18:39.000000000 +0200
++++ sle11-2009-06-04/arch/x86/mm/hypervisor.c  2009-06-04 10:21:39.000000000 +0200
+@@ -709,6 +709,72 @@ void xen_destroy_contiguous_region(unsig
+ }
+ EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region);
++int __init early_create_contiguous_region(unsigned long pfn,
++                                        unsigned int order,
++                                        unsigned int address_bits)
++{
++      unsigned long *in_frames = discontig_frames, out_frame = pfn;
++      unsigned int i;
++      int rc, success;
++      struct xen_memory_exchange exchange = {
++              .in = {
++                      .nr_extents   = 1UL << order,
++                      .extent_order = 0,
++                      .domid        = DOMID_SELF
++              },
++              .out = {
++                      .nr_extents   = 1,
++                      .extent_order = order,
++                      .address_bits = address_bits,
++                      .domid        = DOMID_SELF
++              }
++      };
++
++      if (xen_feature(XENFEAT_auto_translated_physmap))
++              return 0;
++
++      if (unlikely(order > MAX_CONTIG_ORDER))
++              return -ENOMEM;
++
++      for (i = 0; i < (1U << order); ++i) {
++              in_frames[i] = pfn_to_mfn(pfn + i);
++              set_phys_to_machine(pfn + i, INVALID_P2M_ENTRY);
++      }
++
++      set_xen_guest_handle(exchange.in.extent_start, in_frames);
++      set_xen_guest_handle(exchange.out.extent_start, &out_frame);
++
++      rc = HYPERVISOR_memory_op(XENMEM_exchange, &exchange);
++      success = (exchange.nr_exchanged == (1UL << order));
++      BUG_ON(!success && (exchange.nr_exchanged || !rc));
++      BUG_ON(success && rc);
++#if CONFIG_XEN_COMPAT <= 0x030002
++      if (unlikely(rc == -ENOSYS)) {
++              /* Compatibility when XENMEM_exchange is unavailable. */
++              if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
++                                       &exchange.in) != (1UL << order))
++                      BUG();
++              success = (HYPERVISOR_memory_op(XENMEM_populate_physmap,
++                                              &exchange.out) == 1);
++              if (!success) {
++                      for (i = 0; i < (1U << order); ++i)
++                              in_frames[i] = pfn + i;
++                      if (HYPERVISOR_memory_op(XENMEM_populate_physmap,
++                                               &exchange.in) != (1UL << order))
++                              BUG();
++              }
++      }
++#endif
++
++      for (i = 0; i < (1U << order); ++i, ++out_frame) {
++              if (!success)
++                      out_frame = in_frames[i];
++              set_phys_to_machine(pfn + i, out_frame);
++      }
++
++      return success ? 0 : -ENOMEM;
++}
++
+ static void undo_limit_pages(struct page *pages, unsigned int order)
+ {
+       BUG_ON(xen_feature(XENFEAT_auto_translated_physmap));
+@@ -875,42 +941,9 @@ int write_ldt_entry(struct desc_struct *
        return HYPERVISOR_update_descriptor(mach_lp, *(const u64*)desc);
  }
  
@@ -18143,10 +18186,8 @@ Index: head-2008-12-01/arch/x86/mm/hypervisor.c
 +      maddr_t mach_gp = virt_to_machine(gdt + entry);
 +      return HYPERVISOR_update_descriptor(mach_gp, *(const u64*)desc);
  }
-Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/mm/init_32-xen.c     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/mm/init_32-xen.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/mm/init_32-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/mm/init_32-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -54,6 +54,7 @@
  
  unsigned int __VMALLOC_RESERVE = 128 << 20;
@@ -18506,7 +18547,7 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
  EXPORT_SYMBOL_GPL(__supported_pte_mask);
  
  #ifdef CONFIG_X86_PAE
-@@ -528,42 +550,369 @@ static void __init set_nx(void)
+@@ -528,42 +550,364 @@ static void __init set_nx(void)
  }
  #endif
  
@@ -18660,8 +18701,8 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
 +       */
 +      bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT;
 +      bootmap = find_e820_area(min_low_pfn<<PAGE_SHIFT,
-+                               max_pfn_mapped<<PAGE_SHIFT, bootmap_size,
-+                               PAGE_SIZE);
++                               min(max_pfn_mapped, xen_start_info->nr_pages)<<PAGE_SHIFT,
++                               bootmap_size, PAGE_SIZE);
 +      if (bootmap == -1L)
 +              panic("Cannot find bootmem map of size %ld\n", bootmap_size);
 +      reserve_early(bootmap, bootmap + bootmap_size, "BOOTMAP");
@@ -18686,17 +18727,12 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
 +{
 +      unsigned long start_pfn = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT)
 +                                + xen_start_info->nr_pt_frames;
-+      unsigned long start = start_pfn, va;
++      unsigned long start = start_pfn, va = (unsigned long)&_text;
 +      pgd_t *pgd;
 +      pud_t *pud;
 +      pmd_t *pmd;
 +      pte_t *pte;
 +
-+      /* Kill mapping of low 1MB. */
-+      for (va = PAGE_OFFSET; va < (unsigned long)&_text; va += PAGE_SIZE)
-+              if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0))
-+                      BUG();
-+
 +      /* Ensure init mappings cover kernel text/data and initial tables. */
 +      while (va < PAGE_OFFSET + (start_pfn << PAGE_SHIFT) + tables_space) {
 +              pgd = pgd_offset_k(va);
@@ -18896,7 +18932,7 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
  }
  
  /*
-@@ -598,7 +947,7 @@ static struct kcore_list kcore_mem, kcor
+@@ -598,7 +942,7 @@ static struct kcore_list kcore_mem, kcor
  void __init mem_init(void)
  {
        int codesize, reservedpages, datasize, initsize;
@@ -18905,7 +18941,7 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
        unsigned long pfn;
  
        pci_iommu_alloc();
-@@ -606,19 +955,6 @@ void __init mem_init(void)
+@@ -606,19 +950,6 @@ void __init mem_init(void)
  #ifdef CONFIG_FLATMEM
        BUG_ON(!mem_map);
  #endif
@@ -18925,7 +18961,7 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
        /* this will put all low memory onto the freelists */
        totalram_pages += free_all_bootmem();
        /* XEN: init and count low-mem pages outside initial allocation. */
-@@ -636,7 +972,7 @@ void __init mem_init(void)
+@@ -636,7 +967,7 @@ void __init mem_init(void)
                if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp)))
                        reservedpages++;
  
@@ -18934,7 +18970,7 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
  
        codesize =  (unsigned long) &_etext - (unsigned long) &_text;
        datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
-@@ -657,7 +993,6 @@ void __init mem_init(void)
+@@ -657,7 +988,6 @@ void __init mem_init(void)
                (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))
               );
  
@@ -18942,7 +18978,7 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
        printk(KERN_INFO "virtual kernel memory layout:\n"
                "    fixmap  : 0x%08lx - 0x%08lx   (%4ld kB)\n"
  #ifdef CONFIG_HIGHMEM
-@@ -698,7 +1033,6 @@ void __init mem_init(void)
+@@ -698,7 +1028,6 @@ void __init mem_init(void)
  #endif
        BUG_ON(VMALLOC_START                            > VMALLOC_END);
        BUG_ON((unsigned long)high_memory               > VMALLOC_START);
@@ -18950,7 +18986,7 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
  
        if (boot_cpu_data.wp_works_ok < 0)
                test_wp_bit();
-@@ -755,6 +1089,8 @@ void mark_rodata_ro(void)
+@@ -755,6 +1084,8 @@ void mark_rodata_ro(void)
        unsigned long start = PFN_ALIGN(_text);
        unsigned long size = PFN_ALIGN(_etext) - start;
  
@@ -18959,7 +18995,7 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
        set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT);
        printk(KERN_INFO "Write protecting the kernel text: %luk\n",
                size >> 10);
-@@ -767,6 +1103,8 @@ void mark_rodata_ro(void)
+@@ -767,6 +1098,8 @@ void mark_rodata_ro(void)
        printk(KERN_INFO "Testing CPA: write protecting again\n");
        set_pages_ro(virt_to_page(start), size>>PAGE_SHIFT);
  #endif
@@ -18968,7 +19004,7 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
        start += size;
        size = (unsigned long)__end_rodata - start;
        set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT);
-@@ -829,3 +1167,9 @@ void free_initrd_mem(unsigned long start
+@@ -829,3 +1162,9 @@ void free_initrd_mem(unsigned long start
        free_init_pages("initrd memory", start, end);
  }
  #endif
@@ -18978,10 +19014,8 @@ Index: head-2008-12-01/arch/x86/mm/init_32-xen.c
 +{
 +      return reserve_bootmem(phys, len, flags);
 +}
-Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/mm/init_64-xen.c     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/mm/init_64-xen.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/mm/init_64-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/mm/init_64-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -21,6 +21,7 @@
  #include <linux/swap.h>
  #include <linux/smp.h>
@@ -19005,7 +19039,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
  #if CONFIG_XEN_COMPAT <= 0x030002
  unsigned int __kernel_page_user;
  EXPORT_SYMBOL(__kernel_page_user);
-@@ -60,12 +69,11 @@ EXPORT_SYMBOL(__kernel_page_user);
+@@ -60,13 +69,12 @@ EXPORT_SYMBOL(__kernel_page_user);
  int after_bootmem;
  
  DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
@@ -19014,6 +19048,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
  extern pmd_t level2_fixmap_pgt[PTRS_PER_PMD];
  extern pte_t level1_fixmap_pgt[PTRS_PER_PTE];
  
+ #ifndef CONFIG_XEN
 -int direct_gbpages __meminitdata
 +int direct_gbpages
  #ifdef CONFIG_DIRECT_GBPAGES
@@ -19061,8 +19096,9 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 -}
 -
  static unsigned long __meminitdata table_start;
+-static unsigned long __meminitdata table_end;
 +static unsigned long __meminitdata table_cur;
- static unsigned long __meminitdata table_end;
++static unsigned long __meminitdata table_top;
  
 -static __init void *spp_getpage(void)
 +/*
@@ -19078,7 +19114,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 -      else if (start_pfn < table_end) {
 -              ptr = __va(start_pfn << PAGE_SHIFT);
 -              start_pfn++;
-+      else if (table_cur < table_end) {
++      else if (table_cur < table_top) {
 +              ptr = __va(table_cur << PAGE_SHIFT);
 +              table_cur++;
                memset(ptr, 0, PAGE_SIZE);
@@ -19252,7 +19288,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
  /*
   * The head.S code sets up the kernel high mapping:
   *
-@@ -352,33 +319,9 @@ void __init cleanup_highmap(void)
+@@ -352,63 +319,52 @@ void __init cleanup_highmap(void)
  }
  #endif
  
@@ -19280,14 +19316,18 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 -      }
 -}
 -
- static __meminit void *alloc_static_page(unsigned long *phys)
+-static __meminit void *alloc_static_page(unsigned long *phys)
++static __ref void *alloc_low_page(unsigned long *phys)
  {
 -      unsigned long va = (start_pfn << PAGE_SHIFT) + __START_KERNEL_map;
-+      unsigned long va = (table_cur << PAGE_SHIFT) + __START_KERNEL_map;
++      unsigned long pfn;
++      void *adr;
  
        if (after_bootmem) {
-               void *adr = (void *)get_zeroed_page(GFP_ATOMIC);
-@@ -387,13 +330,12 @@ static __meminit void *alloc_static_page
+-              void *adr = (void *)get_zeroed_page(GFP_ATOMIC);
++              adr = (void *)get_zeroed_page(GFP_ATOMIC);
+               *phys = __pa(adr);
                return adr;
        }
  
@@ -19296,16 +19336,38 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 -      memset((void *)va, 0, PAGE_SIZE);
 -      return (void *)va;
 +      BUG_ON(!table_cur);
-+      *phys = table_cur++ << PAGE_SHIFT;
-+      return memset((void *)va, 0, PAGE_SIZE);
++      pfn = table_cur++;
++      if (pfn >= table_top)
++              panic("alloc_low_page: ran out of memory");
++
++      adr = early_ioremap(pfn_to_mfn(pfn) * PAGE_SIZE, PAGE_SIZE);
++      memset(adr, 0, PAGE_SIZE);
++      *phys  = pfn * PAGE_SIZE;
++      return adr;
  }
  
 -#define PTE_SIZE PAGE_SIZE
-+#define unmap_low_page(p) ((void)(p))
++static __ref void unmap_low_page(void *adr)
++{
++      if (after_bootmem)
++              return;
++
++      early_iounmap(adr, PAGE_SIZE);
++}
  
  static inline int __meminit make_readonly(unsigned long paddr)
  {
-@@ -408,7 +350,7 @@ static inline int __meminit make_readonl
+       extern char __vsyscall_0;
+       int readonly = 0;
+-      /* Make new page tables read-only. */
++      /* Make new page tables read-only on the first pass. */
+       if (!xen_feature(XENFEAT_writable_page_tables)
++          && !max_pfn_mapped
+           && (paddr >= (table_start << PAGE_SHIFT))
+-          && (paddr < (table_end << PAGE_SHIFT)))
++          && (paddr < (table_top << PAGE_SHIFT)))
+               readonly = 1;
        /* Make old page tables read-only. */
        if (!xen_feature(XENFEAT_writable_page_tables)
            && (paddr >= (xen_start_info->pt_base - __START_KERNEL_map))
@@ -19314,7 +19376,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
                readonly = 1;
  
        /*
-@@ -425,118 +367,129 @@ static inline int __meminit make_readonl
+@@ -425,118 +381,131 @@ static inline int __meminit make_readonl
        return readonly;
  }
  
@@ -19343,6 +19405,11 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 +      unsigned pages = 0;
 +      unsigned long last_map_addr = end;
 +      int i;
++
++      pte_t *pte = pte_page + pte_index(addr);
++
++      for(i = pte_index(addr); i < PTRS_PER_PTE; i++, addr += PAGE_SIZE, pte++) {
++              unsigned long pteval = addr | __PAGE_KERNEL;
  
 -              for (i = 0; i < pmds; i++, addr += PMD_SIZE)
 -                      set_pmd(pmd+i, __pmd(addr | __PAGE_KERNEL_LARGE_EXEC));
@@ -19351,14 +19418,9 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 -              return (void *)vaddr;
 -continue_outer_loop:
 -              ;
-+      pte_t *pte = pte_page + pte_index(addr);
-+
-+      for(i = pte_index(addr); i < PTRS_PER_PTE; i++, addr += PAGE_SIZE, pte++) {
-+              unsigned long pteval = addr | __PAGE_KERNEL;
-+
-+              if (addr >= (after_bootmem
-+                           ? end
-+                           : xen_start_info->nr_pages << PAGE_SHIFT))
++              if (addr >= end ||
++                  (!after_bootmem &&
++                   (addr >> PAGE_SHIFT) >= xen_start_info->nr_pages))
 +                      break;
 +
 +              if (__pte_val(*pte))
@@ -19397,13 +19459,13 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 -      vaddr = (unsigned long)addr;
 -      pmds = ((vaddr & ~PMD_MASK) + size + ~PMD_MASK) / PMD_SIZE;
 -      pmd = level2_kernel_pgt + pmd_index(vaddr);
-+      pte_t *pte = (pte_t *)pmd_page_vaddr(*pmd);
+-
 -      for (i = 0; i < pmds; i++)
 -              pmd_clear(pmd + i);
--
++      pte_t *pte = (pte_t *)pmd_page_vaddr(*pmd);
 -      __flush_tlb_all();
-+      BUG_ON(!after_bootmem);
++      BUG_ON(!max_pfn_mapped);
 +      return phys_pte_init(pte, address, end);
  }
 -#endif
@@ -19467,14 +19529,16 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 +                      continue;
                }
 +
-+              pte = alloc_static_page(&pte_phys);
++              pte = alloc_low_page(&pte_phys);
 +              last_map_addr = phys_pte_init(pte, address, end);
 +              unmap_low_page(pte);
 +
                if (!after_bootmem) {
 -                      early_make_page_readonly(pte_save, XENFEAT_writable_page_tables);
 -                      *pmd = __pmd(pte_phys | _KERNPG_TABLE);
-+                      early_make_page_readonly(pte, XENFEAT_writable_page_tables);
++                      if (max_pfn_mapped)
++                              make_page_readonly(__va(pte_phys),
++                                                 XENFEAT_writable_page_tables);
 +                      *pmd = __pmd(pte_phys | _PAGE_TABLE);
                } else {
 -                      make_page_readonly(pte_save, XENFEAT_writable_page_tables);
@@ -19501,7 +19565,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 -      spin_lock(&init_mm.page_table_lock);
 -      last_map_addr = phys_pmd_init(pmd, address, end);
 -      spin_unlock(&init_mm.page_table_lock);
-+      BUG_ON(!after_bootmem);
++      BUG_ON(!max_pfn_mapped);
 +      last_map_addr = phys_pmd_init(pmd, address, end, page_size_mask);
        __flush_tlb_all();
        return last_map_addr;
@@ -19516,7 +19580,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
        unsigned long last_map_addr = end;
        int i = pud_index(addr);
  
-@@ -550,29 +503,59 @@ phys_pud_init(pud_t *pud_page, unsigned 
+@@ -550,29 +519,55 @@ phys_pud_init(pud_t *pud_page, unsigned 
  
                if (__pud_val(*pud)) {
                        if (!pud_large(*pud))
@@ -19537,18 +19601,21 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
                        continue;
                }
  
-               pmd = alloc_static_page(&pmd_phys);
-+              last_map_addr = phys_pmd_init(pmd, addr, end, page_size_mask);
-+              unmap_low_page(pmd);
+-              pmd = alloc_static_page(&pmd_phys);
+-
 -              spin_lock(&init_mm.page_table_lock);
 -              *pud = __pud(pmd_phys | _KERNPG_TABLE);
 -              last_map_addr = phys_pmd_init(pmd, addr, end);
 -              spin_unlock(&init_mm.page_table_lock);
--
++              pmd = alloc_low_page(&pmd_phys);
++              last_map_addr = phys_pmd_init(pmd, addr, end, page_size_mask);
++              unmap_low_page(pmd);
 -              early_make_page_readonly(pmd, XENFEAT_writable_page_tables);
 +              if (!after_bootmem) {
-+                      early_make_page_readonly(pmd, XENFEAT_writable_page_tables);
++                      if (max_pfn_mapped)
++                              make_page_readonly(__va(pmd_phys),
++                                                 XENFEAT_writable_page_tables);
 +                      if (page_size_mask & (1 << PG_LEVEL_NUM))
 +                              xen_l3_entry_update(pud, __pud(pmd_phys | _PAGE_TABLE));
 +                      else
@@ -19573,106 +19640,157 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 +{
 +      pud_t *pud;
 +
-+      if (!after_bootmem) {
-+              unsigned long addr = __pgd_val(*pgd), *page;
-+
-+              addr_to_page(addr, page);
-+              pud = (pud_t *)page;
-+      } else
-+              pud = (pud_t *)pgd_page_vaddr(*pgd);
++      pud = (pud_t *)pgd_page_vaddr(*pgd);
 +
 +      return phys_pud_init(pud, addr, end, page_size_mask | (1 << PG_LEVEL_NUM));
  }
  
  void __init xen_init_pt(void)
-@@ -654,7 +637,7 @@ void __init xen_init_pt(void)
- static void __init extend_init_mapping(unsigned long tables_space)
- {
-       unsigned long va = __START_KERNEL_map;
--      unsigned long start = start_pfn;
-+      unsigned long start = table_cur;
-       unsigned long phys, addr, *pte_page;
-       pmd_t *pmd;
-       pte_t *pte, new_pte;
-@@ -674,7 +657,7 @@ static void __init extend_init_mapping(u
-       /* Ensure init mappings cover kernel text/data and initial tables. */
-       while (va < (__START_KERNEL_map
--                   + (start_pfn << PAGE_SHIFT)
-+                   + (table_cur << PAGE_SHIFT)
-                    + tables_space)) {
-               pmd = (pmd_t *)&page[pmd_index(va)];
-               if (pmd_none(*pmd)) {
-@@ -706,9 +689,9 @@ static void __init extend_init_mapping(u
-               va += PAGE_SIZE;
+@@ -651,86 +646,36 @@ void __init xen_init_pt(void)
        }
--      if (start_pfn > start)
-+      if (table_cur > start)
-               reserve_early(start << PAGE_SHIFT,
--                            start_pfn << PAGE_SHIFT, "INITMAP");
-+                            table_cur << PAGE_SHIFT, "INITMAP");
  }
  
- static void __init find_early_table_space(unsigned long end)
-@@ -717,23 +700,25 @@ static void __init find_early_table_spac
-       puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
-       pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
+-static void __init extend_init_mapping(unsigned long tables_space)
+-{
+-      unsigned long va = __START_KERNEL_map;
+-      unsigned long start = start_pfn;
+-      unsigned long phys, addr, *pte_page;
+-      pmd_t *pmd;
+-      pte_t *pte, new_pte;
+-      unsigned long *page = (unsigned long *)init_level4_pgt;
+-
+-      addr = page[pgd_index(va)];
+-      addr_to_page(addr, page);
+-      addr = page[pud_index(va)];
+-      addr_to_page(addr, page);
+-
+-      /* Kill mapping of low 1MB. */
+-      while (va < (unsigned long)&_text) {
+-              if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0))
+-                      BUG();
+-              va += PAGE_SIZE;
+-      }
+-
+-      /* Ensure init mappings cover kernel text/data and initial tables. */
+-      while (va < (__START_KERNEL_map
+-                   + (start_pfn << PAGE_SHIFT)
+-                   + tables_space)) {
+-              pmd = (pmd_t *)&page[pmd_index(va)];
+-              if (pmd_none(*pmd)) {
+-                      pte_page = alloc_static_page(&phys);
+-                      early_make_page_readonly(
+-                              pte_page, XENFEAT_writable_page_tables);
+-                      set_pmd(pmd, __pmd(phys | _KERNPG_TABLE));
+-              } else {
+-                      addr = page[pmd_index(va)];
+-                      addr_to_page(addr, pte_page);
+-              }
+-              pte = (pte_t *)&pte_page[pte_index(va)];
+-              if (pte_none(*pte)) {
+-                      new_pte = pfn_pte(
+-                              (va - __START_KERNEL_map) >> PAGE_SHIFT, 
+-                              __pgprot(_KERNPG_TABLE));
+-                      xen_l1_entry_update(pte, new_pte);
+-              }
+-              va += PAGE_SIZE;
+-      }
+-
+-      /* Finally, blow away any spurious initial mappings. */
+-      while (1) {
+-              pmd = (pmd_t *)&page[pmd_index(va)];
+-              if (pmd_none(*pmd))
+-                      break;
+-              if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0))
+-                      BUG();
+-              va += PAGE_SIZE;
+-      }
+-
+-      if (start_pfn > start)
+-              reserve_early(start << PAGE_SHIFT,
+-                            start_pfn << PAGE_SHIFT, "INITMAP");
+-}
+-
+ static void __init find_early_table_space(unsigned long end)
+ {
+       unsigned long puds, pmds, ptes, tables;
+       puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
++      tables = round_up(puds * sizeof(pud_t), PAGE_SIZE);
+       pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
 -      ptes = (end + PTE_SIZE - 1) >> PAGE_SHIFT;
-+      ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT;
++      tables += round_up(pmds * sizeof(pmd_t), PAGE_SIZE);
  
-       tables = round_up(puds * 8, PAGE_SIZE) + 
-               round_up(pmds * 8, PAGE_SIZE) + 
-               round_up(ptes * 8, PAGE_SIZE); 
+-      tables = round_up(puds * 8, PAGE_SIZE) + 
+-              round_up(pmds * 8, PAGE_SIZE) + 
+-              round_up(ptes * 8, PAGE_SIZE); 
++      ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT;
++      tables += round_up(ptes * sizeof(pte_t), PAGE_SIZE);
  
-+      table_cur = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT) +
-+              xen_start_info->nr_pt_frames;
-+
-       extend_init_mapping(tables);
+-      extend_init_mapping(tables);
++      if (!table_top) {
++              table_start = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT) +
++                      xen_start_info->nr_pt_frames;
++              table_cur = table_start;
++      } else {
++              /*
++               * [table_start, table_top) gets passed to reserve_early(),
++               * so we must not use table_cur here, despite continuing
++               * to allocate from there. table_cur possibly being below
++               * table_start is otoh not a problem.
++               */
++              table_start = table_top;
++      }
  
 -      table_start = start_pfn;
-+      table_start = table_cur;
-       table_end = table_start + (tables>>PAGE_SHIFT);
+-      table_end = table_start + (tables>>PAGE_SHIFT);
++      table_top = table_cur + (tables >> PAGE_SHIFT);
  
 -      early_printk("kernel direct mapping tables up to %lx @ %lx-%lx\n",
 -              end, table_start << PAGE_SHIFT,
 -              (table_start << PAGE_SHIFT) + tables);
 +      printk(KERN_DEBUG "kernel direct mapping tables up to %lx @ %lx-%lx\n",
-+              end, table_start << PAGE_SHIFT, table_end << PAGE_SHIFT);
++              end, table_cur << PAGE_SHIFT, table_top << PAGE_SHIFT);
  }
  
--static void __init xen_finish_init_mapping(void)
-+static void __init xen_finish_init_mapping(bool reserve)
- {
-       unsigned long i, start, end;
+ static void __init xen_finish_init_mapping(void)
+@@ -752,18 +697,18 @@ static void __init xen_finish_init_mappi
+               xen_start_info->mod_start = (unsigned long)
+                       __va(__pa(xen_start_info->mod_start));
  
-@@ -762,7 +747,8 @@ static void __init xen_finish_init_mappi
+-      /* Destroy the Xen-created mappings beyond the kernel image as
+-       * well as the temporary mappings created above. Prevents
+-       * overlap with modules area (if init mapping is very big).
+-       */
++      /* Destroy the Xen-created mappings beyond the kernel image. */
+       start = PAGE_ALIGN((unsigned long)_end);
+-      end   = __START_KERNEL_map + (table_end << PAGE_SHIFT);
++      end   = __START_KERNEL_map + (table_start << PAGE_SHIFT);
+       for (; start < end; start += PAGE_SIZE)
                if (HYPERVISOR_update_va_mapping(start, __pte_ma(0), 0))
                        BUG();
  
 -      /* Allocate pte's for initial fixmaps from 'start_pfn' allocator. */
+-      table_end = ~0UL;
 +      /* Allocate pte's for initial fixmaps from 'table_cur' allocator. */
-+      start = table_cur;
-       table_end = ~0UL;
-       /*
-@@ -789,8 +775,11 @@ static void __init xen_finish_init_mappi
++      start = table_top;
++      WARN(table_cur != start, "start=%lx cur=%lx top=%lx\n",
++           table_start, table_cur, start);
++      table_top = ~0UL;
+       /* Switch to the real shared_info page, and clear the dummy page. */
+       set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info);
+@@ -780,8 +725,7 @@ static void __init xen_finish_init_mappi
                                     << PAGE_SHIFT,
                                     PAGE_KERNEL_RO);
  
 -      /* Disable the 'start_pfn' allocator. */
 -      table_end = start_pfn;
-+      /* Disable the 'table_cur' allocator. */
-+      table_end = table_cur;
-+      if (reserve && table_cur > start)
-+              reserve_early(start << PAGE_SHIFT,
-+                            table_cur << PAGE_SHIFT, "FIXMAP");
++      table_top = max(table_cur, start);
  }
  
  static void __init init_gbpages(void)
-@@ -801,126 +790,89 @@ static void __init init_gbpages(void)
-               direct_gbpages = 0;
+@@ -794,126 +738,91 @@ static void __init init_gbpages(void)
+ #endif
  }
  
 -#ifdef CONFIG_MEMTEST_BOOTPARAM
@@ -19708,7 +19826,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 -      default:
 -              return;
 -      }
+-
 -      incr = sizeof(unsigned long);
 -      start_phys_aligned = ALIGN(start_phys, incr);
 -      count = (size - (start_phys_aligned - start_phys))/incr;
@@ -19737,97 +19855,93 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 -                      val, start_bad, last_bad + incr);
 -              reserve_early(start_bad, last_bad - start_bad, "BAD RAM");
 -      }
--
 -}
--
++      unsigned long next, last_map_addr = end;
 -static int memtest_pattern __initdata = CONFIG_MEMTEST_BOOTPARAM_VALUE;
--
++      start = (unsigned long)__va(start);
++      end = (unsigned long)__va(end);
 -static int __init parse_memtest(char *arg)
 -{
 -      if (arg)
 -              memtest_pattern = simple_strtoul(arg, NULL, 0);
 -      return 0;
 -}
-+      unsigned long next, last_map_addr = end;
--early_param("memtest", parse_memtest);
-+      start = (unsigned long)__va(start);
-+      end = (unsigned long)__va(end);
--static void __init early_memtest(unsigned long start, unsigned long end)
--{
--      u64 t_start, t_size;
--      unsigned pattern;
 +      for (; start < end; start = next) {
 +              pgd_t *pgd = pgd_offset_k(start);
 +              unsigned long pud_phys;
 +              pud_t *pud;
  
--      if (!memtest_pattern)
--              return;
+-early_param("memtest", parse_memtest);
 +              next = (start + PGDIR_SIZE) & PGDIR_MASK;
 +              if (next > end)
 +                      next = end;
  
--      printk(KERN_INFO "early_memtest: pattern num %d", memtest_pattern);
--      for (pattern = 0; pattern < memtest_pattern; pattern++) {
--              t_start = start;
--              t_size = 0;
--              while (t_start < end) {
--                      t_start = find_e820_area_size(t_start, &t_size, 1);
--
--                      /* done ? */
--                      if (t_start >= end)
--                              break;
--                      if (t_start + t_size > end)
--                              t_size = end - t_start;
--
--                      printk(KERN_CONT "\n  %016llx - %016llx pattern %d",
--                              (unsigned long long)t_start,
--                              (unsigned long long)t_start + t_size, pattern);
+-static void __init early_memtest(unsigned long start, unsigned long end)
+-{
+-      u64 t_start, t_size;
+-      unsigned pattern;
 +              if (__pgd_val(*pgd)) {
 +                      last_map_addr = phys_pud_update(pgd, __pa(start),
 +                                               __pa(end), page_size_mask);
 +                      continue;
 +              }
  
--                      memtest(t_start, t_size, pattern);
-+              pud = alloc_static_page(&pud_phys);
+-      if (!memtest_pattern)
+-              return;
++              pud = alloc_low_page(&pud_phys);
 +              last_map_addr = phys_pud_init(pud, __pa(start), __pa(next),
 +                                               page_size_mask);
 +              unmap_low_page(pud);
--                      t_start += t_size;
++
 +              if(!after_bootmem) {
-+                      early_make_page_readonly(pud, XENFEAT_writable_page_tables);
++                      if (max_pfn_mapped)
++                              make_page_readonly(__va(pud_phys),
++                                                 XENFEAT_writable_page_tables);
 +                      xen_l4_entry_update(pgd, __pgd(pud_phys | _PAGE_TABLE));
 +              } else {
 +                      make_page_readonly(pud, XENFEAT_writable_page_tables);
 +                      spin_lock(&init_mm.page_table_lock);
 +                      pgd_populate(&init_mm, pgd, __va(pud_phys));
 +                      spin_unlock(&init_mm.page_table_lock);
-               }
-       }
--      printk(KERN_CONT "\n");
-+
++              }
++      }
+-      printk(KERN_INFO "early_memtest: pattern num %d", memtest_pattern);
+-      for (pattern = 0; pattern < memtest_pattern; pattern++) {
+-              t_start = start;
+-              t_size = 0;
+-              while (t_start < end) {
+-                      t_start = find_e820_area_size(t_start, &t_size, 1);
 +      return last_map_addr;
- }
--#else
--static void __init early_memtest(unsigned long start, unsigned long end)
-+
++}
+-                      /* done ? */
+-                      if (t_start >= end)
+-                              break;
+-                      if (t_start + t_size > end)
+-                              t_size = end - t_start;
 +struct map_range {
 +      unsigned long start;
 +      unsigned long end;
 +      unsigned page_size_mask;
 +};
-+
+-                      printk(KERN_CONT "\n  %016llx - %016llx pattern %d",
+-                              (unsigned long long)t_start,
+-                              (unsigned long long)t_start + t_size, pattern);
 +#define NR_RANGE_MR 5
-+
+-                      memtest(t_start, t_size, pattern);
 +static int save_mr(struct map_range *mr, int nr_range,
 +                 unsigned long start_pfn, unsigned long end_pfn,
 +                 unsigned long page_size_mask)
- {
-+
++{
+-                      t_start += t_size;
+-              }
 +      if (start_pfn < end_pfn) {
 +              if (nr_range >= NR_RANGE_MR)
 +                      panic("run out of range for init_memory_mapping\n");
@@ -19835,7 +19949,12 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 +              mr[nr_range].end   = end_pfn<<PAGE_SHIFT;
 +              mr[nr_range].page_size_mask = page_size_mask;
 +              nr_range++;
-+      }
+       }
+-      printk(KERN_CONT "\n");
+-}
+-#else
+-static void __init early_memtest(unsigned long start, unsigned long end)
+-{
 +
 +      return nr_range;
  }
@@ -19855,13 +19974,13 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 +      unsigned long last_map_addr = 0;
 +      unsigned long page_size_mask = 0;
 +      unsigned long start_pfn, end_pfn;
-+      bool first = !table_start;
++
 +      struct map_range mr[NR_RANGE_MR];
 +      int nr_range, i;
  
        printk(KERN_INFO "init_memory_mapping\n");
  
-@@ -931,51 +883,123 @@ unsigned long __init_refok init_memory_m
+@@ -924,51 +833,150 @@ unsigned long __init_refok init_memory_m
         * memory mapped. Unfortunately this is done currently before the
         * nodes are discovered.
         */
@@ -19869,10 +19988,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 +      if (!after_bootmem)
                init_gbpages();
 -              find_early_table_space(end);
--      }
--      start = (unsigned long)__va(start);
--      end = (unsigned long)__va(end);
++
 +      if (direct_gbpages)
 +              page_size_mask |= 1 << PG_LEVEL_1G;
 +      if (cpu_has_pse)
@@ -19927,18 +20043,23 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 +                       (nr_range - 1 - i) * sizeof (struct map_range));
 +              mr[i--].start = old_start;
 +              nr_range--;
-+      }
+       }
  
--      for (; start < end; start = next) {
--              pgd_t *pgd = pgd_offset_k(start);
--              unsigned long pud_phys;
--              pud_t *pud;
+-      start = (unsigned long)__va(start);
+-      end = (unsigned long)__va(end);
 +      for (i = 0; i < nr_range; i++)
 +              printk(KERN_DEBUG " %010lx - %010lx page %s\n",
 +                              mr[i].start, mr[i].end,
 +                      (mr[i].page_size_mask & (1<<PG_LEVEL_1G))?"1G":(
 +                       (mr[i].page_size_mask & (1<<PG_LEVEL_2M))?"2M":"4k"));
  
+-      for (; start < end; start = next) {
+-              pgd_t *pgd = pgd_offset_k(start);
+-              unsigned long pud_phys;
+-              pud_t *pud;
++      if (!after_bootmem)
++              find_early_table_space(end);
 -              if (after_bootmem)
 -                      pud = pud_offset(pgd, start & PGDIR_MASK);
 -              else
@@ -19950,35 +20071,58 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
 -              if (!after_bootmem) {
 -                      early_make_page_readonly(pud, XENFEAT_writable_page_tables);
 -                      set_pgd(pgd_offset_k(start), mk_kernel_pgd(pud_phys));
--              }
--      }
-+      if (first)
-+              find_early_table_space(end);
++      if (!start) {
++              unsigned long addr, va = __START_KERNEL_map;
++              unsigned long *page = (unsigned long *)init_level4_pgt;
++
++              /* Kill mapping of memory below _text. */
++              while (va < (unsigned long)&_text) {
++                      if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0))
++                              BUG();
++                      va += PAGE_SIZE;
++              }
++
++              /* Blow away any spurious initial mappings. */
++              va = __START_KERNEL_map + (table_start << PAGE_SHIFT);
++              addr = page[pgd_index(va)];
++              addr_to_page(addr, page);
++              addr = page[pud_index(va)];
++              addr_to_page(addr, page);
++              while (pmd_index(va) | pte_index(va)) {
++                      if (pmd_none(*(pmd_t *)&page[pmd_index(va)]))
++                              break;
++                      if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0))
++                              BUG();
++                      va += PAGE_SIZE;
+               }
+       }
  
 -      if (!after_bootmem) {
 -              BUG_ON(start_pfn != table_end);
--              xen_finish_init_mapping();
 +      for (i = 0; i < nr_range; i++)
 +              last_map_addr = kernel_physical_mapping_init(
 +                                      mr[i].start, mr[i].end,
 +                                      mr[i].page_size_mask);
 +
-+      BUG_ON(table_cur > table_end);
-+      if (start < (table_start << PAGE_SHIFT)) {
-+              WARN_ON(table_cur != table_end);
-+              xen_finish_init_mapping(!first);
-       }
++      BUG_ON(table_cur > table_top);
++      if (!start)
+               xen_finish_init_mapping();
+-      }
++      else if (table_cur < table_top)
++              /* Disable the 'table_cur' allocator. */
++              table_top = table_cur;
  
        __flush_tlb_all();
  
 -      if (!after_bootmem)
-+      if (first && table_end > table_start)
++      if (!after_bootmem && table_top > table_start)
                reserve_early(table_start << PAGE_SHIFT,
-                             table_end << PAGE_SHIFT, "PGTABLE");
+-                            table_end << PAGE_SHIFT, "PGTABLE");
++                            table_top << PAGE_SHIFT, "PGTABLE");
++
 +      printk(KERN_INFO "last_map_addr: %lx end: %lx\n",
 +                       last_map_addr, end);
-+
        if (!after_bootmem)
 -              early_memtest(start_phys, end_phys);
 +              early_memtest(start, end);
@@ -20013,7 +20157,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
  void __init paging_init(void)
  {
        unsigned long max_zone_pfns[MAX_NR_ZONES];
-@@ -983,9 +1007,9 @@ void __init paging_init(void)
+@@ -976,9 +984,9 @@ void __init paging_init(void)
        memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
        max_zone_pfns[ZONE_DMA] = MAX_DMA_PFN;
        max_zone_pfns[ZONE_DMA32] = MAX_DMA32_PFN;
@@ -20025,7 +20169,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
        sparse_init();
        free_area_init_nodes(max_zone_pfns);
  
-@@ -1076,8 +1100,8 @@ void __init mem_init(void)
+@@ -1069,8 +1077,8 @@ void __init mem_init(void)
                init_page_count(pfn_to_page(pfn));
                totalram_pages++;
        }
@@ -20036,7 +20180,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
        after_bootmem = 1;
  
        codesize =  (unsigned long) &_etext - (unsigned long) &_text;
-@@ -1096,7 +1120,7 @@ void __init mem_init(void)
+@@ -1089,7 +1097,7 @@ void __init mem_init(void)
        printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, "
                                "%ldk reserved, %ldk data, %ldk init)\n",
                (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
@@ -20045,7 +20189,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
                codesize >> 10,
                reservedpages << (PAGE_SHIFT-10),
                datasize >> 10,
-@@ -1159,6 +1183,13 @@ EXPORT_SYMBOL_GPL(rodata_test_data);
+@@ -1152,6 +1160,13 @@ EXPORT_SYMBOL_GPL(rodata_test_data);
  void mark_rodata_ro(void)
  {
        unsigned long start = PFN_ALIGN(_stext), end = PFN_ALIGN(__end_rodata);
@@ -20059,7 +20203,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
  
        printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n",
               (end - start) >> 10);
-@@ -1168,8 +1199,7 @@ void mark_rodata_ro(void)
+@@ -1161,8 +1176,7 @@ void mark_rodata_ro(void)
         * The rodata section (but not the kernel text!) should also be
         * not-executable.
         */
@@ -20069,7 +20213,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
  
        rodata_test();
  
-@@ -1191,24 +1221,26 @@ void free_initrd_mem(unsigned long start
+@@ -1184,24 +1198,26 @@ void free_initrd_mem(unsigned long start
  }
  #endif
  
@@ -20101,7 +20245,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
        }
  
        /* Should check here against the e820 map to avoid double free */
-@@ -1216,9 +1248,13 @@ void __init reserve_bootmem_generic(unsi
+@@ -1209,9 +1225,13 @@ void __init reserve_bootmem_generic(unsi
        nid = phys_to_nid(phys);
        next_nid = phys_to_nid(phys + len - 1);
        if (nid == next_nid)
@@ -20117,7 +20261,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
  #else
        reserve_bootmem(phys, len, BOOTMEM_DEFAULT);
  #endif
-@@ -1231,6 +1267,8 @@ void __init reserve_bootmem_generic(unsi
+@@ -1222,6 +1242,8 @@ void __init reserve_bootmem_generic(unsi
                set_dma_reserve(dma_reserve);
        }
  #endif
@@ -20126,7 +20270,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
  }
  
  int kern_addr_valid(unsigned long addr)
-@@ -1335,7 +1373,7 @@ vmemmap_populate(struct page *start_page
+@@ -1326,7 +1348,7 @@ vmemmap_populate(struct page *start_page
        pmd_t *pmd;
  
        for (; addr < end; addr = next) {
@@ -20135,7 +20279,7 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
  
                pgd = vmemmap_pgd_populate(addr, node);
                if (!pgd)
-@@ -1345,33 +1383,51 @@ vmemmap_populate(struct page *start_page
+@@ -1336,33 +1358,51 @@ vmemmap_populate(struct page *start_page
                if (!pud)
                        return -ENOMEM;
  
@@ -20208,10 +20352,8 @@ Index: head-2008-12-01/arch/x86/mm/init_64-xen.c
        }
        return 0;
  }
-Index: head-2008-12-01/arch/x86/mm/ioremap-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/mm/ioremap-xen.c     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/mm/ioremap-xen.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/mm/ioremap-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/mm/ioremap-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -13,6 +13,7 @@
  #include <linux/pfn.h>
  #include <linux/slab.h>
@@ -20354,7 +20496,7 @@ Index: head-2008-12-01/arch/x86/mm/ioremap-xen.c
  
  #ifdef CONFIG_X86_32
  static inline pmd_t * __init early_ioremap_pmd(unsigned long addr)
-@@ -693,10 +710,11 @@ static void __init __early_set_fixmap(en
+@@ -695,10 +712,11 @@ static void __init __early_set_fixmap(en
                return;
        }
        pte = early_ioremap_pte(addr);
@@ -20367,7 +20509,7 @@ Index: head-2008-12-01/arch/x86/mm/ioremap-xen.c
        __flush_tlb_one(addr);
  }
  
-@@ -724,13 +742,11 @@ static int __init check_early_ioremap_le
+@@ -726,13 +744,11 @@ static int __init check_early_ioremap_le
  {
        if (!early_ioremap_nested)
                return 0;
@@ -20384,10 +20526,8 @@ Index: head-2008-12-01/arch/x86/mm/ioremap-xen.c
  
        return 1;
  }
-Index: head-2008-12-01/arch/x86/mm/pageattr-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/mm/pageattr-xen.c    2008-12-01 12:19:27.000000000 +0100
-+++ head-2008-12-01/arch/x86/mm/pageattr-xen.c 2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/mm/pageattr-xen.c   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/mm/pageattr-xen.c        2009-06-04 10:21:39.000000000 +0200
 @@ -34,6 +34,47 @@ struct cpa_data {
        unsigned        force_split : 1;
  };
@@ -20479,7 +20619,7 @@ Index: head-2008-12-01/arch/x86/mm/pageattr-xen.c
        /*
         * Get the target mfn from the original entry:
         */
-@@ -565,10 +617,9 @@ repeat:
+@@ -566,10 +618,9 @@ repeat:
        if (!__pte_val(old_pte)) {
                if (!primary)
                        return 0;
@@ -20491,7 +20631,7 @@ Index: head-2008-12-01/arch/x86/mm/pageattr-xen.c
                return -EINVAL;
        }
  
-@@ -633,15 +684,24 @@ static int cpa_process_alias(struct cpa_
+@@ -634,15 +685,24 @@ static int cpa_process_alias(struct cpa_
        struct cpa_data alias_cpa;
        int ret = 0;
  
@@ -20519,7 +20659,59 @@ Index: head-2008-12-01/arch/x86/mm/pageattr-xen.c
  
                alias_cpa = *cpa;
                alias_cpa.vaddr = (unsigned long) __va(cpa->pfn << PAGE_SHIFT);
-@@ -809,7 +869,7 @@ int set_memory_uc(unsigned long addr, in
+@@ -796,6 +856,51 @@ static inline int change_page_attr_clear
+       return change_page_attr_set_clr(addr, numpages, __pgprot(0), mask, 0);
+ }
++#ifdef CONFIG_XEN
++static void _free_memtype(u64 pstart, u64 pend)
++{
++      u64 pa = pstart &= __PHYSICAL_MASK;
++      u64 ma = phys_to_machine(pa);
++
++      while ((pa += PAGE_SIZE) < pend) {
++              if (phys_to_machine(pa) != ma + (pa - pstart)) {
++                      free_memtype(ma, ma + (pa - pstart));
++                      pstart = pa;
++                      ma = phys_to_machine(pa);
++              }
++      }
++      free_memtype(ma, ma + (pend - pstart));
++}
++#define free_memtype _free_memtype
++
++static int _reserve_memtype(u64 pstart, u64 pend, unsigned long req_type)
++{
++      u64 pcur = pstart &= __PHYSICAL_MASK, pa = pcur;
++      u64 ma = phys_to_machine(pa);
++      int rc = 0;
++
++      while ((pa += PAGE_SIZE) < pend) {
++              if (phys_to_machine(pa) != ma + (pa - pcur)) {
++                      rc = reserve_memtype(ma, ma + (pa - pcur),
++                                           req_type, NULL);
++                      if (rc)
++                              break;
++                      pcur = pa;
++                      ma = phys_to_machine(pa);
++              }
++      }
++      if (likely(!rc))
++              rc = reserve_memtype(ma, ma + (pend - pcur), req_type, NULL);
++
++      if (unlikely(!rc) && pstart < pcur)
++              _free_memtype(pstart, pcur);
++
++      return rc;
++}
++#define reserve_memtype(s, e, r, n) \
++      _reserve_memtype(s, e, BUILD_BUG_ON_ZERO(n) ?: (r))
++#endif
++
+ int _set_memory_uc(unsigned long addr, int numpages)
+ {
+       /*
+@@ -810,7 +915,7 @@ int set_memory_uc(unsigned long addr, in
        /*
         * for now UC MINUS. see comments in ioremap_nocache()
         */
@@ -20528,7 +20720,7 @@ Index: head-2008-12-01/arch/x86/mm/pageattr-xen.c
                            _PAGE_CACHE_UC_MINUS, NULL))
                return -EINVAL;
  
-@@ -825,10 +885,10 @@ int _set_memory_wc(unsigned long addr, i
+@@ -826,10 +931,10 @@ int _set_memory_wc(unsigned long addr, i
  
  int set_memory_wc(unsigned long addr, int numpages)
  {
@@ -20541,7 +20733,7 @@ Index: head-2008-12-01/arch/x86/mm/pageattr-xen.c
                _PAGE_CACHE_WC, NULL))
                return -EINVAL;
  
-@@ -844,7 +904,7 @@ int _set_memory_wb(unsigned long addr, i
+@@ -845,7 +950,7 @@ int _set_memory_wb(unsigned long addr, i
  
  int set_memory_wb(unsigned long addr, int numpages)
  {
@@ -20550,10 +20742,8 @@ Index: head-2008-12-01/arch/x86/mm/pageattr-xen.c
  
        return _set_memory_wb(addr, numpages);
  }
-Index: head-2008-12-01/arch/x86/mm/pat-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/mm/pat-xen.c 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/mm/pat-xen.c      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/mm/pat-xen.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/mm/pat-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -12,6 +12,8 @@
  #include <linux/gfp.h>
  #include <linux/fs.h>
@@ -21263,10 +21453,8 @@ Index: head-2008-12-01/arch/x86/mm/pat-xen.c
 +late_initcall(pat_memtype_list_init);
 +
 +#endif /* CONFIG_DEBUG_FS */
-Index: head-2008-12-01/arch/x86/mm/pgtable-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/mm/pgtable-xen.c     2008-12-01 11:46:22.000000000 +0100
-+++ head-2008-12-01/arch/x86/mm/pgtable-xen.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/mm/pgtable-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/mm/pgtable-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -4,6 +4,7 @@
  #include <asm/pgalloc.h>
  #include <asm/pgtable.h>
@@ -21402,7 +21590,7 @@ Index: head-2008-12-01/arch/x86/mm/pgtable-xen.c
  
  void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd)
  {
-@@ -596,16 +506,97 @@ void pud_populate(struct mm_struct *mm, 
+@@ -596,16 +506,101 @@ void pud_populate(struct mm_struct *mm, 
                xen_tlb_flush();
  }
  #else  /* !CONFIG_X86_PAE */
@@ -21418,8 +21606,10 @@ Index: head-2008-12-01/arch/x86/mm/pgtable-xen.c
 -      return 1;
 +      int i;
 +
++#ifdef CONFIG_X86_PAE
 +      if (contig)
 +              xen_destroy_contiguous_region((unsigned long)mm->pgd, 0);
++#endif
 +
 +      for(i = 0; i < PREALLOCATED_PMDS; i++)
 +              if (pmds[i])
@@ -21470,8 +21660,10 @@ Index: head-2008-12-01/arch/x86/mm/pgtable-xen.c
 +              }
 +      }
 +
++#ifdef CONFIG_X86_PAE
 +      if (!xen_feature(XENFEAT_pae_pgdir_above_4gb))
 +              xen_destroy_contiguous_region((unsigned long)pgdp, 0);
++#endif
 +}
 +
 +static void pgd_prepopulate_pmd(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmds[])
@@ -21504,7 +21696,7 @@ Index: head-2008-12-01/arch/x86/mm/pgtable-xen.c
  
  #ifdef CONFIG_X86_64
  /* We allocate two contiguous pages for kernel and user. */
-@@ -616,19 +607,52 @@ static void pgd_mop_up_pmds(struct mm_st
+@@ -616,19 +611,52 @@ static void pgd_mop_up_pmds(struct mm_st
  
  pgd_t *pgd_alloc(struct mm_struct *mm)
  {
@@ -21564,7 +21756,7 @@ Index: head-2008-12-01/arch/x86/mm/pgtable-xen.c
  }
  
  void pgd_free(struct mm_struct *mm, pgd_t *pgd)
-@@ -644,6 +668,7 @@ void pgd_free(struct mm_struct *mm, pgd_
+@@ -644,6 +672,7 @@ void pgd_free(struct mm_struct *mm, pgd_
        pgd_dtor(pgd);
  
        pgd_mop_up_pmds(mm, pgd);
@@ -21572,7 +21764,7 @@ Index: head-2008-12-01/arch/x86/mm/pgtable-xen.c
        free_pages((unsigned long)pgd, PGD_ORDER);
  }
  
-@@ -685,7 +710,7 @@ int ptep_test_and_clear_young(struct vm_
+@@ -685,7 +714,7 @@ int ptep_test_and_clear_young(struct vm_
  
        if (pte_young(*ptep))
                ret = test_and_clear_bit(_PAGE_BIT_ACCESSED,
@@ -21581,7 +21773,7 @@ Index: head-2008-12-01/arch/x86/mm/pgtable-xen.c
  
        if (ret)
                pte_update(vma->vm_mm, addr, ptep);
-@@ -707,3 +732,42 @@ int ptep_clear_flush_young(struct vm_are
+@@ -707,3 +736,42 @@ int ptep_clear_flush_young(struct vm_are
  
        return young;
  }
@@ -21624,10 +21816,8 @@ Index: head-2008-12-01/arch/x86/mm/pgtable-xen.c
 +      set_pte_vaddr(address, pte);
 +      fixmaps_set++;
 +}
-Index: head-2008-12-01/arch/x86/mm/pgtable_32-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/mm/pgtable_32-xen.c  2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/mm/pgtable_32-xen.c       2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/mm/pgtable_32-xen.c 2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/mm/pgtable_32-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -25,51 +25,49 @@
  #include <xen/features.h>
  #include <asm/hypervisor.h>
@@ -21808,10 +21998,8 @@ Index: head-2008-12-01/arch/x86/mm/pgtable_32-xen.c
  void make_lowmem_page_readonly(void *va, unsigned int feature)
  {
        pte_t *pte;
-Index: head-2008-12-01/arch/x86/pci/amd_bus.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/pci/amd_bus.c        2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/arch/x86/pci/amd_bus.c     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/pci/amd_bus.c       2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/arch/x86/pci/amd_bus.c    2009-06-04 10:21:39.000000000 +0200
 @@ -607,6 +607,14 @@ static int __init pci_io_ecs_init(void)
        for_each_online_cpu(cpu)
                amd_cpu_notify(&amd_cpu_notifier, (unsigned long)CPU_ONLINE,
@@ -21838,10 +22026,8 @@ Index: head-2008-12-01/arch/x86/pci/amd_bus.c
        if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
                return 0;
  
-Index: head-2008-12-01/arch/x86/pci/irq-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/pci/irq-xen.c        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/pci/irq-xen.c     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/pci/irq-xen.c       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/pci/irq-xen.c    2009-06-04 10:21:39.000000000 +0200
 @@ -11,8 +11,8 @@
  #include <linux/slab.h>
  #include <linux/interrupt.h>
@@ -22716,10 +22902,8 @@ Index: head-2008-12-01/arch/x86/pci/irq-xen.c
        }
        return 0;
  }
-Index: head-2008-12-01/arch/x86/vdso/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/vdso/Makefile        2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/arch/x86/vdso/Makefile     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/vdso/Makefile       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/arch/x86/vdso/Makefile    2009-06-04 10:21:39.000000000 +0200
 @@ -65,9 +65,7 @@ obj-$(VDSO32-y)                      += vdso32-syms.lds
  vdso32.so-$(VDSO32-y)         += int80
  vdso32.so-$(CONFIG_COMPAT)    += syscall
@@ -22731,10 +22915,8 @@ Index: head-2008-12-01/arch/x86/vdso/Makefile
  
  vdso32-images                 = $(vdso32.so-y:%=vdso32-%.so)
  
-Index: head-2008-12-01/arch/x86/vdso/vdso32.S
-===================================================================
---- head-2008-12-01.orig/arch/x86/vdso/vdso32.S        2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/arch/x86/vdso/vdso32.S     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/vdso/vdso32.S       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/arch/x86/vdso/vdso32.S    2009-06-04 10:21:39.000000000 +0200
 @@ -9,7 +9,7 @@ vdso32_int80_end:
  
        .globl vdso32_syscall_start, vdso32_syscall_end
@@ -22761,10 +22943,8 @@ Index: head-2008-12-01/arch/x86/vdso/vdso32.S
 -#endif
 -
  __FINIT
-Index: head-2008-12-01/arch/x86/vdso/vdso32-setup-xen.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/vdso/vdso32-setup-xen.c      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/arch/x86/vdso/vdso32-setup-xen.c   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/vdso/vdso32-setup-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/arch/x86/vdso/vdso32-setup-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -195,50 +195,28 @@ static __init void relocate_vdso(Elf32_E
        }
  }
@@ -22793,12 +22973,12 @@ Index: head-2008-12-01/arch/x86/vdso/vdso32-setup-xen.c
 +void __cpuinit syscall32_cpu_init(void)
  {
 -      static const struct callback_register cstar = {
-+      static /*const*/ struct callback_register __cpuinitdata cstar = {
++      static const struct callback_register __cpuinitconst cstar = {
                .type = CALLBACKTYPE_syscall32,
                .address = (unsigned long)ia32_cstar_target
        };
 -      static const struct callback_register sysenter = {
-+      static /*const*/ struct callback_register __cpuinitdata sysenter = {
++      static const struct callback_register __cpuinitconst sysenter = {
                .type = CALLBACKTYPE_sysenter,
                .address = (unsigned long)ia32_sysenter_target
        };
@@ -22832,7 +23012,7 @@ Index: head-2008-12-01/arch/x86/vdso/vdso32-setup-xen.c
 +#define vdso32_syscall()      (boot_cpu_has(X86_FEATURE_SYSCALL32))
  
  extern asmlinkage void ia32pv_cstar_target(void);
- static /*const*/ struct callback_register __cpuinitdata cstar = {
+ static const struct callback_register __cpuinitconst cstar = {
 @@ -265,13 +244,13 @@ void __cpuinit enable_sep_cpu(void)
                .address = { __KERNEL_CS, (unsigned long)ia32pv_sysenter_target },
        };
@@ -22898,10 +23078,8 @@ Index: head-2008-12-01/arch/x86/vdso/vdso32-setup-xen.c
        }
  
        memcpy(syscall_page, vsyscall, vsyscall_len);
-Index: head-2008-12-01/arch/x86/xen/Kconfig
-===================================================================
---- head-2008-12-01.orig/arch/x86/xen/Kconfig  2008-12-01 11:36:47.000000000 +0100
-+++ head-2008-12-01/arch/x86/xen/Kconfig       2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/arch/x86/xen/Kconfig 2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-06-04/arch/x86/xen/Kconfig      2009-06-04 10:21:39.000000000 +0200
 @@ -17,7 +17,7 @@ config XEN_MAX_DOMAIN_MEMORY
         int "Maximum allowed size of a domain in gigabytes"
         default 8 if X86_32
@@ -22919,10 +23097,8 @@ Index: head-2008-12-01/arch/x86/xen/Kconfig
 +       depends on PARAVIRT_XEN && PM
         default y
 \ No newline at end of file
-Index: head-2008-12-01/drivers/acpi/processor_core.c
-===================================================================
---- head-2008-12-01.orig/drivers/acpi/processor_core.c 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/acpi/processor_core.c      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/acpi/processor_core.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/drivers/acpi/processor_core.c     2009-06-04 10:21:39.000000000 +0200
 @@ -721,9 +721,11 @@ static int __cpuinit acpi_processor_star
        if (result)
                goto end;
@@ -22948,10 +23124,8 @@ Index: head-2008-12-01/drivers/acpi/processor_core.c
  
        acpi_processor_remove_fs(device);
  
-Index: head-2008-12-01/drivers/char/tpm/tpm_vtpm.c
-===================================================================
---- head-2008-12-01.orig/drivers/char/tpm/tpm_vtpm.c   2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/drivers/char/tpm/tpm_vtpm.c        2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/char/tpm/tpm_vtpm.c  2009-02-16 15:58:14.000000000 +0100
++++ sle11-2009-06-04/drivers/char/tpm/tpm_vtpm.c       2009-06-04 10:21:39.000000000 +0200
 @@ -347,7 +347,7 @@ static int _vtpm_send_queued(struct tpm_
  {
        int rc;
@@ -22961,10 +23135,8 @@ Index: head-2008-12-01/drivers/char/tpm/tpm_vtpm.c
        unsigned char buffer[1];
        struct vtpm_state *vtpms;
        vtpms = (struct vtpm_state *)chip_get_private(chip);
-Index: head-2008-12-01/drivers/misc/Kconfig
-===================================================================
---- head-2008-12-01.orig/drivers/misc/Kconfig  2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/drivers/misc/Kconfig       2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/misc/Kconfig 2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/drivers/misc/Kconfig      2009-06-04 10:21:39.000000000 +0200
 @@ -438,7 +438,7 @@ config ENCLOSURE_SERVICES
  config SGI_XP
        tristate "Support communication between SGI SSIs"
@@ -22983,10 +23155,8 @@ Index: head-2008-12-01/drivers/misc/Kconfig
        default n
        select MMU_NOTIFIER
        ---help---
-Index: head-2008-12-01/drivers/pci/msi-xen.c
-===================================================================
---- head-2008-12-01.orig/drivers/pci/msi-xen.c 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/pci/msi-xen.c      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/pci/msi-xen.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/drivers/pci/msi-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -90,12 +90,10 @@ arch_teardown_msi_irqs(struct pci_dev *d
  }
  #endif
@@ -23013,7 +23183,7 @@ Index: head-2008-12-01/drivers/pci/msi-xen.c
  static void msix_set_enable(struct pci_dev *dev, int enable)
  {
        int pos;
-@@ -573,9 +576,8 @@ int pci_enable_msi(struct pci_dev* dev)
+@@ -568,9 +571,8 @@ int pci_enable_msi(struct pci_dev* dev)
  
        /* Check whether driver already requested for MSI-X irqs */
        if (dev->msix_enabled) {
@@ -23025,7 +23195,7 @@ Index: head-2008-12-01/drivers/pci/msi-xen.c
                return -EINVAL;
        }
  
-@@ -707,9 +709,8 @@ int pci_enable_msix(struct pci_dev* dev,
+@@ -702,9 +704,8 @@ int pci_enable_msix(struct pci_dev* dev,
        temp = dev->irq;
        /* Check whether driver already requested for MSI vector */
        if (dev->msi_enabled) {
@@ -23037,25 +23207,22 @@ Index: head-2008-12-01/drivers/pci/msi-xen.c
                return -EINVAL;
        }
  
-Index: head-2008-12-01/drivers/pci/quirks.c
-===================================================================
---- head-2008-12-01.orig/drivers/pci/quirks.c  2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/drivers/pci/quirks.c       2008-12-01 11:49:07.000000000 +0100
-@@ -42,9 +42,7 @@ static void __devinit quirk_release_reso
+--- sle11-2009-06-04.orig/drivers/pci/quirks.c 2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/drivers/pci/quirks.c      2009-06-04 10:21:39.000000000 +0200
+@@ -44,9 +44,8 @@ static void __devinit quirk_release_reso
                        /* PCI Host Bridge isn't a target device */
                        return;
                }
 -              printk(KERN_INFO
--                      "PCI: Disable device and release resources [%s].\n",
+-                      "PCI: Disable memory decoding and release memory resources [%s].\n",
 -                      pci_name(dev));
-+              dev_info(&dev->dev, "disable device and release resources\n");
-               pci_disable_device(dev);
-               for (i=0; i < PCI_NUM_RESOURCES; i++) {
-Index: head-2008-12-01/drivers/pci/setup-res.c
-===================================================================
---- head-2008-12-01.orig/drivers/pci/setup-res.c       2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/drivers/pci/setup-res.c    2008-12-01 11:50:17.000000000 +0100
++              dev_info(&dev->dev,
++                       "disable memory decoding and release memory resources\n");
+               pci_read_config_word(dev, PCI_COMMAND, &command);
+               command &= ~PCI_COMMAND_MEMORY;
+               pci_write_config_word(dev, PCI_COMMAND, command);
+--- sle11-2009-06-04.orig/drivers/pci/setup-res.c      2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/drivers/pci/setup-res.c   2009-06-04 10:21:39.000000000 +0200
 @@ -129,7 +129,7 @@ int pci_claim_resource(struct pci_dev *d
  #ifdef CONFIG_PCI_REASSIGN
  void pci_disable_bridge_window(struct pci_dev *dev)
@@ -23087,20 +23254,16 @@ Index: head-2008-12-01/drivers/pci/setup-res.c
                        (unsigned long long)res->start,
                        (unsigned long long)res->end);
  #endif
-Index: head-2008-12-01/drivers/xen/Makefile
-===================================================================
---- head-2008-12-01.orig/drivers/xen/Makefile  2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/Makefile       2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/Makefile 2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/Makefile      2009-06-04 10:21:39.000000000 +0200
 @@ -1,4 +1,4 @@
 -obj-$(CONFIG_PARAVIRT_XEN)    += grant-table.o features.o events.o
 +obj-$(CONFIG_PARAVIRT_XEN)    += grant-table.o features.o events.o manage.o
  xen-xencomm-$(CONFIG_PARAVIRT_XEN) := xencomm.o
  xen-balloon-$(CONFIG_PARAVIRT_XEN) := balloon.o
  
-Index: head-2008-12-01/drivers/xen/balloon/sysfs.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/balloon/sysfs.c   2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/drivers/xen/balloon/sysfs.c        2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/balloon/sysfs.c  2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/balloon/sysfs.c       2009-06-04 10:21:39.000000000 +0200
 @@ -45,6 +45,7 @@
  
  #define BALLOON_SHOW(name, format, args...)                   \
@@ -23128,10 +23291,8 @@ Index: head-2008-12-01/drivers/xen/balloon/sysfs.c
  {
        char memstring[64], *endchar;
        unsigned long long target_bytes;
-Index: head-2008-12-01/drivers/xen/blktap/blktap.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/blktap/blktap.c   2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/blktap/blktap.c        2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/blktap/blktap.c  2009-04-20 11:40:14.000000000 +0200
++++ sle11-2009-06-04/drivers/xen/blktap/blktap.c       2009-06-04 10:21:39.000000000 +0200
 @@ -54,6 +54,7 @@
  #include <linux/gfp.h>
  #include <linux/poll.h>
@@ -23140,7 +23301,7 @@ Index: head-2008-12-01/drivers/xen/blktap/blktap.c
  #include <asm/tlbflush.h>
  
  #define MAX_TAP_DEV 256     /*the maximum number of tapdisk ring devices    */
-@@ -483,7 +484,7 @@ found:
+@@ -498,7 +499,7 @@ found:
  
                if ((class = get_xen_class()) != NULL)
                        device_create(class, NULL, MKDEV(blktap_major, minor),
@@ -23149,7 +23310,7 @@ Index: head-2008-12-01/drivers/xen/blktap/blktap.c
        }
  
  out:
-@@ -1686,7 +1687,8 @@ static int __init blkif_init(void)
+@@ -1683,7 +1684,8 @@ static int __init blkif_init(void)
                 * We only create the device when a request of a new device is
                 * made.
                 */
@@ -23159,10 +23320,8 @@ Index: head-2008-12-01/drivers/xen/blktap/blktap.c
        } else {
                /* this is bad, but not fatal */
                WPRINTK("blktap: sysfs xen_class not created\n");
-Index: head-2008-12-01/drivers/xen/char/mem.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/char/mem.c        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/char/mem.c     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/char/mem.c       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/char/mem.c    2009-06-04 10:21:39.000000000 +0200
 @@ -35,7 +35,7 @@ static inline int uncached_access(struct
  
  static inline int range_is_allowed(unsigned long pfn, unsigned long size)
@@ -23184,11 +23343,9 @@ Index: head-2008-12-01/drivers/xen/char/mem.c
  };
  
  static int xen_mmap_mem(struct file * file, struct vm_area_struct * vma)
-Index: head-2008-12-01/drivers/xen/console/console.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/console/console.c 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/console/console.c      2008-12-01 11:49:07.000000000 +0100
-@@ -416,9 +416,7 @@ static void __xencons_tx_flush(void)
+--- sle11-2009-06-04.orig/drivers/xen/console/console.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/console/console.c     2009-06-04 10:21:39.000000000 +0200
+@@ -432,9 +432,7 @@ static void __xencons_tx_flush(void)
  
        if (work_done && (xencons_tty != NULL)) {
                wake_up_interruptible(&xencons_tty->write_wait);
@@ -23199,7 +23356,7 @@ Index: head-2008-12-01/drivers/xen/console/console.c
        }
  }
  
-@@ -619,8 +617,8 @@ static void xencons_close(struct tty_str
+@@ -635,8 +633,8 @@ static void xencons_close(struct tty_str
        tty->closing = 1;
        tty_wait_until_sent(tty, 0);
        tty_driver_flush_buffer(tty);
@@ -23210,23 +23367,68 @@ Index: head-2008-12-01/drivers/xen/console/console.c
        tty->closing = 0;
        spin_lock_irqsave(&xencons_lock, flags);
        xencons_tty = NULL;
-Index: head-2008-12-01/drivers/xen/core/evtchn.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/core/evtchn.c     2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/drivers/xen/core/evtchn.c  2008-12-03 15:53:53.000000000 +0100
-@@ -744,9 +744,9 @@ static struct irq_chip dynirq_chip = {
+--- sle11-2009-06-04.orig/drivers/xen/core/evtchn.c    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/core/evtchn.c 2009-06-04 10:21:39.000000000 +0200
+@@ -746,8 +746,9 @@ static struct irq_chip dynirq_chip = {
  };
  
  /* Bitmap indicating which PIRQs require Xen to be notified on unmask. */
 -static int pirq_eoi_does_unmask;
 +static bool pirq_eoi_does_unmask;
- static DECLARE_BITMAP(pirq_needs_eoi, ALIGN(NR_PIRQS, PAGE_SIZE * 8))
--      __attribute__ ((__section__(".bss.page_aligned"), __aligned__(PAGE_SIZE)));
-+      __page_aligned_bss;
+ static unsigned long *pirq_needs_eoi;
++static DECLARE_BITMAP(probing_pirq, NR_PIRQS);
  
  static void pirq_unmask_and_notify(unsigned int evtchn, unsigned int irq)
  {
-@@ -1002,6 +1002,7 @@ void xen_poll_irq(int irq)
+@@ -794,25 +795,31 @@ static inline void pirq_query_unmask(int
+               set_bit(irq - PIRQ_BASE, pirq_needs_eoi);
+ }
+-/*
+- * On startup, if there is no action associated with the IRQ then we are
+- * probing. In this case we should not share with others as it will confuse us.
+- */
+-#define probing_irq(_irq) (irq_desc[(_irq)].action == NULL)
++static int set_type_pirq(unsigned int irq, unsigned int type)
++{
++      if (type != IRQ_TYPE_PROBE)
++              return -EINVAL;
++      set_bit(irq - PIRQ_BASE, probing_pirq);
++      return 0;
++}
+ static unsigned int startup_pirq(unsigned int irq)
+ {
+       struct evtchn_bind_pirq bind_pirq;
+       int evtchn = evtchn_from_irq(irq);
+-      if (VALID_EVTCHN(evtchn))
++      if (VALID_EVTCHN(evtchn)) {
++              clear_bit(irq - PIRQ_BASE, probing_pirq);
+               goto out;
++      }
+       bind_pirq.pirq = evtchn_get_xen_pirq(irq);
+       /* NB. We are happy to share unless we are probing. */
+-      bind_pirq.flags = probing_irq(irq) ? 0 : BIND_PIRQ__WILL_SHARE;
++      bind_pirq.flags = test_and_clear_bit(irq - PIRQ_BASE, probing_pirq)
++                        || (irq_desc[irq].status & IRQ_AUTODETECT)
++                        ? 0 : BIND_PIRQ__WILL_SHARE;
+       if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_pirq, &bind_pirq) != 0) {
+-              if (!probing_irq(irq))
++              if (bind_pirq.flags)
+                       printk(KERN_INFO "Failed to obtain physical IRQ %d\n",
+                              irq);
+               return 0;
+@@ -891,6 +898,7 @@ static struct irq_chip pirq_chip = {
+       .mask_ack = ack_pirq,
+       .ack      = ack_pirq,
+       .end      = end_pirq,
++      .set_type = set_type_pirq,
+ #ifdef CONFIG_SMP
+       .set_affinity = set_affinity_irq,
+ #endif
+@@ -1003,6 +1011,7 @@ void xen_poll_irq(int irq)
                BUG();
  }
  
@@ -23234,7 +23436,7 @@ Index: head-2008-12-01/drivers/xen/core/evtchn.c
  static void restore_cpu_virqs(unsigned int cpu)
  {
        struct evtchn_bind_virq bind_virq;
-@@ -1094,6 +1095,7 @@ void irq_resume(void)
+@@ -1095,6 +1104,7 @@ void irq_resume(void)
        }
  
  }
@@ -23242,19 +23444,17 @@ Index: head-2008-12-01/drivers/xen/core/evtchn.c
  
  #if defined(CONFIG_X86_IO_APIC)
  #define identity_mapped_irq(irq) (!IO_APIC_IRQ((irq) - PIRQ_BASE))
-@@ -1175,7 +1177,7 @@ void __init xen_init_IRQ(void)
-       BUG_ON(!bitmap_empty(pirq_needs_eoi, PAGE_SIZE * 8));
-       eoi_mfn.mfn = virt_to_bus(pirq_needs_eoi) >> PAGE_SHIFT;
-       if (HYPERVISOR_physdev_op(PHYSDEVOP_pirq_eoi_mfn, &eoi_mfn) == 0)
+@@ -1177,7 +1187,7 @@ void __init xen_init_IRQ(void)
+               * BITS_TO_LONGS(ALIGN(NR_PIRQS, PAGE_SIZE * 8)));
+       eoi_gmfn.gmfn = virt_to_machine(pirq_needs_eoi) >> PAGE_SHIFT;
+       if (HYPERVISOR_physdev_op(PHYSDEVOP_pirq_eoi_gmfn, &eoi_gmfn) == 0)
 -              pirq_eoi_does_unmask = 1;
 +              pirq_eoi_does_unmask = true;
  
        /* No event channels are 'live' right now. */
        for (i = 0; i < NR_EVENT_CHANNELS; i++)
-Index: head-2008-12-01/drivers/xen/core/gnttab.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/core/gnttab.c     2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/drivers/xen/core/gnttab.c  2008-12-02 09:26:17.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/core/gnttab.c    2008-12-01 11:25:57.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/core/gnttab.c 2009-06-04 10:21:39.000000000 +0200
 @@ -449,6 +449,7 @@ static int map_pte_fn(pte_t *pte, struct
        return 0;
  }
@@ -23382,11 +23582,9 @@ Index: head-2008-12-01/drivers/xen/core/gnttab.c
        return 0;
  
   ini_nomem:
-Index: head-2008-12-01/drivers/xen/core/machine_kexec.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/core/machine_kexec.c      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/core/machine_kexec.c   2008-12-01 11:49:07.000000000 +0100
-@@ -90,7 +90,7 @@ void __init xen_machine_kexec_setup_reso
+--- sle11-2009-06-04.orig/drivers/xen/core/machine_kexec.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/core/machine_kexec.c  2009-06-04 10:21:39.000000000 +0200
+@@ -91,7 +91,7 @@ void __init xen_machine_kexec_setup_reso
        xen_hypervisor_res.start = range.start;
        xen_hypervisor_res.end = range.start + range.size - 1;
        xen_hypervisor_res.flags = IORESOURCE_BUSY | IORESOURCE_MEM;
@@ -23395,7 +23593,7 @@ Index: head-2008-12-01/drivers/xen/core/machine_kexec.c
        insert_resource(&iomem_resource, &xen_hypervisor_res);
  #endif
  
-@@ -105,7 +105,7 @@ void __init xen_machine_kexec_setup_reso
+@@ -106,7 +106,7 @@ void __init xen_machine_kexec_setup_reso
        if (range.size) {
                crashk_res.start = range.start;
                crashk_res.end = range.start + range.size - 1;
@@ -23404,7 +23602,7 @@ Index: head-2008-12-01/drivers/xen/core/machine_kexec.c
                insert_resource(&iomem_resource, &crashk_res);
  #endif
        }
-@@ -152,7 +152,7 @@ void __init xen_machine_kexec_setup_reso
+@@ -160,7 +160,7 @@ void __init xen_machine_kexec_setup_reso
        return;
  }
  
@@ -23413,11 +23611,9 @@ Index: head-2008-12-01/drivers/xen/core/machine_kexec.c
  void __init xen_machine_kexec_register_resources(struct resource *res)
  {
        request_resource(res, &xen_hypervisor_res);
-Index: head-2008-12-01/drivers/xen/core/machine_reboot.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/core/machine_reboot.c     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/core/machine_reboot.c  2008-12-01 11:49:07.000000000 +0100
-@@ -65,6 +65,7 @@ EXPORT_SYMBOL(machine_restart);
+--- sle11-2009-06-04.orig/drivers/xen/core/machine_reboot.c    2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/drivers/xen/core/machine_reboot.c 2009-06-04 10:21:39.000000000 +0200
+@@ -57,6 +57,7 @@ EXPORT_SYMBOL(machine_restart);
  EXPORT_SYMBOL(machine_halt);
  EXPORT_SYMBOL(machine_power_off);
  
@@ -23425,7 +23621,7 @@ Index: head-2008-12-01/drivers/xen/core/machine_reboot.c
  static void pre_suspend(void)
  {
        HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
-@@ -119,6 +120,7 @@ static void post_suspend(int suspend_can
+@@ -111,6 +112,7 @@ static void post_suspend(int suspend_can
        HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
                virt_to_mfn(pfn_to_mfn_frame_list_list);
  }
@@ -23433,7 +23629,7 @@ Index: head-2008-12-01/drivers/xen/core/machine_reboot.c
  
  #else /* !(defined(__i386__) || defined(__x86_64__)) */
  
-@@ -137,6 +139,7 @@ static void post_suspend(int suspend_can
+@@ -129,6 +131,7 @@ static void post_suspend(int suspend_can
  
  #endif
  
@@ -23441,7 +23637,7 @@ Index: head-2008-12-01/drivers/xen/core/machine_reboot.c
  struct suspend {
        int fast_suspend;
        void (*resume_notifier)(int);
-@@ -230,7 +233,8 @@ int __xen_suspend(int fast_suspend, void
+@@ -222,7 +225,8 @@ int __xen_suspend(int fast_suspend, void
  
        if (fast_suspend) {
                xenbus_suspend();
@@ -23451,15 +23647,13 @@ Index: head-2008-12-01/drivers/xen/core/machine_reboot.c
                if (err < 0)
                        xenbus_suspend_cancel();
        } else {
-@@ -253,3 +257,4 @@ int __xen_suspend(int fast_suspend, void
+@@ -245,3 +249,4 @@ int __xen_suspend(int fast_suspend, void
  
        return 0;
  }
 +#endif
-Index: head-2008-12-01/drivers/xen/core/reboot.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/core/reboot.c     2008-12-01 11:36:47.000000000 +0100
-+++ head-2008-12-01/drivers/xen/core/reboot.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/core/reboot.c    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/core/reboot.c 2009-06-04 10:21:39.000000000 +0200
 @@ -29,17 +29,12 @@ MODULE_LICENSE("Dual BSD/GPL");
  /* Ignore multiple shutdown requests. */
  static int shutting_down = SHUTDOWN_INVALID;
@@ -23532,10 +23726,8 @@ Index: head-2008-12-01/drivers/xen/core/reboot.c
  
  static int setup_shutdown_watcher(void)
  {
-Index: head-2008-12-01/drivers/xen/core/smpboot.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/core/smpboot.c    2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/core/smpboot.c 2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/core/smpboot.c   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/core/smpboot.c        2009-06-04 10:21:39.000000000 +0200
 @@ -27,6 +27,7 @@
  
  extern irqreturn_t smp_reschedule_interrupt(int, void *);
@@ -23544,7 +23736,7 @@ Index: head-2008-12-01/drivers/xen/core/smpboot.c
  
  extern int local_setup_timer(unsigned int cpu);
  extern void local_teardown_timer(unsigned int cpu);
-@@ -54,8 +55,10 @@ DEFINE_PER_CPU(int, cpu_state) = { 0 };
+@@ -50,8 +51,10 @@ EXPORT_PER_CPU_SYMBOL(cpu_info);
  
  static DEFINE_PER_CPU(int, resched_irq);
  static DEFINE_PER_CPU(int, callfunc_irq);
@@ -23555,7 +23747,7 @@ Index: head-2008-12-01/drivers/xen/core/smpboot.c
  
  #ifdef CONFIG_X86_LOCAL_APIC
  #define set_cpu_to_apicid(cpu, apicid) (per_cpu(x86_cpu_to_apicid, cpu) = (apicid))
-@@ -77,8 +80,10 @@ void __init prefill_possible_map(void)
+@@ -73,15 +76,13 @@ void __init prefill_possible_map(void)
  
        for (i = 0; i < NR_CPUS; i++) {
                rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL);
@@ -23567,7 +23759,14 @@ Index: head-2008-12-01/drivers/xen/core/smpboot.c
        }
  }
  
-@@ -114,7 +119,8 @@ static int __cpuinit xen_smp_intr_init(u
+-void __init smp_alloc_memory(void)
+-{
+-}
+-
+ static inline void
+ set_cpu_sibling_map(unsigned int cpu)
+ {
+@@ -110,7 +111,8 @@ static int __cpuinit xen_smp_intr_init(u
  {
        int rc;
  
@@ -23577,7 +23776,7 @@ Index: head-2008-12-01/drivers/xen/core/smpboot.c
  
        sprintf(resched_name[cpu], "resched%u", cpu);
        rc = bind_ipi_to_irqhandler(RESCHEDULE_VECTOR,
-@@ -138,6 +144,17 @@ static int __cpuinit xen_smp_intr_init(u
+@@ -134,6 +136,17 @@ static int __cpuinit xen_smp_intr_init(u
                goto fail;
        per_cpu(callfunc_irq, cpu) = rc;
  
@@ -23595,7 +23794,7 @@ Index: head-2008-12-01/drivers/xen/core/smpboot.c
        rc = xen_spinlock_init(cpu);
        if (rc < 0)
                goto fail;
-@@ -152,6 +169,8 @@ static int __cpuinit xen_smp_intr_init(u
+@@ -148,6 +161,8 @@ static int __cpuinit xen_smp_intr_init(u
                unbind_from_irqhandler(per_cpu(resched_irq, cpu), NULL);
        if (per_cpu(callfunc_irq, cpu) >= 0)
                unbind_from_irqhandler(per_cpu(callfunc_irq, cpu), NULL);
@@ -23604,7 +23803,7 @@ Index: head-2008-12-01/drivers/xen/core/smpboot.c
        xen_spinlock_cleanup(cpu);
        return rc;
  }
-@@ -164,6 +183,7 @@ static void __cpuexit xen_smp_intr_exit(
+@@ -160,6 +175,7 @@ static void __cpuexit xen_smp_intr_exit(
  
        unbind_from_irqhandler(per_cpu(resched_irq, cpu), NULL);
        unbind_from_irqhandler(per_cpu(callfunc_irq, cpu), NULL);
@@ -23612,7 +23811,7 @@ Index: head-2008-12-01/drivers/xen/core/smpboot.c
        xen_spinlock_cleanup(cpu);
  }
  #endif
-@@ -171,11 +191,7 @@ static void __cpuexit xen_smp_intr_exit(
+@@ -167,11 +183,7 @@ static void __cpuexit xen_smp_intr_exit(
  void __cpuinit cpu_bringup(void)
  {
        cpu_init();
@@ -23624,7 +23823,7 @@ Index: head-2008-12-01/drivers/xen/core/smpboot.c
        touch_softlockup_watchdog();
        preempt_disable();
        local_irq_enable();
-@@ -255,9 +271,6 @@ void __init smp_prepare_cpus(unsigned in
+@@ -251,9 +263,6 @@ void __init smp_prepare_cpus(unsigned in
        struct task_struct *idle;
        int apicid;
        struct vcpu_get_physid cpu_id;
@@ -23634,7 +23833,7 @@ Index: head-2008-12-01/drivers/xen/core/smpboot.c
        void *gdt_addr;
  
        apicid = 0;
-@@ -270,7 +283,7 @@ void __init smp_prepare_cpus(unsigned in
+@@ -266,7 +275,7 @@ void __init smp_prepare_cpus(unsigned in
  
        current_thread_info()->cpu = 0;
  
@@ -23643,7 +23842,7 @@ Index: head-2008-12-01/drivers/xen/core/smpboot.c
                cpus_clear(per_cpu(cpu_sibling_map, cpu));
                cpus_clear(per_cpu(cpu_core_map, cpu));
        }
-@@ -297,21 +310,10 @@ void __init smp_prepare_cpus(unsigned in
+@@ -293,21 +302,10 @@ void __init smp_prepare_cpus(unsigned in
                if (IS_ERR(idle))
                        panic("failed fork for CPU %d", cpu);
  
@@ -23667,11 +23866,28 @@ Index: head-2008-12-01/drivers/xen/core/smpboot.c
                make_page_readonly(gdt_addr, XENFEAT_writable_descriptor_tables);
  
                apicid = cpu;
-Index: head-2008-12-01/drivers/xen/core/spinlock.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/core/spinlock.c   2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/drivers/xen/core/spinlock.c        2008-12-01 11:51:53.000000000 +0100
-@@ -73,9 +73,9 @@ int xen_spin_wait(raw_spinlock_t *lock, 
+@@ -353,8 +351,8 @@ void __init smp_prepare_boot_cpu(void)
+ {
+ #ifdef __i386__
+       init_gdt(smp_processor_id());
+-      switch_to_new_gdt();
+ #endif
++      switch_to_new_gdt();
+       prefill_possible_map();
+ }
+--- sle11-2009-06-04.orig/drivers/xen/core/spinlock.c  2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/core/spinlock.c       2009-06-04 10:36:24.000000000 +0200
+@@ -5,6 +5,8 @@
+  *    portions of this file.
+  */
++#if CONFIG_XEN_COMPAT >= 0x030200
++
+ #include <linux/init.h>
+ #include <linux/irq.h>
+ #include <linux/kernel.h>
+@@ -73,9 +75,9 @@ int xen_spin_wait(raw_spinlock_t *lock, 
        /* announce we're spinning */
        spinning.ticket = token;
        spinning.lock = lock;
@@ -23683,7 +23899,7 @@ Index: head-2008-12-01/drivers/xen/core/spinlock.c
  
        /* clear pending */
        xen_clear_irq_pending(irq);
-@@ -102,7 +102,7 @@ int xen_spin_wait(raw_spinlock_t *lock, 
+@@ -102,7 +104,7 @@ int xen_spin_wait(raw_spinlock_t *lock, 
        kstat_this_cpu.irqs[irq] += !rc;
  
        /* announce we're done */
@@ -23692,10 +23908,14 @@ Index: head-2008-12-01/drivers/xen/core/spinlock.c
        rm_lock = &__get_cpu_var(spinning_rm_lock);
        raw_local_irq_save(flags);
        __raw_write_lock(rm_lock);
-Index: head-2008-12-01/drivers/xen/fbfront/xenfb.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/fbfront/xenfb.c   2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/fbfront/xenfb.c        2008-12-01 11:49:07.000000000 +0100
+@@ -159,3 +161,5 @@ void xen_spin_kick(raw_spinlock_t *lock,
+       }
+ }
+ EXPORT_SYMBOL(xen_spin_kick);
++
++#endif /* CONFIG_XEN_COMPAT >= 0x030200 */
+--- sle11-2009-06-04.orig/drivers/xen/fbfront/xenfb.c  2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/fbfront/xenfb.c       2009-06-04 10:21:39.000000000 +0200
 @@ -18,6 +18,7 @@
   * frame buffer.
   */
@@ -23704,7 +23924,7 @@ Index: head-2008-12-01/drivers/xen/fbfront/xenfb.c
  #include <linux/kernel.h>
  #include <linux/errno.h>
  #include <linux/fb.h>
-@@ -544,6 +545,28 @@ static unsigned long vmalloc_to_mfn(void
+@@ -545,6 +546,28 @@ static unsigned long vmalloc_to_mfn(void
        return pfn_to_mfn(vmalloc_to_pfn(address));
  }
  
@@ -23733,34 +23953,30 @@ Index: head-2008-12-01/drivers/xen/fbfront/xenfb.c
  static int __devinit xenfb_probe(struct xenbus_device *dev,
                                 const struct xenbus_device_id *id)
  {
-@@ -673,6 +696,7 @@ static int __devinit xenfb_probe(struct 
+@@ -665,6 +688,7 @@ static int __devinit xenfb_probe(struct 
+       if (ret < 0)
                goto error;
-       }
  
 +      xenfb_make_preferred_console();
        return 0;
  
   error_nomem:
-@@ -881,4 +905,5 @@ static void __exit xenfb_cleanup(void)
+@@ -882,4 +906,5 @@ static void __exit xenfb_cleanup(void)
  module_init(xenfb_init);
  module_exit(xenfb_cleanup);
  
 +MODULE_DESCRIPTION("Xen virtual framebuffer device frontend");
  MODULE_LICENSE("GPL");
-Index: head-2008-12-01/drivers/xen/fbfront/xenkbd.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/fbfront/xenkbd.c  2008-12-01 11:36:07.000000000 +0100
-+++ head-2008-12-01/drivers/xen/fbfront/xenkbd.c       2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/fbfront/xenkbd.c 2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/fbfront/xenkbd.c      2009-06-04 10:21:39.000000000 +0200
 @@ -350,4 +350,5 @@ static void __exit xenkbd_cleanup(void)
  module_init(xenkbd_init);
  module_exit(xenkbd_cleanup);
  
 +MODULE_DESCRIPTION("Xen virtual keyboard/pointer device frontend");
  MODULE_LICENSE("GPL");
-Index: head-2008-12-01/drivers/xen/gntdev/gntdev.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/gntdev/gntdev.c   2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/gntdev/gntdev.c        2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/gntdev/gntdev.c  2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/gntdev/gntdev.c       2009-06-04 10:21:39.000000000 +0200
 @@ -418,7 +418,7 @@ static int __init gntdev_init(void)
        }
  
@@ -23770,10 +23986,8 @@ Index: head-2008-12-01/drivers/xen/gntdev/gntdev.c
        if (IS_ERR(device)) {
                printk(KERN_ERR "Error creating gntdev device in xen_class\n");
                printk(KERN_ERR "gntdev created with major number = %d\n",
-Index: head-2008-12-01/drivers/xen/netfront/accel.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/netfront/accel.c  2008-12-01 11:36:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/netfront/accel.c       2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/netfront/accel.c 2009-03-30 16:39:19.000000000 +0200
++++ sle11-2009-06-04/drivers/xen/netfront/accel.c      2009-06-04 10:21:39.000000000 +0200
 @@ -28,6 +28,7 @@
   * IN THE SOFTWARE.
   */
@@ -23782,10 +23996,8 @@ Index: head-2008-12-01/drivers/xen/netfront/accel.c
  #include <linux/netdevice.h>
  #include <linux/skbuff.h>
  #include <linux/list.h>
-Index: head-2008-12-01/drivers/xen/netfront/netfront.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/netfront/netfront.c       2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/netfront/netfront.c    2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/netfront/netfront.c      2009-03-30 16:40:17.000000000 +0200
++++ sle11-2009-06-04/drivers/xen/netfront/netfront.c   2009-06-04 10:21:39.000000000 +0200
 @@ -640,7 +640,7 @@ static int network_open(struct net_devic
        }
        spin_unlock_bh(&np->rx_lock);
@@ -23795,10 +24007,8 @@ Index: head-2008-12-01/drivers/xen/netfront/netfront.c
  
        return 0;
  }
-Index: head-2008-12-01/drivers/xen/sfc_netback/accel.h
-===================================================================
---- head-2008-12-01.orig/drivers/xen/sfc_netback/accel.h       2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/drivers/xen/sfc_netback/accel.h    2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/sfc_netback/accel.h      2009-03-30 16:00:09.000000000 +0200
++++ sle11-2009-06-04/drivers/xen/sfc_netback/accel.h   2009-06-04 10:21:39.000000000 +0200
 @@ -25,6 +25,7 @@
  #ifndef NETBACK_ACCEL_H
  #define NETBACK_ACCEL_H
@@ -23807,10 +24017,8 @@ Index: head-2008-12-01/drivers/xen/sfc_netback/accel.h
  #include <linux/slab.h>
  #include <linux/ip.h>
  #include <linux/tcp.h>
-Index: head-2008-12-01/drivers/xen/sfc_netfront/accel.h
-===================================================================
---- head-2008-12-01.orig/drivers/xen/sfc_netfront/accel.h      2008-12-01 11:29:05.000000000 +0100
-+++ head-2008-12-01/drivers/xen/sfc_netfront/accel.h   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/sfc_netfront/accel.h     2009-03-30 16:34:56.000000000 +0200
++++ sle11-2009-06-04/drivers/xen/sfc_netfront/accel.h  2009-06-04 10:21:39.000000000 +0200
 @@ -35,6 +35,7 @@
  #include <xen/evtchn.h>
  
@@ -23819,10 +24027,19 @@ Index: head-2008-12-01/drivers/xen/sfc_netfront/accel.h
  #include <linux/list.h>
  
  enum netfront_accel_post_status {
-Index: head-2008-12-01/drivers/xen/xenbus/xenbus_comms.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/xenbus/xenbus_comms.c     2008-12-01 11:36:47.000000000 +0100
-+++ head-2008-12-01/drivers/xen/xenbus/xenbus_comms.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/xenbus/xenbus_client.c   2009-03-24 10:13:17.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/xenbus/xenbus_client.c        2009-06-04 10:21:39.000000000 +0200
+@@ -150,7 +150,7 @@ int xenbus_watch_pathfmt(struct xenbus_d
+       char *path;
+       va_start(ap, pathfmt);
+-      path = kvasprintf(GFP_KERNEL, pathfmt, ap);
++      path = kvasprintf(GFP_NOIO | __GFP_HIGH, pathfmt, ap);
+       va_end(ap);
+       if (!path) {
+--- sle11-2009-06-04.orig/drivers/xen/xenbus/xenbus_comms.c    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/xenbus/xenbus_comms.c 2009-06-04 10:21:39.000000000 +0200
 @@ -228,14 +228,11 @@ int xb_init_comms(void)
                intf->rsp_cons = intf->rsp_prod;
        }
@@ -23860,10 +24077,8 @@ Index: head-2008-12-01/drivers/xen/xenbus/xenbus_comms.c
  
        return 0;
  }
-Index: head-2008-12-01/drivers/xen/xenbus/xenbus_probe.c
-===================================================================
---- head-2008-12-01.orig/drivers/xen/xenbus/xenbus_probe.c     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/drivers/xen/xenbus/xenbus_probe.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/drivers/xen/xenbus/xenbus_probe.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/drivers/xen/xenbus/xenbus_probe.c 2009-06-04 10:21:39.000000000 +0200
 @@ -36,6 +36,7 @@
                 __FUNCTION__, __LINE__, ##args)
  
@@ -23872,11 +24087,9 @@ Index: head-2008-12-01/drivers/xen/xenbus/xenbus_probe.c
  #include <linux/err.h>
  #include <linux/string.h>
  #include <linux/ctype.h>
-Index: head-2008-12-01/fs/aio.c
-===================================================================
---- head-2008-12-01.orig/fs/aio.c      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/fs/aio.c   2008-12-01 11:49:07.000000000 +0100
-@@ -1319,7 +1319,7 @@ static int make_aio_fd(struct kioctx *io
+--- sle11-2009-06-04.orig/fs/aio.c     2009-03-24 10:13:25.000000000 +0100
++++ sle11-2009-06-04/fs/aio.c  2009-06-04 10:21:39.000000000 +0200
+@@ -1335,7 +1335,7 @@ static int make_aio_fd(struct kioctx *io
        int fd;
        struct file *file;
  
@@ -23885,10 +24098,8 @@ Index: head-2008-12-01/fs/aio.c
        if (fd < 0)
                return fd;
  
-Index: head-2008-12-01/include/asm-generic/pgtable.h
-===================================================================
---- head-2008-12-01.orig/include/asm-generic/pgtable.h 2008-12-01 11:29:05.000000000 +0100
-+++ head-2008-12-01/include/asm-generic/pgtable.h      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-generic/pgtable.h        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-06-04/include/asm-generic/pgtable.h     2009-06-04 10:21:39.000000000 +0200
 @@ -99,10 +99,6 @@ static inline void ptep_set_wrprotect(st
  }
  #endif
@@ -23900,10 +24111,8 @@ Index: head-2008-12-01/include/asm-generic/pgtable.h
  #ifndef __HAVE_ARCH_PTE_SAME
  #define pte_same(A,B) (pte_val(A) == pte_val(B))
  #endif
-Index: head-2008-12-01/include/asm-x86/dma-mapping.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/dma-mapping.h 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/dma-mapping.h      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/dma-mapping.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/dma-mapping.h     2009-06-04 10:21:39.000000000 +0200
 @@ -74,7 +74,7 @@ static inline struct dma_mapping_ops *ge
  /* Make sure we keep the same behaviour */
  static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
@@ -23913,10 +24122,37 @@ Index: head-2008-12-01/include/asm-x86/dma-mapping.h
        return 0;
  #else
        struct dma_mapping_ops *ops = get_dma_ops(dev);
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/desc.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/desc.h   2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/desc.h        2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/kexec.h      2008-12-01 11:11:08.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/kexec.h   2009-06-04 10:21:39.000000000 +0200
+@@ -10,6 +10,7 @@
+ # define VA_PTE_0             5
+ # define PA_PTE_1             6
+ # define VA_PTE_1             7
++# ifndef CONFIG_XEN
+ # define PA_SWAP_PAGE         8
+ # ifdef CONFIG_X86_PAE
+ #  define PA_PMD_0            9
+@@ -20,6 +21,18 @@
+ # else
+ #  define PAGES_NR            9
+ # endif
++# else /* CONFIG_XEN */
++/*
++ * The hypervisor interface implicitly requires that all entries (except
++ * for possibly the final one) are arranged in matching PA_/VA_ pairs.
++ */
++#  define PA_PMD_0            8
++#  define VA_PMD_0            9
++#  define PA_PMD_1            10
++#  define VA_PMD_1            11
++#  define PA_SWAP_PAGE                12
++#  define PAGES_NR            13
++# endif /* CONFIG_XEN */
+ #else
+ # define PA_CONTROL_PAGE      0
+ # define VA_CONTROL_PAGE      1
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/desc.h  2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/desc.h       2009-06-04 10:21:39.000000000 +0200
 @@ -31,11 +31,17 @@ extern struct desc_ptr idt_descr;
  extern gate_desc idt_table[];
  #endif
@@ -23985,10 +24221,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/desc.h
  /*
   * This routine sets up an interrupt gate at directory privilege level 3.
   */
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/fixmap.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/fixmap.h 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/fixmap.h      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/fixmap.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/fixmap.h     2009-06-04 10:21:39.000000000 +0200
 @@ -7,7 +7,58 @@
  # include "fixmap_64.h"
  #endif
@@ -24048,10 +24282,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/fixmap.h
 +      return __virt_to_fix(vaddr);
 +}
  #endif
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/fixmap_32.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/fixmap_32.h      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/fixmap_32.h   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-06-04 10:21:39.000000000 +0200
 @@ -58,10 +58,17 @@ enum fixed_addresses {
  #ifdef CONFIG_X86_LOCAL_APIC
        FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
@@ -24169,10 +24401,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/fixmap_32.h
 -
  #endif /* !__ASSEMBLY__ */
  #endif
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/fixmap_64.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/fixmap_64.h      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/fixmap_64.h   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-06-04 10:21:39.000000000 +0200
 @@ -12,6 +12,7 @@
  #define _ASM_FIXMAP_64_H
  
@@ -24272,10 +24502,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/fixmap_64.h
 -}
 -
  #endif
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/highmem.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/highmem.h        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/highmem.h     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/highmem.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/highmem.h    2009-06-04 10:21:39.000000000 +0200
 @@ -74,6 +74,9 @@ struct page *kmap_atomic_to_page(void *p
  
  #define flush_cache_kmaps()   do { } while (0)
@@ -24286,10 +24514,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/highmem.h
  void clear_highpage(struct page *);
  static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
  {
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/hypercall.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/hypercall.h      2008-12-01 11:36:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/hypercall.h   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/hypercall.h     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/hypercall.h  2009-06-04 10:21:39.000000000 +0200
 @@ -323,9 +323,19 @@ static inline int __must_check
  HYPERVISOR_grant_table_op(
        unsigned int cmd, void *uop, unsigned int count)
@@ -24311,10 +24537,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/hypercall.h
  }
  
  static inline int __must_check
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/hypervisor.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/hypervisor.h     2008-12-01 11:37:10.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/hypervisor.h  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/hypervisor.h 2009-06-04 10:21:39.000000000 +0200
 @@ -35,7 +35,6 @@
  
  #include <linux/types.h>
@@ -24323,10 +24547,21 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/hypervisor.h
  #include <linux/errno.h>
  #include <xen/interface/xen.h>
  #include <xen/interface/platform.h>
-@@ -171,6 +170,20 @@ static inline void arch_flush_lazy_mmu_m
- }
- #endif
+@@ -112,6 +111,8 @@ int xen_create_contiguous_region(
+     unsigned long vstart, unsigned int order, unsigned int address_bits);
+ void xen_destroy_contiguous_region(
+     unsigned long vstart, unsigned int order);
++int early_create_contiguous_region(unsigned long pfn, unsigned int order,
++                                 unsigned int address_bits);
+ struct page;
  
+@@ -181,6 +182,29 @@ static inline void xen_multicall_flush(b
+ #endif /* CONFIG_XEN && !MODULE */
++#ifdef CONFIG_XEN
++
 +struct gnttab_map_grant_ref;
 +bool gnttab_pre_map_adjust(unsigned int cmd, struct gnttab_map_grant_ref *,
 +                         unsigned int count);
@@ -24341,24 +24576,19 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/hypervisor.h
 +}
 +#endif
 +
- #else /* CONFIG_XEN */
- static inline void xen_multicall_flush(bool ignore) {}
-@@ -179,6 +192,9 @@ static inline void xen_multicall_flush(b
- #define xen_multi_mmu_update(...) ({ BUG(); -ENOSYS; })
- #define xen_multi_mmuext_op(...) ({ BUG(); -ENOSYS; })
++#else /* !CONFIG_XEN */
++
 +#define gnttab_pre_map_adjust(...) false
 +#define gnttab_post_map_adjust(...) ({ BUG(); -ENOSYS; })
 +
- #endif /* CONFIG_XEN */
++#endif /* CONFIG_XEN */
++
  #if defined(CONFIG_X86_64)
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/io.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/io.h     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/io.h  2008-12-01 11:49:07.000000000 +0100
-@@ -3,6 +3,76 @@
+ #define MULTI_UVMFLAGS_INDEX 2
+ #define MULTI_UVMDOMID_INDEX 3
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/io.h    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/io.h 2009-06-04 10:21:39.000000000 +0200
+@@ -3,20 +3,139 @@
  
  #define ARCH_HAS_IOREMAP_WC
  
@@ -24431,11 +24661,61 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/io.h
 +#define readq readq
 +#define writeq writeq
 +#endif
++
++#define native_io_delay xen_io_delay
 +
  #ifdef CONFIG_X86_32
- # include "io_32.h"
+-# include "io_32.h"
++# include "../../io_32.h"
  #else
-@@ -19,4 +89,17 @@ extern int ioremap_check_change_attr(uns
+-# include "io_64.h"
++# include "../../io_64.h"
++#endif
++
++#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
++
++/* We will be supplying our own /dev/mem implementation */
++#define ARCH_HAS_DEV_MEM
++
++#define page_to_pseudophys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
++#undef page_to_phys
++#define page_to_phys(page)     (phys_to_machine(page_to_pseudophys(page)))
++#define page_to_bus(page)      (phys_to_machine(page_to_pseudophys(page)))
++
++#define bvec_to_pseudophys(bv)         (page_to_pseudophys((bv)->bv_page) + \
++                                (unsigned long) (bv)->bv_offset)
++
++#define BIOVEC_PHYS_MERGEABLE(vec1, vec2) \
++      (bvec_to_phys(vec1) + (vec1)->bv_len == bvec_to_phys(vec2) \
++       && bvec_to_pseudophys(vec1) + (vec1)->bv_len \
++          == bvec_to_pseudophys(vec2))
++
++#undef virt_to_bus
++#undef bus_to_virt
++#define virt_to_bus(_x) phys_to_machine(__pa(_x))
++#define bus_to_virt(_x) __va(machine_to_phys(_x))
++
++#include <asm/fixmap.h>
++
++#undef isa_virt_to_bus
++#undef isa_page_to_bus
++#undef isa_bus_to_virt
++#define isa_virt_to_bus(_x) ({ BUG(); virt_to_bus(_x); })
++#define isa_page_to_bus(_x) isa_page_to_bus_is_UNSUPPORTED->_x
++#define isa_bus_to_virt(_x) ((void *)__fix_to_virt(FIX_ISAMAP_BEGIN) + (_x))
++
++#undef __ISA_IO_base
++#define __ISA_IO_base ((char __iomem *)fix_to_virt(FIX_ISAMAP_BEGIN))
++
+ #endif
+ extern void *xlate_dev_mem_ptr(unsigned long phys);
+ extern void unxlate_dev_mem_ptr(unsigned long phys, void *addr);
+-extern void map_devmem(unsigned long pfn, unsigned long len, pgprot_t);
+-extern void unmap_devmem(unsigned long pfn, unsigned long len, pgprot_t);
+-
+ extern int ioremap_check_change_attr(unsigned long mfn, unsigned long size,
                                     unsigned long prot_val);
  extern void __iomem *ioremap_wc(unsigned long offset, unsigned long size);
  
@@ -24453,189 +24733,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/io.h
 +
 +
  #endif /* _ASM_X86_IO_H */
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/io_32.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/io_32.h  2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/io_32.h       2008-12-01 11:49:07.000000000 +0100
-@@ -123,6 +123,8 @@ static inline void *phys_to_virt(unsigne
-  */
- extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size);
- extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size);
-+extern void __iomem *ioremap_prot(resource_size_t offset, unsigned long size,
-+                              unsigned long prot_val);
- /*
-  * The default ioremap() behavior is non-cached:
-@@ -135,18 +137,6 @@ static inline void __iomem *ioremap(reso
- extern void iounmap(volatile void __iomem *addr);
- /*
-- * early_ioremap() and early_iounmap() are for temporary early boot-time
-- * mappings, before the real ioremap() is functional.
-- * A boot-time mapping is currently limited to at most 16 pages.
-- */
--extern void early_ioremap_init(void);
--extern void early_ioremap_clear(void);
--extern void early_ioremap_reset(void);
--extern void *early_ioremap(unsigned long offset, unsigned long size);
--extern void early_iounmap(void *addr, unsigned long size);
--extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
--
--/*
-  * ISA I/O bus memory addresses are 1:1 with the physical address.
-  */
- #define isa_virt_to_bus(_x) ({ BUG(); virt_to_bus(_x); })
-@@ -162,55 +152,6 @@ extern void __iomem *fix_ioremap(unsigne
- #define virt_to_bus(_x) phys_to_machine(__pa(_x))
- #define bus_to_virt(_x) __va(machine_to_phys(_x))
--/*
-- * readX/writeX() are used to access memory mapped devices. On some
-- * architectures the memory mapped IO stuff needs to be accessed
-- * differently. On the x86 architecture, we just read/write the
-- * memory location directly.
-- */
--
--static inline unsigned char readb(const volatile void __iomem *addr)
--{
--      return *(volatile unsigned char __force *)addr;
--}
--
--static inline unsigned short readw(const volatile void __iomem *addr)
--{
--      return *(volatile unsigned short __force *)addr;
--}
--
--static inline unsigned int readl(const volatile void __iomem *addr)
--{
--      return *(volatile unsigned int __force *) addr;
--}
--
--#define readb_relaxed(addr) readb(addr)
--#define readw_relaxed(addr) readw(addr)
--#define readl_relaxed(addr) readl(addr)
--#define __raw_readb readb
--#define __raw_readw readw
--#define __raw_readl readl
--
--static inline void writeb(unsigned char b, volatile void __iomem *addr)
--{
--      *(volatile unsigned char __force *)addr = b;
--}
--
--static inline void writew(unsigned short b, volatile void __iomem *addr)
--{
--      *(volatile unsigned short __force *)addr = b;
--}
--
--static inline void writel(unsigned int b, volatile void __iomem *addr)
--{
--      *(volatile unsigned int __force *)addr = b;
--}
--#define __raw_writeb writeb
--#define __raw_writew writew
--#define __raw_writel writel
--
--#define mmiowb()
--
- static inline void
- memset_io(volatile void __iomem *addr, unsigned char val, int count)
- {
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/io_64.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/io_64.h  2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/io_64.h       2008-12-01 11:49:07.000000000 +0100
-@@ -190,6 +190,8 @@ extern void early_iounmap(void *addr, un
-  */
- extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size);
- extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size);
-+extern void __iomem *ioremap_prot(resource_size_t offset, unsigned long size,
-+                              unsigned long prot_val);
- /*
-  * The default ioremap() behavior is non-cached:
-@@ -220,77 +222,6 @@ extern void __iomem *fix_ioremap(unsigne
- #define virt_to_bus(_x) phys_to_machine(__pa(_x))
- #define bus_to_virt(_x) __va(machine_to_phys(_x))
--/*
-- * readX/writeX() are used to access memory mapped devices. On some
-- * architectures the memory mapped IO stuff needs to be accessed
-- * differently. On the x86 architecture, we just read/write the
-- * memory location directly.
-- */
--
--static inline __u8 __readb(const volatile void __iomem *addr)
--{
--      return *(__force volatile __u8 *)addr;
--}
--
--static inline __u16 __readw(const volatile void __iomem *addr)
--{
--      return *(__force volatile __u16 *)addr;
--}
--
--static __always_inline __u32 __readl(const volatile void __iomem *addr)
--{
--      return *(__force volatile __u32 *)addr;
--}
--
--static inline __u64 __readq(const volatile void __iomem *addr)
--{
--      return *(__force volatile __u64 *)addr;
--}
--
--#define readb(x) __readb(x)
--#define readw(x) __readw(x)
--#define readl(x) __readl(x)
--#define readq(x) __readq(x)
--#define readb_relaxed(a) readb(a)
--#define readw_relaxed(a) readw(a)
--#define readl_relaxed(a) readl(a)
--#define readq_relaxed(a) readq(a)
--#define __raw_readb readb
--#define __raw_readw readw
--#define __raw_readl readl
--#define __raw_readq readq
--
--#define mmiowb()
--
--static inline void __writel(__u32 b, volatile void __iomem *addr)
--{
--      *(__force volatile __u32 *)addr = b;
--}
--
--static inline void __writeq(__u64 b, volatile void __iomem *addr)
--{
--      *(__force volatile __u64 *)addr = b;
--}
--
--static inline void __writeb(__u8 b, volatile void __iomem *addr)
--{
--      *(__force volatile __u8 *)addr = b;
--}
--
--static inline void __writew(__u16 b, volatile void __iomem *addr)
--{
--      *(__force volatile __u16 *)addr = b;
--}
--
--#define writeq(val, addr) __writeq((val), (addr))
--#define writel(val, addr) __writel((val), (addr))
--#define writew(val, addr) __writew((val), (addr))
--#define writeb(val, addr) __writeb((val), (addr))
--#define __raw_writeb writeb
--#define __raw_writew writew
--#define __raw_writel writel
--#define __raw_writeq writeq
--
- void __memcpy_fromio(void *, unsigned long, unsigned);
- void __memcpy_toio(unsigned long, const void *, unsigned);
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/irq_vectors.h
-===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/irq_vectors.h 2008-12-01 11:49:07.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/irq_vectors.h        2009-06-04 10:21:39.000000000 +0200
 @@ -0,0 +1,52 @@
 +#ifndef _ASM_IRQ_VECTORS_H
 +#define _ASM_IRQ_VECTORS_H
@@ -24674,12 +24773,12 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/irq_vectors.h
 + */
 +
 +#define PIRQ_BASE             0
-+#if !defined(MAX_IO_APICS)
-+# define NR_PIRQS             (NR_VECTORS + 32 * NR_CPUS)
-+#elif NR_CPUS < MAX_IO_APICS
-+# define NR_PIRQS             (NR_VECTORS + 32 * NR_CPUS)
-+#else
-+# define NR_PIRQS             (NR_VECTORS + 32 * MAX_IO_APICS)
++#if defined(NR_CPUS) && defined(MAX_IO_APICS)
++# if NR_CPUS < MAX_IO_APICS
++#  define NR_PIRQS            (NR_VECTORS + 32 * NR_CPUS)
++# else
++#  define NR_PIRQS            (NR_VECTORS + 32 * MAX_IO_APICS)
++# endif
 +#endif
 +
 +#define DYNIRQ_BASE           (PIRQ_BASE + NR_PIRQS)
@@ -24689,10 +24788,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/irq_vectors.h
 +#define NR_IRQ_VECTORS                NR_IRQS
 +
 +#endif /* _ASM_IRQ_VECTORS_H */
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/irqflags.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/irqflags.h       2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/irqflags.h    2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/irqflags.h      2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/irqflags.h   2009-06-04 10:21:39.000000000 +0200
 @@ -118,7 +118,7 @@ static inline void halt(void)
  
  #ifndef CONFIG_X86_64
@@ -24757,10 +24854,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/irqflags.h
  #else
  #  define TRACE_IRQS_ON
  #  define TRACE_IRQS_OFF
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/mmu_context.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/mmu_context.h    2008-12-01 11:36:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/mmu_context.h 2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/mmu_context.h   2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/mmu_context.h        2009-06-04 10:21:39.000000000 +0200
 @@ -1,5 +1,42 @@
 +#ifndef __ASM_X86_MMU_CONTEXT_H
 +#define __ASM_X86_MMU_CONTEXT_H
@@ -24804,10 +24899,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/mmu_context.h
 +
 +
 +#endif /* __ASM_X86_MMU_CONTEXT_H */
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/mmu_context_32.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/mmu_context_32.h      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/mmu_context_32.h     2009-06-04 10:21:39.000000000 +0200
 @@ -1,32 +1,6 @@
  #ifndef __I386_SCHED_H
  #define __I386_SCHED_H
@@ -24852,10 +24945,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/mmu_context_32.h
 -} while (0)
 -
  #endif
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/mmu_context_64.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/mmu_context_64.h      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/mmu_context_64.h     2009-06-04 10:21:39.000000000 +0200
 @@ -1,23 +1,6 @@
  #ifndef __X86_64_MMU_CONTEXT_H
  #define __X86_64_MMU_CONTEXT_H
@@ -24903,10 +24994,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/mmu_context_64.h
 -}
 -
  #endif
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/page.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/page.h   2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/page.h        2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/page.h  2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/page.h       2009-06-04 10:21:39.000000000 +0200
 @@ -16,9 +16,9 @@
   * below. The preprocessor will warn if the two definitions aren't identical.
   */
@@ -24998,10 +25087,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/page.h
  #define __pte(x)      xen_make_pte(x)
  
  #define __pa(x)               __phys_addr((unsigned long)(x))
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/page_64.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/page_64.h        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/page_64.h     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/page_64.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/page_64.h    2009-06-04 10:21:39.000000000 +0200
 @@ -26,6 +26,12 @@
  #define PUD_PAGE_SIZE         (_AC(1, UL) << PUD_SHIFT)
  #define PUD_PAGE_MASK         (~(PUD_PAGE_SIZE-1))
@@ -25037,10 +25124,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/page_64.h
  #endif        /* !__ASSEMBLY__ */
  
  #ifdef CONFIG_FLATMEM
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pci.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/pci.h    2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/pci.h 2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/pci.h   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/pci.h        2009-06-04 10:21:39.000000000 +0200
 @@ -21,6 +21,8 @@ struct pci_sysdata {
  #endif
  };
@@ -25050,10 +25135,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pci.h
  /* scan a bus after allocating a pci_sysdata for it */
  extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops,
                                            int node);
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pci_32.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/pci_32.h 2008-12-01 11:36:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/pci_32.h      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/pci_32.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/pci_32.h     2009-06-04 10:21:39.000000000 +0200
 @@ -38,12 +38,14 @@ struct pci_dev;
  #define PCI_DMA_BUS_IS_PHYS   (1)
  
@@ -25075,10 +25158,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pci_32.h
  
  #endif
  
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgalloc.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/pgalloc.h        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/pgalloc.h     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/pgalloc.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/pgalloc.h    2009-06-04 10:21:39.000000000 +0200
 @@ -7,6 +7,9 @@
  
  #include <asm/io.h>           /* for phys_to_virt and page_to_pseudophys */
@@ -25089,10 +25170,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgalloc.h
  static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned long pfn)        {}
  static inline void paravirt_alloc_pmd(struct mm_struct *mm, unsigned long pfn)        {}
  static inline void paravirt_alloc_pmd_clone(unsigned long pfn, unsigned long clonepfn,
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/pgtable.h        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable.h     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/pgtable.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/pgtable.h    2009-06-04 10:21:39.000000000 +0200
 @@ -13,11 +13,12 @@
  #define _PAGE_BIT_PSE         7       /* 4 MB (or 2MB) page */
  #define _PAGE_BIT_PAT         7       /* on 4KB pages */
@@ -25470,9 +25549,9 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable.h
  #define arbitrary_virt_to_machine(va)                                 \
  ({                                                                    \
        unsigned int __lvl;                                             \
-@@ -535,6 +570,44 @@ static inline void clone_pgd_range(pgd_t
-        | ((unsigned long)(va) & (PAGE_SIZE - 1)));                    \
- })
+@@ -548,6 +583,34 @@ struct page *kmap_atomic_to_page(void *)
+ #define ptep_to_machine(ptep) virt_to_machine(ptep)
+ #endif
  
 +#define __HAVE_ARCH_PTEP_MODIFY_PROT_TRANSACTION
 +static inline pte_t ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr,
@@ -25485,10 +25564,6 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable.h
 +      return *ptep;
 +}
 +
-+#ifdef CONFIG_HIGHPTE
-+extern void *high_memory;
-+#endif
-+
 +static inline void ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr,
 +                                         pte_t *ptep, pte_t pte)
 +{
@@ -25500,13 +25575,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable.h
 +              return;
 +      }
 +#endif
-+#ifdef CONFIG_HIGHPTE
-+      if ((void *)ptep > high_memory)
-+              u.ptr = arbitrary_virt_to_machine(ptep)
-+                      | MMU_PT_UPDATE_PRESERVE_AD;
-+      else
-+#endif
-+              u.ptr = virt_to_machine(ptep) | MMU_PT_UPDATE_PRESERVE_AD;
++      u.ptr = ptep_to_machine(ptep) | MMU_PT_UPDATE_PRESERVE_AD;
 +      u.val = __pte_val(pte);
 +      if (HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF))
 +              BUG();
@@ -25515,7 +25584,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable.h
  #include <asm-generic/pgtable.h>
  
  #include <xen/features.h>
-@@ -563,10 +636,6 @@ int touch_pte_range(struct mm_struct *mm
+@@ -576,10 +639,6 @@ int touch_pte_range(struct mm_struct *mm
                      unsigned long address,
                      unsigned long size);
  
@@ -25526,10 +25595,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable.h
  #endif        /* __ASSEMBLY__ */
  
  #endif        /* _ASM_X86_PGTABLE_H */
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable-3level.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable-3level.h      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-06-04 10:21:39.000000000 +0200
 @@ -14,11 +14,11 @@
  #define pmd_ERROR(e)                                                  \
        printk("%s:%d: bad pmd %p(%016Lx pfn %08Lx).\n",                \
@@ -25565,10 +25632,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable-3level.h
  
  
  /* Find an entry in the second-level page table.. */
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable_32.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/pgtable_32.h     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable_32.h  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-06-04 10:21:39.000000000 +0200
 @@ -89,10 +89,10 @@ extern unsigned long pg0[];
  /* pmd_present doesn't just test the _PAGE_PRESENT bit since wr.p.t.
     can temporarily clear it. */
@@ -25618,10 +25683,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable_32.h
  
  #if defined(CONFIG_HIGHPTE)
  #define pte_offset_map(dir, address)                                  \
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable_64.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/pgtable_64.h     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable_64.h  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-06-04 10:21:39.000000000 +0200
 @@ -23,6 +23,8 @@ extern void xen_init_pt(void);
  extern pud_t level3_kernel_pgt[512];
  extern pud_t level3_ident_pgt[512];
@@ -25641,7 +25704,13 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable_64.h
  #define __xen_pte_clear(ptep) xen_set_pte(ptep, __pte(0))
  
  static inline void xen_set_pte(pte_t *ptep, pte_t pte)
-@@ -150,24 +155,24 @@ static inline void xen_pgd_clear(pgd_t *
+@@ -145,29 +150,29 @@ static inline void xen_pgd_clear(pgd_t *
+ #define PGDIR_MASK    (~(PGDIR_SIZE - 1))
+-#define MAXMEM                 _AC(0x00003fffffffffff, UL)
++#define MAXMEM                 _AC(0x000004ffffffffff, UL)
+ #define VMALLOC_START    _AC(0xffffc20000000000, UL)
  #define VMALLOC_END      _AC(0xffffe1ffffffffff, UL)
  #define VMEMMAP_START  _AC(0xffffe20000000000, UL)
  #define MODULES_VADDR    _AC(0xffffffffa0000000, UL)
@@ -25701,10 +25770,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/pgtable_64.h
  #define pmd_page(pmd)         (pfn_to_page(pmd_val((pmd)) >> PAGE_SHIFT))
  
  #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/processor.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/processor.h      2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/processor.h   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/processor.h     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/processor.h  2009-06-04 10:21:39.000000000 +0200
 @@ -134,7 +134,7 @@ extern __u32                       cleared_cpu_caps[NCAPINTS
  #ifdef CONFIG_SMP
  DECLARE_PER_CPU(struct cpuinfo_x86, cpu_info);
@@ -25779,10 +25846,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/processor.h
  
  extern void enable_sep_cpu(void);
  extern int sysenter_setup(void);
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/segment.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/segment.h        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/segment.h     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/segment.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/segment.h    2009-06-04 10:21:39.000000000 +0200
 @@ -1,6 +1,15 @@
  #ifndef _ASM_X86_SEGMENT_H_
  #define _ASM_X86_SEGMENT_H_
@@ -25860,10 +25925,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/segment.h
  /* User mode is privilege level 3 */
  #define USER_RPL              0x3
  /* LDT segment has TI set, GDT has it cleared */
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/smp.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/smp.h    2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/smp.h 2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/smp.h   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/smp.h        2009-06-04 10:21:39.000000000 +0200
 @@ -25,23 +25,16 @@ extern cpumask_t cpu_initialized;
  extern void (*mtrr_hook)(void);
  extern void zap_low_mappings(void);
@@ -25979,11 +26042,21 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/smp.h
 -extern void unlock_ipi_call_lock(void);
  #endif /* __ASSEMBLY__ */
  #endif
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/spinlock.h       2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h    2008-12-01 11:49:07.000000000 +0100
-@@ -65,14 +65,14 @@ extern void xen_spin_kick(raw_spinlock_t
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/spinlock.h      2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/spinlock.h   2009-06-04 11:09:05.000000000 +0200
+@@ -38,6 +38,11 @@
+ # define UNLOCK_LOCK_PREFIX
+ #endif
++/*
++ * Xen versions prior to 3.2.x have a race condition with HYPERVISOR_poll().
++ */
++#if CONFIG_XEN_COMPAT >= 0x030200
++
+ int xen_spinlock_init(unsigned int cpu);
+ void xen_spinlock_cleanup(unsigned int cpu);
+ extern int xen_spin_wait(raw_spinlock_t *, unsigned int token);
+@@ -65,14 +70,14 @@ extern void xen_spin_kick(raw_spinlock_t
   */
  #if (NR_CPUS < 256)
  #define TICKET_SHIFT 8
@@ -26000,7 +26073,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
        asm("1:\t" \
            "cmpb %h0, %b0\n\t" \
            "je 2f\n\t" \
-@@ -88,7 +88,7 @@ extern void xen_spin_kick(raw_spinlock_t
+@@ -88,7 +93,7 @@ extern void xen_spin_kick(raw_spinlock_t
            : "memory", "cc")
  
  
@@ -26009,7 +26082,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
  {
        int tmp, new;
  
-@@ -107,7 +107,7 @@ static __always_inline int __raw_spin_tr
+@@ -107,7 +112,7 @@ static __always_inline int __raw_spin_tr
        return tmp;
  }
  
@@ -26018,7 +26091,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
  {
        unsigned int token;
        unsigned char kick;
-@@ -124,7 +124,7 @@ static __always_inline void __raw_spin_u
+@@ -124,7 +129,7 @@ static __always_inline void __raw_spin_u
  }
  #else
  #define TICKET_SHIFT 16
@@ -26027,7 +26100,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
        do { \
                unsigned int tmp; \
                asm(LOCK_PREFIX "xaddl %0, %2\n\t" \
-@@ -136,7 +136,7 @@ static __always_inline void __raw_spin_u
+@@ -136,7 +141,7 @@ static __always_inline void __raw_spin_u
                    : "0" (0x00010000) \
                    : "memory", "cc"); \
        } while (0)
@@ -26036,7 +26109,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
        do { \
                unsigned int tmp; \
                asm("shldl $16, %0, %2\n" \
-@@ -155,7 +155,7 @@ static __always_inline void __raw_spin_u
+@@ -155,7 +160,7 @@ static __always_inline void __raw_spin_u
                    : "memory", "cc"); \
        } while (0)
  
@@ -26045,7 +26118,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
  {
        int tmp;
        int new;
-@@ -177,7 +177,7 @@ static __always_inline int __raw_spin_tr
+@@ -177,7 +182,7 @@ static __always_inline int __raw_spin_tr
        return tmp;
  }
  
@@ -26054,7 +26127,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
  {
        unsigned int token, tmp;
        bool kick;
-@@ -195,49 +195,145 @@ static __always_inline void __raw_spin_u
+@@ -195,49 +200,161 @@ static __always_inline void __raw_spin_u
  }
  #endif
  
@@ -26110,7 +26183,9 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
        } while (unlikely(!count) && !xen_spin_wait_flags(lock, &token, flags));
  }
  
-+#ifdef CONFIG_PARAVIRT
++#define __raw_spin(n) __ticket_spin_##n
++
++#else /* CONFIG_XEN_COMPAT < 0x030200 */
 +/*
 + * Define virtualization-friendly old-style lock byte lock, for use in
 + * pv_lock_ops if desired.
@@ -26122,10 +26197,17 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
 + * __byte_spin_is_contended.
 + */
 +struct __byte_spinlock {
-+      s8 lock;
-+      s8 spinners;
++      u8 lock;
++#if NR_CPUS < 256
++      u8 spinners;
++#else
++#error NR_CPUS >= 256 support not implemented
++#endif
 +};
 +
++static inline int xen_spinlock_init(unsigned int cpu) { return 0; }
++static inline void xen_spinlock_cleanup(unsigned int cpu) {}
++
 +static inline int __byte_spin_is_locked(raw_spinlock_t *lock)
 +{
 +      struct __byte_spinlock *bl = (struct __byte_spinlock *)lock;
@@ -26156,6 +26238,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
 +          : "+m" (bl->lock), "+q" (val), "+m" (bl->spinners): : "memory");
 +}
 +
++#define __byte_spin_lock_flags(lock, flags) __byte_spin_lock(lock)
++
 +static inline int __byte_spin_trylock(raw_spinlock_t *lock)
 +{
 +      struct __byte_spinlock *bl = (struct __byte_spinlock *)lock;
@@ -26173,46 +26257,49 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/spinlock.h
 +      smp_wmb();
 +      bl->lock = 0;
 +}
-+#else  /* !CONFIG_PARAVIRT */
++
++#define __raw_spin(n) __byte_spin_##n
++
++#endif /* CONFIG_XEN_COMPAT */
++
 +static inline int __raw_spin_is_locked(raw_spinlock_t *lock)
 +{
-+      return __ticket_spin_is_locked(lock);
++      return __raw_spin(is_locked)(lock);
 +}
 +
 +static inline int __raw_spin_is_contended(raw_spinlock_t *lock)
 +{
-+      return __ticket_spin_is_contended(lock);
++      return __raw_spin(is_contended)(lock);
 +}
 +
 +static __always_inline void __raw_spin_lock(raw_spinlock_t *lock)
 +{
-+      __ticket_spin_lock(lock);
++      __raw_spin(lock)(lock);
 +}
 +
 +static __always_inline void __raw_spin_lock_flags(raw_spinlock_t *lock,
 +                                                unsigned long flags)
 +{
-+      __ticket_spin_lock_flags(lock, flags);
++      __raw_spin(lock_flags)(lock, flags);
 +}
 +
 +static __always_inline int __raw_spin_trylock(raw_spinlock_t *lock)
 +{
-+      return __ticket_spin_trylock(lock);
++      return __raw_spin(trylock)(lock);
 +}
 +
 +static __always_inline void __raw_spin_unlock(raw_spinlock_t *lock)
 +{
-+      __ticket_spin_unlock(lock);
++      __raw_spin(unlock)(lock);
 +}
-+#endif        /* CONFIG_PARAVIRT */
++
++#undef __raw_spin
 +
  static inline void __raw_spin_unlock_wait(raw_spinlock_t *lock)
  {
        while (__raw_spin_is_locked(lock))
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/system.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/system.h 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/system.h      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/system.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/system.h     2009-06-04 10:21:39.000000000 +0200
 @@ -137,7 +137,7 @@ __asm__ __volatile__ ("movw %%dx,%1\n\t"
  #define set_base(ldt, base) _set_base(((char *)&(ldt)) , (base))
  #define set_limit(ldt, limit) _set_limit(((char *)&(ldt)) , ((limit)-1))
@@ -26262,10 +26349,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/system.h
  
  /*
   * Force strict CPU ordering.
-Index: head-2008-12-01/include/asm-x86/mach-xen/asm/xor_64.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/asm/xor_64.h 2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/mach-xen/asm/xor_64.h      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/xor_64.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/xor_64.h     2009-06-04 10:21:39.000000000 +0200
 @@ -1,3 +1,6 @@
 +#ifndef ASM_X86__XOR_64_H
 +#define ASM_X86__XOR_64_H
@@ -26279,9 +26364,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/asm/xor_64.h
  #define XOR_SELECT_TEMPLATE(FASTEST) (&xor_block_sse)
 +
 +#endif /* ASM_X86__XOR_64_H */
-Index: head-2008-12-01/include/asm-x86/mach-xen/irq_vectors.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/irq_vectors.h        2008-12-01 11:37:10.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/irq_vectors.h       2009-03-16 16:33:40.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,126 +0,0 @@
 -/*
@@ -26410,9 +26493,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/irq_vectors.h
 -#define NR_IRQ_VECTORS                NR_IRQS
 -
 -#endif /* _ASM_IRQ_VECTORS_H */
-Index: head-2008-12-01/include/asm-x86/mach-xen/setup_arch_post.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/setup_arch_post.h    2008-12-03 15:48:43.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/setup_arch_post.h   2009-06-04 11:08:07.000000000 +0200
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,63 +0,0 @@
 -/**
@@ -26478,9 +26559,7 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/setup_arch_post.h
 -#endif
 -#endif
 -}
-Index: head-2008-12-01/include/asm-x86/mach-xen/setup_arch_pre.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/mach-xen/setup_arch_pre.h     2008-12-03 15:48:43.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/mach-xen/setup_arch_pre.h    2009-06-04 11:08:07.000000000 +0200
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,5 +0,0 @@
 -/* Hook to call BIOS initialisation function */
@@ -26488,10 +26567,8 @@ Index: head-2008-12-01/include/asm-x86/mach-xen/setup_arch_pre.h
 -#define ARCH_SETUP machine_specific_arch_setup();
 -
 -static void __init machine_specific_arch_setup(void);
-Index: head-2008-12-01/include/asm-x86/traps.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/traps.h       2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/traps.h    2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/traps.h      2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/include/asm-x86/traps.h   2009-06-04 10:21:39.000000000 +0200
 @@ -23,6 +23,9 @@ asmlinkage void spurious_interrupt_bug(v
  #ifdef CONFIG_X86_MCE
  asmlinkage void machine_check(void);
@@ -26512,23 +26589,8 @@ Index: head-2008-12-01/include/asm-x86/traps.h
  unsigned long patch_espfix_desc(unsigned long, unsigned long);
  asmlinkage void math_emulate(long);
  
-Index: head-2008-12-01/include/asm-x86/xen/hypercall.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/xen/hypercall.h       2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/xen/hypercall.h    2008-12-01 11:49:07.000000000 +0100
-@@ -264,7 +264,7 @@ HYPERVISOR_fpu_taskswitch(int set)
- static inline int
- HYPERVISOR_sched_op(int cmd, void *arg)
- {
--      return _hypercall2(int, sched_op_new, cmd, arg);
-+      return _hypercall2(int, sched_op, cmd, arg);
- }
- static inline long
-Index: head-2008-12-01/include/asm-x86/xen/interface_64.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/xen/interface_64.h    2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/xen/interface_64.h 2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/asm-x86/xen/interface_64.h   2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/include/asm-x86/xen/interface_64.h        2009-06-04 10:21:39.000000000 +0200
 @@ -136,7 +136,7 @@ struct cpu_user_regs {
      uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base.     */
      uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
@@ -26538,11 +26600,9 @@ Index: head-2008-12-01/include/asm-x86/xen/interface_64.h
  
  #undef __DECL_REG
  
-Index: head-2008-12-01/include/linux/page-flags.h
-===================================================================
---- head-2008-12-01.orig/include/linux/page-flags.h    2008-12-01 11:48:52.000000000 +0100
-+++ head-2008-12-01/include/linux/page-flags.h 2008-12-01 11:49:07.000000000 +0100
-@@ -109,9 +109,11 @@ enum pageflags {
+--- sle11-2009-06-04.orig/include/linux/page-flags.h   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/linux/page-flags.h        2009-06-04 10:21:39.000000000 +0200
+@@ -110,9 +110,11 @@ enum pageflags {
        /* Filesystems */
        PG_checked = PG_owner_priv_1,
  
@@ -26554,7 +26614,7 @@ Index: head-2008-12-01/include/linux/page-flags.h
  
        /* SLOB */
        PG_slob_page = PG_active,
-@@ -185,8 +187,12 @@ PAGEFLAG(LRU, lru) __CLEARPAGEFLAG(LRU, 
+@@ -187,8 +189,12 @@ PAGEFLAG(LRU, lru) __CLEARPAGEFLAG(LRU, 
  PAGEFLAG(Active, active) __CLEARPAGEFLAG(Active, active)
  __PAGEFLAG(Slab, slab)
  PAGEFLAG(Checked, checked)            /* Used by some filesystems */
@@ -26567,10 +26627,8 @@ Index: head-2008-12-01/include/linux/page-flags.h
  PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)
  PAGEFLAG(Private, private) __CLEARPAGEFLAG(Private, private)
        __SETPAGEFLAG(Private, private)
-Index: head-2008-12-01/include/xen/interface/memory.h
-===================================================================
---- head-2008-12-01.orig/include/xen/interface/memory.h        2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/include/xen/interface/memory.h     2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/include/xen/interface/memory.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/include/xen/interface/memory.h    2009-06-04 10:21:39.000000000 +0200
 @@ -82,6 +82,7 @@ struct xen_memory_reservation {
      domid_t        domid;
  
@@ -26629,10 +26687,8 @@ Index: head-2008-12-01/include/xen/interface/memory.h
  };
  DEFINE_XEN_GUEST_HANDLE_STRUCT(xen_translate_gpfn_list);
  typedef struct xen_translate_gpfn_list xen_translate_gpfn_list_t;
-Index: head-2008-12-01/kernel/hrtimer.c
-===================================================================
---- head-2008-12-01.orig/kernel/hrtimer.c      2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/kernel/hrtimer.c   2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/kernel/hrtimer.c     2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/kernel/hrtimer.c  2009-06-04 10:21:39.000000000 +0200
 @@ -1084,7 +1084,7 @@ ktime_t hrtimer_get_remaining(const stru
  }
  EXPORT_SYMBOL_GPL(hrtimer_get_remaining);
@@ -26642,11 +26698,20 @@ Index: head-2008-12-01/kernel/hrtimer.c
  /**
   * hrtimer_get_next_event - get the time until next expiry event
   *
-Index: head-2008-12-01/kernel/timer.c
-===================================================================
---- head-2008-12-01.orig/kernel/timer.c        2008-12-03 15:48:43.000000000 +0100
-+++ head-2008-12-01/kernel/timer.c     2008-12-01 11:49:07.000000000 +0100
-@@ -815,7 +815,7 @@ static inline void __run_timers(struct t
+--- sle11-2009-06-04.orig/kernel/kexec.c       2009-02-17 12:38:20.000000000 +0100
++++ sle11-2009-06-04/kernel/kexec.c    2009-06-04 10:21:39.000000000 +0200
+@@ -54,7 +54,7 @@ int dump_after_notifier;
+ unsigned char vmcoreinfo_data[VMCOREINFO_BYTES];
+ u32
+ #if defined(CONFIG_XEN) && defined(CONFIG_X86)
+-__attribute__((__section__(".bss.page_aligned"), __aligned__(PAGE_SIZE)))
++__page_aligned_bss
+ #endif
+ vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4];
+ size_t vmcoreinfo_size;
+--- sle11-2009-06-04.orig/kernel/timer.c       2009-06-04 11:08:07.000000000 +0200
++++ sle11-2009-06-04/kernel/timer.c    2009-06-04 10:21:39.000000000 +0200
+@@ -884,7 +884,7 @@ static inline void __run_timers(struct t
        spin_unlock_irq(&base->lock);
  }
  
@@ -26655,10 +26720,8 @@ Index: head-2008-12-01/kernel/timer.c
  /*
   * Find out when the next timer event is due to happen. This
   * is used on S/390 to stop all activity when a cpus is idle.
-Index: head-2008-12-01/lib/swiotlb-xen.c
-===================================================================
---- head-2008-12-01.orig/lib/swiotlb-xen.c     2008-12-01 11:44:55.000000000 +0100
-+++ head-2008-12-01/lib/swiotlb-xen.c  2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/lib/swiotlb-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-06-04/lib/swiotlb-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -750,7 +750,7 @@ swiotlb_sync_sg_for_device(struct device
  }
  
@@ -26668,10 +26731,8 @@ Index: head-2008-12-01/lib/swiotlb-xen.c
  {
        return (dma_addr == virt_to_bus(io_tlb_overflow_buffer));
  }
-Index: head-2008-12-01/mm/mprotect.c
-===================================================================
---- head-2008-12-01.orig/mm/mprotect.c 2008-12-01 11:29:05.000000000 +0100
-+++ head-2008-12-01/mm/mprotect.c      2008-12-01 11:49:07.000000000 +0100
+--- sle11-2009-06-04.orig/mm/mprotect.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-06-04/mm/mprotect.c     2009-06-04 10:21:39.000000000 +0200
 @@ -92,8 +92,6 @@ static inline void change_pmd_range(stru
                next = pmd_addr_end(addr, end);
                if (pmd_none_or_clear_bad(pmd))