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

[XenPPC] [xenppc-unstable] [POWERPC] merge with http://xenbits.xensource.com/xen-unstable.hg



# HG changeset patch
# User Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
# Node ID 10f1113fd48939fefa3daaabdb0e9890f77a97b0
# Parent  39c113fb84aca68b902d96aba8a57b36c9f6d42a
# Parent  04e5e80be909c06737b84ce776028b5d60118406
[POWERPC] merge with http://xenbits.xensource.com/xen-unstable.hg
---
 linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c           |    2 
 linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c                 |    2 
 linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c                   |   18 
 linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c                     |    2 
 linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c                    |    8 
 linux-2.6-xen-sparse/arch/i386/mm/init-xen.c                        |    2 
 linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c                     |    6 
 linux-2.6-xen-sparse/arch/ia64/kernel/setup.c                       |    7 
 linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c                     |    2 
 linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S                 |   12 
 linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c                 |   17 
 linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c                      |    2 
 linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c                     |    3 
 linux-2.6-xen-sparse/drivers/xen/console/console.c                  |   10 
 linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c                 |    2 
 linux-2.6-xen-sparse/drivers/xen/core/evtchn.c                      |    3 
 linux-2.6-xen-sparse/drivers/xen/core/skbuff.c                      |    3 
 linux-2.6-xen-sparse/drivers/xen/core/smpboot.c                     |   20 
 linux-2.6-xen-sparse/drivers/xen/netback/loopback.c                 |    2 
 linux-2.6-xen-sparse/drivers/xen/netback/netback.c                  |  138 +-
 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c                |    2 
 linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c                  |    2 
 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c              |   15 
 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h              |    2 
 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c                |    2 
 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c              |   24 
 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h      |    7 
 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h     |    1 
 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/maddr.h          |  160 ++
 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h           |  129 --
 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h |    1 
 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h |   12 
 linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h                  |    2 
 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h    |    7 
 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/maddr.h        |  139 ++
 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h         |  122 --
 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h      |    1 
 linux-2.6-xen-sparse/include/xen/hvm.h                              |   17 
 linux-2.6-xen-sparse/mm/memory.c                                    |    5 
 linux-2.6-xen-sparse/net/core/dev.c                                 |   10 
 patches/linux-2.6.16.13/net-gso-4-kill-warnon.patch                 |   28 
 tools/firmware/hvmloader/Makefile                                   |    8 
 tools/firmware/hvmloader/hvmloader.c                                |   13 
 tools/firmware/hvmloader/hypercall.h                                |    2 
 tools/firmware/hvmloader/smbios.c                                   |  606 
++++++++++
 tools/firmware/hvmloader/smbios.h                                   |   38 
 tools/firmware/hvmloader/smbios_types.h                             |  182 +++
 tools/firmware/hvmloader/util.c                                     |   80 +
 tools/firmware/hvmloader/util.h                                     |   12 
 tools/firmware/rombios/rombios.c                                    |   45 
 tools/firmware/vmxassist/vmxassist.ld                               |   12 
 tools/libxc/xc_evtchn.c                                             |   11 
 tools/libxc/xc_hvm_build.c                                          |    6 
 tools/libxc/xenctrl.h                                               |    7 
 tools/python/xen/lowlevel/xc/xc.c                                   |   69 -
 xen/arch/ia64/vmx/mmio.c                                            |    2 
 xen/arch/ia64/vmx/vlsapic.c                                         |    2 
 xen/arch/ia64/vmx/vmx_init.c                                        |    5 
 xen/arch/ia64/vmx/vmx_vcpu.c                                        |    2 
 xen/arch/ia64/xen/domain.c                                          |    3 
 xen/arch/ia64/xen/hyperprivop.S                                     |    2 
 xen/arch/ia64/xen/vcpu.c                                            |    2 
 xen/arch/ia64/xen/xenasm.S                                          |    2 
 xen/arch/x86/hvm/platform.c                                         |    3 
 xen/common/grant_table.c                                            |    7 
 xen/include/asm-ia64/domain.h                                       |    2 
 xen/include/asm-ia64/event.h                                        |    2 
 xen/include/asm-ia64/linux-xen/asm/ptrace.h                         |    3 
 xen/include/asm-ia64/privop_stat.h                                  |    3 
 xen/include/asm-ia64/vcpu.h                                         |    3 
 xen/include/asm-ia64/vmx_platform.h                                 |    1 
 xen/include/asm-ia64/vmx_vpd.h                                      |    2 
 72 files changed, 1542 insertions(+), 544 deletions(-)

diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c Mon Aug 14 
15:21:30 2006 -0400
@@ -178,7 +178,7 @@ static int __init mtrr_init(void)
 {
        struct cpuinfo_x86 *c = &boot_cpu_data;
 
-       if (!(xen_start_info->flags & SIF_PRIVILEGED))
+       if (!is_initial_xendomain())
                return -ENODEV;
 
        if ((!cpu_has(c, X86_FEATURE_MTRR)) &&
diff -r 39c113fb84ac -r 10f1113fd489 
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 Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c       Mon Aug 14 
15:21:30 2006 -0400
@@ -2480,7 +2480,7 @@ static int __init io_apic_bug_finalize(v
 {
        if(sis_apic_bug == -1)
                sis_apic_bug = 0;
-       if (xen_start_info->flags & SIF_INITDOMAIN) {
+       if (is_initial_xendomain()) {
                dom0_op_t op = { .cmd = DOM0_PLATFORM_QUIRK };
                op.u.platform_quirk.quirk_id = sis_apic_bug ?
                        QUIRK_IOAPIC_BAD_REGSEL : QUIRK_IOAPIC_GOOD_REGSEL;
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Mon Aug 14 15:21:30 
2006 -0400
@@ -318,7 +318,7 @@ static void __init probe_roms(void)
        int           i;
 
        /* Nothing to do if not running in dom0. */
-       if (!(xen_start_info->flags & SIF_INITDOMAIN))
+       if (!is_initial_xendomain())
                return;
 
        /* video rom */
@@ -1458,7 +1458,7 @@ static void __init register_memory(void)
        int           i;
 
        /* Nothing to do if not running in dom0. */
-       if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
+       if (!is_initial_xendomain()) {
                legacy_init_iomem_resources(e820.map, e820.nr_map,
                                            &code_resource, &data_resource);
                return;
@@ -1618,7 +1618,7 @@ void __init setup_arch(char **cmdline_p)
 
        /* Force a quick death if the kernel panics (not domain 0). */
        extern int panic_timeout;
-       if (!panic_timeout && !(xen_start_info->flags & SIF_INITDOMAIN))
+       if (!panic_timeout && !is_initial_xendomain())
                panic_timeout = 1;
 
        /* Register a call for panic conditions. */
@@ -1661,7 +1661,7 @@ void __init setup_arch(char **cmdline_p)
        }
        bootloader_type = LOADER_TYPE;
 
-       if (xen_start_info->flags & SIF_INITDOMAIN) {
+       if (is_initial_xendomain()) {
                /* This is drawn from a dump from vgacon:startup in
                 * standard Linux. */
                screen_info.orig_video_mode = 3; 
@@ -1788,7 +1788,7 @@ void __init setup_arch(char **cmdline_p)
        }
 #endif
 
-       if (xen_start_info->flags & SIF_INITDOMAIN)
+       if (is_initial_xendomain())
                dmi_scan_machine();
 
 #ifdef CONFIG_X86_GENERICARCH
@@ -1805,7 +1805,7 @@ void __init setup_arch(char **cmdline_p)
 #endif
 
 #ifdef CONFIG_ACPI
-       if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
+       if (!is_initial_xendomain()) {
                printk(KERN_INFO "ACPI in unprivileged domain disabled\n");
                acpi_disabled = 1;
                acpi_ht = 0;
@@ -1831,11 +1831,7 @@ void __init setup_arch(char **cmdline_p)
 
        register_memory();
 
-       if (xen_start_info->flags & SIF_INITDOMAIN) {
-               if (!(xen_start_info->flags & SIF_PRIVILEGED))
-                       panic("Xen granted us console access "
-                             "but not privileged status");
-
+       if (is_initial_xendomain()) {
 #ifdef CONFIG_VT
 #if defined(CONFIG_VGA_CONSOLE)
                if (!efi_enabled ||
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c   Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c   Mon Aug 14 15:21:30 
2006 -0400
@@ -199,7 +199,7 @@ swiotlb_init(void)
                swiotlb = 1;
        } else if ((swiotlb_force != -1) &&
                   is_running_on_xen() &&
-                  (xen_start_info->flags & SIF_INITDOMAIN)) {
+                  is_initial_xendomain()) {
                /* Domain 0 always has a swiotlb. */
                ram_end = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
                if (ram_end <= 0x7ffff)
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c  Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c  Mon Aug 14 15:21:30 
2006 -0400
@@ -470,8 +470,7 @@ int do_settimeofday(struct timespec *tv)
        sec = tv->tv_sec;
        __normalize_time(&sec, &nsec);
 
-       if ((xen_start_info->flags & SIF_INITDOMAIN) &&
-           !independent_wallclock) {
+       if (is_initial_xendomain() && !independent_wallclock) {
                op.cmd = DOM0_SETTIME;
                op.u.settime.secs        = sec;
                op.u.settime.nsecs       = nsec;
@@ -502,8 +501,7 @@ static void sync_xen_wallclock(unsigned 
        s64 nsec;
        dom0_op_t op;
 
-       if (!ntp_synced() || independent_wallclock ||
-           !(xen_start_info->flags & SIF_INITDOMAIN))
+       if (!ntp_synced() || independent_wallclock || !is_initial_xendomain())
                return;
 
        write_seqlock_irq(&xtime_lock);
@@ -532,7 +530,7 @@ static int set_rtc_mmss(unsigned long no
 
        WARN_ON(irqs_disabled());
 
-       if (independent_wallclock || !(xen_start_info->flags & SIF_INITDOMAIN))
+       if (independent_wallclock || !is_initial_xendomain())
                return 0;
 
        /* gets recalled with irq locally disabled */
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/arch/i386/mm/init-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c      Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c      Mon Aug 14 15:21:30 
2006 -0400
@@ -566,7 +566,7 @@ void __init paging_init(void)
 
        /* Setup mapping of lower 1st MB */
        for (i = 0; i < NR_FIX_ISAMAPS; i++)
-               if (xen_start_info->flags & SIF_PRIVILEGED)
+               if (is_initial_xendomain())
                        set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE);
                else
                        __set_fixmap(FIX_ISAMAP_BEGIN - i,
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c   Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c   Mon Aug 14 15:21:30 
2006 -0400
@@ -121,7 +121,7 @@ int direct_remap_pfn_range(struct vm_are
                           domid_t  domid)
 {
        /* Same as remap_pfn_range(). */
-       vma->vm_flags |= VM_IO | VM_RESERVED;
+       vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
 
        if (domid == DOMID_SELF)
                return -EINVAL;
@@ -245,7 +245,7 @@ void __iomem * __ioremap(unsigned long p
        /*
         * Don't remap the low PCI/ISA area, it's always mapped..
         */
-       if (xen_start_info->flags & SIF_PRIVILEGED &&
+       if (is_initial_xendomain() &&
            phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
                return (void __iomem *) isa_bus_to_virt(phys_addr);
 
@@ -425,7 +425,7 @@ void __init *bt_ioremap(unsigned long ph
        /*
         * Don't remap the low PCI/ISA area, it's always mapped..
         */
-       if (xen_start_info->flags & SIF_PRIVILEGED &&
+       if (is_initial_xendomain() &&
            phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
                return isa_bus_to_virt(phys_addr);
 
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/arch/ia64/kernel/setup.c
--- a/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c     Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c     Mon Aug 14 15:21:30 
2006 -0400
@@ -545,12 +545,7 @@ setup_arch (char **cmdline_p)
                       "flags=0x%x\n", s->arch.start_info_pfn,
                       xen_start_info->nr_pages, xen_start_info->flags);
 
-               /* xen_start_info isn't setup yet, get the flags manually */
-               if (xen_start_info->flags & SIF_INITDOMAIN) {
-                       if (!(xen_start_info->flags & SIF_PRIVILEGED))
-                               panic("Xen granted us console access "
-                                     "but not privileged status");
-               } else {
+               if (!is_initial_xendomain()) {
                        extern int console_use_vt;
                        conswitchp = NULL;
                        console_use_vt = 0;
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c
--- a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c   Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c   Mon Aug 14 15:21:30 
2006 -0400
@@ -82,7 +82,7 @@ ia64_xenmem_reservation_op(unsigned long
                        //    of a non-privileged domain, 
                        if ((op == XENMEM_increase_reservation ||
                             op == XENMEM_populate_physmap) &&
-                           !(xen_start_info->flags & SIF_PRIVILEGED) &&
+                           !is_initial_xendomain() &&
                            reservation.extent_order > 0)
                                return ret;
                }
diff -r 39c113fb84ac -r 10f1113fd489 
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 Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S       Mon Aug 14 
15:21:30 2006 -0400
@@ -271,7 +271,7 @@ sysret_careful:
        CFI_RESTORE_STATE
        bt $TIF_NEED_RESCHED,%edx
        jnc sysret_signal
-        XEN_BLOCK_EVENTS(%rsi)        
+       XEN_UNBLOCK_EVENTS(%rsi)
        pushq %rdi
        CFI_ADJUST_CFA_OFFSET 8
        call schedule
@@ -295,7 +295,7 @@ 1:  movl $_TIF_NEED_RESCHED,%edi
 1:     movl $_TIF_NEED_RESCHED,%edi
        /* Use IRET because user could have changed frame. This
           works because ptregscall_common has called FIXUP_TOP_OF_STACK. */
-       cli
+       XEN_BLOCK_EVENTS(%rsi)
        jmp int_with_check
        
 badsys:
@@ -377,7 +377,7 @@ int_careful:
        call schedule
        popq %rdi
        CFI_ADJUST_CFA_OFFSET -8
-       cli
+       XEN_BLOCK_EVENTS(%rsi)
        jmp int_with_check
 
        /* handle signals and tracing -- both require a full stack frame */
@@ -395,7 +395,7 @@ int_very_careful:
        popq %rdi
        CFI_ADJUST_CFA_OFFSET -8
        andl $~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP),%edi
-       cli
+       XEN_BLOCK_EVENTS(%rsi)
        jmp int_restore_rest
        
 int_signal:
@@ -407,7 +407,7 @@ 1:  movl $_TIF_NEED_RESCHED,%edi
 1:     movl $_TIF_NEED_RESCHED,%edi    
 int_restore_rest:
        RESTORE_REST
-       cli
+       XEN_BLOCK_EVENTS(%rsi)
        jmp int_with_check
        CFI_ENDPROC
                
@@ -535,8 +535,8 @@ retint_careful:
        call  schedule
        popq %rdi               
        CFI_ADJUST_CFA_OFFSET   -8
+       GET_THREAD_INFO(%rcx)
        XEN_BLOCK_EVENTS(%rsi)          
-       GET_THREAD_INFO(%rcx)
 /*     cli */
        jmp retint_check
        
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c       Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c       Mon Aug 14 
15:21:30 2006 -0400
@@ -639,7 +639,7 @@ void __init setup_arch(char **cmdline_p)
        kernel_end = 0;         /* dummy */
        screen_info = SCREEN_INFO;
 
-       if (xen_start_info->flags & SIF_INITDOMAIN) {
+       if (is_initial_xendomain()) {
                /* This is drawn from a dump from vgacon:startup in
                 * standard Linux. */
                screen_info.orig_video_mode = 3;
@@ -860,8 +860,7 @@ void __init setup_arch(char **cmdline_p)
 
        }
 
-       if ( ! (xen_start_info->flags & SIF_INITDOMAIN))
-       {
+       if (!is_initial_xendomain()) {
                acpi_disabled = 1;
 #ifdef  CONFIG_ACPI
                acpi_ht = 0;
@@ -910,7 +909,7 @@ void __init setup_arch(char **cmdline_p)
         */
 #if defined(CONFIG_XEN_PRIVILEGED_GUEST)
        probe_roms();
-       if (xen_start_info->flags & SIF_INITDOMAIN) {
+       if (is_initial_xendomain()) {
                machine_e820 = alloc_bootmem_low_pages(PAGE_SIZE);
 
                memmap.nr_entries = E820MAX;
@@ -919,7 +918,7 @@ void __init setup_arch(char **cmdline_p)
                BUG_ON(HYPERVISOR_memory_op(XENMEM_machine_memory_map, 
&memmap));
 
                e820_reserve_resources(machine_e820, memmap.nr_entries);
-       } else if (!(xen_start_info->flags & SIF_INITDOMAIN))
+       } else
                e820_reserve_resources(e820.map, e820.nr_map);
 #elif defined(CONFIG_XEN)
        e820_reserve_resources(e820.map, e820.nr_map);
@@ -938,7 +937,7 @@ void __init setup_arch(char **cmdline_p)
        }
 
 #if defined(CONFIG_XEN_PRIVILEGED_GUEST)
-       if (xen_start_info->flags & SIF_INITDOMAIN) {
+       if (is_initial_xendomain()) {
                e820_setup_gap(machine_e820, memmap.nr_entries);
                free_bootmem(__pa(machine_e820), PAGE_SIZE);
        }
@@ -957,11 +956,7 @@ void __init setup_arch(char **cmdline_p)
                set_iopl.iopl = 1;
                HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
 
-               if (xen_start_info->flags & SIF_INITDOMAIN) {
-                       if (!(xen_start_info->flags & SIF_PRIVILEGED))
-                               panic("Xen granted us console access "
-                                     "but not privileged status");
-                      
+               if (is_initial_xendomain()) {
 #ifdef CONFIG_VT
 #if defined(CONFIG_VGA_CONSOLE)
                        conswitchp = &vga_con;
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c    Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c    Mon Aug 14 15:21:30 
2006 -0400
@@ -789,7 +789,7 @@ void __init paging_init(void)
 
        /* Setup mapping of lower 1st MB */
        for (i = 0; i < NR_FIX_ISAMAPS; i++)
-               if (xen_start_info->flags & SIF_PRIVILEGED)
+               if (is_initial_xendomain())
                        set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE);
                else
                        __set_fixmap(FIX_ISAMAP_BEGIN - i,
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c
--- a/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c   Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c   Mon Aug 14 15:21:30 
2006 -0400
@@ -718,9 +718,8 @@ static int __init tpmif_init(void)
        long rc = 0;
        struct tpm_private *tp;
 
-       if ((xen_start_info->flags & SIF_INITDOMAIN)) {
+       if (is_initial_xendomain())
                return -EPERM;
-       }
 
        tp = tpm_private_get();
        if (!tp) {
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/console/console.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/console.c        Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/console/console.c        Mon Aug 14 
15:21:30 2006 -0400
@@ -188,7 +188,7 @@ static int __init xen_console_init(void)
        if (!is_running_on_xen())
                return __RETCODE;
 
-       if (xen_start_info->flags & SIF_INITDOMAIN) {
+       if (is_initial_xendomain()) {
                if (xc_mode == XC_DEFAULT)
                        xc_mode = XC_SERIAL;
                kcons_info.write = kcons_write_dom0;
@@ -247,7 +247,7 @@ void xencons_force_flush(void)
        int sz;
 
        /* Emergency console is synchronous, so there's nothing to flush. */
-       if (xen_start_info->flags & SIF_INITDOMAIN)
+       if (is_initial_xendomain())
                return;
 
        /* Spin until console data is flushed through to the daemon. */
@@ -318,7 +318,7 @@ static void __xencons_tx_flush(void)
        int sent, sz, work_done = 0;
 
        if (x_char) {
-               if (xen_start_info->flags & SIF_INITDOMAIN)
+               if (is_initial_xendomain())
                        kcons_write_dom0(NULL, &x_char, 1);
                else
                        while (x_char)
@@ -332,7 +332,7 @@ static void __xencons_tx_flush(void)
                sz = wp - wc;
                if (sz > (wbuf_size - WBUF_MASK(wc)))
                        sz = wbuf_size - WBUF_MASK(wc);
-               if (xen_start_info->flags & SIF_INITDOMAIN) {
+               if (is_initial_xendomain()) {
                        kcons_write_dom0(NULL, &wbuf[WBUF_MASK(wc)], sz);
                        wc += sz;
                } else {
@@ -622,7 +622,7 @@ static int __init xencons_init(void)
                return rc;
        }
 
-       if (xen_start_info->flags & SIF_INITDOMAIN) {
+       if (is_initial_xendomain()) {
                xencons_priv_irq = bind_virq_to_irqhandler(
                        VIRQ_CONSOLE,
                        0,
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c       Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c       Mon Aug 14 
15:21:30 2006 -0400
@@ -92,7 +92,7 @@ static int setup_cpu_watcher(struct noti
                .flags = XBWF_new_thread };
        (void)register_xenbus_watch(&cpu_watch);
 
-       if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
+       if (!is_initial_xendomain()) {
                for_each_cpu(i)
                        vcpu_hotplug(i);
                printk(KERN_INFO "Brought up %ld CPUs\n",
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/core/evtchn.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c    Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c    Mon Aug 14 15:21:30 
2006 -0400
@@ -840,8 +840,7 @@ void __init xen_init_IRQ(void)
 
 #ifdef RTC_IRQ
                /* If not domain 0, force our RTC driver to fail its probe. */
-               if ((i == RTC_IRQ) &&
-                   !(xen_start_info->flags & SIF_INITDOMAIN))
+               if ((i == RTC_IRQ) && !is_initial_xendomain())
                        continue;
 #endif
 
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/core/skbuff.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/skbuff.c    Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/core/skbuff.c    Mon Aug 14 15:21:30 
2006 -0400
@@ -121,8 +121,7 @@ static int __init skbuff_init(void)
        for (order = 0; order <= MAX_SKBUFF_ORDER; order++) {
                size = PAGE_SIZE << order;
                sprintf(name[order], "xen-skb-%lu", size);
-               if (is_running_on_xen() &&
-                   (xen_start_info->flags & SIF_PRIVILEGED))
+               if (is_running_on_xen() && is_initial_xendomain())
                        skbuff_order_cachep[order] = kmem_cache_create(
                                name[order], size, size, 0,
                                skbuff_ctor, skbuff_dtor);
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/core/smpboot.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c   Mon Aug 14 10:03:58 
2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c   Mon Aug 14 15:21:30 
2006 -0400
@@ -255,7 +255,14 @@ void __init smp_prepare_cpus(unsigned in
 
        xen_smp_intr_init(0);
 
-       for_each_cpu_mask (cpu, cpu_possible_map) {
+       /* Restrict the possible_map according to max_cpus. */
+       while ((num_possible_cpus() > 1) && (num_possible_cpus() > max_cpus)) {
+               for (cpu = NR_CPUS-1; !cpu_isset(cpu, cpu_possible_map); cpu--)
+                       continue;
+               cpu_clear(cpu, cpu_possible_map);
+       }
+
+       for_each_cpu (cpu) {
                if (cpu == 0)
                        continue;
 
@@ -266,7 +273,8 @@ void __init smp_prepare_cpus(unsigned in
 #endif
                gdt_descr->address = get_zeroed_page(GFP_KERNEL);
                if (unlikely(!gdt_descr->address)) {
-                       printk(KERN_CRIT "CPU%d failed to allocate GDT\n", cpu);
+                       printk(KERN_CRIT "CPU%d failed to allocate GDT\n",
+                              cpu);
                        continue;
                }
                gdt_descr->size = GDT_SIZE;
@@ -294,7 +302,7 @@ void __init smp_prepare_cpus(unsigned in
                irq_ctx_init(cpu);
 
 #ifdef CONFIG_HOTPLUG_CPU
-               if (xen_start_info->flags & SIF_INITDOMAIN)
+               if (is_initial_xendomain())
                        cpu_set(cpu, cpu_present_map);
 #else
                cpu_set(cpu, cpu_present_map);
@@ -304,12 +312,6 @@ void __init smp_prepare_cpus(unsigned in
        }
 
        init_xenbus_allowed_cpumask();
-
-       /* Currently, Xen gives no dynamic NUMA/HT info. */
-       for (cpu = 1; cpu < NR_CPUS; cpu++) {
-               cpu_sibling_map[cpu] = cpumask_of_cpu(cpu);
-               cpu_core_map[cpu]    = cpumask_of_cpu(cpu);
-       }
 
 #ifdef CONFIG_X86_IO_APIC
        /*
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/netback/loopback.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/loopback.c       Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/loopback.c       Mon Aug 14 
15:21:30 2006 -0400
@@ -218,7 +218,7 @@ static int __init make_loopback(int i)
        return err;
 }
 
-static void __init clean_loopback(int i)
+static void __exit clean_loopback(int i)
 {
        struct net_device *dev1, *dev2;
        char dev_name[IFNAMSIZ];
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/netback/netback.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c        Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c        Mon Aug 14 
15:21:30 2006 -0400
@@ -68,10 +68,6 @@ static struct timer_list net_timer;
 #define MAX_PENDING_REQS 256
 
 static struct sk_buff_head rx_queue;
-static multicall_entry_t rx_mcl[NET_RX_RING_SIZE+1];
-static mmu_update_t rx_mmu[NET_RX_RING_SIZE];
-static gnttab_transfer_t grant_rx_op[NET_RX_RING_SIZE];
-static unsigned char rx_notify[NR_IRQS];
 
 static unsigned long mmap_vstart;
 #define MMAP_VADDR(_req) (mmap_vstart + ((_req) * PAGE_SIZE))
@@ -314,11 +310,23 @@ int xen_network_done(void)
 }
 #endif
 
-static u16 netbk_gop_frag(netif_t *netif, struct page *page, int count, int i)
-{
-       multicall_entry_t *mcl = rx_mcl + count;
-       mmu_update_t *mmu = rx_mmu + count;
-       gnttab_transfer_t *gop = grant_rx_op + count;
+struct netrx_pending_operations {
+       unsigned trans_prod, trans_cons;
+       unsigned mmu_prod, mmu_cons;
+       unsigned mcl_prod, mcl_cons;
+       unsigned meta_prod, meta_cons;
+       mmu_update_t *mmu;
+       gnttab_transfer_t *trans;
+       multicall_entry_t *mcl;
+       struct netbk_rx_meta *meta;
+};
+
+static u16 netbk_gop_frag(netif_t *netif, struct page *page,
+                         int i, struct netrx_pending_operations *npo)
+{
+       mmu_update_t *mmu;
+       gnttab_transfer_t *gop;
+       multicall_entry_t *mcl;
        netif_rx_request_t *req;
        unsigned long old_mfn, new_mfn;
 
@@ -334,46 +342,53 @@ static u16 netbk_gop_frag(netif_t *netif
                 */
                set_phys_to_machine(page_to_pfn(page), new_mfn);
 
+               mcl = npo->mcl + npo->mcl_prod++;
                MULTI_update_va_mapping(mcl, (unsigned long)page_address(page),
                                        pfn_pte_ma(new_mfn, PAGE_KERNEL), 0);
 
+               mmu = npo->mmu + npo->mmu_prod++;
                mmu->ptr = ((maddr_t)new_mfn << PAGE_SHIFT) |
                        MMU_MACHPHYS_UPDATE;
                mmu->val = page_to_pfn(page);
        }
 
        req = RING_GET_REQUEST(&netif->rx, netif->rx.req_cons + i);
+       gop = npo->trans + npo->trans_prod++;
        gop->mfn = old_mfn;
        gop->domid = netif->domid;
        gop->ref = req->gref;
        return req->id;
 }
 
-static void netbk_gop_skb(struct sk_buff *skb, struct netbk_rx_meta *meta,
-                         int count)
+static void netbk_gop_skb(struct sk_buff *skb,
+                         struct netrx_pending_operations *npo)
 {
        netif_t *netif = netdev_priv(skb->dev);
        int nr_frags = skb_shinfo(skb)->nr_frags;
        int i;
        int extra;
-
-       meta[count].frag.page_offset = skb_shinfo(skb)->gso_type;
-       meta[count].frag.size = skb_shinfo(skb)->gso_size;
-       extra = !!meta[count].frag.size + 1;
+       struct netbk_rx_meta *head_meta, *meta;
+
+       head_meta = npo->meta + npo->meta_prod++;
+       head_meta->frag.page_offset = skb_shinfo(skb)->gso_type;
+       head_meta->frag.size = skb_shinfo(skb)->gso_size;
+       extra = !!head_meta->frag.size + 1;
 
        for (i = 0; i < nr_frags; i++) {
-               meta[++count].frag = skb_shinfo(skb)->frags[i];
-               meta[count].id = netbk_gop_frag(netif, meta[count].frag.page,
-                                               count, i + extra);
+               meta = npo->meta + npo->meta_prod++;
+               meta->frag = skb_shinfo(skb)->frags[i];
+               meta->id = netbk_gop_frag(netif, meta->frag.page,
+                                         i + extra, npo);
        }
 
        /*
         * This must occur at the end to ensure that we don't trash
         * skb_shinfo until we're done.
         */
-       meta[count - nr_frags].id = netbk_gop_frag(netif,
-                                                  virt_to_page(skb->data),
-                                                  count - nr_frags, 0);
+       head_meta->id = netbk_gop_frag(netif,
+                                      virt_to_page(skb->data),
+                                      0,
+                                      npo);
        netif->rx.req_cons += nr_frags + extra;
 }
 
@@ -385,22 +400,28 @@ static inline void netbk_free_pages(int 
                put_page(meta[i].frag.page);
 }
 
-static int netbk_check_gop(int nr_frags, domid_t domid, int count)
-{
-       multicall_entry_t *mcl = rx_mcl + count;
-       gnttab_transfer_t *gop = grant_rx_op + count;
+/* This is a twin to netbk_gop_skb.  Assume that netbk_gop_skb was
+   used to set up the operations on the top of
+   netrx_pending_operations, which have since been done.  Check that
+   they didn't give any errors and advance over them. */
+static int netbk_check_gop(int nr_frags, domid_t domid, int count,
+                          struct netrx_pending_operations *npo)
+{
+       multicall_entry_t *mcl;
+       gnttab_transfer_t *gop;
        int status = NETIF_RSP_OKAY;
        int i;
 
        for (i = 0; i <= nr_frags; i++) {
                if (!xen_feature(XENFEAT_auto_translated_physmap)) {
+                       mcl = npo->mcl + npo->mcl_cons++;
                        /* The update_va_mapping() must not fail. */
                        BUG_ON(mcl->result != 0);
-                       mcl++;
-               }
-
+               }
+
+               gop = npo->trans + npo->trans_cons++;
                /* Check the reassignment error code. */
-               if (gop->status != 0) { 
+               if (gop->status != 0) {
                        DPRINTK("Bad status %d from grant transfer to DOM%u\n",
                                gop->status, domid);
                        /*
@@ -408,9 +429,8 @@ static int netbk_check_gop(int nr_frags,
                         * but that should be a fatal error anyway.
                         */
                        BUG_ON(gop->status == GNTST_bad_page);
-                       status = NETIF_RSP_ERROR; 
-               }
-               gop++;
+                       status = NETIF_RSP_ERROR;
+               }
        }
 
        return status;
@@ -449,8 +469,18 @@ static void net_rx_action(unsigned long 
         * Putting hundreds of bytes on the stack is considered rude.
         * Static works because a tasklet can only be on one CPU at any time.
         */
+       static multicall_entry_t rx_mcl[NET_RX_RING_SIZE+3];
+       static mmu_update_t rx_mmu[NET_RX_RING_SIZE];
+       static gnttab_transfer_t grant_rx_op[NET_RX_RING_SIZE];
+       static unsigned char rx_notify[NR_IRQS];
        static u16 notify_list[NET_RX_RING_SIZE];
        static struct netbk_rx_meta meta[NET_RX_RING_SIZE];
+
+       struct netrx_pending_operations npo = {
+               mmu: rx_mmu,
+               trans: grant_rx_op,
+               mcl: rx_mcl,
+               meta: meta};
 
        skb_queue_head_init(&rxq);
 
@@ -471,7 +501,7 @@ static void net_rx_action(unsigned long 
                        break;
                }
 
-               netbk_gop_skb(skb, meta, count);
+               netbk_gop_skb(skb, &npo);
 
                count += nr_frags + 1;
 
@@ -486,8 +516,11 @@ static void net_rx_action(unsigned long 
                return;
 
        if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-               mcl = rx_mcl + count;
-
+               BUG_ON(npo.mcl_prod == 0);
+
+               mcl = npo.mcl + npo.mcl_prod++;
+
+               BUG_ON(mcl[-1].op != __HYPERVISOR_update_va_mapping);
                mcl[-1].args[MULTI_UVMFLAGS_INDEX] = UVMF_TLB_FLUSH|UVMF_ALL;
 
                mcl->op = __HYPERVISOR_mmu_update;
@@ -495,13 +528,17 @@ static void net_rx_action(unsigned long 
                mcl->args[1] = count;
                mcl->args[2] = 0;
                mcl->args[3] = DOMID_SELF;
-
-               ret = HYPERVISOR_multicall(rx_mcl, count + 1);
-               BUG_ON(ret != 0);
-       }
-
-       ret = HYPERVISOR_grant_table_op(GNTTABOP_transfer, grant_rx_op, count);
+       }
+
+       mcl = npo.mcl + npo.mcl_prod++;
+       mcl->op = __HYPERVISOR_grant_table_op;
+       mcl->args[0] = GNTTABOP_transfer;
+       mcl->args[1] = (unsigned long)grant_rx_op;
+       mcl->args[2] = npo.trans_prod;
+
+       ret = HYPERVISOR_multicall(npo.mcl, npo.mcl_prod);
        BUG_ON(ret != 0);
+       BUG_ON(mcl->result != 0);
 
        count = 0;
        while ((skb = __skb_dequeue(&rxq)) != NULL) {
@@ -515,10 +552,11 @@ static void net_rx_action(unsigned long 
                netif->stats.tx_bytes += skb->len;
                netif->stats.tx_packets++;
 
-               netbk_free_pages(nr_frags, meta + count + 1);
-               status = netbk_check_gop(nr_frags, netif->domid, count);
-
-               id = meta[count].id;
+               netbk_free_pages(nr_frags, meta + npo.meta_cons + 1);
+               status = netbk_check_gop(nr_frags, netif->domid, count,
+                                        &npo);
+
+               id = meta[npo.meta_cons].id;
                flags = nr_frags ? NETRXF_more_data : 0;
 
                if (skb->ip_summed == CHECKSUM_HW) /* local packet? */
@@ -532,7 +570,7 @@ static void net_rx_action(unsigned long 
 
                extra = NULL;
 
-               if (meta[count].frag.size) {
+               if (meta[npo.meta_cons].frag.size) {
                        struct netif_extra_info *gso =
                                (struct netif_extra_info *)
                                RING_GET_RESPONSE(&netif->rx,
@@ -543,7 +581,7 @@ static void net_rx_action(unsigned long 
                        else
                                resp->flags |= NETRXF_extra_info;
 
-                       gso->u.gso.size = meta[count].frag.size;
+                       gso->u.gso.size = meta[npo.meta_cons].frag.size;
                        gso->u.gso.type = XEN_NETIF_GSO_TYPE_TCPV4;
                        gso->u.gso.pad = 0;
                        gso->u.gso.features = 0;
@@ -553,7 +591,8 @@ static void net_rx_action(unsigned long 
                        extra = gso;
                }
 
-               netbk_add_frag_responses(netif, status, meta + count + 1,
+               netbk_add_frag_responses(netif, status,
+                                        meta + npo.meta_cons + 1,
                                         nr_frags);
 
                RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netif->rx, ret);
@@ -569,7 +608,8 @@ static void net_rx_action(unsigned long 
 
                netif_put(netif);
                dev_kfree_skb(skb);
-               count += nr_frags + 1;
+
+               npo.meta_cons += nr_frags + 1;
        }
 
        while (notify_nr != 0) {
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Mon Aug 14 
15:21:30 2006 -0400
@@ -1818,7 +1818,7 @@ static int __init netif_init(void)
        if (!is_running_on_xen())
                return -ENODEV;
 
-       if (xen_start_info->flags & SIF_INITDOMAIN)
+       if (is_initial_xendomain())
                return 0;
 
        IPRINTK("Initialising virtual ethernet driver.\n");
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c
--- a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c        Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c        Mon Aug 14 
15:21:30 2006 -0400
@@ -246,7 +246,7 @@ static int capabilities_read(char *page,
        int len = 0;
        *page = 0;
 
-       if (xen_start_info->flags & SIF_INITDOMAIN)
+       if (is_initial_xendomain())
                len = sprintf( page, "control_d\n" );
 
        *eof = 1;
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c    Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c    Mon Aug 14 
15:21:30 2006 -0400
@@ -47,11 +47,6 @@ static DECLARE_WORK(probe_work, xenbus_p
 
 DECLARE_WAIT_QUEUE_HEAD(xb_waitq);
 
-static inline struct xenstore_domain_interface *xenstore_domain_interface(void)
-{
-       return mfn_to_virt(xen_start_info->store_mfn);
-}
-
 static irqreturn_t wake_waiting(int irq, void *unused, struct pt_regs *regs)
 {
        if (unlikely(xenstored_ready == 0)) {
@@ -90,7 +85,7 @@ static const void *get_input_chunk(XENST
 
 int xb_write(const void *data, unsigned len)
 {
-       struct xenstore_domain_interface *intf = xenstore_domain_interface();
+       struct xenstore_domain_interface *intf = xen_store_interface;
        XENSTORE_RING_IDX cons, prod;
        int rc;
 
@@ -129,7 +124,7 @@ int xb_write(const void *data, unsigned 
                intf->req_prod += avail;
 
                /* This implies mb() before other side sees interrupt. */
-               notify_remote_via_evtchn(xen_start_info->store_evtchn);
+               notify_remote_via_evtchn(xen_store_evtchn);
        }
 
        return 0;
@@ -137,7 +132,7 @@ int xb_write(const void *data, unsigned 
 
 int xb_read(void *data, unsigned len)
 {
-       struct xenstore_domain_interface *intf = xenstore_domain_interface();
+       struct xenstore_domain_interface *intf = xen_store_interface;
        XENSTORE_RING_IDX cons, prod;
        int rc;
 
@@ -180,7 +175,7 @@ int xb_read(void *data, unsigned len)
                pr_debug("Finished read of %i bytes (%i to go)\n", avail, len);
 
                /* Implies mb(): they will see new header. */
-               notify_remote_via_evtchn(xen_start_info->store_evtchn);
+               notify_remote_via_evtchn(xen_store_evtchn);
        }
 
        return 0;
@@ -195,7 +190,7 @@ int xb_init_comms(void)
                unbind_from_irqhandler(xenbus_irq, &xb_waitq);
 
        err = bind_evtchn_to_irqhandler(
-               xen_start_info->store_evtchn, wake_waiting,
+               xen_store_evtchn, wake_waiting,
                0, "xenbus", &xb_waitq);
        if (err <= 0) {
                printk(KERN_ERR "XENBUS request irq failed %i\n", err);
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h    Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h    Mon Aug 14 
15:21:30 2006 -0400
@@ -39,5 +39,7 @@ int xb_read(void *data, unsigned len);
 int xb_read(void *data, unsigned len);
 int xs_input_avail(void);
 extern wait_queue_head_t xb_waitq;
+extern struct xenstore_domain_interface *xen_store_interface;
+extern int xen_store_evtchn;
 
 #endif /* _XENBUS_COMMS_H */
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c      Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c      Mon Aug 14 
15:21:30 2006 -0400
@@ -285,7 +285,7 @@ static int xenbus_dev_open(struct inode 
 {
        struct xenbus_dev_data *u;
 
-       if (xen_start_info->store_evtchn == 0)
+       if (xen_store_evtchn == 0)
                return -ENOENT;
 
        nonseekable_open(inode, filp);
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Mon Aug 14 
15:21:30 2006 -0400
@@ -54,6 +54,10 @@
 
 #include "xenbus_comms.h"
 
+int xen_store_evtchn;
+struct xenstore_domain_interface *xen_store_interface;
+static unsigned long xen_store_mfn;
+
 extern struct mutex xenwatch_mutex;
 
 static struct notifier_block *xenstore_chain;
@@ -928,8 +932,7 @@ static int xsd_kva_mmap(struct file *fil
        if ((size > PAGE_SIZE) || (vma->vm_pgoff != 0))
                return -EINVAL;
 
-       if (remap_pfn_range(vma, vma->vm_start,
-                           mfn_to_pfn(xen_start_info->store_mfn),
+       if (remap_pfn_range(vma, vma->vm_start, mfn_to_pfn(xen_store_mfn),
                            size, vma->vm_page_prot))
                return -EAGAIN;
 
@@ -941,7 +944,7 @@ static int xsd_kva_read(char *page, char
 {
        int len;
 
-       len  = sprintf(page, "0x%p", mfn_to_virt(xen_start_info->store_mfn));
+       len  = sprintf(page, "0x%p", xen_store_interface);
        *eof = 1;
        return len;
 }
@@ -951,12 +954,11 @@ static int xsd_port_read(char *page, cha
 {
        int len;
 
-       len  = sprintf(page, "%d", xen_start_info->store_evtchn);
+       len  = sprintf(page, "%d", xen_store_evtchn);
        *eof = 1;
        return len;
 }
 #endif
-
 
 static int __init xenbus_probe_init(void)
 {
@@ -985,7 +987,7 @@ static int __init xenbus_probe_init(void
                if (!page)
                        return -ENOMEM;
 
-               xen_start_info->store_mfn =
+               xen_store_mfn = xen_start_info->store_mfn =
                        pfn_to_mfn(virt_to_phys((void *)page) >>
                                   PAGE_SHIFT);
 
@@ -998,7 +1000,8 @@ static int __init xenbus_probe_init(void
                if (err == -ENOSYS)
                        goto err;
                BUG_ON(err);
-               xen_start_info->store_evtchn = alloc_unbound.port;
+               xen_store_evtchn = xen_start_info->store_evtchn =
+                       alloc_unbound.port;
 
 #ifdef CONFIG_PROC_FS
                /* And finally publish the above info in /proc/xen */
@@ -1014,8 +1017,13 @@ static int __init xenbus_probe_init(void
                if (xsd_port_intf)
                        xsd_port_intf->read_proc = xsd_port_read;
 #endif
-       } else
+       } else {
                xenstored_ready = 1;
+               xen_store_evtchn = xen_start_info->store_evtchn;
+               xen_store_mfn = xen_start_info->store_mfn;
+       }
+
+       xen_store_interface = mfn_to_virt(xen_store_mfn);
 
        /* Initialize the interface to xenstore. */
        err = xs_init();
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h    Mon Aug 
14 10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h    Mon Aug 
14 15:21:30 2006 -0400
@@ -354,6 +354,13 @@ HYPERVISOR_nmi_op(
        return _hypercall2(int, nmi_op, op, arg);
 }
 
+static inline unsigned long
+HYPERVISOR_hvm_op(
+    int op, void *arg)
+{
+    return _hypercall2(unsigned long, hvm_op, op, arg);
+}
+
 static inline int
 HYPERVISOR_callback_op(
        int cmd, void *arg)
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h   Mon Aug 
14 10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h   Mon Aug 
14 15:21:30 2006 -0400
@@ -58,6 +58,7 @@ extern shared_info_t *HYPERVISOR_shared_
 
 /* arch/xen/i386/kernel/setup.c */
 extern start_info_t *xen_start_info;
+#define is_initial_xendomain() (xen_start_info->flags & SIF_INITDOMAIN)
 
 /* arch/xen/kernel/evtchn.c */
 /* Force a proper event-channel callback from Xen. */
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h Mon Aug 14 
15:21:30 2006 -0400
@@ -60,123 +60,6 @@
 #define clear_user_page(page, vaddr, pg)       clear_page(page)
 #define copy_user_page(to, from, vaddr, pg)    copy_page(to, from)
 
-/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
-#define INVALID_P2M_ENTRY      (~0UL)
-#define FOREIGN_FRAME_BIT      (1UL<<31)
-#define FOREIGN_FRAME(m)       ((m) | FOREIGN_FRAME_BIT)
-
-extern unsigned long *phys_to_machine_mapping;
-
-#undef machine_to_phys_mapping
-extern unsigned long *machine_to_phys_mapping;
-extern unsigned int   machine_to_phys_order;
-
-static inline unsigned long pfn_to_mfn(unsigned long pfn)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return pfn;
-       return phys_to_machine_mapping[(unsigned int)(pfn)] &
-               ~FOREIGN_FRAME_BIT;
-}
-
-static inline int phys_to_machine_mapping_valid(unsigned long pfn)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return 1;
-       return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY);
-}
-
-static inline unsigned long mfn_to_pfn(unsigned long mfn)
-{
-       extern unsigned long max_mapnr;
-       unsigned long pfn;
-
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return mfn;
-
-       if (unlikely((mfn >> machine_to_phys_order) != 0))
-               return max_mapnr;
-
-       /* The array access can fail (e.g., device space beyond end of RAM). */
-       asm (
-               "1:     movl %1,%0\n"
-               "2:\n"
-               ".section .fixup,\"ax\"\n"
-               "3:     movl %2,%0\n"
-               "       jmp  2b\n"
-               ".previous\n"
-               ".section __ex_table,\"a\"\n"
-               "       .align 4\n"
-               "       .long 1b,3b\n"
-               ".previous"
-               : "=r" (pfn)
-               : "m" (machine_to_phys_mapping[mfn]), "m" (max_mapnr) );
-
-       return pfn;
-}
-
-/*
- * We detect special mappings in one of two ways:
- *  1. If the MFN is an I/O page then Xen will set the m2p entry
- *     to be outside our maximum possible pseudophys range.
- *  2. If the MFN belongs to a different domain then we will certainly
- *     not have MFN in our p2m table. Conversely, if the page is ours,
- *     then we'll have p2m(m2p(MFN))==MFN.
- * If we detect a special mapping then it doesn't have a 'struct page'.
- * We force !pfn_valid() by returning an out-of-range pointer.
- *
- * NB. These checks require that, for any MFN that is not in our reservation,
- * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if
- * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN.
- * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety.
- *
- * NB2. When deliberately mapping foreign pages into the p2m table, you *must*
- *      use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we
- *      require. In all the cases we care about, the FOREIGN_FRAME bit is
- *      masked (e.g., pfn_to_mfn()) so behaviour there is correct.
- */
-static inline unsigned long mfn_to_local_pfn(unsigned long mfn)
-{
-       extern unsigned long max_mapnr;
-       unsigned long pfn = mfn_to_pfn(mfn);
-       if ((pfn < max_mapnr)
-           && !xen_feature(XENFEAT_auto_translated_physmap)
-           && (phys_to_machine_mapping[pfn] != mfn))
-               return max_mapnr; /* force !pfn_valid() */
-       return pfn;
-}
-
-static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap)) {
-               BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY);
-               return;
-       }
-       phys_to_machine_mapping[pfn] = mfn;
-}
-
-/* Definitions for machine and pseudophysical addresses. */
-#ifdef CONFIG_X86_PAE
-typedef unsigned long long paddr_t;
-typedef unsigned long long maddr_t;
-#else
-typedef unsigned long paddr_t;
-typedef unsigned long maddr_t;
-#endif
-
-static inline maddr_t phys_to_machine(paddr_t phys)
-{
-       maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
-       machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
-       return machine;
-}
-static inline paddr_t machine_to_phys(maddr_t machine)
-{
-       paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
-       phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
-       return phys;
-}
-
 /*
  * These are used to make use of C type-checking..
  */
@@ -187,6 +70,8 @@ typedef struct { unsigned long long pmd;
 typedef struct { unsigned long long pmd; } pmd_t;
 typedef struct { unsigned long long pgd; } pgd_t;
 typedef struct { unsigned long long pgprot; } pgprot_t;
+#define pgprot_val(x)  ((x).pgprot)
+#include <asm/maddr.h>
 #define __pte(x) ({ unsigned long long _x = (x);        \
     if (_x & 1) _x = phys_to_machine(_x);               \
     ((pte_t) {(unsigned long)(_x), (unsigned long)(_x>>32)}); })
@@ -227,6 +112,8 @@ typedef struct { unsigned long pte_low; 
 typedef struct { unsigned long pte_low; } pte_t;
 typedef struct { unsigned long pgd; } pgd_t;
 typedef struct { unsigned long pgprot; } pgprot_t;
+#define pgprot_val(x)  ((x).pgprot)
+#include <asm/maddr.h>
 #define boot_pte_t pte_t /* or would you rather have a typedef */
 #define pte_val(x)     (((x).pte_low & 1) ? machine_to_phys((x).pte_low) : \
                         (x).pte_low)
@@ -252,9 +139,6 @@ static inline unsigned long pgd_val(pgd_
 #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
 #endif
 
-#define pgprot_val(x)  ((x).pgprot)
-
-#define __pte_ma(x)    ((pte_t) { (x) } )
 #define __pgprot(x)    ((pgprot_t) { (x) } )
 
 #endif /* !__ASSEMBLY__ */
@@ -323,11 +207,6 @@ extern int page_is_ram(unsigned long pag
        ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \
                 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
 
-/* VIRT <-> MACHINE conversion */
-#define virt_to_machine(v)     (phys_to_machine(__pa(v)))
-#define virt_to_mfn(v)         (pfn_to_mfn(__pa(v) >> PAGE_SHIFT))
-#define mfn_to_virt(m)         (__va(mfn_to_pfn(m) << PAGE_SHIFT))
-
 #define __HAVE_ARCH_GATE_AREA 1
 
 #endif /* __KERNEL__ */
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h       
Mon Aug 14 10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h       
Mon Aug 14 15:21:30 2006 -0400
@@ -45,7 +45,6 @@
 
 #define pte_none(x)            (!(x).pte_low)
 #define pfn_pte(pfn, prot)     __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
-#define pfn_pte_ma(pfn, prot)  __pte_ma(((pfn) << PAGE_SHIFT) | 
pgprot_val(prot))
 #define pfn_pmd(pfn, prot)     __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
 
 /*
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h       
Mon Aug 14 10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h       
Mon Aug 14 15:21:30 2006 -0400
@@ -151,18 +151,6 @@ static inline int pte_none(pte_t pte)
 
 extern unsigned long long __supported_pte_mask;
 
-static inline pte_t pfn_pte_ma(unsigned long page_nr, pgprot_t pgprot)
-{
-       pte_t pte;
-
-       pte.pte_high = (page_nr >> (32 - PAGE_SHIFT)) | \
-                                       (pgprot_val(pgprot) >> 32);
-       pte.pte_high &= (__supported_pte_mask >> 32);
-       pte.pte_low = ((page_nr << PAGE_SHIFT) | pgprot_val(pgprot)) & \
-                                                       __supported_pte_mask;
-       return pte;
-}
-
 static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
 {
        return pfn_pte_ma(pfn_to_mfn(page_nr), pgprot);
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h        Mon Aug 14 
10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h        Mon Aug 14 
15:21:30 2006 -0400
@@ -58,6 +58,8 @@ extern int running_on_xen;
 
 extern shared_info_t *HYPERVISOR_shared_info;
 extern start_info_t *xen_start_info;
+
+#define is_initial_xendomain() (xen_start_info->flags & SIF_INITDOMAIN)
 
 void force_evtchn_callback(void);
 
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h  Mon Aug 
14 10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h  Mon Aug 
14 15:21:30 2006 -0400
@@ -355,6 +355,13 @@ HYPERVISOR_nmi_op(
        return _hypercall2(int, nmi_op, op, arg);
 }
 
+static inline unsigned long
+HYPERVISOR_hvm_op(
+    int op, void *arg)
+{
+    return _hypercall2(unsigned long, hvm_op, op, arg);
+}
+
 static inline int
 HYPERVISOR_callback_op(
        int cmd, void *arg)
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h       Mon Aug 
14 10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h       Mon Aug 
14 15:21:30 2006 -0400
@@ -7,7 +7,6 @@
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <asm/bug.h>
-#include <xen/features.h>
 #endif
 #include <xen/interface/xen.h> 
 #include <xen/foreign_page.h>
@@ -69,6 +68,8 @@
 
 extern unsigned long end_pfn;
 
+#include <asm/maddr.h>
+
 void clear_page(void *);
 void copy_page(void *, void *);
 
@@ -77,118 +78,6 @@ void copy_page(void *, void *);
 
 #define alloc_zeroed_user_highpage(vma, vaddr) alloc_page_vma(GFP_HIGHUSER | 
__GFP_ZERO, vma, vaddr)
 #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
-
-/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
-#define INVALID_P2M_ENTRY      (~0UL)
-#define FOREIGN_FRAME_BIT      (1UL<<63)
-#define FOREIGN_FRAME(m)       ((m) | FOREIGN_FRAME_BIT)
-
-extern unsigned long *phys_to_machine_mapping;
-
-#undef machine_to_phys_mapping
-extern unsigned long *machine_to_phys_mapping;
-extern unsigned int   machine_to_phys_order;
-
-static inline unsigned long pfn_to_mfn(unsigned long pfn)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return pfn;
-       return phys_to_machine_mapping[(unsigned int)(pfn)] &
-               ~FOREIGN_FRAME_BIT;
-}
-
-static inline int phys_to_machine_mapping_valid(unsigned long pfn)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return 1;
-       return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY);
-}
-
-static inline unsigned long mfn_to_pfn(unsigned long mfn)
-{
-       unsigned long pfn;
-
-       if (xen_feature(XENFEAT_auto_translated_physmap))
-               return mfn;
-
-       if (unlikely((mfn >> machine_to_phys_order) != 0))
-               return end_pfn;
-
-       /* The array access can fail (e.g., device space beyond end of RAM). */
-       asm (
-               "1:     movq %1,%0\n"
-               "2:\n"
-               ".section .fixup,\"ax\"\n"
-               "3:     movq %2,%0\n"
-               "       jmp  2b\n"
-               ".previous\n"
-               ".section __ex_table,\"a\"\n"
-               "       .align 8\n"
-               "       .quad 1b,3b\n"
-               ".previous"
-               : "=r" (pfn)
-               : "m" (machine_to_phys_mapping[mfn]), "m" (end_pfn) );
-
-       return pfn;
-}
-
-/*
- * We detect special mappings in one of two ways:
- *  1. If the MFN is an I/O page then Xen will set the m2p entry
- *     to be outside our maximum possible pseudophys range.
- *  2. If the MFN belongs to a different domain then we will certainly
- *     not have MFN in our p2m table. Conversely, if the page is ours,
- *     then we'll have p2m(m2p(MFN))==MFN.
- * If we detect a special mapping then it doesn't have a 'struct page'.
- * We force !pfn_valid() by returning an out-of-range pointer.
- *
- * NB. These checks require that, for any MFN that is not in our reservation,
- * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if
- * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN.
- * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety.
- *
- * NB2. When deliberately mapping foreign pages into the p2m table, you *must*
- *      use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we
- *      require. In all the cases we care about, the FOREIGN_FRAME bit is
- *      masked (e.g., pfn_to_mfn()) so behaviour there is correct.
- */
-static inline unsigned long mfn_to_local_pfn(unsigned long mfn)
-{
-       unsigned long pfn = mfn_to_pfn(mfn);
-       if ((pfn < end_pfn)
-           && !xen_feature(XENFEAT_auto_translated_physmap)
-           && (phys_to_machine_mapping[pfn] != mfn))
-               return end_pfn; /* force !pfn_valid() */
-       return pfn;
-}
-
-
-static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
-{
-       if (xen_feature(XENFEAT_auto_translated_physmap)) {
-               BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY);
-               return;
-       }
-       phys_to_machine_mapping[pfn] = mfn;
-}
-
-/* Definitions for machine and pseudophysical addresses. */
-typedef unsigned long paddr_t;
-typedef unsigned long maddr_t;
-
-static inline maddr_t phys_to_machine(paddr_t phys)
-{
-       maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
-       machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
-       return machine;
-}
-
-static inline paddr_t machine_to_phys(maddr_t machine)
-{
-       paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
-       phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
-       return phys;
-}
 
 /*
  * These are used to make use of C type-checking..
@@ -227,8 +116,6 @@ static inline unsigned long pgd_val(pgd_
 }
 
 #define pgprot_val(x)  ((x).pgprot)
-
-#define __pte_ma(x)     ((pte_t) { (x) } )
 
 static inline pte_t __pte(unsigned long x)
 {
@@ -310,11 +197,6 @@ static inline pgd_t __pgd(unsigned long 
 #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
 #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
 
-/* VIRT <-> MACHINE conversion */
-#define virt_to_machine(v)     (phys_to_machine(__pa(v)))
-#define virt_to_mfn(v)         (pfn_to_mfn(__pa(v) >> PAGE_SHIFT))
-#define mfn_to_virt(m)         (__va(mfn_to_pfn(m) << PAGE_SHIFT))
-
 #define VM_DATA_DEFAULT_FLAGS \
        (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \
         VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h    Mon Aug 
14 10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h    Mon Aug 
14 15:21:30 2006 -0400
@@ -312,7 +312,6 @@ static inline pte_t pfn_pte(unsigned lon
        return pte;
 }
 
-#define pfn_pte_ma(pfn, prot)  __pte_ma((((pfn) << PAGE_SHIFT) | 
pgprot_val(prot)) & __supported_pte_mask)
 /*
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/mm/memory.c
--- a/linux-2.6-xen-sparse/mm/memory.c  Mon Aug 14 10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/mm/memory.c  Mon Aug 14 15:21:30 2006 -0400
@@ -390,7 +390,7 @@ struct page *vm_normal_page(struct vm_ar
 
        if (vma->vm_flags & VM_PFNMAP) {
                unsigned long off = (addr - vma->vm_start) >> PAGE_SHIFT;
-               if (pfn == vma->vm_pgoff + off)
+               if ((pfn == vma->vm_pgoff + off) || !pfn_valid(pfn))
                        return NULL;
                if (!is_cow_mapping(vma->vm_flags))
                        return NULL;
@@ -405,8 +405,7 @@ struct page *vm_normal_page(struct vm_ar
         * Remove this test eventually!
         */
        if (unlikely(!pfn_valid(pfn))) {
-               if (!(vma->vm_flags & VM_RESERVED))
-                       print_bad_pte(vma, pte, addr);
+               print_bad_pte(vma, pte, addr);
                return NULL;
        }
 
diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/net/core/dev.c
--- a/linux-2.6-xen-sparse/net/core/dev.c       Mon Aug 14 10:03:58 2006 -0400
+++ b/linux-2.6-xen-sparse/net/core/dev.c       Mon Aug 14 15:21:30 2006 -0400
@@ -1093,11 +1093,6 @@ int skb_checksum_help(struct sk_buff *sk
                goto out_set_summed;
 
        if (unlikely(skb_shinfo(skb)->gso_size)) {
-               static int warned;
-
-               WARN_ON(!warned);
-               warned = 1;
-
                /* Let GSO fix up the checksum. */
                goto out_set_summed;
        }
@@ -1147,11 +1142,6 @@ struct sk_buff *skb_gso_segment(struct s
        __skb_pull(skb, skb->mac_len);
 
        if (unlikely(skb->ip_summed != CHECKSUM_HW)) {
-               static int warned;
-
-               WARN_ON(!warned);
-               warned = 1;
-
                if (skb_header_cloned(skb) &&
                    (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
                        return ERR_PTR(err);
diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/Makefile
--- a/tools/firmware/hvmloader/Makefile Mon Aug 14 10:03:58 2006 -0400
+++ b/tools/firmware/hvmloader/Makefile Mon Aug 14 15:21:30 2006 -0400
@@ -31,8 +31,6 @@ DEFINES  =-DDEBUG
 DEFINES  =-DDEBUG
 XENINC   =-I$(XEN_ROOT)/tools/libxc
 
-OBJECTS         = hvmloader.o acpi_madt.o 
-
 # Disable PIE/SSP if GCC supports them. They can break us.
 CFLAGS  += $(call test-gcc-flag,$(CC),-nopie)
 CFLAGS  += $(call test-gcc-flag,$(CC),-fno-stack-protector)
@@ -42,7 +40,7 @@ CFLAGS  += $(DEFINES) -I. $(XENINC) -fno
 CFLAGS  += $(DEFINES) -I. $(XENINC) -fno-builtin -O2 -msoft-float
 LDFLAGS  = -m32 -nostdlib -Wl,-N -Wl,-Ttext -Wl,$(LOADADDR)
 
-SRCS = hvmloader.c acpi_madt.c mp_tables.c util.c
+SRCS = hvmloader.c acpi_madt.c mp_tables.c util.c smbios.c
 OBJS = $(patsubst %.c,%.o,$(SRCS))
 
 .PHONY: all
@@ -54,7 +52,7 @@ hvmloader: roms.h $(SRCS)
        $(OBJCOPY) hvmloader.tmp hvmloader
        rm -f hvmloader.tmp
 
-roms.h:        ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin 
../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin
+roms.h:        ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin 
../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin 
../acpi/acpi.bin
        sh ./mkhex rombios ../rombios/BIOS-bochs-latest > roms.h
        sh ./mkhex vgabios_stdvga ../vgabios/VGABIOS-lgpl-latest.bin >> roms.h
        sh ./mkhex vgabios_cirrusvga ../vgabios/VGABIOS-lgpl-latest.cirrus.bin 
>> roms.h
@@ -64,5 +62,5 @@ roms.h:       ../rombios/BIOS-bochs-latest ../
 .PHONY: clean
 clean:
        rm -f roms.h acpi.h
-       rm -f hvmloader hvmloader.tmp hvmloader.o $(OBJECTS)
+       rm -f hvmloader hvmloader.tmp hvmloader.o $(OBJS)
 
diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c      Mon Aug 14 10:03:58 2006 -0400
+++ b/tools/firmware/hvmloader/hvmloader.c      Mon Aug 14 15:21:30 2006 -0400
@@ -25,6 +25,7 @@
 #include "../acpi/acpi2_0.h"  /* for ACPI_PHYSICAL_ADDRESS */
 #include "hypercall.h"
 #include "util.h"
+#include "smbios.h"
 #include <xen/version.h>
 #include <xen/hvm/params.h>
 
@@ -116,15 +117,6 @@ check_amd(void)
 }
 
 static void
-cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
-{
-       __asm__ __volatile__(
-               "cpuid"
-               : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
-               : "0" (idx) );
-}
-
-static void
 wrmsr(uint32_t idx, uint64_t v)
 {
        __asm__ __volatile__(
@@ -209,6 +201,9 @@ main(void)
                }
        }
 
+       puts("Writing SMBIOS tables ...\n");
+       hvm_write_smbios_tables();
+
        if (check_amd()) {
                /* AMD implies this is SVM */
                 puts("SVM go ...\n");
diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/hypercall.h
--- a/tools/firmware/hvmloader/hypercall.h      Mon Aug 14 10:03:58 2006 -0400
+++ b/tools/firmware/hvmloader/hypercall.h      Mon Aug 14 15:21:30 2006 -0400
@@ -30,6 +30,8 @@
 
 #ifndef __HVMLOADER_HYPERCALL_H__
 #define __HVMLOADER_HYPERCALL_H__
+
+#include <xen/xen.h>
 
 /*
  * NB. Hypercall address needs to be relative to a linkage symbol for
diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/util.c
--- a/tools/firmware/hvmloader/util.c   Mon Aug 14 10:03:58 2006 -0400
+++ b/tools/firmware/hvmloader/util.c   Mon Aug 14 15:21:30 2006 -0400
@@ -20,6 +20,7 @@
 
 #include "../acpi/acpi2_0.h"  /* for ACPI_PHYSICAL_ADDRESS */
 #include "util.h"
+#include <stdint.h>
 
 void outw(uint16_t addr, uint16_t val)
 {
@@ -94,3 +95,82 @@ void puts(const char *s)
        while (*s)
                outb(0xE9, *s++);
 }
+
+char *
+strcpy(char *dest, const char *src)
+{
+       char *p = dest;
+       while (*src)
+               *p++ = *src++;
+       *p = 0;
+       return dest;
+}
+
+char *
+strncpy(char *dest, const char *src, unsigned n)
+{
+       int i = 0;
+       char *p = dest;
+
+       /* write non-NUL characters from src into dest until we run
+          out of room in dest or encounter a NUL in src */
+       while (i < n && *src) {
+               *p++ = *src++;
+               ++i;
+       }
+
+       /* pad remaining bytes of dest with NUL bytes */
+       while (i < n) {
+               *p++ = 0;
+               ++i;
+       }
+
+       return dest;
+}
+
+unsigned
+strlen(const char *s)
+{
+       int i = 0;
+       while (*s++)
+               ++i;
+       return i;
+}
+
+void *
+memset(void *s, int c, unsigned n)
+{
+       uint8_t b = (uint8_t) c;
+       uint8_t *p = (uint8_t *)s;
+       int i;
+       for (i = 0; i < n; ++i)
+               *p++ = b;
+       return s;
+}
+
+int
+memcmp(const void *s1, const void *s2, unsigned n)
+{
+       unsigned i;
+       uint8_t *p1 = (uint8_t *) s1;
+       uint8_t *p2 = (uint8_t *) s2;
+
+       for (i = 0; i < n; ++i) {
+               if (p1[i] < p2[i])
+                       return -1;
+               else if (p1[i] > p2[i])
+                       return 1;
+       }
+
+       return 0;
+}
+
+void
+cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
+{
+       __asm__ __volatile__(
+               "cpuid"
+               : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
+               : "0" (idx) );
+}
+
diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/util.h
--- a/tools/firmware/hvmloader/util.h   Mon Aug 14 10:03:58 2006 -0400
+++ b/tools/firmware/hvmloader/util.h   Mon Aug 14 15:21:30 2006 -0400
@@ -8,9 +8,21 @@ void outb(uint16_t addr, uint8_t val);
 /* I/O input */
 uint8_t inb(uint16_t addr);
 
+/* Do cpuid instruction, with operation 'idx' */
+void cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx,
+           uint32_t *ecx, uint32_t *edx);
+
+/* Return number of vcpus. */
+int get_vcpu_nr(void);
+
 /* String and memory functions */
 int strcmp(const char *cs, const char *ct);
+char *strcpy(char *dest, const char *src);
+char *strncpy(char *dest, const char *src, unsigned n);
+unsigned strlen(const char *s);
+int memcmp(const void *s1, const void *s2, unsigned n);
 void *memcpy(void *dest, const void *src, unsigned n);
+void *memset(void *s, int c, unsigned n);
 char *itoa(char *a, unsigned int i);
 
 /* Debug output */
diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/rombios/rombios.c
--- a/tools/firmware/rombios/rombios.c  Mon Aug 14 10:03:58 2006 -0400
+++ b/tools/firmware/rombios/rombios.c  Mon Aug 14 15:21:30 2006 -0400
@@ -9443,6 +9443,43 @@ rom_scan_increment:
   mov  ds, ax
   ret
 
+#ifdef HVMASSIST
+
+; Copy the SMBIOS entry point over from 0x9f000, where hvmloader left it.
+; The entry point must be somewhere in 0xf0000-0xfffff on a 16-byte boundary,
+; but the tables themeselves can be elsewhere.
+smbios_init:
+  push ax
+  push cx
+  push es
+  push ds
+  push di
+  push si
+
+  mov cx, #0x001f ; 0x1f bytes to copy
+  mov ax, #0xf000
+  mov es, ax      ; destination segment is 0xf0000
+  mov di, smbios_entry_point ; destination offset
+  mov ax, #0x9f00
+  mov ds, ax      ; source segment is 0x9f000
+  mov si, #0x0000 ; source offset is 0
+  cld
+  rep
+    movsb
+
+  pop si
+  pop di
+  pop ds
+  pop es
+  pop cx
+  pop ax
+
+  ret
+
+#endif
+
+
+
 ;; for 'C' strings and other data, insert them here with
 ;; a the following hack:
 ;; DATA_SEG_DEFS_HERE
@@ -9724,6 +9761,7 @@ post_default_ints:
 
 #ifdef HVMASSIST
   call _copy_e820_table
+  call smbios_init
 #endif
 
   call rom_scan
@@ -10538,6 +10576,13 @@ dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;; 768 bytes
 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;; 832 bytes
 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;; 896 bytes
+
+.align 16
+smbios_entry_point:
+db 0,0,0,0,0,0,0,0 ; 8 bytes
+db 0,0,0,0,0,0,0,0 ; 16 bytes
+db 0,0,0,0,0,0,0,0 ; 24 bytes
+db 0,0,0,0,0,0,0   ; 31 bytes
 ASM_END
 
 #else // !HVMASSIST
diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/vmxassist/vmxassist.ld
--- a/tools/firmware/vmxassist/vmxassist.ld     Mon Aug 14 10:03:58 2006 -0400
+++ b/tools/firmware/vmxassist/vmxassist.ld     Mon Aug 14 15:21:30 2006 -0400
@@ -6,27 +6,27 @@ ENTRY(_start)
 
 SECTIONS
 {
+       _btext = .;
        .text TEXTADDR : 
        {
-               _btext = .;
                *(.text)
                *(.rodata)
                *(.rodata.*)
-               _etext = .;
        }
+       _etext = .;
 
+       _bdata = .;
        .data :
        {
-               _bdata = .;
                *(.data)
-               _edata = .;
        }
+       _edata = .;
 
+       _bbss = .;
        .bss :
        {
-               _bbss = .;
                *(.bss)
-               _ebss = .;
        }
+       _ebss = .;
 }
 
diff -r 39c113fb84ac -r 10f1113fd489 tools/libxc/xc_evtchn.c
--- a/tools/libxc/xc_evtchn.c   Mon Aug 14 10:03:58 2006 -0400
+++ b/tools/libxc/xc_evtchn.c   Mon Aug 14 15:21:30 2006 -0400
@@ -49,14 +49,3 @@ int xc_evtchn_alloc_unbound(int xc_handl
 
     return rc;
 }
-
-
-int xc_evtchn_status(int xc_handle,
-                     uint32_t dom,
-                     evtchn_port_t port,
-                     xc_evtchn_status_t *status)
-{
-    status->dom  = (domid_t)dom;
-    status->port = port;
-    return do_evtchn_op(xc_handle, EVTCHNOP_status, status, sizeof(*status));
-}
diff -r 39c113fb84ac -r 10f1113fd489 tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c        Mon Aug 14 10:03:58 2006 -0400
+++ b/tools/libxc/xc_hvm_build.c        Mon Aug 14 15:21:30 2006 -0400
@@ -58,12 +58,12 @@ static void build_e820map(void *e820_pag
 
     /* XXX: Doesn't work for > 4GB yet */
     e820entry[nr_map].addr = 0x0;
-    e820entry[nr_map].size = 0x9F800;
+    e820entry[nr_map].size = 0x9F000;
     e820entry[nr_map].type = E820_RAM;
     nr_map++;
 
-    e820entry[nr_map].addr = 0x9F800;
-    e820entry[nr_map].size = 0x800;
+    e820entry[nr_map].addr = 0x9F000;
+    e820entry[nr_map].size = 0x1000;
     e820entry[nr_map].type = E820_RESERVED;
     nr_map++;
 
diff -r 39c113fb84ac -r 10f1113fd489 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Mon Aug 14 10:03:58 2006 -0400
+++ b/tools/libxc/xenctrl.h     Mon Aug 14 15:21:30 2006 -0400
@@ -367,8 +367,6 @@ int xc_sched_credit_domain_get(int xc_ha
                                uint32_t domid,
                                struct sched_credit_adjdom *sdom);
 
-typedef evtchn_status_t xc_evtchn_status_t;
-
 /*
  * EVENT CHANNEL FUNCTIONS
  */
@@ -386,11 +384,6 @@ int xc_evtchn_alloc_unbound(int xc_handl
 int xc_evtchn_alloc_unbound(int xc_handle,
                             uint32_t dom,
                             uint32_t remote_dom);
-
-int xc_evtchn_status(int xc_handle,
-                     uint32_t dom, /* may be DOMID_SELF */
-                     evtchn_port_t port,
-                     xc_evtchn_status_t *status);
 
 int xc_physdev_pci_access_modify(int xc_handle,
                                  uint32_t domid,
diff -r 39c113fb84ac -r 10f1113fd489 tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Mon Aug 14 10:03:58 2006 -0400
+++ b/tools/python/xen/lowlevel/xc/xc.c Mon Aug 14 15:21:30 2006 -0400
@@ -484,60 +484,6 @@ static PyObject *pyxc_evtchn_alloc_unbou
     return PyInt_FromLong(port);
 }
 
-static PyObject *pyxc_evtchn_status(XcObject *self,
-                                    PyObject *args,
-                                    PyObject *kwds)
-{
-    PyObject *dict;
-
-    uint32_t dom = DOMID_SELF;
-    int port, ret;
-    xc_evtchn_status_t status;
-
-    static char *kwd_list[] = { "port", "dom", NULL };
-
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list, 
-                                      &port, &dom) )
-        return NULL;
-
-    ret = xc_evtchn_status(self->xc_handle, dom, port, &status);
-    if ( ret != 0 )
-        return PyErr_SetFromErrno(xc_error);
-
-    switch ( status.status )
-    {
-    case EVTCHNSTAT_closed:
-        dict = Py_BuildValue("{s:s}", 
-                             "status", "closed");
-        break;
-    case EVTCHNSTAT_unbound:
-        dict = Py_BuildValue("{s:s}", 
-                             "status", "unbound");
-        break;
-    case EVTCHNSTAT_interdomain:
-        dict = Py_BuildValue("{s:s,s:i,s:i}", 
-                             "status", "interdomain",
-                             "dom", status.u.interdomain.dom,
-                             "port", status.u.interdomain.port);
-        break;
-    case EVTCHNSTAT_pirq:
-        dict = Py_BuildValue("{s:s,s:i}", 
-                             "status", "pirq",
-                             "irq", status.u.pirq);
-        break;
-    case EVTCHNSTAT_virq:
-        dict = Py_BuildValue("{s:s,s:i}", 
-                             "status", "virq",
-                             "irq", status.u.virq);
-        break;
-    default:
-        dict = Py_BuildValue("{}");
-        break;
-    }
-    
-    return dict;
-}
-
 static PyObject *pyxc_physdev_pci_access_modify(XcObject *self,
                                                 PyObject *args,
                                                 PyObject *kwds)
@@ -1140,21 +1086,6 @@ static PyMethodDef pyxc_methods[] = {
       " dom        [int]: Domain whose port space to allocate from.\n"
       " remote_dom [int]: Remote domain to accept connections from.\n\n"
       "Returns: [int] Unbound event-channel port.\n" },
-
-    { "evtchn_status", 
-      (PyCFunction)pyxc_evtchn_status, 
-      METH_VARARGS | METH_KEYWORDS, "\n"
-      "Query the status of an event channel.\n"
-      " dom  [int, SELF]: Dom-id of one endpoint of the channel.\n"
-      " port [int]:       Port-id of one endpoint of the channel.\n\n"
-      "Returns: [dict] dictionary is empty on failure.\n"
-      " status [str]:  'closed', 'unbound', 'interdomain', 'pirq',"
-      " or 'virq'.\n"
-      "The following are returned if 'status' is 'interdomain':\n"
-      " dom  [int]: Dom-id of remote endpoint.\n"
-      " port [int]: Port-id of remote endpoint.\n"
-      "The following are returned if 'status' is 'pirq' or 'virq':\n"
-      " irq  [int]: IRQ number.\n" },
 
     { "physdev_pci_access_modify",
       (PyCFunction)pyxc_physdev_pci_access_modify,
diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c  Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/arch/ia64/vmx/mmio.c  Mon Aug 14 15:21:30 2006 -0400
@@ -33,7 +33,7 @@
 #include <asm/mm.h>
 #include <asm/vmx.h>
 #include <public/event_channel.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
 #include <linux/event.h>
 #include <xen/domain.h>
 /*
diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/vmx/vlsapic.c
--- a/xen/arch/ia64/vmx/vlsapic.c       Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/arch/ia64/vmx/vlsapic.c       Mon Aug 14 15:21:30 2006 -0400
@@ -21,7 +21,7 @@
  */
 
 #include <linux/sched.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
 #include <asm/ia64_int.h>
 #include <asm/vcpu.h>
 #include <asm/regionreg.h>
diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/vmx/vmx_init.c
--- a/xen/arch/ia64/vmx/vmx_init.c      Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/arch/ia64/vmx/vmx_init.c      Mon Aug 14 15:21:30 2006 -0400
@@ -41,15 +41,14 @@
 #include <asm/vmx_vcpu.h>
 #include <xen/lib.h>
 #include <asm/vmmu.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
 #include <public/hvm/ioreq.h>
+#include <public/event_channel.h>
 #include <asm/vmx_phy_mode.h>
 #include <asm/processor.h>
 #include <asm/vmx.h>
 #include <xen/mm.h>
-#include <public/arch-ia64.h>
 #include <asm/hvm/vioapic.h>
-#include <public/event_channel.h>
 #include <xen/event.h>
 #include <asm/vlsapic.h>
 
diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/vmx/vmx_vcpu.c
--- a/xen/arch/ia64/vmx/vmx_vcpu.c      Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/arch/ia64/vmx/vmx_vcpu.c      Mon Aug 14 15:21:30 2006 -0400
@@ -24,7 +24,7 @@
  */
 
 #include <xen/sched.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
 #include <asm/ia64_int.h>
 #include <asm/vmx_vcpu.h>
 #include <asm/regionreg.h>
diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/arch/ia64/xen/domain.c        Mon Aug 14 15:21:30 2006 -0400
@@ -35,14 +35,13 @@
 #include <asm/pgalloc.h>
 #include <asm/offsets.h>  /* for IA64_THREAD_INFO_SIZE */
 #include <asm/vcpu.h>   /* for function declarations */
-#include <public/arch-ia64.h>
+#include <public/xen.h>
 #include <xen/domain.h>
 #include <asm/vmx.h>
 #include <asm/vmx_vcpu.h>
 #include <asm/vmx_vpd.h>
 #include <asm/vmx_phy_mode.h>
 #include <asm/vhpt.h>
-#include <public/arch-ia64.h>
 #include <asm/tlbflush.h>
 #include <asm/regionreg.h>
 #include <asm/dom_fw.h>
diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/xen/hyperprivop.S
--- a/xen/arch/ia64/xen/hyperprivop.S   Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/arch/ia64/xen/hyperprivop.S   Mon Aug 14 15:21:30 2006 -0400
@@ -14,7 +14,7 @@
 #include <asm/system.h>
 #include <asm/debugger.h>
 #include <asm/asm-xsi-offsets.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
 
 
 #define        _PAGE_PPN_MASK  0x0003fffffffff000 //asm/pgtable.h doesn't do 
assembly
diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/arch/ia64/xen/vcpu.c  Mon Aug 14 15:21:30 2006 -0400
@@ -7,7 +7,7 @@
  */
 
 #include <linux/sched.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
 #include <asm/ia64_int.h>
 #include <asm/vcpu.h>
 #include <asm/regionreg.h>
diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/xen/xenasm.S
--- a/xen/arch/ia64/xen/xenasm.S        Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/arch/ia64/xen/xenasm.S        Mon Aug 14 15:21:30 2006 -0400
@@ -11,7 +11,7 @@
 #include <asm/pgtable.h>
 #include <asm/vhpt.h>
 #include <asm/asm-xsi-offsets.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
        
 // Change rr7 to the passed value while ensuring
 // Xen is mapped into the new region.
diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/x86/hvm/platform.c
--- a/xen/arch/x86/hvm/platform.c       Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/arch/x86/hvm/platform.c       Mon Aug 14 15:21:30 2006 -0400
@@ -462,7 +462,8 @@ static int hvm_decode(int realmode, unsi
                     return DECODE_success;
 
                 default:
-                    printf("%x, This opcode isn't handled yet!\n", *opcode);
+                    printf("%x/%x, This opcode isn't handled yet!\n",
+                           *opcode, ins_subtype);
                     return DECODE_failure;
             }
         }
diff -r 39c113fb84ac -r 10f1113fd489 xen/common/grant_table.c
--- a/xen/common/grant_table.c  Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/common/grant_table.c  Mon Aug 14 15:21:30 2006 -0400
@@ -33,9 +33,10 @@
 #include <xen/domain_page.h>
 #include <acm/acm_hooks.h>
 
-/* The first to members of a grant entry are updated as a combined
- * pair.  The following union allows that to happen in an endian
- * neutral fashion. */
+/*
+ * The first two members of a grant entry are updated as a combined pair.
+ * The following union allows that to happen in an endian-neutral fashion.
+ */
 union grant_combo {
     uint32_t word;
     struct {
diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/include/asm-ia64/domain.h     Mon Aug 14 15:21:30 2006 -0400
@@ -6,7 +6,7 @@
 #include <asm/vmx_vpd.h>
 #include <asm/vmmu.h>
 #include <asm/regionreg.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
 #include <asm/vmx_platform.h>
 #include <xen/list.h>
 #include <xen/cpumask.h>
diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/event.h
--- a/xen/include/asm-ia64/event.h      Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/include/asm-ia64/event.h      Mon Aug 14 15:21:30 2006 -0400
@@ -9,7 +9,7 @@
 #ifndef __ASM_EVENT_H__
 #define __ASM_EVENT_H__
 
-#include <public/arch-ia64.h>
+#include <public/xen.h>
 #include <asm/vcpu.h>
 
 static inline void vcpu_kick(struct vcpu *v)
diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/linux-xen/asm/ptrace.h
--- a/xen/include/asm-ia64/linux-xen/asm/ptrace.h       Mon Aug 14 10:03:58 
2006 -0400
+++ b/xen/include/asm-ia64/linux-xen/asm/ptrace.h       Mon Aug 14 15:21:30 
2006 -0400
@@ -96,7 +96,8 @@
  *
  */
 #ifdef XEN
-#include <public/arch-ia64.h>
+#include <xen/types.h>
+#include <public/xen.h>
 #define pt_regs cpu_user_regs
 
 /*  User regs at placed at the end of the vcpu area.
diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/privop_stat.h
--- a/xen/include/asm-ia64/privop_stat.h        Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/include/asm-ia64/privop_stat.h        Mon Aug 14 15:21:30 2006 -0400
@@ -1,6 +1,7 @@
 #ifndef _XEN_UA64_PRIVOP_STAT_H
 #define _XEN_UA64_PRIVOP_STAT_H
-#include <public/arch-ia64.h>
+#include <xen/types.h>
+#include <public/xen.h>
 
 extern int dump_privop_counts_to_user(char *, int);
 extern int zero_privop_counts_to_user(char *, int);
diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/vcpu.h
--- a/xen/include/asm-ia64/vcpu.h       Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/include/asm-ia64/vcpu.h       Mon Aug 14 15:21:30 2006 -0400
@@ -7,7 +7,8 @@
 #include <asm/fpu.h>
 #include <asm/tlb.h>
 #include <asm/ia64_int.h>
-#include <public/arch-ia64.h>
+#include <xen/types.h>
+#include <public/xen.h>
 typedef        unsigned long UINT64;
 typedef        unsigned int UINT;
 typedef        int BOOLEAN;
diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/vmx_platform.h
--- a/xen/include/asm-ia64/vmx_platform.h       Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/include/asm-ia64/vmx_platform.h       Mon Aug 14 15:21:30 2006 -0400
@@ -21,7 +21,6 @@
 
 #include <public/xen.h>
 #include <public/hvm/params.h>
-#include <public/arch-ia64.h>
 #include <asm/hvm/vioapic.h>
 struct mmio_list;
 typedef struct virtual_platform_def {
diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/vmx_vpd.h
--- a/xen/include/asm-ia64/vmx_vpd.h    Mon Aug 14 10:03:58 2006 -0400
+++ b/xen/include/asm-ia64/vmx_vpd.h    Mon Aug 14 15:21:30 2006 -0400
@@ -26,7 +26,7 @@
 
 #include <asm/vtm.h>
 #include <asm/vmx_platform.h>
-#include <public/arch-ia64.h>
+#include <public/xen.h>
 
 #define VPD_SHIFT      17      /* 128K requirement */
 #define VPD_SIZE       (1 << VPD_SHIFT)
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/maddr.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/maddr.h        Mon Aug 
14 15:21:30 2006 -0400
@@ -0,0 +1,160 @@
+#ifndef _I386_MADDR_H
+#define _I386_MADDR_H
+
+#include <xen/features.h>
+#include <xen/interface/xen.h>
+
+/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
+#define INVALID_P2M_ENTRY      (~0UL)
+#define FOREIGN_FRAME_BIT      (1UL<<31)
+#define FOREIGN_FRAME(m)       ((m) | FOREIGN_FRAME_BIT)
+
+#ifdef CONFIG_XEN
+
+extern unsigned long *phys_to_machine_mapping;
+
+#undef machine_to_phys_mapping
+extern unsigned long *machine_to_phys_mapping;
+extern unsigned int   machine_to_phys_order;
+
+static inline unsigned long pfn_to_mfn(unsigned long pfn)
+{
+       if (xen_feature(XENFEAT_auto_translated_physmap))
+               return pfn;
+       return phys_to_machine_mapping[(unsigned int)(pfn)] &
+               ~FOREIGN_FRAME_BIT;
+}
+
+static inline int phys_to_machine_mapping_valid(unsigned long pfn)
+{
+       if (xen_feature(XENFEAT_auto_translated_physmap))
+               return 1;
+       return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY);
+}
+
+static inline unsigned long mfn_to_pfn(unsigned long mfn)
+{
+       extern unsigned long max_mapnr;
+       unsigned long pfn;
+
+       if (xen_feature(XENFEAT_auto_translated_physmap))
+               return mfn;
+
+       if (unlikely((mfn >> machine_to_phys_order) != 0))
+               return max_mapnr;
+
+       /* The array access can fail (e.g., device space beyond end of RAM). */
+       asm (
+               "1:     movl %1,%0\n"
+               "2:\n"
+               ".section .fixup,\"ax\"\n"
+               "3:     movl %2,%0\n"
+               "       jmp  2b\n"
+               ".previous\n"
+               ".section __ex_table,\"a\"\n"
+               "       .align 4\n"
+               "       .long 1b,3b\n"
+               ".previous"
+               : "=r" (pfn)
+               : "m" (machine_to_phys_mapping[mfn]), "m" (max_mapnr) );
+
+       return pfn;
+}
+
+/*
+ * We detect special mappings in one of two ways:
+ *  1. If the MFN is an I/O page then Xen will set the m2p entry
+ *     to be outside our maximum possible pseudophys range.
+ *  2. If the MFN belongs to a different domain then we will certainly
+ *     not have MFN in our p2m table. Conversely, if the page is ours,
+ *     then we'll have p2m(m2p(MFN))==MFN.
+ * If we detect a special mapping then it doesn't have a 'struct page'.
+ * We force !pfn_valid() by returning an out-of-range pointer.
+ *
+ * NB. These checks require that, for any MFN that is not in our reservation,
+ * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if
+ * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN.
+ * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety.
+ *
+ * NB2. When deliberately mapping foreign pages into the p2m table, you *must*
+ *      use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we
+ *      require. In all the cases we care about, the FOREIGN_FRAME bit is
+ *      masked (e.g., pfn_to_mfn()) so behaviour there is correct.
+ */
+static inline unsigned long mfn_to_local_pfn(unsigned long mfn)
+{
+       extern unsigned long max_mapnr;
+       unsigned long pfn = mfn_to_pfn(mfn);
+       if ((pfn < max_mapnr)
+           && !xen_feature(XENFEAT_auto_translated_physmap)
+           && (phys_to_machine_mapping[pfn] != mfn))
+               return max_mapnr; /* force !pfn_valid() */
+       return pfn;
+}
+
+static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
+{
+       if (xen_feature(XENFEAT_auto_translated_physmap)) {
+               BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY);
+               return;
+       }
+       phys_to_machine_mapping[pfn] = mfn;
+}
+
+
+#else /* !CONFIG_XEN */
+
+#define pfn_to_mfn(pfn) (pfn)
+#define mfn_to_pfn(mfn) (mfn)
+#define mfn_to_local_pfn(mfn) (mfn)
+#define set_phys_to_machine(pfn, mfn) BUG_ON((pfn) != (mfn))
+#define phys_to_machine_mapping_valid(pfn) (1)
+
+#endif /* !CONFIG_XEN */
+
+/* Definitions for machine and pseudophysical addresses. */
+#ifdef CONFIG_X86_PAE
+typedef unsigned long long paddr_t;
+typedef unsigned long long maddr_t;
+#else
+typedef unsigned long paddr_t;
+typedef unsigned long maddr_t;
+#endif
+
+static inline maddr_t phys_to_machine(paddr_t phys)
+{
+       maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
+       machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
+       return machine;
+}
+static inline paddr_t machine_to_phys(maddr_t machine)
+{
+       paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
+       phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
+       return phys;
+}
+
+/* VIRT <-> MACHINE conversion */
+#define virt_to_machine(v)     (phys_to_machine(__pa(v)))
+#define virt_to_mfn(v)         (pfn_to_mfn(__pa(v) >> PAGE_SHIFT))
+#define mfn_to_virt(m)         (__va(mfn_to_pfn(m) << PAGE_SHIFT))
+
+#ifdef CONFIG_X86_PAE
+static inline pte_t pfn_pte_ma(unsigned long page_nr, pgprot_t pgprot)
+{
+       pte_t pte;
+
+       pte.pte_high = (page_nr >> (32 - PAGE_SHIFT)) | \
+                                       (pgprot_val(pgprot) >> 32);
+       pte.pte_high &= (__supported_pte_mask >> 32);
+       pte.pte_low = ((page_nr << PAGE_SHIFT) | pgprot_val(pgprot)) & \
+                                                       __supported_pte_mask;
+       return pte;
+}
+#else
+#define pfn_pte_ma(pfn, prot)  __pte_ma(((pfn) << PAGE_SHIFT) | 
pgprot_val(prot))
+#endif
+
+#define __pte_ma(x)    ((pte_t) { (x) } )
+
+#endif /* _I386_MADDR_H */
diff -r 39c113fb84ac -r 10f1113fd489 
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/maddr.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/maddr.h      Mon Aug 
14 15:21:30 2006 -0400
@@ -0,0 +1,139 @@
+#ifndef _X86_64_MADDR_H
+#define _X86_64_MADDR_H
+
+#include <xen/features.h>
+#include <xen/interface/xen.h>
+
+/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
+#define INVALID_P2M_ENTRY      (~0UL)
+#define FOREIGN_FRAME_BIT      (1UL<<63)
+#define FOREIGN_FRAME(m)       ((m) | FOREIGN_FRAME_BIT)
+
+#ifdef CONFIG_XEN
+
+extern unsigned long *phys_to_machine_mapping;
+
+#undef machine_to_phys_mapping
+extern unsigned long *machine_to_phys_mapping;
+extern unsigned int   machine_to_phys_order;
+
+static inline unsigned long pfn_to_mfn(unsigned long pfn)
+{
+       if (xen_feature(XENFEAT_auto_translated_physmap))
+               return pfn;
+       return phys_to_machine_mapping[(unsigned int)(pfn)] &
+               ~FOREIGN_FRAME_BIT;
+}
+
+static inline int phys_to_machine_mapping_valid(unsigned long pfn)
+{
+       if (xen_feature(XENFEAT_auto_translated_physmap))
+               return 1;
+       return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY);
+}
+
+static inline unsigned long mfn_to_pfn(unsigned long mfn)
+{
+       unsigned long pfn;
+
+       if (xen_feature(XENFEAT_auto_translated_physmap))
+               return mfn;
+
+       if (unlikely((mfn >> machine_to_phys_order) != 0))
+               return end_pfn;
+
+       /* The array access can fail (e.g., device space beyond end of RAM). */
+       asm (
+               "1:     movq %1,%0\n"
+               "2:\n"
+               ".section .fixup,\"ax\"\n"
+               "3:     movq %2,%0\n"
+               "       jmp  2b\n"
+               ".previous\n"
+               ".section __ex_table,\"a\"\n"
+               "       .align 8\n"
+               "       .quad 1b,3b\n"
+               ".previous"
+               : "=r" (pfn)
+               : "m" (machine_to_phys_mapping[mfn]), "m" (end_pfn) );
+
+       return pfn;
+}
+
+/*
+ * We detect special mappings in one of two ways:
+ *  1. If the MFN is an I/O page then Xen will set the m2p entry
+ *     to be outside our maximum possible pseudophys range.
+ *  2. If the MFN belongs to a different domain then we will certainly
+ *     not have MFN in our p2m table. Conversely, if the page is ours,
+ *     then we'll have p2m(m2p(MFN))==MFN.
+ * If we detect a special mapping then it doesn't have a 'struct page'.
+ * We force !pfn_valid() by returning an out-of-range pointer.
+ *
+ * NB. These checks require that, for any MFN that is not in our reservation,
+ * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if
+ * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN.
+ * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety.
+ *
+ * NB2. When deliberately mapping foreign pages into the p2m table, you *must*
+ *      use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we
+ *      require. In all the cases we care about, the FOREIGN_FRAME bit is
+ *      masked (e.g., pfn_to_mfn()) so behaviour there is correct.
+ */
+static inline unsigned long mfn_to_local_pfn(unsigned long mfn)
+{
+       unsigned long pfn = mfn_to_pfn(mfn);
+       if ((pfn < end_pfn)
+           && !xen_feature(XENFEAT_auto_translated_physmap)
+           && (phys_to_machine_mapping[pfn] != mfn))
+               return end_pfn; /* force !pfn_valid() */
+       return pfn;
+}
+
+static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
+{
+       if (xen_feature(XENFEAT_auto_translated_physmap)) {
+               BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY);
+               return;
+       }
+       phys_to_machine_mapping[pfn] = mfn;
+}
+
+#else /* !CONFIG_XEN */
+
+#define pfn_to_mfn(pfn) (pfn)
+#define mfn_to_pfn(mfn) (mfn)
+#define mfn_to_local_pfn(mfn) (mfn)
+#define set_phys_to_machine(pfn, mfn) BUG_ON((pfn) != (mfn))
+#define phys_to_machine_mapping_valid(pfn) (1)
+
+#endif /* !CONFIG_XEN */
+
+/* Definitions for machine and pseudophysical addresses. */
+typedef unsigned long paddr_t;
+typedef unsigned long maddr_t;
+
+static inline maddr_t phys_to_machine(paddr_t phys)
+{
+       maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
+       machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
+       return machine;
+}
+
+static inline paddr_t machine_to_phys(maddr_t machine)
+{
+       paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
+       phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
+       return phys;
+}
+
+/* VIRT <-> MACHINE conversion */
+#define virt_to_machine(v)     (phys_to_machine(__pa(v)))
+#define virt_to_mfn(v)         (pfn_to_mfn(__pa(v) >> PAGE_SHIFT))
+#define mfn_to_virt(m)         (__va(mfn_to_pfn(m) << PAGE_SHIFT))
+
+#define __pte_ma(x)     ((pte_t) { (x) } )
+#define pfn_pte_ma(pfn, prot)  __pte_ma((((pfn) << PAGE_SHIFT) | 
pgprot_val(prot)) & __supported_pte_mask)
+
+#endif /* _X86_64_MADDR_H */
+
diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/xen/hvm.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/linux-2.6-xen-sparse/include/xen/hvm.h    Mon Aug 14 15:21:30 2006 -0400
@@ -0,0 +1,17 @@
+/* Simple wrappers around HVM functions */
+#ifndef XEN_HVM_H__
+#define XEN_HVM_H__
+
+#include <xen/interface/hvm/params.h>
+#include <asm/hypercall.h>
+
+static inline unsigned long hvm_get_parameter(int idx)
+{
+       struct xen_hvm_param xhv;
+
+       xhv.domid = DOMID_SELF;
+       xhv.index = idx;
+       return HYPERVISOR_hvm_op(HVMOP_get_param, &xhv);
+}
+
+#endif /* XEN_HVM_H__ */
diff -r 39c113fb84ac -r 10f1113fd489 
patches/linux-2.6.16.13/net-gso-4-kill-warnon.patch
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/linux-2.6.16.13/net-gso-4-kill-warnon.patch       Mon Aug 14 
15:21:30 2006 -0400
@@ -0,0 +1,29 @@
+508c578140642a641bb9b888369719c510ae2a00
+diff --git a/net/core/dev.c b/net/core/dev.c
+index e814a89..240773b 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -1087,11 +1087,6 @@ int skb_checksum_help(struct sk_buff *sk
+               goto out_set_summed;
+ 
+       if (unlikely(skb_shinfo(skb)->gso_size)) {
+-              static int warned;
+-
+-              WARN_ON(!warned);
+-              warned = 1;
+-
+               /* Let GSO fix up the checksum. */
+               goto out_set_summed;
+       }
+@@ -1141,11 +1136,6 @@ struct sk_buff *skb_gso_segment(struct s
+       __skb_pull(skb, skb->mac_len);
+ 
+       if (unlikely(skb->ip_summed != CHECKSUM_HW)) {
+-              static int warned;
+-
+-              WARN_ON(!warned);
+-              warned = 1;
+-
+               if (skb_header_cloned(skb) &&
+                   (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
+                       return ERR_PTR(err);
diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/smbios.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/firmware/hvmloader/smbios.c Mon Aug 14 15:21:30 2006 -0400
@@ -0,0 +1,606 @@
+/*
+ * smbios.c - Generate SMBIOS tables for Xen HVM domU's.
+ *
+ * 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.
+ *
+ * Copyright (C) IBM Corporation, 2006
+ *
+ * Authors: Andrew D. Ball <aball@xxxxxxxxxx>
+ */
+
+#include <stdint.h>
+#include <xen/version.h>
+#include <xen/hvm/e820.h>
+#include "smbios.h"
+#include "smbios_types.h"
+#include "util.h"
+#include "hypercall.h"
+
+/* write SMBIOS tables starting at 'start', without writing more
+   than 'max_size' bytes.
+
+   Return the number of bytes written
+*/
+static size_t
+write_smbios_tables(void *start, size_t max_size,
+                   uint32_t vcpus, uint64_t memsize,
+                   uint8_t uuid[16], char *xen_version,
+                   uint32_t xen_major_version, uint32_t xen_minor_version);
+
+static void
+get_cpu_manufacturer(char *buf, int len);
+static size_t
+smbios_table_size(uint32_t vcpus, const char *xen_version,
+                 const char *processor_manufacturer);
+static void *
+smbios_entry_point_init(void *start,
+                       uint16_t max_structure_size,
+                       uint16_t structure_table_length,
+                       uint32_t structure_table_address,
+                       uint16_t number_of_structures);
+static void *
+smbios_type_0_init(void *start, const char *xen_version,
+                  uint32_t xen_major_version, uint32_t xen_minor_version);
+static void *
+smbios_type_1_init(void *start, const char *xen_version, 
+                  uint8_t uuid[16]);
+static void *
+smbios_type_3_init(void *start);
+static void *
+smbios_type_4_init(void *start, unsigned int cpu_number,
+                  char *cpu_manufacturer);
+static void *
+smbios_type_16_init(void *start, uint32_t memory_size_mb);
+static void *
+smbios_type_17_init(void *start, uint32_t memory_size_mb);
+static void *
+smbios_type_19_init(void *start, uint32_t memory_size_mb);
+static void *
+smbios_type_20_init(void *start, uint32_t memory_size_mb);
+static void *
+smbios_type_32_init(void *start);
+void *
+smbios_type_127_init(void *start);
+
+static void
+get_cpu_manufacturer(char *buf, int len)
+{
+       char id[12];
+       uint32_t eax = 0;
+
+       cpuid(0, &eax, (uint32_t *)&id[0], (uint32_t *)&id[8], (uint32_t 
*)&id[4]);
+
+       if (memcmp(id, "GenuineIntel", 12) == 0)
+               strncpy(buf, "Intel", len);
+       else if (memcmp(id, "AuthenticAMD", 12) == 0)
+               strncpy(buf, "AMD", len);
+       else
+               strncpy(buf, "unknown", len);
+}
+
+
+/* Calculate the size of the SMBIOS structure table.
+*/
+static size_t
+smbios_table_size(uint32_t vcpus, const char *xen_version,
+                 const char *processor_manufacturer)
+{
+       size_t size;
+
+       /* first compute size without strings or terminating 0 bytes */
+       size =  sizeof(struct smbios_type_0) + sizeof(struct smbios_type_1) +
+               sizeof(struct smbios_type_3) + sizeof(struct 
smbios_type_4)*vcpus +
+               sizeof(struct smbios_type_16) + sizeof(struct smbios_type_17) +
+               sizeof(struct smbios_type_19) + sizeof(struct smbios_type_20) +
+               sizeof(struct smbios_type_32) + sizeof(struct smbios_type_127);
+
+       /* 5 structures with no strings, 2 null bytes each */
+       size += 10;
+
+       /* Need to include 1 null byte per structure with strings (first
+          terminating null byte comes from the string terminator of the
+          last string). */
+       size += 4 + vcpus;
+
+       /* type 0: "Xen", xen_version, and release_date */
+       size += strlen("Xen") + strlen(xen_version) + 2;
+       /* type 1: "Xen", xen_version, "HVM domU" */
+       size += strlen("Xen") + strlen("HVM domU") + strlen(xen_version) + 3;
+       /* type 3: "Xen" */
+       size += strlen("Xen") + 1;
+       /* type 4: socket designation ("CPU n"), processor_manufacturer */
+       size += vcpus * (strlen("CPU n") + strlen(processor_manufacturer) + 2);
+       /* Make room for two-digit CPU numbers if necessary -- doesn't handle
+          vcpus > 99 */
+       if (vcpus > 9)
+               size += vcpus - 9;
+       /* type 17: device locator string ("DIMM 1") */
+       size += strlen("DIMM 1") + 1;
+
+       return size;
+}
+
+static size_t
+write_smbios_tables(void *start, size_t max_size,
+                   uint32_t vcpus, uint64_t memsize,
+                   uint8_t uuid[16], char *xen_version,
+                   uint32_t xen_major_version, uint32_t xen_minor_version)
+{
+       unsigned cpu_num;
+       void *p = start;
+       char cpu_manufacturer[15];
+       size_t structure_table_length;
+
+       get_cpu_manufacturer(cpu_manufacturer, 15);
+
+
+       structure_table_length = smbios_table_size(vcpus, xen_version,
+                                                  cpu_manufacturer);
+
+       if (structure_table_length + sizeof(struct smbios_entry_point) > 
max_size)
+               return 0;
+
+       p = smbios_entry_point_init(p, sizeof(struct smbios_type_4), 
+                                   structure_table_length,
+                                   (uint32_t)start + 
+                                   sizeof(struct smbios_entry_point),
+                                   9 + vcpus);
+
+       p = smbios_type_0_init(p, xen_version, xen_major_version,
+                              xen_minor_version);
+       p = smbios_type_1_init(p, xen_version, uuid);
+       p = smbios_type_3_init(p);
+       for (cpu_num = 1; cpu_num <= vcpus; ++cpu_num)
+               p = smbios_type_4_init(p, cpu_num, cpu_manufacturer);
+       p = smbios_type_16_init(p, memsize);
+       p = smbios_type_17_init(p, memsize);
+       p = smbios_type_19_init(p, memsize);
+       p = smbios_type_20_init(p, memsize);
+       p = smbios_type_32_init(p);
+       p = smbios_type_127_init(p);
+
+       return (size_t)((char*)p - (char*)start);
+}
+
+/* This tries to figure out how much pseudo-physical memory (in MB)
+   is allocated to the current domU.
+
+   It iterates through the e820 table, adding up the 'usable' and
+   'reserved' entries and rounding up to the nearest MB.
+
+   The e820map is not at e820 in hvmloader, so this uses the
+   E820_MAP_* constants from e820.h to pick it up where libxenguest
+   left it.
+ */
+static uint64_t
+get_memsize(void)
+{
+       struct e820entry *map = NULL;
+       uint8_t num_entries = 0;
+       uint64_t memsize = 0;
+       uint8_t i;
+
+       map = (struct e820entry *) (E820_MAP_PAGE + E820_MAP_OFFSET);
+       num_entries = *((uint8_t *) (E820_MAP_PAGE + E820_MAP_NR_OFFSET));
+
+       /* walk through e820map, ignoring any entries that aren't marked
+          as usable or reserved. */
+
+       for (i = 0; i < num_entries; i++) {
+               if (map->type == E820_RAM || map->type == E820_RESERVED)
+                       memsize += map->size;
+               map++;
+       }
+
+       /* Round up to the nearest MB.  The user specifies domU
+          pseudo-physical memory in megabytes, so not doing this
+          could easily lead to reporting one less MB than the user
+          specified. */
+       if (memsize & ((1<<20)-1))
+               memsize = (memsize >> 20) + 1;
+       else
+               memsize = (memsize >> 20);
+
+       return memsize;
+}
+
+void
+hvm_write_smbios_tables(void)
+{
+       uint8_t uuid[16]; /* ** This will break if xen_domain_handle_t is
+                            not uint8_t[16]. ** */
+       uint16_t xen_major_version, xen_minor_version;
+       uint32_t xen_version;
+       char xen_extra_version[XEN_EXTRAVERSION_LEN];
+       /* guess conservatively on buffer length for Xen version string */
+       char xen_version_str[80];
+       /* temporary variables used to build up Xen version string */
+       char *p = NULL; /* points to next point of insertion */
+       unsigned len = 0; /* length of string already composed */
+       char *tmp = NULL; /* holds result of itoa() */
+       unsigned tmp_len; /* length of next string to add */
+
+       hypercall_xen_version(XENVER_guest_handle, uuid);
+
+       /* xen_version major and minor */
+       xen_version = hypercall_xen_version(XENVER_version, NULL);
+       xen_major_version = (uint16_t) (xen_version >> 16);
+       xen_minor_version = (uint16_t) xen_version;
+
+       hypercall_xen_version(XENVER_extraversion, xen_extra_version);
+
+       /* build up human-readable Xen version string */
+       p = xen_version_str;
+       len = 0;
+
+       itoa(tmp, xen_major_version);
+       tmp_len = strlen(tmp);
+       len += tmp_len;
+       if (len >= sizeof(xen_version_str))
+               goto error_out;
+       strcpy(p, tmp);
+       p += tmp_len;
+
+       len++;
+       if (len >= sizeof(xen_version_str))
+               goto error_out;
+       *p = '.';
+       p++;
+
+       itoa(tmp, xen_minor_version);
+       tmp_len = strlen(tmp);
+       len += tmp_len;
+       if (len >= sizeof(xen_version_str))
+               goto error_out;
+       strcpy(p, tmp);
+       p += tmp_len;
+
+       tmp_len = strlen(xen_extra_version);
+       len += tmp_len;
+       if (len >= sizeof(xen_version_str))
+               goto error_out;
+       strcpy(p, xen_extra_version);
+       p += tmp_len;
+
+       xen_version_str[sizeof(xen_version_str)-1] = '\0';
+
+       write_smbios_tables((void *) SMBIOS_PHYSICAL_ADDRESS,
+                           SMBIOS_SIZE_LIMIT, get_vcpu_nr(), get_memsize(),
+                           uuid, xen_version_str,
+                           xen_major_version, xen_minor_version);
+       return;
+
+ error_out:
+       puts("Could not write SMBIOS tables, error in hvmloader.c:"
+            "hvm_write_smbios_tables()\n");
+}
+
+
+static void *
+smbios_entry_point_init(void *start,
+                       uint16_t max_structure_size,
+                       uint16_t structure_table_length,
+                       uint32_t structure_table_address,
+                       uint16_t number_of_structures)
+{
+       uint8_t sum;
+       int i;
+       struct smbios_entry_point *ep = (struct smbios_entry_point *)start;
+
+       strncpy(ep->anchor_string, "_SM_", 4);
+       ep->length = 0x1f;
+       ep->smbios_major_version = 2;
+       ep->smbios_minor_version = 4;
+       ep->max_structure_size = max_structure_size;
+       ep->entry_point_revision = 0;
+       memset(ep->formatted_area, 0, 5);
+       strncpy(ep->intermediate_anchor_string, "_DMI_", 5);
+    
+       ep->structure_table_length = structure_table_length;
+       ep->structure_table_address = structure_table_address;
+       ep->number_of_structures = number_of_structures;
+       ep->smbios_bcd_revision = 0x24;
+
+       ep->checksum = 0;
+       ep->intermediate_checksum = 0;
+    
+       sum = 0;
+       for (i = 0; i < 0x10; ++i)
+               sum += ((int8_t *)start)[i];
+       ep->checksum = -sum;
+
+       sum = 0;
+       for (i = 0x10; i < ep->length; ++i)
+               sum += ((int8_t *)start)[i];
+       ep->intermediate_checksum = -sum;
+
+       return (char *)start + sizeof(struct smbios_entry_point);
+}
+
+/* Type 0 -- BIOS Information */
+static void *
+smbios_type_0_init(void *start, const char *xen_version,
+                  uint32_t xen_major_version, uint32_t xen_minor_version)
+{
+       struct smbios_type_0 *p = (struct smbios_type_0 *)start;
+    
+       p->header.type = 0;
+       p->header.length = sizeof(struct smbios_type_0);
+       p->header.handle = 0;
+    
+       p->vendor_str = 1;
+       p->version_str = 2;
+       p->starting_address_segment = 0xe800;
+       p->release_date_str = 0;
+       p->rom_size = 0;
+    
+       memset(p->characteristics, 0, 8);
+       p->characteristics[7] = 0x08; /* BIOS characteristics not supported */
+       p->characteristics_extension_bytes[0] = 0;
+       p->characteristics_extension_bytes[1] = 0;
+    
+       p->major_release = (uint8_t) xen_major_version;
+       p->minor_release = (uint8_t) xen_minor_version;
+       p->embedded_controller_major = 0xff;
+       p->embedded_controller_minor = 0xff;
+
+       start += sizeof(struct smbios_type_0);
+       strcpy((char *)start, "Xen");
+       start += strlen("Xen") + 1;
+       strcpy((char *)start, xen_version);
+       start += strlen(xen_version) + 1;
+
+       *((uint8_t *)start) = 0;
+       return start + 1;
+}
+
+/* Type 1 -- System Information */
+static void *
+smbios_type_1_init(void *start, const char *xen_version, 
+                  uint8_t uuid[16])
+{
+       struct smbios_type_1 *p = (struct smbios_type_1 *)start;
+       p->header.type = 1;
+       p->header.length = sizeof(struct smbios_type_1);
+       p->header.handle = 0x100;
+
+       p->manufacturer_str = 1;
+       p->product_name_str = 2;
+       p->version_str = 3;
+       p->serial_number_str = 0;
+    
+       memcpy(p->uuid, uuid, 16);
+
+       p->wake_up_type = 0x06; /* power switch */
+       p->sku_str = 0;
+       p->family_str = 0;
+
+       start += sizeof(struct smbios_type_1);
+    
+       strcpy((char *)start, "Xen");
+       start += strlen("Xen") + 1;
+       strcpy((char *)start, "HVM domU");
+       start += strlen("HVM domU") + 1;
+       strcpy((char *)start, xen_version);
+       start += strlen(xen_version) + 1;
+       *((uint8_t *)start) = 0;
+    
+       return start+1; 
+}
+
+/* Type 3 -- System Enclosure */
+static void *
+smbios_type_3_init(void *start)
+{
+       struct smbios_type_3 *p = (struct smbios_type_3 *)start;
+    
+       p->header.type = 3;
+       p->header.length = sizeof(struct smbios_type_3);
+       p->header.handle = 0x300;
+
+       p->manufacturer_str = 1;
+       p->type = 0x01; /* other */
+       p->version_str = 0;
+       p->serial_number_str = 0;
+       p->asset_tag_str = 0;
+       p->boot_up_state = 0x03; /* safe */
+       p->power_supply_state = 0x03; /* safe */
+       p->thermal_state = 0x03; /* safe */
+       p->security_status = 0x02; /* unknown */
+
+       start += sizeof(struct smbios_type_3);
+    
+       strcpy((char *)start, "Xen");
+       start += strlen("Xen") + 1;
+       *((uint8_t *)start) = 0;
+       return start+1;
+}
+
+/* Type 4 -- Processor Information */
+static void *
+smbios_type_4_init(void *start, unsigned int cpu_number, char 
*cpu_manufacturer)
+{
+       char buf[80]; 
+       struct smbios_type_4 *p = (struct smbios_type_4 *)start;
+       uint32_t eax, ebx, ecx, edx;
+
+       p->header.type = 4;
+       p->header.length = sizeof(struct smbios_type_4);
+       p->header.handle = 0x400 + cpu_number;
+
+       p->socket_designation_str = 1;
+       p->processor_type = 0x03; /* CPU */
+       p->processor_family = 0x01; /* other */
+       p->manufacturer_str = 2;
+
+       cpuid(1, &eax, &ebx, &ecx, &edx);
+
+       p->cpuid[0] = eax;
+       p->cpuid[1] = edx;
+
+       p->version_str = 0;
+       p->voltage = 0;
+       p->external_clock = 0;
+
+       p->max_speed = 0; /* unknown */
+       p->current_speed = 0; /* unknown */
+
+       p->status = 0x41; /* socket populated, CPU enabled */
+       p->upgrade = 0x01; /* other */
+
+       start += sizeof(struct smbios_type_4);
+
+       strncpy(buf, "CPU ", sizeof(buf));
+       if ((sizeof(buf) - strlen("CPU ")) >= 3)
+               itoa(buf + strlen("CPU "), cpu_number);
+
+       strcpy((char *)start, buf);
+       start += strlen(buf) + 1;
+
+       strcpy((char *)start, cpu_manufacturer);
+       start += strlen(buf) + 1;
+
+       *((uint8_t *)start) = 0;
+       return start+1;
+}
+
+/* Type 16 -- Physical Memory Array */
+static void *
+smbios_type_16_init(void *start, uint32_t memsize)
+{
+       struct smbios_type_16 *p = (struct smbios_type_16*)start;
+
+       p->header.type = 16;
+       p->header.handle = 0x1000;
+       p->header.length = sizeof(struct smbios_type_16);
+    
+       p->location = 0x01; /* other */
+       p->use = 0x03; /* system memory */
+       p->error_correction = 0x01; /* other */
+       p->maximum_capacity = memsize * 1024;
+       p->memory_error_information_handle = 0xfffe; /* none provided */
+       p->number_of_memory_devices = 1;
+
+       start += sizeof(struct smbios_type_16);
+       *((uint16_t *)start) = 0;
+       return start + 2;
+}
+
+/* Type 17 -- Memory Device */
+static void *
+smbios_type_17_init(void *start, uint32_t memory_size_mb)
+{
+       struct smbios_type_17 *p = (struct smbios_type_17 *)start;
+    
+       p->header.type = 17;
+       p->header.length = sizeof(struct smbios_type_17);
+       p->header.handle = 0x1100;
+
+       p->physical_memory_array_handle = 0x1000;
+       p->total_width = 64;
+       p->data_width = 64;
+       /* truncate memory_size_mb to 16 bits and clear most significant
+          bit [indicates size in MB] */
+       p->size = (uint16_t) memory_size_mb & 0x7fff;
+       p->form_factor = 0x09; /* DIMM */
+       p->device_set = 0;
+       p->device_locator_str = 1;
+       p->bank_locator_str = 0;
+       p->memory_type = 0x07; /* RAM */
+       p->type_detail = 0;
+
+       start += sizeof(struct smbios_type_17);
+       strcpy((char *)start, "DIMM 1");
+       start += strlen("DIMM 1") + 1;
+       *((uint8_t *)start) = 0;
+
+       return start+1;
+}
+
+/* Type 19 -- Memory Array Mapped Address */
+static void *
+smbios_type_19_init(void *start, uint32_t memory_size_mb)
+{
+       struct smbios_type_19 *p = (struct smbios_type_19 *)start;
+    
+       p->header.type = 19;
+       p->header.length = sizeof(struct smbios_type_19);
+       p->header.handle = 0x1300;
+
+       p->starting_address = 0;
+       p->ending_address = (memory_size_mb-1) * 1024;
+       p->memory_array_handle = 0x1000;
+       p->partition_width = 1;
+
+       start += sizeof(struct smbios_type_19);
+       *((uint16_t *)start) = 0;
+       return start + 2;
+}
+
+/* Type 20 -- Memory Device Mapped Address */
+static void *
+smbios_type_20_init(void *start, uint32_t memory_size_mb)
+{
+       struct smbios_type_20 *p = (struct smbios_type_20 *)start;
+
+       p->header.type = 20;
+       p->header.length = sizeof(struct smbios_type_20);
+       p->header.handle = 0x1400;
+
+       p->starting_address = 0;
+       p->ending_address = (memory_size_mb-1)*1024;
+       p->memory_device_handle = 0x1100;
+       p->memory_array_mapped_address_handle = 0x1300;
+       p->partition_row_position = 1;
+       p->interleave_position = 0;
+       p->interleaved_data_depth = 0;
+
+       start += sizeof(struct smbios_type_20);
+
+       *((uint16_t *)start) = 0;
+       return start+2;
+}
+
+/* Type 32 -- System Boot Information */
+static void *
+smbios_type_32_init(void *start)
+{
+       struct smbios_type_32 *p = (struct smbios_type_32 *)start;
+
+       p->header.type = 32;
+       p->header.length = sizeof(struct smbios_type_32);
+       p->header.handle = 0x2000;
+       memset(p->reserved, 0, 6);
+       p->boot_status = 0; /* no errors detected */
+    
+       start += sizeof(struct smbios_type_32);
+       *((uint16_t *)start) = 0;
+       return start+2;
+}
+
+/* Type 127 -- End of Table */
+void *
+smbios_type_127_init(void *start)
+{
+       struct smbios_type_127 *p = (struct smbios_type_127 *)start;
+
+       p->header.type = 127;
+       p->header.length = sizeof(struct smbios_type_127);
+       p->header.handle = 0x7f00;
+
+       start += sizeof(struct smbios_type_127);
+       *((uint16_t *)start) = 0;
+       return start + 2;
+}
diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/smbios.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/firmware/hvmloader/smbios.h Mon Aug 14 15:21:30 2006 -0400
@@ -0,0 +1,38 @@
+/*
+ * smbios.h - interface for Xen HVM SMBIOS generation
+ *
+ * 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.
+ *
+ * Copyright (C) IBM Corporation, 2006
+ *
+ * Authors: Andrew D. Ball <aball@xxxxxxxxxx>
+ */
+
+#ifndef SMBIOS_H
+#define SMBIOS_H
+
+#include <stdint.h>
+#include <stdlib.h>
+
+/* These constants must agree with the ACPI e820 memory map as defined
+   in tools/libxc/xc_hvm_build.c and the address the ROMBIOS pulls the
+   SMBIOS entry point from in the smbios_init subroutine.
+ */
+#define SMBIOS_PHYSICAL_ADDRESS 0x9f000
+#define SMBIOS_SIZE_LIMIT 0x800
+
+void hvm_write_smbios_tables(void);
+
+#endif /* SMBIOS_H */
diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/smbios_types.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/firmware/hvmloader/smbios_types.h   Mon Aug 14 15:21:30 2006 -0400
@@ -0,0 +1,182 @@
+/*
+ * smbios_types.h - data structure definitions for Xen HVM SMBIOS support
+ *
+ * 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.
+ *
+ * Copyright (C) IBM Corporation, 2006
+ *
+ * Authors: Andrew D. Ball <aball@xxxxxxxxxx>
+ *
+ * See the SMBIOS 2.4 spec for more detail:
+ *   http://www.dmtf.org/standards/smbios/
+ */
+
+#ifndef SMBIOS_TYPES_H
+#define SMBIOS_TYPES_H
+
+#include <stdint.h>
+
+/* SMBIOS entry point -- must be written to a 16-bit aligned address
+   between 0xf0000 and 0xfffff. 
+ */
+struct smbios_entry_point {
+       char anchor_string[4];
+       uint8_t checksum;
+       uint8_t length;
+       uint8_t smbios_major_version;
+       uint8_t smbios_minor_version;
+       uint16_t max_structure_size;
+       uint8_t entry_point_revision;
+       uint8_t formatted_area[5];
+       char intermediate_anchor_string[5];
+       uint8_t intermediate_checksum;
+       uint16_t structure_table_length;
+       uint32_t structure_table_address;
+       uint16_t number_of_structures;
+       uint8_t smbios_bcd_revision;
+} __attribute__ ((packed));
+
+/* This goes at the beginning of every SMBIOS structure. */
+struct smbios_structure_header {
+       uint8_t type;
+       uint8_t length;
+       uint16_t handle;
+} __attribute__ ((packed));
+
+/* SMBIOS type 0 - BIOS Information */
+struct smbios_type_0 {
+       struct smbios_structure_header header;
+       uint8_t vendor_str;
+       uint8_t version_str;
+       uint16_t starting_address_segment;
+       uint8_t release_date_str;
+       uint8_t rom_size; 
+       uint8_t characteristics[8];
+       uint8_t characteristics_extension_bytes[2];
+       uint8_t major_release;
+       uint8_t minor_release;
+       uint8_t embedded_controller_major;
+       uint8_t embedded_controller_minor;
+} __attribute__ ((packed));
+
+/* SMBIOS type 1 - System Information */
+struct smbios_type_1 {
+       struct smbios_structure_header header;
+       uint8_t manufacturer_str;
+       uint8_t product_name_str;
+       uint8_t version_str;
+       uint8_t serial_number_str;
+       uint8_t uuid[16];
+       uint8_t wake_up_type;
+       uint8_t sku_str;
+       uint8_t family_str;
+} __attribute__ ((packed));
+
+/* SMBIOS type 3 - System Enclosure */
+struct smbios_type_3 {
+       struct smbios_structure_header header;
+       uint8_t manufacturer_str;
+       uint8_t type;
+       uint8_t version_str;
+       uint8_t serial_number_str;
+       uint8_t asset_tag_str;
+       uint8_t boot_up_state;
+       uint8_t power_supply_state;
+       uint8_t thermal_state;
+       uint8_t security_status;
+} __attribute__ ((packed));
+
+/* SMBIOS type 4 - Processor Information */
+struct smbios_type_4 {
+       struct smbios_structure_header header;
+       uint8_t socket_designation_str;
+       uint8_t processor_type;
+       uint8_t processor_family;
+       uint8_t manufacturer_str;
+       uint32_t cpuid[2];
+       uint8_t version_str;
+       uint8_t voltage;
+       uint16_t external_clock;
+       uint16_t max_speed;
+       uint16_t current_speed;
+       uint8_t status;
+       uint8_t upgrade;
+} __attribute__ ((packed));
+
+/* SMBIOS type 16 - Physical Memory Array
+ *   Associated with one type 17 (Memory Device).
+ */
+struct smbios_type_16 {
+       struct smbios_structure_header header;
+       uint8_t location;
+       uint8_t use;
+       uint8_t error_correction;
+       uint32_t maximum_capacity;
+       uint16_t memory_error_information_handle;
+       uint16_t number_of_memory_devices;
+} __attribute__ ((packed));
+
+/* SMBIOS type 17 - Memory Device 
+ *   Associated with one type 19
+ */
+struct smbios_type_17 {
+       struct smbios_structure_header header;
+       uint16_t physical_memory_array_handle;
+       uint16_t memory_error_information_handle;
+       uint16_t total_width;
+       uint16_t data_width;
+       uint16_t size;
+       uint8_t form_factor;
+       uint8_t device_set;
+       uint8_t device_locator_str;
+       uint8_t bank_locator_str;
+       uint8_t memory_type;
+       uint16_t type_detail;
+} __attribute__ ((packed));
+
+/* SMBIOS type 19 - Memory Array Mapped Address */
+struct smbios_type_19 {
+       struct smbios_structure_header header;
+       uint32_t starting_address;
+       uint32_t ending_address;
+       uint16_t memory_array_handle;
+       uint8_t partition_width;
+} __attribute__ ((packed));
+
+/* SMBIOS type 20 - Memory Device Mapped Address */
+struct smbios_type_20 {
+       struct smbios_structure_header header;
+       uint32_t starting_address;
+       uint32_t ending_address;
+       uint16_t memory_device_handle;
+       uint16_t memory_array_mapped_address_handle;
+       uint8_t partition_row_position;
+       uint8_t interleave_position;
+       uint8_t interleaved_data_depth;
+} __attribute__ ((packed));
+
+/* SMBIOS type 32 - System Boot Information */
+struct smbios_type_32 {
+       struct smbios_structure_header header;
+       uint8_t reserved[6];
+       uint8_t boot_status;
+} __attribute__ ((packed));
+
+/* SMBIOS type 127 -- End-of-table */
+struct smbios_type_127 {
+       struct smbios_structure_header header;
+} __attribute__ ((packed));
+
+#endif /* SMBIOS_TYPES_H */

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


 


Rackspace

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