[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |