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

[Xen-changelog] Merged.



# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID 7cbcdccd659dee6283163f8dba34a881dd8729b8
# Parent  e2bb85722b91fb6fe03531b08aa1e521db821cb4
# Parent  6e2225934d848feb7e762ee5e3803697f2d3c833
Merged.

diff -r e2bb85722b91 -r 7cbcdccd659d .hgignore
--- a/.hgignore Tue Nov  8 13:53:27 2005
+++ b/.hgignore Tue Nov  8 13:56:14 2005
@@ -17,9 +17,9 @@
 ^docs/.*\.pdf$
 ^docs/.*\.ps$
 ^docs/.*\.toc$
+^docs/api/.*$
 ^docs/figs/xenserver\.eps$
 ^docs/html/.*$
-^docs/api/.*$
 ^docs/interface/WARNINGS$
 ^docs/interface/images\.pl$
 ^docs/interface/images\.tex$
@@ -47,9 +47,9 @@
 ^extras/mini-os/h/xen-public$
 ^extras/mini-os/mini-os\..*$
 ^install/.*$
+^linux-[^/]*-xen/.*$
 ^linux-[^/]*-xen0/.*$
 ^linux-[^/]*-xenU/.*$
-^linux-[^/]*-xen/.*$
 ^linux-[^/]*\.patch$
 ^mkddbxen$
 ^netbsd-[^/]*-tools/.*$
@@ -62,6 +62,7 @@
 ^patches/tmp/.*$
 ^pristine-.*$
 ^ref-.*$
+^tools/.*/TAGS$
 ^tools/.*/build/lib.*/.*\.py$
 ^tools/blktap/Makefile\.smh$
 ^tools/blktap/blkcow$
@@ -71,37 +72,37 @@
 ^tools/blktap/blkgnbd$
 ^tools/blktap/blkimg$
 ^tools/blktap/bstest$
-^tools/blktap/vdi\.dot$
-^tools/blktap/vdi\.ps$
+^tools/blktap/parallax/blockstored$
+^tools/blktap/parallax/parallax$
 ^tools/blktap/parallax/vdi_create$
 ^tools/blktap/parallax/vdi_fill$
 ^tools/blktap/parallax/vdi_list$
 ^tools/blktap/parallax/vdi_snap$
+^tools/blktap/parallax/vdi_snap_delete$
 ^tools/blktap/parallax/vdi_snap_list$
-^tools/blktap/parallax/vdi_snap_delete$
 ^tools/blktap/parallax/vdi_tree$
 ^tools/blktap/parallax/vdi_validate$
-^tools/blktap/parallax/parallax$
-^tools/blktap/parallax/blockstored$
 ^tools/blktap/ublkback/ublkback$
+^tools/blktap/vdi\.dot$
+^tools/blktap/vdi\.ps$
 ^tools/blktap/xen/.*$
 ^tools/check/\..*$
+^tools/console/xenconsole$
 ^tools/console/xenconsoled$
-^tools/console/xenconsole$
+^tools/debugger/gdb/gdb-6\.2\.1-linux-i386-xen/.*$
+^tools/debugger/gdb/gdb-6\.2\.1/.*$
 ^tools/debugger/gdb/gdb-6\.2\.1\.tar\.bz2$
-^tools/debugger/gdb/gdb-6\.2\.1/.*$
-^tools/debugger/gdb/gdb-6\.2\.1-linux-i386-xen/.*$
-^tools/debugger/pdb/pdb$
+^tools/debugger/pdb/._bcdi/.*$
 ^tools/debugger/pdb/linux-[0-9.]*-module/.*\.ko$
 ^tools/debugger/pdb/linux-[0-9.]*-module/.*\.mod.c$
+^tools/debugger/pdb/linux-[0-9.]*-module/.tmp_versions/.*$
 ^tools/debugger/pdb/linux-[0-9.]*-module/\..*\.cmd$
-^tools/debugger/pdb/linux-[0-9.]*-module/.tmp_versions/.*$
-^tools/debugger/pdb/._bcdi/.*$
-^tools/firmware/acpi/acpigen$
+^tools/debugger/pdb/pdb$
+^tools/firmware/.*/biossums$
 ^tools/firmware/.*\.bin$
 ^tools/firmware/.*\.sym$
-^tools/firmware/.*/biossums$
 ^tools/firmware/.*bios/.*bios.*\.txt$
+^tools/firmware/acpi/acpigen$
 ^tools/firmware/rombios/BIOS-bochs-latest$
 ^tools/firmware/rombios/_rombios_\.c$
 ^tools/firmware/rombios/rombios\.s$
@@ -120,20 +121,20 @@
 ^tools/libxc/xen/.*$
 ^tools/misc/cpuperf/cpuperf-perfcntr$
 ^tools/misc/cpuperf/cpuperf-xen$
+^tools/misc/lomount/lomount$
 ^tools/misc/mbootpack/bin2c$
 ^tools/misc/mbootpack/bootsect$
 ^tools/misc/mbootpack/bzimage_header\.c$
 ^tools/misc/mbootpack/mbootpack$
 ^tools/misc/mbootpack/setup$
 ^tools/misc/miniterm/miniterm$
-^tools/misc/lomount/lomount$
 ^tools/misc/xc_shadow$
 ^tools/misc/xen_cpuperf$
 ^tools/misc/xenperf$
+^tools/pygrub/build/.*$
+^tools/python/build/.*$
 ^tools/security/secpol_tool$
 ^tools/security/xen/.*$
-^tools/pygrub/build/.*$
-^tools/python/build/.*$
 ^tools/tests/test_x86_emulator$
 ^tools/vnet/gc$
 ^tools/vnet/gc.*/.*$
@@ -141,8 +142,8 @@
 ^tools/vnet/vnet-module/\..*\.cmd$
 ^tools/vnet/vnet-module/\.tmp_versions/.*$
 ^tools/vnet/vnet-module/vnet_module\.mod\..*$
+^tools/vtpm/tpm_emulator-.*\.tar\.gz$
 ^tools/vtpm/tpm_emulator/.*$
-^tools/vtpm/tpm_emulator-.*\.tar\.gz$
 ^tools/vtpm/vtpm/.*$
 ^tools/vtpm_manager/manager/vtpm_managerd$
 ^tools/xcutils/xc_restore$
@@ -150,13 +151,13 @@
 ^tools/xenstat/xentop/xentop$
 ^tools/xenstore/testsuite/tmp/.*$
 ^tools/xenstore/xen$
-^tools/xenstore/xenstored$
-^tools/xenstore/xenstored_test$
 ^tools/xenstore/xenstore-exists$
 ^tools/xenstore/xenstore-list$
 ^tools/xenstore/xenstore-read$
 ^tools/xenstore/xenstore-rm$
 ^tools/xenstore/xenstore-write$
+^tools/xenstore/xenstored$
+^tools/xenstore/xenstored_test$
 ^tools/xenstore/xs_crashme$
 ^tools/xenstore/xs_random$
 ^tools/xenstore/xs_stress$
diff -r e2bb85722b91 -r 7cbcdccd659d 
linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32       Tue Nov 
 8 13:53:27 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32       Tue Nov 
 8 13:56:14 2005
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-xen0
-# Wed Aug  3 09:54:56 2005
+# Linux kernel version: 2.6.12.6-xen0
+# Mon Nov  7 17:22:05 2005
 #
 CONFIG_XEN=y
 CONFIG_ARCH_XEN=y
@@ -151,11 +151,9 @@
 CONFIG_X86_UP_APIC=y
 CONFIG_X86_UP_IOAPIC=y
 CONFIG_PCI=y
-# CONFIG_PCI_GOBIOS is not set
 # CONFIG_PCI_GOMMCONFIG is not set
 # CONFIG_PCI_GODIRECT is not set
 CONFIG_PCI_GOANY=y
-CONFIG_PCI_BIOS=y
 CONFIG_PCI_DIRECT=y
 CONFIG_PCI_MMCONFIG=y
 # CONFIG_PCIEPORTBUS is not set
@@ -540,7 +538,7 @@
 # CONFIG_IP_NF_MATCH_STATE is not set
 # CONFIG_IP_NF_MATCH_CONNTRACK is not set
 # CONFIG_IP_NF_MATCH_OWNER is not set
-CONFIG_IP_NF_MATCH_PHYSDEV=y
+CONFIG_IP_NF_MATCH_PHYSDEV=m
 # CONFIG_IP_NF_MATCH_ADDRTYPE is not set
 # CONFIG_IP_NF_MATCH_REALM is not set
 # CONFIG_IP_NF_MATCH_SCTP is not set
diff -r e2bb85722b91 -r 7cbcdccd659d 
linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64       Tue Nov 
 8 13:53:27 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64       Tue Nov 
 8 13:56:14 2005
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12.4-xen0
-# Mon Aug 15 18:57:19 2005
+# Linux kernel version: 2.6.12.6-xen0
+# Mon Nov  7 17:24:18 2005
 #
 CONFIG_XEN=y
 CONFIG_ARCH_XEN=y
@@ -92,6 +92,7 @@
 # CONFIG_PREEMPT is not set
 CONFIG_MICROCODE=y
 # CONFIG_X86_CPUID is not set
+CONFIG_SWIOTLB=y
 # CONFIG_NUMA is not set
 # CONFIG_MTRR is not set
 CONFIG_X86_LOCAL_APIC=y
@@ -122,7 +123,6 @@
 # CONFIG_X86_MSR is not set
 # CONFIG_GART_IOMMU is not set
 CONFIG_DUMMY_IOMMU=y
-CONFIG_SWIOTLB=y
 # CONFIG_X86_MCE is not set
 
 #
@@ -480,7 +480,7 @@
 # CONFIG_IP_NF_MATCH_STATE is not set
 # CONFIG_IP_NF_MATCH_CONNTRACK is not set
 # CONFIG_IP_NF_MATCH_OWNER is not set
-CONFIG_IP_NF_MATCH_PHYSDEV=y
+CONFIG_IP_NF_MATCH_PHYSDEV=m
 # CONFIG_IP_NF_MATCH_ADDRTYPE is not set
 # CONFIG_IP_NF_MATCH_REALM is not set
 # CONFIG_IP_NF_MATCH_SCTP is not set
diff -r e2bb85722b91 -r 7cbcdccd659d tools/libxc/Makefile
--- a/tools/libxc/Makefile      Tue Nov  8 13:53:27 2005
+++ b/tools/libxc/Makefile      Tue Nov  8 13:56:14 2005
@@ -13,7 +13,6 @@
 include $(XEN_ROOT)/tools/Rules.mk
 
 SRCS       :=
-BUILD_SRCS :=
 SRCS       += xc_bvtsched.c
 SRCS       += xc_core.c
 SRCS       += xc_domain.c
@@ -24,24 +23,26 @@
 SRCS       += xc_private.c
 SRCS       += xc_sedf.c
 SRCS       += xc_tbuf.c
+
+ifeq ($(XEN_TARGET_ARCH),x86_32)
+SRCS       += xc_ptrace.c
+SRCS       += xc_ptrace_core.c
+endif
+
+BUILD_SRCS :=
 BUILD_SRCS += xc_linux_build.c
 BUILD_SRCS += xc_load_bin.c
 BUILD_SRCS += xc_load_elf.c
+BUILD_SRCS += xg_private.c
 
 ifeq ($(XEN_TARGET_ARCH),ia64)
 BUILD_SRCS += xc_ia64_stubs.c
 else
-ifeq ($(XEN_TARGET_ARCH),x86_32)
-SRCS       += xc_ptrace.c
-SRCS       += xc_ptrace_core.c
-endif
 BUILD_SRCS += xc_load_aout9.c
 BUILD_SRCS += xc_linux_restore.c
 BUILD_SRCS += xc_linux_save.c
 BUILD_SRCS += xc_vmx_build.c
 endif
-
-BUILD_SRCS += xg_private.c
 
 CFLAGS   += -Wall
 CFLAGS   += -Werror
@@ -105,7 +106,7 @@
 .PHONY: TAGS clean rpm install all
 
 TAGS:
-       etags -t $(SRCS) *.h
+       etags -t *.c *.h
 
 clean:
        rm -rf *.a *.so* *.o *.opic *.rpm $(LIB) *~ $(DEPS) xen
diff -r e2bb85722b91 -r 7cbcdccd659d tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c      Tue Nov  8 13:53:27 2005
+++ b/tools/libxc/xc_linux_build.c      Tue Nov  8 13:56:14 2005
@@ -549,11 +549,10 @@
         rc = setup_pg_tables_pae(xc_handle, dom, ctxt,
                                  dsi.v_start, v_end,
                                  page_array, vpt_start, vpt_end);
-    else {
+    else
         rc = setup_pg_tables(xc_handle, dom, ctxt,
                              dsi.v_start, v_end,
                              page_array, vpt_start, vpt_end);
-    }
 #endif
 #if defined(__x86_64__)
     rc = setup_pg_tables_64(xc_handle, dom, ctxt,
@@ -671,8 +670,10 @@
     return 0;
 
  error_out:
-    free(mmu);
-    free(page_array);
+    if ( mmu != NULL )
+        free(mmu);
+    if ( page_array != NULL )
+        free(page_array);
     return -1;
 }
 #endif
@@ -726,7 +727,7 @@
 
     if ( mlock(&st_ctxt, sizeof(st_ctxt) ) )
     {   
-        PERROR("xc_linux_build: ctxt mlock failed");
+        PERROR("%s: ctxt mlock failed", __func__);
         return 1;
     }
 
@@ -767,7 +768,8 @@
         close(initrd_fd);
     if ( initrd_gfd )
         gzclose(initrd_gfd);
-    free(image);
+    if ( image != NULL )
+        free(image);
 
 #ifdef __ia64__
     /* based on new_thread in xen/arch/ia64/domain.c */
@@ -856,7 +858,8 @@
         gzclose(initrd_gfd);
     else if ( initrd_fd >= 0 )
         close(initrd_fd);
-    free(image);
+    if ( image != NULL )
+        free(image);
 
     return -1;
 }
diff -r e2bb85722b91 -r 7cbcdccd659d tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py     Tue Nov  8 13:53:27 2005
+++ b/tools/python/xen/xm/create.py     Tue Nov  8 13:56:14 2005
@@ -756,7 +756,7 @@
 vncpid = None
 
 def spawn_vnc(display):
-    vncargs = (["vncviewer" + "-log", "*:stdout:0",
+    vncargs = (["vncviewer", "-log", "*:stdout:0",
             "-listen", "%d" % (VNC_BASE_PORT + display) ])
     global vncpid    
     vncpid = os.spawnvp(os.P_NOWAIT, "vncviewer", vncargs)
diff -r e2bb85722b91 -r 7cbcdccd659d xen/acm/acm_core.c
--- a/xen/acm/acm_core.c        Tue Nov  8 13:53:27 2005
+++ b/xen/acm/acm_core.c        Tue Nov  8 13:56:14 2005
@@ -254,7 +254,10 @@
         return ACM_NULL_POINTER_ERROR;
     }
     if ((ssid = xmalloc(struct acm_ssid_domain)) == NULL)
+    {
+        put_domain(subj);
         return ACM_INIT_SSID_ERROR;
+    }
 
     ssid->datatype       = DOMAIN;
     ssid->subject        = subj;
diff -r e2bb85722b91 -r 7cbcdccd659d xen/arch/x86/audit.c
--- a/xen/arch/x86/audit.c      Tue Nov  8 13:53:27 2005
+++ b/xen/arch/x86/audit.c      Tue Nov  8 13:56:14 2005
@@ -412,7 +412,7 @@
         for_each_vcpu(d, v)
         {
             if ( pagetable_get_paddr(v->arch.guest_table) )
-                adjust(&frame_table[pagetable_get_pfn(v->arch.guest_table)], 
1);
+                adjust(&frame_table[pagetable_get_pfn(v->arch.guest_table)], 
!shadow_mode_refcounts(d));
             if ( pagetable_get_paddr(v->arch.shadow_table) )
                 adjust(&frame_table[pagetable_get_pfn(v->arch.shadow_table)], 
0);
             if ( v->arch.monitor_shadow_ref )
diff -r e2bb85722b91 -r 7cbcdccd659d xen/arch/x86/dom0_ops.c
--- a/xen/arch/x86/dom0_ops.c   Tue Nov  8 13:53:27 2005
+++ b/xen/arch/x86/dom0_ops.c   Tue Nov  8 13:56:14 2005
@@ -263,6 +263,7 @@
         if ( unlikely(num > 1024) )
         {
             ret = -E2BIG;
+            put_domain(d);
             break;
         }
 
diff -r e2bb85722b91 -r 7cbcdccd659d xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Tue Nov  8 13:53:27 2005
+++ b/xen/arch/x86/mm.c Tue Nov  8 13:56:14 2005
@@ -507,7 +507,7 @@
         l2e_get_pfn(l2e), PGT_l1_page_table | vaddr, d);
 
 #if CONFIG_PAGING_LEVELS == 2
-    if (!rc)
+    if ( unlikely(!rc) )
         rc = get_linear_pagetable(l2e, pfn, d);
 #endif
     return rc;
@@ -540,7 +540,7 @@
         l3e_get_pfn(l3e),
         PGT_l2_page_table | vaddr, d);
 #if CONFIG_PAGING_LEVELS == 3
-    if (!rc)
+    if ( unlikely(!rc) )
         rc = get_linear_pagetable(l3e, pfn, d);
 #endif
     return rc;
@@ -575,9 +575,9 @@
         PGT_l3_page_table | vaddr, d);
 
     if ( unlikely(!rc) )
-        return get_linear_pagetable(l4e, pfn, d);
-
-    return 1;
+        rc = get_linear_pagetable(l4e, pfn, d);
+
+    return rc;
 }
 
 #endif /* 4 level */
diff -r e2bb85722b91 -r 7cbcdccd659d xen/arch/x86/shadow.c
--- a/xen/arch/x86/shadow.c     Tue Nov  8 13:53:27 2005
+++ b/xen/arch/x86/shadow.c     Tue Nov  8 13:56:14 2005
@@ -37,8 +37,10 @@
 
 extern void free_shadow_pages(struct domain *d);
 
+#if 0 // this code has not been updated for 32pae & 64 bit modes
 #if SHADOW_DEBUG
 static void mark_shadows_as_reflecting_snapshot(struct domain *d, unsigned 
long gpfn);
+#endif
 #endif
 
 #if CONFIG_PAGING_LEVELS == 3
@@ -898,8 +900,10 @@
     entry->snapshot_mfn = shadow_make_snapshot(d, gpfn, mfn);
     entry->writable_pl1e = -1;
 
+#if 0 // this code has not been updated for 32pae & 64 bit modes
 #if SHADOW_DEBUG
     mark_shadows_as_reflecting_snapshot(d, gpfn);
+#endif
 #endif
 
     // increment guest's ref count to represent the entry in the
@@ -1317,18 +1321,17 @@
 
         if ( !smfn )
         {
+            // For heavy weight shadows: no need to update refcounts if
+            // there's no shadow page.
+            //
             if ( shadow_mode_refcounts(d) )
                 continue;
 
-            // For light weight shadows, even when no shadow page exists,
-            // we need to resync the refcounts to the new contents of the
-            // guest page.
-            // This only applies when we have writable page tables.
+            // For light weight shadows: only need up resync the refcounts to
+            // the new contents of the guest page iff this it has the right
+            // page type.
             //
-            if ( !shadow_mode_write_all(d) &&
-                 !((stype == PGT_l1_shadow) &&
-                   VM_ASSIST(d, VMASST_TYPE_writable_pagetables)) )
-                // Page is not writable -- no resync necessary
+            if ( stype != ( pfn_to_page(entry->gmfn)->u.inuse.type_info & 
PGT_type_mask) )
                 continue;
         }
 
@@ -1365,8 +1368,8 @@
             guest_l1_pgentry_t *snapshot1 = snapshot;
             int unshadow_l1 = 0;
 
-            ASSERT(VM_ASSIST(d, VMASST_TYPE_writable_pagetables) ||
-                   shadow_mode_write_all(d));
+            ASSERT(shadow_mode_write_l1(d) ||
+                   shadow_mode_write_all(d) || shadow_mode_wr_pt_pte(d));
 
             if ( !shadow_mode_refcounts(d) )
                 revalidate_l1(d, (l1_pgentry_t *)guest1, (l1_pgentry_t 
*)snapshot1);
@@ -1427,7 +1430,7 @@
             l2_pgentry_t *shadow2 = shadow;
             l2_pgentry_t *snapshot2 = snapshot;
 
-            ASSERT(shadow_mode_write_all(d));
+            ASSERT(shadow_mode_write_all(d) || shadow_mode_wr_pt_pte(d));
             BUG_ON(!shadow_mode_refcounts(d)); // not yet implemented
 
             changed = 0;
@@ -1473,7 +1476,7 @@
             l2_pgentry_t *snapshot2 = snapshot;
             l1_pgentry_t *shadow2 = shadow;
 
-            ASSERT(shadow_mode_write_all(d));
+            ASSERT(shadow_mode_write_all(d) || shadow_mode_wr_pt_pte(d));
             BUG_ON(!shadow_mode_refcounts(d)); // not yet implemented
 
             changed = 0;
@@ -1822,8 +1825,13 @@
                 goto fail;
             }
         }
-
-        if ( !l1pte_write_fault(v, &gpte, &spte, va) )
+        else if ( unlikely(!shadow_mode_wr_pt_pte(d) && 
mfn_is_page_table(l1e_get_pfn(gpte))) )
+        {
+            SH_LOG("l1pte_write_fault: no write access to page table page");
+            domain_crash_synchronous();
+        }
+
+        if ( unlikely(!l1pte_write_fault(v, &gpte, &spte, va)) )
         {
             SH_VVLOG("shadow_fault - EXIT: l1pte_write_fault failed");
             perfc_incrc(write_fault_bail);
@@ -2072,6 +2080,7 @@
 /************************************************************************/
 /************************************************************************/
 
+#if 0 // this code has not been updated for 32pae & 64 bit modes
 #if SHADOW_DEBUG
 
 // The following is entirely for _check_pagetable()'s benefit.
@@ -2118,8 +2127,8 @@
 // BUG: these are not SMP safe...
 static int sh_l2_present;
 static int sh_l1_present;
-char * sh_check_name;
-int shadow_status_noswap;
+static char *sh_check_name;
+// int shadow_status_noswap; // declared in shadow32.c
 
 #define v2m(_v, _adr) ({                                                     \
     unsigned long _a  = (unsigned long)(_adr);                               \
@@ -2218,11 +2227,11 @@
 
     guest_writable =
         (l1e_get_flags(eff_guest_pte) & _PAGE_RW) ||
-        (VM_ASSIST(d, VMASST_TYPE_writable_pagetables) && (level == 1) && 
mfn_out_of_sync(eff_guest_mfn));
+        (shadow_mode_write_l1(d) && (level == 1) && 
mfn_out_of_sync(eff_guest_mfn));
 
     if ( (l1e_get_flags(shadow_pte) & _PAGE_RW ) && !guest_writable )
     {
-        printk("eff_guest_pfn=%lx eff_guest_mfn=%lx shadow_mfn=%lx t=0x%08x 
page_table_page=%d\n",
+        printk("eff_guest_pfn=%lx eff_guest_mfn=%lx shadow_mfn=%lx t=0x%08lx 
page_table_page=%d\n",
                eff_guest_pfn, eff_guest_mfn, shadow_mfn,
                frame_table[eff_guest_mfn].u.inuse.type_info,
                page_table_page);
@@ -2233,7 +2242,7 @@
          (l1e_get_flags(shadow_pte) & _PAGE_RW ) &&
          !(guest_writable && (l1e_get_flags(eff_guest_pte) & _PAGE_DIRTY)) )
     {
-        printk("eff_guest_pfn=%lx eff_guest_mfn=%lx shadow_mfn=%lx t=0x%08x 
page_table_page=%d\n",
+        printk("eff_guest_pfn=%lx eff_guest_mfn=%lx shadow_mfn=%lx t=0x%08lx 
page_table_page=%d\n",
                eff_guest_pfn, eff_guest_mfn, shadow_mfn,
                frame_table[eff_guest_mfn].u.inuse.type_info,
                page_table_page);
@@ -2393,13 +2402,12 @@
 }
 #undef FAILPT
 
-static int _check_pagetable(struct vcpu *v, char *s)
+int _check_pagetable(struct vcpu *v, char *s)
 {
     struct domain *d = v->domain;
 #if defined (__x86_64__)
     pagetable_t pt = ((v->arch.flags & TF_kernel_mode)?
-                      pagetable_get_pfn(v->arch.guest_table) :
-                      pagetable_get_pfn(v->arch.guest_table_user));
+                      v->arch.guest_table : v->arch.guest_table_user);
 #else
     pagetable_t pt = v->arch.guest_table;
 #endif
@@ -2539,6 +2547,7 @@
 }
 
 #endif // SHADOW_DEBUG
+#endif // this code has not been updated for 32pae & 64 bit modes
 
 #if CONFIG_PAGING_LEVELS == 3
 static unsigned long shadow_l3_table(
diff -r e2bb85722b91 -r 7cbcdccd659d xen/arch/x86/shadow32.c
--- a/xen/arch/x86/shadow32.c   Tue Nov  8 13:53:27 2005
+++ b/xen/arch/x86/shadow32.c   Tue Nov  8 13:56:14 2005
@@ -624,6 +624,14 @@
     // under us...  First, collect the list of pinned pages, then
     // free them.
     //
+    // FIXME: it would be good to just free all the pages referred to in
+    // the hash table without going through each of them to decrement their
+    // reference counts.  In shadow_mode_refcount(), we've gotta do the hard
+    // work, but only for L1 shadows.  If we're not in refcount mode, then
+    // there's no real hard work to do at all.  Need to be careful with the
+    // writable_pte_predictions and snapshot entries in the hash table, but
+    // that's about it.
+    //
     for ( i = 0; i < shadow_ht_buckets; i++ )
     {
         u32 count;
@@ -634,17 +642,51 @@
             continue;
 
         count = 0;
-        for ( x = &d->arch.shadow_ht[i]; x != NULL; x = x->next )
-            if ( MFN_PINNED(x->smfn) )
-                count++;
+
+        for ( x = &d->arch.shadow_ht[i]; x != NULL; x = x->next ) {
+           /* Skip entries that are writable_pred) */
+           switch(x->gpfn_and_flags & PGT_type_mask){
+               case PGT_l1_shadow:
+               case PGT_l2_shadow:
+               case PGT_l3_shadow:
+               case PGT_l4_shadow:
+               case PGT_hl2_shadow:
+                   if ( MFN_PINNED(x->smfn) )
+                       count++;
+                   break;
+               case PGT_snapshot:
+               case PGT_writable_pred:
+                   break;
+               default:
+                   BUG();
+
+           }
+       }
+
         if ( !count )
             continue;
 
         mfn_list = xmalloc_array(unsigned long, count);
         count = 0;
-        for ( x = &d->arch.shadow_ht[i]; x != NULL; x = x->next )
-            if ( MFN_PINNED(x->smfn) )
-                mfn_list[count++] = x->smfn;
+        for ( x = &d->arch.shadow_ht[i]; x != NULL; x = x->next ) {
+           /* Skip entries that are writable_pred) */
+           switch(x->gpfn_and_flags & PGT_type_mask){
+               case PGT_l1_shadow:
+               case PGT_l2_shadow:
+               case PGT_l3_shadow:
+               case PGT_l4_shadow:
+               case PGT_hl2_shadow:
+                   if ( MFN_PINNED(x->smfn) )
+                       mfn_list[count++] = x->smfn;
+                   break;
+               case PGT_snapshot:
+               case PGT_writable_pred:
+                   break;
+               default:
+                   BUG();
+
+           }
+       }
 
         while ( count )
         {
@@ -779,6 +821,7 @@
     unsigned long va = pfn << PAGE_SHIFT;
 
     ASSERT(tabpfn != 0);
+    ASSERT(shadow_lock_is_acquired(d));
 
     l2 = map_domain_page_with_cache(tabpfn, l2cache);
     l2e = l2[l2_table_offset(va)];
@@ -2037,7 +2080,12 @@
         while ( count )
         {
             count--;
+            /* delete_shadow_status() may do a shadow_audit(), so we need to
+             * keep an accurate count of writable_pte_predictions to keep it
+             * happy.
+             */
             delete_shadow_status(d, gpfn_list[count], 0, PGT_writable_pred);
+            perfc_decr(writable_pte_predictions);
         }
 
         xfree(gpfn_list);
@@ -2273,18 +2321,17 @@
 
         if ( !smfn )
         {
+            // For heavy weight shadows: no need to update refcounts if
+            // there's no shadow page.
+            //
             if ( shadow_mode_refcounts(d) )
                 continue;
 
-            // For light weight shadows, even when no shadow page exists,
-            // we need to resync the refcounts to the new contents of the
-            // guest page.
-            // This only applies when we have writable page tables.
+            // For light weight shadows: only need up resync the refcounts to
+            // the new contents of the guest page iff this it has the right
+            // page type.
             //
-            if ( !shadow_mode_write_all(d) &&
-                 !((stype == PGT_l1_shadow) &&
-                   VM_ASSIST(d, VMASST_TYPE_writable_pagetables)) )
-                // Page is not writable -- no resync necessary
+            if ( stype != ( pfn_to_page(entry->gmfn)->u.inuse.type_info & 
PGT_type_mask) )
                 continue;
         }
 
@@ -2312,8 +2359,8 @@
             l1_pgentry_t *snapshot1 = snapshot;
             int unshadow_l1 = 0;
 
-            ASSERT(VM_ASSIST(d, VMASST_TYPE_writable_pagetables) ||
-                   shadow_mode_write_all(d));
+            ASSERT(shadow_mode_write_l1(d) ||
+                   shadow_mode_write_all(d) || shadow_mode_wr_pt_pte(d));
 
             if ( !shadow_mode_refcounts(d) )
                 revalidate_l1(d, guest1, snapshot1);
@@ -2380,7 +2427,7 @@
             l2_pgentry_t *shadow2 = shadow;
             l2_pgentry_t *snapshot2 = snapshot;
 
-            ASSERT(shadow_mode_write_all(d));
+            ASSERT(shadow_mode_write_all(d) || shadow_mode_wr_pt_pte(d));
             BUG_ON(!shadow_mode_refcounts(d)); // not yet implemented
 
             changed = 0;
@@ -2426,7 +2473,7 @@
             l2_pgentry_t *snapshot2 = snapshot;
             l1_pgentry_t *shadow2 = shadow;
             
-            ASSERT(shadow_mode_write_all(d));
+            ASSERT(shadow_mode_write_all(d) || shadow_mode_wr_pt_pte(d));
             BUG_ON(!shadow_mode_refcounts(d)); // not yet implemented
 
             changed = 0;
@@ -2619,8 +2666,13 @@
                 goto fail;
             }
         }
-
-        if ( !l1pte_write_fault(v, &gpte, &spte, va) )
+        else if ( unlikely(!shadow_mode_wr_pt_pte(d) && 
mfn_is_page_table(l1e_get_pfn(gpte))) )
+        {
+            SH_LOG("l1pte_write_fault: no write access to page table page");
+            domain_crash_synchronous();
+        }
+
+        if ( unlikely(!l1pte_write_fault(v, &gpte, &spte, va)) )
         {
             SH_VVLOG("shadow_fault - EXIT: l1pte_write_fault failed");
             perfc_incrc(write_fault_bail);
@@ -2954,7 +3006,7 @@
 // BUG: these are not SMP safe...
 static int sh_l2_present;
 static int sh_l1_present;
-char * sh_check_name;
+static char *sh_check_name;
 int shadow_status_noswap;
 
 #define v2m(_v, _adr) ({                                                     \
@@ -3054,7 +3106,7 @@
 
     guest_writable =
         (l1e_get_flags(eff_guest_pte) & _PAGE_RW) ||
-        (VM_ASSIST(d, VMASST_TYPE_writable_pagetables) && (level == 1) && 
mfn_out_of_sync(eff_guest_mfn));
+        (shadow_mode_write_l1(d) && (level == 1) && 
mfn_out_of_sync(eff_guest_mfn));
 
     if ( (l1e_get_flags(shadow_pte) & _PAGE_RW ) && !guest_writable )
     {
diff -r e2bb85722b91 -r 7cbcdccd659d xen/arch/x86/vmx.c
--- a/xen/arch/x86/vmx.c        Tue Nov  8 13:53:27 2005
+++ b/xen/arch/x86/vmx.c        Tue Nov  8 13:56:14 2005
@@ -79,7 +79,7 @@
          * the shared 1:1 page table initially. It shouldn't hurt */
         shadow_mode_enable(v->domain,
                            SHM_enable|SHM_refcounts|
-                           SHM_translate|SHM_external);
+                           SHM_translate|SHM_external|SHM_wr_pt_pte);
     }
 
     vmx_switch_on = 1;
diff -r e2bb85722b91 -r 7cbcdccd659d xen/include/asm-x86/page.h
--- a/xen/include/asm-x86/page.h        Tue Nov  8 13:53:27 2005
+++ b/xen/include/asm-x86/page.h        Tue Nov  8 13:56:14 2005
@@ -271,6 +271,9 @@
 #define _PAGE_PAT      0x080U
 #define _PAGE_PSE      0x080U
 #define _PAGE_GLOBAL   0x100U
+#define _PAGE_AVAIL0   0x200U
+#define _PAGE_AVAIL1   0x400U
+#define _PAGE_AVAIL2   0x800U
 #define _PAGE_AVAIL    0xE00U
 
 #define __PAGE_HYPERVISOR \
diff -r e2bb85722b91 -r 7cbcdccd659d xen/include/asm-x86/shadow.h
--- a/xen/include/asm-x86/shadow.h      Tue Nov  8 13:53:27 2005
+++ b/xen/include/asm-x86/shadow.h      Tue Nov  8 13:56:14 2005
@@ -45,15 +45,21 @@
 #define SHM_write_all (1<<2) /* allow write access to all guest pt pages,
                                 regardless of pte write permissions */
 #define SHM_log_dirty (1<<3) /* enable log dirty mode */
-#define SHM_translate (1<<4) /* do p2m tranaltion on guest tables */
-#define SHM_external  (1<<5) /* external page table, not used by Xen */
+#define SHM_translate (1<<4) /* Xen does p2m translation, not guest */
+#define SHM_external  (1<<5) /* Xen does not steal address space from the
+                                domain for its own booking; requires VT or
+                                similar mechanisms */
+#define SHM_wr_pt_pte (1<<6) /* guest allowed to set PAGE_RW bit in PTEs which
+                                point to page table pages. */
 
 #define shadow_mode_enabled(_d)   ((_d)->arch.shadow_mode)
 #define shadow_mode_refcounts(_d) ((_d)->arch.shadow_mode & SHM_refcounts)
+#define shadow_mode_write_l1(_d)  (VM_ASSIST(_d, 
VMASST_TYPE_writable_pagetables))
 #define shadow_mode_write_all(_d) ((_d)->arch.shadow_mode & SHM_write_all)
 #define shadow_mode_log_dirty(_d) ((_d)->arch.shadow_mode & SHM_log_dirty)
 #define shadow_mode_translate(_d) ((_d)->arch.shadow_mode & SHM_translate)
 #define shadow_mode_external(_d)  ((_d)->arch.shadow_mode & SHM_external)
+#define shadow_mode_wr_pt_pte(_d) ((_d)->arch.shadow_mode & SHM_wr_pt_pte)
 
 #define shadow_linear_pg_table ((l1_pgentry_t *)SH_LINEAR_PT_VIRT_START)
 #define __shadow_linear_l2_table ((l2_pgentry_t *)(SH_LINEAR_PT_VIRT_START + \
@@ -324,8 +330,7 @@
 
 #if SHADOW_DEBUG
 extern int shadow_status_noswap;
-#define _SHADOW_REFLECTS_SNAPSHOT ( 9)
-#define SHADOW_REFLECTS_SNAPSHOT  (1u << _SHADOW_REFLECTS_SNAPSHOT)
+#define SHADOW_REFLECTS_SNAPSHOT _PAGE_AVAIL0
 #endif
 
 #ifdef VERBOSE
@@ -1474,7 +1479,8 @@
             if ( stype != PGT_writable_pred )
                 BUG(); // we should never replace entries into the hash table
             x->smfn = smfn;
-            put_page(pfn_to_page(gmfn)); // already had a ref...
+            if ( stype != PGT_writable_pred )
+                put_page(pfn_to_page(gmfn)); // already had a ref...
             goto done;
         }
 
@@ -1656,14 +1662,18 @@
          (type == PGT_writable_page) )
         type = shadow_max_pgtable_type(d, gpfn, NULL);
 
-    if ( VM_ASSIST(d, VMASST_TYPE_writable_pagetables) &&
-         (type == PGT_l1_page_table) &&
-         (va < HYPERVISOR_VIRT_START) &&
-         KERNEL_MODE(v, regs) )
-        return 1;
-
-    if ( shadow_mode_write_all(d) &&
-         type && (type <= PGT_l4_page_table) &&
+    // Strange but true: writable page tables allow kernel-mode access
+    // to L1 page table pages via write-protected PTEs...  Similarly, write 
+    // access to all page table pages is granted for shadow_mode_write_all
+    // clients.
+    //
+    if ( ((shadow_mode_write_l1(d) && (type == PGT_l1_page_table)) ||
+          (shadow_mode_write_all(d) && type && (type <= PGT_l4_page_table))) &&
+         ((va < HYPERVISOR_VIRT_START)
+#if defined(__x86_64__)
+          || (va >= HYPERVISOR_VIRT_END)
+#endif
+             ) &&
          KERNEL_MODE(v, regs) )
         return 1;
 

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