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

[Xen-changelog] [xen-unstable] merge with xen-unstable.hg (staging)



# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1194539826 25200
# Node ID ee935d2b8a632bad27fc1682daf9cda503e08277
# Parent  d0cd18d780749482866ab4b21e3f77b40141230e
# Parent  3e3b0418905f5900df24d1e1b6e916cff8a371ba
merge with xen-unstable.hg (staging)
---
 tools/ioemu/target-i386-dm/helper2.c      |   17 -
 tools/misc/xend                           |   14 -
 tools/python/xen/xm/main.py               |    6 
 xen/arch/ia64/vmx/mmio.c                  |    3 
 xen/arch/ia64/vmx/save.c                  |    6 
 xen/arch/ia64/xen/mm.c                    |    2 
 xen/arch/x86/hvm/intercept.c              |   18 -
 xen/arch/x86/hvm/save.c                   |   12 -
 xen/arch/x86/hvm/stdvga.c                 |    4 
 xen/arch/x86/hvm/vmx/vtd/intel-iommu.c    |   12 -
 xen/arch/x86/hvm/vmx/vtd/utils.c          |  360 +++++++++++-------------------
 xen/arch/x86/hvm/vpt.c                    |   26 --
 xen/arch/x86/mm.c                         |    8 
 xen/arch/x86/mm/shadow/multi.c            |    5 
 xen/common/grant_table.c                  |    2 
 xen/common/hvm/save.c                     |    4 
 xen/common/page_alloc.c                   |   11 
 xen/include/asm-ia64/mm.h                 |    5 
 xen/include/asm-powerpc/mm.h              |    3 
 xen/include/asm-x86/hvm/vmx/intel-iommu.h |   13 +
 xen/include/asm-x86/mm.h                  |    8 
 xen/include/public/hvm/ioreq.h            |   11 
 xen/include/xen/hvm/save.h                |    4 
 23 files changed, 236 insertions(+), 318 deletions(-)

diff -r d0cd18d78074 -r ee935d2b8a63 tools/ioemu/target-i386-dm/helper2.c
--- a/tools/ioemu/target-i386-dm/helper2.c      Wed Nov 07 15:11:44 2007 -0700
+++ b/tools/ioemu/target-i386-dm/helper2.c      Thu Nov 08 09:37:06 2007 -0700
@@ -541,27 +541,28 @@ void __handle_buffered_iopage(CPUState *
 {
     buf_ioreq_t *buf_req = NULL;
     ioreq_t req;
-    int qw = 0;
+    int qw;
 
     if (!buffered_io_page)
         return;
 
     while (buffered_io_page->read_pointer !=
            buffered_io_page->write_pointer) {
-        memset(&req, 0, sizeof(req));
-        buf_req = &buffered_io_page->buf_ioreq[buffered_io_page->read_pointer %
-                                      IOREQ_BUFFER_SLOT_NUM];
+        buf_req = &buffered_io_page->buf_ioreq[
+            buffered_io_page->read_pointer % IOREQ_BUFFER_SLOT_NUM];
         req.size = 1UL << buf_req->size;
         req.count = 1;
         req.addr = buf_req->addr;
         req.data = buf_req->data;
         req.state = STATE_IOREQ_READY;
-        req.dir  = buf_req->dir;
+        req.dir = buf_req->dir;
+        req.df = buf_req->df;
         req.type = buf_req->type;
-        qw = req.size == 8;
+        req.data_is_ptr = 0;
+        qw = (req.size == 8);
         if (qw) {
-            buf_req = 
&buffered_io_page->buf_ioreq[(buffered_io_page->read_pointer+1) %
-                                               IOREQ_BUFFER_SLOT_NUM];
+            buf_req = &buffered_io_page->buf_ioreq[
+                (buffered_io_page->read_pointer+1) % IOREQ_BUFFER_SLOT_NUM];
             req.data |= ((uint64_t)buf_req->data) << 32;
         }
 
diff -r d0cd18d78074 -r ee935d2b8a63 tools/misc/xend
--- a/tools/misc/xend   Wed Nov 07 15:11:44 2007 -0700
+++ b/tools/misc/xend   Thu Nov 08 09:37:06 2007 -0700
@@ -33,13 +33,13 @@ import time
 import time
 import commands
 
-result = commands.getstatusoutput(os.path.join(os.path.dirname(sys.argv[0]),
-                                               'xen-python-path'))
-if result[0] != 0:
-    print >>sys.stderr, result[1]
-    sys.exit(1)
-
-sys.path.append(result[1])
+xpp = os.path.join(os.path.dirname(sys.argv[0]), 'xen-python-path')
+if os.path.exists(xpp):
+    result = commands.getstatusoutput(xpp)
+    if result[0] != 0:
+        print >>sys.stderr, result[1]
+        sys.exit(1)
+    sys.path.append(result[1])
 
 from xen.xend.server import SrvDaemon
 
diff -r d0cd18d78074 -r ee935d2b8a63 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       Wed Nov 07 15:11:44 2007 -0700
+++ b/tools/python/xen/xm/main.py       Thu Nov 08 09:37:06 2007 -0700
@@ -1529,11 +1529,11 @@ def xm_sched_credit(args):
     cap = None
 
     for o, a in opts:
-        if o == "-d":
+        if o in ["-d", "--domain"]:
             domid = a
-        elif o == "-w":
+        elif o in ["-w", "--weight"]:
             weight = int(a)
-        elif o == "-c":
+        elif o in ["-c", "--cap"]:
             cap = int(a);
 
     doms = filter(lambda x : domid_match(domid, x),
diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c  Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/arch/ia64/vmx/mmio.c  Thu Nov 08 09:37:06 2007 -0700
@@ -65,7 +65,7 @@ static int hvm_buffered_io_intercept(ior
 
     /* ignore READ ioreq_t and anything buffered io can't deal with */
     if (p->dir == IOREQ_READ || p->addr > 0xFFFFFUL ||
-        p->data_is_ptr || p->df || p->count != 1)
+        p->data_is_ptr || p->count != 1)
         return 0;
 
     for (i = 0; i < HVM_BUFFERED_IO_RANGE_NR; i++) {
@@ -80,6 +80,7 @@ static int hvm_buffered_io_intercept(ior
 
     bp.type = p->type;
     bp.dir = p->dir;
+    bp.df = p->df;
     switch (p->size) {
     case 1:
         bp.size = 0;
diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/ia64/vmx/save.c
--- a/xen/arch/ia64/vmx/save.c  Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/arch/ia64/vmx/save.c  Thu Nov 08 09:37:06 2007 -0700
@@ -23,8 +23,7 @@
 #include <xen/types.h>
 #include <xen/hvm/save.h>
 
-void
-arch_hvm_save(struct hvm_save_header *hdr)
+void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr)
 {
     unsigned int i;
     
@@ -32,8 +31,7 @@ arch_hvm_save(struct hvm_save_header *hd
         hdr->cpuid[i] = ia64_get_cpuid(i);
 }
 
-int
-arch_hvm_load(struct hvm_save_header *hdr)
+int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr)
 {
     unsigned int i;
     if (hdr->magic != HVM_FILE_MAGIC) {
diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/ia64/xen/mm.c
--- a/xen/arch/ia64/xen/mm.c    Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/arch/ia64/xen/mm.c    Thu Nov 08 09:37:06 2007 -0700
@@ -2832,7 +2832,7 @@ arch_memory_op(int op, XEN_GUEST_HANDLE(
 
         /* Remove previously mapped page if it was present. */
         if (prev_mfn && mfn_valid(prev_mfn)) {
-            if (is_xen_heap_frame(mfn_to_page(prev_mfn)))
+            if (is_xen_heap_mfn(prev_mfn))
                 /* Xen heap frames are simply unhooked from this phys slot. */
                 guest_physmap_remove_page(d, xatp.gpfn, prev_mfn);
             else
diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/intercept.c
--- a/xen/arch/x86/hvm/intercept.c      Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/arch/x86/hvm/intercept.c      Thu Nov 08 09:37:06 2007 -0700
@@ -163,18 +163,20 @@ int hvm_buffered_io_send(ioreq_t *p)
     /* Ensure buffered_iopage fits in a page */
     BUILD_BUG_ON(sizeof(buffered_iopage_t) > PAGE_SIZE);
 
-    /* Return 0 for the cases we can't deal with. */
-    if ( (p->addr > 0xffffful) || p->data_is_ptr || p->df || (p->count != 1) )
-    {
-        gdprintk(XENLOG_DEBUG, "slow ioreq. type:%d size:%"PRIu64" addr:0x%"
-                 PRIx64" dir:%d ptr:%d df:%d count:%"PRIu64"\n",
-                 p->type, p->size, p->addr, !!p->dir,
-                 !!p->data_is_ptr, !!p->df, p->count);
+    /*
+     * Return 0 for the cases we can't deal with:
+     *  - 'addr' is only a 20-bit field, so we cannot address beyond 1MB
+     *  - we cannot buffer accesses to guest memory buffers, as the guest
+     *    may expect the memory buffer to be synchronously accessed
+     *  - the count field is usually used with data_is_ptr and since we don't
+     *    support data_is_ptr we do not waste space for the count field either
+     */
+    if ( (p->addr > 0xffffful) || p->data_is_ptr || (p->count != 1) )
         return 0;
-    }
 
     bp.type = p->type;
     bp.dir  = p->dir;
+    bp.df   = p->df;
     switch ( p->size )
     {
     case 1:
diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/save.c
--- a/xen/arch/x86/hvm/save.c   Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/arch/x86/hvm/save.c   Thu Nov 08 09:37:06 2007 -0700
@@ -24,8 +24,7 @@
 #include <asm/hvm/support.h>
 #include <public/hvm/save.h>
 
-void
-arch_hvm_save(struct hvm_save_header *hdr)
+void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr)
 {
     uint32_t eax, ebx, ecx, edx;
 
@@ -36,10 +35,10 @@ arch_hvm_save(struct hvm_save_header *hd
     hdr->pad0 = 0;
 }
 
-int
-arch_hvm_load(struct hvm_save_header *hdr)
+int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr)
 {
     uint32_t eax, ebx, ecx, edx;
+
     if ( hdr->magic != HVM_FILE_MAGIC )
     {
         gdprintk(XENLOG_ERR, 
@@ -55,10 +54,13 @@ arch_hvm_load(struct hvm_save_header *hd
     }
 
     cpuid(1, &eax, &ebx, &ecx, &edx);
-    /*TODO: need to define how big a difference is acceptable */
+    /* TODO: need to define how big a difference is acceptable? */
     if ( hdr->cpuid != eax )
         gdprintk(XENLOG_WARNING, "HVM restore: saved CPUID (%#"PRIx32") "
                "does not match host (%#"PRIx32").\n", hdr->cpuid, eax);
+
+    /* VGA state is not saved/restored, so we nobble the cache. */
+    d->arch.hvm_domain.stdvga.cache = 0;
 
     return 0;
 }
diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/stdvga.c
--- a/xen/arch/x86/hvm/stdvga.c Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/arch/x86/hvm/stdvga.c Thu Nov 08 09:37:06 2007 -0700
@@ -220,7 +220,9 @@ static void stdvga_outb(uint64_t addr, u
         gdprintk(XENLOG_INFO, "entering stdvga and caching modes\n");
     }
     else if ( prev_stdvga && !s->stdvga )
+    {
         gdprintk(XENLOG_INFO, "leaving stdvga\n");
+    }
 }
 
 static void stdvga_outv(uint64_t addr, uint64_t data, uint32_t size)
@@ -636,7 +638,7 @@ int stdvga_intercept_mmio(ioreq_t *p)
             buf = mmio_op(s, p);
             break;
         default:
-            gdprintk(XENLOG_ERR, "unsupported mmio request type:%d "
+            gdprintk(XENLOG_WARNING, "unsupported mmio request type:%d "
                      "addr:0x%04x data:0x%04x size:%d count:%d state:%d "
                      "isptr:%d dir:%d df:%d\n",
                      p->type, (int)p->addr, (int)p->data, (int)p->size,
diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/vmx/vtd/intel-iommu.c
--- a/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c    Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c    Thu Nov 08 09:37:06 2007 -0700
@@ -115,18 +115,6 @@ static int device_context_mapped(struct 
     return ret;
 }
 
-/* page table handling */
-#define LEVEL_STRIDE        (9)
-#define LEVEL_MASK        ((1 << LEVEL_STRIDE) - 1)
-#define agaw_to_level(val) ((val) + 2)
-#define agaw_to_width(val) (30 + val * LEVEL_STRIDE)
-#define width_to_agaw(w)  ((w - 30)/LEVEL_STRIDE)
-#define level_to_offset_bits(l) (12 + (l - 1) * LEVEL_STRIDE)
-#define address_level_offset(addr, level) \
-    ((addr >> level_to_offset_bits(level)) & LEVEL_MASK)
-#define level_mask(l) (((u64)(-1)) << level_to_offset_bits(l))
-#define level_size(l) (1 << level_to_offset_bits(l))
-#define align_to_level(addr, l) ((addr + level_size(l) - 1) & level_mask(l))
 static struct page_info *addr_to_dma_page(struct domain *domain, u64 addr)
 {
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/vmx/vtd/utils.c
--- a/xen/arch/x86/hvm/vmx/vtd/utils.c  Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/arch/x86/hvm/vmx/vtd/utils.c  Thu Nov 08 09:37:06 2007 -0700
@@ -32,8 +32,9 @@
 
 #include <xen/mm.h>
 #include <xen/xmalloc.h>
-
-#define VTDPREFIX "[VT-D]" 
+#include <xen/inttypes.h>
+
+#define VTDPREFIX "[VT-D]"
 #define INTEL   0x8086
 #define SEABURG 0x4000
 #define C_STEP  2
@@ -93,47 +94,57 @@ void disable_pmr(struct iommu *iommu)
             "Disabled protected memory registers\n");
 }
 
-#if defined(__x86_64__)
+
 void print_iommu_regs(struct acpi_drhd_unit *drhd)
 {
     struct iommu *iommu = drhd->iommu;
- 
-    printk("---- print_iommu_regs ----\n"); 
+
+    printk("---- print_iommu_regs ----\n");
     printk("print_iommu_regs: drhd->address = %lx\n", drhd->address);
     printk("print_iommu_regs: DMAR_VER_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_VER_REG));
-    printk("print_iommu_regs: DMAR_CAP_REG = %lx\n",
-                   dmar_readq(iommu->reg,DMAR_CAP_REG));
-    printk("print_iommu_regs: n_fault_reg = %lx\n",
-                   cap_num_fault_regs(dmar_readq(iommu->reg, DMAR_CAP_REG)));
-    printk("print_iommu_regs: fault_recording_offset_l = %lx\n",
-                   cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)));
-    printk("print_iommu_regs: fault_recording_offset_h = %lx\n",
-                   cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)) 
+ 8);
-    printk("print_iommu_regs: fault_recording_reg_l = %lx\n",
-        dmar_readq(iommu->reg, cap_fault_reg_offset(dmar_readq(iommu->reg, 
DMAR_CAP_REG))));
-    printk("print_iommu_regs: fault_recording_reg_h = %lx\n",
-        dmar_readq(iommu->reg, cap_fault_reg_offset(dmar_readq(iommu->reg, 
DMAR_CAP_REG)) + 8));
-    printk("print_iommu_regs: DMAR_ECAP_REG = %lx\n",
-                   dmar_readq(iommu->reg,DMAR_ECAP_REG));
+           dmar_readl(iommu->reg,DMAR_VER_REG));
+    printk("print_iommu_regs: DMAR_CAP_REG = %"PRIx64"\n",
+           dmar_readq(iommu->reg,DMAR_CAP_REG));
+    printk("print_iommu_regs: n_fault_reg = %"PRIx64"\n",
+           cap_num_fault_regs(dmar_readq(iommu->reg, DMAR_CAP_REG)));
+    printk("print_iommu_regs: fault_recording_offset_l = %"PRIx64"\n",
+           cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)));
+    printk("print_iommu_regs: fault_recording_offset_h = %"PRIx64"\n",
+           cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)) + 8);
+    printk("print_iommu_regs: fault_recording_reg_l = %"PRIx64"\n",
+           dmar_readq(iommu->reg,
+               cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG))));
+    printk("print_iommu_regs: fault_recording_reg_h = %"PRIx64"\n",
+           dmar_readq(iommu->reg,
+               cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)) + 
8));
+    printk("print_iommu_regs: DMAR_ECAP_REG = %"PRIx64"\n",
+           dmar_readq(iommu->reg,DMAR_ECAP_REG));
     printk("print_iommu_regs: DMAR_GCMD_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_GCMD_REG));
+           dmar_readl(iommu->reg,DMAR_GCMD_REG));
     printk("print_iommu_regs: DMAR_GSTS_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_GSTS_REG));
-    printk("print_iommu_regs: DMAR_RTADDR_REG = %lx\n",
-                   dmar_readq(iommu->reg,DMAR_RTADDR_REG));
-    printk("print_iommu_regs: DMAR_CCMD_REG = %lx\n",
-                   dmar_readq(iommu->reg,DMAR_CCMD_REG));
+           dmar_readl(iommu->reg,DMAR_GSTS_REG));
+    printk("print_iommu_regs: DMAR_RTADDR_REG = %"PRIx64"\n",
+           dmar_readq(iommu->reg,DMAR_RTADDR_REG));
+    printk("print_iommu_regs: DMAR_CCMD_REG = %"PRIx64"\n",
+           dmar_readq(iommu->reg,DMAR_CCMD_REG));
     printk("print_iommu_regs: DMAR_FSTS_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_FSTS_REG));
+           dmar_readl(iommu->reg,DMAR_FSTS_REG));
     printk("print_iommu_regs: DMAR_FECTL_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_FECTL_REG));
+           dmar_readl(iommu->reg,DMAR_FECTL_REG));
     printk("print_iommu_regs: DMAR_FEDATA_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_FEDATA_REG));
+           dmar_readl(iommu->reg,DMAR_FEDATA_REG));
     printk("print_iommu_regs: DMAR_FEADDR_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_FEADDR_REG));
+           dmar_readl(iommu->reg,DMAR_FEADDR_REG));
     printk("print_iommu_regs: DMAR_FEUADDR_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_FEUADDR_REG));
+           dmar_readl(iommu->reg,DMAR_FEUADDR_REG));
+}
+
+u32 get_level_index(unsigned long gmfn, int level)
+{
+    while ( --level )
+        gmfn = gmfn >> LEVEL_STRIDE;
+
+    return gmfn & LEVEL_MASK;
 }
 
 void print_vtd_entries(struct domain *d, int bus, int devfn,
@@ -144,219 +155,120 @@ void print_vtd_entries(struct domain *d,
     struct iommu *iommu;
     struct context_entry *ctxt_entry;
     struct root_entry *root_entry;
-    u64 *l3, *l2, *l1;
-    u32 l3_index, l2_index, l1_index;
+    u64 *l4 = NULL, *l3, *l2, *l1;
+    u32 l4_index = 0, l3_index, l2_index, l1_index;
     u32 i = 0;
-
-    printk("print_vtd_entries: domain_id = %x bdf = %x:%x:%x devfn = %x, gmfn 
= %lx\n", d->domain_id, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), devfn, gmfn);
-
-    for_each_drhd_unit(drhd) {
+    int level = agaw_to_level(hd->agaw);
+
+    printk("print_vtd_entries: domain_id = %x bdf = %x:%x:%x gmfn = %lx\n",
+           d->domain_id, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), gmfn);
+
+    if ( hd->pgd == NULL )
+    {
+        printk("    hg->pgd == NULL\n");
+        return;
+    }
+    printk("    d->pgd = %p virt_to_maddr(hd->pgd) = %lx\n",
+           hd->pgd, virt_to_maddr(hd->pgd));
+
+    for_each_drhd_unit ( drhd )
+    {
         printk("---- print_vtd_entries %d ----\n", i++);
-
-        if (hd->pgd == NULL) {
-            printk("    hg->pgd == NULL\n");
-            return;
-        }
 
         iommu = drhd->iommu;
         root_entry = iommu->root_entry;
-        printk("    hd->pgd = %p virt_to_maddr(hd->pgd) = %lx\n",
-               hd->pgd, virt_to_maddr(hd->pgd));
-
         printk("    root_entry = %p\n", root_entry);
-        if (root_entry == NULL) {
+        if ( root_entry == NULL )
+        {
             printk("    root_entry == NULL\n");
-            return;
-        }
-
-        printk("    root_entry[%x] = %lx\n", bus, root_entry[bus].val);
+            continue;
+        }
+
+        printk("    root_entry[%x] = %"PRIx64"\n", bus, root_entry[bus].val);
         printk("    maddr_to_virt(root_entry[%x]) = %p\n",
-            bus, maddr_to_virt(root_entry[bus].val));
-
-        if (root_entry[bus].val == 0) {
+               bus, maddr_to_virt(root_entry[bus].val));
+
+        if ( root_entry[bus].val == 0 )
+        {
             printk("    root_entry[%x].lo == 0\n", bus);
-            return;
-        }
- 
-        ctxt_entry = maddr_to_virt((root_entry[bus].val >> PAGE_SHIFT) << 
PAGE_SHIFT);
-        if (ctxt_entry == NULL) {
+            continue;
+        }
+
+        ctxt_entry =
+            maddr_to_virt((root_entry[bus].val >> PAGE_SHIFT) << PAGE_SHIFT);
+        if ( ctxt_entry == NULL )
+        {
             printk("    ctxt_entry == NULL\n");
-            return;
-        }
-
-        if (ctxt_entry[devfn].lo == 0) {
+            continue;
+        }
+
+        if ( ctxt_entry[devfn].lo == 0 )
+        {
             printk("    ctxt_entry[%x].lo == 0\n", devfn);
-            return;
+            continue;
         }
 
         printk("    context = %p\n", ctxt_entry);
-        printk("    context[%x] = %lx %lx\n",
+        printk("    context[%x] = %"PRIx64" %"PRIx64"\n",
                devfn, ctxt_entry[devfn].hi, ctxt_entry[devfn].lo);
         printk("    maddr_to_virt(context[%x].lo) = %p\n",
                devfn, maddr_to_virt(ctxt_entry[devfn].lo));
-        printk("    context[%x] = %lx\n", devfn, ctxt_entry[devfn].lo); 
-
-        l3 = maddr_to_virt(ctxt_entry[devfn].lo);
-        l3 = (u64*)(((u64) l3 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
-        printk("    l3 = %p\n", l3); 
-        if (l3 == NULL) return;
-
-        l3_index = (gmfn >> 9 >> 9) & 0x1ff;
-        printk("    l3_index = %x\n", l3_index);
-        printk("    l3[%x] = %lx\n", l3_index, l3[l3_index]);
+        printk("    context[%x] = %"PRIx64"\n", devfn, ctxt_entry[devfn].lo);
+
+        switch ( level )
+        {
+        case VTD_PAGE_TABLE_LEVEL_3:
+            l3 = maddr_to_virt(ctxt_entry[devfn].lo);
+            l3 = (u64*)(((unsigned long)l3 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
+            printk("    l3 = %p\n", l3);
+            if ( l3 == NULL )
+                continue;
+            l3_index = get_level_index(gmfn, 3);
+            printk("    l3_index = %x\n", l3_index);
+            printk("    l3[%x] = %"PRIx64"\n", l3_index, l3[l3_index]);
+
+            break;
+        case VTD_PAGE_TABLE_LEVEL_4:
+            l4 = maddr_to_virt(ctxt_entry[devfn].lo);
+            l4 = (u64*)(((unsigned long)l4 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
+            printk("    l4 = %p\n", l4);
+            if ( l4 == NULL )
+                continue;
+            l4_index = get_level_index(gmfn, 4);
+            printk("    l4_index = %x\n", l4_index);
+            printk("    l4[%x] = %"PRIx64"\n", l4_index, l4[l4_index]);
+
+            l3 = maddr_to_virt(l4[l4_index]);
+            l3 = (u64*)(((unsigned long)l3 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
+            printk("    l3 = %p\n", l3);
+            if ( l3 == NULL )
+                continue;
+            l3_index = get_level_index(gmfn, 3);
+            printk("    l3_index = %x\n", l3_index);
+            printk("    l3[%x] = %"PRIx64"\n", l3_index, l3[l3_index]);
+
+            break;
+        default:
+            printk("Unsupported VTD page table level (%d)!\n", level);
+            continue;
+        }
 
         l2 = maddr_to_virt(l3[l3_index]);
-        l2 = (u64*)(((u64) l2 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
-        printk("    l2 = %p\n", l2); 
-        if (l2 == NULL) return;
-
-        l2_index = (gmfn >> 9) & 0x1ff;
-        printk("    gmfn = %lx\n", gmfn);
-        printk("    gmfn >> 9= %lx\n", gmfn >> 9);
+        l2 = (u64*)(((unsigned long)l2 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
+        printk("    l2 = %p\n", l2);
+        if ( l2 == NULL )
+            continue;
+        l2_index = get_level_index(gmfn, 2);
         printk("    l2_index = %x\n", l2_index);
-        printk("    l2[%x] = %lx\n", l2_index, l2[l2_index]);
+        printk("    l2[%x] = %"PRIx64"\n", l2_index, l2[l2_index]);
 
         l1 = maddr_to_virt(l2[l2_index]);
-        l1 = (u64*)(((u64) l1 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
-        if (l1 == NULL) return;
-        l1_index = gmfn & 0x1ff;
-        printk("    l1 = %p\n", l1); 
+        l1 = (u64*)(((unsigned long)l1 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
+        printk("    l1 = %p\n", l1);
+        if ( l1 == NULL )
+            continue;
+        l1_index = get_level_index(gmfn, 1);
         printk("    l1_index = %x\n", l1_index);
-        printk("    l1[%x] = %lx\n", l1_index, l1[l1_index]); 
-    }
-}
-
-#else    // !m64
-
-void print_iommu_regs(struct acpi_drhd_unit *drhd)
-{
-    struct iommu *iommu = drhd->iommu;
- 
-    printk("---- print_iommu_regs ----\n"); 
-    printk("print_iommu_regs: drhd->address = %lx\n", drhd->address);
-    printk("print_iommu_regs: DMAR_VER_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_VER_REG));
-    printk("print_iommu_regs: DMAR_CAP_REG = %llx\n",
-                   dmar_readq(iommu->reg,DMAR_CAP_REG));
-    printk("print_iommu_regs: n_fault_reg = %llx\n",
-                   cap_num_fault_regs(dmar_readq(iommu->reg, DMAR_CAP_REG)));
-    printk("print_iommu_regs: fault_recording_offset_l = %llx\n",
-                   cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)));
-    printk("print_iommu_regs: fault_recording_offset_h = %llx\n",
-                   cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)) 
+ 8);
-    printk("print_iommu_regs: fault_recording_reg_l = %llx\n",
-        dmar_readq(iommu->reg, cap_fault_reg_offset(dmar_readq(iommu->reg, 
DMAR_CAP_REG))));
-    printk("print_iommu_regs: fault_recording_reg_h = %llx\n",
-        dmar_readq(iommu->reg, cap_fault_reg_offset(dmar_readq(iommu->reg, 
DMAR_CAP_REG)) + 8));
-    printk("print_iommu_regs: DMAR_ECAP_REG = %llx\n",
-                   dmar_readq(iommu->reg,DMAR_ECAP_REG));
-    printk("print_iommu_regs: DMAR_GCMD_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_GCMD_REG));
-    printk("print_iommu_regs: DMAR_GSTS_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_GSTS_REG));
-    printk("print_iommu_regs: DMAR_RTADDR_REG = %llx\n",
-                   dmar_readq(iommu->reg,DMAR_RTADDR_REG));
-    printk("print_iommu_regs: DMAR_CCMD_REG = %llx\n",
-                   dmar_readq(iommu->reg,DMAR_CCMD_REG));
-    printk("print_iommu_regs: DMAR_FSTS_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_FSTS_REG));
-    printk("print_iommu_regs: DMAR_FECTL_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_FECTL_REG));
-    printk("print_iommu_regs: DMAR_FEDATA_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_FEDATA_REG));
-    printk("print_iommu_regs: DMAR_FEADDR_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_FEADDR_REG));
-    printk("print_iommu_regs: DMAR_FEUADDR_REG = %x\n",
-                   dmar_readl(iommu->reg,DMAR_FEUADDR_REG));
-}
-
-void print_vtd_entries(struct domain *d, int bus, int devfn,
-                       unsigned long gmfn)
-{
-    struct hvm_iommu *hd = domain_hvm_iommu(d);
-    struct acpi_drhd_unit *drhd;
-    struct iommu *iommu;
-    struct context_entry *ctxt_entry;
-    struct root_entry *root_entry;
-    u64 *l3, *l2, *l1;
-    u32 l3_index, l2_index, l1_index;
-    u32 i = 0;
-
-    printk("print_vtd_entries: domain_id = %x bdf = %x:%x:%x devfn = %x, gmfn 
= %lx\n", d->domain_id, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), devfn, gmfn);
-
-    for_each_drhd_unit(drhd) {
-        printk("---- print_vtd_entries %d ----\n", i++);
-
-        if (hd->pgd == NULL) {
-            printk("    hg->pgd == NULL\n");
-            return;
-        }
-
-        iommu = drhd->iommu;
-        root_entry = iommu->root_entry;
-        printk("    d->pgd = %p virt_to_maddr(hd->pgd) = %lx\n",
-               hd->pgd, virt_to_maddr(hd->pgd));
-
-        printk("    root_entry = %p\n", root_entry);
-        if (root_entry == NULL) {
-            printk("    root_entry == NULL\n");
-            return;
-        }
-
-        printk("    root_entry[%x] = %llx\n", bus, root_entry[bus].val);
-        printk("    maddr_to_virt(root_entry[%x]) = %p\n",
-            bus, maddr_to_virt(root_entry[bus].val));
-
-        if (root_entry[bus].val == 0) {
-            printk("    root_entry[%x].lo == 0\n", bus);
-            return;
-        }
- 
-        ctxt_entry = maddr_to_virt((root_entry[bus].val >> PAGE_SHIFT) << 
PAGE_SHIFT);
-        if (ctxt_entry == NULL) {
-            printk("    ctxt_entry == NULL\n");
-            return;
-        }
-
-        if (ctxt_entry[devfn].lo == 0) {
-            printk("    ctxt_entry[%x].lo == 0\n", devfn);
-            return;
-        }
-
-        printk("    context = %p\n", ctxt_entry);
-        printk("    context[%x] = %llx %llx\n",
-               devfn, ctxt_entry[devfn].hi, ctxt_entry[devfn].lo);
-        printk("    maddr_to_virt(context[%x].lo) = %p\n",
-               devfn, maddr_to_virt(ctxt_entry[devfn].lo));
-        printk("    context[%x] = %llx\n", devfn, ctxt_entry[devfn].lo); 
-
-        l3 = maddr_to_virt(ctxt_entry[devfn].lo);
-        l3 = (u64*)(((u32) l3 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
-        printk("    l3 = %p\n", l3); 
-        if (l3 == NULL) return;
-
-        l3_index = (gmfn >> 9 >> 9) & 0x1ff;
-        printk("    l3_index = %x\n", l3_index);
-        printk("    l3[%x] = %llx\n", l3_index, l3[l3_index]);
-
-        l2 = maddr_to_virt(l3[l3_index]);
-        l2 = (u64*)(((u32) l2 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
-        printk("    l2 = %p\n", l2); 
-        if (l2 == NULL) return;
-
-        l2_index = (gmfn >> 9) & 0x1ff;
-        printk("    gmfn = %lx\n", gmfn);
-        printk("    gmfn >> 9= %lx\n", gmfn >> 9);
-        printk("    l2_index = %x\n", l2_index);
-        printk("    l2[%x] = %llx\n", l2_index, l2[l2_index]);
-
-        l1 = maddr_to_virt(l2[l2_index]);
-        l1 = (u64*)(((u32) l1 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K);
-        if (l1 == NULL) return;
-        l1_index = gmfn & 0x1ff;
-        printk("    l1 = %p\n", l1); 
-        printk("    l1_index = %x\n", l1_index);
-        printk("    l1[%x] = %llx\n", l1_index, l1[l1_index]); 
-    }
-}
-#endif    // !m64
+        printk("    l1[%x] = %"PRIx64"\n", l1_index, l1[l1_index]);
+   }
+}
diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/vpt.c
--- a/xen/arch/x86/hvm/vpt.c    Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/arch/x86/hvm/vpt.c    Thu Nov 08 09:37:06 2007 -0700
@@ -56,17 +56,9 @@ static void pt_process_missed_ticks(stru
     if ( missed_ticks <= 0 )
         return;
 
-    if ( mode_is(pt->vcpu->domain, no_missed_tick_accounting) )
-    {
-        pt->pending_intr_nr = 1;
-        pt->scheduled = now + pt->period;
-    }
-    else
-    {
-        missed_ticks = missed_ticks / (s_time_t) pt->period + 1;
-        pt->pending_intr_nr += missed_ticks;
-        pt->scheduled += missed_ticks * pt->period;
-    }
+    missed_ticks = missed_ticks / (s_time_t) pt->period + 1;
+    pt->pending_intr_nr += missed_ticks;
+    pt->scheduled += missed_ticks * pt->period;
 }
 
 static void pt_freeze_time(struct vcpu *v)
@@ -131,10 +123,7 @@ static void pt_timer_fn(void *data)
 
     pt_lock(pt);
 
-    if ( mode_is(pt->vcpu->domain, no_missed_tick_accounting) )
-        pt->pending_intr_nr = 1;
-    else
-        pt->pending_intr_nr++;
+    pt->pending_intr_nr++;
 
     if ( !pt->one_shot )
     {
@@ -235,11 +224,16 @@ void pt_intr_post(struct vcpu *v, struct
     }
     else
     {
-        pt->pending_intr_nr--;
         if ( mode_is(v->domain, no_missed_tick_accounting) )
+        {
             pt->last_plt_gtime = hvm_get_guest_time(v);
+            pt->pending_intr_nr = 0; /* 'collapse' all missed ticks */
+        }
         else
+        {
             pt->last_plt_gtime += pt->period_cycles;
+            pt->pending_intr_nr--;
+        }
     }
 
     if ( mode_is(v->domain, delay_for_missed_ticks) &&
diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/arch/x86/mm.c Thu Nov 08 09:37:06 2007 -0700
@@ -674,7 +674,7 @@ get_page_from_l1e(
         uint32_t x, nx, y = page->count_info;
         uint32_t cacheattr = pte_flags_to_cacheattr(l1f);
 
-        if ( is_xen_heap_frame(page) )
+        if ( is_xen_heap_page(page) )
         {
             if ( (l1f & _PAGE_RW) &&
                  !(unlikely(paging_mode_external(d) &&
@@ -1866,7 +1866,7 @@ void cleanup_page_cacheattr(struct page_
 
     page->count_info &= ~PGC_cacheattr_mask;
 
-    BUG_ON(is_xen_heap_frame(page));
+    BUG_ON(is_xen_heap_page(page));
 
 #ifdef __x86_64__
     map_pages_to_xen((unsigned long)page_to_virt(page), page_to_mfn(page),
@@ -3200,7 +3200,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
         prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
         if ( mfn_valid(prev_mfn) )
         {
-            if ( is_xen_heap_frame(mfn_to_page(prev_mfn)) )
+            if ( is_xen_heap_mfn(prev_mfn) )
                 /* Xen heap frames are simply unhooked from this phys slot. */
                 guest_physmap_remove_page(d, xatp.gpfn, prev_mfn);
             else
@@ -3583,7 +3583,7 @@ void free_xen_pagetable(void *v)
 
     BUG_ON(early_boot);
     
-    if ( is_xen_heap_frame(virt_to_page(v)) )
+    if ( is_xen_heap_page(virt_to_page(v)) )
         free_xenheap_page(v);
     else
         free_domheap_page(virt_to_page(v));
diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c    Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/arch/x86/mm/shadow/multi.c    Thu Nov 08 09:37:06 2007 -0700
@@ -745,10 +745,11 @@ _sh_propagate(struct vcpu *v,
 
     /*
      * For HVM domains with direct access to MMIO areas, set the correct
-     * caching attributes in the shadows to match what was asked for
+     * caching attributes in the shadows to match what was asked for.
      */
     if ( (level == 1) && is_hvm_domain(d) &&
-         !list_empty(&(domain_hvm_iommu(d)->pdev_list)) )
+         !list_empty(&(domain_hvm_iommu(d)->pdev_list)) &&
+         !is_xen_heap_mfn(mfn_x(target_mfn)) )
     {
         unsigned int type;
         if ( hvm_get_mem_pinned_cacheattr(d, gfn_x(target_gfn), &type) )
diff -r d0cd18d78074 -r ee935d2b8a63 xen/common/grant_table.c
--- a/xen/common/grant_table.c  Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/common/grant_table.c  Thu Nov 08 09:37:06 2007 -0700
@@ -1057,7 +1057,7 @@ gnttab_transfer(
         }
 
         page = mfn_to_page(mfn);
-        if ( unlikely(is_xen_heap_frame(page)) )
+        if ( unlikely(is_xen_heap_page(page)) )
         { 
             gdprintk(XENLOG_INFO, "gnttab_transfer: xen frame %lx\n",
                     (unsigned long)gop.mfn);
diff -r d0cd18d78074 -r ee935d2b8a63 xen/common/hvm/save.c
--- a/xen/common/hvm/save.c     Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/common/hvm/save.c     Thu Nov 08 09:37:06 2007 -0700
@@ -94,7 +94,7 @@ int hvm_save(struct domain *d, hvm_domai
     else 
         hdr.changeset = -1ULL; /* Unknown */
 
-    arch_hvm_save(&hdr);
+    arch_hvm_save(d, &hdr);
 
     if ( hvm_save_entry(HEADER, 0, h, &hdr) != 0 )
     {
@@ -144,7 +144,7 @@ int hvm_load(struct domain *d, hvm_domai
     if ( hvm_load_entry(HEADER, h, &hdr) != 0 ) 
         return -1;
 
-    if ( arch_hvm_load(&hdr) )
+    if ( arch_hvm_load(d, &hdr) )
         return -1;
 
     c = strrchr(xen_changeset(), ':');
diff -r d0cd18d78074 -r ee935d2b8a63 xen/common/page_alloc.c
--- a/xen/common/page_alloc.c   Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/common/page_alloc.c   Thu Nov 08 09:37:06 2007 -0700
@@ -559,8 +559,7 @@ static unsigned long avail_heap_pages(
     return free_pages;
 }
 
-#define avail_for_domheap(mfn) \
-    (!allocated_in_map(mfn) && !is_xen_heap_frame(mfn_to_page(mfn)))
+#define avail_for_domheap(mfn) !(allocated_in_map(mfn) || is_xen_heap_mfn(mfn))
 void __init end_boot_allocator(void)
 {
     unsigned long i;
@@ -615,7 +614,7 @@ void __init scrub_heap_pages(void)
         /* Re-check page status with lock held. */
         if ( !allocated_in_map(mfn) )
         {
-            if ( is_xen_heap_frame(mfn_to_page(mfn)) )
+            if ( is_xen_heap_mfn(mfn) )
             {
                 p = page_to_virt(mfn_to_page(mfn));
                 memguard_unguard_range(p, PAGE_SIZE);
@@ -655,9 +654,9 @@ void init_xenheap_pages(paddr_t ps, padd
      * Yuk! Ensure there is a one-page buffer between Xen and Dom zones, to
      * prevent merging of power-of-two blocks across the zone boundary.
      */
-    if ( ps && !is_xen_heap_frame(maddr_to_page(ps)-1) )
+    if ( ps && !is_xen_heap_mfn(paddr_to_pfn(ps)-1) )
         ps += PAGE_SIZE;
-    if ( !is_xen_heap_frame(maddr_to_page(pe)) )
+    if ( !is_xen_heap_mfn(paddr_to_pfn(pe)) )
         pe -= PAGE_SIZE;
 
     init_heap_pages(MEMZONE_XEN, maddr_to_page(ps), (pe - ps) >> PAGE_SHIFT);
@@ -838,7 +837,7 @@ void free_domheap_pages(struct page_info
 
     ASSERT(!in_irq());
 
-    if ( unlikely(is_xen_heap_frame(pg)) )
+    if ( unlikely(is_xen_heap_page(pg)) )
     {
         /* NB. May recursively lock from relinquish_memory(). */
         spin_lock_recursive(&d->page_alloc_lock);
diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/include/asm-ia64/mm.h Thu Nov 08 09:37:06 2007 -0700
@@ -115,8 +115,9 @@ struct page_info
  /* 29-bit count of references to this frame. */
 #define PGC_count_mask      ((1UL<<29)-1)
 
-#define is_xen_heap_frame(pfn) ((page_to_maddr(pfn) < xenheap_phys_end) \
-                                && (page_to_maddr(pfn) >= xen_pstart))
+#define is_xen_heap_mfn(mfn)   (((mfn) < paddr_to_pfn(xenheap_phys_end)) \
+                                && ((mfn) >= paddr_to_pfn(xen_pstart)))
+#define is_xen_heap_page(page) is_xen_heap_mfn(page_to_mfn(page))
 
 extern void* xen_pickle_offset;
 #define __pickle(a)    ((unsigned long)a - (unsigned long)xen_pickle_offset)
diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/asm-powerpc/mm.h
--- a/xen/include/asm-powerpc/mm.h      Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/include/asm-powerpc/mm.h      Thu Nov 08 09:37:06 2007 -0700
@@ -111,7 +111,8 @@ struct page_info
  /* 29-bit count of references to this frame. */
 #define PGC_count_mask      ((1UL<<28)-1)
 
-#define is_xen_heap_frame(pfn) (page_to_maddr(pfn) < xenheap_phys_end)
+#define is_xen_heap_mfn(mfn)   ((mfn) < paddr_to_pfn(xenheap_phys_end))
+#define is_xen_heap_page(page) (page_to_maddr(page) < xenheap_phys_end)
 
 static inline struct domain *unpickle_domptr(u32 _domain)
 { return ((_domain == 0) || (_domain & 1)) ? NULL : __va(_domain); }
diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/asm-x86/hvm/vmx/intel-iommu.h
--- a/xen/include/asm-x86/hvm/vmx/intel-iommu.h Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/include/asm-x86/hvm/vmx/intel-iommu.h Thu Nov 08 09:37:06 2007 -0700
@@ -230,6 +230,19 @@ struct context_entry {
     do {(c).hi &= 0xff; (c).hi |= ((val + 1) & ((1 << 16) - 1)) << 8;} while(0)
 #define context_clear_entry(c) do {(c).lo = 0; (c).hi = 0;} while(0)
 
+/* page table handling */
+#define LEVEL_STRIDE       (9)
+#define LEVEL_MASK         ((1 << LEVEL_STRIDE) - 1)
+#define agaw_to_level(val) ((val) + 2)
+#define agaw_to_width(val) (30 + val * LEVEL_STRIDE)
+#define width_to_agaw(w)   ((w - 30)/LEVEL_STRIDE)
+#define level_to_offset_bits(l) (12 + (l - 1) * LEVEL_STRIDE)
+#define address_level_offset(addr, level) \
+            ((addr >> level_to_offset_bits(level)) & LEVEL_MASK)
+#define level_mask(l) (((u64)(-1)) << level_to_offset_bits(l))
+#define level_size(l) (1 << level_to_offset_bits(l))
+#define align_to_level(addr, l) ((addr + level_size(l) - 1) & level_mask(l))
+
 /*
  * 0: readable
  * 1: writable
diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/asm-x86/mm.h
--- a/xen/include/asm-x86/mm.h  Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/include/asm-x86/mm.h  Thu Nov 08 09:37:06 2007 -0700
@@ -102,9 +102,11 @@ struct page_info
  /* 26-bit count of references to this frame. */
 #define PGC_count_mask      ((1U<<26)-1)
 
-#define is_xen_heap_frame(pfn) ({                                       \
-    paddr_t maddr = page_to_maddr(pfn);                                 \
-    ((maddr >= xenheap_phys_start) && (maddr < xenheap_phys_end));      \
+#define is_xen_heap_page(page) is_xen_heap_mfn(page_to_mfn(page))
+#define is_xen_heap_mfn(mfn) ({                         \
+    unsigned long _mfn = (mfn);                         \
+    ((_mfn >= paddr_to_pfn(xenheap_phys_start)) &&      \
+     (_mfn < paddr_to_pfn(xenheap_phys_end)));          \
 })
 
 #if defined(__i386__)
diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/public/hvm/ioreq.h
--- a/xen/include/public/hvm/ioreq.h    Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/include/public/hvm/ioreq.h    Thu Nov 08 09:37:06 2007 -0700
@@ -78,11 +78,12 @@ typedef struct shared_iopage shared_iopa
 typedef struct shared_iopage shared_iopage_t;
 
 struct buf_ioreq {
-    uint8_t  type;   /*  I/O type                    */
-    uint8_t  dir:1;  /*  1=read, 0=write             */
-    uint8_t  size:2; /*  0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */
-    uint32_t addr:20;/*  physical address            */
-    uint32_t data;   /*  data                        */
+    uint8_t  type;   /* I/O type                    */
+    uint8_t  df:1;   /* EFLAGS.DF                   */
+    uint8_t  dir:1;  /* 1=read, 0=write             */
+    uint8_t  size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */
+    uint32_t addr:20;/* physical address            */
+    uint32_t data;   /* data                        */
 };
 typedef struct buf_ioreq buf_ioreq_t;
 
diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/xen/hvm/save.h
--- a/xen/include/xen/hvm/save.h        Wed Nov 07 15:11:44 2007 -0700
+++ b/xen/include/xen/hvm/save.h        Thu Nov 08 09:37:06 2007 -0700
@@ -155,7 +155,7 @@ int hvm_load(struct domain *d, hvm_domai
 
 /* Arch-specific definitions. */
 struct hvm_save_header;
-void arch_hvm_save(struct hvm_save_header *hdr);
-int arch_hvm_load(struct hvm_save_header *hdr);
+void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr);
+int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr);
 
 #endif /* __XEN_HVM_SAVE_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®.