Mailing List Archive

Patch to run a domU in shadow test mode.
ChangeSet 1.1272.1.1, 2005/04/12 10:32:24+01:00, mafetter@fleming.research

Patch to run a domU in shadow test mode.



linux-2.6.11-xen-sparse/arch/xen/Kconfig | 7 ++
linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 | 1
linux-2.6.11-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 | 4 +
linux-2.6.11-xen-sparse/arch/xen/i386/mm/hypervisor.c | 4 +
linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c | 2
linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h | 5 ++
linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h | 9 +++
linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h | 15 +++++-
tools/libxc/xc_linux_build.c | 15 ++++++
xen/arch/x86/domain.c | 14 ++++-
xen/arch/x86/mm.c | 11 ++--
xen/arch/x86/shadow.c | 17 ++-----
xen/common/dom_mem_ops.c | 9 ---
xen/include/asm-x86/shadow.h | 24 +++++-----
xen/include/xen/perfc_defn.h | 1
15 files changed, 97 insertions(+), 41 deletions(-)


diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/Kconfig b/linux-2.6.11-xen-sparse/arch/xen/Kconfig
--- a/linux-2.6.11-xen-sparse/arch/xen/Kconfig 2005-04-13 19:03:07 -04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/Kconfig 2005-04-13 19:03:07 -04:00
@@ -123,6 +123,13 @@
to a character device, allowing device prototyping in application
space. Odds are that you want to say N here.

+config XEN_SHADOW_MODE
+ bool "Fake shadow mode"
+ default n
+ help
+ fakes out a shadow mode kernel
+
+
config XEN_SCRUB_PAGES
bool "Scrub memory before freeing it to Xen"
default y
diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 b/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32
--- a/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 2005-04-13 19:03:08 -04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 2005-04-13 19:03:08 -04:00
@@ -14,6 +14,7 @@
CONFIG_XEN_PHYSDEV_ACCESS=y
CONFIG_XEN_BLKDEV_BACKEND=y
# CONFIG_XEN_BLKDEV_TAP_BE is not set
+# CONFIG_XEN_BLKDEV_GRANT is not set
CONFIG_XEN_NETDEV_BACKEND=y
CONFIG_XEN_BLKDEV_FRONTEND=y
CONFIG_XEN_NETDEV_FRONTEND=y
diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 b/linux-2.6.11-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32
--- a/linux-2.6.11-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 2005-04-13 19:03:08 -04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 2005-04-13 19:03:08 -04:00
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.11-xenU
-# Fri Mar 11 01:20:28 2005
+# Tue Apr 5 16:44:33 2005
#
CONFIG_XEN=y
CONFIG_ARCH_XEN=y
@@ -12,10 +12,12 @@
#
# CONFIG_XEN_PRIVILEGED_GUEST is not set
# CONFIG_XEN_PHYSDEV_ACCESS is not set
+# CONFIG_XEN_BLKDEV_GRANT is not set
CONFIG_XEN_BLKDEV_FRONTEND=y
CONFIG_XEN_NETDEV_FRONTEND=y
# CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set
# CONFIG_XEN_BLKDEV_TAP is not set
+CONFIG_XEN_SHADOW_MODE=y
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_X86=y
# CONFIG_X86_64 is not set
diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/i386/mm/hypervisor.c b/linux-2.6.11-xen-sparse/arch/xen/i386/mm/hypervisor.c
--- a/linux-2.6.11-xen-sparse/arch/xen/i386/mm/hypervisor.c 2005-04-13 19:03:08 -04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/i386/mm/hypervisor.c 2005-04-13 19:03:08 -04:00
@@ -48,6 +48,7 @@
#define pmd_val_ma(v) (v).pud.pgd.pgd;
#endif

+#ifndef CONFIG_XEN_SHADOW_MODE
void xen_l1_entry_update(pte_t *ptr, unsigned long val)
{
mmu_update_t u;
@@ -63,6 +64,7 @@
u.val = pmd_val_ma(val);
BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
}
+#endif

void xen_machphys_update(unsigned long mfn, unsigned long pfn)
{
@@ -131,6 +133,7 @@

#endif /* CONFIG_SMP */

+#ifndef CONFIG_XEN_SHADOW_MODE
void xen_pgd_pin(unsigned long ptr)
{
struct mmuext_op op;
@@ -162,6 +165,7 @@
op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
}
+#endif

void xen_set_ldt(unsigned long ptr, unsigned long len)
{
diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c b/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c
--- a/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c 2005-04-13 19:03:08 -04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c 2005-04-13 19:03:08 -04:00
@@ -366,6 +366,7 @@
kmem_cache_free(pgd_cache, pgd);
}

+#ifndef CONFIG_XEN_SHADOW_MODE
void make_lowmem_page_readonly(void *va)
{
pgd_t *pgd = pgd_offset_k((unsigned long)va);
@@ -437,3 +438,4 @@
va = (void *)((unsigned long)va + PAGE_SIZE);
}
}
+#endif /* CONFIG_XEN_SHADOW_MODE */
diff -Nru a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h
--- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h 2005-04-13 19:03:08 -04:00
+++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h 2005-04-13 19:03:08 -04:00
@@ -15,7 +15,12 @@
*/
#define set_pte(pteptr, pteval) (*(pteptr) = pteval)
#define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval)
+
+#ifndef CONFIG_XEN_SHADOW_MODE
#define set_pmd(pmdptr, pmdval) xen_l2_entry_update((pmdptr), (pmdval))
+#else
+#define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval))
+#endif

#define ptep_get_and_clear(xp) __pte_ma(xchg(&(xp)->pte_low, 0))
#define pte_same(a, b) ((a).pte_low == (b).pte_low)
diff -Nru a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h
--- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h 2005-04-13 19:03:08 -04:00
+++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h 2005-04-13 19:03:08 -04:00
@@ -432,12 +432,21 @@
} \
} while (0)

+#ifndef CONFIG_XEN_SHADOW_MODE
void make_lowmem_page_readonly(void *va);
void make_lowmem_page_writable(void *va);
void make_page_readonly(void *va);
void make_page_writable(void *va);
void make_pages_readonly(void *va, unsigned int nr);
void make_pages_writable(void *va, unsigned int nr);
+#else
+#define make_lowmem_page_readonly(_va) ((void)0)
+#define make_lowmem_page_writable(_va) ((void)0)
+#define make_page_readonly(_va) ((void)0)
+#define make_page_writable(_va) ((void)0)
+#define make_pages_readonly(_va, _nr) ((void)0)
+#define make_pages_writable(_va, _nr) ((void)0)
+#endif

#define arbitrary_virt_to_machine(__va) \
({ \
diff -Nru a/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h b/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h
--- a/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h 2005-04-13 19:03:07 -04:00
+++ b/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h 2005-04-13 19:03:07 -04:00
@@ -71,15 +71,26 @@
* be MACHINE addresses.
*/

-void xen_l1_entry_update(pte_t *ptr, unsigned long val);
-void xen_l2_entry_update(pmd_t *ptr, pmd_t val);
void xen_pt_switch(unsigned long ptr);
void xen_tlb_flush(void);
void xen_invlpg(unsigned long ptr);
+
+#ifndef CONFIG_XEN_SHADOW_MODE
+void xen_l1_entry_update(pte_t *ptr, unsigned long val);
+void xen_l2_entry_update(pmd_t *ptr, pmd_t val);
void xen_pgd_pin(unsigned long ptr);
void xen_pgd_unpin(unsigned long ptr);
void xen_pte_pin(unsigned long ptr);
void xen_pte_unpin(unsigned long ptr);
+#else
+#define xen_l1_entry_update(_p, _v) set_pte((_p), (pte_t){(_v)})
+#define xen_l2_entry_update(_p, _v) set_pgd((_p), (pgd_t){(_v)})
+#define xen_pgd_pin(_p) ((void)0)
+#define xen_pgd_unpin(_p) ((void)0)
+#define xen_pte_pin(_p) ((void)0)
+#define xen_pte_unpin(_p) ((void)0)
+#endif
+
void xen_set_ldt(unsigned long ptr, unsigned long bytes);
void xen_machphys_update(unsigned long mfn, unsigned long pfn);

diff -Nru a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c 2005-04-13 19:03:08 -04:00
+++ b/tools/libxc/xc_linux_build.c 2005-04-13 19:03:08 -04:00
@@ -210,9 +210,11 @@
}

*vl1e = (page_array[count] << PAGE_SHIFT) | L1_PROT;
+#if !(1 || defined(GROSS_HACK_TO_TEST_SHADOW_MODE_CLIENTS))
if ( (count >= ((vpt_start-dsi.v_start)>>PAGE_SHIFT)) &&
(count < ((vpt_end -dsi.v_start)>>PAGE_SHIFT)) )
*vl1e &= ~_PAGE_RW;
+#endif
vl1e++;
}
munmap(vl1tab, PAGE_SIZE);
@@ -243,12 +245,25 @@
}
munmap(physmap, PAGE_SIZE);

+#if 1 || defined(GROSS_HACK_TO_TEST_SHADOW_MODE_CLIENTS)
+ {
+ int ret;
+ ret = xc_shadow_control(xc_handle, dom,
+ DOM0_SHADOW_CONTROL_OP_ENABLE_TEST,
+ NULL, 0, NULL);
+ if ( !ret )
+ ERROR("enabling shadow test mode failed\n");
+ }
+#endif
+
/*
* Pin down l2tab addr as page dir page - causes hypervisor to provide
* correct protection for the page
*/
+#if !(1 || defined(GROSS_HACK_TO_TEST_SHADOW_MODE_CLIENTS))
if ( pin_table(xc_handle, MMUEXT_PIN_L2_TABLE, l2tab>>PAGE_SHIFT, dom) )
goto error_out;
+#endif

start_info = xc_map_foreign_range(
xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
diff -Nru a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c 2005-04-13 19:03:07 -04:00
+++ b/xen/arch/x86/domain.c 2005-04-13 19:03:08 -04:00
@@ -440,9 +440,17 @@
phys_basetab = c->pt_base;
ed->arch.guest_table = mk_pagetable(phys_basetab);

- if ( !get_page_and_type(&frame_table[phys_basetab>>PAGE_SHIFT], d,
- PGT_base_page_table) )
- return -EINVAL;
+ if ( shadow_mode_enabled(d) )
+ {
+ if ( !get_page(&frame_table[phys_basetab>>PAGE_SHIFT], d) )
+ return -EINVAL;
+ }
+ else
+ {
+ if ( !get_page_and_type(&frame_table[phys_basetab>>PAGE_SHIFT], d,
+ PGT_base_page_table) )
+ return -EINVAL;
+ }

/* Failure to set GDT is harmless. */
SET_GDT_ENTRIES(ed, DEFAULT_GDT_ENTRIES);
diff -Nru a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c 2005-04-13 19:03:08 -04:00
+++ b/xen/arch/x86/mm.c 2005-04-13 19:03:08 -04:00
@@ -1897,8 +1897,11 @@
gpfn = __mfn_to_gpfn(d, mfn);
ASSERT(VALID_M2P(gpfn));

- if ( page_is_page_table(page) )

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