[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Merged.



# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID cf89e8f0831b3a483c1b8c614d1b8eb02180548b
# Parent  516cf6553011ac4263814c7f7c0cf358f629a906
# Parent  1ecb7f1ddc7900f34a7d7d962e5be3df3d850d61
Merged.

diff -r 516cf6553011 -r cf89e8f0831b buildconfigs/mk.linux-2.6-xen
--- a/buildconfigs/mk.linux-2.6-xen     Mon Mar 20 08:56:46 2006
+++ b/buildconfigs/mk.linux-2.6-xen     Mon Mar 20 08:56:54 2006
@@ -2,8 +2,8 @@
 OS           = linux
 
 LINUX_SERIES = 2.6
-LINUX_VER    = 2.6.16-rc5
-LINUX_SRCS = linux-2.6.15.tar.bz2 patch-2.6.16-rc5.bz2
+LINUX_VER    = 2.6.16-rc6
+LINUX_SRCS = linux-2.6.15.tar.bz2 patch-2.6.16-rc6.bz2
 LINUX_PDIR = linux-$(LINUX_VER)
 
 EXTRAVERSION ?= xen
@@ -34,7 +34,7 @@
        touch $(@D)/.hgskip
        touch $@
 
-pristine-linux-%.16-rc5/.valid-pristine: pristine-$(LINUX_PDIR)/.valid-srcs
+pristine-linux-%.16-rc6/.valid-pristine: pristine-$(LINUX_PDIR)/.valid-srcs
        touch $@ # update timestamp to avoid rebuild
 
 $(LINUX_DIR)/include/linux/autoconf.h: ref-$(OS)-$(LINUX_VER)/.valid-ref
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/arch/i386/kernel/Makefile
--- a/linux-2.6-xen-sparse/arch/i386/kernel/Makefile    Mon Mar 20 08:56:46 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/Makefile    Mon Mar 20 08:56:54 2006
@@ -11,7 +11,7 @@
 
 obj-y                          += cpu/
 obj-y                          += timers/
-obj-$(CONFIG_ACPI)             += acpi/
+obj-y                          += acpi/
 obj-$(CONFIG_X86_BIOS_REBOOT)  += reboot.o
 obj-$(CONFIG_MCA)              += mca.o
 obj-$(CONFIG_X86_MSR)          += msr.o
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/arch/i386/kernel/acpi/Makefile
--- a/linux-2.6-xen-sparse/arch/i386/kernel/acpi/Makefile       Mon Mar 20 
08:56:46 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/acpi/Makefile       Mon Mar 20 
08:56:54 2006
@@ -1,4 +1,4 @@
-obj-y                          := boot.o
+obj-$(CONFIG_ACPI)             += boot.o
 obj-$(CONFIG_X86_IO_APIC)      += earlyquirk.o
 obj-$(CONFIG_ACPI_SLEEP)       += sleep.o wakeup.o
 
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/arch/i386/kernel/acpi/boot-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/acpi/boot-xen.c     Mon Mar 20 
08:56:46 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/acpi/boot-xen.c     Mon Mar 20 
08:56:54 2006
@@ -44,6 +44,9 @@
 extern int gsi_irq_sharing(int gsi);
 #include <asm/proto.h>
 
+static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) { 
return 0; }
+
+
 #else                          /* X86 */
 
 #ifdef CONFIG_X86_LOCAL_APIC
@@ -1111,9 +1114,6 @@
                disable_acpi();
                return error;
        }
-#ifdef __i386__
-       check_acpi_pci();
-#endif
 
        acpi_table_parse(ACPI_BOOT, acpi_parse_sbf);
 
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/arch/i386/kernel/cpu/common-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/cpu/common-xen.c    Mon Mar 20 
08:56:46 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/cpu/common-xen.c    Mon Mar 20 
08:56:54 2006
@@ -283,10 +283,10 @@
                        c->x86_capability[4] = excap;
                        c->x86 = (tfms >> 8) & 15;
                        c->x86_model = (tfms >> 4) & 15;
-                       if (c->x86 == 0xf) {
+                       if (c->x86 == 0xf)
                                c->x86 += (tfms >> 20) & 0xff;
+                       if (c->x86 >= 0x6)
                                c->x86_model += ((tfms >> 16) & 0xF) << 4;
-                       } 
                        c->x86_mask = tfms & 15;
                } else {
                        /* Have CPUID level 0 only - unheard of */
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c       Mon Mar 20 
08:56:46 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c       Mon Mar 20 
08:56:54 2006
@@ -92,6 +92,8 @@
 static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
 
 static DEFINE_SPINLOCK(ioapic_lock);
+
+int timer_over_8254 __initdata = 1;
 
 /*
  *     Is the SiS APIC rmw bug present ?
@@ -2329,7 +2331,8 @@
        apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
        init_8259A(1);
        timer_ack = 1;
-       enable_8259A_irq(0);
+       if (timer_over_8254 > 0)
+               enable_8259A_irq(0);
 
        pin1  = find_isa_irq_pin(0, mp_INT);
        apic1 = find_isa_irq_apic(0, mp_INT);
@@ -2459,6 +2462,20 @@
                print_IO_APIC();
 }
 
+static int __init setup_disable_8254_timer(char *s)
+{
+       timer_over_8254 = -1;
+       return 1;
+}
+static int __init setup_enable_8254_timer(char *s)
+{
+       timer_over_8254 = 2;
+       return 1;
+}
+
+__setup("disable_8254_timer", setup_disable_8254_timer);
+__setup("enable_8254_timer", setup_enable_8254_timer);
+
 /*
  *     Called after all the initialization is done. If we didnt find any
  *     APIC bugs then we can allow the modify fast path
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/arch/i386/kernel/microcode-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/microcode-xen.c     Mon Mar 20 
08:56:46 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/microcode-xen.c     Mon Mar 20 
08:56:54 2006
@@ -25,6 +25,7 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/sched.h>
+#include <linux/cpumask.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/vmalloc.h>
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Mon Mar 20 08:56:46 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Mon Mar 20 08:56:54 2006
@@ -1819,6 +1819,10 @@
        op.u.set_iopl.iopl = 1;
        HYPERVISOR_physdev_op(&op);
 
+#ifdef CONFIG_X86_IO_APIC
+       check_acpi_pci();       /* Checks more than just ACPI actually */
+#endif
+
 #ifdef CONFIG_ACPI
        if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
                printk(KERN_INFO "ACPI in unprivileged domain disabled\n");
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c  Mon Mar 20 08:56:46 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c  Mon Mar 20 08:56:54 2006
@@ -840,9 +840,9 @@
        write_seqlock_irqsave(&xtime_lock, flags);
        xtime.tv_sec = sec;
        xtime.tv_nsec = 0;
+       jiffies_64 += sleep_length;
+       wall_jiffies += sleep_length;
        write_sequnlock_irqrestore(&xtime_lock, flags);
-       jiffies += sleep_length;
-       wall_jiffies += sleep_length;
        if (last_timer->resume)
                last_timer->resume();
        cur_timer = last_timer;
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/arch/ia64/xen/hypercall.S
--- a/linux-2.6-xen-sparse/arch/ia64/xen/hypercall.S    Mon Mar 20 08:56:46 2006
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypercall.S    Mon Mar 20 08:56:54 2006
@@ -254,7 +254,6 @@
        st8 [r11]=r10
        ;;
        br.ret.sptk.many rp
-       ;;
 END(xen_set_rr)
 
 GLOBAL_ENTRY(xen_fc)
@@ -264,7 +263,16 @@
 (p7)   fc r32;;
 (p7)   br.ret.sptk.many rp
        ;;
-       ptc.e r96               // this is a "privified" fc r32
+       movl r9=XSI_PSR_IC
+       mov r8=r32
+       ;;
+       ld8 r10=[r9]
+       ;;
+       st8 [r9]=r0
+       ;;
+       XEN_HYPER_FC
+       ;;
+       st8 [r9]=r10
        ;;
        br.ret.sptk.many rp
 END(xen_fc)
@@ -276,7 +284,16 @@
 (p7)   mov r8=cpuid[r32];;
 (p7)   br.ret.sptk.many rp
        ;;
-       mov r72=rr[r32]         // this is a "privified" mov r8=cpuid[r32]
+       movl r9=XSI_PSR_IC
+       mov r8=r32
+       ;;
+       ld8 r10=[r9]
+       ;;
+       st8 [r9]=r0
+       ;;
+       XEN_HYPER_GET_CPUID
+       ;;
+       st8 [r9]=r10
        ;;
        br.ret.sptk.many rp
 END(xen_get_cpuid)
@@ -288,7 +305,16 @@
 (p7)   mov r8=pmd[r32];;
 (p7)   br.ret.sptk.many rp
        ;;
-       mov r72=pmc[r32]        // this is a "privified" mov r8=pmd[r32]
+       movl r9=XSI_PSR_IC
+       mov r8=r32
+       ;;
+       ld8 r10=[r9]
+       ;;
+       st8 [r9]=r0
+       ;;
+       XEN_HYPER_GET_PMD
+       ;;
+       st8 [r9]=r10
        ;;
        br.ret.sptk.many rp
 END(xen_get_pmd)
@@ -301,10 +327,20 @@
 (p7)   mov r8=ar24;;
 (p7)   br.ret.sptk.many rp
        ;;
-       mov ar24=r72            // this is a "privified" mov r8=ar.eflg
+       movl r9=XSI_PSR_IC
+       mov r8=r32
+       ;;
+       ld8 r10=[r9]
+       ;;
+       st8 [r9]=r0
+       ;;
+       XEN_HYPER_GET_EFLAG
+       ;;
+       st8 [r9]=r10
        ;;
        br.ret.sptk.many rp
 END(xen_get_eflag)
+       
 // some bits aren't set if pl!=0, see SDM vol1 3.1.8
 GLOBAL_ENTRY(xen_set_eflag)
        movl r8=running_on_xen;;
@@ -313,11 +349,17 @@
 (p7)   mov ar24=r32
 (p7)   br.ret.sptk.many rp
        ;;
-       // FIXME: this remains no-op'd because it generates
-       // a privileged register (general exception) trap rather than
-       // a privileged operation fault
-       //mov ar24=r32
-       ;;
-       br.ret.sptk.many rp
-END(xen_get_eflag)
+       movl r9=XSI_PSR_IC
+       mov r8=r32
+       ;;
+       ld8 r10=[r9]
+       ;;
+       st8 [r9]=r0
+       ;;
+       XEN_HYPER_SET_EFLAG
+       ;;
+       st8 [r9]=r10
+       ;;
+       br.ret.sptk.many rp
+END(xen_set_eflag)
 #endif
diff -r 516cf6553011 -r cf89e8f0831b linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S
--- a/linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S       Mon Mar 20 08:56:46 2006
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/xenivt.S       Mon Mar 20 08:56:54 2006
@@ -723,16 +723,12 @@
        movl r30=1f                             // load continuation point in 
case of nested fault
        ;;
 #ifdef CONFIG_XEN
-#if 1
        mov r18=r8;
        mov r8=r16;
        XEN_HYPER_THASH;;
        mov r17=r8;
        mov r8=r18;;
 #else
-       tak r17=r80                             // "privified" thash
-#endif
-#else
        thash r17=r16                           // compute virtual address of 
L3 PTE
 #endif
        mov r29=b0                              // save b0 in case of nested 
fault
@@ -812,16 +808,12 @@
 #endif /* CONFIG_ITANIUM */
        ;;
 #ifdef CONFIG_XEN
-#if 1
        mov r18=r8;
        mov r8=r16;
        XEN_HYPER_THASH;;
        mov r17=r8;
        mov r8=r18;;
 #else
-       tak r17=r80                             // "privified" thash
-#endif
-#else
        thash r17=r16                           // compute virtual address of 
L3 PTE
 #endif
        mov r29=b0                              // save b0 in case of nested 
fault)
@@ -898,15 +890,11 @@
        movl r30=1f                             // load continuation point in 
case of nested fault
        ;;
 #ifdef CONFIG_XEN
-#if 1
        mov r18=r8;
        mov r8=r16;
        XEN_HYPER_THASH;;
        mov r17=r8;
        mov r8=r18;;
-#else
-       tak r17=r80                             // "privified" thash
-#endif
 #else
        thash r17=r16                           // compute virtual address of 
L3 PTE
 #endif
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S       Mon Mar 20 
08:56:46 2006
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S       Mon Mar 20 
08:56:54 2006
@@ -818,7 +818,7 @@
        jmp  error_exit
 
 #ifdef CONFIG_X86_LOCAL_APIC
-ENTRY(nmi)
+KPROBE_ENTRY(nmi)
        zeroentry do_nmi_callback
 ENTRY(do_nmi_callback)
         addq $8, %rsp
@@ -828,6 +828,7 @@
         XEN_BLOCK_EVENTS(%rsi)
         GET_THREAD_INFO(%rcx)
         jmp  retint_restore_args
+       .previous .text
 #endif
 
         ALIGN
diff -r 516cf6553011 -r cf89e8f0831b linux-2.6-xen-sparse/drivers/char/tty_io.c
--- a/linux-2.6-xen-sparse/drivers/char/tty_io.c        Mon Mar 20 08:56:46 2006
+++ b/linux-2.6-xen-sparse/drivers/char/tty_io.c        Mon Mar 20 08:56:54 2006
@@ -305,7 +305,7 @@
                        t->commit = 0;
                        t->read = 0;
                        /* DEBUG ONLY */
-                       memset(t->data, '*', size);
+/*                     memset(t->data, '*', size); */
 /*                     printk("Flip recycle %p\n", t); */
                        return t;
                }
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Mon Mar 20 
08:56:46 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Mon Mar 20 
08:56:54 2006
@@ -1049,6 +1049,8 @@
                if (xsd_port_intf)
                        xsd_port_intf->read_proc = xsd_port_read;
        }
+       else
+               xenstored_ready = 1;
 
        /* Initialize the interface to xenstore. */
        err = xs_init();
@@ -1058,10 +1060,8 @@
                return err;
        }
 
-       if (!dom0) {
-               xenstored_ready = 1;
+       if (!dom0)
                xenbus_probe(NULL);
-       }
 
        return 0;
 }
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/include/asm-i386/apic.h
--- a/linux-2.6-xen-sparse/include/asm-i386/apic.h      Mon Mar 20 08:56:46 2006
+++ b/linux-2.6-xen-sparse/include/asm-i386/apic.h      Mon Mar 20 08:56:54 2006
@@ -139,6 +139,8 @@
 #define ARCH_APICTIMER_STOPS_ON_C3     1
 #endif
 
+extern int timer_over_8254;
+
 #else /* !CONFIG_X86_LOCAL_APIC */
 static inline void lapic_shutdown(void) { }
 
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/include/asm-ia64/hypercall.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h Mon Mar 20 08:56:46 2006
+++ b/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h Mon Mar 20 08:56:54 2006
@@ -32,6 +32,7 @@
 
 #include <xen/interface/xen.h>
 #include <xen/interface/sched.h>
+#include <xen/interface/dom0_ops.h>
 #include <linux/errno.h>
 
 /* FIXME: temp place to hold these page related macros */
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h        Mon Mar 20 
08:56:46 2006
+++ b/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h        Mon Mar 20 
08:56:54 2006
@@ -44,6 +44,8 @@
 
 void force_evtchn_callback(void);
 
+int xen_init(void);
+
 /* Turn jiffies into Xen system time. XXX Implement me. */
 #define jiffies_to_st(j)       0
 
diff -r 516cf6553011 -r cf89e8f0831b 
linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h        Mon Mar 20 
08:56:46 2006
+++ b/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h        Mon Mar 20 
08:56:54 2006
@@ -33,6 +33,11 @@
 #define        XEN_HYPER_GET_RR                break 0x10
 #define        XEN_HYPER_SET_RR                break 0x11
 #define        XEN_HYPER_SET_KR                break 0x12
+#define        XEN_HYPER_FC                    break 0x13
+#define        XEN_HYPER_GET_CPUID             break 0x14
+#define        XEN_HYPER_GET_PMD               break 0x15
+#define        XEN_HYPER_GET_EFLAG             break 0x16
+#define        XEN_HYPER_SET_EFLAG             break 0x17
 #endif
 
 #ifndef __ASSEMBLY__
diff -r 516cf6553011 -r cf89e8f0831b linux-2.6-xen-sparse/include/linux/gfp.h
--- a/linux-2.6-xen-sparse/include/linux/gfp.h  Mon Mar 20 08:56:46 2006
+++ b/linux-2.6-xen-sparse/include/linux/gfp.h  Mon Mar 20 08:56:54 2006
@@ -161,9 +161,9 @@
 
 void page_alloc_init(void);
 #ifdef CONFIG_NUMA
-void drain_remote_pages(void);
+void drain_node_pages(int node);
 #else
-static inline void drain_remote_pages(void) { };
+static inline void drain_node_pages(int node) { };
 #endif
 
 #endif /* __LINUX_GFP_H */
diff -r 516cf6553011 -r cf89e8f0831b linux-2.6-xen-sparse/mm/page_alloc.c
--- a/linux-2.6-xen-sparse/mm/page_alloc.c      Mon Mar 20 08:56:46 2006
+++ b/linux-2.6-xen-sparse/mm/page_alloc.c      Mon Mar 20 08:56:54 2006
@@ -591,20 +591,19 @@
 }
 
 #ifdef CONFIG_NUMA
-/* Called from the slab reaper to drain remote pagesets */
-void drain_remote_pages(void)
-{
-       struct zone *zone;
-       int i;
+/*
+ * Called from the slab reaper to drain pagesets on a particular node that
+ * belong to the currently executing processor.
+ */
+void drain_node_pages(int nodeid)
+{
+       int i, z;
        unsigned long flags;
 
        local_irq_save(flags);
-       for_each_zone(zone) {
+       for (z = 0; z < MAX_NR_ZONES; z++) {
+               struct zone *zone = NODE_DATA(nodeid)->node_zones + z;
                struct per_cpu_pageset *pset;
-
-               /* Do not drain local pagesets */
-               if (zone->zone_pgdat->node_id == numa_node_id())
-                       continue;
 
                pset = zone_pcp(zone, smp_processor_id());
                for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) {
diff -r 516cf6553011 -r cf89e8f0831b tools/examples/xmexample.vti
--- a/tools/examples/xmexample.vti      Mon Mar 20 08:56:46 2006
+++ b/tools/examples/xmexample.vti      Mon Mar 20 08:56:54 2006
@@ -14,8 +14,8 @@
 # Kernel image file.
 kernel = "/boot/Flash.fd"
 
-# The domain build function. VMX domain uses 'vmx'.
-builder='vmx'
+# The domain build function. VTI domain uses 'hvm'.
+builder='hvm'
 
 # Initial memory allocation (in megabytes) for the new domain.
 memory = 256
diff -r 516cf6553011 -r cf89e8f0831b tools/firmware/rombios/apmbios.S
--- a/tools/firmware/rombios/apmbios.S  Mon Mar 20 08:56:46 2006
+++ b/tools/firmware/rombios/apmbios.S  Mon Mar 20 08:56:54 2006
@@ -217,14 +217,22 @@
 ; APM interface disconnect
 APMSYM(04):
   cmp al, #0x04
+  jne APMSYM(05)
+  jmp APMSYM(ok)
+
+;-----------------
+; APM cpu idle
+APMSYM(05):
+  cmp al, #0x05
   jne APMSYM(07)
+  hlt
   jmp APMSYM(ok)
 
 ;-----------------
 ; APM Set Power State
 APMSYM(07):
   cmp al, #0x07
-  jne APMSYM(0a)
+  jne APMSYM(08)
   
   cmp bx, #1
   jne APMSYM(ok)
@@ -265,6 +273,14 @@
   mov ax, #APMSYM(07_standby_str)
   call APMSYM(out_str)
   pop edx
+  jmp APMSYM(ok)
+
+;-----------------
+; APM Enable / Disable
+APMSYM(08):
+  cmp al, #0x08
+  jne APMSYM(0a)
+
   jmp APMSYM(ok)
 
 ;-----------------
@@ -297,11 +313,30 @@
 ; APM Driver Version
 APMSYM(0e):
   cmp al, #0x0e
-  jne APMSYM(unimplemented)
+  jne APMSYM(0f)
   
   mov ah, #1
   mov al, #2
   
+  jmp APMSYM(ok)
+
+;-----------------
+; APM Engage / Disengage
+APMSYM(0f):
+  cmp al, #0x0f
+  jne APMSYM(10)
+
+  jmp APMSYM(ok)
+
+;-----------------
+; APM Get Capabilities
+APMSYM(10):
+  cmp al, #0x10
+  jne APMSYM(unimplemented)
+
+  mov bl, #0
+  mov cx, #0
+
   jmp APMSYM(ok)
 
 ;-----------------
diff -r 516cf6553011 -r cf89e8f0831b tools/firmware/rombios/rombios.c
--- a/tools/firmware/rombios/rombios.c  Mon Mar 20 08:56:46 2006
+++ b/tools/firmware/rombios/rombios.c  Mon Mar 20 08:56:54 2006
@@ -149,7 +149,7 @@
 #define BX_SUPPORT_FLOPPY 1
 #define BX_FLOPPY_ON_CNT 37   /* 2 seconds */
 #define BX_PCIBIOS       1
-#define BX_APM           0
+#define BX_APM           1
 
 #define BX_USE_ATADRV    1
 #define BX_ELTORITO_BOOT 1
diff -r 516cf6553011 -r cf89e8f0831b tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c        Mon Mar 20 08:56:46 2006
+++ b/tools/libxc/xc_hvm_build.c        Mon Mar 20 08:56:54 2006
@@ -51,7 +51,7 @@
     char *elfbase, int xch, uint32_t dom, unsigned long *parray,
     struct domain_setup_info *dsi);
 
-static unsigned char build_e820map(void *e820_page, unsigned long mem_size)
+static unsigned char build_e820map(void *e820_page, unsigned long long 
mem_size)
 {
     struct e820entry *e820entry =
         (struct e820entry *)(((unsigned char *)e820_page) + E820_MAP_OFFSET);
@@ -81,11 +81,17 @@
 #define STATIC_PAGES    2       /* for ioreq_t and store_mfn */
     /* Most of the ram goes here */
     e820entry[nr_map].addr = 0x100000;
-    e820entry[nr_map].size = mem_size - 0x100000 - STATIC_PAGES*PAGE_SIZE;
+    e820entry[nr_map].size = mem_size - 0x100000 - STATIC_PAGES * PAGE_SIZE;
     e820entry[nr_map].type = E820_RAM;
     nr_map++;
 
     /* Statically allocated special pages */
+
+    /* For xenstore */
+    e820entry[nr_map].addr = mem_size - 2 * PAGE_SIZE;
+    e820entry[nr_map].size = PAGE_SIZE;
+    e820entry[nr_map].type = E820_XENSTORE;
+    nr_map++;
 
     /* Shared ioreq_t page */
     e820entry[nr_map].addr = mem_size - PAGE_SIZE;
@@ -93,12 +99,6 @@
     e820entry[nr_map].type = E820_SHARED_PAGE;
     nr_map++;
 
-    /* For xenstore */
-    e820entry[nr_map].addr = mem_size - 2*PAGE_SIZE;
-    e820entry[nr_map].size = PAGE_SIZE;
-    e820entry[nr_map].type = E820_XENSTORE;
-    nr_map++;
-
     e820entry[nr_map].addr = mem_size;
     e820entry[nr_map].size = 0x3 * PAGE_SIZE;
     e820entry[nr_map].type = E820_NVS;
@@ -117,8 +117,7 @@
     return (*(((unsigned char *)e820_page) + E820_MAP_NR_OFFSET) = nr_map);
 }
 
-static void
-set_hvm_info_checksum(struct hvm_info_table *t)
+static void set_hvm_info_checksum(struct hvm_info_table *t)
 {
     uint8_t *ptr = (uint8_t *)t, sum = 0;
     unsigned int i;
@@ -142,19 +141,16 @@
     char *va_map;
     struct hvm_info_table *va_hvm;
 
-
-    va_map = xc_map_foreign_range(
-        xc_handle,
-        dom,
-        PAGE_SIZE,
-        PROT_READ|PROT_WRITE,
-        pfn_list[HVM_INFO_PFN]);
+    va_map = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE,
+                                  PROT_READ | PROT_WRITE,
+                                  pfn_list[HVM_INFO_PFN]);
 
     if ( va_map == NULL )
         return -1;
 
     va_hvm = (struct hvm_info_table *)(va_map + HVM_INFO_OFFSET);
     memset(va_hvm, 0, sizeof(*va_hvm));
+
     strncpy(va_hvm->signature, "HVM INFO", 8);
     va_hvm->length       = sizeof(struct hvm_info_table);
     va_hvm->acpi_enabled = acpi;
@@ -183,58 +179,59 @@
                        unsigned long *store_mfn)
 {
     unsigned long *page_array = NULL;
-
     unsigned long count, i;
+    unsigned long long ptr;
+    xc_mmu_t *mmu = NULL;
+
     shared_info_t *shared_info;
     void *e820_page;
     unsigned char e820_map_nr;
-    xc_mmu_t *mmu = NULL;
-    int rc;
 
     struct domain_setup_info dsi;
-    unsigned long v_end;
+    unsigned long long v_end;
 
     unsigned long shared_page_frame = 0;
     shared_iopage_t *sp;
 
     memset(&dsi, 0, sizeof(struct domain_setup_info));
 
-    if ( (rc = parseelfimage(image, image_size, &dsi)) != 0 )
-        goto error_out;
-
-    if ( (dsi.v_start & (PAGE_SIZE-1)) != 0 )
+    if ( (parseelfimage(image, image_size, &dsi)) != 0 )
+        goto error_out;
+
+    if ( (dsi.v_kernstart & (PAGE_SIZE - 1)) != 0 )
     {
         PERROR("Guest OS must load to a page boundary.\n");
         goto error_out;
     }
 
     /* memsize is in megabytes */
-    v_end              = (unsigned long)memsize << 20;
+    v_end = (unsigned long long)memsize << 20;
 
     printf("VIRTUAL MEMORY ARRANGEMENT:\n"
-           " Loaded HVM loader: %08lx->%08lx\n"
-           " TOTAL:         %08lx->%08lx\n",
+           "  Loaded HVM loader:    %08lx->%08lx\n"
+           "  TOTAL:                %08lx->%016llx\n",
            dsi.v_kernstart, dsi.v_kernend,
            dsi.v_start, v_end);
-    printf(" ENTRY ADDRESS: %08lx\n", dsi.v_kernentry);
-
-    if ( (v_end - dsi.v_start) > (nr_pages * PAGE_SIZE) )
-    {
-        ERROR("Initial guest OS requires too much space\n"
-               "(%luMB is greater than %luMB limit)\n",
-               (v_end-dsi.v_start)>>20, (nr_pages<<PAGE_SHIFT)>>20);
+    printf("  ENTRY ADDRESS:        %08lx\n", dsi.v_kernentry);
+
+    if ( (v_end - dsi.v_start) > ((unsigned long long)nr_pages << PAGE_SHIFT) )
+    {
+        PERROR("Initial guest OS requires too much space: "
+               "(%lluMB is greater than %lluMB limit)\n",
+               (unsigned long long)(v_end - dsi.v_start) >> 20,
+               ((unsigned long long)nr_pages << PAGE_SHIFT) >> 20);
         goto error_out;
     }
 
     if ( (page_array = malloc(nr_pages * sizeof(unsigned long))) == NULL )
     {
-        PERROR("Could not allocate memory");
+        PERROR("Could not allocate memory.\n");
         goto error_out;
     }
 
     if ( xc_get_pfn_list(xc_handle, dom, page_array, nr_pages) != nr_pages )
     {
-        PERROR("Could not get the page frame list");
+        PERROR("Could not get the page frame list.\n");
         goto error_out;
     }
 
@@ -246,20 +243,21 @@
     /* Write the machine->phys table entries. */
     for ( count = 0; count < nr_pages; count++ )
     {
+        ptr = (unsigned long long)page_array[count] << PAGE_SHIFT;
         if ( xc_add_mmu_update(xc_handle, mmu,
-                               (page_array[count] << PAGE_SHIFT) |
-                               MMU_MACHPHYS_UPDATE, count) )
+                               ptr | MMU_MACHPHYS_UPDATE, count) )
             goto error_out;
     }
 
-    if ( set_hvm_info(xc_handle, dom, page_array, vcpus, pae, acpi, apic) ) {
-        fprintf(stderr, "Couldn't set hvm info for HVM guest.\n");
+    if ( set_hvm_info(xc_handle, dom, page_array, vcpus, pae, acpi, apic) )
+    {
+        ERROR("Couldn't set hvm info for HVM guest.\n");
         goto error_out;
     }
 
     if ( (e820_page = xc_map_foreign_range(
-         xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
-         page_array[E820_MAP_PAGE >> PAGE_SHIFT])) == 0 )
+              xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
+              page_array[E820_MAP_PAGE >> PAGE_SHIFT])) == 0 )
         goto error_out;
     memset(e820_page, 0, PAGE_SIZE);
     e820_map_nr = build_e820map(e820_page, v_end);
@@ -267,8 +265,8 @@
 
     /* shared_info page starts its life empty. */
     if ( (shared_info = xc_map_foreign_range(
-         xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
-         shared_info_frame)) == 0 )
+              xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
+              shared_info_frame)) == 0 )
         goto error_out;
     memset(shared_info, 0, sizeof(shared_info_t));
     /* Mask all upcalls... */
@@ -279,8 +277,8 @@
     /* Populate the event channel port in the shared page */
     shared_page_frame = page_array[(v_end >> PAGE_SHIFT) - 1];
     if ( (sp = (shared_iopage_t *) xc_map_foreign_range(
-         xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
-         shared_page_frame)) == 0 )
+              xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
+              shared_page_frame)) == 0 )
         goto error_out;
     memset(sp, 0, PAGE_SIZE);
 
@@ -290,7 +288,7 @@
 
         vp_eport = xc_evtchn_alloc_unbound(xc_handle, dom, 0);
         if ( vp_eport < 0 ) {
-            fprintf(stderr, "Couldn't get unbound port from VMX guest.\n");
+            PERROR("Couldn't get unbound port from VMX guest.\n");
             goto error_out;
         }
         sp->vcpu_iodata[i].vp_eport = vp_eport;
diff -r 516cf6553011 -r cf89e8f0831b tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c      Mon Mar 20 08:56:46 2006
+++ b/tools/libxc/xc_linux_build.c      Mon Mar 20 08:56:54 2006
@@ -536,8 +536,12 @@
 
     *store_mfn = page_array[1];
     *console_mfn = page_array[2];
-    printf("store_mfn: 0x%lx, console_mfn: 0x%lx\n",
-           (uint64_t)store_mfn, (uint64_t)console_mfn);
+    printf("start_info: 0x%lx at 0x%lx, "
+           "store_mfn: 0x%lx at 0x%lx, "
+           "console_mfn: 0x%lx at 0x%lx\n",
+           page_array[0], nr_pages,
+           *store_mfn,    nr_pages - 2,
+           *console_mfn,  nr_pages - 1);
 
     start_info = xc_map_foreign_range(
         xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE, page_array[0]);
diff -r 516cf6553011 -r cf89e8f0831b xen/Makefile
--- a/xen/Makefile      Mon Mar 20 08:56:46 2006
+++ b/xen/Makefile      Mon Mar 20 08:56:54 2006
@@ -61,6 +61,7 @@
        $(MAKE) -C acm
 endif
        $(MAKE) -C arch/$(TARGET_ARCH)
+       $(MAKE) -C arch/$(TARGET_ARCH) $(TARGET)
 
 # drivers/char/console.o contains static banner/compile info. Blow it away.
 # Don't refresh these files during e.g., 'sudo make install'
diff -r 516cf6553011 -r cf89e8f0831b xen/Rules.mk
--- a/xen/Rules.mk      Mon Mar 20 08:56:46 2006
+++ b/xen/Rules.mk      Mon Mar 20 08:56:54 2006
@@ -7,6 +7,15 @@
 perfc       ?= n
 perfc_arrays?= n
 crash_debug ?= n
+
+# Hardcoded configuration implications and dependencies.
+# Do this is a neater way if it becomes unwieldy.
+ifeq ($(debug),y)
+verbose := y
+endif
+ifeq ($(perfc_arrays),y)
+perfc := y
+endif
 
 XEN_ROOT=$(BASEDIR)/..
 include $(XEN_ROOT)/Config.mk
@@ -27,41 +36,23 @@
 HDRS    := $(subst $(BASEDIR)/include/xen/banner.h,,$(HDRS))
 HDRS    := $(subst $(BASEDIR)/include/xen/compile.h,,$(HDRS))
 
-C_SRCS  := $(wildcard *.c)
-S_SRCS  := $(wildcard *.S)
-OBJS    := $(patsubst %.S,%.o,$(S_SRCS))
-OBJS    += $(patsubst %.c,%.o,$(C_SRCS))
+include $(BASEDIR)/arch/$(TARGET_ARCH)/Rules.mk
 
 # Note that link order matters!
-ALL_OBJS := $(BASEDIR)/common/common.o
-ALL_OBJS += $(BASEDIR)/drivers/char/driver.o
-ALL_OBJS += $(BASEDIR)/drivers/acpi/driver.o
-ifeq ($(ACM_SECURITY),y)
-ALL_OBJS += $(BASEDIR)/acm/acm.o
-CFLAGS += -DACM_SECURITY
-endif
-ALL_OBJS += $(BASEDIR)/arch/$(TARGET_ARCH)/arch.o
+ALL_OBJS-y               += $(BASEDIR)/common/built_in.o
+ALL_OBJS-y               += $(BASEDIR)/drivers/built_in.o
+ALL_OBJS-$(ACM_SECURITY) += $(BASEDIR)/acm/built_in.o
+ALL_OBJS-y               += $(BASEDIR)/arch/$(TARGET_ARCH)/built_in.o
 
-include $(BASEDIR)/arch/$(TARGET_ARCH)/Rules.mk
+CFLAGS-y               += -g -D__XEN__
+CFLAGS-$(ACM_SECURITY) += -DACM_SECURITY
+CFLAGS-$(verbose)      += -DVERBOSE
+CFLAGS-$(crash_debug)  += -DCRASH_DEBUG
+CFLAGS-$(perfc)        += -DPERF_COUNTERS
+CFLAGS-$(perfc_arrays) += -DPERF_ARRAYS
 
-CFLAGS += -g -D__XEN__
-
-ifneq ($(debug)$(verbose),nn)
-CFLAGS += -DVERBOSE
-endif
-
-ifeq ($(crash_debug),y)
-CFLAGS += -DCRASH_DEBUG
-endif
-
-ifeq ($(perfc),y)
-CFLAGS += -DPERF_COUNTERS
-ifeq ($(perfc_arrays),y)
-CFLAGS += -DPERF_ARRAYS
-endif
-endif
-
-CFLAGS := $(strip $(CFLAGS))
+ALL_OBJS := $(ALL_OBJS-y)
+CFLAGS   := $(strip $(CFLAGS) $(CFLAGS-y))
 
 %.o: %.c $(HDRS) Makefile
        $(CC) $(CFLAGS) -c $< -o $@
diff -r 516cf6553011 -r cf89e8f0831b xen/acm/Makefile
--- a/xen/acm/Makefile  Mon Mar 20 08:56:46 2006
+++ b/xen/acm/Makefile  Mon Mar 20 08:56:54 2006
@@ -1,15 +1,9 @@
+include $(BASEDIR)/Rules.mk
 
-include $(BASEDIR)/Rules.mk
-OBJS =  acm_core.o 
-OBJS += acm_policy.o
-OBJS += acm_simple_type_enforcement_hooks.o
-OBJS += acm_chinesewall_hooks.o
-OBJS += acm_null_hooks.o
+obj-y += acm_core.o 
+obj-y += acm_policy.o
+obj-y += acm_simple_type_enforcement_hooks.o
+obj-y += acm_chinesewall_hooks.o
+obj-y += acm_null_hooks.o
 
-default: acm.o
-
-acm.o: $(OBJS)
-       $(LD) $(LDFLAGS) -r -o acm.o $(OBJS)
-
-clean:
-       rm -f *.o *~ core
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/Rules.mk
--- a/xen/arch/ia64/Rules.mk    Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/Rules.mk    Mon Mar 20 08:56:54 2006
@@ -1,11 +1,13 @@
 ########################################
 # ia64-specific definitions
 
+HAS_ACPI := y
 VALIDATE_VT    ?= n
 ifneq ($(COMPILE_ARCH),$(TARGET_ARCH))
 CROSS_COMPILE ?= /usr/local/sp_env/v2.2.5/i686/bin/ia64-unknown-linux-
 endif
-AFLAGS  += -D__ASSEMBLY__
+AFLAGS  += -D__ASSEMBLY__ -nostdinc $(CPPFLAGS)
+AFLAGS  += -mconstant-gp
 CPPFLAGS  += -I$(BASEDIR)/include -I$(BASEDIR)/include/asm-ia64        \
              -I$(BASEDIR)/include/asm-ia64/linux                       \
             -I$(BASEDIR)/include/asm-ia64/linux-xen                    \
@@ -13,6 +15,7 @@
              -I$(BASEDIR)/arch/ia64/linux -I$(BASEDIR)/arch/ia64/linux-xen
 
 CFLAGS  += -nostdinc -fno-builtin -fno-common -fno-strict-aliasing
+CFLAGS  += -mconstant-gp
 #CFLAGS  += -O3                # -O3 over-inlines making debugging tough!
 CFLAGS  += -O2         # but no optimization causes compile errors!
 #CFLAGS  += -iwithprefix include -Wall -DMONITOR_BASE=$(MONITOR_BASE)
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/asm-offsets.c
--- a/xen/arch/ia64/asm-offsets.c       Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/asm-offsets.c       Mon Mar 20 08:56:54 2006
@@ -84,7 +84,6 @@
        //DEFINE(IA64_TASK_SIGHAND_OFFSET,offsetof (struct task_struct, 
sighand));
        //DEFINE(IA64_TASK_SIGNAL_OFFSET,offsetof (struct task_struct, signal));
        //DEFINE(IA64_TASK_TGID_OFFSET, offsetof (struct task_struct, tgid));
-       DEFINE(IA64_PGD, offsetof(struct domain, arch.mm));
        DEFINE(IA64_TASK_THREAD_KSP_OFFSET, offsetof (struct vcpu, 
arch._thread.ksp));
        DEFINE(IA64_TASK_THREAD_ON_USTACK_OFFSET, offsetof (struct vcpu, 
arch._thread.on_ustack));
 
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/linux-xen/efi.c
--- a/xen/arch/ia64/linux-xen/efi.c     Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/linux-xen/efi.c     Mon Mar 20 08:56:54 2006
@@ -37,11 +37,17 @@
 #define EFI_DEBUG      0
 
 extern efi_status_t efi_call_phys (void *, ...);
+extern unsigned long long memparse (char *ptr, char **retptr);
 
 struct efi efi;
 EXPORT_SYMBOL(efi);
 static efi_runtime_services_t *runtime;
+#ifdef XEN
+// this is a temporary hack to avoid CONFIG_VIRTUAL_MEM_MAP
+static unsigned long mem_limit = ~0UL, max_addr = 0x100000000;
+#else
 static unsigned long mem_limit = ~0UL, max_addr = ~0UL;
+#endif
 
 #define efi_call_virt(f, args...)      (*(f))(args)
 
@@ -328,8 +334,6 @@
                if (running_on_sim && md->type != EFI_CONVENTIONAL_MEMORY)
                        continue;
 }
-// this is a temporary hack to avoid CONFIG_VIRTUAL_MEM_MAP
-               if (md->phys_addr >= 0x100000000) continue;
 #endif
                /*
                 * granule_addr is the base of md's first granule.
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/linux-xen/setup.c
--- a/xen/arch/ia64/linux-xen/setup.c   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/linux-xen/setup.c   Mon Mar 20 08:56:54 2006
@@ -384,6 +384,9 @@
        *cmdline_p = __va(ia64_boot_param->command_line);
 #ifndef XEN
        strlcpy(saved_command_line, *cmdline_p, COMMAND_LINE_SIZE);
+#else
+       early_cmdline_parse(cmdline_p);
+       cmdline_parse(*cmdline_p);
 #endif
 
        efi_init();
@@ -414,10 +417,6 @@
        }
 #endif
 
-#ifdef XEN
-       early_cmdline_parse(cmdline_p);
-       cmdline_parse(*cmdline_p);
-#endif
        if (early_console_setup(*cmdline_p) == 0)
                mark_bsp_online();
 
@@ -842,7 +841,9 @@
                                        | IA64_DCR_DA | IA64_DCR_DD | 
IA64_DCR_LC));
 #endif
        atomic_inc(&init_mm.mm_count);
+#ifndef XEN
        current->active_mm = &init_mm;
+#endif
 #ifdef XEN
        if (current->domain->arch.mm)
 #else
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/linux-xen/smp.c
--- a/xen/arch/ia64/linux-xen/smp.c     Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/linux-xen/smp.c     Mon Mar 20 08:56:54 2006
@@ -296,7 +296,12 @@
 {
        preempt_disable();
        /* this happens for the common case of a single-threaded fork():  */
+#ifdef XEN
+       if (likely(mm == current->domain->arch.mm
+                  && atomic_read(&mm->mm_users) == 1))
+#else
        if (likely(mm == current->active_mm && atomic_read(&mm->mm_users) == 1))
+#endif
        {
                local_finish_flush_tlb_mm(mm);
                preempt_enable();
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/linux-xen/smpboot.c
--- a/xen/arch/ia64/linux-xen/smpboot.c Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/linux-xen/smpboot.c Mon Mar 20 08:56:54 2006
@@ -72,8 +72,7 @@
 
 #ifdef CONFIG_SMP /* ifdef XEN */
 
-//#define SMP_DEBUG 0
-#define SMP_DEBUG 1
+#define SMP_DEBUG 0
 
 #if SMP_DEBUG
 #define Dprintk(x...)  printk(x)
@@ -482,16 +481,14 @@
 do_rest:
        task_for_booting_cpu = c_idle.idle;
 #else
-       struct domain *idle;
        struct vcpu *v;
-       void *stack;
 
        v = idle_vcpu[cpu] = alloc_vcpu(idle_vcpu[0]->domain, cpu, cpu);
        BUG_ON(v == NULL);
 
-       printf ("do_boot_cpu: cpu=%d, domain=%p, vcpu=%p\n", cpu, idle, v);
-
-       task_for_booting_cpu = v;
+       //printf ("do_boot_cpu: cpu=%d, domain=%p, vcpu=%p\n", cpu, idle, v);
+
+       task_for_booting_cpu = (task_t *)v;
 
        /* Set cpu number.  */
        get_thread_info(v)->cpu = cpu;
@@ -522,6 +519,7 @@
        return 0;
 }
 
+#ifndef XEN
 static int __init
 decay (char *str)
 {
@@ -531,6 +529,7 @@
 }
 
 __setup("decay=", decay);
+#endif
 
 /*
  * Initialize the logical CPU number to SAPICID mapping
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c  Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/mmio.c  Mon Mar 20 08:56:54 2006
@@ -33,6 +33,7 @@
 #include <asm/mm.h>
 #include <asm/vmx.h>
 #include <public/event_channel.h>
+#include <linux/event.h>
 
 /*
 struct mmio_list *lookup_mmio(u64 gpa, struct mmio_list *mio_base)
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/pal_emul.c
--- a/xen/arch/ia64/vmx/pal_emul.c      Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/pal_emul.c      Mon Mar 20 08:56:54 2006
@@ -20,6 +20,7 @@
 
 #include <asm/vmx_vcpu.h>
 #include <asm/pal.h>
+#include <asm/sal.h>
 
 static void
 get_pal_parameters (VCPU *vcpu, UINT64 *gr29,
@@ -68,7 +69,6 @@
 
 static struct ia64_pal_retval
 pal_vm_tr_read (VCPU *vcpu ) {
-#warning pal_vm_tr_read: to be implemented
        struct ia64_pal_retval result;
 
        result.status= -1; //unimplemented
@@ -101,7 +101,6 @@
 
 static struct ia64_pal_retval
 pal_halt (VCPU *vcpu) {
-#warning pal_halt: to be implemented
        //bugbug: to be implement. 
        struct ia64_pal_retval result;
 
@@ -140,12 +139,18 @@
 
 static struct ia64_pal_retval
 pal_bus_get_features(VCPU *vcpu){
-       
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_cache_summary(VCPU *vcpu){
-       
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
@@ -157,22 +162,34 @@
 
 static struct ia64_pal_retval
 pal_cache_info(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_cache_prot_info(VCPU *vcpu){
-}
-
-static struct ia64_pal_retval
-pal_cache_shared_info(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_mem_attrib(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_debug_info(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
@@ -182,8 +199,16 @@
 static struct ia64_pal_retval
 pal_freq_base(VCPU *vcpu){
     struct ia64_pal_retval result;
+    struct ia64_sal_retval isrv;
 
     PAL_CALL(result,PAL_FREQ_BASE, 0, 0, 0);
+    if(result.v0 == 0){ //PAL_FREQ_BASE may not be implemented in some 
platforms, call SAL instead.
+        SAL_CALL(isrv, SAL_FREQ_BASE, 
+                SAL_FREQ_BASE_PLATFORM, 0, 0, 0, 0, 0, 0);
+        result.status = isrv.status;
+        result.v0 = isrv.v0;
+        result.v1 = result.v2 =0;
+    }
     return result;
 }
 
@@ -197,46 +222,89 @@
 
 static struct ia64_pal_retval
 pal_halt_info(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_logical_to_physica(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_perf_mon_info(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_proc_get_features(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_ptce_info(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_register_info(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_rse_info(VCPU *vcpu){
-}
-
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
+}
 static struct ia64_pal_retval
 pal_test_info(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_vm_summary(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_vm_info(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 
 static struct ia64_pal_retval
 pal_vm_page_size(VCPU *vcpu){
+       struct ia64_pal_retval result;
+
+       result.status= -1; //unimplemented
+       return result;
 }
 void
 pal_emul( VCPU *vcpu) {
@@ -285,6 +353,82 @@
 
                case PAL_FREQ_BASE:
                        result = pal_freq_base (vcpu);
+                       break;
+
+               case PAL_BUS_GET_FEATURES :
+                       result = pal_bus_get_features (vcpu);
+                       break;
+
+               case PAL_CACHE_SUMMARY :
+                       result = pal_cache_summary (vcpu);
+                       break;
+
+               case PAL_CACHE_INIT :
+                       result = pal_cache_init(vcpu);
+                       break;
+
+               case PAL_CACHE_INFO :
+                       result = pal_cache_info(vcpu);
+                       break;
+
+               case PAL_CACHE_PROT_INFO :
+                       result = pal_cache_prot_info(vcpu);
+                       break;
+
+               case PAL_MEM_ATTRIB :
+                       result = pal_mem_attrib(vcpu);
+                       break;
+
+               case PAL_DEBUG_INFO :
+                       result = pal_debug_info(vcpu);
+                       break;
+
+               case PAL_FIXED_ADDR :
+                       result = pal_fixed_addr(vcpu);
+                       break;
+
+               case PAL_HALT_INFO :
+                       result = pal_halt_info(vcpu);
+                       break;
+
+               case PAL_LOGICAL_TO_PHYSICAL :
+                       result = pal_logical_to_physica(vcpu);
+                       break;
+
+               case PAL_PERF_MON_INFO :
+                       result = pal_perf_mon_info(vcpu);
+                       break;
+
+               case  PAL_PROC_GET_FEATURES:
+                       result = pal_proc_get_features(vcpu);
+                       break;
+
+               case PAL_PTCE_INFO :
+                       result = pal_ptce_info(vcpu);
+                       break;
+
+               case PAL_REGISTER_INFO :
+                       result = pal_register_info(vcpu);
+                       break;
+
+               case PAL_RSE_INFO :
+                       result = pal_rse_info(vcpu);
+                       break;
+
+               case PAL_TEST_PROC :
+                       result = pal_test_info(vcpu);
+                       break;
+
+               case PAL_VM_SUMMARY :
+                       result = pal_vm_summary(vcpu);
+                       break;
+
+               case PAL_VM_INFO :
+                       result = pal_vm_info(vcpu);
+                       break;
+
+               case PAL_VM_PAGE_SIZE :
+                       result = pal_vm_page_size(vcpu);
                        break;
 
                default:
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/vlsapic.c
--- a/xen/arch/ia64/vmx/vlsapic.c       Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/vlsapic.c       Mon Mar 20 08:56:54 2006
@@ -97,16 +97,15 @@
 {
     vtime_t *vtm;
     VCPU    *vcpu = data;
-    u64            cur_itc,vitm;
-
-    UINT64  vec;
-    
-    vec = VCPU(vcpu, itv) & 0xff;
-    vmx_vcpu_pend_interrupt(vcpu, vec);
-
+    u64            cur_itc,vitv;
+
+    vitv = VCPU(vcpu, itv);
+    if ( !ITV_IRQ_MASK(vitv) ){
+        vmx_vcpu_pend_interrupt(vcpu, vitv & 0xff);
+    }
     vtm=&(vcpu->arch.arch_vmx.vtm);
     cur_itc = now_itc(vtm);
-    vitm =VCPU(vcpu, itm);
+ //    vitm =VCPU(vcpu, itm);
  //fire_itc2 = cur_itc;
  //fire_itm2 = vitm;
     update_last_itc(vtm,cur_itc);  // pseudo read to update vITC
@@ -131,55 +130,76 @@
  */
 uint64_t vtm_get_itc(VCPU *vcpu)
 {
-    uint64_t    guest_itc, spsr;
+    uint64_t    guest_itc;
     vtime_t    *vtm;
 
     vtm=&(vcpu->arch.arch_vmx.vtm);
-    // FIXME: should use local_irq_disable & local_irq_enable ??
-    local_irq_save(spsr);
     guest_itc = now_itc(vtm);
-//    update_last_itc(vtm, guest_itc);
-
-    local_irq_restore(spsr);
     return guest_itc;
 }
 
+
+
+
 void vtm_set_itc(VCPU *vcpu, uint64_t new_itc)
 {
-    uint64_t    spsr;
+    uint64_t    vitm, vitv;
     vtime_t     *vtm;
-
+    vitm = VCPU(vcpu,itm);
+    vitv = VCPU(vcpu,itv);
     vtm=&(vcpu->arch.arch_vmx.vtm);
-    local_irq_save(spsr);
     vtm->vtm_offset = new_itc - ia64_get_itc();
     vtm->last_itc = new_itc;
-    vtm_interruption_update(vcpu, vtm);
-    local_irq_restore(spsr);
-}
-
-void vtm_set_itv(VCPU *vcpu)
-{
-    uint64_t    spsr,itv;
-    vtime_t     *vtm;
-
+    if(vitm < new_itc){
+        clear_bit(ITV_VECTOR(vitv), &VCPU(vcpu, irr[0]));
+        stop_timer(&vtm->vtm_timer);
+    }
+}
+
+
+#define TIMER_SLOP (50*1000) /* ns */  /* copy from timer.c */
+extern u64 cycle_to_ns(u64 cyle);
+
+
+void vtm_set_itm(VCPU *vcpu, uint64_t val)
+{
+    vtime_t *vtm;
+    uint64_t   vitv, cur_itc, expires;
+    vitv = VCPU(vcpu, itv);
     vtm=&(vcpu->arch.arch_vmx.vtm);
-    local_irq_save(spsr);
-    itv = VCPU(vcpu, itv);
-    if ( ITV_IRQ_MASK(itv) )
+    // TODO; need to handle VHPI in future
+    clear_bit(ITV_VECTOR(vitv), &VCPU(vcpu, irr[0]));
+    VCPU(vcpu,itm)=val;
+    cur_itc =now_itc(vtm);
+    if(val >  vtm->last_itc){
+        expires = NOW() + cycle_to_ns(val-cur_itc) + TIMER_SLOP;
+        set_timer(&vtm->vtm_timer, expires);
+    }else{
         stop_timer(&vtm->vtm_timer);
-    vtm_interruption_update(vcpu, vtm);
-    local_irq_restore(spsr);
-}
-
-
-/*
- * Update interrupt or hook the vtm timer for fire 
+    }
+}
+
+
+void vtm_set_itv(VCPU *vcpu, uint64_t val)
+{
+    uint64_t    olditv;
+    olditv = VCPU(vcpu, itv);
+    VCPU(vcpu, itv) = val;
+    if(ITV_IRQ_MASK(val)){
+        clear_bit(ITV_VECTOR(olditv), &VCPU(vcpu, irr[0]));
+    }else if(ITV_VECTOR(olditv)!=ITV_VECTOR(val)){
+        if(test_and_clear_bit(ITV_VECTOR(olditv), &VCPU(vcpu, irr[0])))
+            set_bit(ITV_VECTOR(val), &VCPU(vcpu, irr[0]));
+    }
+}
+
+
+/*
+ * Update interrupt or hook the vtm timer for fire
  * At this point vtm_timer should be removed if itv is masked.
  */
 /* Interrupt must be disabled at this point */
-
-extern u64 cycle_to_ns(u64 cyle);
-#define TIMER_SLOP (50*1000) /* ns */  /* copy from timer.c */
+/*
 void vtm_interruption_update(VCPU *vcpu, vtime_t* vtm)
 {
     uint64_t    cur_itc,vitm,vitv;
@@ -197,8 +217,7 @@
     cur_itc =now_itc(vtm);
     diff_last = vtm->last_itc - vitm;
     diff_now = cur_itc - vitm;
-    update_last_itc (vtm,cur_itc);
-    
+
     if ( diff_last >= 0 ) {
         // interrupt already fired.
         stop_timer(&vtm->vtm_timer);
@@ -207,28 +226,32 @@
         // ITV is fired.
         vmx_vcpu_pend_interrupt(vcpu, vitv&0xff);
     }
+*/
     /* Both last_itc & cur_itc < itm, wait for fire condition */
-    else {
+/*    else {
         expires = NOW() + cycle_to_ns(0-diff_now) + TIMER_SLOP;
         set_timer(&vtm->vtm_timer, expires);
     }
     local_irq_restore(spsr);
 }
+ */
 
 /*
  * Action for vtm when the domain is scheduled out.
  * Remove the timer for vtm.
  */
+/*
 void vtm_domain_out(VCPU *vcpu)
 {
     if(!is_idle_domain(vcpu->domain))
        stop_timer(&vcpu->arch.arch_vmx.vtm.vtm_timer);
 }
-
+ */
 /*
  * Action for vtm when the domain is scheduled in.
  * Fire vtm IRQ or add the timer for vtm.
  */
+/*
 void vtm_domain_in(VCPU *vcpu)
 {
     vtime_t     *vtm;
@@ -238,6 +261,7 @@
        vtm_interruption_update(vcpu, vtm);
     }
 }
+ */
 
 /*
  * Next for vLSapic
@@ -413,11 +437,12 @@
 {
     return ( (pending >> 4) > mic );
 }
-
+#if 0
 static int is_invalid_irq(int vec)
 {
     return (vec == 1 || ((vec <= 14 && vec >= 3)));
 }
+#endif //shadow it due to no use currently
 
 #define   IRQ_NO_MASKED         0
 #define   IRQ_MASKED_BY_VTPR    1
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/vmmu.c
--- a/xen/arch/ia64/vmx/vmmu.c  Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/vmmu.c  Mon Mar 20 08:56:54 2006
@@ -31,6 +31,7 @@
 #include <asm/hw_irq.h>
 #include <asm/vmx_pal_vsa.h>
 #include <asm/kregs.h>
+#include <asm/vcpu.h>
 #include <xen/irq.h>
 
 /*
@@ -68,14 +69,14 @@
 /*
  * The VRN bits of va stand for which rr to get.
  */
-ia64_rr vmmu_get_rr(VCPU *vcpu, u64 va)
-{
-    ia64_rr   vrr;
-    vmx_vcpu_get_rr(vcpu, va, &vrr.rrval);
-    return vrr;
-}
-
-
+//ia64_rr vmmu_get_rr(struct vcpu *vcpu, u64 va)
+//{
+//    ia64_rr   vrr;
+//    vcpu_get_rr(vcpu, va, &vrr.rrval);
+//    return vrr;
+//}
+
+/*
 void recycle_message(thash_cb_t *hcb, u64 para)
 {
     if(hcb->ht == THASH_VHPT)
@@ -84,7 +85,7 @@
     }
     printk("hcb=%p recycled with %lx\n",hcb,para);
 }
-
+ */
 
 /*
  * Purge all guest TCs in logical processor.
@@ -102,7 +103,6 @@
     u32 stride1,stride2;
     u32 i,j;
     u64 psr;
-    
 
     result = ia64_pal_call_static(PAL_PTCE_INFO,0,0,0, 0);
     if ( result.status != 0 ) {
@@ -113,7 +113,7 @@
     count2 = LOW_32BITS (result.v1);
     stride1 = HIGH_32BITS(result.v2);
     stride2 = LOW_32BITS (result.v2);
-    
+
     local_irq_save(psr);
     for (i=0; i<count1; i++) {
         for (j=0; j<count2; j++) {
@@ -133,24 +133,10 @@
 //    struct page_info *page;
     thash_cb_t  *vhpt;
     PTA pta_value;
-/*
-    page = alloc_domheap_pages (NULL, VCPU_VHPT_ORDER, 0);
-    if ( page == NULL ) {
-        panic("No enough contiguous memory for init_domain_mm\n");
-    }
-    vbase = page_to_virt(page);
-    printk("Allocate domain vhpt at 0x%lx\n", (u64)vbase);
-    memset(vbase, 0, VCPU_VHPT_SIZE);
- */
-//    vcur = (void*)((u64)vbase + VCPU_VHPT_SIZE);
     vcur -= sizeof (thash_cb_t);
     vhpt = vcur;
     vhpt->ht = THASH_VHPT;
     vhpt->vcpu = d;
-//    vhpt->hash_func = machine_thash;
-//    vcur -= sizeof (vhpt_special);
-//    vs = vcur;
-
     /* Setup guest pta */
     pta_value.val = 0;
     pta_value.ve = 1;
@@ -159,14 +145,10 @@
     pta_value.base = ((u64)vbase) >> PTA_BASE_SHIFT;
     d->arch.arch_vmx.mpta = pta_value.val;
 
-//    vhpt->vs = vs;
-//    vhpt->vs->get_mfn = __gpfn_to_mfn_foreign;
-//    vhpt->vs->tag_func = machine_ttag;
     vhpt->hash = vbase;
     vhpt->hash_sz = VCPU_VHPT_SIZE/2;
     vhpt->cch_buf = (void *)(vbase + vhpt->hash_sz);
     vhpt->cch_sz = (u64)vcur - (u64)vhpt->cch_buf;
-//    vhpt->recycle_notifier = recycle_message;
     thash_init(vhpt,VCPU_VHPT_SHIFT-1);
     return vhpt;
 }
@@ -177,9 +159,8 @@
 {
     struct page_info *page;
     void    *vbase, *vhptbase, *vcur;
-    tlb_special_t  *ts;
     thash_cb_t  *tlb;
-    
+
     page = alloc_domheap_pages (NULL, VCPU_VHPT_ORDER, 0);
     if ( page == NULL ) {
         panic("No enough contiguous memory for init_domain_mm\n");
@@ -193,10 +174,7 @@
     tlb = vcur;
     tlb->ht = THASH_TLB;
     tlb->vcpu = d;
-    vcur -= sizeof (tlb_special_t);
-    ts = vcur;
-    tlb->ts = ts;
-    tlb->ts->vhpt = init_domain_vhpt(d,vhptbase,vbase);
+    tlb->vhpt = init_domain_vhpt(d,vhptbase,vbase);
 //    tlb->hash_func = machine_thash;
     tlb->hash = vbase;
     tlb->hash_sz = VCPU_VTLB_SIZE/2;
@@ -207,27 +185,6 @@
     return tlb;
 }
 
-/* Allocate physical to machine mapping table for domN
- * FIXME: Later this interface may be removed, if that table is provided
- * by control panel. Dom0 has gpfn identical to mfn, which doesn't need
- * this interface at all.
- */
-#if 0
-void
-alloc_pmt(struct domain *d)
-{
-    struct page_info *page;
-
-    /* Only called once */
-    ASSERT(d->arch.pmt);
-
-    page = alloc_domheap_pages(NULL, get_order(d->max_pages), 0);
-    ASSERT(page);
-
-    d->arch.pmt = page_to_virt(page);
-    memset(d->arch.pmt, 0x55, d->max_pages * 8);
-}
-#endif
 /*
  * Insert guest TLB to machine TLB.
  *  data:   In TLB format
@@ -240,7 +197,6 @@
     unsigned long mtlb_ppn;
     mtlb.ifa = tlb->vadr;
     mtlb.itir = tlb->itir & ~ITIR_RV_MASK;
-    //vmx_vcpu_get_rr(d, mtlb.ifa, &vrr.value);
     mtlb.page_flags = tlb->page_flags & ~PAGE_FLAGS_RV_MASK;
     mtlb.ppn = get_mfn(d->domain,tlb->ppn);
     mtlb_ppn=mtlb.ppn;
@@ -311,7 +267,7 @@
     IA64_PSR  vpsr; 
 
     vpsr.val = vmx_vcpu_get_psr(vcpu);
-    vrr = vmx_vcpu_rr(vcpu, vadr);
+    vcpu_get_rr(vcpu, vadr, &vrr.rrval);
     vmx_vcpu_get_pta(vcpu,&vpta.val);
 
     if ( vrr.ve & vpta.ve ) {
@@ -355,21 +311,18 @@
     u64     *vpa;
     thash_data_t    *tlb;
     thash_cb_t *hcb;
-    ia64_rr vrr;
     u64     mfn;
 
     if ( !(VCPU(vcpu, vpsr) & IA64_PSR_IT) ) {   // I-side physical mode
         gpip = gip;
     }
     else {
-        vmx_vcpu_get_rr(vcpu, gip, &vrr.rrval);
-       hcb = vmx_vcpu_get_vtlb(vcpu);
-        tlb = vtlb_lookup_ex (hcb, vrr.rid, gip, ISIDE_TLB );
-        if( tlb == NULL )
-             tlb = vtlb_lookup_ex (hcb,
-                vrr.rid, gip, DSIDE_TLB );
-        if (tlb) 
-               gpip = (tlb->ppn << 12) | ( gip & (PSIZE(tlb->ps)-1) );
+           hcb = vmx_vcpu_get_vtlb(vcpu);
+        tlb = vtlb_lookup(hcb, gip, ISIDE_TLB);
+//        if( tlb == NULL )
+//             tlb = vtlb_lookup(hcb, gip, DSIDE_TLB );
+        if (tlb)
+               gpip = (tlb->ppn >>(tlb->ps-12)<<tlb->ps) | ( gip & 
(PSIZE(tlb->ps)-1) );
     }
     if( gpip){
         mfn = gmfn_to_mfn(vcpu->domain, gpip >>PAGE_SHIFT);
@@ -388,236 +341,146 @@
 
 IA64FAULT vmx_vcpu_itc_i(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa)
 {
-
-    thash_data_t data, *ovl;
-    thash_cb_t  *hcb;
-    search_section_t sections;
-    ia64_rr vrr;
-
-    hcb = vmx_vcpu_get_vtlb(vcpu);
-    data.page_flags=pte & ~PAGE_FLAGS_RV_MASK;
-    data.itir=itir;
-    data.vadr=PAGEALIGN(ifa,data.ps);
-    data.tc = 1;
-    data.cl=ISIDE_TLB;
-    vmx_vcpu_get_rr(vcpu, ifa, (UINT64 *)&vrr);
-    data.rid = vrr.rid;
-    
-    sections.tr = 1;
-    sections.tc = 0;
-
-    ovl = vtr_find_overlap(hcb, &data, ISIDE_TLB);
-    while (ovl) {
+    int slot;
+    u64 ps, va;
+    thash_cb_t  *hcb;
+
+    ps = itir_ps(itir);
+    va = PAGEALIGN(ifa, ps);
+    slot = vtr_find_overlap(vcpu, va, ps, ISIDE_TLB);
+    if (slot >=0) {
         // generate MCA.
         panic("Tlb conflict!!");
         return IA64_FAULT;
     }
-    thash_purge_and_insert(hcb, &data, ifa);
-    return IA64_NO_FAULT;
-}
-
-
-
+    hcb = vmx_vcpu_get_vtlb(vcpu);
+    thash_purge_and_insert(hcb, pte, itir, ifa);
+    return IA64_NO_FAULT;
+}
 
 IA64FAULT vmx_vcpu_itc_d(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa)
 {
-
-    thash_data_t data, *ovl;
-    thash_cb_t  *hcb;
-    search_section_t sections;
-    ia64_rr vrr;
-
-    hcb = vmx_vcpu_get_vtlb(vcpu);
-    data.page_flags=pte & ~PAGE_FLAGS_RV_MASK;
-    data.itir=itir;
-    data.vadr=PAGEALIGN(ifa,data.ps);
-    data.tc = 1;
-    data.cl=DSIDE_TLB;
-    vmx_vcpu_get_rr(vcpu, ifa,(UINT64 *)&vrr);
-    data.rid = vrr.rid;
-    sections.tr = 1;
-    sections.tc = 0;
-
-    ovl = vtr_find_overlap(hcb, &data, DSIDE_TLB);
-    if (ovl) {
-          // generate MCA.
-        panic("Tlb conflict!!");
-        return IA64_FAULT;
-    }
-    thash_purge_and_insert(hcb, &data, ifa);
-    return IA64_NO_FAULT;
-}
-
-/*
- * Return TRUE/FALSE for success of lock operation
- */
-
-/*
-int vmx_lock_guest_dtc (VCPU *vcpu, UINT64 va, int lock)
-{
-
-    thash_cb_t  *hcb;
-    ia64_rr vrr;
-    u64          preferred_size;
-
-    vmx_vcpu_get_rr(vcpu, va, &vrr);
-    hcb = vmx_vcpu_get_vtlb(vcpu);
-    va = PAGEALIGN(va,vrr.ps);
-    preferred_size = PSIZE(vrr.ps);
-    return thash_lock_tc(hcb, va, preferred_size, vrr.rid, DSIDE_TLB, lock);
-}
- */
-
-
-
-IA64FAULT vmx_vcpu_itr_i(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa, 
UINT64 idx)
-{
-
-    thash_data_t data, *ovl;
-    thash_cb_t  *hcb;
-    search_section_t sections;
-    ia64_rr vrr;
-    /* u64 mfn,psr; */
-
-    hcb = vmx_vcpu_get_vtlb(vcpu);
-    data.page_flags=pte & ~PAGE_FLAGS_RV_MASK;
-    data.itir=itir;
-    data.vadr=PAGEALIGN(ifa,data.ps);
-    data.tc = 0;
-    data.cl=ISIDE_TLB;
-    vmx_vcpu_get_rr(vcpu, ifa, (UINT64 *)&vrr);
-    data.rid = vrr.rid;
-    sections.tr = 1;
-    sections.tc = 0;
-
-
-    ovl = vtr_find_overlap(hcb, &data, ISIDE_TLB);
-    if (ovl) {
+    int slot;
+    u64 ps, va, gpfn;
+    thash_cb_t  *hcb;
+
+    ps = itir_ps(itir);
+    va = PAGEALIGN(ifa, ps);
+    slot = vtr_find_overlap(vcpu, va, ps, DSIDE_TLB);
+    if (slot >=0) {
         // generate MCA.
         panic("Tlb conflict!!");
         return IA64_FAULT;
     }
-    sections.tr = 0;
-    sections.tc = 1;
-    thash_purge_entries(hcb, &data, sections);
-/*    if((idx==IA64_TR_KERNEL)&&(data.ps == KERNEL_TR_PAGE_SHIFT)){
-        data.contiguous=1;
-    }
- */
-    thash_tr_insert(hcb, &data, ifa, idx);
-/*
-    if((idx==IA64_TR_KERNEL)&&(data.ps == KERNEL_TR_PAGE_SHIFT)){
-        mfn = __gpfn_to_mfn_foreign(vcpu->domain,arch_to_xen_ppn(data.ppn));
-        data.page_flags=pte&~PAGE_FLAGS_RV_MASK;
-        data.ppn = xen_to_arch_ppn(mfn);
-        psr = ia64_clear_ic();
-        ia64_itr(0x1, IA64_ITR_GUEST_KERNEL, data.vadr, data.page_flags, 
data.ps);
-        ia64_set_psr(psr);      // restore psr
-        ia64_srlz_i();
-//        return IA64_NO_FAULT;
-    }
-*/
-    return IA64_NO_FAULT;
-}
-
-IA64FAULT vmx_vcpu_itr_d(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa, 
UINT64 idx)
-{
-
-    thash_data_t data, *ovl;
-    thash_cb_t  *hcb;
-    search_section_t sections;
-    ia64_rr    vrr;
-    /* u64 mfn,psr; */
-
-    hcb = vmx_vcpu_get_vtlb(vcpu);
-    data.page_flags=pte & ~PAGE_FLAGS_RV_MASK;
-    data.itir=itir;
-    data.vadr=PAGEALIGN(ifa,data.ps);
-    data.tc = 0;
-    data.cl=DSIDE_TLB;
-    vmx_vcpu_get_rr(vcpu, ifa,(UINT64 *)&vrr);
-    data.rid = vrr.rid;
-    sections.tr = 1;
-    sections.tc = 0;
-
-    ovl = vtr_find_overlap(hcb, &data, DSIDE_TLB);
-    while (ovl) {
+    hcb = vmx_vcpu_get_vtlb(vcpu);
+    gpfn = (pte & _PAGE_PPN_MASK)>> PAGE_SHIFT;
+    if(__gpfn_is_io(vcpu->domain,gpfn))
+        pte |= VTLB_PTE_IO;
+    thash_purge_and_insert(hcb, pte, itir, ifa);
+    return IA64_NO_FAULT;
+
+}
+
+
+
+
+IA64FAULT vmx_vcpu_itr_i(VCPU *vcpu, u64 slot, u64 pte, u64 itir, u64 ifa)
+{
+    int index;
+    u64 ps, va, rid;
+    thash_cb_t  *hcb;
+
+    ps = itir_ps(itir);
+    va = PAGEALIGN(ifa, ps);
+    index = vtr_find_overlap(vcpu, va, ps, ISIDE_TLB);
+    if (index >=0) {
         // generate MCA.
         panic("Tlb conflict!!");
         return IA64_FAULT;
     }
-    sections.tr = 0;
-    sections.tc = 1;
-    thash_purge_entries(hcb, &data, sections);
-/*
-    if((idx==IA64_TR_KERNEL)&&(data.ps == KERNEL_TR_PAGE_SHIFT)){
-        data.contiguous=1;
-    }
- */
-    thash_tr_insert(hcb, &data, ifa, idx);
-/*
-    if((idx==IA64_TR_KERNEL)&&(data.ps == KERNEL_TR_PAGE_SHIFT)){
-        mfn = __gpfn_to_mfn_foreign(vcpu->domain,arch_to_xen_ppn(data.ppn));
-        data.page_flags=pte&~PAGE_FLAGS_RV_MASK;
-        data.ppn = xen_to_arch_ppn(mfn);
-        psr = ia64_clear_ic();
-        ia64_itr(0x2,IA64_DTR_GUEST_KERNEL , data.vadr, data.page_flags, 
data.ps);
-        ia64_set_psr(psr);      // restore psr
-        ia64_srlz_i();
-//        return IA64_NO_FAULT;
-    }
-*/
-
-    return IA64_NO_FAULT;
-}
-
-
-
-IA64FAULT vmx_vcpu_ptr_d(VCPU *vcpu,UINT64 vadr,UINT64 ps)
-{
-    thash_cb_t  *hcb;
-    ia64_rr rr;
-    search_section_t sections;
-
-    hcb = vmx_vcpu_get_vtlb(vcpu);
-    rr=vmx_vcpu_rr(vcpu,vadr);
-    sections.tr = 1;
-    sections.tc = 1;
-    thash_purge_entries_ex(hcb,rr.rid,vadr,ps,sections,DSIDE_TLB);
-    return IA64_NO_FAULT;
-}
-
-IA64FAULT vmx_vcpu_ptr_i(VCPU *vcpu,UINT64 vadr,UINT64 ps)
-{
-    thash_cb_t  *hcb;
-    ia64_rr rr;
-    search_section_t sections;
-    hcb = vmx_vcpu_get_vtlb(vcpu);
-    rr=vmx_vcpu_rr(vcpu,vadr);
-    sections.tr = 1;
-    sections.tc = 1;
-    thash_purge_entries_ex(hcb,rr.rid,vadr,ps,sections,ISIDE_TLB);
-    return IA64_NO_FAULT;
-}
-
-IA64FAULT vmx_vcpu_ptc_l(VCPU *vcpu, UINT64 vadr, UINT64 ps)
-{
-    thash_cb_t  *hcb;
-    ia64_rr vrr;
-    search_section_t sections;
-    hcb = vmx_vcpu_get_vtlb(vcpu);
-    vrr=vmx_vcpu_rr(vcpu,vadr);
-    sections.tr = 0;
-    sections.tc = 1;
-    vadr = PAGEALIGN(vadr, ps);
-
-    thash_purge_entries_ex(hcb,vrr.rid,vadr,ps,sections,DSIDE_TLB);
-    thash_purge_entries_ex(hcb,vrr.rid,vadr,ps,sections,ISIDE_TLB);
-    return IA64_NO_FAULT;
-}
-
-
-IA64FAULT vmx_vcpu_ptc_e(VCPU *vcpu, UINT64 vadr)
+    hcb = vmx_vcpu_get_vtlb(vcpu);
+    thash_purge_entries(hcb, va, ps);
+    vcpu_get_rr(vcpu, va, &rid);
+    rid = rid& RR_RID_MASK;
+    vmx_vcpu_set_tr((thash_data_t *)&vcpu->arch.itrs[slot], pte, itir, va, 
rid);
+    vcpu_quick_region_set(PSCBX(vcpu,itr_regions),va);
+    return IA64_NO_FAULT;
+}
+
+
+IA64FAULT vmx_vcpu_itr_d(VCPU *vcpu, u64 slot, u64 pte, u64 itir, u64 ifa)
+{
+    int index;
+    u64 ps, va, gpfn, rid;
+    thash_cb_t  *hcb;
+
+    ps = itir_ps(itir);
+    va = PAGEALIGN(ifa, ps);
+    index = vtr_find_overlap(vcpu, va, ps, DSIDE_TLB);
+    if (index>=0) {
+        // generate MCA.
+        panic("Tlb conflict!!");
+        return IA64_FAULT;
+    }
+    hcb = vmx_vcpu_get_vtlb(vcpu);
+    thash_purge_entries(hcb, va, ps);
+    gpfn = (pte & _PAGE_PPN_MASK)>> PAGE_SHIFT;
+    if(__gpfn_is_io(vcpu->domain,gpfn))
+        pte |= VTLB_PTE_IO;
+    vcpu_get_rr(vcpu, va, &rid);
+    rid = rid& RR_RID_MASK;
+    vmx_vcpu_set_tr((thash_data_t *)&vcpu->arch.dtrs[slot], pte, itir, va, 
rid);
+    vcpu_quick_region_set(PSCBX(vcpu,dtr_regions),va);
+    return IA64_NO_FAULT;
+}
+
+
+
+IA64FAULT vmx_vcpu_ptr_d(VCPU *vcpu,UINT64 ifa,UINT64 ps)
+{
+    int index;
+    u64 va;
+    thash_cb_t  *hcb;
+
+    va = PAGEALIGN(ifa, ps);
+    index = vtr_find_overlap(vcpu, va, ps, DSIDE_TLB);
+    if (index>=0) {
+        vcpu->arch.dtrs[index].p=0;
+        index = vtr_find_overlap(vcpu, va, ps, DSIDE_TLB);
+    }
+    hcb = vmx_vcpu_get_vtlb(vcpu);
+    thash_purge_entries(hcb, va, ps);
+    return IA64_NO_FAULT;
+}
+
+IA64FAULT vmx_vcpu_ptr_i(VCPU *vcpu,UINT64 ifa,UINT64 ps)
+{
+    int index;
+    u64 va;
+    thash_cb_t  *hcb;
+
+    va = PAGEALIGN(ifa, ps);
+    index = vtr_find_overlap(vcpu, va, ps, ISIDE_TLB);
+    if (index>=0) {
+        vcpu->arch.itrs[index].p=0;
+        index = vtr_find_overlap(vcpu, va, ps, ISIDE_TLB);
+    }
+    hcb = vmx_vcpu_get_vtlb(vcpu);
+    thash_purge_entries(hcb, va, ps);
+    return IA64_NO_FAULT;
+}
+
+IA64FAULT vmx_vcpu_ptc_l(VCPU *vcpu, UINT64 va, UINT64 ps)
+{
+    thash_cb_t  *hcb;
+    va = PAGEALIGN(va, ps);
+    hcb = vmx_vcpu_get_vtlb(vcpu);
+    thash_purge_entries(hcb, va, ps);
+    return IA64_NO_FAULT;
+}
+
+
+IA64FAULT vmx_vcpu_ptc_e(VCPU *vcpu, UINT64 va)
 {
     thash_cb_t  *hcb;
     hcb = vmx_vcpu_get_vtlb(vcpu);
@@ -625,15 +488,15 @@
     return IA64_NO_FAULT;
 }
 
-IA64FAULT vmx_vcpu_ptc_g(VCPU *vcpu, UINT64 vadr, UINT64 ps)
-{
-    vmx_vcpu_ptc_l(vcpu, vadr, ps);
+IA64FAULT vmx_vcpu_ptc_g(VCPU *vcpu, UINT64 va, UINT64 ps)
+{
+    vmx_vcpu_ptc_l(vcpu, va, ps);
     return IA64_ILLOP_FAULT;
 }
 
-IA64FAULT vmx_vcpu_ptc_ga(VCPU *vcpu,UINT64 vadr,UINT64 ps)
-{
-    vmx_vcpu_ptc_l(vcpu, vadr, ps);
+IA64FAULT vmx_vcpu_ptc_ga(VCPU *vcpu,UINT64 va,UINT64 ps)
+{
+    vmx_vcpu_ptc_l(vcpu, va, ps);
     return IA64_NO_FAULT;
 }
 
@@ -644,7 +507,7 @@
     ia64_rr vrr;
     u64 vhpt_offset;
     vmx_vcpu_get_pta(vcpu, &vpta.val);
-    vrr=vmx_vcpu_rr(vcpu, vadr);
+    vcpu_get_rr(vcpu, vadr, &vrr.rrval);
     if(vpta.vf){
         panic("THASH,Don't support long format VHPT");
         *pval = ia64_call_vsa(PAL_VPS_THASH,vadr,vrr.rrval,vpta.val,0,0,0,0);
@@ -663,7 +526,7 @@
     ia64_rr vrr;
     PTA vpta;
     vmx_vcpu_get_pta(vcpu, &vpta.val);
-    vrr=vmx_vcpu_rr(vcpu, vadr);
+    vcpu_get_rr(vcpu, vadr, &vrr.rrval);
     if(vpta.vf){
         panic("THASH,Don't support long format VHPT");
         *pval = ia64_call_vsa(PAL_VPS_TTAG,vadr,vrr.rrval,0,0,0,0,0);
@@ -679,13 +542,11 @@
 {
     thash_data_t *data;
     thash_cb_t  *hcb;
-    ia64_rr vrr;
     ISR visr,pt_isr;
     REGS *regs;
     u64 vhpt_adr;
     IA64_PSR vpsr;
     hcb = vmx_vcpu_get_vtlb(vcpu);
-    vrr=vmx_vcpu_rr(vcpu,vadr);
     regs=vcpu_regs(vcpu);
     pt_isr.val=VMX(vcpu,cr_isr);
     visr.val=0;
@@ -696,7 +557,7 @@
          visr.ni=1;
     }
     visr.na=1;
-    data = vtlb_lookup_ex(hcb, vrr.rid, vadr, DSIDE_TLB);
+    data = vtlb_lookup(hcb, vadr, DSIDE_TLB);
     if(data){
         if(data->p==0){
             visr.na=1;
@@ -744,8 +605,7 @@
         }
         else{
             vmx_vcpu_thash(vcpu, vadr, &vhpt_adr);
-            vrr=vmx_vcpu_rr(vcpu,vhpt_adr);
-            data = vtlb_lookup_ex(hcb, vrr.rid, vhpt_adr, DSIDE_TLB);
+            data = vtlb_lookup(hcb, vhpt_adr, DSIDE_TLB);
             if(data){
                 if(vpsr.ic){
                     vcpu_set_isr(vcpu, visr.val);
@@ -776,7 +636,6 @@
 {
     thash_data_t *data;
     thash_cb_t  *hcb;
-    ia64_rr rr;
     PTA vpta;
     vmx_vcpu_get_pta(vcpu, &vpta.val);
     if(vpta.vf==0 || unimplemented_gva(vcpu, vadr)){
@@ -784,8 +643,7 @@
         return IA64_NO_FAULT;
     }
     hcb = vmx_vcpu_get_vtlb(vcpu);
-    rr=vmx_vcpu_rr(vcpu,vadr);
-    data = vtlb_lookup_ex(hcb, rr.rid, vadr, DSIDE_TLB);
+    data = vtlb_lookup(hcb, vadr, DSIDE_TLB);
     if(!data||!data->p){
         *key=1;
     }else{
@@ -821,11 +679,9 @@
     unsigned long      end;    /* end of the area mapped by current entry */
     thash_data_t       *entry;
     struct vcpu *v = current;
-    ia64_rr    vrr;
 
     vtlb = vmx_vcpu_get_vtlb(v); 
-    vrr = vmx_vcpu_rr(v, va);
-    entry = vtlb_lookup_ex(vtlb, vrr.rid, va, DSIDE_TLB);
+    entry = vtlb_lookup(vtlb, va, DSIDE_TLB);
     if (entry == NULL)
        return -EFAULT;
 
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/vmx_hypercall.c
--- a/xen/arch/ia64/vmx/vmx_hypercall.c Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/vmx_hypercall.c Mon Mar 20 08:56:54 2006
@@ -35,6 +35,9 @@
 #include <asm/dom_fw.h>
 #include <xen/domain.h>
 
+extern long do_sched_op(int cmd, unsigned long arg);
+extern unsigned long domain_mpa_to_imva(struct domain *,unsigned long mpaddr);
+
 void hyper_not_support(void)
 {
     VCPU *vcpu=current;
@@ -123,7 +126,7 @@
     vcpu_set_gr(vcpu, 8, ret, 0);
     vmx_vcpu_increment_iip(vcpu);
 }
-
+/*
 static int do_lock_page(VCPU *vcpu, u64 va, u64 lock)
 {
     ia64_rr rr;
@@ -132,7 +135,7 @@
     rr = vmx_vcpu_rr(vcpu, va);
     return thash_lock_tc(hcb, va ,1U<<rr.ps, rr.rid, DSIDE_TLB, lock);
 }
-
+ */
 /*
  * Lock guest page in vTLB, so that it's not relinquished by recycle
  * session when HV is servicing that hypercall.
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/vmx_init.c
--- a/xen/arch/ia64/vmx/vmx_init.c      Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/vmx_init.c      Mon Mar 20 08:56:54 2006
@@ -50,6 +50,8 @@
 #include <public/arch-ia64.h>
 #include <asm/hvm/vioapic.h>
 #include <public/event_channel.h>
+#include <xen/event.h>
+#include <asm/vlsapic.h>
 
 /* Global flag to identify whether Intel vmx feature is on */
 u32 vmx_enabled = 0;
@@ -96,7 +98,7 @@
        if (!(vp_env_info & VP_OPCODE))
                printk("WARNING: no opcode provided from hardware(%lx)!!!\n", 
vp_env_info);
        vm_order = get_order(buffer_size);
-       printk("vm buffer size: %ld, order: %ld\n", buffer_size, vm_order);
+       printk("vm buffer size: %ld, order: %d\n", buffer_size, vm_order);
 
        vmx_enabled = 1;
 no_vti:
@@ -161,7 +163,7 @@
                return NULL;
        }
 
-       printk("vpd base: 0x%lx, vpd size:%d\n", vpd, sizeof(vpd_t));
+       printk("vpd base: 0x%p, vpd size:%ld\n", vpd, sizeof(vpd_t));
        memset(vpd, 0, VPD_SIZE);
        /* CPUID init */
        for (i = 0; i < 5; i++)
@@ -234,7 +236,7 @@
 {
        u64 status;
 
-       status = ia64_pal_vp_restore(v->arch.privregs, 0);
+       status = ia64_pal_vp_restore((u64 *)v->arch.privregs, 0);
        if (status != PAL_STATUS_SUCCESS)
                panic("Restore vp status failed\n");
 
@@ -307,7 +309,6 @@
 
 int vmx_alloc_contig_pages(struct domain *d)
 {
-       unsigned int order;
        unsigned long i, j, start,tmp, end, pgnr, conf_nr;
        struct page_info *page;
        struct vcpu *v = d->vcpu[0];
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/vmx_interrupt.c
--- a/xen/arch/ia64/vmx/vmx_interrupt.c Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/vmx_interrupt.c Mon Mar 20 08:56:54 2006
@@ -334,12 +334,13 @@
  *  @ Nat Consumption Vector
  * Refer to SDM Vol2 Table 5-6 & 8-1
  */
-
+#if 0
 static void
 ir_nat_page_consumption (VCPU *vcpu, u64 vadr)
 {
     _nat_consumption_fault(vcpu, vadr, DATA);
 }
+#endif //shadow it due to no use currently 
 
 /*
  * Instruction Nat Page Consumption Fault
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/vmx_irq_ia64.c
--- a/xen/arch/ia64/vmx/vmx_irq_ia64.c  Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/vmx_irq_ia64.c  Mon Mar 20 08:56:54 2006
@@ -128,6 +128,6 @@
         * come through until ia64_eoi() has been done.
         */
        vmx_irq_exit();
-       if (current && wake_dom0 != dom0 ) 
+       if (wake_dom0 && current->domain != dom0 ) 
                vcpu_wake(dom0->vcpu[0]);
 }
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/vmx_phy_mode.c
--- a/xen/arch/ia64/vmx/vmx_phy_mode.c  Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/vmx_phy_mode.c  Mon Mar 20 08:56:54 2006
@@ -104,57 +104,51 @@
     vcpu->arch.mode_flags = GUEST_IN_PHY;
 }
 
-extern u64 get_mfn(struct domain *d, u64 gpfn);
 extern void vmx_switch_rr7(unsigned long ,shared_info_t*,void *,void *,void *);
-void
-physical_itlb_miss_dom0(VCPU *vcpu, u64 vadr)
+/*void
+physical_itlb_miss(VCPU *vcpu, u64 vadr)
 {
     u64 psr;
     IA64_PSR vpsr;
-    u64 mppn,gppn;
+    u64 xen_mppn,xen_gppn;
     vpsr.val=vmx_vcpu_get_psr(vcpu);
-    gppn=(vadr<<1)>>13;
-    mppn = get_mfn(vcpu->domain,gppn);
-    mppn=(mppn<<12)|(vpsr.cpl<<7); 
-//    if(vadr>>63)
-//       mppn |= PHY_PAGE_UC;
-//    else
-    mppn |= PHY_PAGE_WB;
+    xen_gppn=(vadr<<1)>>(PAGE_SHIFT+1);
+    xen_mppn = gmfn_to_mfn(vcpu->domain, xen_gppn);
+    xen_mppn=(xen_mppn<<PAGE_SHIFT)|(vpsr.cpl<<7);
+    if(vadr>>63)
+        xen_mppn |= PHY_PAGE_UC;
+    else
+        xen_mppn |= PHY_PAGE_WB;
 
     psr=ia64_clear_ic();
-    ia64_itc(1,vadr&(~0xfff),mppn,EMUL_PHY_PAGE_SHIFT);
+    ia64_itc(1,vadr&PAGE_MASK,xen_mppn,PAGE_SHIFT);
     ia64_set_psr(psr);
     ia64_srlz_i();
     return;
 }
 
-
-void
-physical_itlb_miss(VCPU *vcpu, u64 vadr)
-{
-        physical_itlb_miss_dom0(vcpu, vadr);
-}
-
-
-void
-physical_dtlb_miss(VCPU *vcpu, u64 vadr)
+*/
+/* 
+ *      vec=1, itlb miss
+ *      vec=2, dtlb miss
+ */
+void
+physical_tlb_miss(VCPU *vcpu, u64 vadr, u64 vec)
 {
     u64 psr;
     IA64_PSR vpsr;
-    u64 mppn,gppn;
-//    if(vcpu->domain!=dom0)
-//        panic("dom n physical dtlb miss happen\n");
+    u64 xen_mppn,xen_gppn;
     vpsr.val=vmx_vcpu_get_psr(vcpu);
-    gppn=(vadr<<1)>>13;
-    mppn = get_mfn(vcpu->domain, gppn);
-    mppn=(mppn<<12)|(vpsr.cpl<<7);
+    xen_gppn=(vadr<<1)>>(PAGE_SHIFT+1);
+    xen_mppn = gmfn_to_mfn(vcpu->domain, xen_gppn);
+    xen_mppn=(xen_mppn<<PAGE_SHIFT)|(vpsr.cpl<<7);
     if(vadr>>63)
-        mppn |= PHY_PAGE_UC;
+        xen_mppn |= PHY_PAGE_UC;
     else
-        mppn |= PHY_PAGE_WB;
+        xen_mppn |= PHY_PAGE_WB;
 
     psr=ia64_clear_ic();
-    ia64_itc(2,vadr&(~0xfff),mppn,EMUL_PHY_PAGE_SHIFT);
+    ia64_itc(vec,vadr&PAGE_MASK,xen_mppn,PAGE_SHIFT);
     ia64_set_psr(psr);
     ia64_srlz_i();
     return;
@@ -193,13 +187,13 @@
        if (is_physical_mode(vcpu)) {
                if (vcpu->arch.mode_flags & GUEST_PHY_EMUL)
                        panic("Unexpected domain switch in phy emul\n");
-               phy_rr.rrval = vcpu->domain->arch.metaphysical_rr0;
-       phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+               phy_rr.rrval = vcpu->arch.metaphysical_rr0;
+ //    phy_rr.ps = PAGE_SHIFT;
        phy_rr.ve = 1;
 
                ia64_set_rr((VRN0 << VRN_SHIFT), phy_rr.rrval);
-               phy_rr.rrval = vcpu->domain->arch.metaphysical_rr4;
-       phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+               phy_rr.rrval = vcpu->arch.metaphysical_rr4;
+//     phy_rr.ps = PAGE_SHIFT;
            phy_rr.ve = 1;
 
                ia64_set_rr((VRN4 << VRN_SHIFT), phy_rr.rrval);
@@ -224,7 +218,7 @@
     extern void * pal_vaddr;
     vmx_switch_rr7(vmx_vrrtomrr(vcpu,VMX(vcpu, vrr[VRN7])),(void 
*)vcpu->domain->shared_info,
                 (void *)vcpu->arch.privregs,
-                ( void *)vcpu->arch.vtlb->ts->vhpt->hash, pal_vaddr );
+                (void *)vcpu->arch.vtlb->vhpt->hash, pal_vaddr );
     ia64_set_pta(vcpu->arch.arch_vmx.mpta);
 
        ia64_srlz_d();
@@ -242,12 +236,12 @@
     /* Save original virtual mode rr[0] and rr[4] */
     psr=ia64_clear_ic();
     phy_rr.rrval = vcpu->domain->arch.metaphysical_rr0;
-    phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+//    phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
     phy_rr.ve = 1;
     ia64_set_rr(VRN0<<VRN_SHIFT, phy_rr.rrval);
     ia64_srlz_d();
     phy_rr.rrval = vcpu->domain->arch.metaphysical_rr4;
-    phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+//    phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
     phy_rr.ve = 1;
     ia64_set_rr(VRN4<<VRN_SHIFT, phy_rr.rrval);
     ia64_srlz_d();
@@ -266,10 +260,10 @@
 
     psr=ia64_clear_ic();
 
-    mrr=vmx_vcpu_rr(vcpu,VRN0<<VRN_SHIFT);
+    vcpu_get_rr(vcpu,VRN0<<VRN_SHIFT,&mrr.rrval);
     ia64_set_rr(VRN0<<VRN_SHIFT, vmx_vrrtomrr(vcpu, mrr.rrval));
     ia64_srlz_d();
-    mrr=vmx_vcpu_rr(vcpu,VRN4<<VRN_SHIFT);
+    vcpu_get_rr(vcpu,VRN4<<VRN_SHIFT,&mrr.rrval);
     ia64_set_rr(VRN4<<VRN_SHIFT, vmx_vrrtomrr(vcpu, mrr.rrval));
     ia64_srlz_d();
     ia64_set_psr(psr);
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/vmx_process.c   Mon Mar 20 08:56:54 2006
@@ -58,6 +58,11 @@
 
 extern void die_if_kernel(char *str, struct pt_regs *regs, long err);
 extern void rnat_consumption (VCPU *vcpu);
+extern unsigned long translate_domain_mpaddr(unsigned long mpaddr);
+extern void alt_itlb (VCPU *vcpu, u64 vadr);
+extern void itlb_fault (VCPU *vcpu, u64 vadr);
+extern void ivhpt_fault (VCPU *vcpu, u64 vadr);
+
 #define DOMN_PAL_REQUEST    0x110000
 
 static UINT64 vec2off[68] = {0x0,0x400,0x800,0xc00,0x1000, 0x1400,0x1800,
@@ -292,10 +297,9 @@
 vmx_hpw_miss(u64 vadr , u64 vec, REGS* regs)
 {
     IA64_PSR vpsr;
-    CACHE_LINE_TYPE type=ISIDE_TLB;
+    int type=ISIDE_TLB;
     u64 vhpt_adr, gppa;
     ISR misr;
-    ia64_rr vrr;
 //    REGS *regs;
     thash_cb_t *vtlb;
     thash_data_t *data;
@@ -315,34 +319,32 @@
         return;
     }
 */
-    if(vadr == 0x1ea18c00 ){
+/*    if(vadr == 0x1ea18c00 ){
         ia64_clear_ic();
         while(1);
     }
+ */
     if(is_physical_mode(v)&&(!(vadr<<1>>62))){
-        if(vec==1){
-            physical_itlb_miss(v, vadr);
-            return IA64_FAULT;
-        }
         if(vec==2){
             
if(v->domain!=dom0&&__gpfn_is_io(v->domain,(vadr<<1)>>(PAGE_SHIFT+1))){
                 emulate_io_inst(v,((vadr<<1)>>1),4);   //  UC
-            }else{
-                physical_dtlb_miss(v, vadr);
+                return IA64_FAULT;
             }
-            return IA64_FAULT;
         }
-    }
-    vrr = vmx_vcpu_rr(v, vadr);
+        physical_tlb_miss(v, vadr, vec);
+        return IA64_FAULT;
+    }
     if(vec == 1) type = ISIDE_TLB;
     else if(vec == 2) type = DSIDE_TLB;
     else panic("wrong vec\n");
 
 //    prepare_if_physical_mode(v);
 
-    if((data=vtlb_lookup_ex(vtlb, vrr.rid, vadr,type))!=0){
-       gppa = (vadr&((1UL<<data->ps)-1))+(data->ppn>>(data->ps-12)<<data->ps);
-        if(v->domain!=dom0&&type==DSIDE_TLB && 
__gpfn_is_io(v->domain,gppa>>PAGE_SHIFT)){
+    if((data=vtlb_lookup(vtlb, vadr,type))!=0){
+//     gppa = (vadr&((1UL<<data->ps)-1))+(data->ppn>>(data->ps-12)<<data->ps);
+//        if(v->domain!=dom0&&type==DSIDE_TLB && 
__gpfn_is_io(v->domain,gppa>>PAGE_SHIFT)){
+        if(v->domain!=dom0 && data->io && type==DSIDE_TLB ){
+               gppa = 
(vadr&((1UL<<data->ps)-1))+(data->ppn>>(data->ps-12)<<data->ps);
             emulate_io_inst(v, gppa, data->ma);
             return IA64_FAULT;
         }
@@ -356,7 +358,7 @@
         }
         else{
  */
-            thash_vhpt_insert(vtlb->ts->vhpt,data,vadr);
+            thash_vhpt_insert(vtlb->vhpt,data->page_flags, data->itir ,vadr);
 //        }
 //         }
     }else if(type == DSIDE_TLB){
@@ -377,8 +379,7 @@
             }
         } else{
             vmx_vcpu_thash(v, vadr, &vhpt_adr);
-            vrr=vmx_vcpu_rr(v,vhpt_adr);
-            if(vhpt_lookup(vhpt_adr) ||  vtlb_lookup_ex(vtlb, vrr.rid, 
vhpt_adr, DSIDE_TLB)){
+            if(vhpt_lookup(vhpt_adr) ||  vtlb_lookup(vtlb, vhpt_adr, 
DSIDE_TLB)){
                 if(vpsr.ic){
                     vcpu_set_isr(v, misr.val);
                     dtlb_fault(v, vadr);
@@ -420,8 +421,7 @@
             return IA64_FAULT;
         } else{
             vmx_vcpu_thash(v, vadr, &vhpt_adr);
-            vrr=vmx_vcpu_rr(v,vhpt_adr);
-            if(vhpt_lookup(vhpt_adr) || vtlb_lookup_ex(vtlb, vrr.rid, 
vhpt_adr, DSIDE_TLB)){
+            if(vhpt_lookup(vhpt_adr) || vtlb_lookup(vtlb, vhpt_adr, 
DSIDE_TLB)){
                 if(!vpsr.ic){
                     misr.ni=1;
                 }
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/vmx_vcpu.c
--- a/xen/arch/ia64/vmx/vmx_vcpu.c      Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/vmx_vcpu.c      Mon Mar 20 08:56:54 2006
@@ -204,32 +204,24 @@
 }
 
 
-ia64_rr vmx_vcpu_rr(VCPU *vcpu,UINT64 vadr)
-{
-        return (ia64_rr)VMX(vcpu,vrr[vadr>>61]);
-}
-
 
 IA64FAULT vmx_vcpu_set_rr(VCPU *vcpu, UINT64 reg, UINT64 val)
 {
     ia64_rr oldrr,newrr;
     thash_cb_t *hcb;
     extern void * pal_vaddr;
-    oldrr=vmx_vcpu_rr(vcpu,reg);
+    vcpu_get_rr(vcpu, reg, &oldrr.rrval);
     newrr.rrval=val;
-#if 1
     if(oldrr.ps!=newrr.ps){
         hcb = vmx_vcpu_get_vtlb(vcpu);
         thash_purge_all(hcb);
     }
-#endif
     VMX(vcpu,vrr[reg>>61]) = val;
-
     switch((u64)(reg>>61)) {
     case VRN7:
-       vmx_switch_rr7(vmx_vrrtomrr(vcpu,val),vcpu->domain->shared_info,
+        vmx_switch_rr7(vmx_vrrtomrr(vcpu,val),vcpu->domain->shared_info,
         (void *)vcpu->arch.privregs,
-       ( void *)vcpu->arch.vtlb->ts->vhpt->hash, pal_vaddr );
+        (void *)vcpu->arch.vtlb->vhpt->hash, pal_vaddr );
        break;
     default:
         ia64_set_rr(reg,vmx_vrrtomrr(vcpu,val));
@@ -275,7 +267,7 @@
 u64 vmx_vcpu_get_itir_on_fault(VCPU *vcpu, u64 ifa)
 {
     ia64_rr rr,rr1;
-    rr=vmx_vcpu_rr(vcpu,ifa);
+    vcpu_get_rr(vcpu,ifa,&rr.rrval);
     rr1.rrval=0;
     rr1.ps=rr.ps;
     rr1.rid=rr.rid;
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/vmx_virt.c
--- a/xen/arch/ia64/vmx/vmx_virt.c      Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/vmx_virt.c      Mon Mar 20 08:56:54 2006
@@ -34,6 +34,7 @@
 #include <asm/virt_event.h>
 #include <asm/vmx_phy_mode.h>
 extern UINT64 privop_trace;
+extern void vhpi_detection(VCPU *vcpu);//temporarily place here,need a header 
file.
 
 void
 ia64_priv_decoder(IA64_SLOT_TYPE slot_type, INST64 inst, UINT64  * cause)
@@ -572,7 +573,7 @@
    }
 #endif // VMAL_NO_FAULT_CHECK
 
-    return (vmx_vcpu_itr_d(vcpu,pte,itir,ifa,slot));
+    return (vmx_vcpu_itr_d(vcpu,slot,pte,itir,ifa));
 }
 
 IA64FAULT vmx_emul_itr_i(VCPU *vcpu, INST64 inst)
@@ -631,7 +632,7 @@
    }
 #endif // VMAL_NO_FAULT_CHECK
 
-   return (vmx_vcpu_itr_i(vcpu,pte,itir,ifa,slot));
+   return (vmx_vcpu_itr_i(vcpu,slot,pte,itir,ifa));
 }
 
 IA64FAULT itc_fault_check(VCPU *vcpu, INST64 inst, u64 *itir, u64 *ifa,u64 
*pte)
@@ -972,7 +973,7 @@
         rsv_reg_field(vcpu);
     }
 #endif  //CHECK_FAULT
-    vmx_vcpu_get_rr(vcpu,r3,&r1);
+    vcpu_get_rr(vcpu,r3,&r1);
     return vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
 }
 
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/vmx/vtlb.c  Mon Mar 20 08:56:54 2006
@@ -32,7 +32,7 @@
 #include <asm/tlbflush.h>
 #define  MAX_CCH_LENGTH     40
 
-thash_data_t *__alloc_chain(thash_cb_t *, thash_data_t *);
+thash_data_t *__alloc_chain(thash_cb_t *);
 
 static void cch_mem_init(thash_cb_t *hcb)
 {
@@ -71,126 +71,31 @@
  * Check to see if the address rid:va is translated by the TLB
  */
 
-static int __is_tr_translated(thash_data_t *tlb, u64 rid, u64 va, 
CACHE_LINE_TYPE cl)
-{
-    u64  size;
-    size = PSIZE(tlb->ps);
-    if(tlb->vadr&(size-1))
-        while(1);
-    if ((tlb->rid == rid) && ((va-tlb->vadr)<size))
-        return 1;
-    else
+static inline int __is_tr_translated(thash_data_t *trp, u64 rid, u64 va)
+{
+    return ((trp->p) && (trp->rid == rid) && ((va-trp->vadr)<PSIZE(trp->ps)));
+}
+
+/*
+ * Only for GUEST TR format.
+ */
+static int
+__is_tr_overlap(thash_data_t *trp, u64 rid, u64 sva, u64 eva)
+{
+    uint64_t sa1, ea1;
+
+    if (!trp->p || trp->rid != rid ) {
         return 0;
-}
-
-/*
- * Only for GUEST TR format.
- */
-static int
-__is_tr_overlap(thash_cb_t *hcb,thash_data_t *entry,int rid, char cl, u64 sva, 
u64 eva)
-{
-    uint64_t size, sa1, ea1;
-
-//    if ( entry->invalid || entry->rid != rid || (entry->cl != cl ) ) {
-    if ( entry->invalid || entry->rid != rid ) {
-        return 0;
-    }
-    size = PSIZE(entry->ps);
-    sa1 = entry->vadr;
-    ea1 = sa1 + size -1;
+    }
+    sa1 = trp->vadr;
+    ea1 = sa1 + PSIZE(trp->ps) -1;
     eva -= 1;
-    if(sa1&(size-1))
-        while(1);
     if ( (sva>ea1) || (sa1>eva) )
         return 0;
     else
         return 1;
 
 }
-
-static void __rem_tr (thash_cb_t *hcb, thash_data_t *tr)
-{
-/*
-    if ( hcb->remove_notifier ) {
-        (hcb->remove_notifier)(hcb,tr);
-    }
-*/
-    tr->invalid = 1;
-}
-
-static inline void __set_tr (thash_data_t *tr, thash_data_t *data, int idx)
-{
-    *tr = *data;
-    tr->tr_idx = idx;
-}
-
-
-static void __init_tr(thash_cb_t *hcb)
-{
-    int i;
-    thash_data_t *tr;
-
-    for ( i=0, tr = &ITR(hcb,0); i<NITRS; i++ ) {
-        tr[i].invalid = 1;
-    }
-    for ( i=0, tr = &DTR(hcb,0); i<NDTRS; i++ ) {
-        tr[i].invalid = 1;
-    }
-}
-
-/*
- * Replace TR entry.
- */
-static void rep_tr(thash_cb_t *hcb,thash_data_t *insert, int idx)
-{
-    thash_data_t *tr;
-
-    if ( insert->cl == ISIDE_TLB ) {
-        tr = &ITR(hcb,idx);
-    }
-    else {
-        tr = &DTR(hcb,idx);
-    }
-    if ( !INVALID_TR(tr) ) {
-        __rem_tr(hcb, tr);
-    }
-    __set_tr (tr, insert, idx);
-}
-
-/*
- * remove TR entry.
- */
-/*
-static void rem_tr(thash_cb_t *hcb,CACHE_LINE_TYPE cl, int idx)
-{
-    thash_data_t *tr;
-
-    if ( cl == ISIDE_TLB ) {
-        tr = &ITR(hcb,idx);
-    }
-    else {
-        tr = &DTR(hcb,idx);
-    }
-    if ( !INVALID_TR(tr) ) {
-        __rem_tr(hcb, tr);
-    }
-}
- */
-/*
- * Delete an thash entry in collision chain.
- *  prev: the previous entry.
- *  rem: the removed entry.
- */
-/*
-static void __rem_chain(thash_cb_t *hcb, thash_data_t *prev, thash_data_t *rem)
-{
-    //prev->next = rem->next;
-    if ( hcb->remove_notifier ) {
-         (hcb->remove_notifier)(hcb,rem);
-    }
-    cch_free (hcb, rem);
-}
- */
 
 /*
  * Delete an thash entry leading collision chain.
@@ -212,69 +117,35 @@
     }
 }
 
-thash_data_t *__vtr_lookup(thash_cb_t *hcb,
-            u64 rid, u64 va,
-            CACHE_LINE_TYPE cl)
-{
-    thash_data_t    *tr;
-    int   num,i;
-
-    if ( cl == ISIDE_TLB ) {
-        tr = &ITR(hcb,0);
-        num = NITRS;
+thash_data_t *__vtr_lookup(VCPU *vcpu, u64 va, int is_data)
+{
+
+    thash_data_t  *trp;
+    int  i;
+    u64 rid;
+    vcpu_get_rr(vcpu, va, &rid);
+    rid = rid&RR_RID_MASK;;
+    if (is_data) {
+        if (vcpu_quick_region_check(vcpu->arch.dtr_regions,va)) {
+            for (trp =(thash_data_t *) vcpu->arch.dtrs,i=0; i<NDTRS; i++, 
trp++) {
+                if (__is_tr_translated(trp, rid, va)) {
+                    return trp;
+                }
+            }
+        }
     }
     else {
-        tr = &DTR(hcb,0);
-        num = NDTRS;
-    }
-    for ( i=0; i<num; i++ ) {
-        if ( !INVALID_TR(&tr[i]) &&
-            __is_tr_translated(&tr[i], rid, va, cl) )
-            return &tr[i];
+        if (vcpu_quick_region_check(vcpu->arch.itr_regions,va)) {
+            for (trp =(thash_data_t *) vcpu->arch.itrs,i=0; i<NITRS; i++, 
trp++) {
+                if (__is_tr_translated(trp, rid, va)) {
+                    return trp;
+                }
+            }
+        }
     }
     return NULL;
 }
 
-
-/*
- * Find overlap VHPT entry within current collision chain
- * base on internal priv info.
- */
-/*
-static inline thash_data_t* _vhpt_next_overlap_in_chain(thash_cb_t *hcb)
-{
-    thash_data_t    *cch;
-    thash_internal_t *priv = &hcb->priv;
-
-
-    for (cch=priv->cur_cch; cch; cch = cch->next) {
-        if ( priv->tag == cch->etag  ) {
-            return cch;
-        }
-    }
-    return NULL;
-}
-*/
-/*
- * Find overlap TLB/VHPT entry within current collision chain
- * base on internal priv info.
- */
-/*
-static thash_data_t *_vtlb_next_overlap_in_chain(thash_cb_t *hcb)
-{
-    thash_data_t    *cch;
-    thash_internal_t *priv = &hcb->priv;
-
-    // Find overlap TLB entry
-    for (cch=priv->cur_cch; cch; cch = cch->next) {
-        if ( ( cch->tc ? priv->s_sect.tc : priv->s_sect.tr )  &&
-            __is_translated( cch, priv->rid, priv->_curva, priv->cl)) {
-            return cch;
-        }
-    }
-    return NULL;
-}
- */
 
 /*
  * Get the machine format of VHPT entry.
@@ -292,24 +163,16 @@
  *  0/1: means successful or fail.
  *
  */
-int __tlb_to_vhpt(thash_cb_t *hcb,
-            thash_data_t *tlb, u64 va,
-            thash_data_t *vhpt)
+int __tlb_to_vhpt(thash_cb_t *hcb, thash_data_t *vhpt, u64 va)
 {
     u64 padr,pte;
-//    ia64_rr vrr;
     ASSERT ( hcb->ht == THASH_VHPT );
-//    vrr = (hcb->get_rr_fn)(hcb->vcpu,va);
-    padr = tlb->ppn >>(tlb->ps-ARCH_PAGE_SHIFT)<<tlb->ps;
-    padr += va&((1UL<<tlb->ps)-1);
+    padr = vhpt->ppn >>(vhpt->ps-ARCH_PAGE_SHIFT)<<vhpt->ps;
+    padr += va&((1UL<<vhpt->ps)-1);
     pte=lookup_domain_mpa(current->domain,padr);
     if((pte>>56))
         return 0;
-    // TODO with machine discontinuous address space issue.
     vhpt->etag = ia64_ttag(va);
-    //vhpt->ti = 0;
-    vhpt->itir = tlb->itir & ~ITIR_RV_MASK;
-    vhpt->page_flags = tlb->page_flags & ~PAGE_FLAGS_RV_MASK;
     vhpt->ps = PAGE_SHIFT;
     vhpt->ppn = 
(pte&((1UL<<IA64_MAX_PHYS_BITS)-(1UL<<PAGE_SHIFT)))>>ARCH_PAGE_SHIFT;
     vhpt->next = 0;
@@ -331,17 +194,20 @@
 
 /*  vhpt only has entries with PAGE_SIZE page size */
 
-void thash_vhpt_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va)
+void thash_vhpt_insert(thash_cb_t *hcb, u64 pte, u64 itir, u64 ifa)
 {
     thash_data_t   vhpt_entry, *hash_table, *cch;
+    vhpt_entry.page_flags = pte & ~PAGE_FLAGS_RV_MASK;
+    vhpt_entry.itir=itir;
+
 //    ia64_rr vrr;
 
-    if ( !__tlb_to_vhpt(hcb, entry, va, &vhpt_entry) ) {
+    if ( !__tlb_to_vhpt(hcb, &vhpt_entry, ifa) ) {
         return;
     //panic("Can't convert to machine VHPT entry\n");
     }
 
-    hash_table = (thash_data_t *)ia64_thash(va);
+    hash_table = (thash_data_t *)ia64_thash(ifa);
     if( INVALID_VHPT(hash_table) ) {
         *hash_table = vhpt_entry;
         hash_table->next = 0;
@@ -358,6 +224,7 @@
         }
         cch = cch->next;
     }
+
     if(hash_table->len>=MAX_CCN_DEPTH){
        thash_remove_cch(hcb, hash_table);
        cch = cch_alloc(hcb);
@@ -367,9 +234,9 @@
         hash_table->next = cch;
        return;
     }
-       
+
     // TODO: Add collision chain length limitation.
-     cch = __alloc_chain(hcb,entry);
+     cch = __alloc_chain(hcb);
      if(cch == NULL){
            *hash_table = vhpt_entry;
             hash_table->next = 0;
@@ -377,10 +244,8 @@
             *cch = *hash_table;
             *hash_table = vhpt_entry;
             hash_table->next = cch;
-           hash_table->len = cch->len + 1;
-           cch->len = 0;       
-//            if(hash_table->tag==hash_table->next->tag)
-//                while(1);
+           hash_table->len = cch->len + 1;
+           cch->len = 0;
 
     }
     return /*hash_table*/;
@@ -414,7 +279,7 @@
     thash_data_t *hash_table, *prev, *next;
     u64 start, end, size, tag, rid;
     ia64_rr vrr;
-    vrr=vmx_vcpu_rr(current, va);
+    vcpu_get_rr(current, va, &vrr.rrval);
     rid = vrr.rid;
     size = PSIZE(ps);
     start = va & (-size);
@@ -480,36 +345,6 @@
     }
     machine_tlb_purge(va, ps);
 }
-/*
- * Insert an entry to hash table. 
- *    NOTES:
- *  1: TLB entry may be TR, TC or Foreign Map. For TR entry,
- *     itr[]/dtr[] need to be updated too.
- *  2: Inserting to collision chain may trigger recycling if 
- *     the buffer for collision chain is empty.
- *  3: The new entry is inserted at the next of hash table.
- *     (I.e. head of the collision chain)
- *  4: The buffer holding the entry is allocated internally
- *     from cch_buf or just in the hash table.
- *  5: Return the entry in hash table or collision chain.
- *  6: Input parameter, entry, should be in TLB format.
- *      I.e. Has va, rid, ps...
- *  7: This API is invoked by emulating ITC/ITR and tlb_miss.
- *
- */
-
-void thash_tr_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va, int idx)
-{
-    if ( hcb->ht != THASH_TLB || entry->tc ) {
-        panic("wrong parameter\n");
-    }
-    entry->vadr = PAGEALIGN(entry->vadr,entry->ps);
-    entry->ppn = PAGEALIGN(entry->ppn, entry->ps-12);
-    rep_tr(hcb, entry, idx);
-//    thash_vhpt_insert(hcb->ts->vhpt, entry, va);
-    return ;
-}
-
 
 /*
  * Recycle all collisions chain in VTLB or VHPT.
@@ -525,30 +360,13 @@
         thash_remove_cch(hcb,hash_table);
     }
 }
-/*
-thash_data_t *vtlb_alloc_chain(thash_cb_t *hcb,thash_data_t *entry)
+
+thash_data_t *__alloc_chain(thash_cb_t *hcb)
 {
     thash_data_t *cch;
 
     cch = cch_alloc(hcb);
     if(cch == NULL){
-        thash_recycle_cch(hcb);
-        cch = cch_alloc(hcb);
-    }
-    return cch;
-}
-*/
-
-thash_data_t *__alloc_chain(thash_cb_t *hcb,thash_data_t *entry)
-{
-    thash_data_t *cch;
-
-    cch = cch_alloc(hcb);
-    if(cch == NULL){
-        // recycle
-//        if ( hcb->recycle_notifier ) {
-//                hcb->recycle_notifier(hcb,(u64)entry);
-//        }
         thash_recycle_cch(hcb);
         cch = cch_alloc(hcb);
     }
@@ -564,474 +382,117 @@
  *  3: The caller need to make sure the new entry will not overlap
  *     with any existed entry.
  */
-void vtlb_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va)
+void vtlb_insert(thash_cb_t *hcb, u64 pte, u64 itir, u64 va)
 {
     thash_data_t    *hash_table, *cch;
     /* int flag; */
     ia64_rr vrr;
     /* u64 gppn, ppns, ppne; */
-    u64 tag;
-    vrr=vmx_vcpu_rr(current, va);
-    if (vrr.ps != entry->ps) {
+    u64 tag, ps;
+    ps = itir_ps(itir);
+    vcpu_get_rr(current, va, &vrr.rrval);
+    if (vrr.ps != ps) {
 //        machine_tlb_insert(hcb->vcpu, entry);
        panic("not preferred ps with va: 0x%lx\n", va);
        return;
     }
-    entry->vadr = PAGEALIGN(entry->vadr,entry->ps);
-    entry->ppn = PAGEALIGN(entry->ppn, entry->ps-12);
     hash_table = vsa_thash(hcb->pta, va, vrr.rrval, &tag);
-    entry->etag = tag;
     if( INVALID_TLB(hash_table) ) {
-        *hash_table = *entry;
+        hash_table->page_flags = pte;
+        hash_table->itir=itir;
+        hash_table->etag=tag;
         hash_table->next = 0;
     }
     else if (hash_table->len>=MAX_CCN_DEPTH){
         thash_remove_cch(hcb, hash_table);
         cch = cch_alloc(hcb);
         *cch = *hash_table;
-        *hash_table = *entry;
+        hash_table->page_flags = pte;
+        hash_table->itir=itir;
+        hash_table->etag=tag;
         hash_table->len = 1;
         hash_table->next = cch;
     }
+
     else {
         // TODO: Add collision chain length limitation.
-        cch = __alloc_chain(hcb,entry);
+        cch = __alloc_chain(hcb);
         if(cch == NULL){
-            *hash_table = *entry;
+            hash_table->page_flags = pte;
+            hash_table->itir=itir;
+            hash_table->etag=tag;
             hash_table->next = 0;
         }else{
             *cch = *hash_table;
-            *hash_table = *entry;
+            hash_table->page_flags = pte;
+            hash_table->itir=itir;
+            hash_table->etag=tag;
             hash_table->next = cch;
             hash_table->len = cch->len + 1;
             cch->len = 0;
         }
     }
-#if 0
-    if(hcb->vcpu->domain->domain_id==0){
-       thash_insert(hcb->ts->vhpt, entry, va);
-        return;
-    }
-#endif
-/*
-    flag = 1;
-    gppn = 
(POFFSET(va,entry->ps)|PAGEALIGN((entry->ppn<<12),entry->ps))>>PAGE_SHIFT;
-    ppns = PAGEALIGN((entry->ppn<<12),entry->ps);
-    ppne = ppns + PSIZE(entry->ps);
-    if(((ppns<=0xa0000)&&(ppne>0xa0000))||((ppne>0xc0000)&&(ppns<=0xc0000)))
-        flag = 0;
-    if((__gpfn_is_mem(hcb->vcpu->domain, gppn)&&flag))
-       thash_insert(hcb->ts->vhpt, entry, va);
-*/
     return ;
 }
 
 
-/*
-void thash_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va)
-{
-    thash_data_t    *hash_table;
-    ia64_rr vrr;
-    
-    vrr = vmx_vcpu_rr(hcb->vcpu,entry->vadr);
-    if ( entry->ps != vrr.ps && entry->tc ) {
-        panic("Not support for multiple page size now\n");
-    }
-    entry->vadr = PAGEALIGN(entry->vadr,entry->ps);
-    entry->ppn = PAGEALIGN(entry->ppn, entry->ps-12);
-    (hcb->ins_hash)(hcb, entry, va);
-    
-}
-*/
-/*
-static void rem_thash(thash_cb_t *hcb, thash_data_t *entry)
-{
-    thash_data_t    *hash_table, *p, *q;
-    thash_internal_t *priv = &hcb->priv;
-    int idx;
-
-    hash_table = priv->hash_base;
-    if ( hash_table == entry ) {
-//        if ( PURGABLE_ENTRY(hcb, entry) ) {
-            __rem_hash_head (hcb, entry);
-//        }
-        return ;
-    }
-    // remove from collision chain
-    p = hash_table;
-    for ( q=p->next; q; q = p->next ) {
-        if ( q == entry ){
-//            if ( PURGABLE_ENTRY(hcb,q ) ) {
-                p->next = q->next;
-                __rem_chain(hcb, entry);
-                hash_table->len--;
-//            }
-            return ;
-        }
-        p = q;
-    }
-    panic("Entry not existed or bad sequence\n");
-}
-*/
-/*
-static void rem_vtlb(thash_cb_t *hcb, thash_data_t *entry)
-{
-    thash_data_t    *hash_table, *p, *q;
-    thash_internal_t *priv = &hcb->priv;
-    int idx;
-    
-    if ( !entry->tc ) {
-        return rem_tr(hcb, entry->cl, entry->tr_idx);
-    }
-    rem_thash(hcb, entry);
-}    
-*/
-int   cch_depth=0;
-/*
- * Purge the collision chain starting from cch.
- * NOTE:
- *     For those UN-Purgable entries(FM), this function will return
- * the head of left collision chain.
- */
-/*
-static thash_data_t *thash_rem_cch(thash_cb_t *hcb, thash_data_t *cch)
-{
-    thash_data_t *next;
-
-//    if ( ++cch_depth > MAX_CCH_LENGTH ) {
-//        printf ("cch length > MAX_CCH_LENGTH, exceed the expected length\n");
-//        while(1);
-//   }
-    if ( cch -> next ) {
-        next = thash_rem_cch(hcb, cch->next);
+int vtr_find_overlap(VCPU *vcpu, u64 va, u64 ps, int is_data)
+{
+    thash_data_t  *trp;
+    int  i;
+    u64 end, rid;
+    vcpu_get_rr(vcpu, va, &rid);
+    rid = rid&RR_RID_MASK;;
+    end = va + PSIZE(ps);
+    if (is_data) {
+        if (vcpu_quick_region_check(vcpu->arch.dtr_regions,va)) {
+            for (trp =(thash_data_t *) vcpu->arch.dtrs,i=0; i<NDTRS; i++, 
trp++) {
+                if (__is_tr_overlap(trp, rid, va, end )) {
+                    return i;
+                }
+            }
+        }
     }
     else {
-        next = NULL;
-    }
-    if ( PURGABLE_ENTRY(hcb, cch) ) {
-        __rem_chain(hcb, cch);
-        return next;
-    }
-    else {
-        cch->next = next;
-        return cch;
-    }
-}
- */
-
-/*
- * Purge one hash line (include the entry in hash table).
- * Can only be called by thash_purge_all.
- * Input:
- *  hash: The head of collision chain (hash table)
- *
- */
-/*
-static void thash_rem_line(thash_cb_t *hcb, thash_data_t *hash)
-{
-    if ( INVALID_ENTRY(hcb, hash) ) return;
-
-    if ( hash->next ) {
-        cch_depth = 0;
-        hash->next = thash_rem_cch(hcb, hash->next);
-    }
-    // Then hash table itself.
-    if ( PURGABLE_ENTRY(hcb, hash) ) {
-        __rem_hash_head(hcb, hash);
-    }
-}
- */
-
-/*
- * Find an overlap entry in hash table and its collision chain.
- * Refer to SDM2 4.1.1.4 for overlap definition.
- *    PARAS:
- *  1: in: TLB format entry, rid:ps must be same with vrr[].
- *         va & ps identify the address space for overlap lookup
- *  2: section can be combination of TR, TC and FM. (THASH_SECTION_XX)
- *  3: cl means I side or D side.
- *    RETURNS:
- *  NULL to indicate the end of findings.
- *    NOTES:
- *
- */
-
-/*
-thash_data_t *thash_find_overlap(thash_cb_t *hcb,
-            thash_data_t *in, search_section_t s_sect)
-{
-    return (hcb->find_overlap)(hcb, in->vadr,
-            PSIZE(in->ps), in->rid, in->cl, s_sect);
-}
-*/
-
-/*
-static thash_data_t *vtlb_find_overlap(thash_cb_t *hcb,
-        u64 va, u64 size, int rid, char cl, search_section_t s_sect)
-{
-    thash_data_t    *hash_table;
-    thash_internal_t *priv = &hcb->priv;
-    u64     tag;
-    ia64_rr vrr;
-
-    priv->_curva = va & ~(size-1);
-    priv->_eva = priv->_curva + size;
-    priv->rid = rid;
-    vrr = vmx_vcpu_rr(hcb->vcpu,va);
-    priv->ps = vrr.ps;
-    hash_table = vsa_thash(hcb->pta, priv->_curva, vrr.rrval, &tag);
-    priv->s_sect = s_sect;
-    priv->cl = cl;
-    priv->_tr_idx = 0;
-    priv->hash_base = hash_table;
-    priv->cur_cch = hash_table;
-    return (hcb->next_overlap)(hcb);
-}
-*/
-
-/*
-static thash_data_t *vhpt_find_overlap(thash_cb_t *hcb,
-        u64 va, u64 size, int rid, char cl, search_section_t s_sect)
-{
-    thash_data_t    *hash_table;
-    thash_internal_t *priv = &hcb->priv;
-    u64     tag;
-    ia64_rr vrr;
-
-    priv->_curva = va & ~(size-1);
-    priv->_eva = priv->_curva + size;
-    priv->rid = rid;
-    vrr = vmx_vcpu_rr(hcb->vcpu,va);
-    priv->ps = vrr.ps;
-    hash_table = ia64_thash(priv->_curva);
-    tag = ia64_ttag(priv->_curva);
-    priv->tag = tag;
-    priv->hash_base = hash_table;
-    priv->cur_cch = hash_table;
-    return (hcb->next_overlap)(hcb);
-}
-*/
-
-
-thash_data_t *vtr_find_overlap(thash_cb_t *hcb, thash_data_t *data, char cl)
-{
-    thash_data_t    *tr;
-    int  i,num;
-    u64 end;
-
-    if (cl == ISIDE_TLB ) {
-        num = NITRS;
-        tr = &ITR(hcb,0);
-    }
-    else {
-        num = NDTRS;
-        tr = &DTR(hcb,0);
-    }
-    end=data->vadr + PSIZE(data->ps);
-    for (i=0; i<num; i++ ) {
-        if ( __is_tr_overlap(hcb, &tr[i], data->rid, cl, data->vadr, end )) {
-            return &tr[i];
-        }
-    }
-    return NULL;
-}
-
-
-/*
-static thash_data_t *vtr_find_next_overlap(thash_cb_t *hcb)
-{
-    thash_data_t    *tr;
-    thash_internal_t *priv = &hcb->priv;
-    int   num;
-
-    if ( priv->cl == ISIDE_TLB ) {
-        num = NITRS;
-        tr = &ITR(hcb,0);
-    }
-    else {
-        num = NDTRS;
-        tr = &DTR(hcb,0);
-    }
-    for (; priv->_tr_idx < num; priv->_tr_idx ++ ) {
-        if ( __is_tr_overlap(hcb, &tr[priv->_tr_idx],
-                priv->rid, priv->cl,
-                priv->_curva, priv->_eva) ) {
-            return &tr[priv->_tr_idx++];
-        }
-    }
-    return NULL;
-}
-*/
-
-/*
- * Similar with vtlb_next_overlap but find next entry.
- *    NOTES:
- *  Intermediate position information is stored in hcb->priv.
- */
-/*
-static thash_data_t *vtlb_next_overlap(thash_cb_t *hcb)
-{
-    thash_data_t    *ovl;
-    thash_internal_t *priv = &hcb->priv;
-    u64 addr,rr_psize,tag;
-    ia64_rr vrr;
-
-    if ( priv->s_sect.tr ) {
-        ovl = vtr_find_next_overlap (hcb);
-        if ( ovl ) return ovl;
-        priv->s_sect.tr = 0;
-    }
-    if ( priv->s_sect.v == 0 ) return NULL;
-    vrr = vmx_vcpu_rr(hcb->vcpu,priv->_curva);
-    rr_psize = PSIZE(vrr.ps);
-
-    while ( priv->_curva < priv->_eva ) {
-        if ( !INVALID_ENTRY(hcb, priv->hash_base) ) {
-            ovl = _vtlb_next_overlap_in_chain(hcb);
-            if ( ovl ) {
-                priv->cur_cch = ovl->next;
-                return ovl;
+        if (vcpu_quick_region_check(vcpu->arch.itr_regions,va)) {
+            for (trp =(thash_data_t *) vcpu->arch.itrs,i=0; i<NITRS; i++, 
trp++) {
+                if (__is_tr_overlap(trp, rid, va, end )) {
+                    return i;
+                }
             }
         }
-        priv->_curva += rr_psize;
-        priv->hash_base = vsa_thash( hcb->pta, priv->_curva, vrr.rrval, &tag);
-        priv->cur_cch = priv->hash_base;
-    }
-    return NULL;
-}
- */
-
-
-/*
-static thash_data_t *vhpt_next_overlap(thash_cb_t *hcb)
-{
-    thash_data_t    *ovl;
-    thash_internal_t *priv = &hcb->priv;
-    u64 addr,rr_psize;
-    ia64_rr vrr;
-
-    vrr = vmx_vcpu_rr(hcb->vcpu,priv->_curva);
-    rr_psize = PSIZE(vrr.ps);
-
-    while ( priv->_curva < priv->_eva ) {
-        if ( !INVALID_ENTRY(hcb, priv->hash_base) ) {
-            ovl = _vhpt_next_overlap_in_chain(hcb);
-            if ( ovl ) {
-                priv->cur_cch = ovl->next;
-                return ovl;
-            }
-        }
-        priv->_curva += rr_psize;
-        priv->hash_base = ia64_thash(priv->_curva);
-        priv->tag = ia64_ttag(priv->_curva);
-        priv->cur_cch = priv->hash_base;
-    }
-    return NULL;
-}
-*/
-
-/*
- * Find and purge overlap entries in hash table and its collision chain.
- *    PARAS:
- *  1: in: TLB format entry, rid:ps must be same with vrr[].
- *         rid, va & ps identify the address space for purge
- *  2: section can be combination of TR, TC and FM. (thash_SECTION_XX)
- *  3: cl means I side or D side.
- *    NOTES:
- *
- */
-void thash_purge_entries(thash_cb_t *hcb,
-            thash_data_t *in, search_section_t p_sect)
-{
-    return thash_purge_entries_ex(hcb, in->rid, in->vadr,
-            in->ps, p_sect, in->cl);
-}
-
-void thash_purge_entries_ex(thash_cb_t *hcb,
-            u64 rid, u64 va, u64 ps,
-            search_section_t p_sect,
-            CACHE_LINE_TYPE cl)
-{
-/*
-    thash_data_t    *ovl;
-
-    ovl = (hcb->find_overlap)(hcb, va, PSIZE(ps), rid, cl, p_sect);
-    while ( ovl != NULL ) {
-        (hcb->rem_hash)(hcb, ovl);
-        ovl = (hcb->next_overlap)(hcb);
-    };
- */
+    }
+    return -1;
+}
+
+/*
+ * Purge entries in VTLB and VHPT
+ */
+void thash_purge_entries(thash_cb_t *hcb, u64 va, u64 ps)
+{
     vtlb_purge(hcb, va, ps);
-    vhpt_purge(hcb->ts->vhpt, va, ps);
-}
+    vhpt_purge(hcb->vhpt, va, ps);
+}
+
 
 /*
  * Purge overlap TCs and then insert the new entry to emulate itc ops.
  *    Notes: Only TC entry can purge and insert.
  */
-void thash_purge_and_insert(thash_cb_t *hcb, thash_data_t *in, u64 va)
-{
-    /* thash_data_t    *ovl; */
-    search_section_t sections;
-
-#ifdef   XEN_DEBUGGER
-    vrr = vmx_vcpu_rr(hcb->vcpu,in->vadr);
-       if ( in->ps != vrr.ps || hcb->ht != THASH_TLB || !in->tc ) {
-               panic ("Oops, wrong call for purge_and_insert\n");
-               return;
-       }
-#endif
-    in->vadr = PAGEALIGN(in->vadr,in->ps);
-    in->ppn = PAGEALIGN(in->ppn, in->ps-12);
-    sections.tr = 0;
-    sections.tc = 1;
-/*
-    ovl = (hcb->find_overlap)(hcb, in->vadr, PSIZE(in->ps),
-                                in->rid, in->cl, sections);
-    if(ovl)
-        (hcb->rem_hash)(hcb, ovl);
- */
-    vtlb_purge(hcb, va, in->ps);
-    vhpt_purge(hcb->ts->vhpt, va, in->ps);
-#ifdef   XEN_DEBUGGER
-    ovl = (hcb->next_overlap)(hcb);
-    if ( ovl ) {
-               panic ("Oops, 2+ overlaps for purge_and_insert\n");
-               return;
-    }
-#endif
-    if(in->ps!=PAGE_SHIFT)
-        vtlb_insert(hcb, in, va);
-    thash_vhpt_insert(hcb->ts->vhpt, in, va);
-}
-/*
- * Purge one hash line (include the entry in hash table).
- * Can only be called by thash_purge_all.
- * Input:
- *  hash: The head of collision chain (hash table)
- *
- */
-/*
-static void thash_purge_line(thash_cb_t *hcb, thash_data_t *hash)
-{
-    if ( INVALID_ENTRY(hcb, hash) ) return;
-    thash_data_t *prev, *next;
-    next=hash->next;
-    while ( next ) {
-        prev=next;
-        next=next->next;
-        cch_free(hcb, prev);
-    }
-    // Then hash table itself.
-    INVALIDATE_HASH(hcb, hash);
-}
-*/
-
-
-
-
-
-
+void thash_purge_and_insert(thash_cb_t *hcb, u64 pte, u64 itir, u64 ifa)
+{
+    u64 ps, va;
+    ps = itir_ps(itir);
+    va = PAGEALIGN(ifa,ps);
+    vtlb_purge(hcb, va, ps);
+    vhpt_purge(hcb->vhpt, va, ps);
+    if((ps!=PAGE_SHIFT)||(pte&VTLB_PTE_IO))
+        vtlb_insert(hcb, pte, itir, va);
+    if(!(pte&VTLB_PTE_IO)){
+        va = PAGEALIGN(ifa,PAGE_SHIFT);
+        thash_vhpt_insert(hcb->vhpt, pte, itir, va);
+    }
+}
 
 
 
@@ -1064,27 +525,12 @@
     }
     cch_mem_init (hcb);
 
-    vhpt = hcb->ts->vhpt;
+    vhpt = hcb->vhpt;
     hash_table = (thash_data_t*)((u64)vhpt->hash + vhpt->hash_sz);
     for (--hash_table;(u64)hash_table >= (u64)vhpt->hash;hash_table--) {
         INVALIDATE_VHPT_HEADER(hash_table);
     }
     cch_mem_init (vhpt);
-    
-/*
-    entry = &hcb->ts->itr[0];
-    for(i=0; i< (NITRS+NDTRS); i++){
-        if(!INVALID_TLB(entry)){
-            start=entry->vadr & (-PSIZE(entry->ps));
-            end = start + PSIZE(entry->ps);
-            while(start<end){
-                thash_vhpt_insert(vhpt, entry, start);
-                start += PAGE_SIZE;
-            }
-        }
-        entry++;
-    }
-*/
     local_flush_tlb_all();
 }
 
@@ -1096,100 +542,32 @@
  * INPUT:
  *  in: TLB format for both VHPT & TLB.
  */
-thash_data_t *vtlb_lookup(thash_cb_t *hcb, 
-            thash_data_t *in)
-{
-    return vtlb_lookup_ex(hcb, in->rid, in->vadr, in->cl);
-}
-
-thash_data_t *vtlb_lookup_ex(thash_cb_t *hcb, 
-            u64 rid, u64 va,
-            CACHE_LINE_TYPE cl)
+
+thash_data_t *vtlb_lookup(thash_cb_t *hcb, u64 va,int is_data)
 {
     thash_data_t    *hash_table, *cch;
     u64     tag;
     ia64_rr vrr;
-   
+
     ASSERT ( hcb->ht == THASH_TLB );
-    
-    cch = __vtr_lookup(hcb, rid, va, cl);;
+
+    cch = __vtr_lookup(hcb->vcpu, va, is_data);;
     if ( cch ) return cch;
 
-    vrr = vmx_vcpu_rr(hcb->vcpu,va);
+    vcpu_get_rr(hcb->vcpu,va,&vrr.rrval);
     hash_table = vsa_thash( hcb->pta, va, vrr.rrval, &tag);
 
     if ( INVALID_ENTRY(hcb, hash_table ) )
         return NULL;
 
-        
+
     for (cch=hash_table; cch; cch = cch->next) {
-//        if ( __is_translated(cch, rid, va, cl) )
         if(cch->etag == tag)
             return cch;
     }
     return NULL;
 }
 
-/*
- * Lock/Unlock TC if found.
- *     NOTES: Only the page in prefered size can be handled.
- *   return:
- *          1: failure
- *          0: success
- */
-/*
-int thash_lock_tc(thash_cb_t *hcb, u64 va, u64 size, int rid, char cl, int 
lock)
-{
-       thash_data_t    *ovl;
-       search_section_t        sections;
-
-    sections.tr = 1;
-    sections.tc = 1;
-       ovl = (hcb->find_overlap)(hcb, va, size, rid, cl, sections);
-       if ( ovl ) {
-               if ( !ovl->tc ) {
-//                     panic("Oops, TR for lock\n");
-                       return 0;
-               }
-               else if ( lock ) {
-                       if ( ovl->locked ) {
-                               DPRINTK("Oops, already locked entry\n");
-                       }
-                       ovl->locked = 1;
-               }
-               else if ( !lock ) {
-                       if ( !ovl->locked ) {
-                               DPRINTK("Oops, already unlocked entry\n");
-                       }
-                       ovl->locked = 0;
-               }
-               return 0;
-       }
-       return 1;
-}
-*/
-
-/*
- * Notifier when TLB is deleted from hash table and its collision chain.
- * NOTES:
- *  The typical situation is that TLB remove needs to inform
- * VHPT to remove too.
- * PARAS:
- *  1: hcb is TLB object.
- *  2: The format of entry is always in TLB.
- *
- */
-//void tlb_remove_notifier(thash_cb_t *hcb, thash_data_t *entry)
-//{
-//    vhpt_purge(hcb->ts->vhpt,entry->vadr,entry->ps);
-//    thash_cb_t  *vhpt;
-    
-//    search_section_t    s_sect;
-    
-//    s_sect.v = 0;
-//    thash_purge_entries(hcb->ts->vhpt, entry, s_sect);
-//    machine_tlb_purge(entry->vadr, entry->ps);
-//}
 
 /*
  * Initialize internal control data before service.
@@ -1206,28 +584,15 @@
     hcb->pta.size = sz;
 //    hcb->get_rr_fn = vmmu_get_rr;
     ASSERT ( hcb->hash_sz % sizeof(thash_data_t) == 0 );
-    if ( hcb->ht == THASH_TLB ) {
-//        hcb->remove_notifier =  NULL;        //tlb_remove_notifier;
-//        hcb->find_overlap = vtlb_find_overlap;
-//        hcb->next_overlap = vtlb_next_overlap;
-//        hcb->rem_hash = rem_vtlb;
-//        hcb->ins_hash = vtlb_insert;
-        __init_tr(hcb);
-    }
-    else {
-//        hcb->remove_notifier =  NULL;
-//        hcb->find_overlap = vhpt_find_overlap;
-//        hcb->next_overlap = vhpt_next_overlap;
-//        hcb->rem_hash = rem_thash;
-//        hcb->ins_hash = thash_vhpt_insert;
-    }
     hash_table = (thash_data_t*)((u64)hcb->hash + hcb->hash_sz);
 
     for (--hash_table;(u64)hash_table >= (u64)hcb->hash;hash_table--) {
         INVALIDATE_HASH_HEADER(hcb,hash_table);
     }
 }
+
 #ifdef  VTLB_DEBUG
+/*
 static  u64 cch_length_statistics[MAX_CCH_LENGTH+1];
 u64  sanity_check=0;
 u64 vtlb_chain_sanity(thash_cb_t *vtlb, thash_cb_t *vhpt, thash_data_t *hash)
@@ -1264,7 +629,7 @@
     thash_data_t  *hash, *cch;
     thash_data_t    *ovl;
     search_section_t s_sect;
-    thash_cb_t *vhpt = vtlb->ts->vhpt;
+    thash_cb_t *vhpt = vtlb->vhpt;
     u64   invalid_ratio;
  
     if ( sanity_check == 0 ) return;
@@ -1403,4 +768,5 @@
     }
     printf("End of vTLB dump\n");
 }
+*/
 #endif
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/dom_fw.c
--- a/xen/arch/ia64/xen/dom_fw.c        Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/dom_fw.c        Mon Mar 20 08:56:54 2006
@@ -47,7 +47,7 @@
 }
 
 // builds a hypercall bundle at domain physical address
-void dom_efi_hypercall_patch(struct domain *d, unsigned long paddr, unsigned 
long hypercall)
+static void dom_efi_hypercall_patch(struct domain *d, unsigned long paddr, 
unsigned long hypercall)
 {
        unsigned long *imva;
 
@@ -96,122 +96,13 @@
 # define NUM_MEM_DESCS 5
 
 
-#define SECS_PER_HOUR   (60 * 60)
-#define SECS_PER_DAY    (SECS_PER_HOUR * 24)
-
-/* Compute the `struct tm' representation of *T,
-   offset OFFSET seconds east of UTC,
-   and store year, yday, mon, mday, wday, hour, min, sec into *TP.
-   Return nonzero if successful.  */
-int
-offtime (unsigned long t, efi_time_t *tp)
-{
-       const unsigned short int __mon_yday[2][13] =
-       {
-               /* Normal years.  */
-               { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
-               /* Leap years.  */
-               { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
-       };
-       long int days, rem, y;
-       const unsigned short int *ip;
-
-       days = t / SECS_PER_DAY;
-       rem = t % SECS_PER_DAY;
-       while (rem < 0) {
-               rem += SECS_PER_DAY;
-               --days;
-       }
-       while (rem >= SECS_PER_DAY) {
-               rem -= SECS_PER_DAY;
-               ++days;
-       }
-       tp->hour = rem / SECS_PER_HOUR;
-       rem %= SECS_PER_HOUR;
-       tp->minute = rem / 60;
-       tp->second = rem % 60;
-       /* January 1, 1970 was a Thursday.  */
-       y = 1970;
-
-#      define DIV(a, b) ((a) / (b) - ((a) % (b) < 0))
-#      define LEAPS_THRU_END_OF(y) (DIV (y, 4) - DIV (y, 100) + DIV (y, 400))
-#      define __isleap(year) \
-         ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
-
-       while (days < 0 || days >= (__isleap (y) ? 366 : 365)) {
-               /* Guess a corrected year, assuming 365 days per year.  */
-               long int yg = y + days / 365 - (days % 365 < 0);
-
-               /* Adjust DAYS and Y to match the guessed year.  */
-               days -= ((yg - y) * 365 + LEAPS_THRU_END_OF (yg - 1)
-                        - LEAPS_THRU_END_OF (y - 1));
-               y = yg;
-       }
-       tp->year = y;
-       ip = __mon_yday[__isleap(y)];
-       for (y = 11; days < (long int) ip[y]; --y)
-               continue;
-       days -= ip[y];
-       tp->month = y + 1;
-       tp->day = days + 1;
-       return 1;
-}
-
-/* Macro to emulate SAL call using legacy IN and OUT calls to CF8, CFC etc.. */
-
-#define BUILD_CMD(addr)                ((0x80000000 | (addr)) & ~3)
-
-#define REG_OFFSET(addr)       (0x00000000000000FF & (addr))
-#define DEVICE_FUNCTION(addr)  (0x000000000000FF00 & (addr))
-#define BUS_NUMBER(addr)       (0x0000000000FF0000 & (addr))
-
-#ifndef XEN
-static efi_status_t
-fw_efi_get_time (efi_time_t *tm, efi_time_cap_t *tc)
-{
-#if defined(CONFIG_IA64_HP_SIM) || defined(CONFIG_IA64_GENERIC)
-       struct {
-               int tv_sec;     /* must be 32bits to work */
-               int tv_usec;
-       } tv32bits;
-
-       ssc((unsigned long) &tv32bits, 0, 0, 0, SSC_GET_TOD);
-
-       memset(tm, 0, sizeof(*tm));
-       offtime(tv32bits.tv_sec, tm);
-
-       if (tc)
-               memset(tc, 0, sizeof(*tc));
-#else
-#      error Not implemented yet...
-#endif
-       return EFI_SUCCESS;
-}
-
-static void
-efi_reset_system (int reset_type, efi_status_t status, unsigned long 
data_size, efi_char16_t *data)
-{
-#if defined(CONFIG_IA64_HP_SIM) || defined(CONFIG_IA64_GENERIC)
-       ssc(status, 0, 0, 0, SSC_EXIT);
-#else
-#      error Not implemented yet...
-#endif
-}
-
-static efi_status_t
-efi_unimplemented (void)
-{
-       return EFI_UNSUPPORTED;
-}
-#endif /* !XEN */
-
 struct sal_ret_values
 sal_emulator (long index, unsigned long in1, unsigned long in2,
              unsigned long in3, unsigned long in4, unsigned long in5,
              unsigned long in6, unsigned long in7)
 {
-       long r9  = 0;
-       long r10 = 0;
+       unsigned long r9  = 0;
+       unsigned long r10 = 0;
        long r11 = 0;
        long status;
 
@@ -285,12 +176,11 @@
 }
 
 struct ia64_pal_retval
-xen_pal_emulator(unsigned long index, unsigned long in1,
-       unsigned long in2, unsigned long in3)
-{
-       long r9  = 0;
-       long r10 = 0;
-       long r11 = 0;
+xen_pal_emulator(unsigned long index, u64 in1, u64 in2, u64 in3)
+{
+       unsigned long r9  = 0;
+       unsigned long r10 = 0;
+       unsigned long r11 = 0;
        long status = -1;
 
        if (running_on_sim) return pal_emulator_static(index);
@@ -364,7 +254,7 @@
                                &r10);
                break;
            case PAL_REGISTER_INFO:
-               status = ia64_pal_register_info(in1,&r9,&r10);
+               status = ia64_pal_register_info(in1, &r9, &r10);
                break;
            case PAL_CACHE_FLUSH:
                /* FIXME */
@@ -434,7 +324,7 @@
 
 #define NFUNCPTRS 20
 
-void print_md(efi_memory_desc_t *md)
+static void print_md(efi_memory_desc_t *md)
 {
 #if 1
        printk("domain mem: type=%u, attr=0x%lx, range=[0x%016lx-0x%016lx) 
(%luMB)\n",
@@ -496,7 +386,7 @@
 }
 
 /* base is physical address of acpi table */
-void touch_acpi_table(void)
+static void touch_acpi_table(void)
 {
        if (acpi_table_parse_madt(ACPI_MADT_LSAPIC, acpi_update_lsapic, 0) < 0)
                printk("Error parsing MADT - no LAPIC entires\n");
@@ -514,15 +404,15 @@
        struct acpi_table_header dsdt;
        u8 aml[16];
        struct acpi_table_madt madt;
-       struct acpi_table_lsapic lsapic;
+       struct acpi_table_lsapic lsapic[MAX_VIRT_CPUS];
        u8 pm1a_evt_blk[4];
        u8 pm1a_cnt_blk[1];
        u8 pm_tmr_blk[4];
 };
 
 /* Create enough of an ACPI structure to make the guest OS ACPI happy. */
-void
-dom_fw_fake_acpi(struct fake_acpi_tables *tables)
+static void
+dom_fw_fake_acpi(struct domain *d, struct fake_acpi_tables *tables)
 {
        struct acpi20_table_rsdp *rsdp = &tables->rsdp;
        struct xsdt_descriptor_rev2 *xsdt = &tables->xsdt;
@@ -530,7 +420,8 @@
        struct facs_descriptor_rev2 *facs = &tables->facs;
        struct acpi_table_header *dsdt = &tables->dsdt;
        struct acpi_table_madt *madt = &tables->madt;
-       struct acpi_table_lsapic *lsapic = &tables->lsapic;
+       struct acpi_table_lsapic *lsapic = tables->lsapic;
+       int i;
 
        memset(tables, 0, sizeof(struct fake_acpi_tables));
 
@@ -608,13 +499,13 @@
        /* Trivial namespace, avoids ACPI CA complaints */
        tables->aml[0] = 0x10; /* Scope */
        tables->aml[1] = 0x12; /* length/offset to next object */
-       strncpy(&tables->aml[2], "_SB_", 4);
+       strncpy((char *)&tables->aml[2], "_SB_", 4);
 
        /* The processor object isn't absolutely necessary, revist for SMP */
        tables->aml[6] = 0x5b; /* processor object */
        tables->aml[7] = 0x83;
        tables->aml[8] = 0x0b; /* next */
-       strncpy(&tables->aml[9], "CPU0", 4);
+       strncpy((char *)&tables->aml[9], "CPU0", 4);
 
        dsdt->checksum = generate_acpi_checksum(dsdt, dsdt->length);
 
@@ -622,16 +513,20 @@
        strncpy(madt->header.signature, APIC_SIG, 4);
        madt->header.revision = 2;
        madt->header.length = sizeof(struct acpi_table_madt) +
-                             sizeof(struct acpi_table_lsapic);
+               MAX_VIRT_CPUS * sizeof(struct acpi_table_lsapic);
        strcpy(madt->header.oem_id, "XEN");
        strcpy(madt->header.oem_table_id, "Xen/ia64");
        strcpy(madt->header.asl_compiler_id, "XEN");
        madt->header.asl_compiler_revision = (XEN_VERSION<<16)|(XEN_SUBVERSION);
 
-       /* A single LSAPIC entry describes the CPU.  Revisit for SMP guests */
-       lsapic->header.type = ACPI_MADT_LSAPIC;
-       lsapic->header.length = sizeof(struct acpi_table_lsapic);
-       lsapic->flags.enabled = 1;
+       /* An LSAPIC entry describes a CPU.  */
+       for (i = 0; i < MAX_VIRT_CPUS; i++) {
+               lsapic[i].header.type = ACPI_MADT_LSAPIC;
+               lsapic[i].header.length = sizeof(struct acpi_table_lsapic);
+               lsapic[i].id = i;
+               lsapic[i].eid = 0;
+               lsapic[i].flags.enabled = (d->vcpu[i] != NULL);
+       }
 
        madt->header.checksum = generate_acpi_checksum(madt,
                                                       madt->header.length);
@@ -785,7 +680,7 @@
 
                        acpi_tables = (void *)cp;
                        cp += sizeof(struct fake_acpi_tables);
-                       dom_fw_fake_acpi(acpi_tables);
+                       dom_fw_fake_acpi(d, acpi_tables);
 
                        efi_tables[i].guid = ACPI_20_TABLE_GUID;
                        efi_tables[i].table = dom_pa((unsigned long) 
acpi_tables);
@@ -801,8 +696,8 @@
        sal_systab->sal_rev_major = 0;
        sal_systab->entry_count = 1;
 
-       strcpy(sal_systab->oem_id, "Xen/ia64");
-       strcpy(sal_systab->product_id, "Xen/ia64");
+       strcpy((char *)sal_systab->oem_id, "Xen/ia64");
+       strcpy((char *)sal_systab->product_id, "Xen/ia64");
 
        /* fill in an entry point: */
        sal_ed->type = SAL_DESC_ENTRY_POINT;
@@ -861,7 +756,10 @@
                /* hypercall patches live here, masquerade as reserved PAL 
memory */
                
MAKE_MD(EFI_PAL_CODE,EFI_MEMORY_WB,HYPERCALL_START,HYPERCALL_END, 1);
                
MAKE_MD(EFI_CONVENTIONAL_MEMORY,EFI_MEMORY_WB,HYPERCALL_END,maxmem, 1);
-               MAKE_MD(EFI_RESERVED_TYPE,0,0,0,0);
+               /* Create a dummy entry for IO ports, so that IO accesses are
+                  trapped by Xen.  */
+               MAKE_MD(EFI_MEMORY_MAPPED_IO_PORT_SPACE,EFI_MEMORY_UC,
+                       0x00000ffffc000000, 0x00000fffffffffff, 1);
                MAKE_MD(EFI_RESERVED_TYPE,0,0,0,0);
        }
 
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/domain.c        Mon Mar 20 08:56:54 2006
@@ -26,6 +26,7 @@
 #include <asm/processor.h>
 #include <asm/desc.h>
 #include <asm/hw_irq.h>
+#include <asm/setup.h>
 //#include <asm/mpspec.h>
 #include <xen/irq.h>
 #include <xen/event.h>
@@ -36,7 +37,6 @@
 #include <xen/elf.h>
 //#include <asm/page.h>
 #include <asm/pgalloc.h>
-#include <asm/dma.h>   /* for MAX_DMA_ADDRESS */
 
 #include <asm/asm-offsets.h>  /* for IA64_THREAD_INFO_SIZE */
 
@@ -49,6 +49,9 @@
 #include <asm/pal.h>
 #include <asm/vhpt.h>
 #include <public/hvm/ioreq.h>
+#include <public/arch-ia64.h>
+#include <asm/tlbflush.h>
+#include <asm/regionreg.h>
 
 #define CONFIG_DOMAIN0_CONTIGUOUS
 unsigned long dom0_start = -1L;
@@ -69,10 +72,7 @@
 /* FIXME: where these declarations should be there ? */
 extern void domain_pend_keyboard_interrupt(int);
 extern long platform_is_hp_ski(void);
-extern unsigned long allocate_metaphysical_rr(void);
-extern int allocate_rid_range(struct domain *, unsigned long);
 extern void sync_split_caches(void);
-extern void init_all_rr(struct vcpu *);
 extern void serial_input_init(void);
 
 static void init_switch_stack(struct vcpu *v);
@@ -80,9 +80,33 @@
 /* this belongs in include/asm, but there doesn't seem to be a suitable place 
*/
 void arch_domain_destroy(struct domain *d)
 {
-       printf("arch_domain_destroy: not implemented\n");
-       //free_page((unsigned long)d->mm.perdomain_pt);
-       free_xenheap_page(d->shared_info);
+       struct page_info *page;
+       struct list_head *ent, *prev;
+
+       if (d->arch.mm->pgd != NULL)
+       {
+               list_for_each ( ent, &d->arch.mm->pt_list )
+               {
+                       page = list_entry(ent, struct page_info, list);
+                       prev = ent->prev;
+                       list_del(ent);
+                       free_xenheap_page(page_to_virt(page));
+                       ent = prev;
+               }
+               pgd_free(d->arch.mm->pgd);
+       }
+       if (d->arch.mm != NULL)
+               xfree(d->arch.mm);
+       if (d->shared_info != NULL)
+               free_xenheap_page(d->shared_info);
+
+       deallocate_rid_range(d);
+
+       /* It is really good in this? */
+       flush_tlb_all();
+
+       /* It is really good in this? */
+       vhpt_flush();
 }
 
 static void default_idle(void)
@@ -115,23 +139,9 @@
 
 void startup_cpu_idle_loop(void)
 {
-       int cpu = smp_processor_id ();
        /* Just some sanity to ensure that the scheduler is set up okay. */
        ASSERT(current->domain == IDLE_DOMAIN_ID);
-       printf ("idle%dA\n", cpu);
        raise_softirq(SCHEDULE_SOFTIRQ);
-#if 0   /* All this work is done within continue_cpu_idle_loop  */
-       printf ("idle%dB\n", cpu);
-       asm volatile ("mov ar.k2=r0");
-       do_softirq();
-       printf ("idle%dC\n", cpu);
-
-       /*
-        * Declares CPU setup done to the boot processor.
-        * Therefore memory barrier to ensure state is visible.
-        */
-       smp_mb();
-#endif
 #if 0
 //do we have to ensure the idle task has a shared page so that, for example,
 //region registers can be loaded from it.  Apparently not...
@@ -201,6 +211,8 @@
 
 void free_vcpu_struct(struct vcpu *v)
 {
+       if (v->arch.privregs != NULL)
+               free_xenheap_pages(v->arch.privregs, 
get_order(sizeof(mapped_regs_t)));
        free_xenheap_pages(v, KERNEL_STACK_SIZE_ORDER);
 }
 
@@ -253,6 +265,7 @@
        if ((d->arch.mm = xmalloc(struct mm_struct)) == NULL)
            goto fail_nomem;
        memset(d->arch.mm, 0, sizeof(*d->arch.mm));
+       INIT_LIST_HEAD(&d->arch.mm->pt_list);
 
        if ((d->arch.mm->pgd = pgd_alloc(d->arch.mm)) == NULL)
            goto fail_nomem;
@@ -324,10 +337,74 @@
        return 0;
 }
 
+static void relinquish_memory(struct domain *d, struct list_head *list)
+{
+    struct list_head *ent;
+    struct page_info *page;
+#ifndef __ia64__
+    unsigned long     x, y;
+#endif
+
+    /* Use a recursive lock, as we may enter 'free_domheap_page'. */
+    spin_lock_recursive(&d->page_alloc_lock);
+    ent = list->next;
+    while ( ent != list )
+    {
+        page = list_entry(ent, struct page_info, list);
+        /* Grab a reference to the page so it won't disappear from under us. */
+        if ( unlikely(!get_page(page, d)) )
+        {
+            /* Couldn't get a reference -- someone is freeing this page. */
+            ent = ent->next;
+            continue;
+        }
+
+        if ( test_and_clear_bit(_PGT_pinned, &page->u.inuse.type_info) )
+            put_page_and_type(page);
+
+        if ( test_and_clear_bit(_PGC_allocated, &page->count_info) )
+            put_page(page);
+
+#ifndef __ia64__
+        /*
+         * Forcibly invalidate base page tables at this point to break circular
+         * 'linear page table' references. This is okay because MMU structures
+         * are not shared across domains and this domain is now dead. Thus base
+         * tables are not in use so a non-zero count means circular reference.
+         */
+        y = page->u.inuse.type_info;
+        for ( ; ; )
+        {
+            x = y;
+            if ( likely((x & (PGT_type_mask|PGT_validated)) !=
+                        (PGT_base_page_table|PGT_validated)) )
+                break;
+
+            y = cmpxchg(&page->u.inuse.type_info, x, x & ~PGT_validated);
+            if ( likely(y == x) )
+            {
+                free_page_type(page, PGT_base_page_table);
+                break;
+            }
+        }
+#endif
+
+        /* Follow the list chain and /then/ potentially free the page. */
+        ent = ent->next;
+        put_page(page);
+    }
+
+    spin_unlock_recursive(&d->page_alloc_lock);
+}
+
 void domain_relinquish_resources(struct domain *d)
 {
-       /* FIXME */
-       printf("domain_relinquish_resources: not implemented\n");
+    /* Relinquish every page of memory. */
+
+    /* xenheap_list is not used in ia64. */
+    BUG_ON(!list_empty(&d->xenpage_list));
+
+    relinquish_memory(d, &d->page_list);
 }
 
 // heavily leveraged from linux/arch/ia64/kernel/process.c:copy_thread()
@@ -339,7 +416,7 @@
 {
        struct domain *d = v->domain;
        struct pt_regs *regs;
-       extern char saved_command_line[];
+       extern char dom0_command_line[];
 
 #ifdef CONFIG_DOMAIN0_CONTIGUOUS
        if (d == dom0) start_pc += dom0_start;
@@ -351,8 +428,9 @@
                regs->cr_ipsr = 0x501008826008; /* Need to be expanded as macro 
*/
        } else {
                regs->cr_ipsr = ia64_getreg(_IA64_REG_PSR)
-                       | IA64_PSR_BITS_TO_SET | IA64_PSR_BN
-                       & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_RI | IA64_PSR_IS);
+                 | IA64_PSR_BITS_TO_SET | IA64_PSR_BN;
+               regs->cr_ipsr &= ~(IA64_PSR_BITS_TO_CLEAR
+                                  | IA64_PSR_RI | IA64_PSR_IS);
                regs->cr_ipsr |= 2UL << IA64_PSR_CPL0_BIT; // domain runs at PL2
        }
        regs->cr_iip = start_pc;
@@ -362,24 +440,27 @@
        if (VMX_DOMAIN(v)) {
                vmx_init_all_rr(v);
                if (d == dom0)
-//                 VCPU(v,vgr[12]) = dom_fw_setup(d,saved_command_line,256L);
-                   regs->r28 = dom_fw_setup(d,saved_command_line,256L);
+                   regs->r28 = dom_fw_setup(d,dom0_command_line,
+                                            COMMAND_LINE_SIZE);
                /* Virtual processor context setup */
                VCPU(v, vpsr) = IA64_PSR_BN;
                VCPU(v, dcr) = 0;
        } else {
                init_all_rr(v);
                if (d == dom0) 
-                   regs->r28 = dom_fw_setup(d,saved_command_line,256L);
+                   regs->r28 = dom_fw_setup(d,dom0_command_line,
+                                            COMMAND_LINE_SIZE);
                else {
                    regs->ar_rsc |= (2 << 2); /* force PL2/3 */
                    if (*d->arch.cmdline == '\0') {
 #define DEFAULT_CMDLINE "nomca nosmp xencons=tty0 console=tty0 root=/dev/hda1"
-                       regs->r28 = dom_fw_setup(d,DEFAULT_CMDLINE,256L);
+                       regs->r28 = dom_fw_setup(d,DEFAULT_CMDLINE,
+                                                sizeof (DEFAULT_CMDLINE));
                        printf("domU command line defaulted to"
                                DEFAULT_CMDLINE "\n");
                    }
-                   else regs->r28 = dom_fw_setup(d,d->arch.cmdline,256L);
+                   else regs->r28 = dom_fw_setup(d,d->arch.cmdline, 
+                                                 IA64_COMMAND_LINE_SIZE);
                }
                VCPU(v, banknum) = 1;
                VCPU(v, metaphysical_mode) = 1;
@@ -387,7 +468,7 @@
        }
 }
 
-static struct page * assign_new_domain0_page(unsigned long mpaddr)
+static struct page_info * assign_new_domain0_page(unsigned long mpaddr)
 {
        if (mpaddr < dom0_start || mpaddr >= dom0_start + dom0_size) {
                printk("assign_new_domain0_page: bad domain0 mpaddr 
0x%lx!\n",mpaddr);
@@ -399,10 +480,10 @@
 }
 
 /* allocate new page for domain and map it to the specified metaphysical addr 
*/
-struct page * assign_new_domain_page(struct domain *d, unsigned long mpaddr)
+struct page_info * assign_new_domain_page(struct domain *d, unsigned long 
mpaddr)
 {
        struct mm_struct *mm = d->arch.mm;
-       struct page *p = (struct page *)0;
+       struct page_info *pt, *p = (struct page_info *)0;
        pgd_t *pgd;
        pud_t *pud;
        pmd_t *pmd;
@@ -414,16 +495,28 @@
        }
        pgd = pgd_offset(mm,mpaddr);
        if (pgd_none(*pgd))
+       {
                pgd_populate(mm, pgd, pud_alloc_one(mm,mpaddr));
+               pt = maddr_to_page(pgd_val(*pgd));
+               list_add_tail(&pt->list, &d->arch.mm->pt_list);
+       }
 
        pud = pud_offset(pgd, mpaddr);
        if (pud_none(*pud))
+       {
                pud_populate(mm, pud, pmd_alloc_one(mm,mpaddr));
+               pt = maddr_to_page(pud_val(*pud));
+               list_add_tail(&pt->list, &d->arch.mm->pt_list);
+       }
 
        pmd = pmd_offset(pud, mpaddr);
        if (pmd_none(*pmd))
+       {
                pmd_populate_kernel(mm, pmd, pte_alloc_one_kernel(mm,mpaddr));
 //             pmd_populate(mm, pmd, pte_alloc_one(mm,mpaddr));
+               pt = maddr_to_page(pmd_val(*pmd));
+               list_add_tail(&pt->list, &d->arch.mm->pt_list);
+       }
 
        pte = pte_offset_map(pmd, mpaddr);
        if (pte_none(*pte)) {
@@ -456,6 +549,7 @@
 void assign_domain_page(struct domain *d, unsigned long mpaddr, unsigned long 
physaddr)
 {
        struct mm_struct *mm = d->arch.mm;
+       struct page_info *pt;
        pgd_t *pgd;
        pud_t *pud;
        pmd_t *pmd;
@@ -467,16 +561,28 @@
        }
        pgd = pgd_offset(mm,mpaddr);
        if (pgd_none(*pgd))
+       {
                pgd_populate(mm, pgd, pud_alloc_one(mm,mpaddr));
+               pt = maddr_to_page(pgd_val(*pgd));
+               list_add_tail(&pt->list, &d->arch.mm->pt_list);
+       }
 
        pud = pud_offset(pgd, mpaddr);
        if (pud_none(*pud))
+       {
                pud_populate(mm, pud, pmd_alloc_one(mm,mpaddr));
+               pt = maddr_to_page(pud_val(*pud));
+               list_add_tail(&pt->list, &d->arch.mm->pt_list);
+       }
 
        pmd = pmd_offset(pud, mpaddr);
        if (pmd_none(*pmd))
+       {
                pmd_populate_kernel(mm, pmd, pte_alloc_one_kernel(mm,mpaddr));
 //             pmd_populate(mm, pmd, pte_alloc_one(mm,mpaddr));
+               pt = maddr_to_page(pmd_val(*pmd));
+               list_add_tail(&pt->list, &d->arch.mm->pt_list);
+       }
 
        pte = pte_offset_map(pmd, mpaddr);
        if (pte_none(*pte)) {
@@ -543,12 +649,13 @@
 
 #ifdef CONFIG_DOMAIN0_CONTIGUOUS
        if (d == dom0) {
+               pte_t pteval;
                if (mpaddr < dom0_start || mpaddr >= dom0_start + dom0_size) {
                        //printk("lookup_domain_mpa: bad dom0 mpaddr 
0x%lx!\n",mpaddr);
                        //printk("lookup_domain_mpa: 
start=0x%lx,end=0x%lx!\n",dom0_start,dom0_start+dom0_size);
                        mpafoo(mpaddr);
                }
-               pte_t pteval = pfn_pte(mpaddr >> PAGE_SHIFT,
+               pteval = pfn_pte(mpaddr >> PAGE_SHIFT,
                        __pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RWX));
                pte = &pteval;
                return *(unsigned long *)pte;
@@ -639,7 +746,7 @@
        Elf_Phdr phdr;
        int h, filesz, memsz;
        unsigned long elfaddr, dom_mpaddr, dom_imva;
-       struct page *p;
+       struct page_info *p;
   
        copy_memory(&ehdr, (void *) image_start, sizeof(Elf_Ehdr));
        for ( h = 0; h < ehdr.e_phnum; h++ ) {
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/gdbstub.c
--- a/xen/arch/ia64/xen/gdbstub.c       Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/gdbstub.c       Mon Mar 20 08:56:54 2006
@@ -32,6 +32,7 @@
 
 
 #include <xen/lib.h>
+#include <xen/mm.h>
 #include <asm/byteorder.h>
 #include <asm/debugger.h>
 #include <asm/uaccess.h>
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/irq.c
--- a/xen/arch/ia64/xen/irq.c   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/irq.c   Mon Mar 20 08:56:54 2006
@@ -1338,6 +1338,7 @@
     struct domain *guest[IRQ_MAX_GUESTS];
 } irq_guest_action_t;
 
+/*
 static void __do_IRQ_guest(int irq)
 {
     irq_desc_t         *desc = &irq_desc[irq];
@@ -1353,7 +1354,7 @@
         send_guest_pirq(d, irq);
     }
 }
-
+ */
 int pirq_guest_unmask(struct domain *d)
 {
     irq_desc_t    *desc;
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/mm_init.c
--- a/xen/arch/ia64/xen/mm_init.c       Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/mm_init.c       Mon Mar 20 08:56:54 2006
@@ -60,16 +60,16 @@
 #ifdef CONFIG_VIRTUAL_MEM_MAP
 unsigned long vmalloc_end = VMALLOC_END_INIT;
 EXPORT_SYMBOL(vmalloc_end);
-struct page *vmem_map;
+struct page_info *vmem_map;
 EXPORT_SYMBOL(vmem_map);
 #endif
 
 // static int pgt_cache_water[2] = { 25, 50 };
 
-struct page *zero_page_memmap_ptr;             /* map entry for zero page */
+#ifndef XEN
+struct page_info *zero_page_memmap_ptr;        /* map entry for zero page */
 EXPORT_SYMBOL(zero_page_memmap_ptr);
 
-#ifdef XEN
 void *high_memory;
 EXPORT_SYMBOL(high_memory);
 
@@ -172,7 +172,7 @@
 pte_t fastcall * pte_alloc_map(struct mm_struct *mm, pmd_t *pmd, unsigned long 
address)
 {
        if (!pmd_present(*pmd)) {
-               struct page *new;
+               struct page_info *new;
 
                spin_unlock(&mm->page_table_lock);
                new = pte_alloc_one(mm, address);
@@ -202,7 +202,7 @@
 update_mmu_cache (struct vm_area_struct *vma, unsigned long vaddr, pte_t pte)
 {
        unsigned long addr;
-       struct page *page;
+       struct page_info *page;
 
        if (!pte_exec(pte))
                return;                         /* not an executable page... */
@@ -386,7 +386,7 @@
 create_mem_map_page_table (u64 start, u64 end, void *arg)
 {
        unsigned long address, start_page, end_page;
-       struct page *map_start, *map_end;
+       struct page_info *map_start, *map_end;
        int node;
        pgd_t *pgd;
        pmd_t *pmd;
@@ -417,8 +417,8 @@
 }
 
 struct memmap_init_callback_data {
-       struct page *start;
-       struct page *end;
+       struct page_info *start;
+       struct page_info *end;
        int nid;
        unsigned long zone;
 };
@@ -427,7 +427,7 @@
 virtual_memmap_init (u64 start, u64 end, void *arg)
 {
        struct memmap_init_callback_data *args;
-       struct page *map_start, *map_end;
+       struct page_info *map_start, *map_end;
 
        args = (struct memmap_init_callback_data *) arg;
 
@@ -440,13 +440,13 @@
                map_end = args->end;
 
        /*
-        * We have to initialize "out of bounds" struct page elements that fit 
completely
+        * We have to initialize "out of bounds" struct page_info elements that 
fit completely
         * on the same pages that were allocated for the "in bounds" elements 
because they
         * may be referenced later (and found to be "reserved").
         */
-       map_start -= ((unsigned long) map_start & (PAGE_SIZE - 1)) / 
sizeof(struct page);
+       map_start -= ((unsigned long) map_start & (PAGE_SIZE - 1)) / 
sizeof(struct page_info);
        map_end += ((PAGE_ALIGN((unsigned long) map_end) - (unsigned long) 
map_end)
-                   / sizeof(struct page));
+                   / sizeof(struct page_info));
 
        if (map_start < map_end)
                memmap_init_zone(map_start, (unsigned long) (map_end - 
map_start),
@@ -455,7 +455,7 @@
 }
 
 void
-memmap_init (struct page *start, unsigned long size, int nid,
+memmap_init (struct page_info *start, unsigned long size, int nid,
             unsigned long zone, unsigned long start_pfn)
 {
        if (!vmem_map)
@@ -476,7 +476,7 @@
 ia64_mfn_valid (unsigned long pfn)
 {
        char byte;
-       struct page *pg = mfn_to_page(pfn);
+       struct page_info *pg = mfn_to_page(pfn);
 
        return     (__get_user(byte, (char *) pg) == 0)
                && ((((u64)pg & PAGE_MASK) == (((u64)(pg + 1) - 1) & PAGE_MASK))
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/privop.c
--- a/xen/arch/ia64/xen/privop.c        Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/privop.c        Mon Mar 20 08:56:54 2006
@@ -19,6 +19,9 @@
 extern void zero_reflect_counts(void);
 
 long priv_verbose=0;
+
+/* Set to 1 to handle privified instructions from the privify tool. */
+static const int privify_en = 0;
 
 /**************************************************************************
 Hypercall bundle creation
@@ -131,7 +134,8 @@
        UINT src = inst.M28.r3;
 
        // NOTE: ptc_e with source gr > 63 is emulated as a fc r(y-64)
-       if (src > 63) return(vcpu_fc(vcpu,vcpu_get_gr(vcpu,src - 64)));
+       if (privify_en && src > 63)
+               return(vcpu_fc(vcpu,vcpu_get_gr(vcpu,src - 64)));
        return vcpu_ptc_e(vcpu,vcpu_get_gr(vcpu,src));
 }
 
@@ -178,7 +182,7 @@
        UINT src = inst.M46.r3;
 
        // NOTE: tpa with source gr > 63 is emulated as a ttag rx=r(y-64)
-       if (src > 63)
+       if (privify_en && src > 63)
                fault = vcpu_ttag(vcpu,vcpu_get_gr(vcpu,src-64),&padr);
        else fault = vcpu_tpa(vcpu,vcpu_get_gr(vcpu,src),&padr);
        if (fault == IA64_NO_FAULT)
@@ -193,7 +197,7 @@
        UINT src = inst.M46.r3;
 
        // NOTE: tak with source gr > 63 is emulated as a thash rx=r(y-64)
-       if (src > 63)
+       if (privify_en && src > 63)
                fault = vcpu_thash(vcpu,vcpu_get_gr(vcpu,src-64),&key);
        else fault = vcpu_tak(vcpu,vcpu_get_gr(vcpu,src),&key);
        if (fault == IA64_NO_FAULT)
@@ -280,7 +284,8 @@
        // I26 and M29 are identical for these fields
        UINT64 ar3 = inst.M29.ar3;
 
-       if (inst.M29.r2 > 63 && inst.M29.ar3 < 8) { // privified mov from kr
+       if (privify_en && inst.M29.r2 > 63 && inst.M29.ar3 < 8) {
+               // privified mov from kr
                UINT64 val;
                if (vcpu_get_ar(vcpu,ar3,&val) != IA64_ILLOP_FAULT)
                        return vcpu_set_gr(vcpu, inst.M29.r2-64, val,0);
@@ -404,14 +409,17 @@
 {
        UINT64 val;
        IA64FAULT fault;
+       int reg;
        
-       if (inst.M43.r1 > 63) { // privified mov from cpuid
-               fault = vcpu_get_cpuid(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
+       reg = vcpu_get_gr(vcpu,inst.M43.r3);
+       if (privify_en && inst.M43.r1 > 63) {
+               // privified mov from cpuid
+               fault = vcpu_get_cpuid(vcpu,reg,&val);
                if (fault == IA64_NO_FAULT)
                        return vcpu_set_gr(vcpu, inst.M43.r1-64, val, 0);
        }
        else {
-               fault = vcpu_get_rr(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
+               fault = vcpu_get_rr(vcpu,reg,&val);
                if (fault == IA64_NO_FAULT)
                        return vcpu_set_gr(vcpu, inst.M43.r1, val, 0);
        }
@@ -455,14 +463,17 @@
 {
        UINT64 val;
        IA64FAULT fault;
+       int reg;
        
-       if (inst.M43.r1 > 63) { // privified mov from pmd
-               fault = vcpu_get_pmd(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
+       reg = vcpu_get_gr(vcpu,inst.M43.r3);
+       if (privify_en && inst.M43.r1 > 63) {
+               // privified mov from pmd
+               fault = vcpu_get_pmd(vcpu,reg,&val);
                if (fault == IA64_NO_FAULT)
                        return vcpu_set_gr(vcpu, inst.M43.r1-64, val, 0);
        }
        else {
-               fault = vcpu_get_pmc(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
+               fault = vcpu_get_pmc(vcpu,reg,&val);
                if (fault == IA64_NO_FAULT)
                        return vcpu_set_gr(vcpu, inst.M43.r1, val, 0);
        }
@@ -666,7 +677,7 @@
                else if (inst.generic.major != 1) break;
                x6 = inst.M29.x6;
                if (x6 == 0x2a) {
-                       if (inst.M29.r2 > 63 && inst.M29.ar3 < 8)
+                       if (privify_en && inst.M29.r2 > 63 && inst.M29.ar3 < 8)
                                privcnt.mov_from_ar++; // privified mov from kr
                        else privcnt.mov_to_ar_reg++;
                        return priv_mov_to_ar_reg(vcpu,inst);
@@ -674,14 +685,14 @@
                if (inst.M29.x3 != 0) break;
                if (!(pfunc = Mpriv_funcs[x6])) break;
                if (x6 == 0x1e || x6 == 0x1f)  { // tpa or tak are "special"
-                       if (inst.M46.r3 > 63) {
+                       if (privify_en && inst.M46.r3 > 63) {
                                if (x6 == 0x1e) x6 = 0x1b;
                                else x6 = 0x1a;
                        }
                }
-               if (x6 == 52 && inst.M28.r3 > 63)
+               if (privify_en && x6 == 52 && inst.M28.r3 > 63)
                        privcnt.fc++;
-               else if (x6 == 16 && inst.M43.r3 > 63)
+               else if (privify_en && x6 == 16 && inst.M43.r3 > 63)
                        privcnt.cpuid++;
                else privcnt.Mpriv_cnt[x6]++;
                return (*pfunc)(vcpu,inst);
@@ -718,7 +729,7 @@
 #endif
                if (inst.I26.x3 != 0) break;  // I26.x3 == I27.x3
                if (inst.I26.x6 == 0x2a) {
-                       if (inst.I26.r2 > 63 && inst.I26.ar3 < 8)
+                       if (privify_en && inst.I26.r2 > 63 && inst.I26.ar3 < 8)
                                privcnt.mov_from_ar++; // privified mov from kr
                        else privcnt.mov_to_ar_reg++;
                        return priv_mov_to_ar_reg(vcpu,inst);
@@ -797,12 +808,17 @@
 #define HYPERPRIVOP_GET_RR             0x10
 #define HYPERPRIVOP_SET_RR             0x11
 #define HYPERPRIVOP_SET_KR             0x12
-#define HYPERPRIVOP_MAX                        0x12
+#define HYPERPRIVOP_FC                 0x13
+#define HYPERPRIVOP_GET_CPUID          0x14
+#define HYPERPRIVOP_GET_PMD            0x15
+#define HYPERPRIVOP_GET_EFLAG          0x16
+#define HYPERPRIVOP_SET_EFLAG          0x17
+#define HYPERPRIVOP_MAX                        0x17
 
 static const char * const hyperpriv_str[HYPERPRIVOP_MAX+1] = {
        0, "rfi", "rsm.dt", "ssm.dt", "cover", "itc.d", "itc.i", "ssm.i",
        "=ivr", "=tpr", "tpr=", "eoi", "itm=", "thash", "ptc.ga", "itr.d",
-       "=rr", "rr=", "kr="
+       "=rr", "rr=", "kr=", "fc", "=cpuid", "=pmd", "=ar.eflg", "ar.eflg="
 };
 
 unsigned long slow_hyperpriv_cnt[HYPERPRIVOP_MAX+1] = { 0 };
@@ -888,6 +904,24 @@
                return 1;
            case HYPERPRIVOP_SET_KR:
                (void)vcpu_set_ar(v,regs->r8,regs->r9);
+               return 1;
+           case HYPERPRIVOP_FC:
+               (void)vcpu_fc(v,regs->r8);
+               return 1;
+           case HYPERPRIVOP_GET_CPUID:
+               (void)vcpu_get_cpuid(v,regs->r8,&val);
+               regs->r8 = val;
+               return 1;
+           case HYPERPRIVOP_GET_PMD:
+               (void)vcpu_get_pmd(v,regs->r8,&val);
+               regs->r8 = val;
+               return 1;
+           case HYPERPRIVOP_GET_EFLAG:
+               (void)vcpu_get_ar(v,24,&val);
+               regs->r8 = val;
+               return 1;
+           case HYPERPRIVOP_SET_EFLAG:
+               (void)vcpu_set_ar(v,24,regs->r8);
                return 1;
        }
        return 0;
@@ -934,7 +968,7 @@
 };
 
 // FIXME: should use snprintf to ensure no buffer overflow
-int dump_privop_counts(char *buf)
+static int dump_privop_counts(char *buf)
 {
        int i, j;
        UINT64 sum = 0;
@@ -1007,7 +1041,7 @@
        return s - buf;
 }
 
-int zero_privop_counts(char *buf)
+static int zero_privop_counts(char *buf)
 {
        int i, j;
        char *s = buf;
@@ -1043,7 +1077,7 @@
        v->overflow++;;
 }
 
-int dump_privop_addrs(char *buf)
+static int dump_privop_addrs(char *buf)
 {
        int i,j;
        char *s = buf;
@@ -1061,7 +1095,7 @@
        return s - buf;
 }
 
-void zero_privop_addrs(void)
+static void zero_privop_addrs(void)
 {
        int i,j;
        for (i = 0; i < PRIVOP_COUNT_NINSTS; i++) {
@@ -1085,7 +1119,7 @@
 extern unsigned long pal_halt_light_count;
 extern unsigned long context_switch_count;
 
-int dump_misc_stats(char *buf)
+static int dump_misc_stats(char *buf)
 {
        char *s = buf;
        s += sprintf(s,"Virtual TR translations: %ld\n",tr_translate_count);
@@ -1102,7 +1136,7 @@
        return s - buf;
 }
 
-void zero_misc_stats(void)
+static void zero_misc_stats(void)
 {
        dtlb_translate_count = 0;
        tr_translate_count = 0;
@@ -1117,7 +1151,7 @@
        context_switch_count = 0;
 }
 
-int dump_hyperprivop_counts(char *buf)
+static int dump_hyperprivop_counts(char *buf)
 {
        int i;
        char *s = buf;
@@ -1138,7 +1172,7 @@
        return s - buf;
 }
 
-void zero_hyperprivop_counts(void)
+static void zero_hyperprivop_counts(void)
 {
        int i;
        for (i = 0; i <= HYPERPRIVOP_MAX; i++) slow_hyperpriv_cnt[i] = 0;
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/process.c
--- a/xen/arch/ia64/xen/process.c       Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/process.c       Mon Mar 20 08:56:54 2006
@@ -1,3 +1,4 @@
+
 /*
  * Miscellaneous process/domain related routines
  * 
@@ -41,6 +42,7 @@
 extern int ia64_hyperprivop(unsigned long, REGS *);
 extern int ia64_hypercall(struct pt_regs *regs);
 extern void vmx_do_launch(struct vcpu *);
+extern unsigned long lookup_domain_mpa(struct domain *,unsigned long);
 
 extern unsigned long dom0_start, dom0_size;
 
@@ -57,20 +59,7 @@
                        IA64_PSR_ID | IA64_PSR_DA | IA64_PSR_DD | \
                        IA64_PSR_SS | IA64_PSR_RI | IA64_PSR_ED | IA64_PSR_IA)
 
-#define PSCB(x,y)      VCPU(x,y)
-#define PSCBX(x,y)     x->arch.y
-
-extern unsigned long vcpu_verbose;
-
-long do_iopl(domid_t domain, unsigned int new_io_pl)
-{
-       dummy();
-       return 0;
-}
-
 #include <xen/sched-if.h>
-
-extern struct schedule_data schedule_data[NR_CPUS];
 
 void schedule_tail(struct vcpu *prev)
 {
@@ -95,9 +84,6 @@
 {
        struct domain *d = current->domain;
        unsigned long mask, pteval2, mpaddr;
-       unsigned long lookup_domain_mpa(struct domain *,unsigned long);
-       extern struct domain *dom0;
-       extern unsigned long dom0_start, dom0_size;
 
        // FIXME address had better be pre-validated on insert
        mask = ~itir_mask(itir);
@@ -127,7 +113,6 @@
 // given a current domain metaphysical address, return the physical address
 unsigned long translate_domain_mpaddr(unsigned long mpaddr)
 {
-       extern unsigned long lookup_domain_mpa(struct domain *,unsigned long);
        unsigned long pteval;
 
        if (current->domain == dom0) {
@@ -224,7 +209,7 @@
 
 void foodpi(void) {}
 
-unsigned long pending_false_positive = 0;
+static unsigned long pending_false_positive = 0;
 
 void reflect_extint(struct pt_regs *regs)
 {
@@ -293,13 +278,14 @@
                return;
        }
 
-       fault = vcpu_translate(current,address,is_data,&pteval,&itir,&iha);
+       fault = vcpu_translate(current,address,is_data,0,&pteval,&itir,&iha);
        if (fault == IA64_NO_FAULT) {
                pteval = translate_domain_pte(pteval,address,itir);
                
vcpu_itc_no_srlz(current,is_data?2:1,address,pteval,-1UL,(itir>>2)&0x3f);
                return;
        }
-       if (IS_VMM_ADDRESS(iip)) {
+       if (!user_mode (regs)) {
+               /* The fault occurs inside Xen.  */
                if (!ia64_done_with_exception(regs)) {
                        // should never happen.  If it does, region 0 addr may
                        // indicate a bad xen pointer
@@ -543,7 +529,6 @@
 void
 do_ssc(unsigned long ssc, struct pt_regs *regs)
 {
-       extern unsigned long lookup_domain_mpa(struct domain *,unsigned long);
        unsigned long arg0, arg1, arg2, arg3, retval;
        char buf[2];
 /**/   static int last_fd, last_count; // FIXME FIXME FIXME
@@ -653,14 +638,14 @@
        vcpu_increment_iip(current);
 }
 
+/* Also read in hyperprivop.S  */
 int first_break = 1;
 
 void
 ia64_handle_break (unsigned long ifa, struct pt_regs *regs, unsigned long isr, 
unsigned long iim)
 {
-       struct domain *d = (struct domain *) current->domain;
+       struct domain *d = current->domain;
        struct vcpu *v = current;
-       extern unsigned long running_on_sim;
 
        if (first_break) {
                if (platform_is_hp_ski()) running_on_sim = 1;
@@ -668,8 +653,7 @@
                first_break = 0;
        }
        if (iim == 0x80001 || iim == 0x80002) { //FIXME: don't hardcode constant
-               if (running_on_sim) do_ssc(vcpu_get_gr(current,36), regs);
-               else do_ssc(vcpu_get_gr(current,36), regs);
+               do_ssc(vcpu_get_gr(current,36), regs);
        } 
 #ifdef CRASH_DEBUG
        else if ((iim == 0 || iim == CDB_BREAK_NUM) && !user_mode(regs)) {
@@ -711,6 +695,7 @@
        }
 }
 
+/* Used in vhpt.h.  */
 #define INTR_TYPE_MAX  10
 UINT64 int_counts[INTR_TYPE_MAX];
 
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/regionreg.c
--- a/xen/arch/ia64/xen/regionreg.c     Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/regionreg.c     Mon Mar 20 08:56:54 2006
@@ -157,7 +157,6 @@
        int rid_block_end = d->arch.ending_rid >> IA64_MIN_IMPL_RID_BITS;
        int rid_block_start = d->arch.starting_rid >> IA64_MIN_IMPL_RID_BITS;
 
-       return 1;  // KLUDGE ALERT
        //
        // not all domains will have allocated RIDs (physical mode loaders for 
instance)
        //
@@ -250,13 +249,18 @@
        newrrv.rid = newrid;
        newrrv.ve = 1;  // VHPT now enabled for region 7!!
        newrrv.ps = PAGE_SHIFT;
-       if (rreg == 0)
+
+       if (rreg == 0) {
                v->arch.metaphysical_saved_rr0 = vmMangleRID(newrrv.rrval);
-       else if (rreg == 7)
+               if (!PSCB(v,metaphysical_mode))
+                       set_rr(rr,newrrv.rrval);
+       } else if (rreg == 7) {
                ia64_new_rr7(vmMangleRID(newrrv.rrval),v->vcpu_info,
                             v->arch.privregs, __get_cpu_var(vhpt_paddr),
                             (unsigned long) pal_vaddr);
-       else set_rr(rr,newrrv.rrval);
+       } else {
+               set_rr(rr,newrrv.rrval);
+       }
 #endif
        return 1;
 }
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/vcpu.c  Mon Mar 20 08:56:54 2006
@@ -5,12 +5,6 @@
  *     Dan Magenheimer (dan.magenheimer@xxxxxx)
  *
  */
-
-#if 1
-// TEMPORARY PATCH for match_dtlb uses this, can be removed later
-// FIXME SMP
-int in_tpa = 0;
-#endif
 
 #include <linux/sched.h>
 #include <public/arch-ia64.h>
@@ -30,19 +24,18 @@
 extern void setreg(unsigned long regnum, unsigned long val, int nat, struct 
pt_regs *regs);
 extern void panic_domain(struct pt_regs *, const char *, ...);
 extern int set_metaphysical_rr0(void);
+extern unsigned long translate_domain_pte(UINT64,UINT64,UINT64);
+extern unsigned long translate_domain_mpaddr(unsigned long);
+extern void ia64_global_tlb_purge(UINT64 start, UINT64 end, UINT64 nbits);
+
 
 typedef        union {
        struct ia64_psr ia64_psr;
        unsigned long i64;
 } PSR;
 
-//typedef      struct pt_regs  REGS;
-//typedef struct domain VCPU;
-
 // this def for vcpu_regs won't work if kernel stack is present
 //#define      vcpu_regs(vcpu) ((struct pt_regs *) vcpu->arch.regs
-#define        PSCB(x,y)       VCPU(x,y)
-#define        PSCBX(x,y)      x->arch.y
 
 #define        TRUE    1
 #define        FALSE   0
@@ -71,18 +64,6 @@
 unsigned long phys_translate_count = 0;
 
 unsigned long vcpu_verbose = 0;
-#define verbose(a...) do {if (vcpu_verbose) printf(a);} while(0)
-
-//#define vcpu_quick_region_check(_tr_regions,_ifa)    1
-#define vcpu_quick_region_check(_tr_regions,_ifa)                      \
-       (_tr_regions & (1 << ((unsigned long)_ifa >> 61)))
-#define vcpu_quick_region_set(_tr_regions,_ifa)                                
\
-       do {_tr_regions |= (1 << ((unsigned long)_ifa >> 61)); } while (0)
-
-// FIXME: also need to check && (!trp->key || vcpu_pkr_match(trp->key))
-#define vcpu_match_tr_entry(_trp,_ifa,_rid)                            \
-       ((_trp->p && (_trp->rid==_rid) && (_ifa >= _trp->vadr) &&       \
-       (_ifa < (_trp->vadr + (1L<< _trp->ps)) - 1)))
 
 /**************************************************************************
  VCPU general register access routines
@@ -238,7 +219,6 @@
        return IA64_NO_FAULT;
 }
 
-extern UINT64 vcpu_check_pending_interrupts(VCPU *vcpu);
 #define SPURIOUS_VECTOR 0xf
 
 IA64FAULT vcpu_set_psr_dt(VCPU *vcpu)
@@ -659,13 +639,6 @@
     }
 }
 
-void early_tick(VCPU *vcpu)
-{
-       UINT64 *p = &PSCBX(vcpu,irr[3]);
-       printf("vcpu_check_pending: about to deliver early tick\n");
-       printf("&irr[0]=%p, irr[0]=0x%lx\n",p,*p);
-}
-
 #define        IA64_TPR_MMI    0x10000
 #define        IA64_TPR_MIC    0x000f0
 
@@ -677,7 +650,7 @@
  * and this must be checked independently; see vcpu_deliverable interrupts() */
 UINT64 vcpu_check_pending_interrupts(VCPU *vcpu)
 {
-       UINT64 *p, *q, *r, bits, bitnum, mask, i, vector;
+       UINT64 *p, *r, bits, bitnum, mask, i, vector;
 
        /* Always check pending event, since guest may just ack the
         * event injection without handle. Later guest may throw out
@@ -691,8 +664,8 @@
 
        p = &PSCBX(vcpu,irr[3]);
        r = &PSCBX(vcpu,insvc[3]);
-       for (i = 3; ; p--, q--, r--, i--) {
-               bits = *p /* & *q */;
+       for (i = 3; ; p--, r--, i--) {
+               bits = *p ;
                if (bits) break; // got a potential interrupt
                if (*r) {
                        // nothing in this word which is pending+inservice
@@ -713,7 +686,7 @@
        if (vector == (PSCB(vcpu,itv) & 0xff)) {
                uint64_t now = ia64_get_itc();
                if (now < PSCBX(vcpu,domain_itm)) {
-                       printk("Ooops, pending guest timer before its due\n");
+//                     printk("Ooops, pending guest timer before its due\n");
                        PSCBX(vcpu,irr[i]) &= ~mask;
                        goto check_start;
                }
@@ -753,12 +726,12 @@
 
 IA64FAULT vcpu_get_lid(VCPU *vcpu, UINT64 *pval)
 {
-//extern unsigned long privop_trace;
-//privop_trace=1;
-       //TODO: Implement this
-       printf("vcpu_get_lid: WARNING: Getting cr.lid always returns zero\n");
-       //*pval = 0;
-       *pval = ia64_getreg(_IA64_REG_CR_LID);
+       /* Use real LID for domain0 until vIOSAPIC is present.
+          Use EID=0, ID=vcpu_id for domU.  */
+       if (vcpu->domain == dom0)
+               *pval = ia64_getreg(_IA64_REG_CR_LID);
+       else
+               *pval = vcpu->vcpu_id << 24;
        return IA64_NO_FAULT;
 }
 
@@ -932,6 +905,7 @@
 {
        if (val & 0xff00) return IA64_RSVDREG_FAULT;
        PSCB(vcpu,tpr) = val;
+       /* This can unmask interrupts.  */
        if (vcpu_check_pending_interrupts(vcpu) != SPURIOUS_VECTOR)
                PSCB(vcpu,pending_interruption) = 1;
        return (IA64_NO_FAULT);
@@ -945,8 +919,8 @@
        p = &PSCBX(vcpu,insvc[3]);
        for (i = 3; (i >= 0) && !(bits = *p); i--, p--);
        if (i < 0) {
-               printf("Trying to EOI interrupt when none are in-service.\r\n");
-               return;
+               printf("Trying to EOI interrupt when none are in-service.\n");
+               return IA64_NO_FAULT;
        }
        bitnum = ia64_fls(bits);
        vec = bitnum + (i*64);
@@ -957,7 +931,7 @@
        if (PSCB(vcpu,interrupt_delivery_enabled)) { // but only if enabled...
                // worry about this later... Linux only calls eoi
                // with interrupts disabled
-               printf("Trying to EOI interrupt with interrupts enabled\r\n");
+               printf("Trying to EOI interrupt with interrupts enabled\n");
        }
        if (vcpu_check_pending_interrupts(vcpu) != SPURIOUS_VECTOR)
                PSCB(vcpu,pending_interruption) = 1;
@@ -1296,7 +1270,7 @@
 
 int warn_region0_address = 0; // FIXME later: tie to a boot parameter?
 
-IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data, UINT64 
*pteval, UINT64 *itir, UINT64 *iha)
+IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data, BOOLEAN 
in_tpa, UINT64 *pteval, UINT64 *itir, UINT64 *iha)
 {
        unsigned long region = address >> 61;
        unsigned long pta, pte, rid, rr;
@@ -1309,13 +1283,23 @@
 // FIXME: This seems to happen even though it shouldn't.  Need to track
 // this down, but since it has been apparently harmless, just flag it for now
 //                     panic_domain(vcpu_regs(vcpu),
-                       printk(
-                        "vcpu_translate: bad physical address: 
0x%lx\n",address);
+
+                       /*
+                        * Guest may execute itc.d and rfi with psr.dt=0
+                        * When VMM try to fetch opcode, tlb miss may happen,
+                        * At this time PSCB(vcpu,metaphysical_mode)=1,
+                        * region=5,VMM need to handle this tlb miss as if
+                        * PSCB(vcpu,metaphysical_mode)=0
+                        */           
+                       printk("vcpu_translate: bad physical address: 0x%lx\n",
+                              address);
+               } else {
+                       *pteval = (address & _PAGE_PPN_MASK) | __DIRTY_BITS |
+                                 _PAGE_PL_2 | _PAGE_AR_RWX;
+                       *itir = PAGE_SHIFT << 2;
+                       phys_translate_count++;
+                       return IA64_NO_FAULT;
                }
-               *pteval = (address & _PAGE_PPN_MASK) | __DIRTY_BITS | 
_PAGE_PL_2 | _PAGE_AR_RWX;
-               *itir = PAGE_SHIFT << 2;
-               phys_translate_count++;
-               return IA64_NO_FAULT;
        }
        else if (!region && warn_region0_address) {
                REGS *regs = vcpu_regs(vcpu);
@@ -1408,9 +1392,7 @@
        UINT64 pteval, itir, mask, iha;
        IA64FAULT fault;
 
-       in_tpa = 1;
-       fault = vcpu_translate(vcpu, vadr, 1, &pteval, &itir, &iha);
-       in_tpa = 0;
+       fault = vcpu_translate(vcpu, vadr, TRUE, TRUE, &pteval, &itir, &iha);
        if (fault == IA64_NO_FAULT)
        {
                mask = itir_mask(itir);
@@ -1655,8 +1637,11 @@
 
 IA64FAULT vcpu_get_rr(VCPU *vcpu, UINT64 reg, UINT64 *pval)
 {
-       UINT val = PSCB(vcpu,rrs)[reg>>61];
-       *pval = val;
+       if(VMX_DOMAIN(vcpu)){
+               *pval = VMX(vcpu,vrr[reg>>61]);
+       }else{
+               *pval = PSCB(vcpu,rrs)[reg>>61];
+       }
        return (IA64_NO_FAULT);
 }
 
@@ -1693,7 +1678,7 @@
  VCPU translation register access routines
 **************************************************************************/
 
-static void vcpu_purge_tr_entry(TR_ENTRY *trp)
+static inline void vcpu_purge_tr_entry(TR_ENTRY *trp)
 {
        trp->p = 0;
 }
@@ -1746,8 +1731,6 @@
 **************************************************************************/
 
 void foobar(void) { /*vcpu_verbose = 1;*/ }
-
-extern struct domain *dom0;
 
 void vcpu_itc_no_srlz(VCPU *vcpu, UINT64 IorD, UINT64 vaddr, UINT64 pte, 
UINT64 mp_pte, UINT64 logps)
 {
@@ -1793,7 +1776,6 @@
 IA64FAULT vcpu_itc_d(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa)
 {
        unsigned long pteval, logps = itir_ps(itir);
-       unsigned long translate_domain_pte(UINT64,UINT64,UINT64);
        BOOLEAN swap_rr0 = (!(ifa>>61) && PSCB(vcpu,metaphysical_mode));
 
        if (logps < PAGE_SHIFT) {
@@ -1813,7 +1795,6 @@
 IA64FAULT vcpu_itc_i(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa)
 {
        unsigned long pteval, logps = itir_ps(itir);
-       unsigned long translate_domain_pte(UINT64,UINT64,UINT64);
        BOOLEAN swap_rr0 = (!(ifa>>61) && PSCB(vcpu,metaphysical_mode));
 
        // FIXME: validate ifa here (not in Xen space), COULD MACHINE CHECK!
@@ -1849,8 +1830,6 @@
        // TODO: Only allowed for current vcpu
        UINT64 mpaddr, paddr;
        IA64FAULT fault;
-       unsigned long translate_domain_mpaddr(unsigned long);
-       IA64FAULT vcpu_tpa(VCPU *, UINT64, UINT64 *);
 
        fault = vcpu_tpa(vcpu, vadr, &mpaddr);
        if (fault == IA64_NO_FAULT) {
@@ -1885,7 +1864,6 @@
 
 IA64FAULT vcpu_ptc_ga(VCPU *vcpu,UINT64 vadr,UINT64 addr_range)
 {
-       extern void ia64_global_tlb_purge(UINT64 start, UINT64 end, UINT64 
nbits);
        // FIXME: validate not flushing Xen addresses
        // if (Xen address) return(IA64_ILLOP_FAULT);
        // FIXME: ??breaks if domain PAGE_SIZE < Xen PAGE_SIZE
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/xenirq.c
--- a/xen/arch/ia64/xen/xenirq.c        Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/xenirq.c        Mon Mar 20 08:56:54 2006
@@ -68,7 +68,7 @@
  * ONLY gets called from ia64_leave_kernel
  * ONLY call with interrupts enabled
  */
-void process_soft_irq()
+void process_soft_irq(void)
 {
        if (!in_interrupt() && local_softirq_pending()) {
                add_preempt_count(SOFTIRQ_OFFSET);
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/xenmem.c
--- a/xen/arch/ia64/xen/xenmem.c        Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/xenmem.c        Mon Mar 20 08:56:54 2006
@@ -13,12 +13,11 @@
 #include <asm/pgtable.h>
 #include <xen/mm.h>
 
-extern struct page *zero_page_memmap_ptr;
 struct page_info *frame_table;
 unsigned long frame_table_size;
 unsigned long max_page;
 
-struct page *mem_map;
+struct page_info *mem_map;
 #define MAX_DMA_ADDRESS ~0UL   // FIXME???
 
 #ifdef CONFIG_VIRTUAL_MEM_MAP
@@ -35,6 +34,8 @@
 paging_init (void)
 {
        unsigned int mpt_order;
+       unsigned long i;
+
        /* Create machine to physical mapping table
         * NOTE: similar to frame table, later we may need virtually
         * mapped mpt table if large hole exists. Also MAX_ORDER needs
@@ -47,10 +48,9 @@
                panic("Not enough memory to bootstrap Xen.\n");
 
        printk("machine to physical table: 0x%lx\n", (u64)mpt_table);
-       memset(mpt_table, INVALID_M2P_ENTRY, mpt_table_size);
-       /* Other mapping setup */
-
-       zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page));
+       for (i = 0; i < (1UL << mpt_order); i++) {
+               mpt_table[i] = INVALID_M2P_ENTRY;
+       }
 }
 
 /* FIXME: postpone support to machines with big holes between physical memorys.
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/xenmisc.c
--- a/xen/arch/ia64/xen/xenmisc.c       Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/xenmisc.c       Mon Mar 20 08:56:54 2006
@@ -114,23 +114,6 @@
 #endif
 
 ///////////////////////////////
-// from arch/ia64/page_alloc.c
-///////////////////////////////
-DEFINE_PER_CPU(struct page_state, page_states) = {0};
-unsigned long totalram_pages;
-
-void __mod_page_state(unsigned long offset, unsigned long delta)
-{
-       unsigned long flags;
-       void* ptr;
-
-       local_irq_save(flags);
-       ptr = &__get_cpu_var(page_states);
-       *(unsigned long*)(ptr + offset) += delta;
-       local_irq_restore(flags);
-}
-
-///////////////////////////////
 // from arch/x86/flushtlb.c
 ///////////////////////////////
 
@@ -147,12 +130,17 @@
     //memset(percpu_info, 0, sizeof(percpu_info));
 }
 
-#if 0
-void free_page_type(struct page_info *page, unsigned int type)
-{
-       dummy();
-}
-#endif
+void free_page_type(struct page_info *page, u32 type)
+{
+//     dummy();
+       return;
+}
+
+int alloc_page_type(struct page_info *page, u32 type)
+{
+//     dummy();
+       return 1;
+}
 
 ///////////////////////////////
 //// misc memory stuff
@@ -166,7 +154,7 @@
        return (unsigned long)p;
 }
 
-void __free_pages(struct page *page, unsigned int order)
+void __free_pages(struct page_info *page, unsigned int order)
 {
        if (order) BUG();
        free_xenheap_page(page);
@@ -306,9 +294,9 @@
     uint64_t pta;
 
     local_irq_save(spsr);
-    if(VMX_DOMAIN(prev)){
-       vtm_domain_out(prev);
-    }
+//    if(VMX_DOMAIN(prev)){
+//     vtm_domain_out(prev);
+//    }
        context_switch_count++;
        switch_to(prev,next,prev);
 //    if(VMX_DOMAIN(current)){
@@ -326,7 +314,7 @@
 }
 
     if (VMX_DOMAIN(current)){
-        vtm_domain_in(current);
+//        vtm_domain_in(current);
                vmx_load_all_rr(current);
     }else{
        extern char ia64_ivt;
@@ -415,3 +403,203 @@
        }
        else printk("sync_split_caches ignored for CPU with no split cache\n");
 }
+
+///////////////////////////////
+// from arch/x86/mm.c
+///////////////////////////////
+
+#ifdef VERBOSE
+#define MEM_LOG(_f, _a...)                           \
+  printk("DOM%u: (file=mm.c, line=%d) " _f "\n", \
+         current->domain->domain_id , __LINE__ , ## _a )
+#else
+#define MEM_LOG(_f, _a...) ((void)0)
+#endif
+
+void cleanup_writable_pagetable(struct domain *d)
+{
+  return;
+}
+
+void put_page_type(struct page_info *page)
+{
+    u32 nx, x, y = page->u.inuse.type_info;
+
+ again:
+    do {
+        x  = y;
+        nx = x - 1;
+
+        ASSERT((x & PGT_count_mask) != 0);
+
+        /*
+         * The page should always be validated while a reference is held. The 
+         * exception is during domain destruction, when we forcibly invalidate 
+         * page-table pages if we detect a referential loop.
+         * See domain.c:relinquish_list().
+         */
+        ASSERT((x & PGT_validated) || 
+               test_bit(_DOMF_dying, &page_get_owner(page)->domain_flags));
+
+        if ( unlikely((nx & PGT_count_mask) == 0) )
+        {
+            /* Record TLB information for flush later. Races are harmless. */
+            page->tlbflush_timestamp = tlbflush_current_time();
+            
+            if ( unlikely((nx & PGT_type_mask) <= PGT_l4_page_table) &&
+                 likely(nx & PGT_validated) )
+            {
+                /*
+                 * Page-table pages must be unvalidated when count is zero. The
+                 * 'free' is safe because the refcnt is non-zero and validated
+                 * bit is clear => other ops will spin or fail.
+                 */
+                if ( unlikely((y = cmpxchg(&page->u.inuse.type_info, x, 
+                                           x & ~PGT_validated)) != x) )
+                    goto again;
+                /* We cleared the 'valid bit' so we do the clean up. */
+                free_page_type(page, x);
+                /* Carry on, but with the 'valid bit' now clear. */
+                x  &= ~PGT_validated;
+                nx &= ~PGT_validated;
+            }
+        }
+        else if ( unlikely(((nx & (PGT_pinned | PGT_count_mask)) == 
+                            (PGT_pinned | 1)) &&
+                           ((nx & PGT_type_mask) != PGT_writable_page)) )
+        {
+            /* Page is now only pinned. Make the back pointer mutable again. */
+            nx |= PGT_va_mutable;
+        }
+    }
+    while ( unlikely((y = cmpxchg(&page->u.inuse.type_info, x, nx)) != x) );
+}
+
+
+int get_page_type(struct page_info *page, u32 type)
+{
+    u32 nx, x, y = page->u.inuse.type_info;
+
+ again:
+    do {
+        x  = y;
+        nx = x + 1;
+        if ( unlikely((nx & PGT_count_mask) == 0) )
+        {
+            MEM_LOG("Type count overflow on pfn %lx", page_to_mfn(page));
+            return 0;
+        }
+        else if ( unlikely((x & PGT_count_mask) == 0) )
+        {
+            if ( (x & (PGT_type_mask|PGT_va_mask)) != type )
+            {
+                if ( (x & PGT_type_mask) != (type & PGT_type_mask) )
+                {
+                    /*
+                     * On type change we check to flush stale TLB
+                     * entries. This may be unnecessary (e.g., page
+                     * was GDT/LDT) but those circumstances should be
+                     * very rare.
+                     */
+                    cpumask_t mask =
+                        page_get_owner(page)->domain_dirty_cpumask;
+                    tlbflush_filter(mask, page->tlbflush_timestamp);
+
+                    if ( unlikely(!cpus_empty(mask)) )
+                    {
+                        perfc_incrc(need_flush_tlb_flush);
+                        flush_tlb_mask(mask);
+                    }
+                }
+
+                /* We lose existing type, back pointer, and validity. */
+                nx &= ~(PGT_type_mask | PGT_va_mask | PGT_validated);
+                nx |= type;
+
+                /* No special validation needed for writable pages. */
+                /* Page tables and GDT/LDT need to be scanned for validity. */
+                if ( type == PGT_writable_page )
+                    nx |= PGT_validated;
+            }
+        }
+        else
+        {
+            if ( unlikely((x & (PGT_type_mask|PGT_va_mask)) != type) )
+            {
+                if ( unlikely((x & PGT_type_mask) != (type & PGT_type_mask) ) )
+                {
+                    if ( current->domain == page_get_owner(page) )
+                    {
+                        /*
+                         * This ensures functions like set_gdt() see up-to-date
+                         * type info without needing to clean up writable p.t.
+                         * state on the fast path.
+                         */
+                        LOCK_BIGLOCK(current->domain);
+                        cleanup_writable_pagetable(current->domain);
+                        y = page->u.inuse.type_info;
+                        UNLOCK_BIGLOCK(current->domain);
+                        /* Can we make progress now? */
+                        if ( ((y & PGT_type_mask) == (type & PGT_type_mask)) ||
+                             ((y & PGT_count_mask) == 0) )
+                            goto again;
+                    }
+                    if ( ((x & PGT_type_mask) != PGT_l2_page_table) ||
+                         ((type & PGT_type_mask) != PGT_l1_page_table) )
+                        MEM_LOG("Bad type (saw %" PRtype_info
+                                " != exp %" PRtype_info ") "
+                                "for mfn %lx (pfn %lx)",
+                                x, type, page_to_mfn(page),
+                                get_gpfn_from_mfn(page_to_mfn(page)));
+                    return 0;
+                }
+                else if ( (x & PGT_va_mask) == PGT_va_mutable )
+                {
+                    /* The va backpointer is mutable, hence we update it. */
+                    nx &= ~PGT_va_mask;
+                    nx |= type; /* we know the actual type is correct */
+                }
+                else if ( ((type & PGT_va_mask) != PGT_va_mutable) &&
+                          ((type & PGT_va_mask) != (x & PGT_va_mask)) )
+                {
+#ifdef CONFIG_X86_PAE
+                    /* We use backptr as extra typing. Cannot be unknown. */
+                    if ( (type & PGT_type_mask) == PGT_l2_page_table )
+                        return 0;
+#endif
+                    /* This table is possibly mapped at multiple locations. */
+                    nx &= ~PGT_va_mask;
+                    nx |= PGT_va_unknown;
+                }
+            }
+            if ( unlikely(!(x & PGT_validated)) )
+            {
+                /* Someone else is updating validation of this page. Wait... */
+                while ( (y = page->u.inuse.type_info) == x )
+                    cpu_relax();
+                goto again;
+            }
+        }
+    }
+    while ( unlikely((y = cmpxchg(&page->u.inuse.type_info, x, nx)) != x) );
+
+    if ( unlikely(!(nx & PGT_validated)) )
+    {
+        /* Try to validate page type; drop the new reference on failure. */
+        if ( unlikely(!alloc_page_type(page, type)) )
+        {
+            MEM_LOG("Error while validating mfn %lx (pfn %lx) for type %"
+                    PRtype_info ": caf=%08x taf=%" PRtype_info,
+                    page_to_mfn(page), get_gpfn_from_mfn(page_to_mfn(page)),
+                    type, page->count_info, page->u.inuse.type_info);
+            /* Noone else can get a reference. We hold the only ref. */
+            page->u.inuse.type_info = 0;
+            return 0;
+        }
+
+        /* Noone else is updating simultaneously. */
+        __set_bit(_PGT_validated, &page->u.inuse.type_info);
+    }
+
+    return 1;
+}
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/xensetup.c
--- a/xen/arch/ia64/xen/xensetup.c      Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/xensetup.c      Mon Mar 20 08:56:54 2006
@@ -27,6 +27,7 @@
 unsigned long xenheap_phys_end;
 
 char saved_command_line[COMMAND_LINE_SIZE];
+char dom0_command_line[COMMAND_LINE_SIZE];
 
 struct vcpu *idle_vcpu[NR_CPUS];
 
@@ -119,11 +120,12 @@
 void early_cmdline_parse(char **cmdline_p)
 {
     char *guest_cmd;
-    char *split = "--";
+    static const char * const split = "--";
 
     if (*cmdline_p == NULL) {
        *cmdline_p = &null[0];
        saved_command_line[0] = '\0';
+       dom0_command_line[0] = '\0';
        return;
     }
 
@@ -138,7 +140,8 @@
        while (*guest_cmd == ' ') guest_cmd++;
     }
 
-    strlcpy(saved_command_line, guest_cmd, COMMAND_LINE_SIZE);
+    strlcpy(saved_command_line, *cmdline_p, COMMAND_LINE_SIZE);
+    strlcpy(dom0_command_line, guest_cmd, COMMAND_LINE_SIZE);
     return;
 }
 
@@ -155,24 +158,6 @@
     .parity    = 'n',
     .stop_bits = 1
 };
-/*  This is a wrapper function of init_domheap_pages,
- *  memory exceeds (max_page<<PAGE_SHIFT) will not be reclaimed.
- *  This function will go away when the virtual memmap/discontig
- *  memory issues are solved
- */
-void init_domheap_pages_wrapper(unsigned long ps, unsigned long pe)
-{
-    unsigned long s_nrm, e_nrm, max_mem;
-    max_mem = (max_page+1)<<PAGE_SHIFT;
-    s_nrm = (ps+PAGE_SIZE-1)&PAGE_MASK;
-    e_nrm = pe&PAGE_MASK;
-    s_nrm = min(s_nrm, max_mem);
-    e_nrm = min(e_nrm, max_mem);
-    if(s_nrm < e_nrm)
-         init_domheap_pages(s_nrm, e_nrm);
-}
-
-
 
 void start_kernel(void)
 {
@@ -349,7 +334,6 @@
         if ( num_online_cpus() >= max_cpus )
             break;
         if ( !cpu_online(i) ) {
-printk("About to call __cpu_up(%d)\n",i);
             __cpu_up(i);
        }
     }
@@ -395,17 +379,6 @@
     /* PIN domain0 on CPU 0.  */
     dom0->vcpu[0]->cpu_affinity = cpumask_of_cpu(0);
 
-    /* The stash space for the initial kernel image can now be freed up. */
-    /* init_domheap_pages_wrapper is temporary solution, please refer to the
-     * descriptor of this function */
-    init_domheap_pages_wrapper(ia64_boot_param->domain_start,
-           ia64_boot_param->domain_start+ia64_boot_param->domain_size);
-    /* throw away initrd area passed from elilo */
-    if (ia64_boot_param->initrd_size) {
-        init_domheap_pages_wrapper(ia64_boot_param->initrd_start,
-           ia64_boot_param->initrd_start+ia64_boot_param->initrd_size);
-    }
-
     if (!running_on_sim)  // slow on ski and pages are pre-initialized to zero
        scrub_heap_pages();
 
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/xen/xentime.c
--- a/xen/arch/ia64/xen/xentime.c       Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/xen/xentime.c       Mon Mar 20 08:56:54 2006
@@ -116,6 +116,12 @@
        }
 #endif
 #endif
+
+#if 0
+       /* Nobody seems to be able to explain this code.
+          It seems to be accumulated tricks, which are not required anymore.
+          Also I have made many tests, I'd like to get confirmation from
+          other site (TG).  */
        if (current->domain == dom0) {
                // FIXME: there's gotta be a better way of doing this...
                // We have to ensure that domain0 is launched before we
@@ -130,6 +136,7 @@
                        vcpu_wake(dom0->vcpu[0]);
                }
        }
+#endif
        if (!is_idle_domain(current->domain))  {
                if (vcpu_timer_expired(current)) {
                        vcpu_pend_timer(current);
@@ -141,7 +148,7 @@
        new_itm = local_cpu_data->itm_next;
 
        if (!VMX_DOMAIN(current) && !time_after(ia64_get_itc(), new_itm))
-               return;
+               return IRQ_HANDLED;
 
        if (VMX_DOMAIN(current))
                vcpu_wake(current);
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/Makefile
--- a/xen/arch/x86/Makefile     Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/Makefile     Mon Mar 20 08:56:54 2006
@@ -1,59 +1,61 @@
-
 include $(BASEDIR)/Rules.mk
 
-OBJS += $(patsubst %.S,%.o,$(wildcard $(TARGET_SUBARCH)/*.S))
-OBJS += $(patsubst %.c,%.o,$(wildcard $(TARGET_SUBARCH)/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard acpi/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard genapic/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard cpu/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard cpu/mcheck/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard cpu/mtrr/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard hvm/*.c))
-OBJS += $(patsubst %.c,%.o,$(wildcard hvm/vmx/*.c))
-OBJS += $(patsubst %.S,%.o,$(wildcard hvm/vmx/$(TARGET_SUBARCH)/*.S))
-OBJS += $(patsubst %.c,%.o,$(wildcard hvm/svm/*.c))
-OBJS += $(patsubst %.S,%.o,$(wildcard hvm/svm/$(TARGET_SUBARCH)/*.S))
+subdirs-y += acpi
+subdirs-y += cpu
+subdirs-y += genapic
+subdirs-y += hvm
 
-ifeq ($(TARGET_SUBARCH),x86_64) 
-OBJS := $(subst cpu/centaur.o,,$(OBJS))
-OBJS := $(subst cpu/cyrix.o,,$(OBJS))
-OBJS := $(subst cpu/rise.o,,$(OBJS))
-OBJS := $(subst cpu/transmeta.o,,$(OBJS))
+subdirs-$(x86_32) += x86_32
+subdirs-$(x86_64) += x86_64
+
+obj-y += apic.o
+obj-y += audit.o
+obj-y += bitops.o
+obj-y += delay.o
+obj-y += dmi_scan.o
+obj-y += dom0_ops.o
+obj-y += domain.o
+obj-y += domain_build.o
+obj-y += e820.o
+obj-y += extable.o
+obj-y += flushtlb.o
+obj-y += i387.o
+obj-y += i8259.o
+obj-y += io_apic.o
+obj-y += irq.o
+obj-y += microcode.o
+obj-y += mm.o
+obj-y += mpparse.o
+obj-y += nmi.o
+obj-y += physdev.o
+obj-y += rwlock.o
+obj-y += setup.o
+obj-y += smp.o
+obj-y += smpboot.o
+obj-y += string.o
+obj-y += time.o
+obj-y += trampoline.o
+obj-y += traps.o
+obj-y += usercopy.o
+obj-y += x86_emulate.o
+
+ifneq ($(pae),n)
+obj-$(x86_32) += shadow.o shadow_public.o shadow_guest32.o
+else
+obj-$(x86_32) += shadow32.o
 endif
 
-OBJS := $(patsubst shadow%.o,,$(OBJS)) # drop all
-ifeq ($(TARGET_SUBARCH),x86_64) 
- OBJS += shadow.o shadow_public.o shadow_guest32.o shadow_guest32pae.o # 
x86_64: new code
-endif
-ifeq ($(TARGET_SUBARCH),x86_32) 
- ifneq ($(pae),n)
-  OBJS += shadow.o shadow_public.o shadow_guest32.o    # x86_32p: new code
- else
-  OBJS += shadow32.o                   # x86_32: old code
- endif
-endif
+obj-$(x86_64) += shadow.o shadow_public.o shadow_guest32.o shadow_guest32pae.o
 
-ifneq ($(supervisor_mode_kernel),y)
-OBJS := $(subst x86_32/supervisor_mode_kernel.o,,$(OBJS))
-endif
+obj-$(crash_debug) += gdbstub.o
 
-OBJS := $(subst $(TARGET_SUBARCH)/asm-offsets.o,,$(OBJS))
-OBJS := $(subst $(TARGET_SUBARCH)/xen.lds.o,,$(OBJS))
-
-ifneq ($(crash_debug),y)
-OBJS := $(patsubst gdbstub%.o,,$(OBJS))
-endif
-
-default: $(TARGET)
+include $(BASEDIR)/Post.mk
 
 $(TARGET): $(TARGET)-syms boot/mkelf32
        ./boot/mkelf32 $(TARGET)-syms $(TARGET) 0x100000 \
        `$(NM) $(TARGET)-syms | sort | tail -n 1 | sed -e 's/^\([^ 
]*\).*/0x\1/'`
 
-$(CURDIR)/arch.o: $(OBJS)
-       $(LD) $(LDFLAGS) -r -o $@ $(OBJS)
-
-$(TARGET)-syms: boot/$(TARGET_SUBARCH).o $(ALL_OBJS) xen.lds
+$(TARGET)-syms: boot/$(TARGET_SUBARCH).o xen.lds
        $(LD) $(LDFLAGS) -T xen.lds -N \
            boot/$(TARGET_SUBARCH).o $(ALL_OBJS) -o $@
        $(NM) -n $@ | $(BASEDIR)/tools/symbols >$(BASEDIR)/xen-syms.S
@@ -77,21 +79,5 @@
 
 shadow_guest32.o: shadow.c
 
-clean:
-       rm -f *.o *.s *~ core boot/*.o boot/*~ boot/core boot/mkelf32
-       rm -f x86_32/*.o x86_32/*~ x86_32/core
-       rm -f x86_64/*.o x86_64/*~ x86_64/core
-       rm -f mtrr/*.o mtrr/*~ mtrr/core
-       rm -f acpi/*.o acpi/*~ acpi/core
-       rm -f genapic/*.o genapic/*~ genapic/core
-       rm -f cpu/*.o cpu/*~ cpu/core
-       rm -f hvm/*.o hvm/*~ hvm/core
-       rm -f hvm/vmx/*.o hvm/vmx/*~ hvm/vmx/core
-       rm -f hvm/vmx/x86_32/*.o hvm/vmx/x86_32/*~ hvm/vmx/x86_32/core
-       rm -f hvm/vmx/x86_64/*.o hvm/vmx/x86_64/*~ hvm/vmx/x86_64/core
-       rm -f hvm/svm/*.o hvm/svm/*~ hvm/svm/core
-       rm -f hvm/svm/x86_32/*.o hvm/svm/x86_32/*~ hvm/svm/x86_32/core
-       rm -f hvm/svm/x86_64/*.o hvm/svm/x86_64/*~ hvm/svm/x86_64/core
-       rm -f xen.lds
-
-.PHONY: default clean
+clean:: FORCE
+       rm -f asm-offsets.s xen.lds boot/*.o boot/*~ boot/core boot/mkelf32
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/Rules.mk
--- a/xen/arch/x86/Rules.mk     Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/Rules.mk     Mon Mar 20 08:56:54 2006
@@ -1,5 +1,7 @@
 ########################################
 # x86-specific definitions
+
+HAS_ACPI := y
 
 #
 # If you change any of these configuration options then you must
@@ -31,13 +33,17 @@
 endif
 
 ifeq ($(XEN_TARGET_ARCH),x86_32)
-LDFLAGS += -m elf_i386 
+LDFLAGS += -m elf_i386
+x86_32 := y
+x86_64 := n
 endif
 
 ifeq ($(TARGET_SUBARCH),x86_64)
 CFLAGS  += -mno-red-zone -fpic -fno-reorder-blocks
 CFLAGS  += -fno-asynchronous-unwind-tables
 LDFLAGS += -m elf_x86_64
+x86_32 := n
+x86_64 := y
 endif
 
 # Test for at least GCC v3.2.x.
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/domain.c     Mon Mar 20 08:56:54 2006
@@ -51,6 +51,9 @@
 } __cacheline_aligned;
 static struct percpu_ctxt percpu_ctxt[NR_CPUS];
 
+static void paravirt_ctxt_switch_from(struct vcpu *v);
+static void paravirt_ctxt_switch_to(struct vcpu *v);
+
 static void continue_idle_domain(struct vcpu *v)
 {
     reset_stack_and_jump(idle_loop);
@@ -225,6 +228,9 @@
     {
         v->arch.schedule_tail = continue_nonidle_domain;
     }
+
+    v->arch.ctxt_switch_from = paravirt_ctxt_switch_from;
+    v->arch.ctxt_switch_to   = paravirt_ctxt_switch_to;
 
     v->arch.perdomain_ptes =
         d->arch.mm_perdomain_pt + (vcpu_id << GDT_LDT_VCPU_SHIFT);
@@ -685,21 +691,32 @@
     percpu_ctxt[smp_processor_id()].dirty_segment_mask = dirty_segment_mask;
 }
 
-#define switch_kernel_stack(_n,_c) ((void)0)
+#define switch_kernel_stack(v) ((void)0)
 
 #elif defined(__i386__)
 
 #define load_segments(n) ((void)0)
 #define save_segments(p) ((void)0)
 
-static inline void switch_kernel_stack(struct vcpu *n, unsigned int cpu)
-{
-    struct tss_struct *tss = &init_tss[cpu];
-    tss->esp1 = n->arch.guest_context.kernel_sp;
-    tss->ss1  = n->arch.guest_context.kernel_ss;
-}
-
-#endif
+static inline void switch_kernel_stack(struct vcpu *v)
+{
+    struct tss_struct *tss = &init_tss[smp_processor_id()];
+    tss->esp1 = v->arch.guest_context.kernel_sp;
+    tss->ss1  = v->arch.guest_context.kernel_ss;
+}
+
+#endif /* __i386__ */
+
+static void paravirt_ctxt_switch_from(struct vcpu *v)
+{
+    save_segments(v);
+}
+
+static void paravirt_ctxt_switch_to(struct vcpu *v)
+{
+    set_int80_direct_trap(v);
+    switch_kernel_stack(v);
+}
 
 #define loaddebug(_v,_reg) \
     __asm__ __volatile__ ("mov %0,%%db" #_reg : : "r" ((_v)->debugreg[_reg]))
@@ -720,15 +737,7 @@
                stack_regs,
                CTXT_SWITCH_STACK_BYTES);
         unlazy_fpu(p);
-        if ( !hvm_guest(p) )
-        {
-            save_segments(p);
-        }
-        else
-        {
-            hvm_save_segments(p);
-            hvm_load_msrs();
-        }
+        p->arch.ctxt_switch_from(p);
     }
 
     if ( !is_idle_vcpu(n) )
@@ -749,15 +758,7 @@
             loaddebug(&n->arch.guest_context, 7);
         }
 
-        if ( !hvm_guest(n) )
-        {
-            set_int80_direct_trap(n);
-            switch_kernel_stack(n, cpu);
-        }
-        else
-        {
-            hvm_restore_msrs(n);
-        }
+        n->arch.ctxt_switch_to(n);
     }
 
     if ( p->domain != n->domain )
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/intercept.c
--- a/xen/arch/x86/hvm/intercept.c      Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/intercept.c      Mon Mar 20 08:56:54 2006
@@ -338,10 +338,10 @@
 
 static __inline__ void missed_ticks(struct hvm_virpit*vpit)
 {
-    int        missed_ticks;
+    int missed_ticks;
 
     missed_ticks = (NOW() - vpit->scheduled)/(s_time_t) vpit->period;
-    if ( missed_ticks > 0 ) {
+    if ( missed_ticks++ >= 0 ) {
         vpit->pending_intr_nr += missed_ticks;
         vpit->scheduled += missed_ticks * vpit->period;
     }
@@ -355,22 +355,16 @@
 
     /* pick up missed timer tick */
     missed_ticks(vpit);
-
-    vpit->pending_intr_nr++;
     if ( test_bit(_VCPUF_running, &v->vcpu_flags) ) {
-        vpit->scheduled += vpit->period;
         set_timer(&vpit->pit_timer, vpit->scheduled);
     }
 }
 
+/* pick up missed timer ticks at deactive time */
 void pickup_deactive_ticks(struct hvm_virpit *vpit)
 {
-
     if ( !active_timer(&(vpit->pit_timer)) ) {
-        /* pick up missed timer tick */
         missed_ticks(vpit);
-    
-        vpit->scheduled += vpit->period;
         set_timer(&vpit->pit_timer, vpit->scheduled);
     }
 }
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/svm/svm.c        Mon Mar 20 08:56:54 2006
@@ -200,7 +200,8 @@
     return 1;
 }
 
-void svm_store_cpu_guest_regs(struct vcpu *v, struct cpu_user_regs *regs)
+static void svm_store_cpu_guest_regs(
+    struct vcpu *v, struct cpu_user_regs *regs)
 {
     struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
 
@@ -227,23 +228,11 @@
 #endif
 }
 
-void svm_load_cpu_guest_regs(struct vcpu *v, struct cpu_user_regs *regs)
+static void svm_load_cpu_guest_regs(
+    struct vcpu *v, struct cpu_user_regs *regs)
 {
     svm_load_cpu_user_regs(v, regs);
 }
-
-#ifdef __x86_64__
-
-void svm_save_segments(struct vcpu *v)
-{
-}
-void svm_load_msrs(void)
-{
-}
-void svm_restore_msrs(struct vcpu *v)
-{
-}
-#endif
 
 #define IS_CANO_ADDRESS(add) 1
 
@@ -458,12 +447,6 @@
 
     hvm_funcs.store_cpu_guest_regs = svm_store_cpu_guest_regs;
     hvm_funcs.load_cpu_guest_regs = svm_load_cpu_guest_regs;
-
-#ifdef __x86_64__
-    hvm_funcs.save_segments = svm_save_segments;
-    hvm_funcs.load_msrs = svm_load_msrs;
-    hvm_funcs.restore_msrs = svm_restore_msrs;
-#endif
 
     hvm_funcs.store_cpu_guest_ctrl_regs = svm_store_cpu_guest_ctrl_regs;
     hvm_funcs.modify_guest_state = svm_modify_guest_state;
@@ -687,9 +670,19 @@
     reset_stack_and_jump(svm_asm_do_launch);
 }
 
+static void svm_ctxt_switch_from(struct vcpu *v)
+{
+}
+
+static void svm_ctxt_switch_to(struct vcpu *v)
+{
+}
+
 void svm_final_setup_guest(struct vcpu *v)
 {
-    v->arch.schedule_tail = arch_svm_do_launch;
+    v->arch.schedule_tail    = arch_svm_do_launch;
+    v->arch.ctxt_switch_from = svm_ctxt_switch_from;
+    v->arch.ctxt_switch_to   = svm_ctxt_switch_to;
 
     if (v == v->domain->vcpu[0]) 
     {
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/vmx/io.c
--- a/xen/arch/x86/hvm/vmx/io.c Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/vmx/io.c Mon Mar 20 08:56:54 2006
@@ -40,20 +40,33 @@
 
 #define BSP_CPU(v)    (!(v->vcpu_id))
 
-void vmx_set_tsc_shift(struct vcpu *v, struct hvm_virpit *vpit)
-{
-    u64   drift;
-
-    if ( vpit->first_injected )
-        drift = vpit->period_cycles * vpit->pending_intr_nr;
-    else 
-        drift = 0;
-    vpit->shift = v->arch.hvm_vmx.tsc_offset - drift;
-    __vmwrite(TSC_OFFSET, vpit->shift);
-
+static inline 
+void __set_tsc_offset(u64  offset)
+{
+    __vmwrite(TSC_OFFSET, offset);
 #if defined (__i386__)
-    __vmwrite(TSC_OFFSET_HIGH, ((vpit->shift)>> 32));
+    __vmwrite(TSC_OFFSET_HIGH, offset >> 32);
 #endif
+}
+
+u64 get_guest_time(struct vcpu *v)
+{
+    struct hvm_virpit *vpit = &(v->domain->arch.hvm_domain.vpit);
+    u64    host_tsc;
+    
+    rdtscll(host_tsc);
+    return host_tsc + vpit->cache_tsc_offset;
+}
+
+void set_guest_time(struct vcpu *v, u64 gtime)
+{
+    struct hvm_virpit *vpit = &(v->domain->arch.hvm_domain.vpit);
+    u64    host_tsc;
+   
+    rdtscll(host_tsc);
+    
+    vpit->cache_tsc_offset = gtime - host_tsc;
+    __set_tsc_offset(vpit->cache_tsc_offset);
 }
 
 static inline void
@@ -64,6 +77,7 @@
     if ( is_pit_irq(v, vector, type) ) {
         if ( !vpit->first_injected ) {
             vpit->pending_intr_nr = 0;
+            vpit->last_pit_gtime = get_guest_time(v);
             vpit->scheduled = NOW() + vpit->period;
             set_timer(&vpit->pit_timer, vpit->scheduled);
             vpit->first_injected = 1;
@@ -71,7 +85,9 @@
             vpit->pending_intr_nr--;
         }
         vpit->inject_point = NOW();
-        vmx_set_tsc_shift (v, vpit);
+
+        vpit->last_pit_gtime += vpit->period;
+        set_guest_time(v, vpit->last_pit_gtime);
     }
 
     switch(type)
@@ -189,14 +205,15 @@
 
     vmx_stts();
 
+    /* pick up the elapsed PIT ticks and re-enable pit_timer */
+    if ( vpit->first_injected) {
+        set_guest_time(v, v->domain->arch.hvm_domain.guest_time);
+        pickup_deactive_ticks(vpit);
+    }
+
     if ( test_bit(iopacket_port(v), &d->shared_info->evtchn_pending[0]) ||
          test_bit(ARCH_HVM_IO_WAIT, &v->arch.hvm_vcpu.ioflags) )
         hvm_wait_io();
-
-    /* pick up the elapsed PIT ticks and re-enable pit_timer */
-    if ( vpit->first_injected )
-        pickup_deactive_ticks(vpit);
-    vmx_set_tsc_shift(v, vpit);
 
     /* We can't resume the guest if we're waiting on I/O */
     ASSERT(!test_bit(ARCH_HVM_IO_WAIT, &v->arch.hvm_vcpu.ioflags));
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/vmx/vmcs.c
--- a/xen/arch/x86/hvm/vmx/vmcs.c       Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/vmx/vmcs.c       Mon Mar 20 08:56:54 2006
@@ -195,7 +195,6 @@
 /* Update CR3, GDT, LDT, TR */
     unsigned int  error = 0;
     unsigned long cr0, cr4;
-    u64     host_tsc;
 
     if (v->vcpu_id == 0)
         hvm_setup_platform(v->domain);
@@ -250,9 +249,7 @@
     v->arch.hvm_vmx.launch_cpu = smp_processor_id();
 
     /* init guest tsc to start from 0 */
-    rdtscll(host_tsc);
-    v->arch.hvm_vmx.tsc_offset = 0 - host_tsc;
-    vmx_set_tsc_shift(v, &v->domain->arch.hvm_domain.vpit);
+    set_guest_time(v, 0);
 }
 
 /*
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Mon Mar 20 08:56:54 2006
@@ -50,9 +50,14 @@
 static unsigned long trace_values[NR_CPUS][4];
 #define TRACE_VMEXIT(index,value) trace_values[smp_processor_id()][index]=value
 
+static void vmx_ctxt_switch_from(struct vcpu *v);
+static void vmx_ctxt_switch_to(struct vcpu *v);
+
 void vmx_final_setup_guest(struct vcpu *v)
 {
-    v->arch.schedule_tail = arch_vmx_do_launch;
+    v->arch.schedule_tail    = arch_vmx_do_launch;
+    v->arch.ctxt_switch_from = vmx_ctxt_switch_from;
+    v->arch.ctxt_switch_to   = vmx_ctxt_switch_to;
 
     if ( v->vcpu_id == 0 )
     {
@@ -105,6 +110,7 @@
 }
 
 #ifdef __x86_64__
+
 static struct vmx_msr_state percpu_msr[NR_CPUS];
 
 static u32 msr_data_index[VMX_MSR_COUNT] =
@@ -113,7 +119,7 @@
     MSR_SYSCALL_MASK, MSR_EFER,
 };
 
-void vmx_save_segments(struct vcpu *v)
+static void vmx_save_segments(struct vcpu *v)
 {
     rdmsrl(MSR_SHADOW_GS_BASE, v->arch.hvm_vmx.msr_content.shadow_gs);
 }
@@ -124,7 +130,7 @@
  * are not modified once set for generic domains, we don't save them,
  * but simply reset them to the values set at percpu_traps_init().
  */
-void vmx_load_msrs(void)
+static void vmx_load_msrs(void)
 {
     struct vmx_msr_state *host_state = &percpu_msr[smp_processor_id()];
     int i;
@@ -166,118 +172,143 @@
 #define IS_CANO_ADDRESS(add) 1
 static inline int long_mode_do_msr_read(struct cpu_user_regs *regs)
 {
-    u64     msr_content = 0;
-    struct vcpu *vc = current;
-    struct vmx_msr_state * msr = &vc->arch.hvm_vmx.msr_content;
-    switch(regs->ecx){
+    u64 msr_content = 0;
+    struct vcpu *v = current;
+    struct vmx_msr_state *msr = &v->arch.hvm_vmx.msr_content;
+
+    switch ( regs->ecx ) {
     case MSR_EFER:
+        HVM_DBG_LOG(DBG_LEVEL_2, "EFER msr_content 0x%"PRIx64, msr_content);
         msr_content = msr->msr_items[VMX_INDEX_MSR_EFER];
-        HVM_DBG_LOG(DBG_LEVEL_2, "EFER msr_content %"PRIx64"\n", msr_content);
-        if (test_bit(VMX_CPU_STATE_LME_ENABLED,
-                     &vc->arch.hvm_vmx.cpu_state))
-            msr_content |= 1 << _EFER_LME;
-
-        if (VMX_LONG_GUEST(vc))
-            msr_content |= 1 << _EFER_LMA;
-        break;
+
+        /* the following code may be not needed */
+        if ( test_bit(VMX_CPU_STATE_LME_ENABLED, &v->arch.hvm_vmx.cpu_state) )
+            msr_content |= EFER_LME;
+        else
+            msr_content &= ~EFER_LME;
+
+        if ( VMX_LONG_GUEST(v) )
+            msr_content |= EFER_LMA;
+        else
+            msr_content &= ~EFER_LMA;
+        break;
+
     case MSR_FS_BASE:
-        if (!(VMX_LONG_GUEST(vc)))
+        if ( !(VMX_LONG_GUEST(v)) )
             /* XXX should it be GP fault */
             domain_crash_synchronous();
+
         __vmread(GUEST_FS_BASE, &msr_content);
         break;
+
     case MSR_GS_BASE:
-        if (!(VMX_LONG_GUEST(vc)))
+        if ( !(VMX_LONG_GUEST(v)) )
             domain_crash_synchronous();
+
         __vmread(GUEST_GS_BASE, &msr_content);
         break;
+
     case MSR_SHADOW_GS_BASE:
         msr_content = msr->shadow_gs;
         break;
 
-        CASE_READ_MSR(STAR);
-        CASE_READ_MSR(LSTAR);
-        CASE_READ_MSR(CSTAR);
-        CASE_READ_MSR(SYSCALL_MASK);
+    CASE_READ_MSR(STAR);
+    CASE_READ_MSR(LSTAR);
+    CASE_READ_MSR(CSTAR);
+    CASE_READ_MSR(SYSCALL_MASK);
+
     default:
         return 0;
     }
-    HVM_DBG_LOG(DBG_LEVEL_2, "mode_do_msr_read: msr_content: %"PRIx64"\n",
-                msr_content);
+
+    HVM_DBG_LOG(DBG_LEVEL_2, "msr_content: 0x%"PRIx64, msr_content);
+
     regs->eax = msr_content & 0xffffffff;
     regs->edx = msr_content >> 32;
+
     return 1;
 }
 
 static inline int long_mode_do_msr_write(struct cpu_user_regs *regs)
 {
-    u64     msr_content = regs->eax | ((u64)regs->edx << 32);
-    struct vcpu *vc = current;
-    struct vmx_msr_state * msr = &vc->arch.hvm_vmx.msr_content;
-    struct vmx_msr_state * host_state =
-        &percpu_msr[smp_processor_id()];
-
-    HVM_DBG_LOG(DBG_LEVEL_1, " mode_do_msr_write msr %lx "
-                "msr_content %"PRIx64"\n",
+    u64 msr_content = regs->eax | ((u64)regs->edx << 32);
+    struct vcpu *v = current;
+    struct vmx_msr_state *msr = &v->arch.hvm_vmx.msr_content;
+    struct vmx_msr_state *host_state = &percpu_msr[smp_processor_id()];
+
+    HVM_DBG_LOG(DBG_LEVEL_1, "msr 0x%lx msr_content 0x%"PRIx64"\n",
                 (unsigned long)regs->ecx, msr_content);
 
-    switch (regs->ecx){
+    switch ( regs->ecx ) {
     case MSR_EFER:
         /* offending reserved bit will cause #GP */
-        if ( msr_content &
-                ~( EFER_LME | EFER_LMA | EFER_NX | EFER_SCE ) )
-             vmx_inject_exception(vc, TRAP_gp_fault, 0);
-
-        if ((msr_content & EFER_LME) ^
-            test_bit(VMX_CPU_STATE_LME_ENABLED,
-                     &vc->arch.hvm_vmx.cpu_state)){
-            if ( vmx_paging_enabled(vc) ||
+        if ( msr_content & ~(EFER_LME | EFER_LMA | EFER_NX | EFER_SCE) )
+        {
+            printk("trying to set reserved bit in EFER\n");
+            vmx_inject_exception(v, TRAP_gp_fault, 0);
+            return 0;
+        }
+
+        /* LME: 0 -> 1 */
+        if ( msr_content & EFER_LME &&
+             !test_bit(VMX_CPU_STATE_LME_ENABLED, &v->arch.hvm_vmx.cpu_state) )
+        {
+            if ( vmx_paging_enabled(v) ||
                  !test_bit(VMX_CPU_STATE_PAE_ENABLED,
-                           &vc->arch.hvm_vmx.cpu_state)) {
-                vmx_inject_exception(vc, TRAP_gp_fault, 0);
+                           &v->arch.hvm_vmx.cpu_state) )
+            {
+                printk("trying to set LME bit when "
+                       "in paging mode or PAE bit is not set\n");
+                vmx_inject_exception(v, TRAP_gp_fault, 0);
+                return 0;
             }
-        }
-        if (msr_content & EFER_LME)
-            set_bit(VMX_CPU_STATE_LME_ENABLED,
-                    &vc->arch.hvm_vmx.cpu_state);
-
-        msr->msr_items[VMX_INDEX_MSR_EFER] =
-            msr_content;
+
+            set_bit(VMX_CPU_STATE_LME_ENABLED, &v->arch.hvm_vmx.cpu_state);
+        }
+
+        msr->msr_items[VMX_INDEX_MSR_EFER] = msr_content;
         break;
 
     case MSR_FS_BASE:
     case MSR_GS_BASE:
-        if (!(VMX_LONG_GUEST(vc)))
+        if ( !(VMX_LONG_GUEST(v)) )
             domain_crash_synchronous();
-        if (!IS_CANO_ADDRESS(msr_content)){
+
+        if ( !IS_CANO_ADDRESS(msr_content) )
+        {
             HVM_DBG_LOG(DBG_LEVEL_1, "Not cano address of msr write\n");
-            vmx_inject_exception(vc, TRAP_gp_fault, 0);
-        }
-        if (regs->ecx == MSR_FS_BASE)
+            vmx_inject_exception(v, TRAP_gp_fault, 0);
+            return 0;
+        }
+
+        if ( regs->ecx == MSR_FS_BASE )
             __vmwrite(GUEST_FS_BASE, msr_content);
         else
             __vmwrite(GUEST_GS_BASE, msr_content);
+
         break;
 
     case MSR_SHADOW_GS_BASE:
-        if (!(VMX_LONG_GUEST(vc)))
+        if ( !(VMX_LONG_GUEST(v)) )
             domain_crash_synchronous();
-        vc->arch.hvm_vmx.msr_content.shadow_gs = msr_content;
+
+        v->arch.hvm_vmx.msr_content.shadow_gs = msr_content;
         wrmsrl(MSR_SHADOW_GS_BASE, msr_content);
         break;
 
-        CASE_WRITE_MSR(STAR);
-        CASE_WRITE_MSR(LSTAR);
-        CASE_WRITE_MSR(CSTAR);
-        CASE_WRITE_MSR(SYSCALL_MASK);
+    CASE_WRITE_MSR(STAR);
+    CASE_WRITE_MSR(LSTAR);
+    CASE_WRITE_MSR(CSTAR);
+    CASE_WRITE_MSR(SYSCALL_MASK);
+
     default:
         return 0;
     }
+
     return 1;
 }
 
-void
-vmx_restore_msrs(struct vcpu *v)
+static void vmx_restore_msrs(struct vcpu *v)
 {
     int i = 0;
     struct vmx_msr_state *guest_state;
@@ -297,22 +328,52 @@
 
         HVM_DBG_LOG(DBG_LEVEL_2,
                     "restore guest's index %d msr %lx with %lx\n",
-                    i, (unsigned long) msr_data_index[i], (unsigned long) 
guest_state->msr_items[i]);
+                    i, (unsigned long)msr_data_index[i],
+                    (unsigned long)guest_state->msr_items[i]);
         set_bit(i, &host_state->flags);
         wrmsrl(msr_data_index[i], guest_state->msr_items[i]);
         clear_bit(i, &guest_flags);
     }
 }
 #else  /* __i386__ */
-#define  vmx_save_init_msrs()   ((void)0)
-
-static inline int  long_mode_do_msr_read(struct cpu_user_regs *regs){
+
+#define vmx_save_segments(v)      ((void)0)
+#define vmx_load_msrs()           ((void)0)
+#define vmx_restore_msrs(v)       ((void)0)
+#define vmx_save_init_msrs()      ((void)0)
+
+static inline int long_mode_do_msr_read(struct cpu_user_regs *regs)
+{
     return 0;
 }
-static inline int  long_mode_do_msr_write(struct cpu_user_regs *regs){
+
+static inline int long_mode_do_msr_write(struct cpu_user_regs *regs)
+{
     return 0;
 }
-#endif
+
+#endif /* __i386__ */
+
+static void vmx_freeze_time(struct vcpu *v)
+{
+    struct hvm_virpit *vpit = &v->domain->arch.hvm_domain.vpit;
+    
+    v->domain->arch.hvm_domain.guest_time = get_guest_time(v);
+    if ( vpit->first_injected )
+        stop_timer(&(vpit->pit_timer));
+}
+
+static void vmx_ctxt_switch_from(struct vcpu *v)
+{
+    vmx_freeze_time(v);
+    vmx_save_segments(v);
+    vmx_load_msrs();
+}
+
+static void vmx_ctxt_switch_to(struct vcpu *v)
+{
+    vmx_restore_msrs(v);
+}
 
 void stop_vmx(void)
 {
@@ -554,12 +615,6 @@
     hvm_funcs.store_cpu_guest_regs = vmx_store_cpu_guest_regs;
     hvm_funcs.load_cpu_guest_regs = vmx_load_cpu_guest_regs;
 
-#ifdef __x86_64__
-    hvm_funcs.save_segments = vmx_save_segments;
-    hvm_funcs.load_msrs = vmx_load_msrs;
-    hvm_funcs.restore_msrs = vmx_restore_msrs;
-#endif
-
     hvm_funcs.store_cpu_guest_ctrl_regs = vmx_store_cpu_guest_ctrl_regs;
     hvm_funcs.modify_guest_state = vmx_modify_guest_state;
 
@@ -670,27 +725,31 @@
 /* Reserved bits: [31:15], [12:11], [9], [6], [2:1] */
 #define VMX_VCPU_CPUID_L1_RESERVED 0xffff9a46
 
-static void vmx_vmexit_do_cpuid(unsigned long input, struct cpu_user_regs 
*regs)
-{
+static void vmx_vmexit_do_cpuid(struct cpu_user_regs *regs)
+{
+    unsigned int input = (unsigned int)regs->eax;
+    unsigned int count = (unsigned int)regs->ecx;
     unsigned int eax, ebx, ecx, edx;
     unsigned long eip;
     struct vcpu *v = current;
 
     __vmread(GUEST_RIP, &eip);
 
-    HVM_DBG_LOG(DBG_LEVEL_1,
-                "do_cpuid: (eax) %lx, (ebx) %lx, (ecx) %lx, (edx) %lx,"
-                " (esi) %lx, (edi) %lx",
+    HVM_DBG_LOG(DBG_LEVEL_3, "(eax) 0x%08lx, (ebx) 0x%08lx, "
+                "(ecx) 0x%08lx, (edx) 0x%08lx, (esi) 0x%08lx, (edi) 0x%08lx",
                 (unsigned long)regs->eax, (unsigned long)regs->ebx,
                 (unsigned long)regs->ecx, (unsigned long)regs->edx,
                 (unsigned long)regs->esi, (unsigned long)regs->edi);
 
-    cpuid(input, &eax, &ebx, &ecx, &edx);
+    if ( input == 4 )
+        cpuid_count(input, count, &eax, &ebx, &ecx, &edx);
+    else
+        cpuid(input, &eax, &ebx, &ecx, &edx);
 
     if ( input == 1 )
     {
         if ( hvm_apic_support(v->domain) &&
-                !vlapic_global_enabled((VLAPIC(v))) )
+             !vlapic_global_enabled((VLAPIC(v))) )
             clear_bit(X86_FEATURE_APIC, &edx);
 
 #if CONFIG_PAGING_LEVELS < 3
@@ -725,10 +784,12 @@
     regs->ecx = (unsigned long) ecx;
     regs->edx = (unsigned long) edx;
 
-    HVM_DBG_LOG(DBG_LEVEL_1,
-                "vmx_vmexit_do_cpuid: eip: %lx, input: %lx, out:eax=%x, 
ebx=%x, ecx=%x, edx=%x",
-                eip, input, eax, ebx, ecx, edx);
-
+    HVM_DBG_LOG(DBG_LEVEL_3, "eip@%lx, input: 0x%lx, "
+                "output: eax = 0x%08lx, ebx = 0x%08lx, "
+                "ecx = 0x%08lx, edx = 0x%08lx",
+                (unsigned long)eip, (unsigned long)input,
+                (unsigned long)eax, (unsigned long)ebx,
+                (unsigned long)ecx, (unsigned long)edx);
 }
 
 #define CASE_GET_REG_P(REG, reg)    \
@@ -1656,7 +1717,7 @@
 
         rdtscll(msr_content);
         vpit = &(v->domain->arch.hvm_domain.vpit);
-        msr_content += vpit->shift;
+        msr_content += vpit->cache_tsc_offset;
         break;
     }
     case MSR_IA32_SYSENTER_CS:
@@ -1700,22 +1761,8 @@
 
     switch (regs->ecx) {
     case MSR_IA32_TIME_STAMP_COUNTER:
-    {
-        struct hvm_virpit *vpit;
-        u64 host_tsc, drift;
-
-        rdtscll(host_tsc);
-        vpit = &(v->domain->arch.hvm_domain.vpit);
-        drift = v->arch.hvm_vmx.tsc_offset - vpit->shift;
-        vpit->shift = msr_content - host_tsc;
-       v->arch.hvm_vmx.tsc_offset = vpit->shift + drift;
-        __vmwrite(TSC_OFFSET, vpit->shift);
-
-#if defined (__i386__)
-        __vmwrite(TSC_OFFSET_HIGH, ((vpit->shift)>>32));
-#endif
-        break;
-    }
+        set_guest_time(v, msr_content);
+        break;
     case MSR_IA32_SYSENTER_CS:
         __vmwrite(GUEST_SYSENTER_CS, msr_content);
         break;
@@ -2014,8 +2061,8 @@
         __hvm_bug(&regs);
         break;
     case EXIT_REASON_CPUID:
+        vmx_vmexit_do_cpuid(&regs);
         __get_instruction_length(inst_len);
-        vmx_vmexit_do_cpuid(regs.eax, &regs);
         __update_guest_eip(inst_len);
         break;
     case EXIT_REASON_HLT:
diff -r 516cf6553011 -r cf89e8f0831b xen/common/Makefile
--- a/xen/common/Makefile       Mon Mar 20 08:56:46 2006
+++ b/xen/common/Makefile       Mon Mar 20 08:56:54 2006
@@ -1,19 +1,34 @@
-
 include $(BASEDIR)/Rules.mk
 
-ifneq ($(perfc),y)
-OBJS := $(subst perfc.o,,$(OBJS))
-endif
-ifneq ($(crash_debug),y)
-OBJS := $(patsubst gdbstub.o,,$(OBJS))
-endif
+obj-y += acm_ops.o
+obj-y += bitmap.o
+obj-y += dom0_ops.o
+obj-y += domain.o
+obj-y += elf.o
+obj-y += event_channel.o
+obj-y += grant_table.o
+obj-y += kernel.o
+obj-y += keyhandler.o
+obj-y += lib.o
+obj-y += memory.o
+obj-y += multicall.o
+obj-y += page_alloc.o
+obj-y += rangeset.o
+obj-y += sched_bvt.o
+obj-y += sched_sedf.o
+obj-y += schedule.o
+obj-y += softirq.o
+obj-y += string.o
+obj-y += symbols.o
+obj-y += trace.o
+obj-y += timer.o
+obj-y += vsprintf.o
+obj-y += xmalloc.o
 
-default: common.o
-common.o: $(OBJS)
-       $(LD) $(LDFLAGS) -r -o common.o $(OBJS)
+obj-$(perfc)       += perfc.o
+obj-$(crash_debug) += gdbstub.o
 
-clean:
-       rm -f *.o *~ core
+include $(BASEDIR)/Post.mk
 
 # Object file contains changeset and compiler information.
 kernel.o: $(BASEDIR)/include/xen/compile.h
diff -r 516cf6553011 -r cf89e8f0831b xen/drivers/Makefile
--- a/xen/drivers/Makefile      Mon Mar 20 08:56:46 2006
+++ b/xen/drivers/Makefile      Mon Mar 20 08:56:54 2006
@@ -1,8 +1,6 @@
+include $(BASEDIR)/Rules.mk
 
-default:
-       $(MAKE) -C char
-       $(MAKE) -C acpi
+subdirs-y := char/
+subdirs-$(HAS_ACPI) += acpi/
 
-clean:
-       $(MAKE) -C char clean
-       $(MAKE) -C acpi clean
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/drivers/acpi/Makefile
--- a/xen/drivers/acpi/Makefile Mon Mar 20 08:56:46 2006
+++ b/xen/drivers/acpi/Makefile Mon Mar 20 08:56:54 2006
@@ -1,11 +1,5 @@
-
 include $(BASEDIR)/Rules.mk
 
-OBJS := tables.o
+obj-y += tables.o
 
-default: driver.o
-driver.o: $(OBJS)
-       $(LD) $(LDFLAGS) -r -o driver.o $(OBJS)
-
-clean:
-       rm -f *.o *~ core
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/drivers/char/Makefile
--- a/xen/drivers/char/Makefile Mon Mar 20 08:56:46 2006
+++ b/xen/drivers/char/Makefile Mon Mar 20 08:56:54 2006
@@ -1,12 +1,10 @@
-
 include $(BASEDIR)/Rules.mk
 
-default: driver.o
-driver.o: $(OBJS)
-       $(LD) $(LDFLAGS) -r -o driver.o $(OBJS)
+obj-y += console.o
+obj-y += ns16550.o
+obj-y += serial.o
 
-clean:
-       rm -f *.o *~ core
+include $(BASEDIR)/Post.mk
 
 # Object file contains changeset and compiler information.
 console.o: $(BASEDIR)/include/xen/compile.h
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/config.h
--- a/xen/include/asm-ia64/config.h     Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/config.h     Mon Mar 20 08:56:54 2006
@@ -74,7 +74,7 @@
 extern unsigned long dom0_size;
 
 // from linux/include/linux/mm.h
-extern struct page *mem_map;
+extern struct page_info *mem_map;
 
 // xen/include/asm/config.h
 extern char _end[]; /* standard ELF symbol */
@@ -134,9 +134,6 @@
 #define smp_num_siblings 1
 #endif
 
-// from linux/include/linux/mm.h
-struct page;
-
 // function calls; see decl in xen/include/xen/sched.h
 #undef free_task_struct
 #undef alloc_task_struct
@@ -206,8 +203,6 @@
 #define _atomic_read(v) ((v).counter)
 #define atomic_compareandswap(old, new, v) ((atomic_t){ cmpxchg(v, 
_atomic_read(old), _atomic_read(new)) })
 
-// see include/asm-ia64/mm.h, handle remaining page_info uses until gone
-#define page_info page
 // Deprivated linux inf and put here for short time compatibility
 #define kmalloc(s, t) xmalloc_bytes((s))
 #define kfree(s) xfree((s))
@@ -249,7 +244,7 @@
 extern char saved_command_line[];
 struct screen_info { };
 #define seq_printf(a,b...) printf(b)
-#define CONFIG_BLK_DEV_INITRD // needed to reserve memory for domain0
+//#define CONFIG_BLK_DEV_INITRD // needed to reserve memory for domain0
 
 void dummy_called(char *function);
 #define dummy()        dummy_called((char *) __FUNCTION__)
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/dom_fw.h
--- a/xen/include/asm-ia64/dom_fw.h     Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/dom_fw.h     Mon Mar 20 08:56:54 2006
@@ -119,7 +119,7 @@
 #define FW_HYPERCALL_EFI_GET_NEXT_HIGH_MONO_COUNT_PADDR        
FW_HYPERCALL_PADDR(FW_HYPERCALL_EFI_GET_NEXT_HIGH_MONO_COUNT_INDEX)
 #define FW_HYPERCALL_EFI_RESET_SYSTEM_PADDR            
FW_HYPERCALL_PADDR(FW_HYPERCALL_EFI_RESET_SYSTEM_INDEX)
 
-extern struct ia64_pal_retval xen_pal_emulator(UINT64,UINT64,UINT64,UINT64);
+extern struct ia64_pal_retval xen_pal_emulator(UINT64, u64, u64, u64);
 extern struct sal_ret_values sal_emulator (long index, unsigned long in1, 
unsigned long in2, unsigned long in3, unsigned long in4, unsigned long in5, 
unsigned long in6, unsigned long in7);
 extern struct ia64_pal_retval pal_emulator_static (unsigned long);
 
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/domain.h     Mon Mar 20 08:56:54 2006
@@ -14,7 +14,6 @@
 extern void domain_relinquish_resources(struct domain *);
 
 struct arch_domain {
-    struct mm_struct *active_mm;
     struct mm_struct *mm;
     unsigned long metaphysical_rr0;
     unsigned long metaphysical_rr4;
@@ -68,7 +67,6 @@
     int breakimm;                      // from arch_domain (so is pinned)
     int starting_rid;          /* first RID assigned to domain */
     int ending_rid;            /* one beyond highest RID assigned to domain */
-    struct mm_struct *active_mm;
     struct thread_struct _thread;      // this must be last
 
     thash_cb_t *vtlb;
@@ -81,7 +79,6 @@
     struct arch_vmx_struct arch_vmx; /* Virtual Machine Extensions */
 };
 
-#define active_mm arch.active_mm
 //#define thread arch._thread
 
 // FOLLOWING FROM linux-2.6.7/include/sched.h
@@ -101,6 +98,8 @@
        struct rw_semaphore mmap_sem;
 #endif
        spinlock_t page_table_lock;             /* Protects task page tables 
and mm->rss */
+
+       struct list_head pt_list;               /* List of pagetable */
 
        struct list_head mmlist;                /* List of all active mm's.  
These are globally strung
                                                 * together off init_mm.mmlist, 
and are protected
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/flushtlb.h
--- a/xen/include/asm-ia64/flushtlb.h   Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/flushtlb.h   Mon Mar 20 08:56:54 2006
@@ -1,5 +1,7 @@
 #ifndef __FLUSHTLB_H__
 #define __FLUSHTLB_H__
+
+#include <asm/tlbflush.h>
 
 /* The current time as shown by the virtual TLB clock. */
 extern u32 tlbflush_clock;
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/linux-xen/asm/page.h
--- a/xen/include/asm-ia64/linux-xen/asm/page.h Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/linux-xen/asm/page.h Mon Mar 20 08:56:54 2006
@@ -75,7 +75,7 @@
        flush_dcache_page(page);                \
 } while (0)
 
-
+#ifndef XEN
 #define alloc_zeroed_user_highpage(vma, vaddr) \
 ({                                             \
        struct page *page = alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO, vma, 
vaddr); \
@@ -83,6 +83,7 @@
                flush_dcache_page(page);        \
        page;                                   \
 })
+#endif
 
 #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
 
diff -r 516cf6553011 -r cf89e8f0831b 
xen/include/asm-ia64/linux-xen/asm/pgalloc.h
--- a/xen/include/asm-ia64/linux-xen/asm/pgalloc.h      Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/linux-xen/asm/pgalloc.h      Mon Mar 20 08:56:54 2006
@@ -106,11 +106,13 @@
 
 #define __pmd_free_tlb(tlb, pmd)       pmd_free(pmd)
 
+#ifndef XEN
 static inline void
 pmd_populate(struct mm_struct *mm, pmd_t * pmd_entry, struct page *pte)
 {
        pmd_val(*pmd_entry) = page_to_maddr(pte);
 }
+#endif
 
 static inline void
 pmd_populate_kernel(struct mm_struct *mm, pmd_t * pmd_entry, pte_t * pte)
@@ -118,11 +120,13 @@
        pmd_val(*pmd_entry) = __pa(pte);
 }
 
+#ifndef XEN
 static inline struct page *pte_alloc_one(struct mm_struct *mm,
                                         unsigned long addr)
 {
        return virt_to_page(pgtable_quicklist_alloc());
 }
+#endif
 
 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
                                          unsigned long addr)
@@ -130,6 +134,7 @@
        return pgtable_quicklist_alloc();
 }
 
+#ifndef XEN
 static inline void pte_free(struct page *pte)
 {
        pgtable_quicklist_free(page_address(pte));
@@ -141,6 +146,7 @@
 }
 
 #define __pte_free_tlb(tlb, pte)       pte_free(pte)
+#endif
 
 extern void check_pgt_cache(void);
 
diff -r 516cf6553011 -r cf89e8f0831b 
xen/include/asm-ia64/linux-xen/asm/pgtable.h
--- a/xen/include/asm-ia64/linux-xen/asm/pgtable.h      Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/linux-xen/asm/pgtable.h      Mon Mar 20 08:56:54 2006
@@ -467,8 +467,10 @@
  * for zero-mapped memory areas etc..
  */
 extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];
+#ifndef XEN
 extern struct page *zero_page_memmap_ptr;
 #define ZERO_PAGE(vaddr) (zero_page_memmap_ptr)
+#endif
 
 /* We provide our own get_unmapped_area to cope with VA holes for userland */
 #define HAVE_ARCH_UNMAPPED_AREA
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/linux-xen/asm/system.h
--- a/xen/include/asm-ia64/linux-xen/asm/system.h       Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/linux-xen/asm/system.h       Mon Mar 20 08:56:54 2006
@@ -290,6 +290,9 @@
 
 #ifdef XEN
 #include <asm/xensystem.h>
+#ifndef __ASSEMBLY__
+struct resource;
+#endif
 #endif
 
 #endif /* _ASM_IA64_SYSTEM_H */
diff -r 516cf6553011 -r cf89e8f0831b 
xen/include/asm-ia64/linux-xen/asm/tlbflush.h
--- a/xen/include/asm-ia64/linux-xen/asm/tlbflush.h     Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/linux-xen/asm/tlbflush.h     Mon Mar 20 08:56:54 2006
@@ -80,7 +80,11 @@
 #ifdef CONFIG_SMP
        flush_tlb_range(vma, (addr & PAGE_MASK), (addr & PAGE_MASK) + 
PAGE_SIZE);
 #else
+#ifdef XEN
+       if (vma->vm_mm == current->domain->arch.mm)
+#else
        if (vma->vm_mm == current->active_mm)
+#endif
                ia64_ptcl(addr, (PAGE_SHIFT << 2));
 #ifndef XEN
 // FIXME SMP?
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/linux-xen/linux/gfp.h
--- a/xen/include/asm-ia64/linux-xen/linux/gfp.h        Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/linux-xen/linux/gfp.h        Mon Mar 20 08:56:54 2006
@@ -3,6 +3,7 @@
 
 #ifdef XEN
 #include <asm/bitops.h>
+#include <linux/topology.h>
 #endif
 #include <linux/mmzone.h>
 #include <linux/stddef.h>
@@ -81,6 +82,7 @@
  * optimized to &contig_page_data at compile-time.
  */
 
+#ifndef XEN
 #ifndef HAVE_ARCH_FREE_PAGE
 static inline void arch_free_page(struct page *page, int order) { }
 #endif
@@ -134,6 +136,7 @@
 
 #define __free_page(page) __free_pages((page), 0)
 #define free_page(addr) free_pages((addr),0)
+#endif /* XEN */
 
 void page_alloc_init(void);
 #ifdef CONFIG_NUMA
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/linux/README.origin
--- a/xen/include/asm-ia64/linux/README.origin  Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/linux/README.origin  Mon Mar 20 08:56:54 2006
@@ -14,13 +14,10 @@
 jiffies.h              -> linux/include/linux/jiffies.h
 kmalloc_sizes.h                -> linux/include/linux/kmalloc_sizes.h
 linkage.h              -> linux/include/linux/linkage.h
-mmzone.h               -> linux/include/linux/mmzone.h
 notifier.h             -> linux/include/linux/notifier.h
 numa.h                 -> linux/include/linux/numa.h
-page-flags.h           -> linux/include/linux/page-flags.h
 percpu.h               -> linux/include/linux/percpu.h
 preempt.h              -> linux/include/linux/preempt.h
-rbtree.h               -> linux/include/linux/rbtree.h
 rwsem.h                        -> linux/include/linux/rwsem.h
 seqlock.h              -> linux/include/linux/seqlock.h
 sort.h                 -> linux/include/linux/sort.h
diff -r 516cf6553011 -r cf89e8f0831b 
xen/include/asm-ia64/linux/asm-generic/README.origin
--- a/xen/include/asm-ia64/linux/asm-generic/README.origin      Mon Mar 20 
08:56:46 2006
+++ b/xen/include/asm-ia64/linux/asm-generic/README.origin      Mon Mar 20 
08:56:54 2006
@@ -10,7 +10,6 @@
 errno.h                        -> linux/include/asm-generic/errno.h
 ide_iops.h             -> linux/include/asm-generic/ide_iops.h
 iomap.h                        -> linux/include/asm-generic/iomap.h
-pci-dma-compat.h       -> linux/include/asm-generic/pci-dma-compat.h
 pci.h                  -> linux/include/asm-generic/pci.h
 pgtable.h              -> linux/include/asm-generic/pgtable.h
 pgtable-nopud.h                -> linux/include/asm-generic/pgtable-nopud.h
diff -r 516cf6553011 -r cf89e8f0831b 
xen/include/asm-ia64/linux/asm/README.origin
--- a/xen/include/asm-ia64/linux/asm/README.origin      Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/linux/asm/README.origin      Mon Mar 20 08:56:54 2006
@@ -42,7 +42,6 @@
 rse.h                  -> linux/include/asm-ia64/rse.h
 rwsem.h                        -> linux/include/asm-ia64/rwsem.h
 sal.h                  -> linux/include/asm-ia64/sal.h
-scatterlist.h          -> linux/include/asm-ia64/scatterlist.h
 sections.h             -> linux/include/asm-ia64/sections.h
 semaphore.h            -> linux/include/asm-ia64/semaphore.h
 setup.h                        -> linux/include/asm-ia64/setup.h
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/linux/asm/hw_irq.h
--- a/xen/include/asm-ia64/linux/asm/hw_irq.h   Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/linux/asm/hw_irq.h   Mon Mar 20 08:56:54 2006
@@ -85,6 +85,7 @@
 extern void free_irq_vector (int vector);
 extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int 
redirect);
 extern void register_percpu_irq (ia64_vector vec, struct irqaction *action);
+extern int xen_do_IRQ(ia64_vector vector);
 
 static inline void
 hw_resend_irq (struct hw_interrupt_type *h, unsigned int vector)
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/linux/asm/irq.h
--- a/xen/include/asm-ia64/linux/asm/irq.h      Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/linux/asm/irq.h      Mon Mar 20 08:56:54 2006
@@ -40,4 +40,6 @@
 struct pt_regs;
 int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
 
+extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs);
+
 #endif /* _ASM_IA64_IRQ_H */
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/mm.h Mon Mar 20 08:56:54 2006
@@ -9,8 +9,6 @@
 #include <xen/spinlock.h>
 #include <xen/perfc.h>
 #include <xen/sched.h>
-
-#include <linux/rbtree.h>
 
 #include <asm/processor.h>
 #include <asm/atomic.h>
@@ -36,37 +34,38 @@
 
 #define PRtype_info "08x"
 
-struct page
+struct page_info
 {
     /* Each frame can be threaded onto a doubly-linked list. */
     struct list_head list;
 
+    /* Reference count and various PGC_xxx flags and fields. */
+    u32 count_info;
+
+    /* Context-dependent fields follow... */
+    union {
+
+        /* Page is in use: ((count_info & PGC_count_mask) != 0). */
+        struct {
+            /* Owner of this page (NULL if page is anonymous). */
+            u32 _domain; /* pickled format */
+            /* Type reference count and various PGT_xxx flags and fields. */
+            unsigned long type_info;
+        } __attribute__ ((packed)) inuse;
+
+        /* Page is on a free list: ((count_info & PGC_count_mask) == 0). */
+        struct {
+            /* Order-size of the free chunk this page is the head of. */
+            u32 order;
+            /* Mask of possibly-tainted TLBs. */
+            cpumask_t cpumask;
+        } __attribute__ ((packed)) free;
+
+    } u;
+
     /* Timestamp from 'TLB clock', used to reduce need for safety flushes. */
     u32 tlbflush_timestamp;
 
-    /* Reference count and various PGC_xxx flags and fields. */
-    u32 count_info;
-
-    /* Context-dependent fields follow... */
-    union {
-
-        /* Page is in use by a domain. */
-        struct {
-            /* Owner of this page. */
-            u32        _domain;
-            /* Type reference count and various PGT_xxx flags and fields. */
-            u32 type_info;
-        } inuse;
-
-        /* Page is on a free list. */
-        struct {
-            /* Mask of possibly-tainted TLBs. */
-            cpumask_t cpumask;
-            /* Order-size of the free chunk this page is the head of. */
-            u8 order;
-        } free;
-
-    } u;
 #if 0
 // following added for Linux compiling
     page_flags_t flags;
@@ -77,34 +76,46 @@
 
 #define set_page_count(p,v)    atomic_set(&(p)->_count, v - 1)
 
-/* Still small set of flags defined by far on IA-64 */
+/*
+ * Still small set of flags defined by far on IA-64.
+ * IA-64 should make it a definition same as x86_64.
+ */
 /* The following page types are MUTUALLY EXCLUSIVE. */
 #define PGT_none            (0<<29) /* no special uses of this page */
 #define PGT_l1_page_table   (1<<29) /* using this page as an L1 page table? */
 #define PGT_l2_page_table   (2<<29) /* using this page as an L2 page table? */
 #define PGT_l3_page_table   (3<<29) /* using this page as an L3 page table? */
 #define PGT_l4_page_table   (4<<29) /* using this page as an L4 page table? */
-#define PGT_writable_page   (5<<29) /* has writable mappings of this page? */
-#define PGT_type_mask       (5<<29) /* Bits 29-31. */
+ /* Value 5 reserved. See asm-x86/mm.h */
+ /* Value 6 reserved. See asm-x86/mm.h */
+#define PGT_writable_page   (7<<29) /* has writable mappings of this page? */
+#define PGT_type_mask       (7<<29) /* Bits 29-31. */
 
  /* Has this page been validated for use as its current type? */
 #define _PGT_validated      28
 #define PGT_validated       (1<<_PGT_validated)
-/* Owning guest has pinned this page to its current type? */
+ /* Owning guest has pinned this page to its current type? */
 #define _PGT_pinned         27
 #define PGT_pinned          (1U<<_PGT_pinned)
 
-/* 27-bit count of uses of this frame as its current type. */
-#define PGT_count_mask      ((1U<<27)-1)
-
-/* Cleared when the owning guest 'frees' this page. */
+ /* The 27 most significant bits of virt address if this is a page table. */
+#define PGT_va_shift        32
+#define PGT_va_mask         ((unsigned long)((1U<<28)-1)<<PGT_va_shift)
+ /* Is the back pointer still mutable (i.e. not fixed yet)? */
+#define PGT_va_mutable      ((unsigned long)((1U<<28)-1)<<PGT_va_shift)
+ /* Is the back pointer unknown (e.g., p.t. is mapped at multiple VAs)? */
+#define PGT_va_unknown      ((unsigned long)((1U<<28)-2)<<PGT_va_shift)
+
+ /* 16-bit count of uses of this frame as its current type. */
+#define PGT_count_mask      ((1U<<16)-1)
+
+ /* Cleared when the owning guest 'frees' this page. */
 #define _PGC_allocated      31
 #define PGC_allocated       (1U<<_PGC_allocated)
-/* Set when the page is used as a page table */
-#define _PGC_page_table     30
-#define PGC_page_table      (1U<<_PGC_page_table)
-/* 30-bit count of references to this frame. */
-#define PGC_count_mask      ((1U<<30)-1)
+ /* Bit 30 reserved. See asm-x86/mm.h */
+ /* Bit 29 reserved. See asm-x86/mm.h */
+ /* 29-bit count of references to this frame. */
+#define PGC_count_mask      ((1U<<29)-1)
 
 #define IS_XEN_HEAP_FRAME(_pfn) ((page_to_maddr(_pfn) < xenheap_phys_end) \
                                 && (page_to_maddr(_pfn) >= xen_pstart))
@@ -139,7 +150,6 @@
 
 static inline void put_page(struct page_info *page)
 {
-#ifdef VALIDATE_VT     // doesn't work with non-VTI in grant tables yet
     u32 nx, x, y = page->count_info;
 
     do {
@@ -150,14 +160,12 @@
 
     if (unlikely((nx & PGC_count_mask) == 0))
        free_domheap_page(page);
-#endif
 }
 
 /* count_info and ownership are checked atomically. */
 static inline int get_page(struct page_info *page,
                            struct domain *domain)
 {
-#ifdef VALIDATE_VT
     u64 x, nx, y = *((u64*)&page->count_info);
     u32 _domain = pickle_domptr(domain);
 
@@ -173,14 +181,13 @@
            return 0;
        }
     }
-    while(unlikely(y = cmpxchg(&page->count_info, x, nx)) != x);
-#endif
+    while(unlikely((y = cmpxchg((u64*)&page->count_info, x, nx)) != x));
     return 1;
 }
 
-/* No type info now */
-#define put_page_type(page)
-#define get_page_type(page, type) 1
+extern void put_page_type(struct page_info *page);
+extern int get_page_type(struct page_info *page, u32 type);
+
 static inline void put_page_and_type(struct page_info *page)
 {
     put_page_type(page);
@@ -219,7 +226,7 @@
 
 // prototype of misc memory stuff
 //unsigned long __get_free_pages(unsigned int mask, unsigned int order);
-//void __free_pages(struct page *page, unsigned int order);
+//void __free_pages(struct page_info *page, unsigned int order);
 void *pgtable_quicklist_alloc(void);
 void pgtable_quicklist_free(void *pgtable_entry);
 
@@ -339,11 +346,11 @@
 #define NODEZONE_SHIFT (sizeof(page_flags_t)*8 - MAX_NODES_SHIFT - 
MAX_ZONES_SHIFT)
 #define NODEZONE(node, zone)   ((node << ZONES_SHIFT) | zone)
 
-static inline unsigned long page_zonenum(struct page *page)
+static inline unsigned long page_zonenum(struct page_info *page)
 {
        return (page->flags >> NODEZONE_SHIFT) & (~(~0UL << ZONES_SHIFT));
 }
-static inline unsigned long page_to_nid(struct page *page)
+static inline unsigned long page_to_nid(struct page_info *page)
 {
        return (page->flags >> (NODEZONE_SHIFT + ZONES_SHIFT));
 }
@@ -351,12 +358,12 @@
 struct zone;
 extern struct zone *zone_table[];
 
-static inline struct zone *page_zone(struct page *page)
+static inline struct zone *page_zone(struct page_info *page)
 {
        return zone_table[page->flags >> NODEZONE_SHIFT];
 }
 
-static inline void set_page_zone(struct page *page, unsigned long nodezone_num)
+static inline void set_page_zone(struct page_info *page, unsigned long 
nodezone_num)
 {
        page->flags &= ~(~0UL << NODEZONE_SHIFT);
        page->flags |= nodezone_num << NODEZONE_SHIFT;
@@ -367,7 +374,7 @@
 extern unsigned long max_mapnr;
 #endif
 
-static inline void *lowmem_page_address(struct page *page)
+static inline void *lowmem_page_address(struct page_info *page)
 {
        return __va(page_to_mfn(page) << PAGE_SHIFT);
 }
@@ -386,8 +393,8 @@
 #endif
 
 #if defined(HASHED_PAGE_VIRTUAL)
-void *page_address(struct page *page);
-void set_page_address(struct page *page, void *virtual);
+void *page_address(struct page_info *page);
+void set_page_address(struct page_info *page, void *virtual);
 void page_address_init(void);
 #endif
 
@@ -400,7 +407,7 @@
 
 #ifndef CONFIG_DEBUG_PAGEALLOC
 static inline void
-kernel_map_pages(struct page *page, int numpages, int enable)
+kernel_map_pages(struct page_info *page, int numpages, int enable)
 {
 }
 #endif
@@ -415,8 +422,8 @@
 #undef machine_to_phys_mapping
 #define machine_to_phys_mapping        mpt_table
 
-#define INVALID_M2P_ENTRY        (~0U)
-#define VALID_M2P(_e)            (!((_e) & (1U<<63)))
+#define INVALID_M2P_ENTRY        (~0UL)
+#define VALID_M2P(_e)            (!((_e) & (1UL<<63)))
 #define IS_INVALID_M2P_ENTRY(_e) (!VALID_M2P(_e))
 
 #define set_gpfn_from_mfn(mfn, pfn) (machine_to_phys_mapping[(mfn)] = (pfn))
@@ -463,4 +470,6 @@
 /* Arch-specific portion of memory_op hypercall. */
 #define arch_memory_op(op, arg) (-ENOSYS)
 
+extern void assign_domain_page(struct domain *d, unsigned long mpaddr,
+                              unsigned long physaddr);
 #endif /* __ASM_IA64_MM_H__ */
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/regionreg.h
--- a/xen/include/asm-ia64/regionreg.h  Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/regionreg.h  Mon Mar 20 08:56:54 2006
@@ -64,4 +64,13 @@
 // since vmMangleRID is symmetric, use it for unmangling also
 #define vmUnmangleRID(x)       vmMangleRID(x)
 
+extern unsigned long allocate_metaphysical_rr(void);
+
+struct domain;
+extern int allocate_rid_range(struct domain *d, unsigned long ridbits);
+extern int deallocate_rid_range(struct domain *d);
+
+struct vcpu;
+extern void init_all_rr(struct vcpu *v);
+
 #endif         /* !_REGIONREG_H_ */
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/vcpu.h
--- a/xen/include/asm-ia64/vcpu.h       Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/vcpu.h       Mon Mar 20 08:56:54 2006
@@ -7,7 +7,6 @@
 //#include "thread.h"
 #include <asm/ia64_int.h>
 #include <public/arch-ia64.h>
-
 typedef        unsigned long UINT64;
 typedef        unsigned int UINT;
 typedef        int BOOLEAN;
@@ -16,7 +15,10 @@
 
 typedef cpu_user_regs_t REGS;
 
-#define VCPU(_v,_x)    _v->arch.privregs->_x
+
+#define VCPU(_v,_x)    (_v->arch.privregs->_x)
+#define PSCB(_v,_x) VCPU(_v,_x)
+#define PSCBX(_v,_x) (_v->arch._x)
 
 #define PRIVOP_ADDR_COUNT
 #ifdef PRIVOP_ADDR_COUNT
@@ -140,7 +142,9 @@
 extern IA64FAULT vcpu_ptc_ga(VCPU *vcpu, UINT64 vadr, UINT64 addr_range);
 extern IA64FAULT vcpu_ptr_d(VCPU *vcpu,UINT64 vadr, UINT64 addr_range);
 extern IA64FAULT vcpu_ptr_i(VCPU *vcpu,UINT64 vadr, UINT64 addr_range);
-extern IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data, 
UINT64 *pteval, UINT64 *itir, UINT64 *iha);
+extern IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address,
+                               BOOLEAN is_data, BOOLEAN in_tpa,
+                               UINT64 *pteval, UINT64 *itir, UINT64 *iha);
 extern IA64FAULT vcpu_tpa(VCPU *vcpu, UINT64 vadr, UINT64 *padr);
 extern IA64FAULT vcpu_force_data_miss(VCPU *vcpu, UINT64 ifa);
 extern IA64FAULT vcpu_fc(VCPU *vcpu, UINT64 vadr);
@@ -173,4 +177,18 @@
     return (~((1UL << itir_ps(itir)) - 1));
 }
 
+#define verbose(a...) do {if (vcpu_verbose) printf(a);} while(0)
+
+//#define vcpu_quick_region_check(_tr_regions,_ifa) 1
+#define vcpu_quick_region_check(_tr_regions,_ifa)           \
+    (_tr_regions & (1 << ((unsigned long)_ifa >> 61)))
+#define vcpu_quick_region_set(_tr_regions,_ifa)             \
+    do {_tr_regions |= (1 << ((unsigned long)_ifa >> 61)); } while (0)
+
+// FIXME: also need to check && (!trp->key || vcpu_pkr_match(trp->key))
+#define vcpu_match_tr_entry(_trp,_ifa,_rid)             \
+    ((_trp->p && (_trp->rid==_rid) && (_ifa >= _trp->vadr) &&   \
+    (_ifa < (_trp->vadr + (1L<< _trp->ps)) - 1)))
+
+
 #endif
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/vmmu.h
--- a/xen/include/asm-ia64/vmmu.h       Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/vmmu.h       Mon Mar 20 08:56:54 2006
@@ -68,11 +68,14 @@
 } search_section_t;
 
 
-typedef enum {
+enum {
         ISIDE_TLB=0,
         DSIDE_TLB=1
-} CACHE_LINE_TYPE;
-
+};
+#define VTLB_PTE_P_BIT      0
+#define VTLB_PTE_IO_BIT     60
+#define VTLB_PTE_IO         (1UL<<VTLB_PTE_IO_BIT)
+#define VTLB_PTE_P         (1UL<<VTLB_PTE_P_BIT)
 typedef struct thash_data {
     union {
         struct {
@@ -86,18 +89,16 @@
             u64 ppn  : 38; // 12-49
             u64 rv2  :  2; // 50-51
             u64 ed   :  1; // 52
-            u64 ig1  :  3; // 53-55
-            u64 len  :  4; // 56-59
-            u64 ig2  :  3; // 60-63
+            u64 ig1  :  3; // 53-63
         };
         struct {
             u64 __rv1 : 53;    // 0-52
             u64 contiguous : 1; //53
             u64 tc : 1;     // 54 TR or TC
-            CACHE_LINE_TYPE cl : 1; // 55 I side or D side cache line
+            u64 cl : 1; // 55 I side or D side cache line
             // next extension to ig1, only for TLB instance
-            u64 __ig1  :  4; // 56-59
-            u64 locked  : 1;   // 60 entry locked or not
+            u64 len  :  4; // 56-59
+            u64 io  : 1;       // 60 entry is for io or not
             u64 nomap : 1;   // 61 entry cann't be inserted into machine TLB.
             u64 checked : 1; // 62 for VTLB/VHPT sanity check
             u64 invalid : 1; // 63 invalid entry
@@ -112,12 +113,12 @@
             u64 key  : 24; // 8-31
             u64 rv4  : 32; // 32-63
         };
-        struct {
-            u64 __rv3  : 32; // 0-31
+//        struct {
+//            u64 __rv3  : 32; // 0-31
             // next extension to rv4
-            u64 rid  : 24;  // 32-55
-            u64 __rv4  : 8; // 56-63
-        };
+//            u64 rid  : 24;  // 32-55
+//            u64 __rv4  : 8; // 56-63
+//        };
         u64 itir;
     };
     union {
@@ -136,7 +137,8 @@
     };
     union {
         struct thash_data *next;
-        u64  tr_idx;
+        u64  rid;  // only used in guest TR
+//        u64  tr_idx;
     };
 } thash_data_t;
 
@@ -152,7 +154,7 @@
 
 #define INVALID_VHPT(hdata)     ((hdata)->ti)
 #define INVALID_TLB(hdata)      ((hdata)->ti)
-#define INVALID_TR(hdata)      ((hdata)->invalid)
+#define INVALID_TR(hdata)      (!(hdata)->p)
 #define INVALID_ENTRY(hcb, hdata)       INVALID_VHPT(hdata)
 
 /*        ((hcb)->ht==THASH_TLB ? INVALID_TLB(hdata) : INVALID_VHPT(hdata)) */
@@ -199,18 +201,18 @@
 typedef void (REM_THASH_FN)(struct thash_cb *hcb, thash_data_t *entry);
 typedef void (INS_THASH_FN)(struct thash_cb *hcb, thash_data_t *entry, u64 va);
 
-typedef struct tlb_special {
-        thash_data_t     itr[NITRS];
-        thash_data_t     dtr[NDTRS];
-        struct thash_cb  *vhpt;
-} tlb_special_t;
+//typedef struct tlb_special {
+//        thash_data_t     itr[NITRS];
+//        thash_data_t     dtr[NDTRS];
+//        struct thash_cb  *vhpt;
+//} tlb_special_t;
 
 //typedef struct vhpt_cb {
         //u64     pta;    // pta value.
 //        GET_MFN_FN      *get_mfn;
 //        TTAG_FN         *tag_func;
 //} vhpt_special;
-
+/*
 typedef struct thash_internal {
         thash_data_t *hash_base;
         thash_data_t *cur_cch;  // head of overlap search
@@ -227,7 +229,7 @@
         u64     _curva;         // current address to search
         u64     _eva;
 } thash_internal_t;
-
+ */
 #define  THASH_CB_MAGIC         0x55aa00aa55aa55aaUL
 typedef struct thash_cb {
         /* THASH base information */
@@ -243,6 +245,7 @@
         thash_cch_mem_t *cch_freelist;
         struct vcpu *vcpu;
         PTA     pta;
+        struct thash_cb *vhpt;
         /* VTLB/VHPT common information */
 //        FIND_OVERLAP_FN *find_overlap;
 //        FIND_NEXT_OVL_FN *next_overlap;
@@ -251,15 +254,15 @@
 //        REM_NOTIFIER_FN *remove_notifier;
         /* private information */
 //        thash_internal_t  priv;
-        union {
-                tlb_special_t  *ts;
+//        union {
+//                tlb_special_t  *ts;
 //                vhpt_special   *vs;
-        };
+//        };
         // Internal positon information, buffer and storage etc. TBD
 } thash_cb_t;
 
-#define ITR(hcb,id)             ((hcb)->ts->itr[id])
-#define DTR(hcb,id)             ((hcb)->ts->dtr[id])
+//#define ITR(hcb,id)             ((hcb)->ts->itr[id])
+//#define DTR(hcb,id)             ((hcb)->ts->dtr[id])
 #define INVALIDATE_HASH_HEADER(hcb,hash)    INVALIDATE_TLB_HEADER(hash)
 /*              \
 {           if ((hcb)->ht==THASH_TLB){            \
@@ -290,10 +293,10 @@
  *      4: Return the entry in hash table or collision chain.
  *
  */
-extern void thash_vhpt_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va);
+extern void thash_vhpt_insert(thash_cb_t *hcb, u64 pte, u64 itir, u64 ifa);
 //extern void thash_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va);
-extern void thash_tr_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va, int 
idx);
-extern thash_data_t *vtr_find_overlap(thash_cb_t *hcb, thash_data_t *data, 
char cl);
+//extern void thash_tr_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va, 
int idx);
+extern int vtr_find_overlap(struct vcpu *vcpu, u64 va, u64 ps, int is_data);
 extern u64 get_mfn(struct domain *d, u64 gpfn);
 /*
  * Force to delete a found entry no matter TR or foreign map for TLB.
@@ -344,13 +347,8 @@
  *    NOTES:
  *
  */
-extern void thash_purge_entries(thash_cb_t *hcb, 
-                        thash_data_t *in, search_section_t p_sect);
-extern void thash_purge_entries_ex(thash_cb_t *hcb,
-                        u64 rid, u64 va, u64 sz, 
-                        search_section_t p_sect, 
-                        CACHE_LINE_TYPE cl);
-extern void thash_purge_and_insert(thash_cb_t *hcb, thash_data_t *in, u64 va);
+extern void thash_purge_entries(thash_cb_t *hcb, u64 va, u64 ps);
+extern void thash_purge_and_insert(thash_cb_t *hcb, u64 pte, u64 itir, u64 
ifa);
 
 /*
  * Purge all TCs or VHPT entries including those in Hash table.
@@ -363,10 +361,7 @@
  * covering this address rid:va.
  *
  */
-extern thash_data_t *vtlb_lookup(thash_cb_t *hcb, 
-                        thash_data_t *in);
-extern thash_data_t *vtlb_lookup_ex(thash_cb_t *hcb, 
-                        u64 rid, u64 va,CACHE_LINE_TYPE cl);
+extern thash_data_t *vtlb_lookup(thash_cb_t *hcb,u64 va,int is_data);
 extern int thash_lock_tc(thash_cb_t *hcb, u64 va, u64 size, int rid, char cl, 
int lock);
 
 
@@ -381,6 +376,18 @@
 extern thash_data_t * vsa_thash(PTA vpta, u64 va, u64 vrr, u64 *tag);
 extern thash_data_t * vhpt_lookup(u64 va);
 extern void machine_tlb_purge(u64 va, u64 ps);
+extern int fetch_code(struct vcpu *vcpu, u64 gip, u64 *code1, u64 *code2);
+extern void emulate_io_inst(struct vcpu *vcpu, u64 padr, u64 ma);
+extern int vhpt_enabled(struct vcpu *vcpu, uint64_t vadr, vhpt_ref_t ref);
+
+static inline void vmx_vcpu_set_tr (thash_data_t *trp, u64 pte, u64 itir, u64 
va, u64 rid)
+{
+    trp->page_flags = pte;
+    trp->itir = itir;
+    trp->vadr = va;
+    trp->rid = rid;
+}
+
 
 //#define   VTLB_DEBUG
 #ifdef   VTLB_DEBUG
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/vmx_phy_mode.h
--- a/xen/include/asm-ia64/vmx_phy_mode.h       Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/vmx_phy_mode.h       Mon Mar 20 08:56:54 2006
@@ -75,11 +75,11 @@
 #define PHY_PAGE_UC (_PAGE_A|_PAGE_D|_PAGE_P|_PAGE_MA_UC|_PAGE_AR_RWX)
 #define PHY_PAGE_WB (_PAGE_A|_PAGE_D|_PAGE_P|_PAGE_MA_WB|_PAGE_AR_RWX)
 
-#ifdef PHY_16M  /* 16M: large granule for test*/
-#define EMUL_PHY_PAGE_SHIFT 24
-#else   /* 4K: emulated physical page granule */
-#define EMUL_PHY_PAGE_SHIFT 12
-#endif
+//#ifdef PHY_16M  /* 16M: large granule for test*/
+//#define EMUL_PHY_PAGE_SHIFT 24
+//#else   /* 4K: emulated physical page granule */
+//#define EMUL_PHY_PAGE_SHIFT 12
+//#endif
 #define IA64_RSC_MODE       0x0000000000000003
 #define XEN_RR7_RID    (0xf00010)
 #define GUEST_IN_PHY    0x1
@@ -96,8 +96,7 @@
 extern void recover_if_physical_mode(VCPU *vcpu);
 extern void vmx_init_all_rr(VCPU *vcpu);
 extern void vmx_load_all_rr(VCPU *vcpu);
-extern void physical_itlb_miss(VCPU *vcpu, u64 vadr);
-extern void physical_dtlb_miss(VCPU *vcpu, u64 vadr);
+extern void physical_tlb_miss(VCPU *vcpu, u64 vadr, u64 vec);
 /*
  * No sanity check here, since all psr changes have been
  * checked in switch_mm_mode().
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/vmx_platform.h
--- a/xen/include/asm-ia64/vmx_platform.h       Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/vmx_platform.h       Mon Mar 20 08:56:54 2006
@@ -22,7 +22,6 @@
 #include <public/xen.h>
 #include <public/arch-ia64.h>
 #include <asm/hvm/vioapic.h>
-
 struct mmio_list;
 typedef struct virtual_platform_def {
     unsigned long       shared_page_va;
@@ -51,9 +50,8 @@
 } vlapic_t;
 
 extern uint64_t dummy_tmr[];
-#define VCPU(_v,_x)    _v->arch.privregs->_x
-#define VLAPIC_ID(l) (uint16_t)(VCPU((l)->vcpu, lid) >> 16)
-#define VLAPIC_IRR(l) VCPU((l)->vcpu, irr[0])
+#define VLAPIC_ID(l) (uint16_t)(((l)->vcpu->arch.privregs->lid) >> 16)
+#define VLAPIC_IRR(l) ((l)->vcpu->arch.privregs->irr[0])
 struct vlapic* apic_round_robin(struct domain *d, uint8_t dest_mode, uint8_t 
vector, uint32_t bitmap);
 extern int vmx_vcpu_pend_interrupt(struct vcpu *vcpu, uint8_t vector);
 static inline int vlapic_set_irq(struct vlapic *t, uint8_t vec, uint8_t trig)
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/vmx_vcpu.h
--- a/xen/include/asm-ia64/vmx_vcpu.h   Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/vmx_vcpu.h   Mon Mar 20 08:56:54 2006
@@ -66,17 +66,13 @@
 extern IA64FAULT vmx_vcpu_cover(VCPU *vcpu);
 extern thash_cb_t *vmx_vcpu_get_vtlb(VCPU *vcpu);
 extern thash_cb_t *vmx_vcpu_get_vhpt(VCPU *vcpu);
-extern ia64_rr vmx_vcpu_rr(VCPU *vcpu,UINT64 vadr);
 extern IA64FAULT vmx_vcpu_set_rr(VCPU *vcpu, UINT64 reg, UINT64 val);
-#if 0
-extern IA64FAULT vmx_vcpu_get_rr(VCPU *vcpu, UINT64 reg, UINT64 *pval);
-#endif
 extern IA64FAULT vmx_vcpu_get_pkr(VCPU *vcpu, UINT64 reg, UINT64 *pval);
 IA64FAULT vmx_vcpu_set_pkr(VCPU *vcpu, UINT64 reg, UINT64 val);
 extern IA64FAULT vmx_vcpu_itc_i(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 
ifa);
 extern IA64FAULT vmx_vcpu_itc_d(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 
ifa);
-extern IA64FAULT vmx_vcpu_itr_i(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 
ifa, UINT64 idx);
-extern IA64FAULT vmx_vcpu_itr_d(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 
ifa, UINT64 idx);
+extern IA64FAULT vmx_vcpu_itr_i(VCPU *vcpu, UINT64 slot, UINT64 pte, UINT64 
itir, UINT64 ifa);
+extern IA64FAULT vmx_vcpu_itr_d(VCPU *vcpu, UINT64 slot, UINT64 pte, UINT64 
itir, UINT64 ifa);
 extern IA64FAULT vmx_vcpu_ptr_d(VCPU *vcpu,UINT64 vadr,UINT64 ps);
 extern IA64FAULT vmx_vcpu_ptr_i(VCPU *vcpu,UINT64 vadr,UINT64 ps);
 extern IA64FAULT vmx_vcpu_ptc_l(VCPU *vcpu, UINT64 vadr, UINT64 ps);
@@ -102,10 +98,11 @@
 extern void vtm_init(VCPU *vcpu);
 extern uint64_t vtm_get_itc(VCPU *vcpu);
 extern void vtm_set_itc(VCPU *vcpu, uint64_t new_itc);
-extern void vtm_set_itv(VCPU *vcpu);
+extern void vtm_set_itv(VCPU *vcpu, uint64_t val);
+extern void vtm_set_itm(VCPU *vcpu, uint64_t val);
 extern void vtm_interruption_update(VCPU *vcpu, vtime_t* vtm);
-extern void vtm_domain_out(VCPU *vcpu);
-extern void vtm_domain_in(VCPU *vcpu);
+//extern void vtm_domain_out(VCPU *vcpu);
+//extern void vtm_domain_in(VCPU *vcpu);
 extern void vlsapic_reset(VCPU *vcpu);
 extern int vmx_check_pending_irq(VCPU *vcpu);
 extern void guest_write_eoi(VCPU *vcpu);
@@ -255,10 +252,7 @@
 IA64FAULT
 vmx_vcpu_set_itm(VCPU *vcpu, u64 val)
 {
-    vtime_t     *vtm;
-    vtm=&(vcpu->arch.arch_vmx.vtm);
-    VCPU(vcpu,itm)=val;
-    vtm_interruption_update(vcpu, vtm);
+    vtm_set_itm(vcpu, val);
     return IA64_NO_FAULT;
 }
 static inline
@@ -299,8 +293,7 @@
 vmx_vcpu_set_itv(VCPU *vcpu, u64 val)
 {
 
-    VCPU(vcpu,itv)=val;
-    vtm_set_itv(vcpu);
+    vtm_set_itv(vcpu, val);
     return IA64_NO_FAULT;
 }
 static inline
@@ -350,12 +343,14 @@
     *val = vtm_get_itc(vcpu);
     return  IA64_NO_FAULT;
 }
+/*
 static inline
 IA64FAULT vmx_vcpu_get_rr(VCPU *vcpu, UINT64 reg, UINT64 *pval)
 {
     *pval = VMX(vcpu,vrr[reg>>61]);
     return (IA64_NO_FAULT);
 }
+ */
 /**************************************************************************
  VCPU debug breakpoint register access routines
 **************************************************************************/
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/vtm.h
--- a/xen/include/asm-ia64/vtm.h        Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/vtm.h        Mon Mar 20 08:56:54 2006
@@ -63,5 +63,4 @@
 
 #define         VTM_FIRED(vtm)         ((vtm)->triggered)
 
-extern void vtm_init();
 #endif /* _STATS_H_ */
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-x86/domain.h
--- a/xen/include/asm-x86/domain.h      Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-x86/domain.h      Mon Mar 20 08:56:54 2006
@@ -124,6 +124,9 @@
 
     void (*schedule_tail) (struct vcpu *);
 
+    void (*ctxt_switch_from) (struct vcpu *);
+    void (*ctxt_switch_to) (struct vcpu *);
+
     /* Bounce information for propagating an exception to guest OS. */
     struct trap_bounce trap_bounce;
 
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-x86/hvm/domain.h
--- a/xen/include/asm-x86/hvm/domain.h  Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-x86/hvm/domain.h  Mon Mar 20 08:56:54 2006
@@ -37,6 +37,7 @@
     unsigned int           pae_enabled;
 
     struct hvm_virpit      vpit;
+    u64                    guest_time;
     struct hvm_virpic      vpic;
     struct hvm_vioapic     vioapic;
     struct hvm_io_handler  io_handler;
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h     Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-x86/hvm/hvm.h     Mon Mar 20 08:56:54 2006
@@ -41,18 +41,11 @@
     /*
      * Store and load guest state:
      * 1) load/store guest register state,
-     * 2) load/store segment state (x86_64 only),
-     * 3) load/store msr register state (x86_64 only),
-     * 4) store guest control register state (used for panic dumps),
-     * 5) modify guest state (e.g., set debug flags).
+     * 2) store guest control register state (used for panic dumps),
+     * 3) modify guest state (e.g., set debug flags).
      */
     void (*store_cpu_guest_regs)(struct vcpu *v, struct cpu_user_regs *r);
     void (*load_cpu_guest_regs)(struct vcpu *v, struct cpu_user_regs *r);
-#ifdef __x86_64__
-    void (*save_segments)(struct vcpu *v);
-    void (*load_msrs)(void);
-    void (*restore_msrs)(struct vcpu *v);
-#endif
     void (*store_cpu_guest_ctrl_regs)(struct vcpu *v, unsigned long crs[8]);
     void (*modify_guest_state)(struct vcpu *v);
 
@@ -111,33 +104,6 @@
     hvm_funcs.load_cpu_guest_regs(v, r);
 }
 
-#ifdef __x86_64__
-static inline void
-hvm_save_segments(struct vcpu *v)
-{
-    if (hvm_funcs.save_segments)
-        hvm_funcs.save_segments(v);
-}
-
-static inline void
-hvm_load_msrs(void)
-{
-    if (hvm_funcs.load_msrs)
-        hvm_funcs.load_msrs();
-}
-
-static inline void
-hvm_restore_msrs(struct vcpu *v)
-{
-    if (hvm_funcs.restore_msrs)
-        hvm_funcs.restore_msrs(v);
-}
-#else
-#define hvm_save_segments(v)    ((void)0)
-#define hvm_load_msrs(v)        ((void)0)
-#define hvm_restore_msrs(v)     ((void)0)
-#endif /* __x86_64__ */
-
 static inline void
 hvm_store_cpu_guest_ctrl_regs(struct vcpu *v, unsigned long crs[8])
 {
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-x86/hvm/vmx/vmcs.h
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h        Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h        Mon Mar 20 08:56:54 2006
@@ -77,7 +77,6 @@
     unsigned long           cpu_based_exec_control;
     struct vmx_msr_state    msr_content;
     void                    *io_bitmap_a, *io_bitmap_b;
-    u64                     tsc_offset;
     struct timer            hlt_timer;  /* hlt ins emulation wakeup timer */
 };
 
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-x86/hvm/vmx/vmx.h
--- a/xen/include/asm-x86/hvm/vmx/vmx.h Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h Mon Mar 20 08:56:54 2006
@@ -30,10 +30,11 @@
 extern void vmx_asm_do_resume(void);
 extern void vmx_asm_do_launch(void);
 extern void vmx_intr_assist(void);
-extern void vmx_set_tsc_shift(struct vcpu *, struct hvm_virpit *);
 extern void vmx_migrate_timers(struct vcpu *v);
 extern void arch_vmx_do_launch(struct vcpu *);
 extern void arch_vmx_do_resume(struct vcpu *);
+extern void set_guest_time(struct vcpu *v, u64 gtime);
+extern u64  get_guest_time(struct vcpu *v);
 
 extern unsigned int cpu_rev;
 
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-x86/hvm/vpit.h
--- a/xen/include/asm-x86/hvm/vpit.h    Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-x86/hvm/vpit.h    Mon Mar 20 08:56:54 2006
@@ -38,7 +38,6 @@
 struct hvm_virpit {
     /* for simulation of counter 0 in mode 2 */
     u64 period_cycles;          /* pit frequency in cpu cycles */
-    u64 shift;                  /* save the value of offset - drift */
     s_time_t inject_point;      /* the time inject virt intr */
     s_time_t scheduled;         /* scheduled timer interrupt */
     struct timer pit_timer;     /* periodic timer for mode 2*/
@@ -46,6 +45,8 @@
     unsigned int pending_intr_nr; /* the couner for pending timer interrupts */
     u32 period;                 /* pit frequency in ns */
     int first_injected;         /* flag to prevent shadow window */
+    s64 cache_tsc_offset;       /* cache of VMCS TSC_OFFSET offset */
+    u64 last_pit_gtime;         /* guest time when last pit is injected */
 
     /* virtual PIT state for handle related I/O */
     int read_state;
diff -r 516cf6553011 -r cf89e8f0831b 
patches/linux-2.6.16-rc6/i386-mach-io-check-nmi.patch
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/patches/linux-2.6.16-rc6/i386-mach-io-check-nmi.patch     Mon Mar 20 
08:56:54 2006
@@ -0,0 +1,45 @@
+diff -pruN ../pristine-linux-2.6.16-rc6/arch/i386/kernel/traps.c 
./arch/i386/kernel/traps.c
+--- ../pristine-linux-2.6.16-rc6/arch/i386/kernel/traps.c      2006-03-17 
22:59:01.000000000 +0000
++++ ./arch/i386/kernel/traps.c 2006-03-17 23:04:16.000000000 +0000
+@@ -567,18 +567,11 @@ static void mem_parity_error(unsigned ch
+ 
+ static void io_check_error(unsigned char reason, struct pt_regs * regs)
+ {
+-      unsigned long i;
+-
+       printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
+       show_registers(regs);
+ 
+       /* Re-enable the IOCK line, wait for a few seconds */
+-      reason = (reason & 0xf) | 8;
+-      outb(reason, 0x61);
+-      i = 2000;
+-      while (--i) udelay(1000);
+-      reason &= ~8;
+-      outb(reason, 0x61);
++      clear_io_check_error(reason);
+ }
+ 
+ static void unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
+diff -pruN 
../pristine-linux-2.6.16-rc6/include/asm-i386/mach-default/mach_traps.h 
./include/asm-i386/mach-default/mach_traps.h
+--- ../pristine-linux-2.6.16-rc6/include/asm-i386/mach-default/mach_traps.h    
2006-01-03 03:21:10.000000000 +0000
++++ ./include/asm-i386/mach-default/mach_traps.h       2006-03-17 
23:04:16.000000000 +0000
+@@ -15,6 +15,18 @@ static inline void clear_mem_error(unsig
+       outb(reason, 0x61);
+ }
+ 
++static inline void clear_io_check_error(unsigned char reason)
++{
++      unsigned long i;
++
++      reason = (reason & 0xf) | 8;
++      outb(reason, 0x61);
++      i = 2000;
++      while (--i) udelay(1000);
++      reason &= ~8;
++      outb(reason, 0x61);
++}
++
+ static inline unsigned char get_nmi_reason(void)
+ {
+       return inb(0x61);
diff -r 516cf6553011 -r cf89e8f0831b patches/linux-2.6.16-rc6/net-csum.patch
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/patches/linux-2.6.16-rc6/net-csum.patch   Mon Mar 20 08:56:54 2006
@@ -0,0 +1,41 @@
+diff -pruN ../pristine-linux-2.6.16-rc6/net/ipv4/netfilter/ip_nat_proto_tcp.c 
./net/ipv4/netfilter/ip_nat_proto_tcp.c
+--- ../pristine-linux-2.6.16-rc6/net/ipv4/netfilter/ip_nat_proto_tcp.c 
2006-03-17 22:59:16.000000000 +0000
++++ ./net/ipv4/netfilter/ip_nat_proto_tcp.c    2006-03-17 23:04:19.000000000 
+0000
+@@ -129,10 +129,14 @@ tcp_manip_pkt(struct sk_buff **pskb,
+       if (hdrsize < sizeof(*hdr))
+               return 1;
+ 
+-      hdr->check = ip_nat_cheat_check(~oldip, newip,
++      if ((*pskb)->proto_csum_blank) {
++              hdr->check = ip_nat_cheat_check(oldip, ~newip, hdr->check);
++      } else {
++              hdr->check = ip_nat_cheat_check(~oldip, newip,
+                                       ip_nat_cheat_check(oldport ^ 0xFFFF,
+                                                          newport,
+                                                          hdr->check));
++      }
+       return 1;
+ }
+ 
+diff -pruN ../pristine-linux-2.6.16-rc6/net/ipv4/netfilter/ip_nat_proto_udp.c 
./net/ipv4/netfilter/ip_nat_proto_udp.c
+--- ../pristine-linux-2.6.16-rc6/net/ipv4/netfilter/ip_nat_proto_udp.c 
2006-03-17 22:59:16.000000000 +0000
++++ ./net/ipv4/netfilter/ip_nat_proto_udp.c    2006-03-17 23:04:19.000000000 
+0000
+@@ -113,11 +113,16 @@ udp_manip_pkt(struct sk_buff **pskb,
+               newport = tuple->dst.u.udp.port;
+               portptr = &hdr->dest;
+       }
+-      if (hdr->check) /* 0 is a special case meaning no checksum */
+-              hdr->check = ip_nat_cheat_check(~oldip, newip,
++      if (hdr->check) { /* 0 is a special case meaning no checksum */
++              if ((*pskb)->proto_csum_blank) {
++                      hdr->check = ip_nat_cheat_check(oldip, ~newip, 
hdr->check);
++              } else {
++                      hdr->check = ip_nat_cheat_check(~oldip, newip,
+                                       ip_nat_cheat_check(*portptr ^ 0xFFFF,
+                                                          newport,
+                                                          hdr->check));
++              }
++      }
+       *portptr = newport;
+       return 1;
+ }
diff -r 516cf6553011 -r cf89e8f0831b patches/linux-2.6.16-rc6/pmd-shared.patch
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/patches/linux-2.6.16-rc6/pmd-shared.patch Mon Mar 20 08:56:54 2006
@@ -0,0 +1,111 @@
+diff -pruN ../pristine-linux-2.6.16-rc6/arch/i386/mm/pageattr.c 
./arch/i386/mm/pageattr.c
+--- ../pristine-linux-2.6.16-rc6/arch/i386/mm/pageattr.c       2006-03-17 
22:59:01.000000000 +0000
++++ ./arch/i386/mm/pageattr.c  2006-03-17 23:04:21.000000000 +0000
+@@ -78,7 +78,7 @@ static void set_pmd_pte(pte_t *kpte, uns
+       unsigned long flags;
+ 
+       set_pte_atomic(kpte, pte);      /* change init_mm */
+-      if (PTRS_PER_PMD > 1)
++      if (HAVE_SHARED_KERNEL_PMD)
+               return;
+ 
+       spin_lock_irqsave(&pgd_lock, flags);
+diff -pruN ../pristine-linux-2.6.16-rc6/arch/i386/mm/pgtable.c 
./arch/i386/mm/pgtable.c
+--- ../pristine-linux-2.6.16-rc6/arch/i386/mm/pgtable.c        2006-01-03 
03:21:10.000000000 +0000
++++ ./arch/i386/mm/pgtable.c   2006-03-17 23:04:21.000000000 +0000
+@@ -215,9 +215,10 @@ void pgd_ctor(void *pgd, kmem_cache_t *c
+               spin_lock_irqsave(&pgd_lock, flags);
+       }
+ 
+-      clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
+-                      swapper_pg_dir + USER_PTRS_PER_PGD,
+-                      KERNEL_PGD_PTRS);
++      if (PTRS_PER_PMD == 1 || HAVE_SHARED_KERNEL_PMD)
++              clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
++                              swapper_pg_dir + USER_PTRS_PER_PGD,
++                              KERNEL_PGD_PTRS);
+       if (PTRS_PER_PMD > 1)
+               return;
+ 
+@@ -249,6 +250,30 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
+                       goto out_oom;
+               set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
+       }
++
++      if (!HAVE_SHARED_KERNEL_PMD) {
++              unsigned long flags;
++
++              for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
++                      pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
++                      if (!pmd)
++                              goto out_oom;
++                      set_pgd(&pgd[USER_PTRS_PER_PGD], __pgd(1 + __pa(pmd)));
++              }
++
++              spin_lock_irqsave(&pgd_lock, flags);
++              for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
++                      unsigned long v = (unsigned long)i << PGDIR_SHIFT;
++                      pgd_t *kpgd = pgd_offset_k(v);
++                      pud_t *kpud = pud_offset(kpgd, v);
++                      pmd_t *kpmd = pmd_offset(kpud, v);
++                      pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
++                      memcpy(pmd, kpmd, PAGE_SIZE);
++              }
++              pgd_list_add(pgd);
++              spin_unlock_irqrestore(&pgd_lock, flags);
++      }
++
+       return pgd;
+ 
+ out_oom:
+@@ -263,9 +288,23 @@ void pgd_free(pgd_t *pgd)
+       int i;
+ 
+       /* in the PAE case user pgd entries are overwritten before usage */
+-      if (PTRS_PER_PMD > 1)
+-              for (i = 0; i < USER_PTRS_PER_PGD; ++i)
+-                      kmem_cache_free(pmd_cache, (void 
*)__va(pgd_val(pgd[i])-1));
++      if (PTRS_PER_PMD > 1) {
++              for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
++                      pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
++                      kmem_cache_free(pmd_cache, pmd);
++              }
++              if (!HAVE_SHARED_KERNEL_PMD) {
++                      unsigned long flags;
++                      spin_lock_irqsave(&pgd_lock, flags);
++                      pgd_list_del(pgd);
++                      spin_unlock_irqrestore(&pgd_lock, flags);
++                      for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
++                              pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
++                              memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
++                              kmem_cache_free(pmd_cache, pmd);
++                      }
++              }
++      }
+       /* in the non-PAE case, free_pgtables() clears user pgd entries */
+       kmem_cache_free(pgd_cache, pgd);
+ }
+diff -pruN ../pristine-linux-2.6.16-rc6/include/asm-i386/pgtable-2level-defs.h 
./include/asm-i386/pgtable-2level-defs.h
+--- ../pristine-linux-2.6.16-rc6/include/asm-i386/pgtable-2level-defs.h        
2006-01-03 03:21:10.000000000 +0000
++++ ./include/asm-i386/pgtable-2level-defs.h   2006-03-17 23:04:21.000000000 
+0000
+@@ -1,6 +1,8 @@
+ #ifndef _I386_PGTABLE_2LEVEL_DEFS_H
+ #define _I386_PGTABLE_2LEVEL_DEFS_H
+ 
++#define HAVE_SHARED_KERNEL_PMD 0
++
+ /*
+  * traditional i386 two-level paging structure:
+  */
+diff -pruN ../pristine-linux-2.6.16-rc6/include/asm-i386/pgtable-3level-defs.h 
./include/asm-i386/pgtable-3level-defs.h
+--- ../pristine-linux-2.6.16-rc6/include/asm-i386/pgtable-3level-defs.h        
2006-01-03 03:21:10.000000000 +0000
++++ ./include/asm-i386/pgtable-3level-defs.h   2006-03-17 23:04:21.000000000 
+0000
+@@ -1,6 +1,8 @@
+ #ifndef _I386_PGTABLE_3LEVEL_DEFS_H
+ #define _I386_PGTABLE_3LEVEL_DEFS_H
+ 
++#define HAVE_SHARED_KERNEL_PMD 1
++
+ /*
+  * PGDIR_SHIFT determines what a top-level page table entry can map
+  */
diff -r 516cf6553011 -r cf89e8f0831b patches/linux-2.6.16-rc6/smp-alts.patch
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/patches/linux-2.6.16-rc6/smp-alts.patch   Mon Mar 20 08:56:54 2006
@@ -0,0 +1,591 @@
+diff -pruN ../pristine-linux-2.6.16-rc6/arch/i386/Kconfig ./arch/i386/Kconfig
+--- ../pristine-linux-2.6.16-rc6/arch/i386/Kconfig     2006-03-17 
22:59:01.000000000 +0000
++++ ./arch/i386/Kconfig        2006-03-17 23:04:23.000000000 +0000
+@@ -202,6 +202,19 @@ config SMP
+ 
+         If you don't know what to do here, say N.
+ 
++config SMP_ALTERNATIVES
++      bool "SMP alternatives support (EXPERIMENTAL)"
++      depends on SMP && EXPERIMENTAL
++      help
++        Try to reduce the overhead of running an SMP kernel on a uniprocessor
++        host slightly by replacing certain key instruction sequences
++        according to whether we currently have more than one CPU available.
++        This should provide a noticeable boost to performance when
++        running SMP kernels on UP machines, and have negligible impact
++        when running on an true SMP host.
++
++          If unsure, say N.
++        
+ config NR_CPUS
+       int "Maximum number of CPUs (2-255)"
+       range 2 255
+diff -pruN ../pristine-linux-2.6.16-rc6/arch/i386/kernel/Makefile 
./arch/i386/kernel/Makefile
+--- ../pristine-linux-2.6.16-rc6/arch/i386/kernel/Makefile     2006-03-17 
22:59:01.000000000 +0000
++++ ./arch/i386/kernel/Makefile        2006-03-17 23:04:23.000000000 +0000
+@@ -37,6 +37,7 @@ obj-$(CONFIG_EFI)            += efi.o efi_stub.o
+ obj-$(CONFIG_DOUBLEFAULT)     += doublefault.o
+ obj-$(CONFIG_VM86)            += vm86.o
+ obj-$(CONFIG_EARLY_PRINTK)    += early_printk.o
++obj-$(CONFIG_SMP_ALTERNATIVES)  += smpalts.o
+ 
+ EXTRA_AFLAGS   := -traditional
+ 
+diff -pruN ../pristine-linux-2.6.16-rc6/arch/i386/kernel/smpalts.c 
./arch/i386/kernel/smpalts.c
+--- ../pristine-linux-2.6.16-rc6/arch/i386/kernel/smpalts.c    1970-01-01 
01:00:00.000000000 +0100
++++ ./arch/i386/kernel/smpalts.c       2006-03-17 23:04:23.000000000 +0000
+@@ -0,0 +1,85 @@
++#include <linux/kernel.h>
++#include <asm/system.h>
++#include <asm/smp_alt.h>
++#include <asm/processor.h>
++#include <asm/string.h>
++
++struct smp_replacement_record {
++      unsigned char targ_size;
++      unsigned char smp1_size;
++      unsigned char smp2_size;
++      unsigned char up_size;
++      unsigned char feature;
++      unsigned char data[0];
++};
++
++struct smp_alternative_record {
++      void *targ_start;
++      struct smp_replacement_record *repl;
++};
++
++extern struct smp_alternative_record __start_smp_alternatives_table,
++  __stop_smp_alternatives_table;
++extern unsigned long __init_begin, __init_end;
++
++void prepare_for_smp(void)
++{
++      struct smp_alternative_record *r;
++      printk(KERN_INFO "Enabling SMP...\n");
++      for (r = &__start_smp_alternatives_table;
++           r != &__stop_smp_alternatives_table;
++           r++) {
++              BUG_ON(r->repl->targ_size < r->repl->smp1_size);
++              BUG_ON(r->repl->targ_size < r->repl->smp2_size);
++              BUG_ON(r->repl->targ_size < r->repl->up_size);
++               if (system_state == SYSTEM_RUNNING &&
++                   r->targ_start >= (void *)&__init_begin &&
++                   r->targ_start < (void *)&__init_end)
++                       continue;
++              if (r->repl->feature != (unsigned char)-1 &&
++                  boot_cpu_has(r->repl->feature)) {
++                      memcpy(r->targ_start,
++                             r->repl->data + r->repl->smp1_size,
++                             r->repl->smp2_size);
++                      memset(r->targ_start + r->repl->smp2_size,
++                             0x90,
++                             r->repl->targ_size - r->repl->smp2_size);
++              } else {
++                      memcpy(r->targ_start,
++                             r->repl->data,
++                             r->repl->smp1_size);
++                      memset(r->targ_start + r->repl->smp1_size,
++                             0x90,
++                             r->repl->targ_size - r->repl->smp1_size);
++              }
++      }
++      /* Paranoia */
++      asm volatile ("jmp 1f\n1:");
++      mb();
++}
++
++void unprepare_for_smp(void)
++{
++      struct smp_alternative_record *r;
++      printk(KERN_INFO "Disabling SMP...\n");
++      for (r = &__start_smp_alternatives_table;
++           r != &__stop_smp_alternatives_table;
++           r++) {
++              BUG_ON(r->repl->targ_size < r->repl->smp1_size);
++              BUG_ON(r->repl->targ_size < r->repl->smp2_size);
++              BUG_ON(r->repl->targ_size < r->repl->up_size);
++               if (system_state == SYSTEM_RUNNING &&
++                   r->targ_start >= (void *)&__init_begin &&
++                   r->targ_start < (void *)&__init_end)
++                       continue;
++              memcpy(r->targ_start,
++                     r->repl->data + r->repl->smp1_size + r->repl->smp2_size,
++                     r->repl->up_size);
++              memset(r->targ_start + r->repl->up_size,
++                     0x90,
++                     r->repl->targ_size - r->repl->up_size);
++      }
++      /* Paranoia */
++      asm volatile ("jmp 1f\n1:");
++      mb();
++}
+diff -pruN ../pristine-linux-2.6.16-rc6/arch/i386/kernel/smpboot.c 
./arch/i386/kernel/smpboot.c
+--- ../pristine-linux-2.6.16-rc6/arch/i386/kernel/smpboot.c    2006-03-17 
22:59:01.000000000 +0000
++++ ./arch/i386/kernel/smpboot.c       2006-03-17 23:04:23.000000000 +0000
+@@ -1208,6 +1208,11 @@ static void __init smp_boot_cpus(unsigne
+               if (max_cpus <= cpucount+1)
+                       continue;
+ 
++#ifdef CONFIG_SMP_ALTERNATIVES
++              if (kicked == 1)
++                      prepare_for_smp();
++#endif
++
+               if (((cpu = alloc_cpu_id()) <= 0) || do_boot_cpu(apicid, cpu))
+                       printk("CPU #%d not responding - cannot use it.\n",
+                                                               apicid);
+@@ -1386,6 +1391,11 @@ int __devinit __cpu_up(unsigned int cpu)
+               return -EIO;
+       }
+ 
++#ifdef CONFIG_SMP_ALTERNATIVES
++      if (num_online_cpus() == 1)
++              prepare_for_smp();
++#endif
++
+       local_irq_enable();
+       per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
+       /* Unleash the CPU! */
+diff -pruN ../pristine-linux-2.6.16-rc6/arch/i386/kernel/vmlinux.lds.S 
./arch/i386/kernel/vmlinux.lds.S
+--- ../pristine-linux-2.6.16-rc6/arch/i386/kernel/vmlinux.lds.S        
2006-01-03 03:21:10.000000000 +0000
++++ ./arch/i386/kernel/vmlinux.lds.S   2006-03-17 23:04:23.000000000 +0000
+@@ -34,6 +34,13 @@ SECTIONS
+   __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { *(__ex_table) }
+   __stop___ex_table = .;
+ 
++  . = ALIGN(16);
++  __start_smp_alternatives_table = .;
++  __smp_alternatives : { *(__smp_alternatives) }
++  __stop_smp_alternatives_table = .;
++
++  __smp_replacements : { *(__smp_replacements) }
++
+   RODATA
+ 
+   /* writeable */
+diff -pruN ../pristine-linux-2.6.16-rc6/include/asm-i386/atomic.h 
./include/asm-i386/atomic.h
+--- ../pristine-linux-2.6.16-rc6/include/asm-i386/atomic.h     2006-03-17 
22:59:05.000000000 +0000
++++ ./include/asm-i386/atomic.h        2006-03-17 23:04:23.000000000 +0000
+@@ -4,18 +4,13 @@
+ #include <linux/config.h>
+ #include <linux/compiler.h>
+ #include <asm/processor.h>
++#include <asm/smp_alt.h>
+ 
+ /*
+  * Atomic operations that C can't guarantee us.  Useful for
+  * resource counting etc..
+  */
+ 
+-#ifdef CONFIG_SMP
+-#define LOCK "lock ; "
+-#else
+-#define LOCK ""
+-#endif
+-
+ /*
+  * Make sure gcc doesn't try to be clever and move things around
+  * on us. We need to use _exactly_ the address the user gave us,
+diff -pruN ../pristine-linux-2.6.16-rc6/include/asm-i386/bitops.h 
./include/asm-i386/bitops.h
+--- ../pristine-linux-2.6.16-rc6/include/asm-i386/bitops.h     2006-03-17 
22:59:05.000000000 +0000
++++ ./include/asm-i386/bitops.h        2006-03-17 23:04:23.000000000 +0000
+@@ -7,6 +7,7 @@
+ 
+ #include <linux/config.h>
+ #include <linux/compiler.h>
++#include <asm/smp_alt.h>
+ 
+ /*
+  * These have to be done with inline assembly: that way the bit-setting
+@@ -16,12 +17,6 @@
+  * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
+  */
+ 
+-#ifdef CONFIG_SMP
+-#define LOCK_PREFIX "lock ; "
+-#else
+-#define LOCK_PREFIX ""
+-#endif
+-
+ #define ADDR (*(volatile long *) addr)
+ 
+ /**
+@@ -41,7 +36,7 @@
+  */
+ static inline void set_bit(int nr, volatile unsigned long * addr)
+ {
+-      __asm__ __volatile__( LOCK_PREFIX
++      __asm__ __volatile__( LOCK
+               "btsl %1,%0"
+               :"+m" (ADDR)
+               :"Ir" (nr));
+@@ -76,7 +71,7 @@ static inline void __set_bit(int nr, vol
+  */
+ static inline void clear_bit(int nr, volatile unsigned long * addr)
+ {
+-      __asm__ __volatile__( LOCK_PREFIX
++      __asm__ __volatile__( LOCK
+               "btrl %1,%0"
+               :"+m" (ADDR)
+               :"Ir" (nr));
+@@ -121,7 +116,7 @@ static inline void __change_bit(int nr, 
+  */
+ static inline void change_bit(int nr, volatile unsigned long * addr)
+ {
+-      __asm__ __volatile__( LOCK_PREFIX
++      __asm__ __volatile__( LOCK
+               "btcl %1,%0"
+               :"+m" (ADDR)
+               :"Ir" (nr));
+@@ -140,7 +135,7 @@ static inline int test_and_set_bit(int n
+ {
+       int oldbit;
+ 
+-      __asm__ __volatile__( LOCK_PREFIX
++      __asm__ __volatile__( LOCK
+               "btsl %2,%1\n\tsbbl %0,%0"
+               :"=r" (oldbit),"+m" (ADDR)
+               :"Ir" (nr) : "memory");
+@@ -180,7 +175,7 @@ static inline int test_and_clear_bit(int
+ {
+       int oldbit;
+ 
+-      __asm__ __volatile__( LOCK_PREFIX
++      __asm__ __volatile__( LOCK
+               "btrl %2,%1\n\tsbbl %0,%0"
+               :"=r" (oldbit),"+m" (ADDR)
+               :"Ir" (nr) : "memory");
+@@ -231,7 +226,7 @@ static inline int test_and_change_bit(in
+ {
+       int oldbit;
+ 
+-      __asm__ __volatile__( LOCK_PREFIX
++      __asm__ __volatile__( LOCK
+               "btcl %2,%1\n\tsbbl %0,%0"
+               :"=r" (oldbit),"+m" (ADDR)
+               :"Ir" (nr) : "memory");
+diff -pruN ../pristine-linux-2.6.16-rc6/include/asm-i386/futex.h 
./include/asm-i386/futex.h
+--- ../pristine-linux-2.6.16-rc6/include/asm-i386/futex.h      2006-03-17 
22:59:05.000000000 +0000
++++ ./include/asm-i386/futex.h 2006-03-17 23:04:23.000000000 +0000
+@@ -28,7 +28,7 @@
+ "1:   movl    %2, %0\n\
+       movl    %0, %3\n"                                       \
+       insn "\n"                                               \
+-"2:   " LOCK_PREFIX "cmpxchgl %3, %2\n\
++"2:   " LOCK "cmpxchgl %3, %2\n\
+       jnz     1b\n\
+ 3:    .section .fixup,\"ax\"\n\
+ 4:    mov     %5, %1\n\
+@@ -68,7 +68,7 @@ futex_atomic_op_inuser (int encoded_op, 
+ #endif
+               switch (op) {
+               case FUTEX_OP_ADD:
+-                      __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret,
++                      __futex_atomic_op1(LOCK "xaddl %0, %2", ret,
+                                          oldval, uaddr, oparg);
+                       break;
+               case FUTEX_OP_OR:
+diff -pruN ../pristine-linux-2.6.16-rc6/include/asm-i386/rwsem.h 
./include/asm-i386/rwsem.h
+--- ../pristine-linux-2.6.16-rc6/include/asm-i386/rwsem.h      2006-01-03 
03:21:10.000000000 +0000
++++ ./include/asm-i386/rwsem.h 2006-03-17 23:04:23.000000000 +0000
+@@ -40,6 +40,7 @@
+ 
+ #include <linux/list.h>
+ #include <linux/spinlock.h>
++#include <asm/smp_alt.h>
+ 
+ struct rwsem_waiter;
+ 
+@@ -99,7 +100,7 @@ static inline void __down_read(struct rw
+ {
+       __asm__ __volatile__(
+               "# beginning down_read\n\t"
+-LOCK_PREFIX   "  incl      (%%eax)\n\t" /* adds 0x00000001, returns the old 
value */
++LOCK          "  incl      (%%eax)\n\t" /* adds 0x00000001, returns the old 
value */
+               "  js        2f\n\t" /* jump if we weren't granted the lock */
+               "1:\n\t"
+               LOCK_SECTION_START("")
+@@ -130,7 +131,7 @@ static inline int __down_read_trylock(st
+               "  movl      %1,%2\n\t"
+               "  addl      %3,%2\n\t"
+               "  jle       2f\n\t"
+-LOCK_PREFIX   "  cmpxchgl  %2,%0\n\t"
++LOCK          "  cmpxchgl  %2,%0\n\t"
+               "  jnz       1b\n\t"
+               "2:\n\t"
+               "# ending __down_read_trylock\n\t"
+@@ -150,7 +151,7 @@ static inline void __down_write(struct r
+       tmp = RWSEM_ACTIVE_WRITE_BIAS;
+       __asm__ __volatile__(
+               "# beginning down_write\n\t"
+-LOCK_PREFIX   "  xadd      %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns 
the old value */
++LOCK          "  xadd      %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns 
the old value */
+               "  testl     %%edx,%%edx\n\t" /* was the count 0 before? */
+               "  jnz       2f\n\t" /* jump if we weren't granted the lock */
+               "1:\n\t"
+@@ -188,7 +189,7 @@ static inline void __up_read(struct rw_s
+       __s32 tmp = -RWSEM_ACTIVE_READ_BIAS;
+       __asm__ __volatile__(
+               "# beginning __up_read\n\t"
+-LOCK_PREFIX   "  xadd      %%edx,(%%eax)\n\t" /* subtracts 1, returns the old 
value */
++LOCK          "  xadd      %%edx,(%%eax)\n\t" /* subtracts 1, returns the old 
value */
+               "  js        2f\n\t" /* jump if the lock is being waited upon */
+               "1:\n\t"
+               LOCK_SECTION_START("")
+@@ -214,7 +215,7 @@ static inline void __up_write(struct rw_
+       __asm__ __volatile__(
+               "# beginning __up_write\n\t"
+               "  movl      %2,%%edx\n\t"
+-LOCK_PREFIX   "  xaddl     %%edx,(%%eax)\n\t" /* tries to transition 
0xffff0001 -> 0x00000000 */
++LOCK          "  xaddl     %%edx,(%%eax)\n\t" /* tries to transition 
0xffff0001 -> 0x00000000 */
+               "  jnz       2f\n\t" /* jump if the lock is being waited upon */
+               "1:\n\t"
+               LOCK_SECTION_START("")
+@@ -239,7 +240,7 @@ static inline void __downgrade_write(str
+ {
+       __asm__ __volatile__(
+               "# beginning __downgrade_write\n\t"
+-LOCK_PREFIX   "  addl      %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 -> 
0xYYYY0001 */
++LOCK          "  addl      %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 -> 
0xYYYY0001 */
+               "  js        2f\n\t" /* jump if the lock is being waited upon */
+               "1:\n\t"
+               LOCK_SECTION_START("")
+@@ -263,7 +264,7 @@ LOCK_PREFIX        "  addl      %2,(%%eax)\n\t"
+ static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem)
+ {
+       __asm__ __volatile__(
+-LOCK_PREFIX   "addl %1,%0"
++LOCK            "addl %1,%0"
+               : "=m"(sem->count)
+               : "ir"(delta), "m"(sem->count));
+ }
+@@ -276,7 +277,7 @@ static inline int rwsem_atomic_update(in
+       int tmp = delta;
+ 
+       __asm__ __volatile__(
+-LOCK_PREFIX   "xadd %0,(%2)"
++LOCK                    "xadd %0,(%2)"
+               : "+r"(tmp), "=m"(sem->count)
+               : "r"(sem), "m"(sem->count)
+               : "memory");
+diff -pruN ../pristine-linux-2.6.16-rc6/include/asm-i386/smp_alt.h 
./include/asm-i386/smp_alt.h
+--- ../pristine-linux-2.6.16-rc6/include/asm-i386/smp_alt.h    1970-01-01 
01:00:00.000000000 +0100
++++ ./include/asm-i386/smp_alt.h       2006-03-17 23:04:23.000000000 +0000
+@@ -0,0 +1,32 @@
++#ifndef __ASM_SMP_ALT_H__
++#define __ASM_SMP_ALT_H__
++
++#include <linux/config.h>
++
++#ifdef CONFIG_SMP
++#if defined(CONFIG_SMP_ALTERNATIVES) && !defined(MODULE)
++#define LOCK \
++        "6677: nop\n" \
++      ".section __smp_alternatives,\"a\"\n" \
++      ".long 6677b\n" \
++      ".long 6678f\n" \
++      ".previous\n" \
++      ".section __smp_replacements,\"a\"\n" \
++      "6678: .byte 1\n" \
++      ".byte 1\n" \
++      ".byte 0\n" \
++        ".byte 1\n" \
++      ".byte -1\n" \
++      "lock\n" \
++      "nop\n" \
++      ".previous\n"
++void prepare_for_smp(void);
++void unprepare_for_smp(void);
++#else
++#define LOCK "lock ; "
++#endif
++#else
++#define LOCK ""
++#endif
++
++#endif /* __ASM_SMP_ALT_H__ */
+diff -pruN ../pristine-linux-2.6.16-rc6/include/asm-i386/spinlock.h 
./include/asm-i386/spinlock.h
+--- ../pristine-linux-2.6.16-rc6/include/asm-i386/spinlock.h   2006-01-03 
03:21:10.000000000 +0000
++++ ./include/asm-i386/spinlock.h      2006-03-17 23:04:23.000000000 +0000
+@@ -6,6 +6,7 @@
+ #include <asm/page.h>
+ #include <linux/config.h>
+ #include <linux/compiler.h>
++#include <asm/smp_alt.h>
+ 
+ /*
+  * Your basic SMP spinlocks, allowing only a single CPU anywhere
+@@ -23,7 +24,8 @@
+ 
+ #define __raw_spin_lock_string \
+       "\n1:\t" \
+-      "lock ; decb %0\n\t" \
++      LOCK \
++      "decb %0\n\t" \
+       "jns 3f\n" \
+       "2:\t" \
+       "rep;nop\n\t" \
+@@ -34,7 +36,8 @@
+ 
+ #define __raw_spin_lock_string_flags \
+       "\n1:\t" \
+-      "lock ; decb %0\n\t" \
++      LOCK \
++      "decb %0\n\t" \
+       "jns 4f\n\t" \
+       "2:\t" \
+       "testl $0x200, %1\n\t" \
+@@ -65,10 +68,34 @@ static inline void __raw_spin_lock_flags
+ static inline int __raw_spin_trylock(raw_spinlock_t *lock)
+ {
+       char oldval;
++#ifdef CONFIG_SMP_ALTERNATIVES
+       __asm__ __volatile__(
+-              "xchgb %b0,%1"
++              "1:movb %1,%b0\n"
++              "movb $0,%1\n"
++              "2:"
++              ".section __smp_alternatives,\"a\"\n"
++              ".long 1b\n"
++              ".long 3f\n"
++              ".previous\n"
++              ".section __smp_replacements,\"a\"\n"
++              "3: .byte 2b - 1b\n"
++              ".byte 5f-4f\n"
++              ".byte 0\n"
++              ".byte 6f-5f\n"
++              ".byte -1\n"
++              "4: xchgb %b0,%1\n"
++              "5: movb %1,%b0\n"
++              "movb $0,%1\n"
++              "6:\n"
++              ".previous\n"
+               :"=q" (oldval), "=m" (lock->slock)
+               :"0" (0) : "memory");
++#else
++      __asm__ __volatile__(
++              "xchgb %b0,%1\n"
++              :"=q" (oldval), "=m" (lock->slock)
++              :"0" (0) : "memory");
++#endif
+       return oldval > 0;
+ }
+ 
+@@ -178,12 +205,12 @@ static inline int __raw_write_trylock(ra
+ 
+ static inline void __raw_read_unlock(raw_rwlock_t *rw)
+ {
+-      asm volatile("lock ; incl %0" :"=m" (rw->lock) : : "memory");
++      asm volatile(LOCK "incl %0" :"=m" (rw->lock) : : "memory");
+ }
+ 
+ static inline void __raw_write_unlock(raw_rwlock_t *rw)
+ {
+-      asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ", %0"
++      asm volatile(LOCK "addl $" RW_LOCK_BIAS_STR ", %0"
+                                : "=m" (rw->lock) : : "memory");
+ }
+ 
+diff -pruN ../pristine-linux-2.6.16-rc6/include/asm-i386/system.h 
./include/asm-i386/system.h
+--- ../pristine-linux-2.6.16-rc6/include/asm-i386/system.h     2006-03-17 
22:59:05.000000000 +0000
++++ ./include/asm-i386/system.h        2006-03-17 23:04:23.000000000 +0000
+@@ -5,7 +5,7 @@
+ #include <linux/kernel.h>
+ #include <asm/segment.h>
+ #include <asm/cpufeature.h>
+-#include <linux/bitops.h> /* for LOCK_PREFIX */
++#include <asm/smp_alt.h>
+ 
+ #ifdef __KERNEL__
+ 
+@@ -271,19 +271,19 @@ static inline unsigned long __cmpxchg(vo
+       unsigned long prev;
+       switch (size) {
+       case 1:
+-              __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
++              __asm__ __volatile__(LOCK "cmpxchgb %b1,%2"
+                                    : "=a"(prev)
+                                    : "q"(new), "m"(*__xg(ptr)), "0"(old)
+                                    : "memory");
+               return prev;
+       case 2:
+-              __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
++              __asm__ __volatile__(LOCK "cmpxchgw %w1,%2"
+                                    : "=a"(prev)
+                                    : "r"(new), "m"(*__xg(ptr)), "0"(old)
+                                    : "memory");
+               return prev;
+       case 4:
+-              __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
++              __asm__ __volatile__(LOCK "cmpxchgl %1,%2"
+                                    : "=a"(prev)
+                                    : "r"(new), "m"(*__xg(ptr)), "0"(old)
+                                    : "memory");
+@@ -336,7 +336,7 @@ static inline unsigned long long __cmpxc
+                                     unsigned long long new)
+ {
+       unsigned long long prev;
+-      __asm__ __volatile__(LOCK_PREFIX "cmpxchg8b %3"
++      __asm__ __volatile__(LOCK "cmpxchg8b %3"
+                            : "=A"(prev)
+                            : "b"((unsigned long)new),
+                              "c"((unsigned long)(new >> 32)),
+@@ -503,11 +503,55 @@ struct alt_instr { 
+ #endif
+ 
+ #ifdef CONFIG_SMP
++#if defined(CONFIG_SMP_ALTERNATIVES) && !defined(MODULE)
++#define smp_alt_mb(instr)                                           \
++__asm__ __volatile__("6667:\nnop\nnop\nnop\nnop\nnop\nnop\n6668:\n" \
++                   ".section __smp_alternatives,\"a\"\n"          \
++                   ".long 6667b\n"                                \
++                     ".long 6673f\n"                                \
++                   ".previous\n"                                  \
++                   ".section __smp_replacements,\"a\"\n"          \
++                   "6673:.byte 6668b-6667b\n"                     \
++                   ".byte 6670f-6669f\n"                          \
++                   ".byte 6671f-6670f\n"                          \
++                     ".byte 0\n"                                    \
++                   ".byte %c0\n"                                  \
++                   "6669:lock;addl $0,0(%%esp)\n"                 \
++                   "6670:" instr "\n"                             \
++                   "6671:\n"                                      \
++                   ".previous\n"                                  \
++                   :                                              \
++                   : "i" (X86_FEATURE_XMM2)                       \
++                   : "memory")
++#define smp_rmb() smp_alt_mb("lfence")
++#define smp_mb()  smp_alt_mb("mfence")
++#define set_mb(var, value) do {                                     \
++unsigned long __set_mb_temp;                                        \
++__asm__ __volatile__("6667:movl %1, %0\n6668:\n"                    \
++                   ".section __smp_alternatives,\"a\"\n"          \
++                   ".long 6667b\n"                                \
++                   ".long 6673f\n"                                \
++                   ".previous\n"                                  \
++                   ".section __smp_replacements,\"a\"\n"          \
++                   "6673: .byte 6668b-6667b\n"                    \
++                   ".byte 6670f-6669f\n"                          \
++                   ".byte 0\n"                                    \
++                   ".byte 6671f-6670f\n"                          \
++                   ".byte -1\n"                                   \
++                   "6669: xchg %1, %0\n"                          \
++                   "6670:movl %1, %0\n"                           \
++                   "6671:\n"                                      \
++                   ".previous\n"                                  \
++                   : "=m" (var), "=r" (__set_mb_temp)             \
++                   : "1" (value)                                  \
++                   : "memory"); } while (0)
++#else
+ #define smp_mb()      mb()
+ #define smp_rmb()     rmb()
++#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
++#endif
+ #define smp_wmb()     wmb()
+ #define smp_read_barrier_depends()    read_barrier_depends()
+-#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
+ #else
+ #define smp_mb()      barrier()
+ #define smp_rmb()     barrier()
diff -r 516cf6553011 -r cf89e8f0831b xen/Post.mk
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/Post.mk       Mon Mar 20 08:56:54 2006
@@ -0,0 +1,18 @@
+
+subdirs-all := $(subdirs-y) $(subdirs-n)
+
+obj-y += $(patsubst %,%/built_in.o,$(subdirs-y))
+
+built_in.o: $(obj-y)
+       $(LD) $(LDFLAGS) -r -o $@ $^
+
+.PHONY: FORCE
+FORCE:
+
+%/built_in.o: FORCE
+       $(MAKE) -C $*
+
+clean:: $(addprefix _clean_, $(subdirs-all)) FORCE
+       rm -f *.o *~ core
+_clean_%/: FORCE
+       $(MAKE) -C $* clean
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/tools/privop/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/tools/privop/Makefile       Mon Mar 20 08:56:54 2006
@@ -0,0 +1,11 @@
+CC=gcc
+CFLAGS=-O -Wall
+
+all: postat
+
+postat: postat.c pohcalls.o
+
+clean:
+       $(RM) -f *.o postat *.s *~
+
+
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/tools/privop/pohcalls.S
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/tools/privop/pohcalls.S     Mon Mar 20 08:56:54 2006
@@ -0,0 +1,30 @@
+       .file   "hypercall.S"
+       .pred.safe_across_calls p1-p5,p16-p63
+       .text
+       .align 16
+       .global dump_privop_counts#
+       .proc dump_privop_counts#
+dump_privop_counts:
+       .prologue
+       .body
+       mov r2 = 0xffff
+       ;;
+       break 0x1000
+       ;; 
+       br.ret.sptk.many b0
+       ;;
+       .endp dump_privop_counts#
+       .align 16
+       .global zero_privop_counts#
+       .proc zero_privop_counts#
+zero_privop_counts:
+       .prologue
+       .body
+       mov r2 = 0xfffe
+       ;;
+       break 0x1000
+       ;; 
+       br.ret.sptk.many b0
+       ;;
+       .endp zero_privop_counts#
+
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/ia64/tools/privop/postat.c
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/ia64/tools/privop/postat.c       Mon Mar 20 08:56:54 2006
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include <string.h>
+
+extern int dump_privop_counts (char *buf, int len);
+
+extern int zero_privop_counts (char *buf, int len);
+
+int
+main (int argc, char *argv[])
+{
+  static char buf[8192];
+  int res;
+
+  if (argc == 1)
+    res = dump_privop_counts (buf, sizeof (buf));
+  else if (argc == 2 && strcmp (argv[1], "--clear") == 0)
+    res = zero_privop_counts (buf, sizeof (buf));
+  else
+    {
+      printf ("usage: %s [--clear]\n", argv[0]);
+      return 1;
+    }
+  printf ("res=%d\n", res);
+  fputs (buf, stdout);
+
+  return 0;
+}
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/acpi/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/acpi/Makefile        Mon Mar 20 08:56:54 2006
@@ -0,0 +1,5 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += boot.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/cpu/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/cpu/Makefile Mon Mar 20 08:56:54 2006
@@ -0,0 +1,16 @@
+include $(BASEDIR)/Rules.mk
+
+subdirs-y += mcheck
+subdirs-y += mtrr
+
+obj-y += amd.o
+obj-y += common.o
+obj-y += intel.o
+obj-y += intel_cacheinfo.o
+
+obj-$(x86_32) += centaur.o
+obj-$(x86_32) += cyrix.o
+obj-$(x86_32) += rise.o
+obj-$(x86_32) += transmeta.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/cpu/mcheck/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/cpu/mcheck/Makefile  Mon Mar 20 08:56:54 2006
@@ -0,0 +1,11 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += k7.o
+obj-y += mce.o
+obj-y += non-fatal.o
+obj-y += p4.o
+obj-y += p5.o
+obj-y += p6.o
+obj-y += winchip.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/cpu/mtrr/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/cpu/mtrr/Makefile    Mon Mar 20 08:56:54 2006
@@ -0,0 +1,10 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += amd.o
+obj-y += centaur.o
+obj-y += cyrix.o
+obj-y += generic.o
+obj-y += main.o
+obj-y += state.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/genapic/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/genapic/Makefile     Mon Mar 20 08:56:54 2006
@@ -0,0 +1,10 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += bigsmp.o
+obj-y += default.o
+obj-y += es7000.o
+obj-y += es7000plat.o
+obj-y += probe.o
+obj-y += summit.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/Makefile Mon Mar 20 08:56:54 2006
@@ -0,0 +1,14 @@
+include $(BASEDIR)/Rules.mk
+
+subdirs-y += svm
+subdirs-y += vmx
+
+obj-y += hvm.o
+obj-y += i8259.o
+obj-y += intercept.o
+obj-y += io.o
+obj-y += platform.o
+obj-y += vioapic.o
+obj-y += vlapic.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/svm/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/svm/Makefile     Mon Mar 20 08:56:54 2006
@@ -0,0 +1,12 @@
+include $(BASEDIR)/Rules.mk
+
+subdirs-$(x86_32) += x86_32
+subdirs-$(x86_64) += x86_64
+
+obj-y += emulate.o
+obj-y += instrlen.o
+obj-y += intr.o
+obj-y += svm.o
+obj-y += vmcb.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/svm/x86_32/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/svm/x86_32/Makefile      Mon Mar 20 08:56:54 2006
@@ -0,0 +1,5 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += exits.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/svm/x86_64/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/svm/x86_64/Makefile      Mon Mar 20 08:56:54 2006
@@ -0,0 +1,5 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += exits.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/vmx/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/vmx/Makefile     Mon Mar 20 08:56:54 2006
@@ -0,0 +1,10 @@
+include $(BASEDIR)/Rules.mk
+
+subdirs-$(x86_32) += x86_32
+subdirs-$(x86_64) += x86_64
+
+obj-y += io.o
+obj-y += vmcs.o
+obj-y += vmx.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/vmx/x86_32/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/vmx/x86_32/Makefile      Mon Mar 20 08:56:54 2006
@@ -0,0 +1,5 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += exits.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/hvm/vmx/x86_64/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/hvm/vmx/x86_64/Makefile      Mon Mar 20 08:56:54 2006
@@ -0,0 +1,5 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += exits.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/x86_32/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/x86_32/Makefile      Mon Mar 20 08:56:54 2006
@@ -0,0 +1,11 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += domain_page.o
+obj-y += entry.o
+obj-y += mm.o
+obj-y += seg_fixup.o
+obj-y += traps.o
+
+obj-$(supervisor_mode_kernel) += supervisor_mode_kernel.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/arch/x86/x86_64/Makefile
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/arch/x86/x86_64/Makefile      Mon Mar 20 08:56:54 2006
@@ -0,0 +1,7 @@
+include $(BASEDIR)/Rules.mk
+
+obj-y += entry.o
+obj-y += mm.o
+obj-y += traps.o
+
+include $(BASEDIR)/Post.mk
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/vlsapic.h
--- /dev/null   Mon Mar 20 08:56:46 2006
+++ b/xen/include/asm-ia64/vlsapic.h    Mon Mar 20 08:56:54 2006
@@ -0,0 +1,35 @@
+
+
+/* -*-  Mode:C; c-basic-offset:4; tab-width:4; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2004, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * 
+ */
+
+#ifndef _LSAPIC_H
+#define _LSAPIC_H
+#include <xen/sched.h>
+
+extern void vmx_virq_line_init(struct domain *d);
+extern void vtm_init(struct vcpu *vcpu);
+extern void vtm_set_itc(struct  vcpu *vcpu, uint64_t new_itc);
+extern void vtm_set_itm(struct vcpu *vcpu, uint64_t val);
+extern void vtm_set_itv(struct vcpu *vcpu, uint64_t val);
+extern void vmx_vexirq(struct vcpu  *vcpu);
+extern void vhpi_detection(struct vcpu *vcpu);
+
+#endif
diff -r 516cf6553011 -r cf89e8f0831b 
patches/linux-2.6.16-rc5/i386-mach-io-check-nmi.patch
--- a/patches/linux-2.6.16-rc5/i386-mach-io-check-nmi.patch     Mon Mar 20 
08:56:46 2006
+++ /dev/null   Mon Mar 20 08:56:54 2006
@@ -1,45 +0,0 @@
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/kernel/traps.c 
./arch/i386/kernel/traps.c
---- ../pristine-linux-2.6.16-rc5/arch/i386/kernel/traps.c      2006-02-27 
15:46:58.000000000 +0000
-+++ ./arch/i386/kernel/traps.c 2006-02-27 15:55:23.000000000 +0000
-@@ -567,18 +567,11 @@ static void mem_parity_error(unsigned ch
- 
- static void io_check_error(unsigned char reason, struct pt_regs * regs)
- {
--      unsigned long i;
--
-       printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
-       show_registers(regs);
- 
-       /* Re-enable the IOCK line, wait for a few seconds */
--      reason = (reason & 0xf) | 8;
--      outb(reason, 0x61);
--      i = 2000;
--      while (--i) udelay(1000);
--      reason &= ~8;
--      outb(reason, 0x61);
-+      clear_io_check_error(reason);
- }
- 
- static void unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
-diff -pruN 
../pristine-linux-2.6.16-rc5/include/asm-i386/mach-default/mach_traps.h 
./include/asm-i386/mach-default/mach_traps.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/mach-default/mach_traps.h    
2006-01-03 03:21:10.000000000 +0000
-+++ ./include/asm-i386/mach-default/mach_traps.h       2006-02-27 
15:55:23.000000000 +0000
-@@ -15,6 +15,18 @@ static inline void clear_mem_error(unsig
-       outb(reason, 0x61);
- }
- 
-+static inline void clear_io_check_error(unsigned char reason)
-+{
-+      unsigned long i;
-+
-+      reason = (reason & 0xf) | 8;
-+      outb(reason, 0x61);
-+      i = 2000;
-+      while (--i) udelay(1000);
-+      reason &= ~8;
-+      outb(reason, 0x61);
-+}
-+
- static inline unsigned char get_nmi_reason(void)
- {
-       return inb(0x61);
diff -r 516cf6553011 -r cf89e8f0831b patches/linux-2.6.16-rc5/net-csum.patch
--- a/patches/linux-2.6.16-rc5/net-csum.patch   Mon Mar 20 08:56:46 2006
+++ /dev/null   Mon Mar 20 08:56:54 2006
@@ -1,41 +0,0 @@
-diff -pruN ../pristine-linux-2.6.16-rc5/net/ipv4/netfilter/ip_nat_proto_tcp.c 
./net/ipv4/netfilter/ip_nat_proto_tcp.c
---- ../pristine-linux-2.6.16-rc5/net/ipv4/netfilter/ip_nat_proto_tcp.c 
2006-02-27 15:47:38.000000000 +0000
-+++ ./net/ipv4/netfilter/ip_nat_proto_tcp.c    2006-02-27 15:55:25.000000000 
+0000
-@@ -129,10 +129,14 @@ tcp_manip_pkt(struct sk_buff **pskb,
-       if (hdrsize < sizeof(*hdr))
-               return 1;
- 
--      hdr->check = ip_nat_cheat_check(~oldip, newip,
-+      if ((*pskb)->proto_csum_blank) {
-+              hdr->check = ip_nat_cheat_check(oldip, ~newip, hdr->check);
-+      } else {
-+              hdr->check = ip_nat_cheat_check(~oldip, newip,
-                                       ip_nat_cheat_check(oldport ^ 0xFFFF,
-                                                          newport,
-                                                          hdr->check));
-+      }
-       return 1;
- }
- 
-diff -pruN ../pristine-linux-2.6.16-rc5/net/ipv4/netfilter/ip_nat_proto_udp.c 
./net/ipv4/netfilter/ip_nat_proto_udp.c
---- ../pristine-linux-2.6.16-rc5/net/ipv4/netfilter/ip_nat_proto_udp.c 
2006-02-27 15:47:38.000000000 +0000
-+++ ./net/ipv4/netfilter/ip_nat_proto_udp.c    2006-02-27 15:55:25.000000000 
+0000
-@@ -113,11 +113,16 @@ udp_manip_pkt(struct sk_buff **pskb,
-               newport = tuple->dst.u.udp.port;
-               portptr = &hdr->dest;
-       }
--      if (hdr->check) /* 0 is a special case meaning no checksum */
--              hdr->check = ip_nat_cheat_check(~oldip, newip,
-+      if (hdr->check) { /* 0 is a special case meaning no checksum */
-+              if ((*pskb)->proto_csum_blank) {
-+                      hdr->check = ip_nat_cheat_check(oldip, ~newip, 
hdr->check);
-+              } else {
-+                      hdr->check = ip_nat_cheat_check(~oldip, newip,
-                                       ip_nat_cheat_check(*portptr ^ 0xFFFF,
-                                                          newport,
-                                                          hdr->check));
-+              }
-+      }
-       *portptr = newport;
-       return 1;
- }
diff -r 516cf6553011 -r cf89e8f0831b patches/linux-2.6.16-rc5/pmd-shared.patch
--- a/patches/linux-2.6.16-rc5/pmd-shared.patch Mon Mar 20 08:56:46 2006
+++ /dev/null   Mon Mar 20 08:56:54 2006
@@ -1,111 +0,0 @@
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/mm/pageattr.c 
./arch/i386/mm/pageattr.c
---- ../pristine-linux-2.6.16-rc5/arch/i386/mm/pageattr.c       2006-02-27 
15:46:58.000000000 +0000
-+++ ./arch/i386/mm/pageattr.c  2006-02-27 15:55:31.000000000 +0000
-@@ -78,7 +78,7 @@ static void set_pmd_pte(pte_t *kpte, uns
-       unsigned long flags;
- 
-       set_pte_atomic(kpte, pte);      /* change init_mm */
--      if (PTRS_PER_PMD > 1)
-+      if (HAVE_SHARED_KERNEL_PMD)
-               return;
- 
-       spin_lock_irqsave(&pgd_lock, flags);
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/mm/pgtable.c 
./arch/i386/mm/pgtable.c
---- ../pristine-linux-2.6.16-rc5/arch/i386/mm/pgtable.c        2006-01-03 
03:21:10.000000000 +0000
-+++ ./arch/i386/mm/pgtable.c   2006-02-27 15:55:31.000000000 +0000
-@@ -215,9 +215,10 @@ void pgd_ctor(void *pgd, kmem_cache_t *c
-               spin_lock_irqsave(&pgd_lock, flags);
-       }
- 
--      clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
--                      swapper_pg_dir + USER_PTRS_PER_PGD,
--                      KERNEL_PGD_PTRS);
-+      if (PTRS_PER_PMD == 1 || HAVE_SHARED_KERNEL_PMD)
-+              clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
-+                              swapper_pg_dir + USER_PTRS_PER_PGD,
-+                              KERNEL_PGD_PTRS);
-       if (PTRS_PER_PMD > 1)
-               return;
- 
-@@ -249,6 +250,30 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
-                       goto out_oom;
-               set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
-       }
-+
-+      if (!HAVE_SHARED_KERNEL_PMD) {
-+              unsigned long flags;
-+
-+              for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-+                      pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
-+                      if (!pmd)
-+                              goto out_oom;
-+                      set_pgd(&pgd[USER_PTRS_PER_PGD], __pgd(1 + __pa(pmd)));
-+              }
-+
-+              spin_lock_irqsave(&pgd_lock, flags);
-+              for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-+                      unsigned long v = (unsigned long)i << PGDIR_SHIFT;
-+                      pgd_t *kpgd = pgd_offset_k(v);
-+                      pud_t *kpud = pud_offset(kpgd, v);
-+                      pmd_t *kpmd = pmd_offset(kpud, v);
-+                      pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-+                      memcpy(pmd, kpmd, PAGE_SIZE);
-+              }
-+              pgd_list_add(pgd);
-+              spin_unlock_irqrestore(&pgd_lock, flags);
-+      }
-+
-       return pgd;
- 
- out_oom:
-@@ -263,9 +288,23 @@ void pgd_free(pgd_t *pgd)
-       int i;
- 
-       /* in the PAE case user pgd entries are overwritten before usage */
--      if (PTRS_PER_PMD > 1)
--              for (i = 0; i < USER_PTRS_PER_PGD; ++i)
--                      kmem_cache_free(pmd_cache, (void 
*)__va(pgd_val(pgd[i])-1));
-+      if (PTRS_PER_PMD > 1) {
-+              for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-+                      pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-+                      kmem_cache_free(pmd_cache, pmd);
-+              }
-+              if (!HAVE_SHARED_KERNEL_PMD) {
-+                      unsigned long flags;
-+                      spin_lock_irqsave(&pgd_lock, flags);
-+                      pgd_list_del(pgd);
-+                      spin_unlock_irqrestore(&pgd_lock, flags);
-+                      for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-+                              pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-+                              memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
-+                              kmem_cache_free(pmd_cache, pmd);
-+                      }
-+              }
-+      }
-       /* in the non-PAE case, free_pgtables() clears user pgd entries */
-       kmem_cache_free(pgd_cache, pgd);
- }
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/pgtable-2level-defs.h 
./include/asm-i386/pgtable-2level-defs.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/pgtable-2level-defs.h        
2006-01-03 03:21:10.000000000 +0000
-+++ ./include/asm-i386/pgtable-2level-defs.h   2006-02-27 15:55:31.000000000 
+0000
-@@ -1,6 +1,8 @@
- #ifndef _I386_PGTABLE_2LEVEL_DEFS_H
- #define _I386_PGTABLE_2LEVEL_DEFS_H
- 
-+#define HAVE_SHARED_KERNEL_PMD 0
-+
- /*
-  * traditional i386 two-level paging structure:
-  */
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/pgtable-3level-defs.h 
./include/asm-i386/pgtable-3level-defs.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/pgtable-3level-defs.h        
2006-01-03 03:21:10.000000000 +0000
-+++ ./include/asm-i386/pgtable-3level-defs.h   2006-02-27 15:55:31.000000000 
+0000
-@@ -1,6 +1,8 @@
- #ifndef _I386_PGTABLE_3LEVEL_DEFS_H
- #define _I386_PGTABLE_3LEVEL_DEFS_H
- 
-+#define HAVE_SHARED_KERNEL_PMD 1
-+
- /*
-  * PGDIR_SHIFT determines what a top-level page table entry can map
-  */
diff -r 516cf6553011 -r cf89e8f0831b patches/linux-2.6.16-rc5/smp-alts.patch
--- a/patches/linux-2.6.16-rc5/smp-alts.patch   Mon Mar 20 08:56:46 2006
+++ /dev/null   Mon Mar 20 08:56:54 2006
@@ -1,591 +0,0 @@
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/Kconfig ./arch/i386/Kconfig
---- ../pristine-linux-2.6.16-rc5/arch/i386/Kconfig     2006-02-27 
15:46:58.000000000 +0000
-+++ ./arch/i386/Kconfig        2006-02-27 15:55:34.000000000 +0000
-@@ -202,6 +202,19 @@ config SMP
- 
-         If you don't know what to do here, say N.
- 
-+config SMP_ALTERNATIVES
-+      bool "SMP alternatives support (EXPERIMENTAL)"
-+      depends on SMP && EXPERIMENTAL
-+      help
-+        Try to reduce the overhead of running an SMP kernel on a uniprocessor
-+        host slightly by replacing certain key instruction sequences
-+        according to whether we currently have more than one CPU available.
-+        This should provide a noticeable boost to performance when
-+        running SMP kernels on UP machines, and have negligible impact
-+        when running on an true SMP host.
-+
-+          If unsure, say N.
-+        
- config NR_CPUS
-       int "Maximum number of CPUs (2-255)"
-       range 2 255
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/kernel/Makefile 
./arch/i386/kernel/Makefile
---- ../pristine-linux-2.6.16-rc5/arch/i386/kernel/Makefile     2006-02-27 
15:46:58.000000000 +0000
-+++ ./arch/i386/kernel/Makefile        2006-02-27 15:55:34.000000000 +0000
-@@ -37,6 +37,7 @@ obj-$(CONFIG_EFI)            += efi.o efi_stub.o
- obj-$(CONFIG_DOUBLEFAULT)     += doublefault.o
- obj-$(CONFIG_VM86)            += vm86.o
- obj-$(CONFIG_EARLY_PRINTK)    += early_printk.o
-+obj-$(CONFIG_SMP_ALTERNATIVES)  += smpalts.o
- 
- EXTRA_AFLAGS   := -traditional
- 
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/kernel/smpalts.c 
./arch/i386/kernel/smpalts.c
---- ../pristine-linux-2.6.16-rc5/arch/i386/kernel/smpalts.c    1970-01-01 
01:00:00.000000000 +0100
-+++ ./arch/i386/kernel/smpalts.c       2006-02-27 15:55:34.000000000 +0000
-@@ -0,0 +1,85 @@
-+#include <linux/kernel.h>
-+#include <asm/system.h>
-+#include <asm/smp_alt.h>
-+#include <asm/processor.h>
-+#include <asm/string.h>
-+
-+struct smp_replacement_record {
-+      unsigned char targ_size;
-+      unsigned char smp1_size;
-+      unsigned char smp2_size;
-+      unsigned char up_size;
-+      unsigned char feature;
-+      unsigned char data[0];
-+};
-+
-+struct smp_alternative_record {
-+      void *targ_start;
-+      struct smp_replacement_record *repl;
-+};
-+
-+extern struct smp_alternative_record __start_smp_alternatives_table,
-+  __stop_smp_alternatives_table;
-+extern unsigned long __init_begin, __init_end;
-+
-+void prepare_for_smp(void)
-+{
-+      struct smp_alternative_record *r;
-+      printk(KERN_INFO "Enabling SMP...\n");
-+      for (r = &__start_smp_alternatives_table;
-+           r != &__stop_smp_alternatives_table;
-+           r++) {
-+              BUG_ON(r->repl->targ_size < r->repl->smp1_size);
-+              BUG_ON(r->repl->targ_size < r->repl->smp2_size);
-+              BUG_ON(r->repl->targ_size < r->repl->up_size);
-+               if (system_state == SYSTEM_RUNNING &&
-+                   r->targ_start >= (void *)&__init_begin &&
-+                   r->targ_start < (void *)&__init_end)
-+                       continue;
-+              if (r->repl->feature != (unsigned char)-1 &&
-+                  boot_cpu_has(r->repl->feature)) {
-+                      memcpy(r->targ_start,
-+                             r->repl->data + r->repl->smp1_size,
-+                             r->repl->smp2_size);
-+                      memset(r->targ_start + r->repl->smp2_size,
-+                             0x90,
-+                             r->repl->targ_size - r->repl->smp2_size);
-+              } else {
-+                      memcpy(r->targ_start,
-+                             r->repl->data,
-+                             r->repl->smp1_size);
-+                      memset(r->targ_start + r->repl->smp1_size,
-+                             0x90,
-+                             r->repl->targ_size - r->repl->smp1_size);
-+              }
-+      }
-+      /* Paranoia */
-+      asm volatile ("jmp 1f\n1:");
-+      mb();
-+}
-+
-+void unprepare_for_smp(void)
-+{
-+      struct smp_alternative_record *r;
-+      printk(KERN_INFO "Disabling SMP...\n");
-+      for (r = &__start_smp_alternatives_table;
-+           r != &__stop_smp_alternatives_table;
-+           r++) {
-+              BUG_ON(r->repl->targ_size < r->repl->smp1_size);
-+              BUG_ON(r->repl->targ_size < r->repl->smp2_size);
-+              BUG_ON(r->repl->targ_size < r->repl->up_size);
-+               if (system_state == SYSTEM_RUNNING &&
-+                   r->targ_start >= (void *)&__init_begin &&
-+                   r->targ_start < (void *)&__init_end)
-+                       continue;
-+              memcpy(r->targ_start,
-+                     r->repl->data + r->repl->smp1_size + r->repl->smp2_size,
-+                     r->repl->up_size);
-+              memset(r->targ_start + r->repl->up_size,
-+                     0x90,
-+                     r->repl->targ_size - r->repl->up_size);
-+      }
-+      /* Paranoia */
-+      asm volatile ("jmp 1f\n1:");
-+      mb();
-+}
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/kernel/smpboot.c 
./arch/i386/kernel/smpboot.c
---- ../pristine-linux-2.6.16-rc5/arch/i386/kernel/smpboot.c    2006-02-27 
15:46:58.000000000 +0000
-+++ ./arch/i386/kernel/smpboot.c       2006-02-27 15:55:34.000000000 +0000
-@@ -1208,6 +1208,11 @@ static void __init smp_boot_cpus(unsigne
-               if (max_cpus <= cpucount+1)
-                       continue;
- 
-+#ifdef CONFIG_SMP_ALTERNATIVES
-+              if (kicked == 1)
-+                      prepare_for_smp();
-+#endif
-+
-               if (((cpu = alloc_cpu_id()) <= 0) || do_boot_cpu(apicid, cpu))
-                       printk("CPU #%d not responding - cannot use it.\n",
-                                                               apicid);
-@@ -1386,6 +1391,11 @@ int __devinit __cpu_up(unsigned int cpu)
-               return -EIO;
-       }
- 
-+#ifdef CONFIG_SMP_ALTERNATIVES
-+      if (num_online_cpus() == 1)
-+              prepare_for_smp();
-+#endif
-+
-       local_irq_enable();
-       per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
-       /* Unleash the CPU! */
-diff -pruN ../pristine-linux-2.6.16-rc5/arch/i386/kernel/vmlinux.lds.S 
./arch/i386/kernel/vmlinux.lds.S
---- ../pristine-linux-2.6.16-rc5/arch/i386/kernel/vmlinux.lds.S        
2006-01-03 03:21:10.000000000 +0000
-+++ ./arch/i386/kernel/vmlinux.lds.S   2006-02-27 15:55:34.000000000 +0000
-@@ -34,6 +34,13 @@ SECTIONS
-   __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { *(__ex_table) }
-   __stop___ex_table = .;
- 
-+  . = ALIGN(16);
-+  __start_smp_alternatives_table = .;
-+  __smp_alternatives : { *(__smp_alternatives) }
-+  __stop_smp_alternatives_table = .;
-+
-+  __smp_replacements : { *(__smp_replacements) }
-+
-   RODATA
- 
-   /* writeable */
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/atomic.h 
./include/asm-i386/atomic.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/atomic.h     2006-02-27 
15:47:25.000000000 +0000
-+++ ./include/asm-i386/atomic.h        2006-02-27 15:55:34.000000000 +0000
-@@ -4,18 +4,13 @@
- #include <linux/config.h>
- #include <linux/compiler.h>
- #include <asm/processor.h>
-+#include <asm/smp_alt.h>
- 
- /*
-  * Atomic operations that C can't guarantee us.  Useful for
-  * resource counting etc..
-  */
- 
--#ifdef CONFIG_SMP
--#define LOCK "lock ; "
--#else
--#define LOCK ""
--#endif
--
- /*
-  * Make sure gcc doesn't try to be clever and move things around
-  * on us. We need to use _exactly_ the address the user gave us,
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/bitops.h 
./include/asm-i386/bitops.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/bitops.h     2006-02-27 
15:47:25.000000000 +0000
-+++ ./include/asm-i386/bitops.h        2006-02-27 15:55:34.000000000 +0000
-@@ -7,6 +7,7 @@
- 
- #include <linux/config.h>
- #include <linux/compiler.h>
-+#include <asm/smp_alt.h>
- 
- /*
-  * These have to be done with inline assembly: that way the bit-setting
-@@ -16,12 +17,6 @@
-  * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
-  */
- 
--#ifdef CONFIG_SMP
--#define LOCK_PREFIX "lock ; "
--#else
--#define LOCK_PREFIX ""
--#endif
--
- #define ADDR (*(volatile long *) addr)
- 
- /**
-@@ -41,7 +36,7 @@
-  */
- static inline void set_bit(int nr, volatile unsigned long * addr)
- {
--      __asm__ __volatile__( LOCK_PREFIX
-+      __asm__ __volatile__( LOCK
-               "btsl %1,%0"
-               :"+m" (ADDR)
-               :"Ir" (nr));
-@@ -76,7 +71,7 @@ static inline void __set_bit(int nr, vol
-  */
- static inline void clear_bit(int nr, volatile unsigned long * addr)
- {
--      __asm__ __volatile__( LOCK_PREFIX
-+      __asm__ __volatile__( LOCK
-               "btrl %1,%0"
-               :"+m" (ADDR)
-               :"Ir" (nr));
-@@ -121,7 +116,7 @@ static inline void __change_bit(int nr, 
-  */
- static inline void change_bit(int nr, volatile unsigned long * addr)
- {
--      __asm__ __volatile__( LOCK_PREFIX
-+      __asm__ __volatile__( LOCK
-               "btcl %1,%0"
-               :"+m" (ADDR)
-               :"Ir" (nr));
-@@ -140,7 +135,7 @@ static inline int test_and_set_bit(int n
- {
-       int oldbit;
- 
--      __asm__ __volatile__( LOCK_PREFIX
-+      __asm__ __volatile__( LOCK
-               "btsl %2,%1\n\tsbbl %0,%0"
-               :"=r" (oldbit),"+m" (ADDR)
-               :"Ir" (nr) : "memory");
-@@ -180,7 +175,7 @@ static inline int test_and_clear_bit(int
- {
-       int oldbit;
- 
--      __asm__ __volatile__( LOCK_PREFIX
-+      __asm__ __volatile__( LOCK
-               "btrl %2,%1\n\tsbbl %0,%0"
-               :"=r" (oldbit),"+m" (ADDR)
-               :"Ir" (nr) : "memory");
-@@ -231,7 +226,7 @@ static inline int test_and_change_bit(in
- {
-       int oldbit;
- 
--      __asm__ __volatile__( LOCK_PREFIX
-+      __asm__ __volatile__( LOCK
-               "btcl %2,%1\n\tsbbl %0,%0"
-               :"=r" (oldbit),"+m" (ADDR)
-               :"Ir" (nr) : "memory");
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/futex.h 
./include/asm-i386/futex.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/futex.h      2006-02-27 
15:47:25.000000000 +0000
-+++ ./include/asm-i386/futex.h 2006-02-27 15:55:34.000000000 +0000
-@@ -28,7 +28,7 @@
- "1:   movl    %2, %0\n\
-       movl    %0, %3\n"                                       \
-       insn "\n"                                               \
--"2:   " LOCK_PREFIX "cmpxchgl %3, %2\n\
-+"2:   " LOCK "cmpxchgl %3, %2\n\
-       jnz     1b\n\
- 3:    .section .fixup,\"ax\"\n\
- 4:    mov     %5, %1\n\
-@@ -68,7 +68,7 @@ futex_atomic_op_inuser (int encoded_op, 
- #endif
-               switch (op) {
-               case FUTEX_OP_ADD:
--                      __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret,
-+                      __futex_atomic_op1(LOCK "xaddl %0, %2", ret,
-                                          oldval, uaddr, oparg);
-                       break;
-               case FUTEX_OP_OR:
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/rwsem.h 
./include/asm-i386/rwsem.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/rwsem.h      2006-01-03 
03:21:10.000000000 +0000
-+++ ./include/asm-i386/rwsem.h 2006-02-27 15:55:34.000000000 +0000
-@@ -40,6 +40,7 @@
- 
- #include <linux/list.h>
- #include <linux/spinlock.h>
-+#include <asm/smp_alt.h>
- 
- struct rwsem_waiter;
- 
-@@ -99,7 +100,7 @@ static inline void __down_read(struct rw
- {
-       __asm__ __volatile__(
-               "# beginning down_read\n\t"
--LOCK_PREFIX   "  incl      (%%eax)\n\t" /* adds 0x00000001, returns the old 
value */
-+LOCK          "  incl      (%%eax)\n\t" /* adds 0x00000001, returns the old 
value */
-               "  js        2f\n\t" /* jump if we weren't granted the lock */
-               "1:\n\t"
-               LOCK_SECTION_START("")
-@@ -130,7 +131,7 @@ static inline int __down_read_trylock(st
-               "  movl      %1,%2\n\t"
-               "  addl      %3,%2\n\t"
-               "  jle       2f\n\t"
--LOCK_PREFIX   "  cmpxchgl  %2,%0\n\t"
-+LOCK          "  cmpxchgl  %2,%0\n\t"
-               "  jnz       1b\n\t"
-               "2:\n\t"
-               "# ending __down_read_trylock\n\t"
-@@ -150,7 +151,7 @@ static inline void __down_write(struct r
-       tmp = RWSEM_ACTIVE_WRITE_BIAS;
-       __asm__ __volatile__(
-               "# beginning down_write\n\t"
--LOCK_PREFIX   "  xadd      %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns 
the old value */
-+LOCK          "  xadd      %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns 
the old value */
-               "  testl     %%edx,%%edx\n\t" /* was the count 0 before? */
-               "  jnz       2f\n\t" /* jump if we weren't granted the lock */
-               "1:\n\t"
-@@ -188,7 +189,7 @@ static inline void __up_read(struct rw_s
-       __s32 tmp = -RWSEM_ACTIVE_READ_BIAS;
-       __asm__ __volatile__(
-               "# beginning __up_read\n\t"
--LOCK_PREFIX   "  xadd      %%edx,(%%eax)\n\t" /* subtracts 1, returns the old 
value */
-+LOCK          "  xadd      %%edx,(%%eax)\n\t" /* subtracts 1, returns the old 
value */
-               "  js        2f\n\t" /* jump if the lock is being waited upon */
-               "1:\n\t"
-               LOCK_SECTION_START("")
-@@ -214,7 +215,7 @@ static inline void __up_write(struct rw_
-       __asm__ __volatile__(
-               "# beginning __up_write\n\t"
-               "  movl      %2,%%edx\n\t"
--LOCK_PREFIX   "  xaddl     %%edx,(%%eax)\n\t" /* tries to transition 
0xffff0001 -> 0x00000000 */
-+LOCK          "  xaddl     %%edx,(%%eax)\n\t" /* tries to transition 
0xffff0001 -> 0x00000000 */
-               "  jnz       2f\n\t" /* jump if the lock is being waited upon */
-               "1:\n\t"
-               LOCK_SECTION_START("")
-@@ -239,7 +240,7 @@ static inline void __downgrade_write(str
- {
-       __asm__ __volatile__(
-               "# beginning __downgrade_write\n\t"
--LOCK_PREFIX   "  addl      %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 -> 
0xYYYY0001 */
-+LOCK          "  addl      %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 -> 
0xYYYY0001 */
-               "  js        2f\n\t" /* jump if the lock is being waited upon */
-               "1:\n\t"
-               LOCK_SECTION_START("")
-@@ -263,7 +264,7 @@ LOCK_PREFIX        "  addl      %2,(%%eax)\n\t"
- static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem)
- {
-       __asm__ __volatile__(
--LOCK_PREFIX   "addl %1,%0"
-+LOCK            "addl %1,%0"
-               : "=m"(sem->count)
-               : "ir"(delta), "m"(sem->count));
- }
-@@ -276,7 +277,7 @@ static inline int rwsem_atomic_update(in
-       int tmp = delta;
- 
-       __asm__ __volatile__(
--LOCK_PREFIX   "xadd %0,(%2)"
-+LOCK                    "xadd %0,(%2)"
-               : "+r"(tmp), "=m"(sem->count)
-               : "r"(sem), "m"(sem->count)
-               : "memory");
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/smp_alt.h 
./include/asm-i386/smp_alt.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/smp_alt.h    1970-01-01 
01:00:00.000000000 +0100
-+++ ./include/asm-i386/smp_alt.h       2006-02-27 15:55:34.000000000 +0000
-@@ -0,0 +1,32 @@
-+#ifndef __ASM_SMP_ALT_H__
-+#define __ASM_SMP_ALT_H__
-+
-+#include <linux/config.h>
-+
-+#ifdef CONFIG_SMP
-+#if defined(CONFIG_SMP_ALTERNATIVES) && !defined(MODULE)
-+#define LOCK \
-+        "6677: nop\n" \
-+      ".section __smp_alternatives,\"a\"\n" \
-+      ".long 6677b\n" \
-+      ".long 6678f\n" \
-+      ".previous\n" \
-+      ".section __smp_replacements,\"a\"\n" \
-+      "6678: .byte 1\n" \
-+      ".byte 1\n" \
-+      ".byte 0\n" \
-+        ".byte 1\n" \
-+      ".byte -1\n" \
-+      "lock\n" \
-+      "nop\n" \
-+      ".previous\n"
-+void prepare_for_smp(void);
-+void unprepare_for_smp(void);
-+#else
-+#define LOCK "lock ; "
-+#endif
-+#else
-+#define LOCK ""
-+#endif
-+
-+#endif /* __ASM_SMP_ALT_H__ */
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/spinlock.h 
./include/asm-i386/spinlock.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/spinlock.h   2006-01-03 
03:21:10.000000000 +0000
-+++ ./include/asm-i386/spinlock.h      2006-02-27 15:55:34.000000000 +0000
-@@ -6,6 +6,7 @@
- #include <asm/page.h>
- #include <linux/config.h>
- #include <linux/compiler.h>
-+#include <asm/smp_alt.h>
- 
- /*
-  * Your basic SMP spinlocks, allowing only a single CPU anywhere
-@@ -23,7 +24,8 @@
- 
- #define __raw_spin_lock_string \
-       "\n1:\t" \
--      "lock ; decb %0\n\t" \
-+      LOCK \
-+      "decb %0\n\t" \
-       "jns 3f\n" \
-       "2:\t" \
-       "rep;nop\n\t" \
-@@ -34,7 +36,8 @@
- 
- #define __raw_spin_lock_string_flags \
-       "\n1:\t" \
--      "lock ; decb %0\n\t" \
-+      LOCK \
-+      "decb %0\n\t" \
-       "jns 4f\n\t" \
-       "2:\t" \
-       "testl $0x200, %1\n\t" \
-@@ -65,10 +68,34 @@ static inline void __raw_spin_lock_flags
- static inline int __raw_spin_trylock(raw_spinlock_t *lock)
- {
-       char oldval;
-+#ifdef CONFIG_SMP_ALTERNATIVES
-       __asm__ __volatile__(
--              "xchgb %b0,%1"
-+              "1:movb %1,%b0\n"
-+              "movb $0,%1\n"
-+              "2:"
-+              ".section __smp_alternatives,\"a\"\n"
-+              ".long 1b\n"
-+              ".long 3f\n"
-+              ".previous\n"
-+              ".section __smp_replacements,\"a\"\n"
-+              "3: .byte 2b - 1b\n"
-+              ".byte 5f-4f\n"
-+              ".byte 0\n"
-+              ".byte 6f-5f\n"
-+              ".byte -1\n"
-+              "4: xchgb %b0,%1\n"
-+              "5: movb %1,%b0\n"
-+              "movb $0,%1\n"
-+              "6:\n"
-+              ".previous\n"
-               :"=q" (oldval), "=m" (lock->slock)
-               :"0" (0) : "memory");
-+#else
-+      __asm__ __volatile__(
-+              "xchgb %b0,%1\n"
-+              :"=q" (oldval), "=m" (lock->slock)
-+              :"0" (0) : "memory");
-+#endif
-       return oldval > 0;
- }
- 
-@@ -178,12 +205,12 @@ static inline int __raw_write_trylock(ra
- 
- static inline void __raw_read_unlock(raw_rwlock_t *rw)
- {
--      asm volatile("lock ; incl %0" :"=m" (rw->lock) : : "memory");
-+      asm volatile(LOCK "incl %0" :"=m" (rw->lock) : : "memory");
- }
- 
- static inline void __raw_write_unlock(raw_rwlock_t *rw)
- {
--      asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ", %0"
-+      asm volatile(LOCK "addl $" RW_LOCK_BIAS_STR ", %0"
-                                : "=m" (rw->lock) : : "memory");
- }
- 
-diff -pruN ../pristine-linux-2.6.16-rc5/include/asm-i386/system.h 
./include/asm-i386/system.h
---- ../pristine-linux-2.6.16-rc5/include/asm-i386/system.h     2006-02-27 
15:47:25.000000000 +0000
-+++ ./include/asm-i386/system.h        2006-02-27 15:55:34.000000000 +0000
-@@ -5,7 +5,7 @@
- #include <linux/kernel.h>
- #include <asm/segment.h>
- #include <asm/cpufeature.h>
--#include <linux/bitops.h> /* for LOCK_PREFIX */
-+#include <asm/smp_alt.h>
- 
- #ifdef __KERNEL__
- 
-@@ -271,19 +271,19 @@ static inline unsigned long __cmpxchg(vo
-       unsigned long prev;
-       switch (size) {
-       case 1:
--              __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
-+              __asm__ __volatile__(LOCK "cmpxchgb %b1,%2"
-                                    : "=a"(prev)
-                                    : "q"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       case 2:
--              __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
-+              __asm__ __volatile__(LOCK "cmpxchgw %w1,%2"
-                                    : "=a"(prev)
-                                    : "r"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       case 4:
--              __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
-+              __asm__ __volatile__(LOCK "cmpxchgl %1,%2"
-                                    : "=a"(prev)
-                                    : "r"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-@@ -336,7 +336,7 @@ static inline unsigned long long __cmpxc
-                                     unsigned long long new)
- {
-       unsigned long long prev;
--      __asm__ __volatile__(LOCK_PREFIX "cmpxchg8b %3"
-+      __asm__ __volatile__(LOCK "cmpxchg8b %3"
-                            : "=A"(prev)
-                            : "b"((unsigned long)new),
-                              "c"((unsigned long)(new >> 32)),
-@@ -503,11 +503,55 @@ struct alt_instr { 
- #endif
- 
- #ifdef CONFIG_SMP
-+#if defined(CONFIG_SMP_ALTERNATIVES) && !defined(MODULE)
-+#define smp_alt_mb(instr)                                           \
-+__asm__ __volatile__("6667:\nnop\nnop\nnop\nnop\nnop\nnop\n6668:\n" \
-+                   ".section __smp_alternatives,\"a\"\n"          \
-+                   ".long 6667b\n"                                \
-+                     ".long 6673f\n"                                \
-+                   ".previous\n"                                  \
-+                   ".section __smp_replacements,\"a\"\n"          \
-+                   "6673:.byte 6668b-6667b\n"                     \
-+                   ".byte 6670f-6669f\n"                          \
-+                   ".byte 6671f-6670f\n"                          \
-+                     ".byte 0\n"                                    \
-+                   ".byte %c0\n"                                  \
-+                   "6669:lock;addl $0,0(%%esp)\n"                 \
-+                   "6670:" instr "\n"                             \
-+                   "6671:\n"                                      \
-+                   ".previous\n"                                  \
-+                   :                                              \
-+                   : "i" (X86_FEATURE_XMM2)                       \
-+                   : "memory")
-+#define smp_rmb() smp_alt_mb("lfence")
-+#define smp_mb()  smp_alt_mb("mfence")
-+#define set_mb(var, value) do {                                     \
-+unsigned long __set_mb_temp;                                        \
-+__asm__ __volatile__("6667:movl %1, %0\n6668:\n"                    \
-+                   ".section __smp_alternatives,\"a\"\n"          \
-+                   ".long 6667b\n"                                \
-+                   ".long 6673f\n"                                \
-+                   ".previous\n"                                  \
-+                   ".section __smp_replacements,\"a\"\n"          \
-+                   "6673: .byte 6668b-6667b\n"                    \
-+                   ".byte 6670f-6669f\n"                          \
-+                   ".byte 0\n"                                    \
-+                   ".byte 6671f-6670f\n"                          \
-+                   ".byte -1\n"                                   \
-+                   "6669: xchg %1, %0\n"                          \
-+                   "6670:movl %1, %0\n"                           \
-+                   "6671:\n"                                      \
-+                   ".previous\n"                                  \
-+                   : "=m" (var), "=r" (__set_mb_temp)             \
-+                   : "1" (value)                                  \
-+                   : "memory"); } while (0)
-+#else
- #define smp_mb()      mb()
- #define smp_rmb()     rmb()
-+#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
-+#endif
- #define smp_wmb()     wmb()
- #define smp_read_barrier_depends()    read_barrier_depends()
--#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
- #else
- #define smp_mb()      barrier()
- #define smp_rmb()     barrier()
diff -r 516cf6553011 -r cf89e8f0831b 
xen/include/asm-ia64/linux/asm-generic/pci-dma-compat.h
--- a/xen/include/asm-ia64/linux/asm-generic/pci-dma-compat.h   Mon Mar 20 
08:56:46 2006
+++ /dev/null   Mon Mar 20 08:56:54 2006
@@ -1,107 +0,0 @@
-/* include this file if the platform implements the dma_ DMA Mapping API
- * and wants to provide the pci_ DMA Mapping API in terms of it */
-
-#ifndef _ASM_GENERIC_PCI_DMA_COMPAT_H
-#define _ASM_GENERIC_PCI_DMA_COMPAT_H
-
-#include <linux/dma-mapping.h>
-
-/* note pci_set_dma_mask isn't here, since it's a public function
- * exported from drivers/pci, use dma_supported instead */
-
-static inline int
-pci_dma_supported(struct pci_dev *hwdev, u64 mask)
-{
-       return dma_supported(hwdev == NULL ? NULL : &hwdev->dev, mask);
-}
-
-static inline void *
-pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
-                    dma_addr_t *dma_handle)
-{
-       return dma_alloc_coherent(hwdev == NULL ? NULL : &hwdev->dev, size, 
dma_handle, GFP_ATOMIC);
-}
-
-static inline void
-pci_free_consistent(struct pci_dev *hwdev, size_t size,
-                   void *vaddr, dma_addr_t dma_handle)
-{
-       dma_free_coherent(hwdev == NULL ? NULL : &hwdev->dev, size, vaddr, 
dma_handle);
-}
-
-static inline dma_addr_t
-pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction)
-{
-       return dma_map_single(hwdev == NULL ? NULL : &hwdev->dev, ptr, size, 
(enum dma_data_direction)direction);
-}
-
-static inline void
-pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
-                size_t size, int direction)
-{
-       dma_unmap_single(hwdev == NULL ? NULL : &hwdev->dev, dma_addr, size, 
(enum dma_data_direction)direction);
-}
-
-static inline dma_addr_t
-pci_map_page(struct pci_dev *hwdev, struct page *page,
-            unsigned long offset, size_t size, int direction)
-{
-       return dma_map_page(hwdev == NULL ? NULL : &hwdev->dev, page, offset, 
size, (enum dma_data_direction)direction);
-}
-
-static inline void
-pci_unmap_page(struct pci_dev *hwdev, dma_addr_t dma_address,
-              size_t size, int direction)
-{
-       dma_unmap_page(hwdev == NULL ? NULL : &hwdev->dev, dma_address, size, 
(enum dma_data_direction)direction);
-}
-
-static inline int
-pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
-          int nents, int direction)
-{
-       return dma_map_sg(hwdev == NULL ? NULL : &hwdev->dev, sg, nents, (enum 
dma_data_direction)direction);
-}
-
-static inline void
-pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
-            int nents, int direction)
-{
-       dma_unmap_sg(hwdev == NULL ? NULL : &hwdev->dev, sg, nents, (enum 
dma_data_direction)direction);
-}
-
-static inline void
-pci_dma_sync_single_for_cpu(struct pci_dev *hwdev, dma_addr_t dma_handle,
-                   size_t size, int direction)
-{
-       dma_sync_single_for_cpu(hwdev == NULL ? NULL : &hwdev->dev, dma_handle, 
size, (enum dma_data_direction)direction);
-}
-
-static inline void
-pci_dma_sync_single_for_device(struct pci_dev *hwdev, dma_addr_t dma_handle,
-                   size_t size, int direction)
-{
-       dma_sync_single_for_device(hwdev == NULL ? NULL : &hwdev->dev, 
dma_handle, size, (enum dma_data_direction)direction);
-}
-
-static inline void
-pci_dma_sync_sg_for_cpu(struct pci_dev *hwdev, struct scatterlist *sg,
-               int nelems, int direction)
-{
-       dma_sync_sg_for_cpu(hwdev == NULL ? NULL : &hwdev->dev, sg, nelems, 
(enum dma_data_direction)direction);
-}
-
-static inline void
-pci_dma_sync_sg_for_device(struct pci_dev *hwdev, struct scatterlist *sg,
-               int nelems, int direction)
-{
-       dma_sync_sg_for_device(hwdev == NULL ? NULL : &hwdev->dev, sg, nelems, 
(enum dma_data_direction)direction);
-}
-
-static inline int
-pci_dma_mapping_error(dma_addr_t dma_addr)
-{
-       return dma_mapping_error(dma_addr);
-}
-
-#endif
diff -r 516cf6553011 -r cf89e8f0831b 
xen/include/asm-ia64/linux/asm/scatterlist.h
--- a/xen/include/asm-ia64/linux/asm/scatterlist.h      Mon Mar 20 08:56:46 2006
+++ /dev/null   Mon Mar 20 08:56:54 2006
@@ -1,28 +0,0 @@
-#ifndef _ASM_IA64_SCATTERLIST_H
-#define _ASM_IA64_SCATTERLIST_H
-
-/*
- * Modified 1998-1999, 2001-2002, 2004
- *     David Mosberger-Tang <davidm@xxxxxxxxxx>, Hewlett-Packard Co
- */
-
-struct scatterlist {
-       struct page *page;
-       unsigned int offset;
-       unsigned int length;    /* buffer length */
-
-       dma_addr_t dma_address;
-       unsigned int dma_length;
-};
-
-/*
- * It used to be that ISA_DMA_THRESHOLD had something to do with the
- * DMA-limits of ISA-devices.  Nowadays, its only remaining use (apart
- * from the aha1542.c driver, which isn't 64-bit clean anyhow) is to
- * tell the block-layer (via BLK_BOUNCE_ISA) what the max. physical
- * address of a page is that is allocated with GFP_DMA.  On IA-64,
- * that's 4GB - 1.
- */
-#define ISA_DMA_THRESHOLD      0xffffffff
-
-#endif /* _ASM_IA64_SCATTERLIST_H */
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/linux/mmzone.h
--- a/xen/include/asm-ia64/linux/mmzone.h       Mon Mar 20 08:56:46 2006
+++ /dev/null   Mon Mar 20 08:56:54 2006
@@ -1,592 +0,0 @@
-#ifndef _LINUX_MMZONE_H
-#define _LINUX_MMZONE_H
-
-#ifdef __KERNEL__
-#ifndef __ASSEMBLY__
-
-#include <linux/config.h>
-#include <linux/spinlock.h>
-#include <linux/list.h>
-#include <linux/wait.h>
-#include <linux/cache.h>
-#include <linux/threads.h>
-#include <linux/numa.h>
-#include <linux/init.h>
-#include <asm/atomic.h>
-
-/* Free memory management - zoned buddy allocator.  */
-#ifndef CONFIG_FORCE_MAX_ZONEORDER
-#define MAX_ORDER 11
-#else
-#define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
-#endif
-
-struct free_area {
-       struct list_head        free_list;
-       unsigned long           nr_free;
-};
-
-struct pglist_data;
-
-/*
- * zone->lock and zone->lru_lock are two of the hottest locks in the kernel.
- * So add a wild amount of padding here to ensure that they fall into separate
- * cachelines.  There are very few zone structures in the machine, so space
- * consumption is not a concern here.
- */
-#if defined(CONFIG_SMP)
-struct zone_padding {
-       char x[0];
-} ____cacheline_maxaligned_in_smp;
-#define ZONE_PADDING(name)     struct zone_padding name;
-#else
-#define ZONE_PADDING(name)
-#endif
-
-struct per_cpu_pages {
-       int count;              /* number of pages in the list */
-       int low;                /* low watermark, refill needed */
-       int high;               /* high watermark, emptying needed */
-       int batch;              /* chunk size for buddy add/remove */
-       struct list_head list;  /* the list of pages */
-};
-
-struct per_cpu_pageset {
-       struct per_cpu_pages pcp[2];    /* 0: hot.  1: cold */
-#ifdef CONFIG_NUMA
-       unsigned long numa_hit;         /* allocated in intended node */
-       unsigned long numa_miss;        /* allocated in non intended node */
-       unsigned long numa_foreign;     /* was intended here, hit elsewhere */
-       unsigned long interleave_hit;   /* interleaver prefered this zone */
-       unsigned long local_node;       /* allocation from local node */
-       unsigned long other_node;       /* allocation from other node */
-#endif
-} ____cacheline_aligned_in_smp;
-
-#ifdef CONFIG_NUMA
-#define zone_pcp(__z, __cpu) ((__z)->pageset[(__cpu)])
-#else
-#define zone_pcp(__z, __cpu) (&(__z)->pageset[(__cpu)])
-#endif
-
-#define ZONE_DMA               0
-#define ZONE_NORMAL            1
-#define ZONE_HIGHMEM           2
-
-#define MAX_NR_ZONES           3       /* Sync this with ZONES_SHIFT */
-#define ZONES_SHIFT            2       /* ceil(log2(MAX_NR_ZONES)) */
-
-
-/*
- * When a memory allocation must conform to specific limitations (such
- * as being suitable for DMA) the caller will pass in hints to the
- * allocator in the gfp_mask, in the zone modifier bits.  These bits
- * are used to select a priority ordered list of memory zones which
- * match the requested limits.  GFP_ZONEMASK defines which bits within
- * the gfp_mask should be considered as zone modifiers.  Each valid
- * combination of the zone modifier bits has a corresponding list
- * of zones (in node_zonelists).  Thus for two zone modifiers there
- * will be a maximum of 4 (2 ** 2) zonelists, for 3 modifiers there will
- * be 8 (2 ** 3) zonelists.  GFP_ZONETYPES defines the number of possible
- * combinations of zone modifiers in "zone modifier space".
- */
-#define GFP_ZONEMASK   0x03
-/*
- * As an optimisation any zone modifier bits which are only valid when
- * no other zone modifier bits are set (loners) should be placed in
- * the highest order bits of this field.  This allows us to reduce the
- * extent of the zonelists thus saving space.  For example in the case
- * of three zone modifier bits, we could require up to eight zonelists.
- * If the left most zone modifier is a "loner" then the highest valid
- * zonelist would be four allowing us to allocate only five zonelists.
- * Use the first form when the left most bit is not a "loner", otherwise
- * use the second.
- */
-/* #define GFP_ZONETYPES       (GFP_ZONEMASK + 1) */           /* Non-loner */
-#define GFP_ZONETYPES  ((GFP_ZONEMASK + 1) / 2 + 1)            /* Loner */
-
-/*
- * On machines where it is needed (eg PCs) we divide physical memory
- * into multiple physical zones. On a PC we have 3 zones:
- *
- * ZONE_DMA      < 16 MB       ISA DMA capable memory
- * ZONE_NORMAL 16-896 MB       direct mapped by the kernel
- * ZONE_HIGHMEM         > 896 MB       only page cache and user processes
- */
-
-struct zone {
-       /* Fields commonly accessed by the page allocator */
-       unsigned long           free_pages;
-       unsigned long           pages_min, pages_low, pages_high;
-       /*
-        * We don't know if the memory that we're going to allocate will be 
freeable
-        * or/and it will be released eventually, so to avoid totally wasting 
several
-        * GB of ram we must reserve some of the lower zone memory (otherwise 
we risk
-        * to run OOM on the lower zones despite there's tons of freeable ram
-        * on the higher zones). This array is recalculated at runtime if the
-        * sysctl_lowmem_reserve_ratio sysctl changes.
-        */
-       unsigned long           lowmem_reserve[MAX_NR_ZONES];
-
-#ifdef CONFIG_NUMA
-       struct per_cpu_pageset  *pageset[NR_CPUS];
-#else
-       struct per_cpu_pageset  pageset[NR_CPUS];
-#endif
-       /*
-        * free areas of different sizes
-        */
-       spinlock_t              lock;
-       struct free_area        free_area[MAX_ORDER];
-
-
-       ZONE_PADDING(_pad1_)
-
-       /* Fields commonly accessed by the page reclaim scanner */
-       spinlock_t              lru_lock;       
-       struct list_head        active_list;
-       struct list_head        inactive_list;
-       unsigned long           nr_scan_active;
-       unsigned long           nr_scan_inactive;
-       unsigned long           nr_active;
-       unsigned long           nr_inactive;
-       unsigned long           pages_scanned;     /* since last reclaim */
-       int                     all_unreclaimable; /* All pages pinned */
-
-       /*
-        * Does the allocator try to reclaim pages from the zone as soon
-        * as it fails a watermark_ok() in __alloc_pages?
-        */
-       int                     reclaim_pages;
-       /* A count of how many reclaimers are scanning this zone */
-       atomic_t                reclaim_in_progress;
-
-       /*
-        * prev_priority holds the scanning priority for this zone.  It is
-        * defined as the scanning priority at which we achieved our reclaim
-        * target at the previous try_to_free_pages() or balance_pgdat()
-        * invokation.
-        *
-        * We use prev_priority as a measure of how much stress page reclaim is
-        * under - it drives the swappiness decision: whether to unmap mapped
-        * pages.
-        *
-        * temp_priority is used to remember the scanning priority at which
-        * this zone was successfully refilled to free_pages == pages_high.
-        *
-        * Access to both these fields is quite racy even on uniprocessor.  But
-        * it is expected to average out OK.
-        */
-       int temp_priority;
-       int prev_priority;
-
-
-       ZONE_PADDING(_pad2_)
-       /* Rarely used or read-mostly fields */
-
-       /*
-        * wait_table           -- the array holding the hash table
-        * wait_table_size      -- the size of the hash table array
-        * wait_table_bits      -- wait_table_size == (1 << wait_table_bits)
-        *
-        * The purpose of all these is to keep track of the people
-        * waiting for a page to become available and make them
-        * runnable again when possible. The trouble is that this
-        * consumes a lot of space, especially when so few things
-        * wait on pages at a given time. So instead of using
-        * per-page waitqueues, we use a waitqueue hash table.
-        *
-        * The bucket discipline is to sleep on the same queue when
-        * colliding and wake all in that wait queue when removing.
-        * When something wakes, it must check to be sure its page is
-        * truly available, a la thundering herd. The cost of a
-        * collision is great, but given the expected load of the
-        * table, they should be so rare as to be outweighed by the
-        * benefits from the saved space.
-        *
-        * __wait_on_page_locked() and unlock_page() in mm/filemap.c, are the
-        * primary users of these fields, and in mm/page_alloc.c
-        * free_area_init_core() performs the initialization of them.
-        */
-       wait_queue_head_t       * wait_table;
-       unsigned long           wait_table_size;
-       unsigned long           wait_table_bits;
-
-       /*
-        * Discontig memory support fields.
-        */
-       struct pglist_data      *zone_pgdat;
-       struct page             *zone_mem_map;
-       /* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT */
-       unsigned long           zone_start_pfn;
-
-       unsigned long           spanned_pages;  /* total size, including holes 
*/
-       unsigned long           present_pages;  /* amount of memory (excluding 
holes) */
-
-       /*
-        * rarely used fields:
-        */
-       char                    *name;
-} ____cacheline_maxaligned_in_smp;
-
-
-/*
- * The "priority" of VM scanning is how much of the queues we will scan in one
- * go. A value of 12 for DEF_PRIORITY implies that we will scan 1/4096th of the
- * queues ("queue_length >> 12") during an aging round.
- */
-#define DEF_PRIORITY 12
-
-/*
- * One allocation request operates on a zonelist. A zonelist
- * is a list of zones, the first one is the 'goal' of the
- * allocation, the other zones are fallback zones, in decreasing
- * priority.
- *
- * Right now a zonelist takes up less than a cacheline. We never
- * modify it apart from boot-up, and only a few indices are used,
- * so despite the zonelist table being relatively big, the cache
- * footprint of this construct is very small.
- */
-struct zonelist {
-       struct zone *zones[MAX_NUMNODES * MAX_NR_ZONES + 1]; // NULL delimited
-};
-
-
-/*
- * The pg_data_t structure is used in machines with CONFIG_DISCONTIGMEM
- * (mostly NUMA machines?) to denote a higher-level memory zone than the
- * zone denotes.
- *
- * On NUMA machines, each NUMA node would have a pg_data_t to describe
- * it's memory layout.
- *
- * Memory statistics and page replacement data structures are maintained on a
- * per-zone basis.
- */
-struct bootmem_data;
-typedef struct pglist_data {
-       struct zone node_zones[MAX_NR_ZONES];
-       struct zonelist node_zonelists[GFP_ZONETYPES];
-       int nr_zones;
-#ifdef CONFIG_FLAT_NODE_MEM_MAP
-       struct page *node_mem_map;
-#endif
-       struct bootmem_data *bdata;
-       unsigned long node_start_pfn;
-       unsigned long node_present_pages; /* total number of physical pages */
-       unsigned long node_spanned_pages; /* total size of physical page
-                                            range, including holes */
-       int node_id;
-       struct pglist_data *pgdat_next;
-       wait_queue_head_t kswapd_wait;
-       struct task_struct *kswapd;
-       int kswapd_max_order;
-} pg_data_t;
-
-#define node_present_pages(nid)        (NODE_DATA(nid)->node_present_pages)
-#define node_spanned_pages(nid)        (NODE_DATA(nid)->node_spanned_pages)
-#ifdef CONFIG_FLAT_NODE_MEM_MAP
-#define pgdat_page_nr(pgdat, pagenr)   ((pgdat)->node_mem_map + (pagenr))
-#else
-#define pgdat_page_nr(pgdat, pagenr)   mfn_to_page((pgdat)->node_start_pfn + 
(pagenr))
-#endif
-#define nid_page_nr(nid, pagenr)       pgdat_page_nr(NODE_DATA(nid),(pagenr))
-
-extern struct pglist_data *pgdat_list;
-
-void __get_zone_counts(unsigned long *active, unsigned long *inactive,
-                       unsigned long *free, struct pglist_data *pgdat);
-void get_zone_counts(unsigned long *active, unsigned long *inactive,
-                       unsigned long *free);
-void build_all_zonelists(void);
-void wakeup_kswapd(struct zone *zone, int order);
-int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
-               int alloc_type, int can_try_harder, int gfp_high);
-
-#ifdef CONFIG_HAVE_MEMORY_PRESENT
-void memory_present(int nid, unsigned long start, unsigned long end);
-#else
-static inline void memory_present(int nid, unsigned long start, unsigned long 
end) {}
-#endif
-
-#ifdef CONFIG_NEED_NODE_MEMMAP_SIZE
-unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);
-#endif
-
-/*
- * zone_idx() returns 0 for the ZONE_DMA zone, 1 for the ZONE_NORMAL zone, etc.
- */
-#define zone_idx(zone)         ((zone) - (zone)->zone_pgdat->node_zones)
-
-/**
- * for_each_pgdat - helper macro to iterate over all nodes
- * @pgdat - pointer to a pg_data_t variable
- *
- * Meant to help with common loops of the form
- * pgdat = pgdat_list;
- * while(pgdat) {
- *     ...
- *     pgdat = pgdat->pgdat_next;
- * }
- */
-#define for_each_pgdat(pgdat) \
-       for (pgdat = pgdat_list; pgdat; pgdat = pgdat->pgdat_next)
-
-/*
- * next_zone - helper magic for for_each_zone()
- * Thanks to William Lee Irwin III for this piece of ingenuity.
- */
-static inline struct zone *next_zone(struct zone *zone)
-{
-       pg_data_t *pgdat = zone->zone_pgdat;
-
-       if (zone < pgdat->node_zones + MAX_NR_ZONES - 1)
-               zone++;
-       else if (pgdat->pgdat_next) {
-               pgdat = pgdat->pgdat_next;
-               zone = pgdat->node_zones;
-       } else
-               zone = NULL;
-
-       return zone;
-}
-
-/**
- * for_each_zone - helper macro to iterate over all memory zones
- * @zone - pointer to struct zone variable
- *
- * The user only needs to declare the zone variable, for_each_zone
- * fills it in. This basically means for_each_zone() is an
- * easier to read version of this piece of code:
- *
- * for (pgdat = pgdat_list; pgdat; pgdat = pgdat->node_next)
- *     for (i = 0; i < MAX_NR_ZONES; ++i) {
- *             struct zone * z = pgdat->node_zones + i;
- *             ...
- *     }
- * }
- */
-#define for_each_zone(zone) \
-       for (zone = pgdat_list->node_zones; zone; zone = next_zone(zone))
-
-static inline int is_highmem_idx(int idx)
-{
-       return (idx == ZONE_HIGHMEM);
-}
-
-static inline int is_normal_idx(int idx)
-{
-       return (idx == ZONE_NORMAL);
-}
-/**
- * is_highmem - helper function to quickly check if a struct zone is a 
- *              highmem zone or not.  This is an attempt to keep references
- *              to ZONE_{DMA/NORMAL/HIGHMEM/etc} in general code to a minimum.
- * @zone - pointer to struct zone variable
- */
-static inline int is_highmem(struct zone *zone)
-{
-       return zone == zone->zone_pgdat->node_zones + ZONE_HIGHMEM;
-}
-
-static inline int is_normal(struct zone *zone)
-{
-       return zone == zone->zone_pgdat->node_zones + ZONE_NORMAL;
-}
-
-/* These two functions are used to setup the per zone pages min values */
-struct ctl_table;
-struct file;
-int min_free_kbytes_sysctl_handler(struct ctl_table *, int, struct file *, 
-                                       void __user *, size_t *, loff_t *);
-extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1];
-int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, struct file *,
-                                       void __user *, size_t *, loff_t *);
-
-#include <linux/topology.h>
-/* Returns the number of the current Node. */
-#define numa_node_id()         (cpu_to_node(raw_smp_processor_id()))
-
-#ifndef CONFIG_NEED_MULTIPLE_NODES
-
-extern struct pglist_data contig_page_data;
-#define NODE_DATA(nid)         (&contig_page_data)
-#define NODE_MEM_MAP(nid)      mem_map
-#define MAX_NODES_SHIFT                1
-#define pfn_to_nid(pfn)                (0)
-
-#else /* CONFIG_NEED_MULTIPLE_NODES */
-
-#include <asm/mmzone.h>
-
-#endif /* !CONFIG_NEED_MULTIPLE_NODES */
-
-#ifdef CONFIG_SPARSEMEM
-#include <asm/sparsemem.h>
-#endif
-
-#if BITS_PER_LONG == 32 || defined(ARCH_HAS_ATOMIC_UNSIGNED)
-/*
- * with 32 bit page->flags field, we reserve 8 bits for node/zone info.
- * there are 3 zones (2 bits) and this leaves 8-2=6 bits for nodes.
- */
-#define FLAGS_RESERVED         8
-
-#elif BITS_PER_LONG == 64
-/*
- * with 64 bit flags field, there's plenty of room.
- */
-#define FLAGS_RESERVED         32
-
-#else
-
-#error BITS_PER_LONG not defined
-
-#endif
-
-#ifndef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
-#define early_pfn_to_nid(nid)  (0UL)
-#endif
-
-#define pfn_to_section_nr(pfn) ((pfn) >> PFN_SECTION_SHIFT)
-#define section_nr_to_pfn(sec) ((sec) << PFN_SECTION_SHIFT)
-
-#ifdef CONFIG_SPARSEMEM
-
-/*
- * SECTION_SHIFT               #bits space required to store a section #
- *
- * PA_SECTION_SHIFT            physical address to/from section number
- * PFN_SECTION_SHIFT           pfn to/from section number
- */
-#define SECTIONS_SHIFT         (MAX_PHYSMEM_BITS - SECTION_SIZE_BITS)
-
-#define PA_SECTION_SHIFT       (SECTION_SIZE_BITS)
-#define PFN_SECTION_SHIFT      (SECTION_SIZE_BITS - PAGE_SHIFT)
-
-#define NR_MEM_SECTIONS                (1UL << SECTIONS_SHIFT)
-
-#define PAGES_PER_SECTION       (1UL << PFN_SECTION_SHIFT)
-#define PAGE_SECTION_MASK      (~(PAGES_PER_SECTION-1))
-
-#if (MAX_ORDER - 1 + PAGE_SHIFT) > SECTION_SIZE_BITS
-#error Allocator MAX_ORDER exceeds SECTION_SIZE
-#endif
-
-struct page;
-struct mem_section {
-       /*
-        * This is, logically, a pointer to an array of struct
-        * pages.  However, it is stored with some other magic.
-        * (see sparse.c::sparse_init_one_section())
-        *
-        * Making it a UL at least makes someone do a cast
-        * before using it wrong.
-        */
-       unsigned long section_mem_map;
-};
-
-extern struct mem_section mem_section[NR_MEM_SECTIONS];
-
-static inline struct mem_section *__nr_to_section(unsigned long nr)
-{
-       return &mem_section[nr];
-}
-
-/*
- * We use the lower bits of the mem_map pointer to store
- * a little bit of information.  There should be at least
- * 3 bits here due to 32-bit alignment.
- */
-#define        SECTION_MARKED_PRESENT  (1UL<<0)
-#define SECTION_HAS_MEM_MAP    (1UL<<1)
-#define SECTION_MAP_LAST_BIT   (1UL<<2)
-#define SECTION_MAP_MASK       (~(SECTION_MAP_LAST_BIT-1))
-
-static inline struct page *__section_mem_map_addr(struct mem_section *section)
-{
-       unsigned long map = section->section_mem_map;
-       map &= SECTION_MAP_MASK;
-       return (struct page *)map;
-}
-
-static inline int valid_section(struct mem_section *section)
-{
-       return (section->section_mem_map & SECTION_MARKED_PRESENT);
-}
-
-static inline int section_has_mem_map(struct mem_section *section)
-{
-       return (section->section_mem_map & SECTION_HAS_MEM_MAP);
-}
-
-static inline int valid_section_nr(unsigned long nr)
-{
-       return valid_section(__nr_to_section(nr));
-}
-
-/*
- * Given a kernel address, find the home node of the underlying memory.
- */
-#define kvaddr_to_nid(kaddr)   pfn_to_nid(__pa(kaddr) >> PAGE_SHIFT)
-
-static inline struct mem_section *__pfn_to_section(unsigned long pfn)
-{
-       return __nr_to_section(pfn_to_section_nr(pfn));
-}
-
-#define mfn_to_page(pfn)                                               \
-({                                                                     \
-       unsigned long __pfn = (pfn);                                    \
-       __section_mem_map_addr(__pfn_to_section(__pfn)) + __pfn;        \
-})
-#define page_to_mfn(page)                                              \
-({                                                                     \
-       page - __section_mem_map_addr(__nr_to_section(                  \
-               page_to_section(page)));                                \
-})
-
-static inline int mfn_valid(unsigned long pfn)
-{
-       if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
-               return 0;
-       return valid_section(__nr_to_section(pfn_to_section_nr(pfn)));
-}
-
-/*
- * These are _only_ used during initialisation, therefore they
- * can use __initdata ...  They could have names to indicate
- * this restriction.
- */
-#ifdef CONFIG_NUMA
-#define pfn_to_nid             early_pfn_to_nid
-#endif
-
-#define pfn_to_pgdat(pfn)                                              \
-({                                                                     \
-       NODE_DATA(pfn_to_nid(pfn));                                     \
-})
-
-#define early_mfn_valid(pfn)   mfn_valid(pfn)
-void sparse_init(void);
-#else
-#define sparse_init()  do {} while (0)
-#endif /* CONFIG_SPARSEMEM */
-
-#ifdef CONFIG_NODES_SPAN_OTHER_NODES
-#define early_pfn_in_nid(pfn, nid)     (early_pfn_to_nid(pfn) == (nid))
-#else
-#define early_pfn_in_nid(pfn, nid)     (1)
-#endif
-
-#ifndef early_mfn_valid
-#define early_mfn_valid(pfn)   (1)
-#endif
-
-void memory_present(int nid, unsigned long start, unsigned long end);
-unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);
-
-#endif /* !__ASSEMBLY__ */
-#endif /* __KERNEL__ */
-#endif /* _LINUX_MMZONE_H */
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/linux/page-flags.h
--- a/xen/include/asm-ia64/linux/page-flags.h   Mon Mar 20 08:56:46 2006
+++ /dev/null   Mon Mar 20 08:56:54 2006
@@ -1,324 +0,0 @@
-/*
- * Macros for manipulating and testing page->flags
- */
-
-#ifndef PAGE_FLAGS_H
-#define PAGE_FLAGS_H
-
-#include <linux/percpu.h>
-#include <linux/cache.h>
-#include <asm/pgtable.h>
-
-/*
- * Various page->flags bits:
- *
- * PG_reserved is set for special pages, which can never be swapped out. Some
- * of them might not even exist (eg empty_bad_page)...
- *
- * The PG_private bitflag is set if page->private contains a valid value.
- *
- * During disk I/O, PG_locked is used. This bit is set before I/O and
- * reset when I/O completes. page_waitqueue(page) is a wait queue of all tasks
- * waiting for the I/O on this page to complete.
- *
- * PG_uptodate tells whether the page's contents is valid.  When a read
- * completes, the page becomes uptodate, unless a disk I/O error happened.
- *
- * For choosing which pages to swap out, inode pages carry a PG_referenced bit,
- * which is set any time the system accesses that page through the (mapping,
- * index) hash table.  This referenced bit, together with the referenced bit
- * in the page tables, is used to manipulate page->age and move the page across
- * the active, inactive_dirty and inactive_clean lists.
- *
- * Note that the referenced bit, the page->lru list_head and the active,
- * inactive_dirty and inactive_clean lists are protected by the
- * zone->lru_lock, and *NOT* by the usual PG_locked bit!
- *
- * PG_error is set to indicate that an I/O error occurred on this page.
- *
- * PG_arch_1 is an architecture specific page state bit.  The generic code
- * guarantees that this bit is cleared for a page when it first is entered into
- * the page cache.
- *
- * PG_highmem pages are not permanently mapped into the kernel virtual address
- * space, they need to be kmapped separately for doing IO on the pages.  The
- * struct page (these bits with information) are always mapped into kernel
- * address space...
- */
-
-/*
- * Don't use the *_dontuse flags.  Use the macros.  Otherwise you'll break
- * locked- and dirty-page accounting.  The top eight bits of page->flags are
- * used for page->zone, so putting flag bits there doesn't work.
- */
-#define PG_locked               0      /* Page is locked. Don't touch. */
-#define PG_error                1
-#define PG_referenced           2
-#define PG_uptodate             3
-
-#define PG_dirty                4
-#define PG_lru                  5
-#define PG_active               6
-#define PG_slab                         7      /* slab debug (Suparna wants 
this) */
-
-#define PG_checked              8      /* kill me in 2.5.<early>. */
-#define PG_arch_1               9
-#define PG_reserved            10
-#define PG_private             11      /* Has something at ->private */
-
-#define PG_writeback           12      /* Page is under writeback */
-#define PG_nosave              13      /* Used for system suspend/resume */
-#define PG_compound            14      /* Part of a compound page */
-#define PG_swapcache           15      /* Swap page: swp_entry_t in private */
-
-#define PG_mappedtodisk                16      /* Has blocks allocated on-disk 
*/
-#define PG_reclaim             17      /* To be reclaimed asap */
-#define PG_nosave_free         18      /* Free, should not be written */
-#define PG_uncached            19      /* Page has been mapped as uncached */
-
-/*
- * Global page accounting.  One instance per CPU.  Only unsigned longs are
- * allowed.
- */
-struct page_state {
-       unsigned long nr_dirty;         /* Dirty writeable pages */
-       unsigned long nr_writeback;     /* Pages under writeback */
-       unsigned long nr_unstable;      /* NFS unstable pages */
-       unsigned long nr_page_table_pages;/* Pages used for pagetables */
-       unsigned long nr_mapped;        /* mapped into pagetables */
-       unsigned long nr_slab;          /* In slab */
-#define GET_PAGE_STATE_LAST nr_slab
-
-       /*
-        * The below are zeroed by get_page_state().  Use get_full_page_state()
-        * to add up all these.
-        */
-       unsigned long pgpgin;           /* Disk reads */
-       unsigned long pgpgout;          /* Disk writes */
-       unsigned long pswpin;           /* swap reads */
-       unsigned long pswpout;          /* swap writes */
-       unsigned long pgalloc_high;     /* page allocations */
-
-       unsigned long pgalloc_normal;
-       unsigned long pgalloc_dma;
-       unsigned long pgfree;           /* page freeings */
-       unsigned long pgactivate;       /* pages moved inactive->active */
-       unsigned long pgdeactivate;     /* pages moved active->inactive */
-
-       unsigned long pgfault;          /* faults (major+minor) */
-       unsigned long pgmajfault;       /* faults (major only) */
-       unsigned long pgrefill_high;    /* inspected in refill_inactive_zone */
-       unsigned long pgrefill_normal;
-       unsigned long pgrefill_dma;
-
-       unsigned long pgsteal_high;     /* total highmem pages reclaimed */
-       unsigned long pgsteal_normal;
-       unsigned long pgsteal_dma;
-       unsigned long pgscan_kswapd_high;/* total highmem pages scanned */
-       unsigned long pgscan_kswapd_normal;
-
-       unsigned long pgscan_kswapd_dma;
-       unsigned long pgscan_direct_high;/* total highmem pages scanned */
-       unsigned long pgscan_direct_normal;
-       unsigned long pgscan_direct_dma;
-       unsigned long pginodesteal;     /* pages reclaimed via inode freeing */
-
-       unsigned long slabs_scanned;    /* slab objects scanned */
-       unsigned long kswapd_steal;     /* pages reclaimed by kswapd */
-       unsigned long kswapd_inodesteal;/* reclaimed via kswapd inode freeing */
-       unsigned long pageoutrun;       /* kswapd's calls to page reclaim */
-       unsigned long allocstall;       /* direct reclaim calls */
-
-       unsigned long pgrotated;        /* pages rotated to tail of the LRU */
-       unsigned long nr_bounce;        /* pages for bounce buffers */
-};
-
-extern void get_page_state(struct page_state *ret);
-extern void get_full_page_state(struct page_state *ret);
-extern unsigned long __read_page_state(unsigned long offset);
-extern void __mod_page_state(unsigned long offset, unsigned long delta);
-
-#define read_page_state(member) \
-       __read_page_state(offsetof(struct page_state, member))
-
-#define mod_page_state(member, delta)  \
-       __mod_page_state(offsetof(struct page_state, member), (delta))
-
-#define inc_page_state(member) mod_page_state(member, 1UL)
-#define dec_page_state(member) mod_page_state(member, 0UL - 1)
-#define add_page_state(member,delta) mod_page_state(member, (delta))
-#define sub_page_state(member,delta) mod_page_state(member, 0UL - (delta))
-
-#define mod_page_state_zone(zone, member, delta)                               
\
-       do {                                                                    
\
-               unsigned offset;                                                
\
-               if (is_highmem(zone))                                           
\
-                       offset = offsetof(struct page_state, member##_high);    
\
-               else if (is_normal(zone))                                       
\
-                       offset = offsetof(struct page_state, member##_normal);  
\
-               else                                                            
\
-                       offset = offsetof(struct page_state, member##_dma);     
\
-               __mod_page_state(offset, (delta));                              
\
-       } while (0)
-
-/*
- * Manipulation of page state flags
- */
-#define PageLocked(page)               \
-               test_bit(PG_locked, &(page)->flags)
-#define SetPageLocked(page)            \
-               set_bit(PG_locked, &(page)->flags)
-#define TestSetPageLocked(page)                \
-               test_and_set_bit(PG_locked, &(page)->flags)
-#define ClearPageLocked(page)          \
-               clear_bit(PG_locked, &(page)->flags)
-#define TestClearPageLocked(page)      \
-               test_and_clear_bit(PG_locked, &(page)->flags)
-
-#define PageError(page)                test_bit(PG_error, &(page)->flags)
-#define SetPageError(page)     set_bit(PG_error, &(page)->flags)
-#define ClearPageError(page)   clear_bit(PG_error, &(page)->flags)
-
-#define PageReferenced(page)   test_bit(PG_referenced, &(page)->flags)
-#define SetPageReferenced(page)        set_bit(PG_referenced, &(page)->flags)
-#define ClearPageReferenced(page)      clear_bit(PG_referenced, &(page)->flags)
-#define TestClearPageReferenced(page) test_and_clear_bit(PG_referenced, 
&(page)->flags)
-
-#define PageUptodate(page)     test_bit(PG_uptodate, &(page)->flags)
-#ifndef SetPageUptodate
-#define SetPageUptodate(page)  set_bit(PG_uptodate, &(page)->flags)
-#endif
-#define ClearPageUptodate(page)        clear_bit(PG_uptodate, &(page)->flags)
-
-#define PageDirty(page)                test_bit(PG_dirty, &(page)->flags)
-#define SetPageDirty(page)     set_bit(PG_dirty, &(page)->flags)
-#define TestSetPageDirty(page) test_and_set_bit(PG_dirty, &(page)->flags)
-#define ClearPageDirty(page)   clear_bit(PG_dirty, &(page)->flags)
-#define TestClearPageDirty(page) test_and_clear_bit(PG_dirty, &(page)->flags)
-
-#define SetPageLRU(page)       set_bit(PG_lru, &(page)->flags)
-#define PageLRU(page)          test_bit(PG_lru, &(page)->flags)
-#define TestSetPageLRU(page)   test_and_set_bit(PG_lru, &(page)->flags)
-#define TestClearPageLRU(page) test_and_clear_bit(PG_lru, &(page)->flags)
-
-#define PageActive(page)       test_bit(PG_active, &(page)->flags)
-#define SetPageActive(page)    set_bit(PG_active, &(page)->flags)
-#define ClearPageActive(page)  clear_bit(PG_active, &(page)->flags)
-#define TestClearPageActive(page) test_and_clear_bit(PG_active, &(page)->flags)
-#define TestSetPageActive(page) test_and_set_bit(PG_active, &(page)->flags)
-
-#define PageSlab(page)         test_bit(PG_slab, &(page)->flags)
-#define SetPageSlab(page)      set_bit(PG_slab, &(page)->flags)
-#define ClearPageSlab(page)    clear_bit(PG_slab, &(page)->flags)
-#define TestClearPageSlab(page)        test_and_clear_bit(PG_slab, 
&(page)->flags)
-#define TestSetPageSlab(page)  test_and_set_bit(PG_slab, &(page)->flags)
-
-#ifdef CONFIG_HIGHMEM
-#define PageHighMem(page)      is_highmem(page_zone(page))
-#else
-#define PageHighMem(page)      0 /* needed to optimize away at compile time */
-#endif
-
-#define PageChecked(page)      test_bit(PG_checked, &(page)->flags)
-#define SetPageChecked(page)   set_bit(PG_checked, &(page)->flags)
-#define ClearPageChecked(page) clear_bit(PG_checked, &(page)->flags)
-
-#define PageReserved(page)     test_bit(PG_reserved, &(page)->flags)
-#define SetPageReserved(page)  set_bit(PG_reserved, &(page)->flags)
-#define ClearPageReserved(page)        clear_bit(PG_reserved, &(page)->flags)
-#define __ClearPageReserved(page)      __clear_bit(PG_reserved, &(page)->flags)
-
-#define SetPagePrivate(page)   set_bit(PG_private, &(page)->flags)
-#define ClearPagePrivate(page) clear_bit(PG_private, &(page)->flags)
-#define PagePrivate(page)      test_bit(PG_private, &(page)->flags)
-#define __SetPagePrivate(page)  __set_bit(PG_private, &(page)->flags)
-#define __ClearPagePrivate(page) __clear_bit(PG_private, &(page)->flags)
-
-#define PageWriteback(page)    test_bit(PG_writeback, &(page)->flags)
-#define SetPageWriteback(page)                                         \
-       do {                                                            \
-               if (!test_and_set_bit(PG_writeback,                     \
-                               &(page)->flags))                        \
-                       inc_page_state(nr_writeback);                   \
-       } while (0)
-#define TestSetPageWriteback(page)                                     \
-       ({                                                              \
-               int ret;                                                \
-               ret = test_and_set_bit(PG_writeback,                    \
-                                       &(page)->flags);                \
-               if (!ret)                                               \
-                       inc_page_state(nr_writeback);                   \
-               ret;                                                    \
-       })
-#define ClearPageWriteback(page)                                       \
-       do {                                                            \
-               if (test_and_clear_bit(PG_writeback,                    \
-                               &(page)->flags))                        \
-                       dec_page_state(nr_writeback);                   \
-       } while (0)
-#define TestClearPageWriteback(page)                                   \
-       ({                                                              \
-               int ret;                                                \
-               ret = test_and_clear_bit(PG_writeback,                  \
-                               &(page)->flags);                        \
-               if (ret)                                                \
-                       dec_page_state(nr_writeback);                   \
-               ret;                                                    \
-       })
-
-#define PageNosave(page)       test_bit(PG_nosave, &(page)->flags)
-#define SetPageNosave(page)    set_bit(PG_nosave, &(page)->flags)
-#define TestSetPageNosave(page)        test_and_set_bit(PG_nosave, 
&(page)->flags)
-#define ClearPageNosave(page)          clear_bit(PG_nosave, &(page)->flags)
-#define TestClearPageNosave(page)      test_and_clear_bit(PG_nosave, 
&(page)->flags)
-
-#define PageNosaveFree(page)   test_bit(PG_nosave_free, &(page)->flags)
-#define SetPageNosaveFree(page)        set_bit(PG_nosave_free, &(page)->flags)
-#define ClearPageNosaveFree(page)              clear_bit(PG_nosave_free, 
&(page)->flags)
-
-#define PageMappedToDisk(page) test_bit(PG_mappedtodisk, &(page)->flags)
-#define SetPageMappedToDisk(page) set_bit(PG_mappedtodisk, &(page)->flags)
-#define ClearPageMappedToDisk(page) clear_bit(PG_mappedtodisk, &(page)->flags)
-
-#define PageReclaim(page)      test_bit(PG_reclaim, &(page)->flags)
-#define SetPageReclaim(page)   set_bit(PG_reclaim, &(page)->flags)
-#define ClearPageReclaim(page) clear_bit(PG_reclaim, &(page)->flags)
-#define TestClearPageReclaim(page) test_and_clear_bit(PG_reclaim, 
&(page)->flags)
-
-#ifdef CONFIG_HUGETLB_PAGE
-#define PageCompound(page)     test_bit(PG_compound, &(page)->flags)
-#else
-#define PageCompound(page)     0
-#endif
-#define SetPageCompound(page)  set_bit(PG_compound, &(page)->flags)
-#define ClearPageCompound(page)        clear_bit(PG_compound, &(page)->flags)
-
-#ifdef CONFIG_SWAP
-#define PageSwapCache(page)    test_bit(PG_swapcache, &(page)->flags)
-#define SetPageSwapCache(page) set_bit(PG_swapcache, &(page)->flags)
-#define ClearPageSwapCache(page) clear_bit(PG_swapcache, &(page)->flags)
-#else
-#define PageSwapCache(page)    0
-#endif
-
-#define PageUncached(page)     test_bit(PG_uncached, &(page)->flags)
-#define SetPageUncached(page)  set_bit(PG_uncached, &(page)->flags)
-#define ClearPageUncached(page)        clear_bit(PG_uncached, &(page)->flags)
-
-struct page;   /* forward declaration */
-
-int test_clear_page_dirty(struct page *page);
-int test_clear_page_writeback(struct page *page);
-int test_set_page_writeback(struct page *page);
-
-static inline void clear_page_dirty(struct page *page)
-{
-       test_clear_page_dirty(page);
-}
-
-static inline void set_page_writeback(struct page *page)
-{
-       test_set_page_writeback(page);
-}
-
-#endif /* PAGE_FLAGS_H */
diff -r 516cf6553011 -r cf89e8f0831b xen/include/asm-ia64/linux/rbtree.h
--- a/xen/include/asm-ia64/linux/rbtree.h       Mon Mar 20 08:56:46 2006
+++ /dev/null   Mon Mar 20 08:56:54 2006
@@ -1,141 +0,0 @@
-/*
-  Red Black Trees
-  (C) 1999  Andrea Arcangeli <andrea@xxxxxxx>
-  
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-  linux/include/linux/rbtree.h
-
-  To use rbtrees you'll have to implement your own insert and search cores.
-  This will avoid us to use callbacks and to drop drammatically performances.
-  I know it's not the cleaner way,  but in C (not in C++) to get
-  performances and genericity...
-
-  Some example of insert and search follows here. The search is a plain
-  normal search over an ordered tree. The insert instead must be implemented
-  int two steps: as first thing the code must insert the element in
-  order as a red leaf in the tree, then the support library function
-  rb_insert_color() must be called. Such function will do the
-  not trivial work to rebalance the rbtree if necessary.
-
------------------------------------------------------------------------
-static inline struct page * rb_search_page_cache(struct inode * inode,
-                                                unsigned long offset)
-{
-       struct rb_node * n = inode->i_rb_page_cache.rb_node;
-       struct page * page;
-
-       while (n)
-       {
-               page = rb_entry(n, struct page, rb_page_cache);
-
-               if (offset < page->offset)
-                       n = n->rb_left;
-               else if (offset > page->offset)
-                       n = n->rb_right;
-               else
-                       return page;
-       }
-       return NULL;
-}
-
-static inline struct page * __rb_insert_page_cache(struct inode * inode,
-                                                  unsigned long offset,
-                                                  struct rb_node * node)
-{
-       struct rb_node ** p = &inode->i_rb_page_cache.rb_node;
-       struct rb_node * parent = NULL;
-       struct page * page;
-
-       while (*p)
-       {
-               parent = *p;
-               page = rb_entry(parent, struct page, rb_page_cache);
-
-               if (offset < page->offset)
-                       p = &(*p)->rb_left;
-               else if (offset > page->offset)
-                       p = &(*p)->rb_right;
-               else
-                       return page;
-       }
-
-       rb_link_node(node, parent, p);
-
-       return NULL;
-}
-
-static inline struct page * rb_insert_page_cache(struct inode * inode,
-                                                unsigned long offset,
-                                                struct rb_node * node)
-{
-       struct page * ret;
-       if ((ret = __rb_insert_page_cache(inode, offset, node)))
-               goto out;
-       rb_insert_color(node, &inode->i_rb_page_cache);
- out:
-       return ret;
-}
------------------------------------------------------------------------
-*/
-
-#ifndef        _LINUX_RBTREE_H
-#define        _LINUX_RBTREE_H
-
-#include <linux/kernel.h>
-#include <linux/stddef.h>
-
-struct rb_node
-{
-       struct rb_node *rb_parent;
-       int rb_color;
-#define        RB_RED          0
-#define        RB_BLACK        1
-       struct rb_node *rb_right;
-       struct rb_node *rb_left;
-};
-
-struct rb_root
-{
-       struct rb_node *rb_node;
-};
-
-#define RB_ROOT        (struct rb_root) { NULL, }
-#define        rb_entry(ptr, type, member) container_of(ptr, type, member)
-
-extern void rb_insert_color(struct rb_node *, struct rb_root *);
-extern void rb_erase(struct rb_node *, struct rb_root *);
-
-/* Find logical next and previous nodes in a tree */
-extern struct rb_node *rb_next(struct rb_node *);
-extern struct rb_node *rb_prev(struct rb_node *);
-extern struct rb_node *rb_first(struct rb_root *);
-extern struct rb_node *rb_last(struct rb_root *);
-
-/* Fast replacement of a single node without remove/rebalance/add/rebalance */
-extern void rb_replace_node(struct rb_node *victim, struct rb_node *new, 
-                           struct rb_root *root);
-
-static inline void rb_link_node(struct rb_node * node, struct rb_node * parent,
-                               struct rb_node ** rb_link)
-{
-       node->rb_parent = parent;
-       node->rb_color = RB_RED;
-       node->rb_left = node->rb_right = NULL;
-
-       *rb_link = node;
-}
-
-#endif /* _LINUX_RBTREE_H */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.