[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 1189195010 21600
# Node ID f16bff0934d7ea2f000b166c05fb6b2fd8103fa9
# Parent  192f2df46e67f02695e9ed3a39c1d831562ae6c9
# Parent  a53aaea4c69813a7143daa677b9e65d1d2f15b6b
merge with xen-unstable.hg (staging)
---
 tools/Makefile                                             |    2 
 tools/check/Makefile                                       |    4 
 tools/check/check_xml2                                     |    2 
 tools/ioemu/hw/cirrus_vga.c                                |    2 
 tools/ioemu/vl.c                                           |    2 
 tools/libxc/xc_misc.c                                      |   33 +++++
 tools/libxc/xenctrl.h                                      |    8 +
 tools/python/xen/xend/XendDomain.py                        |    4 
 tools/python/xen/xend/XendDomainInfo.py                    |   19 ++
 tools/python/xen/xend/server/XMLRPCServer.py               |    2 
 tools/python/xen/xm/main.py                                |   11 -
 tools/security/Makefile                                    |    2 
 tools/xenfb/xenfb.c                                        |   10 -
 tools/xenstore/xenstored_core.c                            |    8 -
 unmodified_drivers/linux-2.6/platform-pci/machine_reboot.c |   12 +
 xen/arch/x86/domain.c                                      |    4 
 xen/arch/x86/hvm/hvm.c                                     |   24 ---
 xen/arch/x86/hvm/svm/svm.c                                 |   56 ++++----
 xen/arch/x86/hvm/vmx/vmx.c                                 |   84 ++++++-------
 xen/arch/x86/mm/shadow/multi.c                             |   14 --
 20 files changed, 167 insertions(+), 136 deletions(-)

diff -r 192f2df46e67 -r f16bff0934d7 tools/Makefile
--- a/tools/Makefile    Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/Makefile    Fri Sep 07 13:56:50 2007 -0600
@@ -10,7 +10,7 @@ SUBDIRS-y += xentrace
 SUBDIRS-y += xentrace
 SUBDIRS-$(CONFIG_XCUTILS) += xcutils
 SUBDIRS-$(CONFIG_X86) += firmware
-SUBDIRS-y += security
+SUBDIRS-$(ACM_SECURITY) += security
 SUBDIRS-y += console
 SUBDIRS-y += xenmon
 SUBDIRS-y += guest-headers
diff -r 192f2df46e67 -r f16bff0934d7 tools/check/Makefile
--- a/tools/check/Makefile      Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/check/Makefile      Fri Sep 07 13:56:50 2007 -0600
@@ -7,7 +7,7 @@ all: build
 # Check this machine is OK for building on.
 .PHONY: build
 build:
-       XENFB_TOOLS=$(XENFB_TOOLS) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) 
./chk build
+       XENFB_TOOLS=$(XENFB_TOOLS) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) 
ACM_SECURITY=$(ACM_SECURITY) ./chk build
 
 # Check this machine is OK for installing on.
 # DO NOT use this check from 'make install' in the parent
@@ -15,7 +15,7 @@ build:
 # copy rather than actually installing.
 .PHONY: install
 install:
-       XENFB_TOOLS=$(XENFB_TOOLS) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) 
./chk install
+       XENFB_TOOLS=$(XENFB_TOOLS) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) 
ACM_SECURITY=$(ACM_SECURITY) ./chk install
 
 .PHONY: clean
 clean:
diff -r 192f2df46e67 -r f16bff0934d7 tools/check/check_xml2
--- a/tools/check/check_xml2    Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/check/check_xml2    Fri Sep 07 13:56:50 2007 -0600
@@ -1,7 +1,7 @@
 #!/bin/sh
 # CHECK-BUILD CHECK-INSTALL
 
-if [ ! "$LIBXENAPI_BINDINGS" = "y" ]
+if [ ! "$LIBXENAPI_BINDINGS" = "y" -a ! "$ACM_SECURITY" = "y" ]
 then
     echo -n "unused, "
     exit 0
diff -r 192f2df46e67 -r f16bff0934d7 tools/ioemu/hw/cirrus_vga.c
--- a/tools/ioemu/hw/cirrus_vga.c       Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/ioemu/hw/cirrus_vga.c       Fri Sep 07 13:56:50 2007 -0600
@@ -2565,7 +2565,7 @@ static void *set_vram_mapping(unsigned l
         return NULL;
     }
 
-    vram_pointer = xc_map_foreign_batch(xc_handle, domid,
+    vram_pointer = xc_map_foreign_pages(xc_handle, domid,
                                         PROT_READ|PROT_WRITE,
                                         extent_start, nr_extents);
     if (vram_pointer == NULL) {
diff -r 192f2df46e67 -r f16bff0934d7 tools/ioemu/vl.c
--- a/tools/ioemu/vl.c  Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/ioemu/vl.c  Fri Sep 07 13:56:50 2007 -0600
@@ -6948,7 +6948,7 @@ static void qemu_remap_bucket(struct map
         j = ((i + BITS_PER_LONG) > (MCACHE_BUCKET_SIZE >> PAGE_SHIFT)) ?
             (MCACHE_BUCKET_SIZE >> PAGE_SHIFT) % BITS_PER_LONG : BITS_PER_LONG;
         while (j > 0)
-            word = (word << 1) | !(pfns[i + --j] & 0xF0000000UL);
+            word = (word << 1) | (((pfns[i + --j] >> 28) & 0xf) != 0xf);
         entry->valid_mapping[i / BITS_PER_LONG] = word;
     }
 }
diff -r 192f2df46e67 -r f16bff0934d7 tools/libxc/xc_misc.c
--- a/tools/libxc/xc_misc.c     Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/libxc/xc_misc.c     Fri Sep 07 13:56:50 2007 -0600
@@ -224,6 +224,39 @@ int xc_hvm_set_pci_link_route(
     unlock_pages(&arg, sizeof(arg));
 
     return rc;
+}
+
+void *xc_map_foreign_pages(int xc_handle, uint32_t dom, int prot,
+                           const xen_pfn_t *arr, int num)
+{
+    xen_pfn_t *pfn;
+    void *res;
+    int i;
+
+    pfn = malloc(num * sizeof(*pfn));
+    if (!pfn)
+        return NULL;
+    memcpy(pfn, arr, num * sizeof(*pfn));
+
+    res = xc_map_foreign_batch(xc_handle, dom, prot, pfn, num);
+    if (res) {
+        for (i = 0; i < num; i++) {
+            if ((pfn[i] & 0xF0000000UL) == 0xF0000000UL) {
+                /*
+                 * xc_map_foreign_batch() doesn't give us an error
+                 * code, so we have to make one up.  May not be the
+                 * appropriate one.
+                 */
+                errno = EINVAL;
+                munmap(res, num * PAGE_SIZE);
+                res = NULL;
+                break;
+            }
+        }
+    }
+
+    free(pfn);
+    return res;
 }
 
 /*
diff -r 192f2df46e67 -r f16bff0934d7 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/libxc/xenctrl.h     Fri Sep 07 13:56:50 2007 -0600
@@ -646,6 +646,14 @@ void *xc_map_foreign_range(int xc_handle
                             int size, int prot,
                             unsigned long mfn );
 
+void *xc_map_foreign_pages(int xc_handle, uint32_t dom, int prot,
+                           const xen_pfn_t *arr, int num );
+
+/**
+ * Like xc_map_foreign_pages(), except it can succeeed partially.
+ * When a page cannot be mapped, its PFN in @arr is or'ed with
+ * 0xF0000000 to indicate the error.
+ */
 void *xc_map_foreign_batch(int xc_handle, uint32_t dom, int prot,
                            xen_pfn_t *arr, int num );
 
diff -r 192f2df46e67 -r f16bff0934d7 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py       Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/python/xen/xend/XendDomain.py       Fri Sep 07 13:56:50 2007 -0600
@@ -1594,10 +1594,10 @@ class XendDomain:
             raise VMBadState("Domain '%s' is not started" % domid,
                              POWER_STATE_NAMES[DOM_STATE_RUNNING],
                              POWER_STATE_NAMES[dominfo._stateGet()])
-        if trigger_name.lower() in TRIGGER_TYPE: 
+        if trigger_name.lower() in TRIGGER_TYPE.keys(): 
             trigger = TRIGGER_TYPE[trigger_name.lower()]
         else:
-            raise XendError("Invalid trigger: %s", trigger_name)
+            raise XendError("Invalid trigger: %s" % trigger_name)
         try:
             return xc.domain_send_trigger(dominfo.getDomid(),
                                           trigger,
diff -r 192f2df46e67 -r f16bff0934d7 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/python/xen/xend/XendDomainInfo.py   Fri Sep 07 13:56:50 2007 -0600
@@ -602,16 +602,16 @@ class XendDomainInfo:
                                     mac = x[1]
                                     break
                             break
-                    dev_info = self.getDeviceInfo_vif(mac)
+                    dev_info = self._getDeviceInfo_vif(mac)
                 else:
                     _, dev_info = sxprs[dev]
             else:  # 'vbd' or 'tap'
-                dev_info = self.getDeviceInfo_vbd(dev)
+                dev_info = self._getDeviceInfo_vbd(dev)
                 # To remove the UUID of the device from refs,
                 # deviceClass must be always 'vbd'.
                 deviceClass = 'vbd'
             if dev_info is None:
-                return rc
+                raise XendError("Device %s is not defined" % devid)
 
             dev_uuid = sxp.child_value(dev_info, 'uuid')
             del self.info['devices'][dev_uuid]
@@ -632,14 +632,22 @@ class XendDomainInfo:
                     dev_num += 1
             return sxprs
 
-    def getDeviceInfo_vif(self, mac):
+    def getBlockDeviceClass(self, devid):
+        # To get a device number from the devid,
+        # we temporarily use the device controller of VBD.
+        dev = self.getDeviceController('vbd').convertToDeviceNumber(devid)
+        dev_info = self._getDeviceInfo_vbd(dev)
+        if dev_info:
+            return dev_info[0]
+
+    def _getDeviceInfo_vif(self, mac):
         for dev_type, dev_info in self.info.all_devices_sxpr():
             if dev_type != 'vif':
                 continue
             if mac == sxp.child_value(dev_info, 'mac'):
                 return dev_info
 
-    def getDeviceInfo_vbd(self, devid):
+    def _getDeviceInfo_vbd(self, devid):
         for dev_type, dev_info in self.info.all_devices_sxpr():
             if dev_type != 'vbd' and dev_type != 'tap':
                 continue
@@ -1309,6 +1317,7 @@ class XendDomainInfo:
             try:
                 new_dom = XendDomain.instance().domain_create_from_dict(
                     self.info)
+                new_dom.waitForDevices()
                 new_dom.unpause()
                 rst_cnt = self._readVm('xend/restart_count')
                 rst_cnt = int(rst_cnt) + 1
diff -r 192f2df46e67 -r f16bff0934d7 
tools/python/xen/xend/server/XMLRPCServer.py
--- a/tools/python/xen/xend/server/XMLRPCServer.py      Thu Sep 06 15:04:07 
2007 -0600
+++ b/tools/python/xen/xend/server/XMLRPCServer.py      Fri Sep 07 13:56:50 
2007 -0600
@@ -87,7 +87,7 @@ methods = ['device_create', 'device_conf
            'destroyDevice','getDeviceSxprs',
            'setMemoryTarget', 'setName', 'setVCpuCount', 'shutdown',
            'send_sysrq', 'getVCPUInfo', 'waitForDevices',
-           'getRestartCount']
+           'getRestartCount', 'getBlockDeviceClass']
 
 exclude = ['domain_create', 'domain_restore']
 
diff -r 192f2df46e67 -r f16bff0934d7 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/python/xen/xm/main.py       Fri Sep 07 13:56:50 2007 -0600
@@ -2217,12 +2217,13 @@ def xm_block_detach(args):
                               % (dev,dom))
     else:
         arg_check(args, 'block-detach', 2, 3)
-        try:
+        dom = args[0]
+        dev = args[1]
+        dc = server.xend.domain.getBlockDeviceClass(dom, dev)
+        if dc == "tap":
+            detach(args, 'tap')
+        else:
             detach(args, 'vbd')
-            return
-        except:
-            pass
-        detach(args, 'tap')
 
 def xm_network_detach(args):
     if serverType == SERVER_XEN_API:
diff -r 192f2df46e67 -r f16bff0934d7 tools/security/Makefile
--- a/tools/security/Makefile   Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/security/Makefile   Fri Sep 07 13:56:50 2007 -0600
@@ -66,7 +66,7 @@ install: all $(ACM_CONFIG_FILE)
        $(INSTALL_DIR) $(DESTDIR)$(ACM_SECGEN_CGIDIR)
        $(INSTALL_PROG) $(ACM_INST_CGI) $(DESTDIR)$(ACM_SECGEN_CGIDIR)
 ifndef XEN_PYTHON_NATIVE_INSTALL
-       python python/setup.py install --home="$(DESTDIR)/usr" 
--install-lib="$(DESTDIR)$(LIBPATH)/python"
+       python python/setup.py install 
--install-lib="$(DESTDIR)$(LIBPATH)/python"
 else
        python python/setup.py install --root="$(DESTDIR)"
 endif
diff -r 192f2df46e67 -r f16bff0934d7 tools/xenfb/xenfb.c
--- a/tools/xenfb/xenfb.c       Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/xenfb/xenfb.c       Fri Sep 07 13:56:50 2007 -0600
@@ -398,21 +398,15 @@ static int xenfb_map_fb(struct xenfb_pri
        if (!pgmfns || !fbmfns)
                goto out;
 
-       /*
-        * Bug alert: xc_map_foreign_batch() can fail partly and
-        * return a non-null value.  This is a design flaw.  When it
-        * happens, we happily continue here, and later crash on
-        * access.
-        */
        xenfb_copy_mfns(mode, n_fbdirs, pgmfns, pd);
-       map = xc_map_foreign_batch(xenfb->xc, domid,
+       map = xc_map_foreign_pages(xenfb->xc, domid,
                                   PROT_READ, pgmfns, n_fbdirs);
        if (map == NULL)
                goto out;
        xenfb_copy_mfns(mode, n_fbmfns, fbmfns, map);
        munmap(map, n_fbdirs * XC_PAGE_SIZE);
 
-       xenfb->pub.pixels = xc_map_foreign_batch(xenfb->xc, domid,
+       xenfb->pub.pixels = xc_map_foreign_pages(xenfb->xc, domid,
                                PROT_READ | PROT_WRITE, fbmfns, n_fbmfns);
        if (xenfb->pub.pixels == NULL)
                goto out;
diff -r 192f2df46e67 -r f16bff0934d7 tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c   Thu Sep 06 15:04:07 2007 -0600
+++ b/tools/xenstore/xenstored_core.c   Fri Sep 07 13:56:50 2007 -0600
@@ -1878,14 +1878,14 @@ int main(int argc, char *argv[])
                fflush(stdout);
        }
 
-       /* close stdin/stdout now we're ready to accept connections */
+       /* redirect to /dev/null now we're ready to accept connections */
        if (dofork) {
                int devnull = open("/dev/null", O_RDWR);
                if (devnull == -1)
                        barf_perror("Could not open /dev/null\n");
-               close(STDIN_FILENO);  dup2(STDIN_FILENO, devnull);
-               close(STDOUT_FILENO); dup2(STDOUT_FILENO, devnull);
-               close(STDERR_FILENO); dup2(STDERR_FILENO, devnull);
+               dup2(devnull, STDIN_FILENO);
+               dup2(devnull, STDOUT_FILENO);
+               dup2(devnull, STDERR_FILENO);
                close(devnull);
                xprintf = trace;
        }
diff -r 192f2df46e67 -r f16bff0934d7 
unmodified_drivers/linux-2.6/platform-pci/machine_reboot.c
--- a/unmodified_drivers/linux-2.6/platform-pci/machine_reboot.c        Thu Sep 
06 15:04:07 2007 -0600
+++ b/unmodified_drivers/linux-2.6/platform-pci/machine_reboot.c        Fri Sep 
07 13:56:50 2007 -0600
@@ -17,6 +17,8 @@ struct ap_suspend_info {
  * while the BSP is re-initializing it after restore.
  */
 static DEFINE_RWLOCK(suspend_lock);
+
+#ifdef CONFIG_SMP
 
 /*
  * Spinning prevents, for example, APs touching grant table entries while
@@ -42,6 +44,14 @@ static void ap_suspend(void *_info)
        mb();
        atomic_dec(&info->nr_spinning);
 }
+
+#define initiate_ap_suspend(i) smp_call_function(ap_suspend, i, 0, 0)
+
+#else /* !defined(CONFIG_SMP) */
+
+#define initiate_ap_suspend(i) 0
+
+#endif
 
 static int bp_suspend(void)
 {
@@ -80,7 +90,7 @@ int __xen_suspend(int fast_suspend)
 
        nr_cpus = num_online_cpus() - 1;
 
-       err = smp_call_function(ap_suspend, &info, 0, 0);
+       err = initiate_ap_suspend(&info);
        if (err < 0) {
                preempt_enable();
                xenbus_suspend_cancel();
diff -r 192f2df46e67 -r f16bff0934d7 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Thu Sep 06 15:04:07 2007 -0600
+++ b/xen/arch/x86/domain.c     Fri Sep 07 13:56:50 2007 -0600
@@ -1761,8 +1761,8 @@ int domain_relinquish_resources(struct d
         /* fallthrough */
 
         /* Relinquish every page of memory. */
+    case RELMEM_xen_l4:
 #if CONFIG_PAGING_LEVELS >= 4
-    case RELMEM_xen_l4:
         ret = relinquish_memory(d, &d->xenpage_list, PGT_l4_page_table);
         if ( ret )
             return ret;
@@ -1776,8 +1776,8 @@ int domain_relinquish_resources(struct d
         /* fallthrough */
 #endif
 
+       case RELMEM_xen_l3:
 #if CONFIG_PAGING_LEVELS >= 3
-       case RELMEM_xen_l3:
         ret = relinquish_memory(d, &d->xenpage_list, PGT_l3_page_table);
         if ( ret )
             return ret;
diff -r 192f2df46e67 -r f16bff0934d7 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Thu Sep 06 15:04:07 2007 -0600
+++ b/xen/arch/x86/hvm/hvm.c    Fri Sep 07 13:56:50 2007 -0600
@@ -586,8 +586,7 @@ int hvm_set_cr0(unsigned long value)
 
         if ( !paging_mode_hap(v->domain) )
         {
-            put_page(mfn_to_page(get_mfn_from_gpfn(
-                v->arch.hvm_vcpu.guest_cr[3] >> PAGE_SHIFT)));
+            put_page(pagetable_get_page(v->arch.guest_table));
             v->arch.guest_table = pagetable_null();
         }
     }
@@ -603,21 +602,11 @@ int hvm_set_cr0(unsigned long value)
 
 int hvm_set_cr3(unsigned long value)
 {
-    unsigned long old_base_mfn, mfn;
+    unsigned long mfn;
     struct vcpu *v = current;
 
-    if ( paging_mode_hap(v->domain) || !hvm_paging_enabled(v) )
-    {
-        /* Nothing to do. */
-    }
-    else if ( value == v->arch.hvm_vcpu.guest_cr[3] )
-    {
-        /* Shadow-mode TLB flush. Invalidate the shadow. */
-        mfn = get_mfn_from_gpfn(value >> PAGE_SHIFT);
-        if ( mfn != pagetable_get_pfn(v->arch.guest_table) )
-            goto bad_cr3;
-    }
-    else 
+    if ( hvm_paging_enabled(v) && !paging_mode_hap(v->domain) &&
+         (value != v->arch.hvm_vcpu.guest_cr[3]) )
     {
         /* Shadow-mode CR3 change. Check PDBR and then make a new shadow. */
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "CR3 value = %lx", value);
@@ -625,11 +614,8 @@ int hvm_set_cr3(unsigned long value)
         if ( !mfn_valid(mfn) || !get_page(mfn_to_page(mfn), v->domain) )
             goto bad_cr3;
 
-        old_base_mfn = pagetable_get_pfn(v->arch.guest_table);
+        put_page(pagetable_get_page(v->arch.guest_table));
         v->arch.guest_table = pagetable_from_pfn(mfn);
-
-        if ( old_base_mfn )
-            put_page(mfn_to_page(old_base_mfn));
 
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR3 value = %lx", value);
     }
diff -r 192f2df46e67 -r f16bff0934d7 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Thu Sep 06 15:04:07 2007 -0600
+++ b/xen/arch/x86/hvm/svm/svm.c        Fri Sep 07 13:56:50 2007 -0600
@@ -337,8 +337,36 @@ int svm_vmcb_save(struct vcpu *v, struct
 
 int svm_vmcb_restore(struct vcpu *v, struct hvm_hw_cpu *c)
 {
-    unsigned long mfn, old_base_mfn;
-    struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
+    unsigned long mfn = 0;
+    struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
+
+    if ( c->pending_valid &&
+         ((c->pending_type == 1) || (c->pending_type > 6) ||
+          (c->pending_reserved != 0)) )
+    {
+        gdprintk(XENLOG_ERR, "Invalid pending event 0x%"PRIx32".\n",
+                 c->pending_event);
+        return -EINVAL;
+    }
+
+    if ( !paging_mode_hap(v->domain) )
+    {
+        if ( c->cr0 & X86_CR0_PG )
+        {
+            mfn = gmfn_to_mfn(v->domain, c->cr3 >> PAGE_SHIFT);
+            if ( !mfn_valid(mfn) || !get_page(mfn_to_page(mfn), v->domain) )
+            {
+                gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%"PRIx64"\n",
+                         c->cr3);
+                return -EINVAL;
+            }
+        }
+
+        if ( v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_PG )
+            put_page(pagetable_get_page(v->arch.guest_table));
+
+        v->arch.guest_table = pagetable_from_pfn(mfn);
+    }
 
     vmcb->rip    = c->rip;
     vmcb->rsp    = c->rsp;
@@ -357,18 +385,6 @@ int svm_vmcb_restore(struct vcpu *v, str
            __func__, c->cr3, c->cr0, c->cr4);
 #endif
 
-    if ( hvm_paging_enabled(v) && !paging_mode_hap(v->domain) )
-    {
-        HVM_DBG_LOG(DBG_LEVEL_VMMU, "CR3 = %"PRIx64, c->cr3);
-        mfn = gmfn_to_mfn(v->domain, c->cr3 >> PAGE_SHIFT);
-        if( !mfn_valid(mfn) || !get_page(mfn_to_page(mfn), v->domain) ) 
-            goto bad_cr3;
-        old_base_mfn = pagetable_get_pfn(v->arch.guest_table);
-        v->arch.guest_table = pagetable_from_pfn(mfn);
-        if ( old_base_mfn )
-             put_page(mfn_to_page(old_base_mfn));
-    }
-
     vmcb->idtr.limit = c->idtr_limit;
     vmcb->idtr.base  = c->idtr_base;
 
@@ -435,14 +451,6 @@ int svm_vmcb_restore(struct vcpu *v, str
         gdprintk(XENLOG_INFO, "Re-injecting 0x%"PRIx32", 0x%"PRIx32"\n",
                  c->pending_event, c->error_code);
 
-        if ( (c->pending_type == 1) || (c->pending_type > 6) ||
-             (c->pending_reserved != 0) )
-        {
-            gdprintk(XENLOG_ERR, "Invalid pending event 0x%"PRIx32"\n", 
-                     c->pending_event);
-            return -EINVAL;
-        }
-
         if ( hvm_event_needs_reinjection(c->pending_type, c->pending_vector) )
         {
             vmcb->eventinj.bytes = c->pending_event;
@@ -453,10 +461,6 @@ int svm_vmcb_restore(struct vcpu *v, str
     paging_update_paging_modes(v);
 
     return 0;
- 
- bad_cr3:
-    gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%"PRIx64"\n", c->cr3);
-    return -EINVAL;
 }
 
         
diff -r 192f2df46e67 -r f16bff0934d7 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Thu Sep 06 15:04:07 2007 -0600
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Fri Sep 07 13:56:50 2007 -0600
@@ -565,7 +565,31 @@ void vmx_vmcs_save(struct vcpu *v, struc
 
 int vmx_vmcs_restore(struct vcpu *v, struct hvm_hw_cpu *c)
 {
-    unsigned long mfn, old_base_mfn;
+    unsigned long mfn = 0;
+
+    if ( c->pending_valid &&
+         ((c->pending_type == 1) || (c->pending_type > 6) ||
+          (c->pending_reserved != 0)) )
+    {
+        gdprintk(XENLOG_ERR, "Invalid pending event 0x%"PRIx32".\n",
+                 c->pending_event);
+        return -EINVAL;
+    }
+
+    if ( c->cr0 & X86_CR0_PG )
+    {
+        mfn = gmfn_to_mfn(v->domain, c->cr3 >> PAGE_SHIFT);
+        if ( !mfn_valid(mfn) || !get_page(mfn_to_page(mfn), v->domain) )
+        {
+            gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%"PRIx64"\n", c->cr3);
+            return -EINVAL;
+        }
+    }
+
+    if ( v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_PG )
+        put_page(pagetable_get_page(v->arch.guest_table));
+
+    v->arch.guest_table = pagetable_from_pfn(mfn);
 
     vmx_vmcs_enter(v);
 
@@ -586,18 +610,6 @@ int vmx_vmcs_restore(struct vcpu *v, str
            __func__, c->cr3, c->cr0, c->cr4);
 #endif
 
-    if ( hvm_paging_enabled(v) )
-    {
-        HVM_DBG_LOG(DBG_LEVEL_VMMU, "CR3 = %"PRIx64, c->cr3);
-        mfn = gmfn_to_mfn(v->domain, c->cr3 >> PAGE_SHIFT);
-        if ( !mfn_valid(mfn) || !get_page(mfn_to_page(mfn), v->domain) )
-            goto bad_cr3;
-        old_base_mfn = pagetable_get_pfn(v->arch.guest_table);
-        v->arch.guest_table = pagetable_from_pfn(mfn);
-        if ( old_base_mfn )
-            put_page(mfn_to_page(old_base_mfn));
-    }
-
     v->arch.hvm_vcpu.guest_efer = c->msr_efer;
     vmx_update_guest_efer(v);
 
@@ -661,14 +673,6 @@ int vmx_vmcs_restore(struct vcpu *v, str
     {
         gdprintk(XENLOG_INFO, "Re-injecting 0x%"PRIx32", 0x%"PRIx32"\n",
                  c->pending_event, c->error_code);
-
-        if ( (c->pending_type == 1) || (c->pending_type > 6) ||
-             (c->pending_reserved != 0) )
-        {
-            gdprintk(XENLOG_ERR, "Invalid pending event 0x%"PRIx32".\n",
-                     c->pending_event);
-            return -EINVAL;
-        }
 
         if ( hvm_event_needs_reinjection(c->pending_type, c->pending_vector) )
         {
@@ -680,11 +684,6 @@ int vmx_vmcs_restore(struct vcpu *v, str
     }
 
     return 0;
-
- bad_cr3:
-    gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%"PRIx64"\n", c->cr3);
-    vmx_vmcs_exit(v);
-    return -EINVAL;
 }
 
 #if defined(__x86_64__) && defined(HVM_DEBUG_SUSPEND)
@@ -1905,7 +1904,22 @@ static void vmx_world_save(struct vcpu *
 
 static int vmx_world_restore(struct vcpu *v, struct vmx_assist_context *c)
 {
-    unsigned long mfn, old_base_mfn;
+    unsigned long mfn = 0;
+
+    if ( c->cr0 & X86_CR0_PG )
+    {
+        mfn = gmfn_to_mfn(v->domain, c->cr3 >> PAGE_SHIFT);
+        if ( !mfn_valid(mfn) || !get_page(mfn_to_page(mfn), v->domain) )
+        {
+            gdprintk(XENLOG_ERR, "Invalid CR3 value=%x", c->cr3);
+            return -EINVAL;
+        }
+    }
+
+    if ( v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_PG )
+        put_page(pagetable_get_page(v->arch.guest_table));
+
+    v->arch.guest_table = pagetable_from_pfn(mfn);
 
     __vmwrite(GUEST_RIP, c->eip);
     __vmwrite(GUEST_RSP, c->esp);
@@ -1917,18 +1931,6 @@ static int vmx_world_restore(struct vcpu
     vmx_update_guest_cr(v, 0);
     vmx_update_guest_cr(v, 4);
 
-    if ( hvm_paging_enabled(v) )
-    {
-        HVM_DBG_LOG(DBG_LEVEL_VMMU, "CR3 = %x", c->cr3);
-        mfn = get_mfn_from_gpfn(c->cr3 >> PAGE_SHIFT);
-        if ( !mfn_valid(mfn) || !get_page(mfn_to_page(mfn), v->domain) )
-            goto bad_cr3;
-        old_base_mfn = pagetable_get_pfn(v->arch.guest_table);
-        v->arch.guest_table = pagetable_from_pfn(mfn);
-        if ( old_base_mfn )
-             put_page(mfn_to_page(old_base_mfn));
-    }
-
     __vmwrite(GUEST_IDTR_LIMIT, c->idtr_limit);
     __vmwrite(GUEST_IDTR_BASE, c->idtr_base);
 
@@ -1977,10 +1979,6 @@ static int vmx_world_restore(struct vcpu
 
     paging_update_paging_modes(v);
     return 0;
-
- bad_cr3:
-    gdprintk(XENLOG_ERR, "Invalid CR3 value=%x", c->cr3);
-    return -EINVAL;
 }
 
 enum { VMX_ASSIST_INVOKE = 0, VMX_ASSIST_RESTORE };
diff -r 192f2df46e67 -r f16bff0934d7 xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c    Thu Sep 06 15:04:07 2007 -0600
+++ b/xen/arch/x86/mm/shadow/multi.c    Fri Sep 07 13:56:50 2007 -0600
@@ -3502,24 +3502,12 @@ sh_update_cr3(struct vcpu *v, int do_loc
     /* Double-check that the HVM code has sent us a sane guest_table */
     if ( is_hvm_domain(d) )
     {
-        gfn_t gfn;
-
         ASSERT(shadow_mode_external(d));
-
-        // Is paging enabled on this vcpu?
         if ( hvm_paging_enabled(v) )
-        {
-            gfn = _gfn(paddr_to_pfn(v->arch.hvm_vcpu.guest_cr[3]));
-            gmfn = gfn_to_mfn(d, gfn);
-            ASSERT(mfn_valid(gmfn));
-            ASSERT(pagetable_get_pfn(v->arch.guest_table) == mfn_x(gmfn));
-        } 
+            ASSERT(pagetable_get_pfn(v->arch.guest_table));
         else 
-        {
-            /* Paging disabled: guest_table points at a 32-bit 1-to-1 map */
             ASSERT(v->arch.guest_table.pfn
                    == d->arch.paging.shadow.unpaged_pagetable.pfn);
-        }
     }
 #endif
 

_______________________________________________
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®.