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

[Xen-changelog] Merge latest xen-unstable into xen-ia64-unstable to prep



# HG changeset patch
# User djm@xxxxxxxxxxxxxxx
# Node ID 9af349b055e57cafb67f51d50bd12c7c524371de
# Parent  a152b9f27e48c957b5c4018493dc3114b65960f6
# Parent  122779b57b40600dcaf2d147ca82ec23da8e2c96
Merge latest xen-unstable into xen-ia64-unstable to prep
for push back to xen-unstable

diff -r a152b9f27e48 -r 9af349b055e5 .hgignore
--- a/.hgignore Wed Sep 14 21:33:52 2005
+++ b/.hgignore Wed Sep 14 21:36:10 2005
@@ -84,7 +84,6 @@
 ^tools/blktap/ublkback/ublkback$
 ^tools/blktap/xen/.*$
 ^tools/check/\..*$
-^tools/examples/xmexample\.vmx$
 ^tools/console/xenconsoled$
 ^tools/console/xenconsole$
 ^tools/debugger/pdb/pdb$
diff -r a152b9f27e48 -r 9af349b055e5 docs/misc/sedf_scheduler_mini-HOWTO.txt
--- a/docs/misc/sedf_scheduler_mini-HOWTO.txt   Wed Sep 14 21:33:52 2005
+++ b/docs/misc/sedf_scheduler_mini-HOWTO.txt   Wed Sep 14 21:36:10 2005
@@ -10,7 +10,7 @@
 Usage:
    -add "sched=sedf" on Xen's boot command-line
    -create domains as usual
-   -use "xm sedf <dom-id> <period> <slice> <latency-hint> <extra> <weight>"
+   -use "xm sched-sedf <dom-id> <period> <slice> <latency-hint> <extra> 
<weight>"
     Where:
       -period/slice are the normal EDF scheduling parameters in nanosecs
       -latency-hint is the scaled period in case the domain is doing heavy I/O
@@ -22,23 +22,23 @@
 
 Examples:
  normal EDF (20ms/5ms):
-  xm sedf <dom-id> 20000000 5000000 0 0 0
+  xm sched-sedf <dom-id> 20000000 5000000 0 0 0
   
  best-effort domains (i.e. non-realtime):
-  xm sedf <dom-id> 20000000 0 0 1 0
+  xm sched-sedf <dom-id> 20000000 0 0 1 0
  
  normal EDF (20ms/5ms) + share of extra-time:
-  xm sedf <dom-id> 20000000 5000000 0 1 0
+  xm sched-sedf <dom-id> 20000000 5000000 0 1 0
   
  4 domains with weights 2:3:4:2
-  xm sedf <d1> 0 0 0 0 2
-  xm sedf <d2> 0 0 0 0 3
-  xm sedf <d3> 0 0 0 0 4
-  xm sedf <d4> 0 0 0 0 2
+  xm sched-sedf <d1> 0 0 0 0 2
+  xm sched-sedf <d2> 0 0 0 0 3
+  xm sched-sedf <d3> 0 0 0 0 4
+  xm sched-sedf <d4> 0 0 0 0 2
   
  1 fully-specified (10ms/3ms) domain, 3 other domains share
  available rest in 2:7:3 ratio:
-  xm sedf <d1> 10000000 3000000 0 0 0
-  xm sedf <d2> 0 0 0 0 2
-  xm sedf <d3> 0 0 0 0 7
-  xm sedf <d4> 0 0 0 0 3
\ No newline at end of file
+  xm sched-sedf <d1> 10000000 3000000 0 0 0
+  xm sched-sedf <d2> 0 0 0 0 2
+  xm sched-sedf <d3> 0 0 0 0 7
+  xm sched-sedf <d4> 0 0 0 0 3
diff -r a152b9f27e48 -r 9af349b055e5 extras/mini-os/include/hypervisor.h
--- a/extras/mini-os/include/hypervisor.h       Wed Sep 14 21:33:52 2005
+++ b/extras/mini-os/include/hypervisor.h       Wed Sep 14 21:36:10 2005
@@ -14,9 +14,6 @@
 
 #include <types.h>
 #include <xen/xen.h>
-#include <xen/io/domain_controller.h>
-
-
 
 /*
  * a placeholder for the start of day information passed up from the hypervisor
diff -r a152b9f27e48 -r 9af349b055e5 extras/mini-os/mm.c
--- a/extras/mini-os/mm.c       Wed Sep 14 21:33:52 2005
+++ b/extras/mini-os/mm.c       Wed Sep 14 21:36:10 2005
@@ -432,7 +432,7 @@
         
         /* Pin the page to provide correct protection */
         pin_request.cmd = MMUEXT_PIN_L1_TABLE;
-        pin_request.mfn = pfn_to_mfn(pt_frame);
+        pin_request.arg1.mfn = pfn_to_mfn(pt_frame);
         if(HYPERVISOR_mmuext_op(&pin_request, 1, NULL, DOMID_SELF) < 0)
         {
             printk("ERROR: pinning failed\n");
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/i386/kernel/cpu/common.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/cpu/common.c    Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/cpu/common.c    Wed Sep 14 
21:36:10 2005
@@ -15,7 +15,7 @@
 #include <asm/apic.h>
 #include <mach_apic.h>
 #endif
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 
 #include "cpu.h"
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c Wed Sep 14 21:36:10 2005
@@ -53,7 +53,7 @@
 #include <asm/io_apic.h>
 #include <asm/ist.h>
 #include <asm/io.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/xen-public/physdev.h>
 #include <asm-xen/xen-public/memory.h>
 #include "setup_arch_pre.h"
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c        Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c        Wed Sep 14 
21:36:10 2005
@@ -33,7 +33,7 @@
 #include <linux/vmalloc.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/balloon.h>
 #include <asm-xen/xen-public/memory.h>
 #include <linux/module.h>
@@ -115,7 +115,7 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_NEW_BASEPTR;
-       op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
+       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -123,7 +123,7 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_NEW_USER_BASEPTR;
-       op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
+       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -138,7 +138,7 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_INVLPG_LOCAL;
-       op.linear_addr = ptr & PAGE_MASK;
+       op.arg1.linear_addr = ptr & PAGE_MASK;
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -157,7 +157,7 @@
        if ( cpus_empty(*mask) )
                return;
        op.cmd = MMUEXT_TLB_FLUSH_MULTI;
-       op.vcpumask = mask->bits;
+       op.arg2.vcpumask = mask->bits;
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -165,7 +165,7 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_INVLPG_ALL;
-       op.linear_addr = ptr & PAGE_MASK;
+       op.arg1.linear_addr = ptr & PAGE_MASK;
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -175,8 +175,8 @@
        if ( cpus_empty(*mask) )
                return;
        op.cmd = MMUEXT_INVLPG_MULTI;
-       op.vcpumask = mask->bits;
-       op.linear_addr = ptr & PAGE_MASK;
+       op.arg1.linear_addr = ptr & PAGE_MASK;
+       op.arg2.vcpumask    = mask->bits;
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -193,7 +193,7 @@
 #else
        op.cmd = MMUEXT_PIN_L2_TABLE;
 #endif
-       op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
+       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -201,7 +201,7 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_UNPIN_TABLE;
-       op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
+       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -209,7 +209,7 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_PIN_L1_TABLE;
-       op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
+       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -217,7 +217,7 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_UNPIN_TABLE;
-       op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
+       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -226,7 +226,7 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_PIN_L3_TABLE;
-       op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
+       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -234,7 +234,7 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_UNPIN_TABLE;
-       op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
+       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -242,7 +242,7 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_PIN_L2_TABLE;
-       op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
+       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -250,7 +250,7 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_UNPIN_TABLE;
-       op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
+       op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 #endif /* CONFIG_X86_64 */
@@ -260,8 +260,8 @@
 {
        struct mmuext_op op;
        op.cmd = MMUEXT_SET_LDT;
-       op.linear_addr = ptr;
-       op.nr_ents = len;
+       op.arg1.linear_addr = ptr;
+       op.arg2.nr_ents     = len;
        BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
 }
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/i386/mm/init.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/mm/init.c      Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/init.c      Wed Sep 14 21:36:10 2005
@@ -39,7 +39,7 @@
 #include <asm/tlb.h>
 #include <asm/tlbflush.h>
 #include <asm/sections.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 
 extern unsigned long *contiguous_bitmap;
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c   Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c   Wed Sep 14 21:36:10 2005
@@ -25,7 +25,7 @@
 #include <asm/mmu_context.h>
 
 #include <asm-xen/foreign_page.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 
 void show_mem(void)
 {
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/i386/pci/Makefile
--- a/linux-2.6-xen-sparse/arch/xen/i386/pci/Makefile   Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/pci/Makefile   Wed Sep 14 21:36:10 2005
@@ -2,7 +2,7 @@
 
 CFLAGS += -Iarch/$(XENARCH)/pci
 
-c-obj-y                                := i386.o
+obj-y                          := i386.o
 
 #c-obj-$(CONFIG_PCI_BIOS)              += pcbios.o
 c-obj-$(CONFIG_PCI_MMCONFIG)   += mmconfig.o
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/kernel/devmem.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/devmem.c     Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/devmem.c     Wed Sep 14 21:36:10 2005
@@ -27,7 +27,7 @@
 #include <asm/uaccess.h>
 #include <asm/io.h>
 
-static inline int uncached_access(struct file *file, unsigned long addr)
+static inline int uncached_access(struct file *file)
 {
         if (file->f_flags & O_SYNC)
                 return 1;
@@ -90,10 +90,9 @@
 
 static int mmap_mem(struct file * file, struct vm_area_struct * vma)
 {
-       unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
        int uncached;
 
-       uncached = uncached_access(file, offset);
+       uncached = uncached_access(file);
        if (uncached)
                vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
 
@@ -106,8 +105,9 @@
        if (uncached)
                vma->vm_flags |= VM_IO;
 
-       if (io_remap_page_range(vma, vma->vm_start, offset, 
-                               vma->vm_end-vma->vm_start, vma->vm_page_prot))
+       if (direct_remap_pfn_range(vma->vm_mm, vma->vm_start, vma->vm_pgoff,
+                                  vma->vm_end - vma->vm_start,
+                                  vma->vm_page_prot, DOMID_IO))
                return -EAGAIN;
 
        return 0;
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c     Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c     Wed Sep 14 21:36:10 2005
@@ -40,7 +40,7 @@
 #include <asm/synch_bitops.h>
 #include <asm-xen/xen-public/event_channel.h>
 #include <asm-xen/xen-public/physdev.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/evtchn.h>
 
 /*
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/kernel/reboot.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c     Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c     Wed Sep 14 21:36:10 2005
@@ -10,7 +10,7 @@
 #include <asm/irq.h>
 #include <asm/mmu_context.h>
 #include <asm-xen/evtchn.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/xen-public/dom0_ops.h>
 #include <asm-xen/queues.h>
 #include <asm-xen/xenbus.h>
@@ -320,19 +320,27 @@
 static void shutdown_handler(struct xenbus_watch *watch, const char *node)
 {
     static DECLARE_WORK(shutdown_work, __shutdown_handler, NULL);
-
     char *str;
-
+    int err;
+
+ again:
+    err = xenbus_transaction_start("control");
+    if (err)
+       return;
     str = (char *)xenbus_read("control", "shutdown", NULL);
-    /* Ignore read errors. */
-    if (IS_ERR(str))
-        return;
-    if (strlen(str) == 0) {
-        kfree(str);
-        return;
+    /* Ignore read errors and empty reads. */
+    if (XENBUS_IS_ERR_READ(str)) {
+       xenbus_transaction_end(1);
+       return;
     }
 
     xenbus_write("control", "shutdown", "", O_CREAT);
+
+    err = xenbus_transaction_end(0);
+    if (err == -ETIMEDOUT) {
+       kfree(str);
+       goto again;
+    }
 
     if (strcmp(str, "poweroff") == 0)
         shutting_down = SHUTDOWN_POWEROFF;
@@ -355,16 +363,26 @@
 static void sysrq_handler(struct xenbus_watch *watch, const char *node)
 {
     char sysrq_key = '\0';
-    
+    int err;
+
+ again:
+    err = xenbus_transaction_start("control");
+    if (err)
+       return;
     if (!xenbus_scanf("control", "sysrq", "%c", &sysrq_key)) {
         printk(KERN_ERR "Unable to read sysrq code in control/sysrq\n");
-        return;
-    }
-
-    xenbus_printf("control", "sysrq", "%c", '\0');
+       xenbus_transaction_end(1);
+       return;
+    }
+
+    if (sysrq_key != '\0')
+       xenbus_printf("control", "sysrq", "%c", '\0');
+
+    err = xenbus_transaction_end(0);
+    if (err == -ETIMEDOUT)
+       goto again;
 
     if (sysrq_key != '\0') {
-
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
         handle_sysrq(sysrq_key, NULL, NULL);
 #else
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/kernel/skbuff.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/skbuff.c     Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/skbuff.c     Wed Sep 14 21:36:10 2005
@@ -12,7 +12,7 @@
 #include <linux/init.h>
 #include <asm/io.h>
 #include <asm/page.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 
 /* Referenced in netback.c. */
 /*static*/ kmem_cache_t *skbuff_cachep;
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/x86_64/kernel/entry.S
--- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/entry.S       Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/entry.S       Wed Sep 14 
21:36:10 2005
@@ -751,10 +751,10 @@
 # Hypervisor uses this for application faults while it executes.
 ENTRY(failsafe_callback)
        addq $0x10,%rsp /* skip rcx and r11 */  
-1:     movl (%rsp),%ds
-2:     movl 8(%rsp),%es
-3:     movl 16(%rsp),%fs
-4:     movl 24(%rsp),%gs
+1:     mov  (%rsp),%ds
+2:     mov  8(%rsp),%es
+3:     mov  16(%rsp),%fs
+4:     mov  24(%rsp),%gs
        addq $0x20,%rsp /* skip the above selectors */          
        SAVE_ALL
        jmp  error_exit
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c
--- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c       Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c       Wed Sep 14 
21:36:10 2005
@@ -61,7 +61,7 @@
 #include <linux/percpu.h>
 #include <asm-xen/xen-public/physdev.h>
 #include "setup_arch_pre.h"
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #define PFN_UP(x)       (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
 #define PFN_PHYS(x)     ((x) << PAGE_SHIFT)
 #define end_pfn_map end_pfn
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup64.c
--- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup64.c     Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup64.c     Wed Sep 14 
21:36:10 2005
@@ -31,7 +31,7 @@
 #include <asm/mman.h>
 #include <asm/numa.h>
 #ifdef CONFIG_XEN
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #endif
 char x86_boot_params[BOOT_PARAM_SIZE] __initdata = {0,};
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/x86_64/pci/Makefile
--- a/linux-2.6-xen-sparse/arch/xen/x86_64/pci/Makefile Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/x86_64/pci/Makefile Wed Sep 14 21:36:10 2005
@@ -8,7 +8,7 @@
 
 CFLAGS += -Iarch/i386/pci
 
-c-i386-obj-y           := i386.o
+c-xen-obj-y            := i386.o
 c-i386-obj-y           += fixup.o
 c-i386-obj-$(CONFIG_ACPI_PCI)  += acpi.o
 c-i386-obj-y                   += legacy.o common.o
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c
--- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c        Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c        Wed Sep 14 
21:36:10 2005
@@ -42,7 +42,7 @@
 #include <linux/highmem.h>
 #include <linux/vmalloc.h>
 #include <asm-xen/xen_proc.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/balloon.h>
 #include <asm-xen/xen-public/memory.h>
 #include <asm/pgalloc.h>
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/blkback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Wed Sep 14 21:36:10 2005
@@ -13,7 +13,7 @@
 #include <asm/setup.h>
 #include <asm/pgalloc.h>
 #include <asm-xen/evtchn.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/xen-public/io/blkif.h>
 #include <asm-xen/xen-public/io/ring.h>
 #include <asm-xen/gnttab.h>
@@ -33,7 +33,7 @@
     blkif_vdev_t   handle;      /* what the domain refers to this vbd as */
     unsigned char  readonly;    /* Non-zero -> read-only */
     unsigned char  type;        /* VDISK_xxx */
-    blkif_pdev_t   pdevice;     /* phys device that this vbd maps to */
+    u32            pdevice;     /* phys device that this vbd maps to */
     struct block_device *bdev;
 }; 
 
@@ -65,11 +65,6 @@
     grant_ref_t shmem_ref;
 } blkif_t;
 
-void blkif_create(blkif_be_create_t *create);
-void blkif_destroy(blkif_be_destroy_t *destroy);
-void blkif_connect(blkif_be_connect_t *connect);
-int  blkif_disconnect(blkif_be_disconnect_t *disconnect, u8 rsp_id);
-void blkif_disconnect_complete(blkif_t *blkif);
 blkif_t *alloc_blkif(domid_t domid);
 void free_blkif_callback(blkif_t *blkif);
 int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn);
@@ -82,7 +77,7 @@
     } while (0)
 
 /* Create a vbd. */
-int vbd_create(blkif_t *blkif, blkif_vdev_t vdevice, blkif_pdev_t pdevice,
+int vbd_create(blkif_t *blkif, blkif_vdev_t vdevice, u32 pdevice,
               int readonly);
 void vbd_free(struct vbd *vbd);
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/blkback/vbd.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/vbd.c    Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/vbd.c    Wed Sep 14 21:36:10 2005
@@ -9,7 +9,7 @@
 #include "common.h"
 #include <asm-xen/xenbus.h>
 
-static inline dev_t vbd_map_devnum(blkif_pdev_t cookie)
+static inline dev_t vbd_map_devnum(u32 cookie)
 {
     return MKDEV(BLKIF_MAJOR(cookie), BLKIF_MINOR(cookie));
 }
@@ -33,7 +33,7 @@
 }
 
 int vbd_create(blkif_t *blkif, blkif_vdev_t handle,
-              blkif_pdev_t pdevice, int readonly)
+              u32 pdevice, int readonly)
 {
     struct vbd *vbd;
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Wed Sep 14 21:36:10 2005
@@ -178,6 +178,8 @@
 
                err = vbd_create(be->blkif, handle, be->pdev, be->readonly);
                if (err) {
+                       blkif_put(be->blkif);
+                       be->blkif = NULL;
                        xenbus_dev_error(dev, err, "creating vbd structure");
                        return;
                }
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/blkfront/block.h
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Wed Sep 14 21:36:10 2005
@@ -45,7 +45,7 @@
 #include <linux/blkdev.h>
 #include <linux/major.h>
 #include <linux/devfs_fs_kernel.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/xenbus.h>
 #include <asm-xen/gnttab.h>
 #include <asm-xen/xen-public/xen.h>
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/blktap/blktap.h
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.h  Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.h  Wed Sep 14 21:36:10 2005
@@ -20,7 +20,7 @@
 #include <asm/io.h>
 #include <asm/setup.h>
 #include <asm/pgalloc.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/xen-public/io/blkif.h>
 #include <asm-xen/xen-public/io/ring.h>
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/blktap/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/common.h  Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/common.h  Wed Sep 14 21:36:10 2005
@@ -13,7 +13,7 @@
 #include <asm/setup.h>
 #include <asm/pgalloc.h>
 #include <asm-xen/evtchn.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/xen-public/io/blkif.h>
 #include <asm-xen/xen-public/io/ring.h>
 #include <asm-xen/gnttab.h>
@@ -35,7 +35,7 @@
     blkif_vdev_t   handle;      /* what the domain refers to this vbd as */
     unsigned char  readonly;    /* Non-zero -> read-only */
     unsigned char  type;        /* VDISK_xxx */
-    blkif_pdev_t   pdevice;     /* phys device that this vbd maps to */
+    u32            pdevice;     /* phys device that this vbd maps to */
     struct block_device *bdev;
 }; 
 
@@ -67,11 +67,6 @@
     grant_ref_t shmem_ref;
 } blkif_t;
 
-void blkif_create(blkif_be_create_t *create);
-void blkif_destroy(blkif_be_destroy_t *destroy);
-void blkif_connect(blkif_be_connect_t *connect);
-int  blkif_disconnect(blkif_be_disconnect_t *disconnect, u8 rsp_id);
-void blkif_disconnect_complete(blkif_t *blkif);
 blkif_t *alloc_blkif(domid_t domid);
 void free_blkif_callback(blkif_t *blkif);
 int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn);
@@ -84,7 +79,7 @@
     } while (0)
 
 /* Create a vbd. */
-int vbd_create(blkif_t *blkif, blkif_vdev_t vdevice, blkif_pdev_t pdevice,
+int vbd_create(blkif_t *blkif, blkif_vdev_t vdevice, u32 pdevice,
               int readonly);
 void vbd_free(struct vbd *vbd);
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/console/console.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/console.c        Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/console/console.c        Wed Sep 14 
21:36:10 2005
@@ -51,7 +51,7 @@
 #include <asm/uaccess.h>
 #include <asm-xen/xen-public/xen.h>
 #include <asm-xen/xen-public/event_channel.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/evtchn.h>
 
 #include "xencons_ring.h"
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c   Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c   Wed Sep 14 
21:36:10 2005
@@ -13,7 +13,7 @@
 #include <linux/mm.h>
 #include <linux/slab.h>
 
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/evtchn.h>
 #include <linux/wait.h>
 #include <linux/interrupt.h>
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/netback/netback.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c        Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c        Wed Sep 14 
21:36:10 2005
@@ -294,7 +294,7 @@
         mcl++;
 
         mmuext->cmd = MMUEXT_REASSIGN_PAGE;
-        mmuext->mfn = old_mfn;
+        mmuext->arg1.mfn = old_mfn;
         mmuext++;
 #endif
         mmu->ptr = ((unsigned long long)new_mfn << PAGE_SHIFT) | 
MMU_MACHPHYS_UPDATE;
@@ -355,7 +355,7 @@
 #ifdef CONFIG_XEN_NETDEV_GRANT
         old_mfn = 0; /* XXX Fix this so we can free_mfn() on error! */
 #else
-        old_mfn = mmuext[0].mfn;
+        old_mfn = mmuext[0].arg1.mfn;
 #endif
         atomic_set(&(skb_shinfo(skb)->dataref), 1);
         skb_shinfo(skb)->nr_frags = 0;
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/usbback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/usbback/common.h Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/usbback/common.h Wed Sep 14 21:36:10 2005
@@ -12,7 +12,7 @@
 #include <asm/io.h>
 #include <asm/setup.h>
 #include <asm/pgalloc.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 
 #include <asm-xen/xen-public/io/usbif.h>
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c    Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c    Wed Sep 14 
21:36:10 2005
@@ -27,7 +27,7 @@
  * IN THE SOFTWARE.
  */
 
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/evtchn.h>
 #include <linux/wait.h>
 #include <linux/interrupt.h>
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Wed Sep 14 
21:36:10 2005
@@ -27,7 +27,7 @@
  */
 #define DEBUG
 
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/xenbus.h>
 #include <asm-xen/balloon.h>
 #include <linux/kernel.h>
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/include/asm-xen/asm-i386/mmu_context.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/mmu_context.h       Wed Sep 
14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/mmu_context.h       Wed Sep 
14 21:36:10 2005
@@ -67,7 +67,7 @@
                /* Re-load page tables: load_cr3(next->pgd) */
                per_cpu(cur_pgd, cpu) = next->pgd;
                op->cmd = MMUEXT_NEW_BASEPTR;
-               op->mfn = pfn_to_mfn(__pa(next->pgd) >> PAGE_SHIFT);
+               op->arg1.mfn = pfn_to_mfn(__pa(next->pgd) >> PAGE_SHIFT);
                op++;
 
                /*
@@ -76,8 +76,8 @@
                if (unlikely(prev->context.ldt != next->context.ldt)) {
                        /* load_LDT_nolock(&next->context, cpu) */
                        op->cmd = MMUEXT_SET_LDT;
-                       op->linear_addr = (unsigned long)next->context.ldt;
-                       op->nr_ents     = next->context.size;
+                       op->arg1.linear_addr = (unsigned long)next->context.ldt;
+                       op->arg2.nr_ents     = next->context.size;
                        op++;
                }
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h   Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h   Wed Sep 14 
21:36:10 2005
@@ -2,7 +2,7 @@
 #define _I386_PGTABLE_H
 
 #include <linux/config.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 
 /*
  * The Linux memory management assumes a three-level page table setup. On
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/include/asm-xen/asm-i386/system.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/system.h    Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/system.h    Wed Sep 14 
21:36:10 2005
@@ -7,7 +7,7 @@
 #include <asm/synch_bitops.h>
 #include <asm/segment.h>
 #include <asm/cpufeature.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm/smp_alt.h>
 
 #ifdef __KERNEL__
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/mmu_context.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/mmu_context.h     Wed Sep 
14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/mmu_context.h     Wed Sep 
14 21:36:10 2005
@@ -83,19 +83,19 @@
                /* load_cr3(next->pgd) */
                per_cpu(cur_pgd, smp_processor_id()) = next->pgd;
                op->cmd = MMUEXT_NEW_BASEPTR;
-               op->mfn = pfn_to_mfn(__pa(next->pgd) >> PAGE_SHIFT);
+               op->arg1.mfn = pfn_to_mfn(__pa(next->pgd) >> PAGE_SHIFT);
                op++;
 
                /* xen_new_user_pt(__pa(__user_pgd(next->pgd))) */
                op->cmd = MMUEXT_NEW_USER_BASEPTR;
-               op->mfn = pfn_to_mfn(__pa(__user_pgd(next->pgd)) >> PAGE_SHIFT);
+               op->arg1.mfn = pfn_to_mfn(__pa(__user_pgd(next->pgd)) >> 
PAGE_SHIFT);
                op++;
                
                if (unlikely(next->context.ldt != prev->context.ldt)) {
                        /* load_LDT_nolock(&next->context, cpu) */
                        op->cmd = MMUEXT_SET_LDT;
-                       op->linear_addr = (unsigned long)next->context.ldt;
-                       op->nr_ents     = next->context.size;
+                       op->arg1.linear_addr = (unsigned long)next->context.ldt;
+                       op->arg2.nr_ents     = next->context.size;
                        op++;
                }
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h Wed Sep 14 
21:36:10 2005
@@ -12,7 +12,7 @@
 #include <linux/sched.h>
 #include <asm/pda.h>
 #ifdef CONFIG_XEN
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 
 extern pud_t level3_user_pgt[512];
 extern pud_t init_level4_user_pgt[];
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/system.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/system.h  Wed Sep 14 
21:33:52 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/system.h  Wed Sep 14 
21:36:10 2005
@@ -5,7 +5,7 @@
 #include <linux/kernel.h>
 #include <asm/segment.h>
 #include <asm/synch_bitops.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/xen-public/arch-x86_64.h>
 
 #ifdef __KERNEL__
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/include/asm-xen/evtchn.h
--- a/linux-2.6-xen-sparse/include/asm-xen/evtchn.h     Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/evtchn.h     Wed Sep 14 21:36:10 2005
@@ -33,7 +33,7 @@
 
 #include <linux/config.h>
 #include <linux/interrupt.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm/ptrace.h>
 #include <asm/synch_bitops.h>
 #include <asm-xen/xen-public/event_channel.h>
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/include/asm-xen/gnttab.h
--- a/linux-2.6-xen-sparse/include/asm-xen/gnttab.h     Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/gnttab.h     Wed Sep 14 21:36:10 2005
@@ -14,7 +14,7 @@
 #define __ASM_GNTTAB_H__
 
 #include <linux/config.h>
-#include <asm-xen/hypervisor.h>
+#include <asm/hypervisor.h>
 #include <asm-xen/xen-public/grant_table.h>
 
 /* NR_GRANT_FRAMES must be less than or equal to that configured in Xen */
diff -r a152b9f27e48 -r 9af349b055e5 tools/console/daemon/io.c
--- a/tools/console/daemon/io.c Wed Sep 14 21:33:52 2005
+++ b/tools/console/daemon/io.c Wed Sep 14 21:36:10 2005
@@ -22,10 +22,8 @@
 
 #include "utils.h"
 #include "io.h"
-
 #include "xenctrl.h"
 #include "xs.h"
-#include "xen/io/domain_controller.h"
 
 #include <malloc.h>
 #include <stdlib.h>
diff -r a152b9f27e48 -r 9af349b055e5 tools/console/daemon/utils.c
--- a/tools/console/daemon/utils.c      Wed Sep 14 21:33:52 2005
+++ b/tools/console/daemon/utils.c      Wed Sep 14 21:36:10 2005
@@ -34,8 +34,6 @@
 #include <string.h>
 
 #include "xenctrl.h"
-#include "xen/io/domain_controller.h"
-
 #include "utils.h"
 
 struct xs_handle *xs;
diff -r a152b9f27e48 -r 9af349b055e5 tools/examples/Makefile
--- a/tools/examples/Makefile   Wed Sep 14 21:33:52 2005
+++ b/tools/examples/Makefile   Wed Sep 14 21:36:10 2005
@@ -25,20 +25,19 @@
 XEN_SCRIPTS += block-file
 XEN_SCRIPTS += block-enbd
 
-XEN_BOOT_DIR = /usr/$(LIBDIR)/xen/boot
+# no 64-bit specifics in mem-map.sxp
+# so place in /usr/lib, not /usr/lib64
+XEN_BOOT_DIR = /usr/lib/xen/boot
 XEN_BOOT = mem-map.sxp
 
 XEN_HOTPLUG_DIR = /etc/hotplug
 XEN_HOTPLUG_SCRIPTS = xen-backend.agent
 
-all: 
+all:
 build:
 
 install: all install-initd install-configs install-scripts install-boot \
         install-hotplug
-
-xmexample.vmx: xmexample.vmx.in
-       sed -e 's/@@LIBDIR@@/$(LIBDIR)/' < $< > $@
 
 install-initd:
        [ -d $(DESTDIR)/etc/init.d ] || $(INSTALL_DIR) $(DESTDIR)/etc/init.d
@@ -80,4 +79,3 @@
        done
 
 clean:
-       $(RM) xmexample.vmx
diff -r a152b9f27e48 -r 9af349b055e5 tools/examples/network-bridge
--- a/tools/examples/network-bridge     Wed Sep 14 21:33:52 2005
+++ b/tools/examples/network-bridge     Wed Sep 14 21:36:10 2005
@@ -222,27 +222,31 @@
         return
     fi
 
-    brctl delif ${bridge} ${netdev}
-
-    if ifconfig veth0 2>/dev/null | grep -q veth0 ; then
-        brctl delif ${bridge} vif0.0
+    if ifconfig peth0 2>/dev/null | grep -q peth0 ; then
+
         ifconfig vif0.0 down
-        mac=`ifconfig veth0 | grep HWadd | sed -e 
's/.*\(..:..:..:..:..:..\).*/\1/'`
-        ifconfig ${netdev} down
-        ifconfig ${netdev} hw ether ${mac}
-        ifconfig ${netdev} arp up
-        transfer_addrs veth0 ${netdev}
-        transfer_routes veth0 ${netdev}
-        del_addrs veth0
-        ifconfig veth0 -arp down
-        ifconfig veth0 hw ether 00:00:00:00:00:00
+        mac=`ifconfig eth0 | grep HWadd | \
+            sed -e 's/.*\(..:..:..:..:..:..\).*/\1/'`
+        ifconfig ${netdev} 0.0.0.0 down
+        ifconfig ${netdev} hw ether fe:ff:ff:ff:ff:ff
+
+        ifconfig p${netdev} down
+        ifconfig p${netdev} hw ether ${mac} arp 
+        brctl delif ${bridge} p${netdev}
+
+        ip link set eth0 name veth0
+        ip link set peth0 name eth0
+        ifconfig ${bridge} down
+        brctl delbr ${bridge}
+        ifup eth0
+
     else
         transfer_routes ${bridge} ${netdev}
     fi
 }
 
 case ${OP} in
-  start)
+    start)
         op_start
         ;;
     
diff -r a152b9f27e48 -r 9af349b055e5 tools/examples/xen-backend.agent
--- a/tools/examples/xen-backend.agent  Wed Sep 14 21:33:52 2005
+++ b/tools/examples/xen-backend.agent  Wed Sep 14 21:36:10 2005
@@ -1,3 +1,7 @@
+
+copyrev: 0000000000000000000000000000000000000000
+copy: tools/examples/backend.hotplug
+
 #! /bin/sh
 
 #ACTION=add
diff -r a152b9f27e48 -r 9af349b055e5 tools/firmware/Makefile
--- a/tools/firmware/Makefile   Wed Sep 14 21:33:52 2005
+++ b/tools/firmware/Makefile   Wed Sep 14 21:36:10 2005
@@ -1,6 +1,8 @@
 XEN_ROOT = ../..
 include $(XEN_ROOT)/tools/Rules.mk
 
+# vmxloader is a 32-bit protected mode binary.
+# It belongs in /usr/lib, not /usr/lib64.
 TARGET      := vmxassist/vmxloader
 INSTALL_DIR := $(DESTDIR)/usr/lib/xen/boot
 
diff -r a152b9f27e48 -r 9af349b055e5 tools/ioemu/hw/i8259.c
--- a/tools/ioemu/hw/i8259.c    Wed Sep 14 21:33:52 2005
+++ b/tools/ioemu/hw/i8259.c    Wed Sep 14 21:36:10 2005
@@ -128,21 +128,23 @@
 /* pic[1] is connected to pin2 of pic[0] */
 #define CASCADE_IRQ 2
 
-static void shared_page_update()
-{
-    extern shared_iopage_t *shared_page;
-    uint8_t * pmask = (uint8_t *)&(shared_page->sp_global.pic_mask[0]);
-    int           index;
+extern shared_iopage_t *shared_page;
+
+static void xen_update_shared_imr(void)
+{
+    uint8_t *pmask = (uint8_t *)shared_page->sp_global.pic_mask;
+    int      index;
 
     index = pics[0].irq_base/8;
     pmask[index] = pics[0].imr;
+
     index = pics[1].irq_base/8;
-
-    if ( pics[0].imr &  (1 << CASCADE_IRQ) ) {
-        pmask[index] = 0xff;
-    } else {
-        pmask[index] = pics[1].imr;
-    }
+    pmask[index] = (pics[0].imr & (1 << CASCADE_IRQ)) ? 0xff : pics[1].imr;
+}
+
+static void xen_clear_shared_irr(void)
+{
+    memset(shared_page->sp_global.pic_intr, 0, INTR_LEN);
 }
 
 /* raise irq to CPU if necessary. must be called every time the active
@@ -174,7 +176,8 @@
 #endif
         cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HARD);
     }
-    shared_page_update();
+
+    xen_update_shared_imr();
 }
 
 #ifdef DEBUG_IRQ_LATENCY
@@ -283,7 +286,9 @@
     tmp = s->elcr_mask;
     memset(s, 0, sizeof(PicState));
     s->elcr_mask = tmp;
-    shared_page_update();
+
+    xen_update_shared_imr();
+    xen_clear_shared_irr();
 }
 
 static void pic_ioport_write(void *opaque, uint32_t addr, uint32_t val)
diff -r a152b9f27e48 -r 9af349b055e5 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c   Wed Sep 14 21:33:52 2005
+++ b/tools/libxc/xc_domain.c   Wed Sep 14 21:36:10 2005
@@ -134,7 +134,7 @@
     int ret = 0;
     dom0_op_t op;
 
-    if(mlock(info, max_domains*sizeof(xc_domaininfo_t)) != 0)
+    if ( mlock(info, max_domains*sizeof(xc_domaininfo_t)) != 0 )
         return -1;
     
     op.cmd = DOM0_GETDOMAININFOLIST;
@@ -142,12 +142,12 @@
     op.u.getdomaininfolist.max_domains  = max_domains;
     op.u.getdomaininfolist.buffer       = info;
 
-    if(xc_dom0_op(xc_handle, &op) < 0)
+    if ( xc_dom0_op(xc_handle, &op) < 0 )
         ret = -1;
     else
         ret = op.u.getdomaininfolist.num_domains;
     
-    if(munlock(info, max_domains*sizeof(xc_domaininfo_t)) != 0)
+    if ( munlock(info, max_domains*sizeof(xc_domaininfo_t)) != 0 )
         ret = -1;
     
     return ret;
@@ -277,15 +277,18 @@
     };
 
     err = xc_memory_op(xc_handle, XENMEM_increase_reservation, &reservation);
-    if (err == nr_extents)
+    if ( err == nr_extents )
         return 0;
 
-    if (err > 0) {
-        fprintf(stderr,"Failed alocation for dom %d : %ld pages order %d 
addr_bits %d\n",
-                                 domid, nr_extents, extent_order, 
address_bits);
+    if ( err > 0 )
+    {
+        fprintf(stderr, "Failed allocation for dom %d: "
+                "%ld pages order %d addr_bits %d\n",
+                domid, nr_extents, extent_order, address_bits);
         errno = ENOMEM;
         err = -1;
     }
+
     return err;
 }
 
@@ -304,24 +307,24 @@
         .domid        = domid
     };
 
-    if (extent_start == NULL)
+    if ( extent_start == NULL )
     {
         fprintf(stderr,"decrease_reservation extent_start is NULL!\n");
         errno = EINVAL;
-        err = -1;
-       goto out;
-    }
-
-    err = xc_memory_op(xc_handle, XENMEM_increase_reservation, &reservation);
-    if (err == nr_extents)
+        return -1;
+    }
+
+    err = xc_memory_op(xc_handle, XENMEM_decrease_reservation, &reservation);
+    if ( err == nr_extents )
         return 0;
 
-    if (err > 0) {
-        fprintf(stderr,"Failed de-alocation for dom %d : %ld pages order %d\n",
-                                 domid, nr_extents, extent_order);
+    if ( err > 0 )
+    {
+        fprintf(stderr,"Failed deallocation for dom %d: %ld pages order %d\n",
+                domid, nr_extents, extent_order);
         errno = EBUSY;
         err = -1;
     }
-out:
+
     return err;
 }
diff -r a152b9f27e48 -r 9af349b055e5 tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c    Wed Sep 14 21:33:52 2005
+++ b/tools/libxc/xc_linux_restore.c    Wed Sep 14 21:36:10 2005
@@ -421,7 +421,7 @@
             pin[nr_pins].cmd = MMUEXT_PIN_L1_TABLE;
         else /* pfn_type[i] == (L2TAB|LPINTAB) */
             pin[nr_pins].cmd = MMUEXT_PIN_L2_TABLE;
-        pin[nr_pins].mfn = pfn_to_mfn_table[i];
+        pin[nr_pins].arg1.mfn = pfn_to_mfn_table[i];
         if ( ++nr_pins == MAX_PIN_BATCH )
         {
             if ( xc_mmuext_op(xc_handle, pin, nr_pins, dom) < 0 )
diff -r a152b9f27e48 -r 9af349b055e5 tools/libxc/xc_linux_save.c
--- a/tools/libxc/xc_linux_save.c       Wed Sep 14 21:33:52 2005
+++ b/tools/libxc/xc_linux_save.c       Wed Sep 14 21:36:10 2005
@@ -13,8 +13,6 @@
 #include <sys/time.h>
 
 #include "xg_private.h"
-
-#include <xen/io/domain_controller.h>
 
 #define BATCH_SIZE 1024   /* 1024 pages (4MB) at a time */
 
diff -r a152b9f27e48 -r 9af349b055e5 tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c  Wed Sep 14 21:33:52 2005
+++ b/tools/libxc/xc_private.c  Wed Sep 14 21:36:10 2005
@@ -465,14 +465,14 @@
     unsigned long new_mfn;
 
     if ( xc_domain_memory_decrease_reservation( 
-       xc_handle, domid, 1, 0, &mfn) != 1 )
+       xc_handle, domid, 1, 0, &mfn) != 0 )
     {
        fprintf(stderr,"xc_make_page_below_4G decrease failed. mfn=%lx\n",mfn);
        return 0;
     }
 
     if ( xc_domain_memory_increase_reservation(
-        xc_handle, domid, 1, 0, 32, &new_mfn) != 1 )
+        xc_handle, domid, 1, 0, 32, &new_mfn) != 0 )
     {
        fprintf(stderr,"xc_make_page_below_4G increase failed. mfn=%lx\n",mfn);
        return 0;
diff -r a152b9f27e48 -r 9af349b055e5 tools/libxc/xc_vmx_build.c
--- a/tools/libxc/xc_vmx_build.c        Wed Sep 14 21:33:52 2005
+++ b/tools/libxc/xc_vmx_build.c        Wed Sep 14 21:36:10 2005
@@ -169,21 +169,35 @@
    l2_pgentry_t *vl2tab;
  
    mmio_addr = mmio_range_start & PAGE_MASK;
-   for (; mmio_addr < mmio_range_end; mmio_addr += PAGE_SIZE) {
+   for ( ; mmio_addr < mmio_range_end; mmio_addr += PAGE_SIZE )
+   {
        vl3e = vl3tab[l3_table_offset(mmio_addr)];
-       if (vl3e == 0)
+       if ( vl3e == 0 )
            continue;
-       vl2tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE,
-               PROT_READ|PROT_WRITE, vl3e >> PAGE_SHIFT);
-       if (vl2tab == 0) {
+
+       vl2tab = xc_map_foreign_range(
+           xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE, vl3e>>PAGE_SHIFT);
+       if ( vl2tab == NULL )
+       {
            PERROR("Failed zap MMIO range");
            return -1;
        }
+
        vl2e = vl2tab[l2_table_offset(mmio_addr)];
-       if (vl2e == 0)
+       if ( vl2e == 0 )
+       {
+           munmap(vl2tab, PAGE_SIZE);
            continue;
-       vl1tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE,
-               PROT_READ|PROT_WRITE, vl2e >> PAGE_SHIFT);
+       }
+
+       vl1tab = xc_map_foreign_range(
+           xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE, vl2e>>PAGE_SHIFT);
+       if ( vl1tab == NULL )
+       {
+           PERROR("Failed zap MMIO range");
+           munmap(vl2tab, PAGE_SIZE);
+           return -1;
+       }
 
        vl1tab[l1_table_offset(mmio_addr)] = 0;
        munmap(vl2tab, PAGE_SIZE);
diff -r a152b9f27e48 -r 9af349b055e5 tools/libxc/xg_private.c
--- a/tools/libxc/xg_private.c  Wed Sep 14 21:33:52 2005
+++ b/tools/libxc/xg_private.c  Wed Sep 14 21:36:10 2005
@@ -65,7 +65,7 @@
     struct mmuext_op op;
 
     op.cmd = type;
-    op.mfn = mfn;
+    op.arg1.mfn = mfn;
 
     if ( xc_mmuext_op(xc_handle, &op, 1, dom) < 0 )
         return 1;
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/lowlevel/xs/xs.c
--- a/tools/python/xen/lowlevel/xs/xs.c Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/lowlevel/xs/xs.c Wed Sep 14 21:36:10 2005
@@ -74,6 +74,7 @@
        " path [string]: xenstore path\n"       \
        "\n"                                    \
        "Returns: [string] data read.\n"        \
+       "         None if key doesn't exist.\n" \
        "Raises RuntimeError on error.\n"       \
        "\n"
 
@@ -97,7 +98,11 @@
     xsval = xs_read(xh, path, &xsval_n);
     Py_END_ALLOW_THREADS
     if (!xsval) {
-        PyErr_SetFromErrno(PyExc_RuntimeError);
+        if (errno == ENOENT) {
+            Py_INCREF(Py_None);
+            val = Py_None;
+        } else
+            PyErr_SetFromErrno(PyExc_RuntimeError);
         goto exit;
     }
     val = PyString_FromStringAndSize(xsval, xsval_n);
@@ -160,6 +165,7 @@
        " path [string]: path to list.\n"                       \
        "\n"                                                    \
        "Returns: [string array] list of subdirectory names.\n" \
+       "         None if key doesn't exist.\n"                 \
        "Raises RuntimeError on error.\n"                       \
        "\n"
 
@@ -183,12 +189,17 @@
     xsval = xs_directory(xh, path, &xsval_n);
     Py_END_ALLOW_THREADS
     if (!xsval) {
-        PyErr_SetFromErrno(PyExc_RuntimeError);
-        goto exit;
+        if (errno == ENOENT) {
+            Py_INCREF(Py_None);
+            val = Py_None;
+        } else
+            PyErr_SetFromErrno(PyExc_RuntimeError);
+       goto exit;
     }
     val = PyList_New(xsval_n);
     for (i = 0; i < xsval_n; i++)
         PyList_SetItem(val, i, PyString_FromString(xsval[i]));
+    free(xsval);
  exit:
     return val;
 }
@@ -253,7 +264,7 @@
     Py_BEGIN_ALLOW_THREADS
     xsval = xs_rm(xh, path);
     Py_END_ALLOW_THREADS
-    if (!xsval) {
+    if (!xsval && errno != ENOENT) {
         PyErr_SetFromErrno(PyExc_RuntimeError);
         goto exit;
     }
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xend/XendCheckpoint.py
--- a/tools/python/xen/xend/XendCheckpoint.py   Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/XendCheckpoint.py   Wed Sep 14 21:36:10 2005
@@ -13,6 +13,7 @@
 from struct import pack, unpack, calcsize
 from xen.util.xpopen import xPopen3
 import xen.lowlevel.xc; xc = xen.lowlevel.xc.new()
+from xen.xend.xenstore.xsutil import IntroduceDomain
 
 from XendError import XendError
 from XendLogging import log
@@ -48,7 +49,7 @@
     # simply uses the defaults compiled into libxenguest; see the comments 
     # and/or code in xc_linux_save() for more information. 
     cmd = [PATH_XC_SAVE, str(xc.handle()), str(fd),
-           str(dominfo.id), "0", "0", str(int(live)) ]
+           str(dominfo.domid), "0", "0", str(int(live)) ]
     log.info("[xc_save] " + join(cmd))
     child = xPopen3(cmd, True, -1, [fd, xc.handle()])
     
@@ -68,18 +69,10 @@
             if fd == child.fromchild.fileno():
                 l = child.fromchild.readline()
                 if l.rstrip() == "suspend":
-                    log.info("suspending %d" % dominfo.id)
-                    xd.domain_shutdown(dominfo.id, reason='suspend')
+                    log.info("suspending %d" % dominfo.domid)
+                    xd.domain_shutdown(dominfo.domid, reason='suspend')
                     dominfo.state_wait("suspended")
-                    log.info("suspend %d done" % dominfo.id)
-                    if dominfo.store_channel:
-                        try:
-                            dominfo.db.releaseDomain(dominfo.id)
-                        except Exception, ex:
-                            log.warning(
-                                "error in domain release on xenstore: %s",
-                                ex)
-                            pass
+                    log.info("suspend %d done" % dominfo.domid)
                     child.tochild.write("done\n")
                     child.tochild.flush()
         if filter(lambda (fd, event): event & select.POLLHUP, r):
@@ -90,12 +83,8 @@
     if child.wait() != 0:
         raise XendError("xc_save failed: %s" % lasterr)
 
-    if dominfo.store_channel:
-        dominfo.store_channel.close()
-        dominfo.db['store_channel'].delete()
-        dominfo.db.saveDB(save=True)
-        dominfo.store_channel = None
-    xd.domain_destroy(dominfo.id)
+    dominfo.setStoreChannel(None)
+    xd.domain_destroy(dominfo.domid)
     return None
 
 def restore(xd, fd):
@@ -137,7 +126,7 @@
         console_evtchn = 0
 
     cmd = [PATH_XC_RESTORE, str(xc.handle()), str(fd),
-           str(dominfo.id), str(nr_pfns),
+           str(dominfo.domid), str(nr_pfns),
            str(store_evtchn), str(console_evtchn)]
     log.info("[xc_restore] " + join(cmd))
     child = xPopen3(cmd, True, -1, [fd, xc.handle()])
@@ -163,16 +152,15 @@
                     m = re.match(r"^(store-mfn) (\d+)\n$", l)
                     if m:
                         if dominfo.store_channel:
-                            dominfo.store_mfn = int(m.group(2))
+                            dominfo.setStoreRef(int(m.group(2)))
                             if dominfo.store_mfn >= 0:
-                                dominfo.db.introduceDomain(dominfo.id,
-                                                           dominfo.store_mfn,
-                                                           
dominfo.store_channel)
-                            dominfo.exportToDB(save=True, sync=True)
+                                IntroduceDomain(dominfo.domid,
+                                                dominfo.store_mfn,
+                                                dominfo.store_channel.port1,
+                                                dominfo.path)
                     m = re.match(r"^(console-mfn) (\d+)\n$", l)
                     if m:
-                        dominfo.console_mfn = int(m.group(2))
-                        dominfo.exportToDB(save=True, sync=True)
+                        dominfo.setConsoleRef(int(m.group(2)))
                     try:
                         l = child.fromchild.readline()
                     except:
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py       Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/XendDomain.py       Wed Sep 14 21:36:10 2005
@@ -130,8 +130,11 @@
         doms = self.xen_domains()
         self.dbmap.readDB()
         for domdb in self.dbmap.values():
+            if not domdb.has_key("xend"):
+                continue
+            db = domdb.addChild("xend")
             try:
-                domid = int(domdb.id)
+                domid = int(domdb["domid"].getData())
             except:
                 domid = None
             # XXX if domid in self.domains, then something went wrong
@@ -139,7 +142,8 @@
                 domdb.delete()
             elif domid in doms:
                 try:
-                    self._new_domain(domdb, doms[domid]) 
+                    self._new_domain(domdb["uuid"].getData(), domid, db,
+                                     doms[domid]) 
                 except Exception, ex:
                     log.exception("Error recreating domain info: id=%d", domid)
                     self._delete_domain(domid)
@@ -155,15 +159,15 @@
     def close(self):
         pass
 
-    def _new_domain(self, db, info):
+    def _new_domain(self, uuid, domid, db, info):
         """Create a domain entry from saved info.
 
         @param db:   saved info from the db
         @param info: domain info from xen
         @return: domain
         """
-        dominfo = XendDomainInfo.recreate(db, info)
-        self.domains[dominfo.id] = dominfo
+        dominfo = XendDomainInfo.recreate(uuid, domid, db, info)
+        self.domains[dominfo.domid] = dominfo
         return dominfo
 
     def _add_domain(self, info, notify=True):
@@ -174,15 +178,15 @@
         """
         # Remove entries under the wrong id.
         for i, d in self.domains.items():
-            if i != d.id:
+            if i != d.domid:
                 del self.domains[i]
                 self.dbmap.delete(d.uuid)
-        if info.id in self.domains:
+        if info.domid in self.domains:
             notify = False
-        self.domains[info.id] = info
+        self.domains[info.domid] = info
         info.exportToDB(save=True)
         if notify:
-            eserver.inject('xend.domain.create', [info.name, info.id])
+            eserver.inject('xend.domain.create', [info.name, info.domid])
 
     def _delete_domain(self, id, notify=True):
         """Remove a domain from the tables.
@@ -201,11 +205,14 @@
             info.cleanup()
             info.delete()
             if notify:
-                eserver.inject('xend.domain.died', [info.name, info.id])
+                eserver.inject('xend.domain.died', [info.name, info.domid])
         # XXX this should not be needed
         for domdb in self.dbmap.values():
+            if not domdb.has_key("xend"):
+                continue
+            db = domdb.addChild("xend")
             try:
-                domid = int(domdb.id)
+                domid = int(domdb["domid"].getData())
             except:
                 domid = None
             if (domid is None) or (domid == id):
@@ -261,13 +268,13 @@
         # Update entries for existing domains.
         do_domain_restarts = False
         for d in self.domains.values():
-            info = doms.get(d.id)
+            info = doms.get(d.domid)
             if info:
                 d.update(info)
             elif d.restart_pending():
                 do_domain_restarts = True
             else:
-                self._delete_domain(d.id)
+                self._delete_domain(d.domid)
         if cleanup and do_domain_restarts:
             scheduler.now(self.domain_restarts)
 
@@ -298,20 +305,20 @@
 
         @param dominfo: domain object
         """
-        log.info("Restarting domain: name=%s id=%s", dominfo.name, dominfo.id)
+        log.info("Restarting domain: name=%s id=%s", dominfo.name, 
dominfo.domid)
         eserver.inject("xend.domain.restart",
-                       [dominfo.name, dominfo.id, "begin"])
+                       [dominfo.name, dominfo.domid, "begin"])
         try:
             dominfo.restart()
-            log.info('Restarted domain name=%s id=%s', dominfo.name, 
dominfo.id)
+            log.info('Restarted domain name=%s id=%s', dominfo.name, 
dominfo.domid)
             eserver.inject("xend.domain.restart",
-                           [dominfo.name, dominfo.id, "success"])
-            self.domain_unpause(dominfo.id)
+                           [dominfo.name, dominfo.domid, "success"])
+            self.domain_unpause(dominfo.domid)
         except Exception, ex:
             log.exception("Exception restarting domain: name=%s id=%s",
-                          dominfo.name, dominfo.id)
+                          dominfo.name, dominfo.domid)
             eserver.inject("xend.domain.restart",
-                           [dominfo.name, dominfo.id, "fail"])
+                           [dominfo.name, dominfo.domid, "fail"])
         return dominfo
 
     def domain_configure(self, vmconfig):
@@ -355,12 +362,12 @@
                 log.info(
                     "Creating entry for unknown domain: id=%d uuid=%s",
                     id, uuid)
-                db = self.dbmap.addChild(uuid)
-                dominfo = XendDomainInfo.recreate(db, info)
-                dominfo.setdom(id)
+                db = self.dbmap.addChild("%s/xend" % uuid)
+                dominfo = XendDomainInfo.recreate(uuid, id, db, info)
                 self._add_domain(dominfo)
                 return dominfo
         except Exception, ex:
+            raise
             log.exception("Error creating domain info: id=%d", id)
         return None
         
@@ -383,9 +390,9 @@
         @param id: domain id
         """
         dominfo = self.domain_lookup(id)
-        eserver.inject('xend.domain.unpause', [dominfo.name, dominfo.id])
-        try:
-            return xc.domain_unpause(dom=dominfo.id)
+        eserver.inject('xend.domain.unpause', [dominfo.name, dominfo.domid])
+        try:
+            return xc.domain_unpause(dom=dominfo.domid)
         except Exception, ex:
             raise XendError(str(ex))
     
@@ -395,9 +402,9 @@
         @param id: domain id
         """
         dominfo = self.domain_lookup(id)
-        eserver.inject('xend.domain.pause', [dominfo.name, dominfo.id])
-        try:
-            return xc.domain_pause(dom=dominfo.id)
+        eserver.inject('xend.domain.pause', [dominfo.name, dominfo.domid])
+        try:
+            return xc.domain_pause(dom=dominfo.domid)
         except Exception, ex:
             raise XendError(str(ex))
     
@@ -413,8 +420,8 @@
         @param reason: shutdown type: poweroff, reboot, suspend, halt
         """
         dominfo = self.domain_lookup(id)
-        self.domain_restart_schedule(dominfo.id, reason, force=True)
-        eserver.inject('xend.domain.shutdown', [dominfo.name, dominfo.id, 
reason])
+        self.domain_restart_schedule(dominfo.domid, reason, force=True)
+        eserver.inject('xend.domain.shutdown', [dominfo.name, dominfo.domid, 
reason])
         if reason == 'halt':
             reason = 'poweroff'
         val = dominfo.shutdown(reason)
@@ -438,7 +445,7 @@
             if not dominfo.shutdown_pending:
                 # domain doesn't need shutdown
                 continue
-            id = dominfo.id
+            id = dominfo.domid
             left = dominfo.shutdown_time_left(SHUTDOWN_TIMEOUT)
             if left <= 0:
                 # Shutdown expired - destroy domain.
@@ -469,15 +476,15 @@
         restart = (force and reason == 'reboot') or 
dominfo.restart_needed(reason)
         if restart:
             log.info('Scheduling restart for domain: name=%s id=%s',
-                     dominfo.name, dominfo.id)
+                     dominfo.name, dominfo.domid)
             eserver.inject("xend.domain.restart",
-                           [dominfo.name, dominfo.id, "schedule"])
+                           [dominfo.name, dominfo.domid, "schedule"])
             dominfo.restarting()
         else:
             log.info('Cancelling restart for domain: name=%s id=%s',
-                     dominfo.name, dominfo.id)
+                     dominfo.name, dominfo.domid)
             eserver.inject("xend.domain.restart",
-                           [dominfo.name, dominfo.id, "cancel"])
+                           [dominfo.name, dominfo.domid, "cancel"])
             dominfo.restart_cancel()
 
     def domain_restarts(self):
@@ -487,8 +494,8 @@
         for dominfo in self.domains.values():
             if not dominfo.restart_pending():
                 continue
-            print 'domain_restarts>', dominfo.name, dominfo.id
-            info = doms.get(dominfo.id)
+            print 'domain_restarts>', dominfo.name, dominfo.domid
+            info = doms.get(dominfo.domid)
             if info:
                 # Don't execute restart for domains still running.
                 print 'domain_restarts> still runnning: ', dominfo.name
@@ -505,7 +512,7 @@
         try:
             dominfo = self.domain_lookup(id)
             log.info('Destroying domain: name=%s', dominfo.name)
-            eserver.inject('xend.domain.destroy', [dominfo.name, dominfo.id])
+            eserver.inject('xend.domain.destroy', [dominfo.name, 
dominfo.domid])
             val = dominfo.destroy()
         except:
             #todo
@@ -580,7 +587,7 @@
         """
         dominfo = self.domain_lookup(id)
         try:
-            return xc.domain_pincpu(dominfo.id, vcpu, cpumap)
+            return xc.domain_pincpu(dominfo.domid, vcpu, cpumap)
         except Exception, ex:
             raise XendError(str(ex))
 
@@ -589,7 +596,7 @@
         """
         dominfo = self.domain_lookup(id)
         try:
-            return xc.bvtsched_domain_set(dom=dominfo.id, mcuadv=mcuadv,
+            return xc.bvtsched_domain_set(dom=dominfo.domid, mcuadv=mcuadv,
                                           warpback=warpback, 
warpvalue=warpvalue, 
                                           warpl=warpl, warpu=warpu)
         except Exception, ex:
@@ -600,7 +607,7 @@
         """
         dominfo = self.domain_lookup(id)
         try:
-            return xc.bvtsched_domain_get(dominfo.id)
+            return xc.bvtsched_domain_get(dominfo.domid)
         except Exception, ex:
             raise XendError(str(ex))
     
@@ -610,7 +617,7 @@
         """
         dominfo = self.domain_lookup(id)
         try:
-            return xc.sedf_domain_set(dominfo.id, period, slice, latency, 
extratime, weight)
+            return xc.sedf_domain_set(dominfo.domid, period, slice, latency, 
extratime, weight)
         except Exception, ex:
             raise XendError(str(ex))
 
@@ -619,7 +626,7 @@
         """
         dominfo = self.domain_lookup(id)
         try:
-            return xc.sedf_domain_get(dominfo.id)
+            return xc.sedf_domain_get(dominfo.domid)
         except Exception, ex:
             raise XendError(str(ex))
 
@@ -667,7 +674,7 @@
         @param type: device type
         """
         dominfo = self.domain_lookup(id)
-        val = dominfo.device_destroy(type, devid)
+        val = dominfo.device_delete(type, devid)
         dominfo.exportToDB()
         return val
 
@@ -709,7 +716,7 @@
         """
         dominfo = self.domain_lookup(id)
         try:
-            return xc.shadow_control(dominfo.id, op)
+            return xc.shadow_control(dominfo.domid, op)
         except Exception, ex:
             raise XendError(str(ex))
 
@@ -723,7 +730,7 @@
         dominfo = self.domain_lookup(id)
         maxmem = int(mem) * 1024
         try:
-            return xc.domain_setmaxmem(dominfo.id, maxmem_kb = maxmem)
+            return xc.domain_setmaxmem(dominfo.domid, maxmem_kb = maxmem)
         except Exception, ex:
             raise XendError(str(ex))
 
@@ -735,7 +742,7 @@
         @return: 0 on success, -1 on error
         """
         dominfo = self.domain_lookup(id)
-        return dominfo.mem_target_set(mem)
+        return dominfo.setMemoryTarget(mem * (1 << 20))
 
     def domain_vcpu_hotplug(self, id, vcpu, state):
         """Enable or disable VCPU vcpu in DOM id
@@ -755,12 +762,12 @@
         @param id: domain
         """
         dominfo = self.domain_lookup(id)
-        corefile = "/var/xen/dump/%s.%s.core"% (dominfo.name, dominfo.id)
-        try:
-            xc.domain_dumpcore(dom=dominfo.id, corefile=corefile)
+        corefile = "/var/xen/dump/%s.%s.core"% (dominfo.name, dominfo.domid)
+        try:
+            xc.domain_dumpcore(dom=dominfo.domid, corefile=corefile)
         except Exception, ex:
             log.warning("Dumpcore failed, id=%s name=%s: %s",
-                        dominfo.id, dominfo.name, ex)
+                        dominfo.domid, dominfo.name, ex)
         
 def instance():
     """Singleton constructor. Use this instead of the class constructor.
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/XendDomainInfo.py   Wed Sep 14 21:36:10 2005
@@ -27,6 +27,7 @@
 import os
 import time
 import threading
+import errno
 
 import xen.lowlevel.xc; xc = xen.lowlevel.xc.new()
 from xen.util.ip import check_subnet, get_current_ipgw
@@ -48,6 +49,7 @@
 from xen.xend.uuid import getUuid
 from xen.xend.xenstore import DBVar, XenNode, DBMap
 from xen.xend.xenstore.xstransact import xstransact
+from xen.xend.xenstore.xsutil import IntroduceDomain
 
 """Shutdown code for poweroff."""
 DOMAIN_POWEROFF = 0
@@ -128,7 +130,7 @@
         @raise: VmError for invalid configuration
         """
         uuid = getUuid()
-        db = parentdb.addChild(uuid)
+        db = parentdb.addChild("%s/xend" % uuid)
         path = parentdb.getPath()
         vm = cls(uuid, path, db)
         vm.construct(config)
@@ -138,23 +140,26 @@
 
     create = classmethod(create)
 
-    def recreate(cls, db, info):
+    def recreate(cls, uuid, domid, db, info):
         """Create the VM object for an existing domain.
 
         @param db:        domain db
         @param info:      domain info from xc
         """
-        dom = info['dom']
-        path = "/".join(db.getPath().split("/")[0:-1])
-        vm = cls(db.getName(), path, db)
-        vm.setdom(dom)
-        db.readDB()
+        path = "/".join(db.getPath().split("/")[0:-2])
+        vm = cls(uuid, path, db)
+        vm.setDomid(domid)
+        vm.name, vm.start_time = vm.gatherVm(("name", str),
+                                             ("start-time", float))
+        try:
+            db.readDB()
+        except: pass
         vm.importFromDB()
         config = vm.config
         log.debug('info=' + str(info))
         log.debug('config=' + prettyprintstring(config))
 
-        vm.memory = info['mem_kb']/1024
+        vm.memory = info['mem_kb'] / 1024
         vm.target = info['mem_kb'] * 1024
 
         if config:
@@ -164,7 +169,7 @@
             finally:
                 vm.recreate = False
         else:
-            vm.setName("Domain-%d" % dom)
+            vm.setName("Domain-%d" % domid)
 
         vm.exportToDB(save=True)
         return vm
@@ -180,13 +185,13 @@
         """
         if not uuid:
             uuid = getUuid()
-        db = parentdb.addChild(uuid)
+        db = parentdb.addChild("%s/xend" % uuid)
         path = parentdb.getPath()
         vm = cls(uuid, path, db)
         ssidref = int(sxp.child_value(config, 'ssidref'))
         log.debug('restoring with ssidref='+str(ssidref))
         id = xc.domain_create(ssidref = ssidref)
-        vm.setdom(id)
+        vm.setDomid(id)
         vm.clear_shutdown()
         try:
             vm.restore = True
@@ -199,32 +204,26 @@
     restore = classmethod(restore)
 
     __exports__ = [
-        DBVar('id',            ty='int'),
-        DBVar('name',          ty='str'),
-        DBVar('uuid',          ty='str'),
         DBVar('config',        ty='sxpr'),
-        DBVar('start_time',    ty='float'),
         DBVar('state',         ty='str'),
-        DBVar('store_mfn',     ty='long'),
-        DBVar('console_mfn',   ty='long', path="console/ring-ref"),
         DBVar('restart_mode',  ty='str'),
         DBVar('restart_state', ty='str'),
         DBVar('restart_time',  ty='float'),
         DBVar('restart_count', ty='int'),
-        DBVar('target',        ty='long', path="memory/target"),
         DBVar('device_model_pid', ty='int'),
         ]
     
     def __init__(self, uuid, path, db):
         self.uuid = uuid
         self.path = path + "/" + uuid
+
         self.db = db
 
         self.recreate = 0
         self.restore = 0
         
         self.config = None
-        self.id = None
+        self.domid = None
         self.cpu_weight = 1
         self.start_time = None
         self.name = None
@@ -260,10 +259,42 @@
         self.restart_count = 0
         
         self.vcpus = 1
-        self.vcpusdb = {}
         self.bootloader = None
         self.device_model_pid = 0
 
+        self.writeVm("uuid", self.uuid)
+        self.storeDom("vm", self.path)
+
+    def readVm(self, *args):
+        return xstransact.Read(self.path, *args)
+
+    def writeVm(self, *args):
+        return xstransact.Write(self.path, *args)
+
+    def removeVm(self, *args):
+        return xstransact.Remove(self.path, *args)
+
+    def gatherVm(self, *args):
+        return xstransact.Gather(self.path, *args)
+
+    def storeVm(self, *args):
+        return xstransact.Store(self.path, *args)
+
+    def readDom(self, *args):
+        return xstransact.Read(self.path, *args)
+
+    def writeDom(self, *args):
+        return xstransact.Write(self.path, *args)
+
+    def removeDom(self, *args):
+        return xstransact.Remove(self.path, *args)
+
+    def gatherDom(self, *args):
+        return xstransact.Gather(self.path, *args)
+
+    def storeDom(self, *args):
+        return xstransact.Store(self.path, *args)
+
     def setDB(self, db):
         self.db = db
 
@@ -271,50 +302,56 @@
         self.db.saveDB(save=save, sync=sync)
 
     def exportToDB(self, save=False, sync=False):
-        if self.store_channel:
-            self.store_channel.saveToDB(self.db.addChild("store_channel"),
-                                        save=save)
-        if self.console_channel:
-            self.db['console/port'] = "%i" % self.console_channel.port1
         if self.image:
             self.image.exportToDB(save=save, sync=sync)
         self.db.exportToDB(self, fields=self.__exports__, save=save, sync=sync)
 
     def importFromDB(self):
         self.db.importFromDB(self, fields=self.__exports__)
-        self.store_channel = self.eventChannelOld("store_channel")
-
-    def setdom(self, dom):
+        self.store_channel = self.eventChannel("store/port")
+
+    def setDomid(self, domid):
         """Set the domain id.
 
         @param dom: domain id
         """
-        self.id = int(dom)
-        #self.db.id = self.id
+        self.domid = domid
+        self.storeDom("domid", self.domid)
 
     def getDomain(self):
-        return self.id
+        return self.domid
 
     def setName(self, name):
         self.name = name
-        self.db.name = self.name
+        self.storeVm("name", name)
 
     def getName(self):
         return self.name
 
-    def getStoreChannel(self):
-        return self.store_channel
-
-    def getConsoleChannel(self):
-        return self.console_channel
+    def setStoreRef(self, ref):
+        self.store_mfn = ref
+        self.storeDom("store/ring-ref", ref)
+
+    def setStoreChannel(self, channel):
+        if self.store_channel and self.store_channel != channel:
+            self.store_channel.close()
+        self.store_channel = channel
+        self.storeDom("store/port", channel.port1)
+
+    def setConsoleRef(self, ref):
+        self.console_mfn = ref
+        self.storeDom("console/ring-ref", ref)
+
+    def setMemoryTarget(self, target):
+        self.memory_target = target
+        self.storeDom("memory/target", target)
 
     def update(self, info=None):
         """Update with  info from xc.domain_getinfo().
         """
-        self.info = info or dom_get(self.id)
+        self.info = info or dom_get(self.domid)
         self.memory = self.info['mem_kb'] / 1024
         self.ssidref = self.info['ssidref']
-        self.target = self.info['mem_kb'] * 1024
 
     def state_set(self, state):
         self.state_updated.acquire()
@@ -332,7 +369,7 @@
 
     def __str__(self):
         s = "<domain"
-        s += " id=" + str(self.id)
+        s += " id=" + str(self.domid)
         s += " name=" + self.name
         s += " memory=" + str(self.memory)
         s += " ssidref=" + str(self.ssidref)
@@ -373,7 +410,7 @@
             frontpath = "%s/device/%s/%d" % (self.path, type, devnum)
 
             front = { 'backend' : backpath,
-                      'backend-id' : "%i" % backdom.id,
+                      'backend-id' : "%i" % backdom.domid,
                       'virtual-device' : "%i" % devnum }
             xstransact.Write(frontpath, front)
 
@@ -382,7 +419,7 @@
             back = { 'type' : type,
                      'params' : params,
                      'frontend' : frontpath,
-                     'frontend-id' : "%i" % self.id }
+                     'frontend-id' : "%i" % self.domid }
             xstransact.Write(backpath, back)
 
             return
@@ -415,7 +452,7 @@
             frontpath = "%s/device/%s/%d" % (self.path, type, devnum)
 
             front = { 'backend' : backpath,
-                      'backend-id' : "%i" % backdom.id,
+                      'backend-id' : "%i" % backdom.domid,
                       'handle' : "%i" % devnum,
                       'mac' : mac }
             xstransact.Write(frontpath, front)
@@ -425,7 +462,7 @@
                      'mac' : mac,
                      'bridge' : bridge,
                      'frontend' : frontpath,
-                     'frontend-id' : "%i" % self.id,
+                     'frontend-id' : "%i" % self.domid,
                      'handle' : "%i" % devnum }
             if ipaddr:
                 back['ip'] = ' '.join(ipaddr)
@@ -444,13 +481,13 @@
             frontpath = "%s/device/%s/%d" % (self.path, type, devnum)
 
             front = { 'backend' : backpath,
-                      'backend-id' : "%i" % backdom.id,
+                      'backend-id' : "%i" % backdom.domid,
                       'handle' : "%i" % devnum }
             xstransact.Write(frontpath, front)
 
             back = { 'instance' : "%i" % devnum,
                      'frontend' : frontpath,
-                     'frontend-id' : "%i" % self.id }
+                     'frontend-id' : "%i" % self.domid }
             xstransact.Write(backpath, back)
 
             return
@@ -485,7 +522,7 @@
 
     def sxpr(self):
         sxpr = ['domain',
-                ['id', self.id],
+                ['domid', self.domid],
                 ['name', self.name],
                 ['memory', self.memory],
                 ['ssidref', self.ssidref],
@@ -582,7 +619,7 @@
             return
         if dominfo.is_terminated():
             return
-        if not self.id or (dominfo.id != self.id):
+        if not self.domid or (dominfo.domid != self.domid):
             raise VmError('vm name clash: ' + name)
         
     def construct(self, config):
@@ -630,11 +667,11 @@
         self.memory = int(sxp.child_value(config, 'memory'))
         if self.memory is None:
             raise VmError('missing memory size')
-        self.target = self.memory * (1 << 20)
+        self.setMemoryTarget(self.memory * (1 << 20))
         self.ssidref = int(sxp.child_value(config, 'ssidref'))
         cpu = sxp.child_value(config, 'cpu')
-        if self.recreate and self.id and cpu is not None and int(cpu) >= 0:
-            xc.domain_pincpu(self.id, 0, 1<<int(cpu))
+        if self.recreate and self.domid and cpu is not None and int(cpu) >= 0:
+            xc.domain_pincpu(self.domid, 0, 1<<int(cpu))
         try:
             image = sxp.child_value(self.config, 'image')
             vcpus = sxp.child_value(image, 'vcpus')
@@ -643,15 +680,11 @@
         except:
             raise VmError('invalid vcpus value')
 
-    def exportVCPUSToDB(self, vcpus):
-        for v in range(0,vcpus):
-            path = "/cpu/%d"%(v)
-            if not self.vcpusdb.has_key(path):
-                self.vcpusdb[path] = self.db.addChild(path)
-            db = self.vcpusdb[path]
-            log.debug("writing key availability=online to path %s in 
store"%(path))
-            db['availability'] = "online"
-            db.saveDB(save=True)
+    def configure_vcpus(self, vcpus):
+        d = {}
+        for v in range(0, vcpus):
+            d["cpu/%d/availability" % v] = "online"
+        self.writeVm(d)
 
     def init_image(self):
         """Create boot image handler for the domain.
@@ -668,18 +701,17 @@
         self.image.createImage()
         self.exportToDB()
         if self.store_channel and self.store_mfn >= 0:
-            self.db.introduceDomain(self.id,
-                                    self.store_mfn,
-                                    self.store_channel)
+            IntroduceDomain(self.domid, self.store_mfn,
+                            self.store_channel.port1, self.path)
         # get the configured value of vcpus and update store
-        self.exportVCPUSToDB(self.vcpus)
+        self.configure_vcpus(self.vcpus)
 
     def delete(self):
         """Delete the vm's db.
         """
-        if dom_get(self.id):
+        if dom_get(self.domid):
             return
-        self.id = None
+        self.domid = None
         self.saveToDB(sync=True)
         try:
             # Todo: eventually will have to wait for devices to signal
@@ -695,10 +727,10 @@
         The domain will not finally go away unless all vm
         devices have been released.
         """
-        if self.id is None:
+        if self.domid is None:
             return
         try:
-            xc.domain_destroy(dom=self.id)
+            xc.domain_destroy(dom=self.domid)
         except Exception, err:
             log.exception("Domain destroy failed: %s", self.name)
 
@@ -708,16 +740,7 @@
         self.state = STATE_VM_TERMINATED
         self.release_devices()
         if self.store_channel:
-            try:
-                self.store_channel.close()
-                self.store_channel = None
-            except:
-                pass
-            try:
-                self.db.releaseDomain(self.id)
-            except Exception, ex:
-                log.warning("error in domain release on xenstore: %s", ex)
-                pass
+            self.setStoreChannel(None)
         if self.console_channel:
             # notify processes using this cosole?
             try:
@@ -765,7 +788,7 @@
     def show(self):
         """Print virtual machine info.
         """
-        print "[VM dom=%d name=%s memory=%d ssidref=%d" % (self.id, self.name, 
self.memory, self.ssidref)
+        print "[VM dom=%d name=%s memory=%d ssidref=%d" % (self.domid, 
self.name, self.memory, self.ssidref)
         print "image:"
         sxp.show(self.image)
         print "]"
@@ -777,46 +800,37 @@
             return
         if self.start_time is None:
             self.start_time = time.time()
+            self.storeVm(("start-time", self.start_time))
         try:
             cpu = int(sxp.child_value(self.config, 'cpu', '-1'))
         except:
             raise VmError('invalid cpu')
-        id = self.image.initDomain(self.id, self.memory, self.ssidref, cpu, 
self.cpu_weight)
+        id = self.image.initDomain(self.domid, self.memory, self.ssidref, cpu, 
self.cpu_weight)
         log.debug('init_domain> Created domain=%d name=%s memory=%d',
                   id, self.name, self.memory)
-        self.setdom(id)
-
-    def eventChannelOld(self, key):
-        """Create an event channel to the domain.
-        If saved info is available recreate the channel.
-        
-        @param key db key for the saved data (if any)
-        """
-        db = self.db.addChild(key)
-        return EventChannel.restoreFromDB(db, 0, self.id)
-        
-    def eventChannel(self, path=None, key=None):
+        self.setDomid(id)
+
+    def eventChannel(self, path=None):
         """Create an event channel to the domain.
         
         @param path under which port is stored in db
         """
         port = 0
-        try:
-            if path and key:
-                if path:
-                    db = self.db.addChild(path)
-                else:
-                    db = self.db
-                port = int(db[key].getData())
-        except: pass
-        return EventChannel.interdomain(0, self.id, port1=port, port2=0)
+        if path:
+            try:
+                port = int(self.readDom(path))
+            except:
+                # if anything goes wrong, assume the port was not yet set
+                pass
+        ret = EventChannel.interdomain(0, self.domid, port1=port, port2=0)
+        self.storeDom(path, ret.port1)
+        return ret
         
     def create_channel(self):
         """Create the channels to the domain.
         """
-        self.store_channel = self.eventChannelOld("store_channel")
-        self.console_channel = self.eventChannel("console", "port")
-
+        self.store_channel = self.eventChannel("store/port")
+        self.console_channel = self.eventChannel("console/port")
 
     def create_configured_devices(self):
         devices = sxp.children(self.config, 'device')
@@ -1046,50 +1060,30 @@
                 log.warning("Unknown config field %s", field_name)
             index[field_name] = field_index + 1
 
-    def mem_target_set(self, target):
-        """Set domain memory target in bytes.
-        """
-        if target:
-            self.target = target * (1 << 20)
-            # Commit to XenStore immediately
-            self.exportToDB()
-
     def vcpu_hotplug(self, vcpu, state):
         """Disable or enable VCPU in domain.
         """
-        db = ""
-        try:
-            db = self.vcpusdb['/cpu/%d'%(vcpu)]
-        except:
-            log.error("Invalid VCPU")
+        if vcpu > self.vcpus:
+            log.error("Invalid VCPU %d" % vcpu)
             return
-
-        if self.store_channel:
-            if int(state) == 0:
-                db['availability'] = "offline"
-            else:
-                db['availability'] = "online"
-
-        db.saveDB(save=True)
+        if int(state) == 0:
+            availability = "offline"
+        else:
+            availability = "online"
+        self.storeVm("cpu/%d/availability" % vcpu, availability)
 
     def shutdown(self, reason):
         if not reason in shutdown_reasons.values():
             raise XendError('invalid reason:' + reason)
-        db = self.db.addChild("/control");
-        db['shutdown'] = reason;
-        db.saveDB(save=True);
+        self.storeVm("control/shutdown", reason)
         if not reason in ['suspend']:
             self.shutdown_pending = {'start':time.time(), 'reason':reason}
 
     def clear_shutdown(self):
-        db = self.db.addChild("/control")
-        db['shutdown'] = ""
-        db.saveDB(save=True)
+        self.removeVm("control/shutdown")
 
     def send_sysrq(self, key=0):
-        db = self.db.addChild("/control");
-        db['sysrq'] = '%c' % key;
-        db.saveDB(save=True);        
+        self.storeVm("control/sysrq", '%c' % key)
 
     def shutdown_time_left(self, timeout):
         if not self.shutdown_pending:
@@ -1098,14 +1092,22 @@
 
     def dom0_init_store(self):
         if not self.store_channel:
-            self.store_channel = self.eventChannelOld("store_channel")
-        self.store_mfn = xc.init_store(self.store_channel.port2)
-        if self.store_mfn >= 0:
-            self.db.introduceDomain(self.id, self.store_mfn,
-                                    self.store_channel)
-        self.exportToDB(save=True, sync=True)
-        # get run-time value of vcpus and update store
-        self.exportVCPUSToDB(dom_get(self.id)['vcpus'])
+            self.store_channel = self.eventChannel("store/port")
+            if not self.store_channel:
+                return
+        ref = xc.init_store(self.store_channel.port2)
+        if ref and ref >= 0:
+            self.setStoreRef(ref)
+            try:
+                IntroduceDomain(self.domid, ref, self.store_channel.port1,
+                                self.path)
+            except RuntimeError, ex:
+                if ex.args[0] == errno.EISCONN:
+                    pass
+                else:
+                    raise
+            # get run-time value of vcpus and update store
+            self.configure_vcpus(dom_get(self.domid)['vcpus'])
 
 
 def vm_field_ignore(_, _1, _2, _3):
@@ -1126,7 +1128,7 @@
         maxmem = int(maxmem)
     except:
         raise VmError("invalid maxmem: " + str(maxmem))
-    xc.domain_setmaxmem(vm.id, maxmem_kb = maxmem * 1024)
+    xc.domain_setmaxmem(vm.domid, maxmem_kb = maxmem * 1024)
 
 
 #============================================================================
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/image.py    Wed Sep 14 21:36:10 2005
@@ -23,6 +23,7 @@
 from xen.xend.XendError import VmError
 from xen.xend.XendLogging import log
 from xen.xend.xenstore import DBVar
+from xen.xend.xenstore.xstransact import xstransact
 
 from xen.xend.server import channel
 
@@ -154,7 +155,6 @@
             if dom <= 0:
                 raise VmError('Creating domain failed: name=%s' % self.vm.name)
         log.debug("initDomain: cpu=%d mem_kb=%d ssidref=%d dom=%d", cpu, 
mem_kb, ssidref, dom)
-        # xc.domain_setuuid(dom, uuid)
         xc.domain_setcpuweight(dom, cpu_weight)
         xc.domain_setmaxmem(dom, mem_kb)
 
@@ -240,6 +240,12 @@
         """Extra cleanup on domain destroy (define in subclass if needed)."""
         pass
 
+    def set_vminfo(self, d):
+        if d.has_key('store_mfn'):
+            self.vm.setStoreRef(d.get('store_mfn'))
+        if d.has_key('console_mfn'):
+            self.vm.setConsoleRef(d.get('console_mfn'))
+
 addImageHandlerClass = ImageHandler.addImageHandlerClass
 
 class LinuxImageHandler(ImageHandler):
@@ -274,8 +280,7 @@
                              flags          = self.flags,
                              vcpus          = self.vm.vcpus)
         if isinstance(ret, dict):
-            self.vm.store_mfn = ret.get('store_mfn')
-            self.vm.console_mfn = ret.get('console_mfn')
+            self.set_vminfo(ret)
             return 0
         return ret
 
@@ -318,7 +323,7 @@
                             flags          = self.flags,
                             vcpus          = self.vm.vcpus)
         if isinstance(ret, dict):
-            self.vm.store_mfn = ret.get('store_mfn')
+            self.set_vminfo(ret)
             return 0
         return ret
 
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xend/server/SrvDomain.py
--- a/tools/python/xen/xend/server/SrvDomain.py Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/server/SrvDomain.py Wed Sep 14 21:36:10 2005
@@ -41,21 +41,21 @@
         fn = FormFn(self.xd.domain_configure,
                     [['dom',    'int'],
                      ['config', 'sxpr']])
-        return fn(req.args, {'dom': self.dom.id})
+        return fn(req.args, {'dom': self.dom.domid})
 
     def op_unpause(self, op, req):
-        val = self.xd.domain_unpause(self.dom.id)
+        val = self.xd.domain_unpause(self.dom.domid)
         return val
         
     def op_pause(self, op, req):
-        val = self.xd.domain_pause(self.dom.id)
+        val = self.xd.domain_pause(self.dom.domid)
         return val
 
     def op_shutdown(self, op, req):
         fn = FormFn(self.xd.domain_shutdown,
                     [['dom',    'int'],
                      ['reason', 'str']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         req.setResponseCode(http.ACCEPTED)
         req.setHeader("Location", "%s/.." % req.prePathURL())
         return val
@@ -64,7 +64,7 @@
         fn = FormFn(self.xd.domain_sysrq,
                     [['dom',    'int'],
                      ['key',    'int']])
-        val = fn(req.args, {'dom' : self.dom.id})
+        val = fn(req.args, {'dom' : self.dom.domid})
         req.setResponseCode(http.ACCEPTED)
         req.setHeader("Location", "%s/.." % req.prePathURL())
         return val
@@ -73,7 +73,7 @@
         fn = FormFn(self.xd.domain_destroy,
                     [['dom',    'int'],
                      ['reason', 'str']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         req.setHeader("Location", "%s/.." % req.prePathURL())
         return val
 
@@ -84,7 +84,7 @@
         fn = FormFn(self.xd.domain_save,
                     [['dom',  'int'],
                      ['file', 'str']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return 0
 
     def op_migrate(self, op, req):
@@ -96,14 +96,14 @@
                      ['destination', 'str'],
                      ['live',        'int'],
                      ['resource',    'int']])
-        return fn(req.args, {'dom': self.dom.id})
+        return fn(req.args, {'dom': self.dom.domid})
 
     def op_pincpu(self, op, req):
         fn = FormFn(self.xd.domain_pincpu,
                     [['dom', 'int'],
                      ['vcpu', 'int'],
                      ['cpumap', 'int']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
 
     def op_cpu_bvt_set(self, op, req):
@@ -114,7 +114,7 @@
                      ['warpvalue', 'int'],
                      ['warpl',     'long'],
                      ['warpu',     'long']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
     
     
@@ -126,28 +126,28 @@
                     ['latency', 'int'],
                     ['extratime', 'int'],
                     ['weight', 'int']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
 
     def op_maxmem_set(self, op, req):
         fn = FormFn(self.xd.domain_maxmem_set,
                     [['dom',    'int'],
                      ['memory', 'int']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
     
     def op_mem_target_set(self, op, req):
         fn = FormFn(self.xd.domain_mem_target_set,
                     [['dom',    'int'],
                      ['target', 'int']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
 
     def op_devices(self, op, req):
         fn = FormFn(self.xd.domain_devtype_ls,
                     [['dom',    'int'],
                      ['type',   'str']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
 
     def op_device(self, op, req):
@@ -155,7 +155,7 @@
                     [['dom',    'int'],
                      ['type',   'str'],
                      ['idx',    'int']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         if val:
             return val.sxpr()
         else:
@@ -165,7 +165,7 @@
         fn = FormFn(self.xd.domain_device_create,
                     [['dom',    'int'],
                      ['config', 'sxpr']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
 
     def op_device_refresh(self, op, req):
@@ -173,7 +173,7 @@
                     [['dom',  'int'],
                      ['type', 'str'],
                      ['idx',  'str']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
 
     def op_device_destroy(self, op, req):
@@ -181,7 +181,7 @@
                     [['dom',  'int'],
                      ['type', 'str'],
                      ['idx',  'str']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
                 
     def op_device_configure(self, op, req):
@@ -189,7 +189,7 @@
                     [['dom',    'int'],
                      ['config', 'sxpr'],
                      ['idx',    'str']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
 
     def op_vif_limit_set(self, op, req):
@@ -198,7 +198,7 @@
                      ['vif',    'int'],
                      ['credit', 'int'],
                      ['period', 'int']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
 
     def op_vcpu_hotplug(self, op, req):
@@ -206,7 +206,7 @@
                     [['dom', 'int'],
                      ['vcpu', 'int'],
                      ['state', 'int']])
-        val = fn(req.args, {'dom': self.dom.id})
+        val = fn(req.args, {'dom': self.dom.domid})
         return val
 
     def render_POST(self, req):
diff -r a152b9f27e48 -r 9af349b055e5 
tools/python/xen/xend/server/SrvDomainDir.py
--- a/tools/python/xen/xend/server/SrvDomainDir.py      Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/server/SrvDomainDir.py      Wed Sep 14 21:36:10 2005
@@ -154,7 +154,7 @@
             for d in domains:
                req.write('<li><a href="%s%s"> Domain %s</a>'
                          % (url, d.name, d.name))
-               req.write('id=%s' % d.id)
+               req.write('id=%s' % d.domid)
                req.write('memory=%d'% d.memory)
                req.write('ssidref=%d'% d.ssidref)
                req.write('</li>')
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xend/server/blkif.py
--- a/tools/python/xen/xend/server/blkif.py     Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/server/blkif.py     Wed Sep 14 21:36:10 2005
@@ -123,7 +123,7 @@
     def init(self, recreate=False, reboot=False):
         self.frontendDomain = self.getDomain()
         backend = self.getBackend()
-        self.backendId = backend.id
+        self.backendId = backend.domid
 
     def configure(self, config, change=False, recreate=False):
         if change:
@@ -146,7 +146,7 @@
         
         try:
             xd = get_component('xen.xend.XendDomain')
-            self.backendDomain = 
xd.domain_lookup_by_name(sxp.child_value(config, 'backend', '0')).id
+            self.backendDomain = 
xd.domain_lookup_by_name(sxp.child_value(config, 'backend', '0')).domid
         except:
             raise XendError('invalid backend domain')
 
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xend/server/netif.py
--- a/tools/python/xen/xend/server/netif.py     Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/server/netif.py     Wed Sep 14 21:36:10 2005
@@ -180,7 +180,7 @@
             else:
                 #todo: Code below will fail on xend restart when backend is 
not domain 0.
                 xd = get_component('xen.xend.XendDomain')
-                self.backendDomain = 
xd.domain_lookup_by_name(sxp.child_value(config, 'backend', '0')).id
+                self.backendDomain = 
xd.domain_lookup_by_name(sxp.child_value(config, 'backend', '0')).domid
         except:
             raise XendError('invalid backend domain')
         return self.config
@@ -206,7 +206,7 @@
         mtu = self._get_config_mtu(config)
         
         xd = get_component('xen.xend.XendDomain')
-        backendDomain = xd.domain_lookup_by_name(sxp.child_value(config, 
'backend', '0')).id
+        backendDomain = xd.domain_lookup_by_name(sxp.child_value(config, 
'backend', '0')).domid
 
         if (mac is not None) and (mac != self.mac):
             raise XendError("cannot change mac")
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xend/xenstore/xsnode.py
--- a/tools/python/xen/xend/xenstore/xsnode.py  Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/xenstore/xsnode.py  Wed Sep 14 21:36:10 2005
@@ -365,18 +365,6 @@
         finally:
             self.watchThread = None
 
-    def introduceDomain(self, dom, page, evtchn, path):
-        try:
-            self.getxs().introduce_domain(dom, page, evtchn.port1, path)
-        except RuntimeError, ex:
-            if ex.args[0] == errno.EISCONN:
-                return None
-            else:
-                raise
-
-    def releaseDomain(self, dom):
-        self.getxs().release_domain(dom)
-
 def getXenStore():
     global xenstore
     try:
@@ -461,12 +449,6 @@
     def ls(self):
         return self.store.ls(self.path)
 
-    def introduceDomain(self, dom, page, evtchn, path):
-        self.store.introduceDomain(dom, page, evtchn, path)
-        
-    def releaseDomain(self, dom):
-        self.store.releaseDomain(dom)
-
     def watch(self, fn, path=""):
         """Watch a path for changes. The path is relative
         to the node and defaults to the node itself.
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xend/xenstore/xsobj.py
--- a/tools/python/xen/xend/xenstore/xsobj.py   Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/xenstore/xsobj.py   Wed Sep 14 21:36:10 2005
@@ -319,30 +319,6 @@
     def getPath(self):
         return self.__db__ and self.__db__.relPath()
 
-    def introduceDomain(self, dom, page, evtchn, path=None):
-        db = self.__db__
-        if path is None:
-            path = db.relPath()
-        log.info("DBMap>introduceDomain> %d %d %s %s" %(dom, page, evtchn, 
path))
-        try:
-            db.introduceDomain(dom, page, evtchn, path)
-        except Exception, ex:
-            import traceback
-            traceback.print_exc()
-            log.info("DBMap>introduceDomain> %s" %ex)
-            pass # todo: don't ignore
-        
-    def releaseDomain(self, dom):
-        db = self.__db__
-        log.info("DBMap>releaseDomain> %d" %dom)
-        try:
-            db.releaseDomain(dom)
-        except Exception, ex:
-            import traceback
-            traceback.print_exc()
-            log.info("DBMap>releaseDomain> %s" %ex)
-            pass # todo: don't ignore
-
     def watch(self, fn, path=""):
         return self.__db__.watch(fn, path=path)
 
@@ -509,9 +485,11 @@
         if self.__db__ is None:
             return
         self.__data__ = self.__db__.getData()
-        for k in self.__db__.ls():
-            n = self.addChild(k)
-            n.readDB()
+        l = self.__db__.ls()
+        if l:
+            for k in l:
+                n = self.addChild(k)
+                n.readDB()
         self.__dirty__ = False
 
     def readChildDB(self, k):
diff -r a152b9f27e48 -r 9af349b055e5 
tools/python/xen/xend/xenstore/xstransact.py
--- a/tools/python/xen/xend/xenstore/xstransact.py      Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/xenstore/xstransact.py      Wed Sep 14 21:36:10 2005
@@ -7,14 +7,7 @@
 import errno
 import threading
 from xen.lowlevel import xs
-
-handles = {}
-
-# XXX need to g/c handles from dead threads
-def xshandle():
-    if not handles.has_key(threading.currentThread()):
-        handles[threading.currentThread()] = xs.open()
-    return handles[threading.currentThread()]
+from xen.xend.xenstore.xsutil import xshandle
 
 class xstransact:
 
@@ -43,8 +36,6 @@
         return xshandle().transaction_end(False)
 
     def abort(self):
-        if not self.in_transaction:
-            raise RuntimeError
         self.in_transaction = False
         return xshandle().transaction_end(True)
 
@@ -100,7 +91,10 @@
 
     def _list(self, key):
         path = "%s/%s" % (self.path, key)
-        return map(lambda x: key + "/" + x, xshandle().ls(path))
+        l = xshandle().ls(path)
+        if l:
+            return map(lambda x: key + "/" + x, l)
+        return []
 
     def list(self, *args):
         if len(args) == 0:
@@ -110,6 +104,45 @@
             ret.extend(self._list(key))
         return ret
 
+    def gather(self, *args):
+        if len(args) and type(args[0]) != tuple:
+            args = args,
+        ret = []
+        for tup in args:
+            if len(tup) == 2:
+                (key, fn) = tup
+                defval = None
+            else:
+                (key, fn, defval) = tup
+            try:
+                val = fn(self._read(key))
+            except TypeError:
+                val = defval
+            ret.append(val)
+        if len(ret) == 1:
+            return ret[0]
+        return ret
+
+    def store(self, *args):
+        if len(args) and type(args[0]) != tuple:
+            args = args,
+        for tup in args:
+            if len(tup) == 2:
+                (key, val) = tup
+                try:
+                    fmt = { str : "%s",
+                            int : "%i",
+                            float : "%f",
+                            type(None) : None }[type(val)]
+                except KeyError:
+                    raise TypeError
+            else:
+                (key, val, fmt) = tup
+            if val is None:
+                self._remove(key)
+            else:
+                self._write(key, fmt % val)
+
 
     def Read(cls, path, *args):
         while True:
@@ -119,8 +152,13 @@
                 t.commit()
                 return v
             except RuntimeError, ex:
-                if ex.args[0] == errno.ETIMEDOUT:
-                    pass
+                t.abort()
+                if ex.args[0] == errno.ETIMEDOUT:
+                    pass
+                else:
+                    raise
+            except:
+                t.abort()
                 raise
 
     Read = classmethod(Read)
@@ -133,13 +171,18 @@
                 t.commit()
                 return
             except RuntimeError, ex:
-                if ex.args[0] == errno.ETIMEDOUT:
-                    pass
+                t.abort()
+                if ex.args[0] == errno.ETIMEDOUT:
+                    pass
+                else:
+                    raise
+            except:
+                t.abort()
                 raise
 
     Write = classmethod(Write)
 
-    def Remove(cls, *args):
+    def Remove(cls, path, *args):
         while True:
             try:
                 t = cls(path)
@@ -147,8 +190,13 @@
                 t.commit()
                 return
             except RuntimeError, ex:
-                if ex.args[0] == errno.ETIMEDOUT:
-                    pass
+                t.abort()
+                if ex.args[0] == errno.ETIMEDOUT:
+                    pass
+                else:
+                    raise
+            except:
+                t.abort()
                 raise
 
     Remove = classmethod(Remove)
@@ -161,8 +209,51 @@
                 t.commit()
                 return v
             except RuntimeError, ex:
-                if ex.args[0] == errno.ETIMEDOUT:
-                    pass
+                t.abort()
+                if ex.args[0] == errno.ETIMEDOUT:
+                    pass
+                else:
+                    raise
+            except:
+                t.abort()
                 raise
 
     List = classmethod(List)
+
+    def Gather(cls, path, *args):
+        while True:
+            try:
+                t = cls(path)
+                v = t.gather(*args)
+                t.commit()
+                return v
+            except RuntimeError, ex:
+                t.abort()
+                if ex.args[0] == errno.ETIMEDOUT:
+                    pass
+                else:
+                    raise
+            except:
+                t.abort()
+                raise
+
+    Gather = classmethod(Gather)
+
+    def Store(cls, path, *args):
+        while True:
+            try:
+                t = cls(path)
+                v = t.store(*args)
+                t.commit()
+                return v
+            except RuntimeError, ex:
+                t.abort()
+                if ex.args[0] == errno.ETIMEDOUT:
+                    pass
+                else:
+                    raise
+            except:
+                t.abort()
+                raise
+
+    Store = classmethod(Store)
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py     Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xm/create.py     Wed Sep 14 21:36:10 2005
@@ -750,7 +750,7 @@
             server.xend_domain_destroy(dom)
             opts.err("Failed to unpause domain %s" % dom)
     opts.info("Started domain %s" % (dom))
-    return int(sxp.child_value(dominfo, 'id'))
+    return int(sxp.child_value(dominfo, 'domid'))
 
 def get_dom0_alloc():
     """Return current allocation memory of dom0 (in MB). Return 0 on error"""
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xm/main.py       Wed Sep 14 21:36:10 2005
@@ -64,7 +64,6 @@
   Domain Commands:
     console <DomId>         attach to console of DomId
     cpus-list <DomId> <VCpu>          get the list of cpus for a VCPU
-    cpus-set <DomId> <VCpu> <CPUS>    set which cpus a VCPU can use. 
     create  <ConfigFile>      create a domain
     destroy <DomId>           terminate a domain immediately
     domid   <DomName>         convert a domain name to a domain id
@@ -83,6 +82,7 @@
     vcpu-enable <DomId> <VCPU>        disable VCPU in a domain
     vcpu-disable <DomId> <VCPU>       enable VCPU in a domain
     vcpu-list <DomId>                 get the list of VCPUs for a domain
+    vcpu-pin <DomId> <VCpu> <CPUS>    set which cpus a VCPU can use. 
 
   Xen Host Commands:
     dmesg   [--clear]         read or clear Xen's message buffer
@@ -91,14 +91,15 @@
     top                       monitor system and domains in real-time
 
   Scheduler Commands:
-    bvt <options>             set BVT scheduler parameters
-    bvt_ctxallow <Allow>      set the BVT scheduler context switch allowance
-    sedf <options>            set simple EDF parameters
+    sched-bvt <options>       set BVT scheduler parameters
+    sched-bvt-ctxallow <Allow>
+        Set the BVT scheduler context switch allowance
+    sched-sedf <options>      set simple EDF parameters
 
   Virtual Device Commands:
-    block-create <DomId> <BackDev> <FrontDev> <Mode> [BackDomId]
+    block-attach  <DomId> <BackDev> <FrontDev> <Mode> [BackDomId]
         Create a new virtual block device 
-    block-destroy <DomId> <DevId>  Destroy a domain's virtual block device
+    block-detach  <DomId> <DevId>  Destroy a domain's virtual block device
     block-list    <DomId>          List virtual block devices for a domain
     block-refresh <DomId> <DevId>  Refresh a virtual block device for a domain
     network-limit   <DomId> <Vif> <Credit> <Period>
@@ -172,8 +173,7 @@
     from xen.xm import create
     # ugly hack because the opt parser apparently wants
     # the subcommand name just to throw it away!
-    args.insert(0,"bogus")
-    create.main(args)
+    create.main(["bogus"] + args)
 
 def xm_save(args):
     arg_check(args,2,"save")
@@ -192,17 +192,16 @@
     from xen.xend.XendClient import server
     info = server.xend_domain_restore(savefile)
     PrettyPrint.prettyprint(info)
-    id = sxp.child_value(info, 'id')
+    id = sxp.child_value(info, 'domid')
     if id is not None:
-        server.xend_domain_unpause(id)
+        server.xend_domain_unpause(domid)
 
 def xm_migrate(args):
     # TODO: arg_check
     from xen.xm import migrate
     # ugly hack because the opt parser apparently wants
     # the subcommand name just to throw it away!
-    args.insert(0,"bogus")
-    migrate.main(args)
+    migrate.main(["bogus"] + args)
 
 def xm_list(args):
     use_long = 0
@@ -242,7 +241,7 @@
 
 def parse_doms_info(info):
     dominfo = {}
-    dominfo['dom'] = int(sxp.child_value(info, 'id', '-1'))
+    dominfo['dom'] = int(sxp.child_value(info, 'domid', '-1'))
     dominfo['name'] = sxp.child_value(info, 'name', '??')
     dominfo['mem'] = int(sxp.child_value(info, 'memory', '0'))
     dominfo['cpu'] = str(sxp.child_value(info, 'cpu', '0'))
@@ -265,7 +264,7 @@
     for cpu in vcpu_to_cpu:
         vcpuinfo = {}
         vcpuinfo['name']   = sxp.child_value(info, 'name', '??')
-        vcpuinfo['dom']    = int(sxp.child_value(info, 'id', '-1'))
+        vcpuinfo['dom']    = int(sxp.child_value(info, 'domid', '-1'))
         vcpuinfo['vcpu']   = int(count)
         vcpuinfo['cpu']    = int(cpu)
         vcpuinfo['cpumap'] = int(cpumap[count])&mask
@@ -289,8 +288,7 @@
                    vcpuinfo)
 
 def xm_vcpu_list(args):
-    args.insert(0,"-v")
-    xm_list(args)
+    xm_list(["-v"] + args)
 
 def xm_destroy(args):
     arg_check(args,1,"destroy")
@@ -298,33 +296,28 @@
     from xen.xm import destroy
     # ugly hack because the opt parser apparently wants
     # the subcommand name just to throw it away!
-    args.insert(0,"bogus")
-    destroy.main(args)
+    destroy.main(["bogus"] + args)
             
 def xm_reboot(args):
     arg_check(args,1,"reboot")
+    from xen.xm import shutdown
     # ugly hack because the opt parser apparently wants
     # the subcommand name just to throw it away!
-    args.insert(0,"bogus")
-    args.insert(2,"-R")
-    from xen.xm import shutdown
-    shutdown.main(args)
+    shutdown.main(["bogus", "-R"] + args)
 
 def xm_shutdown(args):
     arg_check(args,1,"shutdown")
 
+    from xen.xm import shutdown
     # ugly hack because the opt parser apparently wants
     # the subcommand name just to throw it away!
-    args.insert(0,"bogus")
-    from xen.xm import shutdown
-    shutdown.main(args)
+    shutdown.main(["bogus"] + args)
 
 def xm_sysrq(args):
     from xen.xm import sysrq
     # ugly hack because the opt parser apparently wants
     # the subcommand name just to throw it away!
-    args.insert(0,"bogus")
-    sysrq.main(args)
+    sysrq.main(["bogus"] + args)
 
 def xm_pause(args):
     arg_check(args, 1, "pause")
@@ -358,8 +351,8 @@
 
     return cpumap
 
-def xm_cpus_set(args):
-    arg_check(args, 3, "cpus-set")
+def xm_vcpu_pin(args):
+    arg_check(args, 3, "vcpu-pin")
     
     dom  = args[0]
     vcpu = int(args[1])
@@ -395,7 +388,7 @@
     
     from xen.xend.XendClient import server
     dom = server.xend_domain(name)
-    id = sxp.child_value(dom, 'id')
+    id = sxp.child_value(dom, 'domid')
     server.xend_domain_vcpu_hotplug(id, vcpu, 1)
 
 def xm_vcpu_disable(args):
@@ -406,7 +399,7 @@
     
     from xen.xend.XendClient import server
     dom = server.xend_domain(name)
-    id = sxp.child_value(dom, 'id')
+    id = sxp.child_value(dom, 'domid')
     server.xend_domain_vcpu_hotplug(id, vcpu, 0)
 
 def xm_domid(args):
@@ -414,7 +407,7 @@
 
     from xen.xend.XendClient import server
     dom = server.xend_domain(name)
-    print sxp.child_value(dom, 'id')
+    print sxp.child_value(dom, 'domid')
     
 def xm_domname(args):
     name = args[0]
@@ -423,22 +416,22 @@
     dom = server.xend_domain(name)
     print sxp.child_value(dom, 'name')
 
-def xm_bvt(args):
-    arg_check(args, 6, "bvt")
+def xm_sched_bvt(args):
+    arg_check(args, 6, "sched-bvt")
     dom = args[0]
     v = map(long, args[1:6])
     from xen.xend.XendClient import server
     server.xend_domain_cpu_bvt_set(dom, *v)
 
-def xm_bvt_ctxallow(args):
-    arg_check(args, 1, "bvt_ctxallow")
+def xm_sched_bvt_ctxallow(args):
+    arg_check(args, 1, "sched-bvt-ctxallow")
 
     slice = int(args[0])
     from xen.xend.XendClient import server
     server.xend_node_cpu_bvt_slice_set(slice)
 
-def xm_sedf(args):
-    arg_check(args, 6, "sedf")
+def xm_sched_sedf(args):
+    arg_check(args, 6, "sched-sedf")
     
     dom = args[0]
     v = map(int, args[1:6])
@@ -462,7 +455,7 @@
     dom = args[0]
     from xen.xend.XendClient import server
     info = server.xend_domain(dom)
-    domid = int(sxp.child_value(info, 'id', '-1'))
+    domid = int(sxp.child_value(info, 'domid', '-1'))
     cmd = "/usr/libexec/xen/xenconsole %d" % domid
     os.execvp('/usr/libexec/xen/xenconsole', cmd.split())
     console = sxp.child(info, "console")
@@ -482,10 +475,11 @@
               fn=set_true, default=0,
               use="Clear the contents of the Xen message buffer.")
     # Work around for gopts
-    args.insert(0,"bogus")
-    gopts.parse(args)
-    if not (1 <= len(args) <= 2):
-        err('Invalid arguments: ' + str(args))
+    myargs = args
+    myargs.insert(0, "bogus")
+    gopts.parse(myargs)
+    if not (1 <= len(myargs) <= 2):
+        err('Invalid arguments: ' + str(myargs))
 
     from xen.xend.XendClient import server
     if not gopts.vals.clear:
@@ -512,6 +506,14 @@
         sxp.show(x)
         print
 
+def xm_network_attach(args):
+
+    print "Not implemented"
+
+def xm_network_detach(args):
+
+    print "Not implemented"
+    
 def xm_block_list(args):
     arg_check(args,1,"block-list")
     dom = args[0]
@@ -520,11 +522,14 @@
         sxp.show(x)
         print
 
-def xm_block_create(args):
+def xm_block_attach(args):
     n = len(args)
+    if n == 0:
+        usage("block-attach")
+        
     if n < 4 or n > 5:
         err("%s: Invalid argument(s)" % args[0])
-        usage("block-create")
+        usage("block-attach")
 
     dom = args[0]
     vbd = ['vbd',
@@ -546,8 +551,8 @@
     from xen.xend.XendClient import server
     server.xend_domain_device_refresh(dom, 'vbd', dev)
 
-def xm_block_destroy(args):
-    arg_check(args,2,"block-destroy")
+def xm_block_detach(args):
+    arg_check(args,2,"block-detach")
 
     dom = args[0]
     dev = args[1]
@@ -615,7 +620,7 @@
     "mem-max": xm_mem_max,
     "mem-set": xm_mem_set,
     # cpu commands
-    "cpus-set": xm_cpus_set,
+    "vcpu-pin": xm_vcpu_pin,
 #    "cpus-list": xm_cpus_list,
     "vcpu-enable": xm_vcpu_enable,
     "vcpu-disable": xm_vcpu_disable,
@@ -631,17 +636,19 @@
     "info": xm_info,
     "log": xm_log,
     # scheduler
-    "bvt": xm_bvt,
-    "bvt_ctxallow": xm_bvt_ctxallow,
-    "sedf": xm_sedf,
+    "sched-bvt": xm_sched_bvt,
+    "sched-bvt-ctxallow": xm_sched_bvt_ctxallow,
+    "sched-sedf": xm_sched_sedf,
     # block
-    "block-create": xm_block_create,
-    "block-destroy": xm_block_destroy,
+    "block-attach": xm_block_attach,
+    "block-detach": xm_block_detach,
     "block-list": xm_block_list,
     "block-refresh": xm_block_refresh,
     # network
     "network-limit": xm_network_limit,
     "network-list": xm_network_list,
+    "network-attach": xm_network_attach,
+    "network-detach": xm_network_detach,
     # vnet
     "vnet-list": xm_vnet_list,
     "vnet-create": xm_vnet_create,
@@ -719,8 +726,6 @@
             sys.exit(1)
         except XendError, ex:
             if len(args) > 0:
-                if args[0] == "bogus":
-                    args.remove("bogus")
                 handle_xend_error(argv[1], args[0], ex)
             else:
                 print "Unexpected error:", sys.exc_info()[0]
diff -r a152b9f27e48 -r 9af349b055e5 tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c   Wed Sep 14 21:33:52 2005
+++ b/tools/xenstore/xenstored_core.c   Wed Sep 14 21:36:10 2005
@@ -50,7 +50,6 @@
 #include "xenstored_transaction.h"
 #include "xenstored_domain.h"
 #include "xenctrl.h"
-#include "xen/io/domain_controller.h"
 
 static bool verbose;
 LIST_HEAD(connections);
diff -r a152b9f27e48 -r 9af349b055e5 tools/xenstore/xenstored_watch.c
--- a/tools/xenstore/xenstored_watch.c  Wed Sep 14 21:33:52 2005
+++ b/tools/xenstore/xenstored_watch.c  Wed Sep 14 21:36:10 2005
@@ -144,7 +144,7 @@
                        else
                                continue;
                        /* If connection not doing anything, queue this. */
-                       if (!i->out)
+                       if (i->state == OK)
                                queue_next_event(i);
                }
        }
diff -r a152b9f27e48 -r 9af349b055e5 tools/xenstore/xs_test.c
--- a/tools/xenstore/xs_test.c  Wed Sep 14 21:33:52 2005
+++ b/tools/xenstore/xs_test.c  Wed Sep 14 21:36:10 2005
@@ -398,12 +398,16 @@
 static void do_readack(unsigned int handle)
 {
        enum xsd_sockmsg_type type;
-       char *ret;
-
-       ret = read_reply(handles[handle]->fd, &type, NULL);
-       if (!ret)
-               failed(handle);
-       free(ret);
+       char *ret = NULL;
+
+       /* Watches can have fired before reply comes: daemon detects
+        * and re-transmits, so we can ignore this. */
+       do {
+               free(ret);
+               ret = read_reply(handles[handle]->fd, &type, NULL);
+               if (!ret)
+                       failed(handle);
+       } while (type == XS_WATCH_EVENT);
 }
 
 static void do_setid(unsigned int handle, char *id)
diff -r a152b9f27e48 -r 9af349b055e5 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Wed Sep 14 21:33:52 2005
+++ b/xen/arch/x86/mm.c Wed Sep 14 21:36:10 2005
@@ -1659,7 +1659,7 @@
 {
     struct mmuext_op op;
     int rc = 0, i = 0, okay, cpu = smp_processor_id();
-    unsigned long type, done = 0;
+    unsigned long mfn, type, done = 0;
     struct pfn_info *page;
     struct vcpu *v = current;
     struct domain *d = v->domain, *e;
@@ -1706,7 +1706,8 @@
         }
 
         okay = 1;
-        page = &frame_table[op.mfn];
+        mfn  = op.arg1.mfn;
+        page = &frame_table[mfn];
 
         switch ( op.cmd )
         {
@@ -1717,17 +1718,17 @@
             if ( shadow_mode_refcounts(FOREIGNDOM) )
                 type = PGT_writable_page;
 
-            okay = get_page_and_type_from_pagenr(op.mfn, type, FOREIGNDOM);
+            okay = get_page_and_type_from_pagenr(mfn, type, FOREIGNDOM);
             if ( unlikely(!okay) )
             {
-                MEM_LOG("Error while pinning mfn %lx", op.mfn);
+                MEM_LOG("Error while pinning mfn %lx", mfn);
                 break;
             }
             
             if ( unlikely(test_and_set_bit(_PGT_pinned,
                                            &page->u.inuse.type_info)) )
             {
-                MEM_LOG("Mfn %lx already pinned", op.mfn);
+                MEM_LOG("Mfn %lx already pinned", mfn);
                 put_page_and_type(page);
                 okay = 0;
                 break;
@@ -1750,10 +1751,10 @@
             goto pin_page;
 
         case MMUEXT_UNPIN_TABLE:
-            if ( unlikely(!(okay = get_page_from_pagenr(op.mfn, FOREIGNDOM))) )
+            if ( unlikely(!(okay = get_page_from_pagenr(mfn, FOREIGNDOM))) )
             {
                 MEM_LOG("Mfn %lx bad domain (dom=%p)",
-                        op.mfn, page_get_owner(page));
+                        mfn, page_get_owner(page));
             }
             else if ( likely(test_and_clear_bit(_PGT_pinned, 
                                                 &page->u.inuse.type_info)) )
@@ -1765,28 +1766,28 @@
             {
                 okay = 0;
                 put_page(page);
-                MEM_LOG("Mfn %lx not pinned", op.mfn);
+                MEM_LOG("Mfn %lx not pinned", mfn);
             }
             break;
 
         case MMUEXT_NEW_BASEPTR:
-            okay = new_guest_cr3(op.mfn);
+            okay = new_guest_cr3(mfn);
             percpu_info[cpu].deferred_ops &= ~DOP_FLUSH_TLB;
             break;
         
 #ifdef __x86_64__
         case MMUEXT_NEW_USER_BASEPTR:
             okay = get_page_and_type_from_pagenr(
-                op.mfn, PGT_root_page_table, d);
+                mfn, PGT_root_page_table, d);
             if ( unlikely(!okay) )
             {
-                MEM_LOG("Error while installing new mfn %lx", op.mfn);
+                MEM_LOG("Error while installing new mfn %lx", mfn);
             }
             else
             {
                 unsigned long old_mfn =
                     pagetable_get_pfn(v->arch.guest_table_user);
-                v->arch.guest_table_user = mk_pagetable(op.mfn << PAGE_SHIFT);
+                v->arch.guest_table_user = mk_pagetable(mfn << PAGE_SHIFT);
                 if ( old_mfn != 0 )
                     put_page_and_type(&frame_table[old_mfn]);
             }
@@ -1799,8 +1800,8 @@
     
         case MMUEXT_INVLPG_LOCAL:
             if ( shadow_mode_enabled(d) )
-                shadow_invlpg(v, op.linear_addr);
-            local_flush_tlb_one(op.linear_addr);
+                shadow_invlpg(v, op.arg1.linear_addr);
+            local_flush_tlb_one(op.arg1.linear_addr);
             break;
 
         case MMUEXT_TLB_FLUSH_MULTI:
@@ -1808,7 +1809,7 @@
         {
             unsigned long vmask;
             cpumask_t     pmask;
-            if ( unlikely(get_user(vmask, (unsigned long *)op.vcpumask)) )
+            if ( unlikely(get_user(vmask, (unsigned long *)op.arg2.vcpumask)) )
             {
                 okay = 0;
                 break;
@@ -1818,7 +1819,7 @@
             if ( op.cmd == MMUEXT_TLB_FLUSH_MULTI )
                 flush_tlb_mask(pmask);
             else
-                flush_tlb_one_mask(pmask, op.linear_addr);
+                flush_tlb_one_mask(pmask, op.arg1.linear_addr);
             break;
         }
 
@@ -1827,7 +1828,7 @@
             break;
     
         case MMUEXT_INVLPG_ALL:
-            flush_tlb_one_mask(d->cpumask, op.linear_addr);
+            flush_tlb_one_mask(d->cpumask, op.arg1.linear_addr);
             break;
 
         case MMUEXT_FLUSH_CACHE:
@@ -1852,8 +1853,8 @@
                 break;
             }
 
-            unsigned long ptr  = op.linear_addr;
-            unsigned long ents = op.nr_ents;
+            unsigned long ptr  = op.arg1.linear_addr;
+            unsigned long ents = op.arg2.nr_ents;
             if ( ((ptr & (PAGE_SIZE-1)) != 0) || 
                  (ents > 8192) ||
                  !array_access_ok(ptr, ents, LDT_ENTRY_SIZE) )
@@ -1886,7 +1887,7 @@
             e = percpu_info[cpu].foreign;
             if ( unlikely(e == NULL) )
             {
-                MEM_LOG("No FOREIGNDOM to reassign mfn %lx to", op.mfn);
+                MEM_LOG("No FOREIGNDOM to reassign mfn %lx to", mfn);
                 okay = 0;
                 break;
             }
@@ -1919,7 +1920,7 @@
             {
                 MEM_LOG("Transferee has no reservation headroom (%d,%d), or "
                         "page is in Xen heap (%lx), or dom is dying (%ld).",
-                        e->tot_pages, e->max_pages, op.mfn, e->domain_flags);
+                        e->tot_pages, e->max_pages, mfn, e->domain_flags);
                 okay = 0;
                 goto reassign_fail;
             }
diff -r a152b9f27e48 -r 9af349b055e5 xen/arch/x86/vmx.c
--- a/xen/arch/x86/vmx.c        Wed Sep 14 21:33:52 2005
+++ b/xen/arch/x86/vmx.c        Wed Sep 14 21:36:10 2005
@@ -1021,7 +1021,7 @@
      * CR0: We don't want to lose PE and PG.
      */
     paging_enabled = vmx_paging_enabled(d);
-    __vmwrite(GUEST_CR0, (value | X86_CR0_PE | X86_CR0_PG));
+    __vmwrite(GUEST_CR0, value | X86_CR0_PE | X86_CR0_PG | X86_CR0_NE);
     __vmwrite(CR0_READ_SHADOW, value);
 
     VMX_DBG_LOG(DBG_LEVEL_VMMU, "Update CR0 value = %lx\n", value);
diff -r a152b9f27e48 -r 9af349b055e5 xen/arch/x86/vmx_intercept.c
--- a/xen/arch/x86/vmx_intercept.c      Wed Sep 14 21:33:52 2005
+++ b/xen/arch/x86/vmx_intercept.c      Wed Sep 14 21:36:10 2005
@@ -227,6 +227,7 @@
     u64 *intr = &(sp->sp_global.pic_intr[0]);
     struct vmx_virpit_t *vpit = &(d->domain->arch.vmx_platform.vmx_pit);
     int rw_mode, reinit = 0;
+    int oldvec = 0;
 
     /* load init count*/
     if (p->state == STATE_IORESP_HOOK) { 
@@ -235,6 +236,7 @@
             VMX_DBG_LOG(DBG_LEVEL_1, "VMX_PIT: guest reset PIT with channel 
%lx!\n", (unsigned long) ((p->u.data >> 24) & 0x3) );
             rem_ac_timer(&(vpit->pit_timer));
             reinit = 1;
+            oldvec = vpit->vector;
         }
         else
             init_ac_timer(&vpit->pit_timer, pit_timer_fn, vpit, d->processor);
@@ -250,6 +252,12 @@
             vpit->period = 1000000;
         }
         vpit->vector = ((p->u.data >> 16) & 0xFF);
+
+        if( reinit && oldvec != vpit->vector){
+            clear_bit(oldvec, intr);
+            vpit->pending_intr_nr = 0;
+        }
+
         vpit->channel = ((p->u.data >> 24) & 0x3);
         vpit->first_injected = 0;
 
diff -r a152b9f27e48 -r 9af349b055e5 xen/common/schedule.c
--- a/xen/common/schedule.c     Wed Sep 14 21:33:52 2005
+++ b/xen/common/schedule.c     Wed Sep 14 21:36:10 2005
@@ -211,11 +211,12 @@
 
     /*
      * We can be sure that the VCPU is finally descheduled after the running
-     * flag is cleared and the scheduler lock is released.
+     * flag is cleared and the scheduler lock is released. We also check that
+     * the domain continues to be unrunnable, in case someone else wakes it.
      */
-    while ( test_bit(_VCPUF_running, &v->vcpu_flags)
-            && !domain_runnable(v)
-            && spin_is_locked(&schedule_data[v->processor].schedule_lock) )
+    while ( !domain_runnable(v) &&
+            (test_bit(_VCPUF_running, &v->vcpu_flags) ||
+             spin_is_locked(&schedule_data[v->processor].schedule_lock)) )
         cpu_relax();
 
     sync_vcpu_execstate(v);
diff -r a152b9f27e48 -r 9af349b055e5 xen/include/public/arch-x86_64.h
--- a/xen/include/public/arch-x86_64.h  Wed Sep 14 21:33:52 2005
+++ b/xen/include/public/arch-x86_64.h  Wed Sep 14 21:36:10 2005
@@ -124,36 +124,46 @@
     unsigned long address; /* code offset                                   */
 } trap_info_t;
 
+#ifdef __GNUC__
+/* Anonymous union includes both 32- and 64-bit names (e.g., eax/rax). */
+#define __DECL_REG(name) union { u64 r ## name, e ## name; }
+#else
+/* Non-gcc sources must always use the proper 64-bit name (e.g., rax). */
+#define __DECL_REG(name) u64 r ## name
+#endif
+
 typedef struct cpu_user_regs {
     u64 r15;
     u64 r14;
     u64 r13;
     u64 r12;
-    union { u64 rbp, ebp; };
-    union { u64 rbx, ebx; };
+    __DECL_REG(bp);
+    __DECL_REG(bx);
     u64 r11;
     u64 r10;
     u64 r9;
     u64 r8;
-    union { u64 rax, eax; };
-    union { u64 rcx, ecx; };
-    union { u64 rdx, edx; };
-    union { u64 rsi, esi; };
-    union { u64 rdi, edi; };
+    __DECL_REG(ax);
+    __DECL_REG(cx);
+    __DECL_REG(dx);
+    __DECL_REG(si);
+    __DECL_REG(di);
     u32 error_code;    /* private */
     u32 entry_vector;  /* private */
-    union { u64 rip, eip; };
+    __DECL_REG(ip);
     u16 cs, _pad0[1];
     u8  saved_upcall_mask;
     u8  _pad1[3];
-    union { u64 rflags, eflags; };
-    union { u64 rsp, esp; };
+    __DECL_REG(flags);
+    __DECL_REG(sp);
     u16 ss, _pad2[3];
     u16 es, _pad3[3];
     u16 ds, _pad4[3];
     u16 fs, _pad5[3]; /* Non-zero => takes precedence over fs_base.      */
     u16 gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_user. */
 } cpu_user_regs_t;
+
+#undef __DECL_REG
 
 typedef u64 tsc_timestamp_t; /* RDTSC timestamp */
 
diff -r a152b9f27e48 -r 9af349b055e5 xen/include/public/io/ring.h
--- a/xen/include/public/io/ring.h      Wed Sep 14 21:33:52 2005
+++ b/xen/include/public/io/ring.h      Wed Sep 14 21:36:10 2005
@@ -87,7 +87,7 @@
 /* Syntactic sugar */                                                   \
 typedef struct __name##_sring __name##_sring_t;                         \
 typedef struct __name##_front_ring __name##_front_ring_t;               \
-typedef struct __name##_back_ring __name##_back_ring_t;
+typedef struct __name##_back_ring __name##_back_ring_t
 
 /*
  *   Macros for manipulating rings.  
diff -r a152b9f27e48 -r 9af349b055e5 xen/include/public/xen.h
--- a/xen/include/public/xen.h  Wed Sep 14 21:33:52 2005
+++ b/xen/include/public/xen.h  Wed Sep 14 21:36:10 2005
@@ -174,13 +174,13 @@
         unsigned long mfn;
         /* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */
         unsigned long linear_addr;
-    };
+    } arg1;
     union {
         /* SET_LDT */
         unsigned int nr_ents;
         /* TLB_FLUSH_MULTI, INVLPG_MULTI */
         void *vcpumask;
-    };
+    } arg2;
 };
 #endif
 
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/arch/xen/i386/pci/i386.c
--- /dev/null   Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/pci/i386.c     Wed Sep 14 21:36:10 2005
@@ -0,0 +1,304 @@
+/*
+ *     Low-Level PCI Access for i386 machines
+ *
+ * Copyright 1993, 1994 Drew Eckhardt
+ *      Visionary Computing
+ *      (Unix and Linux consulting and custom programming)
+ *      Drew@xxxxxxxxxxxx
+ *      +1 (303) 786-7975
+ *
+ * Drew's work was sponsored by:
+ *     iX Multiuser Multitasking Magazine
+ *     Hannover, Germany
+ *     hm@xxxxx
+ *
+ * Copyright 1997--2000 Martin Mares <mj@xxxxxx>
+ *
+ * For more information, please consult the following manuals (look at
+ * http://www.pcisig.com/ for how to get them):
+ *
+ * PCI BIOS Specification
+ * PCI Local Bus Specification
+ * PCI to PCI Bridge Specification
+ * PCI System Design Guide
+ *
+ */
+
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/ioport.h>
+#include <linux/errno.h>
+
+#include "pci.h"
+
+/*
+ * We need to avoid collisions with `mirrored' VGA ports
+ * and other strange ISA hardware, so we always want the
+ * addresses to be allocated in the 0x000-0x0ff region
+ * modulo 0x400.
+ *
+ * Why? Because some silly external IO cards only decode
+ * the low 10 bits of the IO address. The 0x00-0xff region
+ * is reserved for motherboard devices that decode all 16
+ * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
+ * but we want to try to avoid allocating at 0x2900-0x2bff
+ * which might have be mirrored at 0x0100-0x03ff..
+ */
+void
+pcibios_align_resource(void *data, struct resource *res,
+                      unsigned long size, unsigned long align)
+{
+       if (res->flags & IORESOURCE_IO) {
+               unsigned long start = res->start;
+
+               if (start & 0x300) {
+                       start = (start + 0x3ff) & ~0x3ff;
+                       res->start = start;
+               }
+       }
+}
+
+
+/*
+ *  Handle resources of PCI devices.  If the world were perfect, we could
+ *  just allocate all the resource regions and do nothing more.  It isn't.
+ *  On the other hand, we cannot just re-allocate all devices, as it would
+ *  require us to know lots of host bridge internals.  So we attempt to
+ *  keep as much of the original configuration as possible, but tweak it
+ *  when it's found to be wrong.
+ *
+ *  Known BIOS problems we have to work around:
+ *     - I/O or memory regions not configured
+ *     - regions configured, but not enabled in the command register
+ *     - bogus I/O addresses above 64K used
+ *     - expansion ROMs left enabled (this may sound harmless, but given
+ *       the fact the PCI specs explicitly allow address decoders to be
+ *       shared between expansion ROMs and other resource regions, it's
+ *       at least dangerous)
+ *
+ *  Our solution:
+ *     (1) Allocate resources for all buses behind PCI-to-PCI bridges.
+ *         This gives us fixed barriers on where we can allocate.
+ *     (2) Allocate resources for all enabled devices.  If there is
+ *         a collision, just mark the resource as unallocated. Also
+ *         disable expansion ROMs during this step.
+ *     (3) Try to allocate resources for disabled devices.  If the
+ *         resources were assigned correctly, everything goes well,
+ *         if they weren't, they won't disturb allocation of other
+ *         resources.
+ *     (4) Assign new addresses to resources which were either
+ *         not configured at all or misconfigured.  If explicitly
+ *         requested by the user, configure expansion ROM address
+ *         as well.
+ */
+
+static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
+{
+       struct pci_bus *bus;
+       struct pci_dev *dev;
+       int idx;
+       struct resource *r, *pr;
+
+       /* Depth-First Search on bus tree */
+       list_for_each_entry(bus, bus_list, node) {
+               if ((dev = bus->self)) {
+                       for (idx = PCI_BRIDGE_RESOURCES; idx < 
PCI_NUM_RESOURCES; idx++) {
+                               r = &dev->resource[idx];
+                               if (!r->start)
+                                       continue;
+                               pr = pci_find_parent_resource(dev, r);
+                               if (!pr || request_resource(pr, r) < 0)
+                                       printk(KERN_ERR "PCI: Cannot allocate 
resource region %d of bridge %s\n", idx, pci_name(dev));
+                       }
+               }
+               pcibios_allocate_bus_resources(&bus->children);
+       }
+}
+
+static void __init pcibios_allocate_resources(int pass)
+{
+       struct pci_dev *dev = NULL;
+       int idx, disabled;
+       u16 command;
+       struct resource *r, *pr;
+
+       for_each_pci_dev(dev) {
+               pci_read_config_word(dev, PCI_COMMAND, &command);
+               for(idx = 0; idx < 6; idx++) {
+                       r = &dev->resource[idx];
+                       if (r->parent)          /* Already allocated */
+                               continue;
+                       if (!r->start)          /* Address not assigned at all 
*/
+                               continue;
+                       if (r->flags & IORESOURCE_IO)
+                               disabled = !(command & PCI_COMMAND_IO);
+                       else
+                               disabled = !(command & PCI_COMMAND_MEMORY);
+                       if (pass == disabled) {
+                               DBG("PCI: Resource %08lx-%08lx (f=%lx, d=%d, 
p=%d)\n",
+                                   r->start, r->end, r->flags, disabled, pass);
+                               pr = pci_find_parent_resource(dev, r);
+                               if (!pr || request_resource(pr, r) < 0) {
+                                       printk(KERN_ERR "PCI: Cannot allocate 
resource region %d of device %s\n", idx, pci_name(dev));
+                                       /* We'll assign a new address later */
+                                       r->end -= r->start;
+                                       r->start = 0;
+                               }
+                       }
+               }
+               if (!pass) {
+                       r = &dev->resource[PCI_ROM_RESOURCE];
+                       if (r->flags & IORESOURCE_ROM_ENABLE) {
+                               /* Turn the ROM off, leave the resource region, 
but keep it unregistered. */
+                               u32 reg;
+                               DBG("PCI: Switching off ROM of %s\n", 
pci_name(dev));
+                               r->flags &= ~IORESOURCE_ROM_ENABLE;
+                               pci_read_config_dword(dev, dev->rom_base_reg, 
&reg);
+                               pci_write_config_dword(dev, dev->rom_base_reg, 
reg & ~PCI_ROM_ADDRESS_ENABLE);
+                       }
+               }
+       }
+}
+
+static int __init pcibios_assign_resources(void)
+{
+       struct pci_dev *dev = NULL;
+       int idx;
+       struct resource *r;
+
+       for_each_pci_dev(dev) {
+               int class = dev->class >> 8;
+
+               /* Don't touch classless devices and host bridges */
+               if (!class || class == PCI_CLASS_BRIDGE_HOST)
+                       continue;
+
+               for(idx=0; idx<6; idx++) {
+                       r = &dev->resource[idx];
+
+                       /*
+                        *  Don't touch IDE controllers and I/O ports of video 
cards!
+                        */
+                       if ((class == PCI_CLASS_STORAGE_IDE && idx < 4) ||
+                           (class == PCI_CLASS_DISPLAY_VGA && (r->flags & 
IORESOURCE_IO)))
+                               continue;
+
+                       /*
+                        *  We shall assign a new address to this resource, 
either because
+                        *  the BIOS forgot to do so or because we have decided 
the old
+                        *  address was unusable for some reason.
+                        */
+                       if (!r->start && r->end)
+                               pci_assign_resource(dev, idx);
+               }
+
+               if (pci_probe & PCI_ASSIGN_ROMS) {
+                       r = &dev->resource[PCI_ROM_RESOURCE];
+                       r->end -= r->start;
+                       r->start = 0;
+                       if (r->end)
+                               pci_assign_resource(dev, PCI_ROM_RESOURCE);
+               }
+       }
+       return 0;
+}
+
+void __init pcibios_resource_survey(void)
+{
+       DBG("PCI: Allocating resources\n");
+       pcibios_allocate_bus_resources(&pci_root_buses);
+       pcibios_allocate_resources(0);
+       pcibios_allocate_resources(1);
+}
+
+/**
+ * called in fs_initcall (one below subsys_initcall),
+ * give a chance for motherboard reserve resources
+ */
+fs_initcall(pcibios_assign_resources);
+
+int pcibios_enable_resources(struct pci_dev *dev, int mask)
+{
+       u16 cmd, old_cmd;
+       int idx;
+       struct resource *r;
+
+       pci_read_config_word(dev, PCI_COMMAND, &cmd);
+       old_cmd = cmd;
+       for(idx=0; idx<6; idx++) {
+               /* Only set up the requested stuff */
+               if (!(mask & (1<<idx)))
+                       continue;
+
+               r = &dev->resource[idx];
+               if (!r->start && r->end) {
+                       printk(KERN_ERR "PCI: Device %s not available because 
of resource collisions\n", pci_name(dev));
+                       return -EINVAL;
+               }
+               if (r->flags & IORESOURCE_IO)
+                       cmd |= PCI_COMMAND_IO;
+               if (r->flags & IORESOURCE_MEM)
+                       cmd |= PCI_COMMAND_MEMORY;
+       }
+       if (dev->resource[PCI_ROM_RESOURCE].start)
+               cmd |= PCI_COMMAND_MEMORY;
+       if (cmd != old_cmd) {
+               printk("PCI: Enabling device %s (%04x -> %04x)\n", 
pci_name(dev), old_cmd, cmd);
+               pci_write_config_word(dev, PCI_COMMAND, cmd);
+       }
+       return 0;
+}
+
+/*
+ *  If we set up a device for bus mastering, we need to check the latency
+ *  timer as certain crappy BIOSes forget to set it properly.
+ */
+unsigned int pcibios_max_latency = 255;
+
+void pcibios_set_master(struct pci_dev *dev)
+{
+       u8 lat;
+       pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
+       if (lat < 16)
+               lat = (64 <= pcibios_max_latency) ? 64 : pcibios_max_latency;
+       else if (lat > pcibios_max_latency)
+               lat = pcibios_max_latency;
+       else
+               return;
+       printk(KERN_DEBUG "PCI: Setting latency timer of device %s to %d\n", 
pci_name(dev), lat);
+       pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);
+}
+
+int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
+                       enum pci_mmap_state mmap_state, int write_combine)
+{
+       unsigned long prot;
+
+       /* I/O space cannot be accessed via normal processor loads and
+        * stores on this platform.
+        */
+       if (mmap_state == pci_mmap_io)
+               return -EINVAL;
+
+       /* Leave vm_pgoff as-is, the PCI space address is the physical
+        * address on this platform.
+        */
+       vma->vm_flags |= (VM_SHM | VM_LOCKED | VM_IO);
+
+       prot = pgprot_val(vma->vm_page_prot);
+       if (boot_cpu_data.x86 > 3)
+               prot |= _PAGE_PCD | _PAGE_PWT;
+       vma->vm_page_prot = __pgprot(prot);
+
+       /* Write-combine setting is ignored, it is changed via the mtrr
+        * interfaces on this platform.
+        */
+       if (direct_remap_pfn_range(vma->vm_mm, vma->vm_start, vma->vm_pgoff,
+                                  vma->vm_end - vma->vm_start,
+                                  vma->vm_page_prot, DOMID_IO))
+               return -EAGAIN;
+
+       return 0;
+}
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/include/asm-xen/asm-i386/hypervisor.h
--- /dev/null   Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/hypervisor.h        Wed Sep 
14 21:36:10 2005
@@ -0,0 +1,188 @@
+/******************************************************************************
+ * hypervisor.h
+ * 
+ * Linux-specific hypervisor handling.
+ * 
+ * Copyright (c) 2002-2004, K A Fraser
+ * 
+ * This file may be distributed separately from the Linux kernel, or
+ * incorporated into other software packages, subject to the following license:
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this source file (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy, modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#ifndef __HYPERVISOR_H__
+#define __HYPERVISOR_H__
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/version.h>
+#include <asm-xen/xen-public/xen.h>
+#include <asm-xen/xen-public/dom0_ops.h>
+#include <asm/ptrace.h>
+#include <asm/page.h>
+#if defined(__i386__)
+# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#  ifdef CONFIG_X86_PAE
+#   include <asm-generic/pgtable-nopud.h>
+#  else
+#   include <asm-generic/pgtable-nopmd.h>
+#  endif
+# else
+#  define pud_t pgd_t
+# endif
+#endif
+
+/* arch/xen/i386/kernel/setup.c */
+extern start_info_t *xen_start_info;
+
+/* arch/xen/kernel/evtchn.c */
+/* Force a proper event-channel callback from Xen. */
+void force_evtchn_callback(void);
+
+/* arch/xen/kernel/process.c */
+void xen_cpu_idle (void);
+
+/* arch/xen/i386/kernel/hypervisor.c */
+void do_hypervisor_callback(struct pt_regs *regs);
+
+/* arch/xen/i386/kernel/head.S */
+void lgdt_finish(void);
+
+/* arch/xen/i386/mm/hypervisor.c */
+/*
+ * NB. ptr values should be PHYSICAL, not MACHINE. 'vals' should be already
+ * be MACHINE addresses.
+ */
+
+void xen_pt_switch(unsigned long ptr);
+void xen_new_user_pt(unsigned long ptr); /* x86_64 only */
+void xen_load_gs(unsigned int selector); /* x86_64 only */
+void xen_tlb_flush(void);
+void xen_invlpg(unsigned long ptr);
+
+#ifndef CONFIG_XEN_SHADOW_MODE
+void xen_l1_entry_update(pte_t *ptr, pte_t val);
+void xen_l2_entry_update(pmd_t *ptr, pmd_t val);
+void xen_l3_entry_update(pud_t *ptr, pud_t val); /* x86_64/PAE */
+void xen_l4_entry_update(pgd_t *ptr, pgd_t val); /* x86_64 only */
+void xen_pgd_pin(unsigned long ptr);
+void xen_pgd_unpin(unsigned long ptr);
+void xen_pud_pin(unsigned long ptr); /* x86_64 only */
+void xen_pud_unpin(unsigned long ptr); /* x86_64 only */
+void xen_pmd_pin(unsigned long ptr); /* x86_64 only */
+void xen_pmd_unpin(unsigned long ptr); /* x86_64 only */
+void xen_pte_pin(unsigned long ptr);
+void xen_pte_unpin(unsigned long ptr);
+#else
+#define xen_l1_entry_update(_p, _v) set_pte((_p), (_v))
+#define xen_l2_entry_update(_p, _v) set_pgd((_p), (_v))
+#define xen_pgd_pin(_p)   ((void)0)
+#define xen_pgd_unpin(_p) ((void)0)
+#define xen_pte_pin(_p)   ((void)0)
+#define xen_pte_unpin(_p) ((void)0)
+#endif
+
+void xen_set_ldt(unsigned long ptr, unsigned long bytes);
+void xen_machphys_update(unsigned long mfn, unsigned long pfn);
+
+#ifdef CONFIG_SMP
+#include <linux/cpumask.h>
+void xen_tlb_flush_all(void);
+void xen_invlpg_all(unsigned long ptr);
+void xen_tlb_flush_mask(cpumask_t *mask);
+void xen_invlpg_mask(cpumask_t *mask, unsigned long ptr);
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+/* 
+** XXX SMH: 2.4 doesn't have percpu.h (or support SMP guests) so just 
+** include sufficient #defines to allow the below to build. 
+*/
+#define DEFINE_PER_CPU(type, name) \
+    __typeof__(type) per_cpu__##name
+
+#define per_cpu(var, cpu)           (*((void)cpu, &per_cpu__##var))
+#define __get_cpu_var(var)          per_cpu__##var
+#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
+
+#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
+#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
+#endif /* linux < 2.6.0 */
+
+void xen_create_contiguous_region(unsigned long vstart, unsigned int order);
+void xen_destroy_contiguous_region(unsigned long vstart, unsigned int order);
+
+#include <asm/hypercall.h>
+
+#if defined(CONFIG_X86_64)
+#define MULTI_UVMFLAGS_INDEX 2
+#define MULTI_UVMDOMID_INDEX 3
+#else
+#define MULTI_UVMFLAGS_INDEX 3
+#define MULTI_UVMDOMID_INDEX 4
+#endif
+
+static inline void
+MULTI_update_va_mapping(
+    multicall_entry_t *mcl, unsigned long va,
+    pte_t new_val, unsigned long flags)
+{
+    mcl->op = __HYPERVISOR_update_va_mapping;
+    mcl->args[0] = va;
+#if defined(CONFIG_X86_64)
+    mcl->args[1] = new_val.pte;
+    mcl->args[2] = flags;
+#elif defined(CONFIG_X86_PAE)
+    mcl->args[1] = new_val.pte_low;
+    mcl->args[2] = new_val.pte_high;
+    mcl->args[3] = flags;
+#else
+    mcl->args[1] = new_val.pte_low;
+    mcl->args[2] = 0;
+    mcl->args[3] = flags;
+#endif
+}
+
+static inline void
+MULTI_update_va_mapping_otherdomain(
+    multicall_entry_t *mcl, unsigned long va,
+    pte_t new_val, unsigned long flags, domid_t domid)
+{
+    mcl->op = __HYPERVISOR_update_va_mapping_otherdomain;
+    mcl->args[0] = va;
+#if defined(CONFIG_X86_64)
+    mcl->args[1] = new_val.pte;
+    mcl->args[2] = flags;
+    mcl->args[3] = domid;
+#elif defined(CONFIG_X86_PAE)
+    mcl->args[1] = new_val.pte_low;
+    mcl->args[2] = new_val.pte_high;
+    mcl->args[3] = flags;
+    mcl->args[4] = domid;
+#else
+    mcl->args[1] = new_val.pte_low;
+    mcl->args[2] = 0;
+    mcl->args[3] = flags;
+    mcl->args[4] = domid;
+#endif
+}
+
+#endif /* __HYPERVISOR_H__ */
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/hypervisor.h
--- /dev/null   Wed Sep 14 21:33:52 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/hypervisor.h      Wed Sep 
14 21:36:10 2005
@@ -0,0 +1,2 @@
+
+#include <asm-i386/hypervisor.h>
diff -r a152b9f27e48 -r 9af349b055e5 tools/examples/xmexample.vmx
--- /dev/null   Wed Sep 14 21:33:52 2005
+++ b/tools/examples/xmexample.vmx      Wed Sep 14 21:36:10 2005
@@ -0,0 +1,102 @@
+#  -*- mode: python; -*-
+#============================================================================
+# Python configuration setup for 'xm create'.
+# This script sets the parameters used when a domain is created using 'xm 
create'.
+# You use a separate script for each domain you want to create, or 
+# you can set the parameters for the domain on the xm command line.
+#============================================================================
+
+import os, re
+arch = os.uname()[4]
+if re.search('64', arch):
+    arch_libdir = 'lib64'
+else:
+    arch_libdir = 'lib'
+
+#----------------------------------------------------------------------------
+# Kernel image file.
+kernel = "/usr/lib/xen/boot/vmxloader"
+
+# The domain build function. VMX domain uses 'vmx'.
+builder='vmx'
+
+# Initial memory allocation (in megabytes) for the new domain.
+memory = 128
+
+# A name for your domain. All domains must have different names.
+name = "ExampleVMXDomain"
+
+# Which CPU to start domain on? 
+#cpu = -1   # leave to Xen to pick
+
+# Optionally define mac and/or bridge for the network interfaces.
+# Random MACs are assigned if not given.
+#vif = [ 'mac=aa:00:00:00:00:11, bridge=xen-br0' ]
+
+#----------------------------------------------------------------------------
+# Define the disk devices you want the domain to have access to, and
+# what you want them accessible as.
+# Each disk entry is of the form phy:UNAME,DEV,MODE
+# where UNAME is the device, DEV is the device name the domain will see,
+# and MODE is r for read-only, w for read-write.
+
+#disk = [ 'phy:hda1,hda1,r' ]
+disk = [ 'file:/var/images/min-el3-i386.img,ioemu:hda,w' ]
+
+#----------------------------------------------------------------------------
+# Set according to whether you want the domain restarted when it exits.
+# The default is 'onreboot', which restarts the domain when it shuts down
+# with exit code reboot.
+# Other values are 'always', and 'never'.
+
+#restart = 'onreboot'
+
+#============================================================================
+
+# New stuff
+device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'
+
+# Advanced users only. Don't touch if you don't know what you're doing
+memmap = '/usr/lib/xen/boot/mem-map.sxp'
+
+#-----------------------------------------------------------------------------
+# Disk image for 
+#cdrom=
+
+#-----------------------------------------------------------------------------
+# boot on floppy (a), hard disk (c) or CD-ROM (d) 
+#boot=[a|c|d]
+#-----------------------------------------------------------------------------
+#  write to temporary files instead of disk image files
+#snapshot=1
+
+#----------------------------------------------------------------------------
+# enable SDL library for graphics, default = 0
+sdl=0
+
+#----------------------------------------------------------------------------
+# enable VNC library for graphics, default = 1
+vnc=1
+
+#----------------------------------------------------------------------------
+# enable spawning vncviewer(only valid when vnc=1), default = 1
+vncviewer=1
+
+#----------------------------------------------------------------------------
+# no graphics, use serial port
+#nographic=0
+
+
+#-----------------------------------------------------------------------------
+#   enable audio support
+#enable-audio=1
+
+
+#-----------------------------------------------------------------------------
+#    set the real time clock to local time [default=0 i.e. set to utc]
+#localtime=1
+
+
+#-----------------------------------------------------------------------------
+#    start in full screen
+#full-screen=1   
diff -r a152b9f27e48 -r 9af349b055e5 tools/python/xen/xend/xenstore/xsutil.py
--- /dev/null   Wed Sep 14 21:33:52 2005
+++ b/tools/python/xen/xend/xenstore/xsutil.py  Wed Sep 14 21:36:10 2005
@@ -0,0 +1,20 @@
+# Copyright (C) 2005 Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>
+
+# This file is subject to the terms and conditions of the GNU General
+# Public License.  See the file "COPYING" in the main directory of
+# this archive for more details.
+
+import threading
+from xen.lowlevel import xs
+
+handles = {}
+
+# XXX need to g/c handles from dead threads
+def xshandle():
+    if not handles.has_key(threading.currentThread()):
+        handles[threading.currentThread()] = xs.open()
+    return handles[threading.currentThread()]
+
+
+def IntroduceDomain(domid, page, port, path):
+    return xshandle().introduce_domain(domid, page, port, path)
diff -r a152b9f27e48 -r 9af349b055e5 
tools/xenstore/testsuite/16block-watch-crash.test
--- /dev/null   Wed Sep 14 21:33:52 2005
+++ b/tools/xenstore/testsuite/16block-watch-crash.test Wed Sep 14 21:36:10 2005
@@ -0,0 +1,13 @@
+# Test case where blocked connection gets sent watch.
+
+mkdir /test
+watch /test token
+1 start /test
+# This will block on above
+noackwrite /test/entry create contents
+1 write /test/entry2 create contents
+1 commit
+readack
+expect /test/entry2:token
+waitwatch
+ackwatch token
diff -r a152b9f27e48 -r 9af349b055e5 
linux-2.6-xen-sparse/include/asm-xen/hypervisor.h
--- a/linux-2.6-xen-sparse/include/asm-xen/hypervisor.h Wed Sep 14 21:33:52 2005
+++ /dev/null   Wed Sep 14 21:36:10 2005
@@ -1,189 +0,0 @@
-/******************************************************************************
- * hypervisor.h
- * 
- * Linux-specific hypervisor handling.
- * 
- * Copyright (c) 2002-2004, K A Fraser
- * 
- * This file may be distributed separately from the Linux kernel, or
- * incorporated into other software packages, subject to the following license:
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef __HYPERVISOR_H__
-#define __HYPERVISOR_H__
-
-#include <linux/config.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/version.h>
-#include <asm-xen/xen-public/xen.h>
-#include <asm-xen/xen-public/dom0_ops.h>
-#include <asm-xen/xen-public/io/domain_controller.h>
-#include <asm/ptrace.h>
-#include <asm/page.h>
-#if defined(__i386__)
-# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-#  ifdef CONFIG_X86_PAE
-#   include <asm-generic/pgtable-nopud.h>
-#  else
-#   include <asm-generic/pgtable-nopmd.h>
-#  endif
-# else
-#  define pud_t pgd_t
-# endif
-#endif
-
-/* arch/xen/i386/kernel/setup.c */
-extern start_info_t *xen_start_info;
-
-/* arch/xen/kernel/evtchn.c */
-/* Force a proper event-channel callback from Xen. */
-void force_evtchn_callback(void);
-
-/* arch/xen/kernel/process.c */
-void xen_cpu_idle (void);
-
-/* arch/xen/i386/kernel/hypervisor.c */
-void do_hypervisor_callback(struct pt_regs *regs);
-
-/* arch/xen/i386/kernel/head.S */
-void lgdt_finish(void);
-
-/* arch/xen/i386/mm/hypervisor.c */
-/*
- * NB. ptr values should be PHYSICAL, not MACHINE. 'vals' should be already
- * be MACHINE addresses.
- */
-
-void xen_pt_switch(unsigned long ptr);
-void xen_new_user_pt(unsigned long ptr); /* x86_64 only */
-void xen_load_gs(unsigned int selector); /* x86_64 only */
-void xen_tlb_flush(void);
-void xen_invlpg(unsigned long ptr);
-
-#ifndef CONFIG_XEN_SHADOW_MODE
-void xen_l1_entry_update(pte_t *ptr, pte_t val);
-void xen_l2_entry_update(pmd_t *ptr, pmd_t val);
-void xen_l3_entry_update(pud_t *ptr, pud_t val); /* x86_64/PAE */
-void xen_l4_entry_update(pgd_t *ptr, pgd_t val); /* x86_64 only */
-void xen_pgd_pin(unsigned long ptr);
-void xen_pgd_unpin(unsigned long ptr);
-void xen_pud_pin(unsigned long ptr); /* x86_64 only */
-void xen_pud_unpin(unsigned long ptr); /* x86_64 only */
-void xen_pmd_pin(unsigned long ptr); /* x86_64 only */
-void xen_pmd_unpin(unsigned long ptr); /* x86_64 only */
-void xen_pte_pin(unsigned long ptr);
-void xen_pte_unpin(unsigned long ptr);
-#else
-#define xen_l1_entry_update(_p, _v) set_pte((_p), (_v))
-#define xen_l2_entry_update(_p, _v) set_pgd((_p), (_v))
-#define xen_pgd_pin(_p)   ((void)0)
-#define xen_pgd_unpin(_p) ((void)0)
-#define xen_pte_pin(_p)   ((void)0)
-#define xen_pte_unpin(_p) ((void)0)
-#endif
-
-void xen_set_ldt(unsigned long ptr, unsigned long bytes);
-void xen_machphys_update(unsigned long mfn, unsigned long pfn);
-
-#ifdef CONFIG_SMP
-#include <linux/cpumask.h>
-void xen_tlb_flush_all(void);
-void xen_invlpg_all(unsigned long ptr);
-void xen_tlb_flush_mask(cpumask_t *mask);
-void xen_invlpg_mask(cpumask_t *mask, unsigned long ptr);
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-/* 
-** XXX SMH: 2.4 doesn't have percpu.h (or support SMP guests) so just 
-** include sufficient #defines to allow the below to build. 
-*/
-#define DEFINE_PER_CPU(type, name) \
-    __typeof__(type) per_cpu__##name
-
-#define per_cpu(var, cpu)           (*((void)cpu, &per_cpu__##var))
-#define __get_cpu_var(var)          per_cpu__##var
-#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
-
-#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
-#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
-#endif /* linux < 2.6.0 */
-
-void xen_create_contiguous_region(unsigned long vstart, unsigned int order);
-void xen_destroy_contiguous_region(unsigned long vstart, unsigned int order);
-
-#include <asm/hypercall.h>
-
-#if defined(CONFIG_X86_64)
-#define MULTI_UVMFLAGS_INDEX 2
-#define MULTI_UVMDOMID_INDEX 3
-#else
-#define MULTI_UVMFLAGS_INDEX 3
-#define MULTI_UVMDOMID_INDEX 4
-#endif
-
-static inline void
-MULTI_update_va_mapping(
-    multicall_entry_t *mcl, unsigned long va,
-    pte_t new_val, unsigned long flags)
-{
-    mcl->op = __HYPERVISOR_update_va_mapping;
-    mcl->args[0] = va;
-#if defined(CONFIG_X86_64)
-    mcl->args[1] = new_val.pte;
-    mcl->args[2] = flags;
-#elif defined(CONFIG_X86_PAE)
-    mcl->args[1] = new_val.pte_low;
-    mcl->args[2] = new_val.pte_high;
-    mcl->args[3] = flags;
-#else
-    mcl->args[1] = new_val.pte_low;
-    mcl->args[2] = 0;
-    mcl->args[3] = flags;
-#endif
-}
-
-static inline void
-MULTI_update_va_mapping_otherdomain(
-    multicall_entry_t *mcl, unsigned long va,
-    pte_t new_val, unsigned long flags, domid_t domid)
-{
-    mcl->op = __HYPERVISOR_update_va_mapping_otherdomain;
-    mcl->args[0] = va;
-#if defined(CONFIG_X86_64)
-    mcl->args[1] = new_val.pte;
-    mcl->args[2] = flags;
-    mcl->args[3] = domid;
-#elif defined(CONFIG_X86_PAE)
-    mcl->args[1] = new_val.pte_low;
-    mcl->args[2] = new_val.pte_high;
-    mcl->args[3] = flags;
-    mcl->args[4] = domid;
-#else
-    mcl->args[1] = new_val.pte_low;
-    mcl->args[2] = 0;
-    mcl->args[3] = flags;
-    mcl->args[4] = domid;
-#endif
-}
-
-#endif /* __HYPERVISOR_H__ */
diff -r a152b9f27e48 -r 9af349b055e5 tools/examples/xmexample.vmx.in
--- a/tools/examples/xmexample.vmx.in   Wed Sep 14 21:33:52 2005
+++ /dev/null   Wed Sep 14 21:36:10 2005
@@ -1,96 +0,0 @@
-#  -*- mode: python; -*-
-#============================================================================
-# Python configuration setup for 'xm create'.
-# This script sets the parameters used when a domain is created using 'xm 
create'.
-# You use a separate script for each domain you want to create, or 
-# you can set the parameters for the domain on the xm command line.
-#============================================================================
-
-#----------------------------------------------------------------------------
-# Kernel image file.
-kernel = "/usr/@@LIBDIR@@/xen/boot/vmxloader"
-
-# The domain build function. VMX domain uses 'vmx'.
-builder='vmx'
-
-# Initial memory allocation (in megabytes) for the new domain.
-memory = 128
-
-# A name for your domain. All domains must have different names.
-name = "ExampleVMXDomain"
-
-# Which CPU to start domain on? 
-#cpu = -1   # leave to Xen to pick
-
-# Optionally define mac and/or bridge for the network interfaces.
-# Random MACs are assigned if not given.
-#vif = [ 'mac=aa:00:00:00:00:11, bridge=xen-br0' ]
-
-#----------------------------------------------------------------------------
-# Define the disk devices you want the domain to have access to, and
-# what you want them accessible as.
-# Each disk entry is of the form phy:UNAME,DEV,MODE
-# where UNAME is the device, DEV is the device name the domain will see,
-# and MODE is r for read-only, w for read-write.
-
-#disk = [ 'phy:hda1,hda1,r' ]
-disk = [ 'file:/var/images/min-el3-i386.img,ioemu:hda,w' ]
-
-#----------------------------------------------------------------------------
-# Set according to whether you want the domain restarted when it exits.
-# The default is 'onreboot', which restarts the domain when it shuts down
-# with exit code reboot.
-# Other values are 'always', and 'never'.
-
-#restart = 'onreboot'
-
-#============================================================================
-
-
-# New stuff
-device_model = '/usr/@@LIBDIR@@/xen/bin/qemu-dm'
-
-# Advanced users only. Don't touch if you don't know what you're doing
-memmap = '/usr/@@LIBDIR@@/xen/boot/mem-map.sxp'
-
-#-----------------------------------------------------------------------------
-# Disk image for 
-#cdrom=
-
-#-----------------------------------------------------------------------------
-# boot on floppy (a), hard disk (c) or CD-ROM (d) 
-#boot=[a|c|d]
-#-----------------------------------------------------------------------------
-#  write to temporary files instead of disk image files
-#snapshot=1
-
-#----------------------------------------------------------------------------
-# enable SDL library for graphics, default = 0
-sdl=0
-
-#----------------------------------------------------------------------------
-# enable VNC library for graphics, default = 1
-vnc=1
-
-#----------------------------------------------------------------------------
-# enable spawning vncviewer(only valid when vnc=1), default = 1
-vncviewer=1
-
-#----------------------------------------------------------------------------
-# no graphics, use serial port
-#nographic=0
-
-
-#-----------------------------------------------------------------------------
-#   enable audio support
-#enable-audio=1
-
-
-#-----------------------------------------------------------------------------
-#    set the real time clock to local time [default=0 i.e. set to utc]
-#localtime=1
-
-
-#-----------------------------------------------------------------------------
-#    start in full screen
-#full-screen=1   
diff -r a152b9f27e48 -r 9af349b055e5 xen/include/public/io/domain_controller.h
--- a/xen/include/public/io/domain_controller.h Wed Sep 14 21:33:52 2005
+++ /dev/null   Wed Sep 14 21:36:10 2005
@@ -1,787 +0,0 @@
-/******************************************************************************
- * domain_controller.h
- * 
- * Interface to server controller (e.g., 'xend'). This header file defines the 
- * interface that is shared with guest OSes.
- * 
- * Copyright (c) 2004, K A Fraser
- */
-
-#ifndef __XEN_PUBLIC_IO_DOMAIN_CONTROLLER_H__
-#define __XEN_PUBLIC_IO_DOMAIN_CONTROLLER_H__
-
-#include "ring.h"
-
-/*
- * CONTROLLER MESSAGING INTERFACE.
- */
-
-typedef struct control_msg {
-    u8 type;     /*  0: echoed in response */
-    u8 subtype;  /*  1: echoed in response */
-    u8 id;       /*  2: echoed in response */
-    u8 length;   /*  3: number of bytes in 'msg' */
-    u8 msg[60];  /*  4: type-specific message data */
-} control_msg_t; /* 64 bytes */
-
-/* These are used by the control message deferred ring. */
-#define CONTROL_RING_SIZE 8
-typedef u32 CONTROL_RING_IDX;
-#define MASK_CONTROL_IDX(_i) ((_i)&(CONTROL_RING_SIZE-1))
-
-/*
- * Generate control ring structures and types.
- *
- * CONTROL_RING_MEM is currently an 8-slot ring of ctrl_msg_t structs and
- * two 32-bit counters:  (64 * 8) + (2 * 4) = 520
- */
-#define CONTROL_RING_MEM 520
-DEFINE_RING_TYPES(ctrl, control_msg_t, control_msg_t);
-
-typedef struct control_if {
-    union {
-        ctrl_sring_t tx_ring; /* guest -> controller  */
-        char __x[CONTROL_RING_MEM];
-    };
-    union {
-        ctrl_sring_t rx_ring; /* controller -> guest  */
-        char __y[CONTROL_RING_MEM];
-    };
-} control_if_t;
-
-/*
- * Top-level command types.
- */
-#define CMSG_CONSOLE        0  /* Console                 */
-#define CMSG_BLKIF_BE       1  /* Block-device backend    */
-#define CMSG_BLKIF_FE       2  /* Block-device frontend   */
-#define CMSG_NETIF_BE       3  /* Network-device backend  */
-#define CMSG_NETIF_FE       4  /* Network-device frontend */
-#define CMSG_SHUTDOWN       6  /* Shutdown messages       */
-#define CMSG_MEM_REQUEST    7  /* Memory reservation reqs */
-#define CMSG_USBIF_BE       8  /* USB controller backend  */
-#define CMSG_USBIF_FE       9  /* USB controller frontend */
-#define CMSG_VCPU_HOTPLUG  10  /* Hotplug VCPU messages   */
-#define CMSG_DEBUG         11  /* PDB backend             */
-
-/******************************************************************************
- * CONSOLE DEFINITIONS
- */
-
-/*
- * Subtypes for console messages.
- */
-#define CMSG_CONSOLE_DATA       0
-
-
-/******************************************************************************
- * BLOCK-INTERFACE FRONTEND DEFINITIONS
- */
-
-/* Messages from domain controller to guest. */
-#define CMSG_BLKIF_FE_INTERFACE_STATUS           0
-
-/* Messages from guest to domain controller. */
-#define CMSG_BLKIF_FE_DRIVER_STATUS             32
-#define CMSG_BLKIF_FE_INTERFACE_CONNECT         33
-#define CMSG_BLKIF_FE_INTERFACE_DISCONNECT      34
-#define CMSG_BLKIF_FE_INTERFACE_QUERY           35
-
-#ifndef blkif_vdev_t
-#define blkif_vdev_t   u16
-#endif
-#define blkif_pdev_t   u32
-
-/*
- * CMSG_BLKIF_FE_INTERFACE_STATUS:
- *  Notify a guest about a status change on one of its block interfaces.
- *  If the interface is DESTROYED or DOWN then the interface is disconnected:
- *   1. The shared-memory frame is available for reuse.
- *   2. Any unacknowledged messages pending on the interface were dropped.
- */
-#define BLKIF_INTERFACE_STATUS_CLOSED       0 /* Interface doesn't exist.    */
-#define BLKIF_INTERFACE_STATUS_DISCONNECTED 1 /* Exists but is disconnected. */
-#define BLKIF_INTERFACE_STATUS_CONNECTED    2 /* Exists and is connected.    */
-#define BLKIF_INTERFACE_STATUS_CHANGED      3 /* A device has been added or 
removed. */
-typedef struct blkif_fe_interface_status {
-    u32 handle;
-    u32 status;
-    u16 evtchn;    /* (only if status == BLKIF_INTERFACE_STATUS_CONNECTED). */
-    domid_t domid; /* status != BLKIF_INTERFACE_STATUS_DESTROYED */
-} blkif_fe_interface_status_t;
-
-/*
- * CMSG_BLKIF_FE_DRIVER_STATUS:
- *  Notify the domain controller that the front-end driver is DOWN or UP.
- *  When the driver goes DOWN then the controller will send no more
- *  status-change notifications.
- *  If the driver goes DOWN while interfaces are still UP, the domain
- *  will automatically take the interfaces DOWN.
- * 
- *  NB. The controller should not send an INTERFACE_STATUS_CHANGED message
- *  for interfaces that are active when it receives an UP notification. We
- *  expect that the frontend driver will query those interfaces itself.
- */
-#define BLKIF_DRIVER_STATUS_DOWN   0
-#define BLKIF_DRIVER_STATUS_UP     1
-typedef struct blkif_fe_driver_status {
-    /* IN */
-    u32 status;        /* BLKIF_DRIVER_STATUS_??? */
-    /* OUT */
-    /* Driver should query interfaces [0..max_handle]. */
-    u32 max_handle;
-} blkif_fe_driver_status_t;
-
-/*
- * CMSG_BLKIF_FE_INTERFACE_CONNECT:
- *  If successful, the domain controller will acknowledge with a
- *  STATUS_CONNECTED message.
- */
-typedef struct blkif_fe_interface_connect {
-    u32      handle;
-    unsigned long shmem_frame;
-    int      shmem_ref;
-} blkif_fe_interface_connect_t;
-
-/*
- * CMSG_BLKIF_FE_INTERFACE_DISCONNECT:
- *  If successful, the domain controller will acknowledge with a
- *  STATUS_DISCONNECTED message.
- */
-typedef struct blkif_fe_interface_disconnect {
-    u32 handle;
-} blkif_fe_interface_disconnect_t;
-
-/*
- * CMSG_BLKIF_FE_INTERFACE_QUERY:
- */
-typedef struct blkif_fe_interface_query {
-    /* IN */
-    u32 handle;
-    /* OUT */
-    u32 status;
-    u16 evtchn;    /* (only if status == BLKIF_INTERFACE_STATUS_CONNECTED). */
-    domid_t domid; /* status != BLKIF_INTERFACE_STATUS_DESTROYED */
-} blkif_fe_interface_query_t;
-
-
-/******************************************************************************
- * BLOCK-INTERFACE BACKEND DEFINITIONS
- */
-
-/* Messages from domain controller. */
-#define CMSG_BLKIF_BE_CREATE      0  /* Create a new block-device interface. */
-#define CMSG_BLKIF_BE_DESTROY     1  /* Destroy a block-device interface.    */
-#define CMSG_BLKIF_BE_CONNECT     2  /* Connect i/f to remote driver.        */
-#define CMSG_BLKIF_BE_DISCONNECT  3  /* Disconnect i/f from remote driver.   */
-#define CMSG_BLKIF_BE_VBD_CREATE  4  /* Create a new VBD for an interface.   */
-#define CMSG_BLKIF_BE_VBD_DESTROY 5  /* Delete a VBD from an interface.      */
-
-/* Messages to domain controller. */
-#define CMSG_BLKIF_BE_DRIVER_STATUS 32
-
-/*
- * Message request/response definitions for block-device messages.
- */
-
-/* Non-specific 'okay' return. */
-#define BLKIF_BE_STATUS_OKAY                0
-/* Non-specific 'error' return. */
-#define BLKIF_BE_STATUS_ERROR               1
-/* The following are specific error returns. */
-#define BLKIF_BE_STATUS_INTERFACE_EXISTS    2
-#define BLKIF_BE_STATUS_INTERFACE_NOT_FOUND 3
-#define BLKIF_BE_STATUS_INTERFACE_CONNECTED 4
-#define BLKIF_BE_STATUS_VBD_EXISTS          5
-#define BLKIF_BE_STATUS_VBD_NOT_FOUND       6
-#define BLKIF_BE_STATUS_OUT_OF_MEMORY       7
-#define BLKIF_BE_STATUS_PHYSDEV_NOT_FOUND   8
-#define BLKIF_BE_STATUS_MAPPING_ERROR       9
-
-/* This macro can be used to create an array of descriptive error strings. */
-#define BLKIF_BE_STATUS_ERRORS {    \
-    "Okay",                         \
-    "Non-specific error",           \
-    "Interface already exists",     \
-    "Interface not found",          \
-    "Interface is still connected", \
-    "VBD already exists",           \
-    "VBD not found",                \
-    "Out of memory",                \
-    "Extent not found for VBD",     \
-    "Could not map domain memory" }
-
-/*
- * CMSG_BLKIF_BE_CREATE:
- *  When the driver sends a successful response then the interface is fully
- *  created. The controller will send a DOWN notification to the front-end
- *  driver.
- */
-typedef struct blkif_be_create { 
-    /* IN */
-    domid_t    domid;         /* Domain attached to new interface.   */
-    u32        blkif_handle;  /* Domain-specific interface handle.   */
-    /* OUT */
-    u32        status;
-} blkif_be_create_t;
-
-/*
- * CMSG_BLKIF_BE_DESTROY:
- *  When the driver sends a successful response then the interface is fully
- *  torn down. The controller will send a DESTROYED notification to the
- *  front-end driver.
- */
-typedef struct blkif_be_destroy { 
-    /* IN */
-    domid_t    domid;         /* Identify interface to be destroyed. */
-    u32        blkif_handle;  /* ...ditto...                         */
-    /* OUT */
-    u32        status;
-} blkif_be_destroy_t;
-
-/*
- * CMSG_BLKIF_BE_CONNECT:
- *  When the driver sends a successful response then the interface is fully
- *  connected. The controller will send a CONNECTED notification to the
- *  front-end driver.
- */
-typedef struct blkif_be_connect {
-    /* IN */
-    domid_t    domid;         /* Domain attached to new interface.   */
-    u32        blkif_handle;  /* Domain-specific interface handle.   */
-    unsigned long shmem_frame;/* Page cont. shared comms window.     */
-    int        shmem_ref;     /* Grant table reference.              */
-    u32        evtchn;        /* Event channel for notifications.    */
-    /* OUT */
-    u32        status;
-} blkif_be_connect_t;
-
-/*
- * CMSG_BLKIF_BE_DISCONNECT:
- *  When the driver sends a successful response then the interface is fully
- *  disconnected. The controller will send a DOWN notification to the front-end
- *  driver.
- */
-typedef struct blkif_be_disconnect { 
-    /* IN */
-    domid_t    domid;         /* Domain attached to new interface.   */
-    u32        blkif_handle;  /* Domain-specific interface handle.   */
-    /* OUT */
-    u32        status;
-} blkif_be_disconnect_t;
-
-/* CMSG_BLKIF_BE_VBD_CREATE */
-typedef struct blkif_be_vbd_create {
-    /* IN */
-    domid_t    domid;         /* Identify blkdev interface.          */
-    u32        blkif_handle;  /* ...ditto...                         */
-    blkif_pdev_t pdevice;
-    u32        dev_handle;    /* Extended device id field.           */
-    blkif_vdev_t vdevice;     /* Interface-specific id for this VBD. */
-    u16        readonly;      /* Non-zero -> VBD isn't writable.     */
-    /* OUT */
-    u32        status;
-} blkif_be_vbd_create_t;
-
-/* CMSG_BLKIF_BE_VBD_DESTROY */
-typedef struct blkif_be_vbd_destroy {
-    /* IN */
-    domid_t    domid;         /* Identify blkdev interface.          */
-    u32        blkif_handle;  /* ...ditto...                         */
-    blkif_vdev_t vdevice;     /* Interface-specific id of the VBD.   */
-    /* OUT */
-    u32        status;
-} blkif_be_vbd_destroy_t;
-
-/*
- * CMSG_BLKIF_BE_DRIVER_STATUS:
- *  Notify the domain controller that the back-end driver is DOWN or UP.
- *  If the driver goes DOWN while interfaces are still UP, the controller
- *  will automatically send DOWN notifications.
- */
-typedef struct blkif_be_driver_status {
-    u32        status;        /* BLKIF_DRIVER_STATUS_??? */
-} blkif_be_driver_status_t;
-
-
-/******************************************************************************
- * NETWORK-INTERFACE FRONTEND DEFINITIONS
- */
-
-/* Messages from domain controller to guest. */
-#define CMSG_NETIF_FE_INTERFACE_STATUS   0
-
-/* Messages from guest to domain controller. */
-#define CMSG_NETIF_FE_DRIVER_STATUS             32
-#define CMSG_NETIF_FE_INTERFACE_CONNECT         33
-#define CMSG_NETIF_FE_INTERFACE_DISCONNECT      34
-#define CMSG_NETIF_FE_INTERFACE_QUERY           35
-
-/*
- * CMSG_NETIF_FE_INTERFACE_STATUS:
- *  Notify a guest about a status change on one of its network interfaces.
- *  If the interface is CLOSED or DOWN then the interface is disconnected:
- *   1. The shared-memory frame is available for reuse.
- *   2. Any unacknowledged messgaes pending on the interface were dropped.
- */
-#define NETIF_INTERFACE_STATUS_CLOSED       0 /* Interface doesn't exist.    */
-#define NETIF_INTERFACE_STATUS_DISCONNECTED 1 /* Exists but is disconnected. */
-#define NETIF_INTERFACE_STATUS_CONNECTED    2 /* Exists and is connected.    */
-#define NETIF_INTERFACE_STATUS_CHANGED      3 /* A device has been added or 
removed. */
-typedef struct netif_fe_interface_status {
-    u32        handle;
-    u32        status;
-    u16        evtchn; /* status == NETIF_INTERFACE_STATUS_CONNECTED */
-    u8         mac[6]; /* status == NETIF_INTERFACE_STATUS_CONNECTED */
-    domid_t    domid;  /* status != NETIF_INTERFACE_STATUS_DESTROYED */
-} netif_fe_interface_status_t;
-
-/*
- * CMSG_NETIF_FE_DRIVER_STATUS:
- *  Notify the domain controller that the front-end driver is DOWN or UP.
- *  When the driver goes DOWN then the controller will send no more
- *  status-change notifications.
- *  If the driver goes DOWN while interfaces are still UP, the domain
- *  will automatically take the interfaces DOWN.
- * 
- *  NB. The controller should not send an INTERFACE_STATUS message
- *  for interfaces that are active when it receives an UP notification. We
- *  expect that the frontend driver will query those interfaces itself.
- */
-#define NETIF_DRIVER_STATUS_DOWN   0
-#define NETIF_DRIVER_STATUS_UP     1
-typedef struct netif_fe_driver_status {
-    /* IN */
-    u32        status;        /* NETIF_DRIVER_STATUS_??? */
-    /* OUT */
-    /* Driver should query interfaces [0..max_handle]. */
-    u32        max_handle;
-} netif_fe_driver_status_t;
-
-/*
- * CMSG_NETIF_FE_INTERFACE_CONNECT:
- *  If successful, the domain controller will acknowledge with a
- *  STATUS_CONNECTED message.
- */
-typedef struct netif_fe_interface_connect {
-    u32           handle;
-    unsigned long tx_shmem_frame; 
-    int           tx_shmem_ref;
-    unsigned long rx_shmem_frame;
-    int           rx_shmem_ref;
-} netif_fe_interface_connect_t;
-
-/*
- * CMSG_NETIF_FE_INTERFACE_DISCONNECT:
- *  If successful, the domain controller will acknowledge with a
- *  STATUS_DISCONNECTED message.
- */
-typedef struct netif_fe_interface_disconnect {
-    u32        handle;
-} netif_fe_interface_disconnect_t;
-
-/*
- * CMSG_NETIF_FE_INTERFACE_QUERY:
- */
-typedef struct netif_fe_interface_query {
-    /* IN */
-    u32        handle;
-    /* OUT */
-    u32        status;
-    u16        evtchn; /* status == NETIF_INTERFACE_STATUS_CONNECTED */
-    u8         mac[6]; /* status == NETIF_INTERFACE_STATUS_CONNECTED */
-    domid_t    domid;  /* status != NETIF_INTERFACE_STATUS_DESTROYED */
-} netif_fe_interface_query_t;
-
-
-/******************************************************************************
- * NETWORK-INTERFACE BACKEND DEFINITIONS
- */
-
-/* Messages from domain controller. */
-#define CMSG_NETIF_BE_CREATE      0  /* Create a new net-device interface. */
-#define CMSG_NETIF_BE_DESTROY     1  /* Destroy a net-device interface.    */
-#define CMSG_NETIF_BE_CONNECT     2  /* Connect i/f to remote driver.        */
-#define CMSG_NETIF_BE_DISCONNECT  3  /* Disconnect i/f from remote driver.   */
-#define CMSG_NETIF_BE_CREDITLIMIT 4  /* Limit i/f to a given credit limit. */
-
-/* Messages to domain controller. */
-#define CMSG_NETIF_BE_DRIVER_STATUS 32
-
-/*
- * Message request/response definitions for net-device messages.
- */
-
-/* Non-specific 'okay' return. */
-#define NETIF_BE_STATUS_OKAY                0
-/* Non-specific 'error' return. */
-#define NETIF_BE_STATUS_ERROR               1
-/* The following are specific error returns. */
-#define NETIF_BE_STATUS_INTERFACE_EXISTS    2
-#define NETIF_BE_STATUS_INTERFACE_NOT_FOUND 3
-#define NETIF_BE_STATUS_INTERFACE_CONNECTED 4
-#define NETIF_BE_STATUS_OUT_OF_MEMORY       5
-#define NETIF_BE_STATUS_MAPPING_ERROR       6
-
-/* This macro can be used to create an array of descriptive error strings. */
-#define NETIF_BE_STATUS_ERRORS {    \
-    "Okay",                         \
-    "Non-specific error",           \
-    "Interface already exists",     \
-    "Interface not found",          \
-    "Interface is still connected", \
-    "Out of memory",                \
-    "Could not map domain memory" }
-
-/*
- * CMSG_NETIF_BE_CREATE:
- *  When the driver sends a successful response then the interface is fully
- *  created. The controller will send a DOWN notification to the front-end
- *  driver.
- */
-typedef struct netif_be_create { 
-    /* IN */
-    domid_t    domid;         /* Domain attached to new interface.   */
-    u32        netif_handle;  /* Domain-specific interface handle.   */
-    u8         mac[6];
-    u8         be_mac[6];
-    /* OUT */
-    u32        status;
-} netif_be_create_t;
-
-/*
- * CMSG_NETIF_BE_DESTROY:
- *  When the driver sends a successful response then the interface is fully
- *  torn down. The controller will send a DESTROYED notification to the
- *  front-end driver.
- */
-typedef struct netif_be_destroy { 
-    /* IN */
-    domid_t    domid;         /* Identify interface to be destroyed. */
-    u32        netif_handle;  /* ...ditto...                         */
-    /* OUT */
-    u32   status;
-} netif_be_destroy_t;
-
-/*
- * CMSG_NETIF_BE_CREDITLIMIT:
- *  Limit a virtual interface to "credit_bytes" bytes per "period_usec" 
- *  microseconds.  
- */
-typedef struct netif_be_creditlimit { 
-    /* IN */
-    domid_t    domid;          /* Domain attached to new interface.   */
-    u32        netif_handle;   /* Domain-specific interface handle.   */
-    u32        credit_bytes;   /* Vifs credit of bytes per period.    */
-    u32        period_usec;    /* Credit replenishment period.        */
-    /* OUT */
-    u32        status;
-} netif_be_creditlimit_t;
-
-/*
- * CMSG_NETIF_BE_CONNECT:
- *  When the driver sends a successful response then the interface is fully
- *  connected. The controller will send a CONNECTED notification to the
- *  front-end driver.
- */
-typedef struct netif_be_connect { 
-    /* IN */
-    domid_t    domid;            /* Domain attached to new interface.   */
-    u32        netif_handle;     /* Domain-specific interface handle.   */
-    unsigned long tx_shmem_frame;/* Page cont. tx shared comms window.  */
-    int        tx_shmem_ref;     /* Grant reference for above           */
-    unsigned long rx_shmem_frame;/* Page cont. rx shared comms window.  */
-    int        rx_shmem_ref;     /* Grant reference for above           */
-    u16        evtchn;           /* Event channel for notifications.    */
-    /* OUT */
-    u32        status;
-} netif_be_connect_t;
-
-/*
- * CMSG_NETIF_BE_DISCONNECT:
- *  When the driver sends a successful response then the interface is fully
- *  disconnected. The controller will send a DOWN notification to the front-end
- *  driver.
- */
-typedef struct netif_be_disconnect { 
-    /* IN */
-    domid_t    domid;         /* Domain attached to new interface.   */
-    u32        netif_handle;  /* Domain-specific interface handle.   */
-    /* OUT */
-    u32        status;
-} netif_be_disconnect_t;
-
-/*
- * CMSG_NETIF_BE_DRIVER_STATUS:
- *  Notify the domain controller that the back-end driver is DOWN or UP.
- *  If the driver goes DOWN while interfaces are still UP, the domain
- *  will automatically send DOWN notifications.
- */
-typedef struct netif_be_driver_status {
-    u32        status;        /* NETIF_DRIVER_STATUS_??? */
-} netif_be_driver_status_t;
-
-
-
-/******************************************************************************
- * USB-INTERFACE FRONTEND DEFINITIONS
- */
-
-/* Messages from domain controller to guest. */
-#define CMSG_USBIF_FE_INTERFACE_STATUS_CHANGED   0
-
-/* Messages from guest to domain controller. */
-#define CMSG_USBIF_FE_DRIVER_STATUS_CHANGED     32
-#define CMSG_USBIF_FE_INTERFACE_CONNECT         33
-#define CMSG_USBIF_FE_INTERFACE_DISCONNECT      34
-/*
- * CMSG_USBIF_FE_INTERFACE_STATUS_CHANGED:
- *  Notify a guest about a status change on one of its block interfaces.
- *  If the interface is DESTROYED or DOWN then the interface is disconnected:
- *   1. The shared-memory frame is available for reuse.
- *   2. Any unacknowledged messages pending on the interface were dropped.
- */
-#define USBIF_INTERFACE_STATUS_DESTROYED    0 /* Interface doesn't exist.    */
-#define USBIF_INTERFACE_STATUS_DISCONNECTED 1 /* Exists but is disconnected. */
-#define USBIF_INTERFACE_STATUS_CONNECTED    2 /* Exists and is connected.    */
-typedef struct usbif_fe_interface_status_changed {
-    u32 status;
-    u16 evtchn;    /* (only if status == BLKIF_INTERFACE_STATUS_CONNECTED). */
-    domid_t domid; /* status != BLKIF_INTERFACE_STATUS_DESTROYED */
-    u32 bandwidth;
-    u32 num_ports;
-} usbif_fe_interface_status_changed_t;
-
-/*
- * CMSG_USBIF_FE_DRIVER_STATUS_CHANGED:
- *  Notify the domain controller that the front-end driver is DOWN or UP.
- *  When the driver goes DOWN then the controller will send no more
- *  status-change notifications.
- *  If the driver goes DOWN while interfaces are still UP, the domain
- *  will automatically take the interfaces DOWN.
- * 
- *  NB. The controller should not send an INTERFACE_STATUS_CHANGED message
- *  for interfaces that are active when it receives an UP notification. We
- *  expect that the frontend driver will query those interfaces itself.
- */
-#define USBIF_DRIVER_STATUS_DOWN   0
-#define USBIF_DRIVER_STATUS_UP     1
-typedef struct usbif_fe_driver_status_changed {
-    /* IN */
-    u32 status;        /* USBIF_DRIVER_STATUS_??? */
-} usbif_fe_driver_status_changed_t;
-
-/*
- * CMSG_USBIF_FE_INTERFACE_CONNECT:
- *  If successful, the domain controller will acknowledge with a
- *  STATUS_CONNECTED message.
- */
-typedef struct usbif_fe_interface_connect {
-    unsigned long shmem_frame;
-} usbif_fe_interface_connect_t;
-
-/*
- * CMSG_USBIF_FE_INTERFACE_DISCONNECT:
- *  If successful, the domain controller will acknowledge with a
- *  STATUS_DISCONNECTED message.
- */
-typedef struct usbif_fe_interface_disconnect {
-    int dummy; /* make struct non-empty */
-} usbif_fe_interface_disconnect_t;
-
-
-/******************************************************************************
- * USB-INTERFACE BACKEND DEFINITIONS
- */
-
-/* Messages from domain controller. */
-#define CMSG_USBIF_BE_CREATE       0  /* Create a new block-device interface. 
*/
-#define CMSG_USBIF_BE_DESTROY      1  /* Destroy a block-device interface.    
*/
-#define CMSG_USBIF_BE_CONNECT      2  /* Connect i/f to remote driver.        
*/
-#define CMSG_USBIF_BE_DISCONNECT   3  /* Disconnect i/f from remote driver.   
*/
-#define CMSG_USBIF_BE_CLAIM_PORT   4  /* Claim host port for a domain.        
*/
-#define CMSG_USBIF_BE_RELEASE_PORT 5  /* Release host port.                   
*/
-/* Messages to domain controller. */
-#define CMSG_USBIF_BE_DRIVER_STATUS_CHANGED 32
-
-/* Non-specific 'okay' return. */
-#define USBIF_BE_STATUS_OKAY                0
-/* Non-specific 'error' return. */
-#define USBIF_BE_STATUS_ERROR               1
-/* The following are specific error returns. */
-#define USBIF_BE_STATUS_INTERFACE_EXISTS    2
-#define USBIF_BE_STATUS_INTERFACE_NOT_FOUND 3
-#define USBIF_BE_STATUS_INTERFACE_CONNECTED 4
-#define USBIF_BE_STATUS_OUT_OF_MEMORY       7
-#define USBIF_BE_STATUS_MAPPING_ERROR       9
-
-/* This macro can be used to create an array of descriptive error strings. */
-#define USBIF_BE_STATUS_ERRORS {    \
-    "Okay",                         \
-    "Non-specific error",           \
-    "Interface already exists",     \
-    "Interface not found",          \
-    "Interface is still connected", \
-    "Out of memory",                \
-    "Could not map domain memory" }
-
-/*
- * CMSG_USBIF_BE_CREATE:
- *  When the driver sends a successful response then the interface is fully
- *  created. The controller will send a DOWN notification to the front-end
- *  driver.
- */
-typedef struct usbif_be_create { 
-    /* IN */
-    domid_t    domid;         /* Domain attached to new interface.   */
-    /* OUT */
-    u32        status;
-} usbif_be_create_t;
-
-/*
- * CMSG_USBIF_BE_DESTROY:
- *  When the driver sends a successful response then the interface is fully
- *  torn down. The controller will send a DESTROYED notification to the
- *  front-end driver.
- */
-typedef struct usbif_be_destroy { 
-    /* IN */
-    domid_t    domid;         /* Identify interface to be destroyed. */
-    /* OUT */
-    u32        status;
-} usbif_be_destroy_t;
-
-/*
- * CMSG_USBIF_BE_CONNECT:
- *  When the driver sends a successful response then the interface is fully
- *  connected. The controller will send a CONNECTED notification to the
- *  front-end driver.
- */
-typedef struct usbif_be_connect { 
-    /* IN */
-    domid_t    domid;         /* Domain attached to new interface.   */
-    unsigned long shmem_frame;/* Page cont. shared comms window.     */
-    u32        evtchn;        /* Event channel for notifications.    */
-    u32        bandwidth;     /* Bandwidth allocated for isoch / int - us
-                               * per 1ms frame (ie between 0 and 900 or 800
-                               * depending on USB version). */
-    /* OUT */
-    u32        status;
-} usbif_be_connect_t;
-
-/*
- * CMSG_USBIF_BE_DISCONNECT:
- *  When the driver sends a successful response then the interface is fully
- *  disconnected. The controller will send a DOWN notification to the front-end
- *  driver.
- */
-typedef struct usbif_be_disconnect { 
-    /* IN */
-    domid_t    domid;         /* Domain attached to new interface.   */
-    /* OUT */
-    u32        status;
-} usbif_be_disconnect_t;
-
-/*
- * CMSG_USBIF_BE_DRIVER_STATUS_CHANGED:
- *  Notify the domain controller that the back-end driver is DOWN or UP.
- *  If the driver goes DOWN while interfaces are still UP, the controller
- *  will automatically send DOWN notifications.
- */
-typedef struct usbif_be_driver_status_changed {
-    u32        status;        /* USBIF_DRIVER_STATUS_??? */
-} usbif_be_driver_status_changed_t;
-
-#define USB_PATH_LEN 16
-
-/*
- * CMSG_USBIF_BE_CLAIM_PORT:
- * Instruct the backend driver to claim any device plugged into the specified
- * host port and to allow the specified domain to control that port.
- */
-typedef struct usbif_be_claim_port {
-    /* IN */
-    domid_t  domid;        /* which domain                 */
-    u32      usbif_port;   /* port on the virtual root hub */
-    u32      status;       /* status of operation          */
-    char path[USB_PATH_LEN]; /* Currently specified in the Linux style - may 
need to be
-                    * converted to some OS-independent format at some stage. */
-} usbif_be_claim_port_t;
-
-/*
- * CMSG_USBIF_BE_RELEASE_PORT: 
- * Instruct the backend driver to release any device plugged into the specified
- * host port.
- */
-typedef struct usbif_be_release_port {
-    char     path[USB_PATH_LEN];
-} usbif_be_release_port_t;
-
-/******************************************************************************
- * SHUTDOWN DEFINITIONS
- */
-
-/*
- * Subtypes for shutdown messages.
- */
-#define CMSG_SHUTDOWN_POWEROFF  0   /* Clean shutdown (SHUTDOWN_poweroff).   */
-#define CMSG_SHUTDOWN_REBOOT    1   /* Clean shutdown (SHUTDOWN_reboot).     */
-#define CMSG_SHUTDOWN_SUSPEND   2   /* Create suspend info, then             */
-                                    /* SHUTDOWN_suspend.                     */
-#define CMSG_SHUTDOWN_SYSRQ     3
-
-typedef struct shutdown_sysrq {
-    char key;      /* sysrq key */
-} shutdown_sysrq_t;
-
-/******************************************************************************
- * VCPU HOTPLUG CONTROLS
- */
-
-/*
- * Subtypes for shutdown messages.
- */
-#define CMSG_VCPU_HOTPLUG_OFF   0   /* turn vcpu off */
-#define CMSG_VCPU_HOTPLUG_ON    1   /* turn vcpu on  */
-
-/*
- * CMSG_VCPU_HOTPLUG:
- *  Indicate which vcpu's state should change
- */
-typedef struct vcpu_hotplug {
-    u32 vcpu;         /* VCPU's whose state will change */
-    u32 status;       /* Return code indicates success or failure. */
-} vcpu_hotplug_t;
-
-/******************************************************************************
- * MEMORY CONTROLS
- */
-
-#define CMSG_MEM_REQUEST_SET 0 /* Request a domain to set its mem footprint. */
-
-/*
- * CMSG_MEM_REQUEST:
- *  Request that the domain change its memory reservation.
- */
-typedef struct mem_request {
-    /* OUT */
-    u32 target;       /* Target memory reservation in pages.       */
-    /* IN  */
-    u32 status;       /* Return code indicates success or failure. */
-} mem_request_t;
-
-
-/******************************************************************************
- * PDB INTERFACE DEFINITIONS
- */
-
-#define CMSG_DEBUG_CONNECTION_STATUS 0
-typedef struct pdb_Connection {
-#define PDB_CONNECTION_STATUS_UP   1
-#define PDB_CONNECTION_STATUS_DOWN 2
-    u32      status;
-    unsigned long ring;  /* status: UP */
-    u32      evtchn;     /* status: UP */
-} pdb_connection_t, *pdb_connection_p;
-
-#endif /* __XEN_PUBLIC_IO_DOMAIN_CONTROLLER_H__ */

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


 


Rackspace

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