WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Make SMP guests work in shadow translate mode.

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Make SMP guests work in shadow translate mode.
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 30 Jan 2006 15:00:09 +0000
Delivery-date: Mon, 30 Jan 2006 15:23:31 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User sos22@xxxxxxxxxxxxxxxxxxxx
# Node ID f658587fdaacfd96a6eb9f231b5189f5855cc866
# Parent  0d95066795de09b0cecdfae0c1c60763cdd42dbb
Make SMP guests work in shadow translate mode.

Signed-off-by: Steven Smith, sos22@xxxxxxxxx

diff -r 0d95066795de -r f658587fdaac tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c      Thu Jan 26 13:39:12 2006
+++ b/tools/libxc/xc_linux_build.c      Thu Jan 26 17:00:40 2006
@@ -98,7 +98,10 @@
     ppt_alloc = (vpt_start - dsi_v_start) >> PAGE_SHIFT;
     alloc_pt(l2tab, vl2tab, pl2tab);
     vl2e = &vl2tab[l2_table_offset(dsi_v_start)];
-    ctxt->ctrlreg[3] = l2tab;
+    if (shadow_mode_enabled)
+        ctxt->ctrlreg[3] = pl2tab;
+    else
+        ctxt->ctrlreg[3] = l2tab;
 
     for ( count = 0; count < ((v_end - dsi_v_start) >> PAGE_SHIFT); count++ )
     {
@@ -166,7 +169,10 @@
 
     alloc_pt(l3tab, vl3tab, pl3tab);
     vl3e = &vl3tab[l3_table_offset_pae(dsi_v_start)];
-    ctxt->ctrlreg[3] = l3tab;
+    if (shadow_mode_enabled)
+        ctxt->ctrlreg[3] = pl3tab;
+    else
+        ctxt->ctrlreg[3] = l3tab;
 
     for ( count = 0; count < ((v_end - dsi_v_start) >> PAGE_SHIFT); count++)
     {
@@ -246,7 +252,10 @@
     ppt_alloc = (vpt_start - dsi_v_start) >> PAGE_SHIFT;
     alloc_pt(l4tab, vl4tab);
     vl4e = &vl4tab[l4_table_offset(dsi_v_start)];
-    ctxt->ctrlreg[3] = l4tab;
+    if (shadow_mode_enabled)
+        ctxt->ctrlreg[3] = pl4tab;
+    else
+        ctxt->ctrlreg[3] = l4tab;
     
     for ( count = 0; count < ((v_end-dsi_v_start)>>PAGE_SHIFT); count++)
     {
diff -r 0d95066795de -r f658587fdaac xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Thu Jan 26 13:39:12 2006
+++ b/xen/arch/x86/domain.c     Thu Jan 26 17:00:40 2006
@@ -348,6 +348,7 @@
     struct domain *d = v->domain;
     unsigned long phys_basetab;
     int i, rc;
+    unsigned got_basetab_type;
 
     /*
      * This is sufficient! If the descriptor DPL differs from CS RPL then we'll
@@ -401,23 +402,32 @@
         d->vm_assist = c->vm_assist;
 
     phys_basetab = c->ctrlreg[3];
+    phys_basetab =
+        (__gpfn_to_mfn(d, phys_basetab >> PAGE_SHIFT) << PAGE_SHIFT) |
+        (phys_basetab & ~PAGE_MASK);
+
     v->arch.guest_table = mk_pagetable(phys_basetab);
 
     if ( shadow_mode_refcounts(d) )
     {
         if ( !get_page(pfn_to_page(phys_basetab>>PAGE_SHIFT), d) )
             return -EINVAL;
+        got_basetab_type = 0;
     }
     else if ( !(c->flags & VGCF_VMX_GUEST) )
     {
         if ( !get_page_and_type(pfn_to_page(phys_basetab>>PAGE_SHIFT), d,
                                 PGT_base_page_table) )
             return -EINVAL;
+        got_basetab_type = 1;
     }
 
     if ( (rc = (int)set_gdt(v, c->gdt_frames, c->gdt_ents)) != 0 )
     {
-        put_page_and_type(pfn_to_page(phys_basetab>>PAGE_SHIFT));
+        if (got_basetab_type)
+            put_page_and_type(pfn_to_page(phys_basetab>>PAGE_SHIFT));
+        else
+            put_page(pfn_to_page(phys_basetab>>PAGE_SHIFT));
         return rc;
     }
 
diff -r 0d95066795de -r f658587fdaac xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Thu Jan 26 13:39:12 2006
+++ b/xen/arch/x86/mm.c Thu Jan 26 17:00:40 2006
@@ -2153,9 +2153,7 @@
         case MMU_MACHPHYS_UPDATE:
 
             if (shadow_mode_translate(FOREIGNDOM)) {
-                /* We don't allow translate mode guests to have their
-                   M2P tables mutated while they're running. */
-                okay = 0;
+                MEM_LOG("can't mutate m2p table of translate mode guest");
                 break;
             }
 
@@ -2637,7 +2635,7 @@
 
     /* Check the pages in the new GDT. */
     for ( i = 0; i < nr_pages; i++ ) {
-        pfn = frames[i];
+        pfn = frames[i] = __gpfn_to_mfn(d, frames[i]);
         if ((pfn >= max_page) ||
             !get_page_and_type(pfn_to_page(pfn), d, PGT_gdt_page) )
             goto fail;
@@ -2669,7 +2667,6 @@
     int nr_pages = (entries + 511) / 512;
     unsigned long frames[16];
     long ret;
-    int x;
 
     /* Rechecked in set_gdt, but ensures a sane limit for copy_from_user(). */
     if ( entries > FIRST_RESERVED_GDT_ENTRY )
@@ -2677,11 +2674,6 @@
     
     if ( copy_from_user(frames, frame_list, nr_pages * sizeof(unsigned long)) )
         return -EFAULT;
-
-    if (shadow_mode_translate(current->domain)) {
-        for (x = 0; x < nr_pages; x++)
-            frames[x] = __gpfn_to_mfn(current->domain, frames[x]);
-    }
 
     LOCK_BIGLOCK(current->domain);
 

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Make SMP guests work in shadow translate mode., Xen patchbot -unstable <=