Mailing List Archive

Split XENFEAT_writable_mmu_structures into
# HG changeset patch
# User kaf24@firebug.cl.cam.ac.uk
# Node ID a0a59beb65968b916098dc77c7f9f15043e50b12
# Parent 1712b52e00743c66d3245a0961f7b2ebcacb8354
Split XENFEAT_writable_mmu_structures into
XENFEAT_writable_page_tables/XENFEAT_writable_descriptor_tables.

Name the make_readonly/writable functions back to their old
names, and they now accept a feature flag that they test
before performing their operation.

Signed-off-by: Keir Fraser <keir@xensource.com>

diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/arch/xen/i386/kernel/cpu/common.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/cpu/common.c Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/cpu/common.c Mon Jan 30 11:49:31 2006
@@ -572,7 +572,8 @@
va < gdt_descr->address + gdt_descr->size;
va += PAGE_SIZE, f++) {
frames[f] = virt_to_mfn(va);
- make_lowmem_mmu_page_readonly((void *)va);
+ make_lowmem_page_readonly(
+ (void *)va, XENFEAT_writable_descriptor_tables);
}
if (HYPERVISOR_set_gdt(frames, gdt_descr->size / 8))
BUG();
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/arch/xen/i386/kernel/ldt.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/ldt.c Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/ldt.c Mon Jan 30 11:49:31 2006
@@ -59,8 +59,10 @@
cpumask_t mask;
preempt_disable();
#endif
- make_mmu_pages_readonly(pc->ldt, (pc->size * LDT_ENTRY_SIZE) /
- PAGE_SIZE);
+ make_pages_readonly(
+ pc->ldt,
+ (pc->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
+ XENFEAT_writable_descriptor_tables);
load_LDT(pc);
#ifdef CONFIG_SMP
mask = cpumask_of_cpu(smp_processor_id());
@@ -70,8 +72,10 @@
#endif
}
if (oldsize) {
- make_mmu_pages_writable(oldldt, (oldsize * LDT_ENTRY_SIZE) /
- PAGE_SIZE);
+ make_pages_writable(
+ oldldt,
+ (oldsize * LDT_ENTRY_SIZE) / PAGE_SIZE,
+ XENFEAT_writable_descriptor_tables);
if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE)
vfree(oldldt);
else
@@ -86,8 +90,10 @@
if (err < 0)
return err;
memcpy(new->ldt, old->ldt, old->size*LDT_ENTRY_SIZE);
- make_mmu_pages_readonly(new->ldt, (new->size * LDT_ENTRY_SIZE) /
- PAGE_SIZE);
+ make_pages_readonly(
+ new->ldt,
+ (new->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
+ XENFEAT_writable_descriptor_tables);
return 0;
}

@@ -119,9 +125,10 @@
if (mm->context.size) {
if (mm == current->active_mm)
clear_LDT();
- make_mmu_pages_writable(mm->context.ldt,
- (mm->context.size * LDT_ENTRY_SIZE) /
- PAGE_SIZE);
+ make_pages_writable(
+ mm->context.ldt,
+ (mm->context.size * LDT_ENTRY_SIZE) / PAGE_SIZE,
+ XENFEAT_writable_descriptor_tables);
if (mm->context.size*LDT_ENTRY_SIZE > PAGE_SIZE)
vfree(mm->context.ldt);
else
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c Mon Jan 30 11:49:31 2006
@@ -995,7 +995,8 @@
* default LDT is a single-entry callgate to lcall7 for iBCS
* and a callgate to lcall27 for Solaris/x86 binaries
*/
- make_lowmem_mmu_page_readonly(&default_ldt[0]);
+ make_lowmem_page_readonly(
+ &default_ldt[0], XENFEAT_writable_descriptor_tables);

/*
* Should be a barrier for any external CPU state.
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/arch/xen/i386/mm/init.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/mm/init.c Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/init.c Mon Jan 30 11:49:31 2006
@@ -68,7 +68,7 @@

#ifdef CONFIG_X86_PAE
pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
- make_lowmem_mmu_page_readonly(pmd_table);
+ make_lowmem_page_readonly(pmd_table, XENFEAT_writable_page_tables);
set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
pud = pud_offset(pgd, 0);
if (pmd_table != pmd_offset(pud, 0))
@@ -89,7 +89,8 @@
{
if (pmd_none(*pmd)) {
pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
- make_lowmem_mmu_page_readonly(page_table);
+ make_lowmem_page_readonly(page_table,
+ XENFEAT_writable_page_tables);
set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
if (page_table != pte_offset_kernel(pmd, 0))
BUG();
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c Mon Jan 30 11:49:31 2006
@@ -199,7 +199,7 @@
{
pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO);
if (pte)
- make_lowmem_mmu_page_readonly(pte);
+ make_lowmem_page_readonly(pte, XENFEAT_writable_page_tables);
return pte;
}

@@ -345,7 +345,8 @@
pmd_t *kpmd = pmd_offset(kpud, v);
pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
memcpy(pmd, kpmd, PAGE_SIZE);
- make_lowmem_mmu_page_readonly(pmd);
+ make_lowmem_page_readonly(
+ pmd, XENFEAT_writable_page_tables);
}
pgd_list_add(pgd);
spin_unlock_irqrestore(&pgd_lock, flags);
@@ -379,7 +380,8 @@
spin_unlock_irqrestore(&pgd_lock, flags);
for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
- make_lowmem_mmu_page_writable(pmd);
+ make_lowmem_page_writable(
+ pmd, XENFEAT_writable_page_tables);
memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
kmem_cache_free(pmd_cache, pmd);
}
@@ -390,12 +392,12 @@
}

#ifndef CONFIG_XEN_SHADOW_MODE
-void make_lowmem_mmu_page_readonly(void *va)
+void make_lowmem_page_readonly(void *va, unsigned int feature)
{
pte_t *pte;
int rc;

- if (xen_feature(writable_mmu_structures))
+ if (xen_feature(feature))
return;

pte = virt_to_ptep(va);
@@ -404,12 +406,12 @@
BUG_ON(rc);
}

-void make_lowmem_mmu_page_writable(void *va)
+void make_lowmem_page_writable(void *va, unsigned int feature)
{
pte_t *pte;
int rc;

- if (xen_feature(writable_mmu_structures))
+ if (xen_feature(feature))
return;

pte = virt_to_ptep(va);
@@ -418,12 +420,12 @@
BUG_ON(rc);
}

-void make_mmu_page_readonly(void *va)
+void make_page_readonly(void *va, unsigned int feature)
{
pte_t *pte;
int rc;

- if (xen_feature(writable_mmu_structures))
+ if (xen_feature(feature))
return;

pte = virt_to_ptep(va);
@@ -438,17 +440,17 @@
kmap_flush_unused(); /* flush stale writable kmaps */
else
#endif
- make_lowmem_mmu_page_readonly(
- phys_to_virt(pfn << PAGE_SHIFT));
- }
-}
-
-void make_mmu_page_writable(void *va)
+ make_lowmem_page_readonly(
+ phys_to_virt(pfn << PAGE_SHIFT), feature);
+ }
+}
+
+void make_page_writable(void *va, unsigned int feature)
{
pte_t *pte;
int rc;

- if (xen_feature(writable_mmu_structures))
+ if (xen_feature(feature))
return;

pte = virt_to_ptep(va);
@@ -461,28 +463,29 @@
#ifdef CONFIG_HIGHMEM
if (pfn < highstart_pfn)
#endif
- make_lowmem_mmu_page_writable(
- phys_to_virt(pfn << PAGE_SHIFT));
- }
-}
-
-void make_mmu_pages_readonly(void *va, unsigned int nr)
-{
- if (xen_feature(writable_mmu_structures))
+ make_lowmem_page_writable(
+ phys_to_virt(pfn << PAGE_SHIFT), feature);
+ }
+}
+
+void make_pages_readonly(void *va, unsigned int nr, unsigned int feature)
+{
+ if (xen_feature(feature))
return;

while (nr-- != 0) {
- make_mmu_page_readonly(va);
+ make_page_readonly(va, feature);
va = (void *)((unsigned long)va + PAGE_SIZE);
}
}

-void make_mmu_pages_writable(void *va, unsigned int nr)
-{
- if (xen_feature(writable_mmu_structures))
- return;
+void make_pages_writable(void *va, unsigned int nr, unsigned int feature)
+{
+ if (xen_feature(feature))
+ return;
+
while (nr-- != 0) {
- make_mmu_page_writable(va);
+ make_page_writable(va, feature);
va = (void *)((unsigned long)va + PAGE_SIZE);
}
}
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/arch/xen/kernel/features.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/features.c Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/features.c Mon Jan 30 11:49:31 2006
@@ -3,27 +3,36 @@
*
* Xen feature flags.
*
- * Copyright (c) 2006, Ian Campbell
+ * Copyright (c) 2006, Ian Campbell, XenSource Inc.
*/
#include <linux/types.h>
#include <linux/cache.h>
#include <asm/hypervisor.h>
#include <asm-xen/features.h>

-/* When we rebase to a more recent version of Linux we can use __read_mostly here. */
+/* When we rebase to a more recent Linux we can use __read_mostly here. */
unsigned long xen_features[XENFEAT_NR_SUBMAPS] __cacheline_aligned;

void setup_xen_features(void)
{
- uint32_t *flags = (uint32_t *)&xen_features[0];
- xen_feature_info_t fi;
- int i;
+ uint32_t *flags = (uint32_t *)&xen_features[0];
+ xen_feature_info_t fi;
+ int i;

- for (i=0; i<XENFEAT_NR_SUBMAPS; i++) {
- fi.submap_idx = i;
- if (HYPERVISOR_xen_version(XENVER_get_features, &fi) < 0)
- break;
- flags[i] = fi.submap;
- }
+ for (i=0; i<XENFEAT_NR_SUBMAPS; i++) {
+ fi.submap_idx = i;
+ if (HYPERVISOR_xen_version(XENVER_get_features, &fi) < 0)
+ break;
+ flags[i] = fi.submap;
+ }
}

+/*
+ * Local variables:
+ * c-file-style: "linux"
+ * indent-tabs-mode: t
+ * c-indent-level: 8
+ * c-basic-offset: 8
+ * tab-width: 8
+ * End:
+ */
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/arch/xen/kernel/smpboot.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/smpboot.c Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/smpboot.c Mon Jan 30 11:49:31 2006
@@ -239,7 +239,9 @@
memcpy((void *)cpu_gdt_descr[cpu].address,
(void *)cpu_gdt_descr[0].address,
cpu_gdt_descr[0].size);
- make_mmu_page_readonly((void *)cpu_gdt_descr[cpu].address);
+ make_page_readonly(
+ (void *)cpu_gdt_descr[cpu].address,
+ XENFEAT_writable_descriptor_tables);

cpu_set(cpu, cpu_possible_map);
#ifdef CONFIG_HOTPLUG_CPU
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/arch/xen/x86_64/kernel/ldt.c
--- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/ldt.c Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/ldt.c Mon Jan 30 11:49:31 2006
@@ -65,8 +65,10 @@

preempt_disable();
#endif
- make_mmu_pages_readonly(pc->ldt, (pc->size * LDT_ENTRY_SIZE) /
- PAGE_SIZE);
+ make_pages_readonly(
+ pc->ldt,
+ (pc->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
+ XENFEAT_writable_descriptor_tables);
load_LDT(pc);
#ifdef CONFIG_SMP
mask = cpumask_of_cpu(smp_processor_id());
@@ -76,8 +78,10 @@
#endif
}
if (oldsize) {
- make_mmu_pages_writable(oldldt, (oldsize * LDT_ENTRY_SIZE) /
- PAGE_SIZE);
+ make_pages_writable(
+ oldldt,
+ (oldsize * LDT_ENTRY_SIZE) / PAGE_SIZE,
+ XENFEAT_writable_descriptor_tables);
if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE)
vfree(oldldt);
else
@@ -92,8 +96,10 @@
if (err < 0)
return err;
memcpy(new->ldt, old->ldt, old->size*LDT_ENTRY_SIZE);
- make_mmu_pages_readonly(new->ldt, (new->size * LDT_ENTRY_SIZE) /
- PAGE_SIZE);
+ make_pages_readonly(
+ new->ldt,
+ (new->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
+ XENFEAT_writable_descriptor_tables);
return 0;
}

@@ -131,9 +137,10 @@
if (mm->context.size) {
if (mm == current->active_mm)
clear_LDT();
- make_mmu_pages_writable(mm->context.ldt,
- (mm->context.size * LDT_ENTRY_SIZE) /
- PAGE_SIZE);
+ make_pages_writable(
+ mm->context.ldt,
+ (mm->context.size * LDT_ENTRY_SIZE) / PAGE_SIZE,
+ XENFEAT_writable_descriptor_tables);
if (mm->context.size*LDT_ENTRY_SIZE > PAGE_SIZE)
vfree(mm->context.ldt);
else
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup64.c
--- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup64.c Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup64.c Mon Jan 30 11:49:31 2006
@@ -141,7 +141,8 @@
va < gdt_descr->address + gdt_descr->size;
va += PAGE_SIZE, f++) {
frames[f] = virt_to_mfn(va);
- make_mmu_page_readonly((void *)va);
+ make_page_readonly(
+ (void *)va, XENFEAT_writable_descriptor_tables);
}
if (HYPERVISOR_set_gdt(frames, gdt_descr->size /
sizeof (struct desc_struct)))
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c
--- a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c Mon Jan 30 11:49:31 2006
@@ -68,13 +68,13 @@
(((mfn_to_pfn((addr) >> PAGE_SHIFT)) << PAGE_SHIFT) + \
__START_KERNEL_map)))

-static void early_make_mmu_page_readonly(void *va)
+static void early_make_page_readonly(void *va, unsigned int feature)
{
unsigned long addr, _va = (unsigned long)va;
pte_t pte, *ptep;
unsigned long *page = (unsigned long *) init_level4_pgt;

- if (xen_feature(writable_mmu_structures))
+ if (xen_feature(feature))
return;

addr = (unsigned long) page[pgd_index(_va)];
@@ -93,12 +93,12 @@
BUG();
}

-void make_mmu_page_readonly(void *va)
+void make_page_readonly(void *va, unsigned int feature)
{
pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep;
unsigned long addr = (unsigned long) va;

- if (xen_feature(writable_mmu_structures))
+ if (xen_feature(feature))
return;

pgd = pgd_offset_k(addr);
@@ -111,15 +111,15 @@
xen_l1_entry_update(ptep, pte); /* fallback */

if ((addr >= VMALLOC_START) && (addr < VMALLOC_END))
- make_mmu_page_readonly(__va(pte_pfn(pte) << PAGE_SHIFT));
-}
-
-void make_mmu_page_writable(void *va)
+ make_page_readonly(__va(pte_pfn(pte) << PAGE_SHIFT), feature);
+}
+
+void make_page_writable(void *va, unsigned int feature)
{
pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep;
unsigned long addr = (unsigned long) va;

- if (xen_feature(writable_mmu_structures))
+ if (xen_feature(feature))
return;

pgd = pgd_offset_k(addr);
@@ -132,26 +132,27 @@
xen_l1_entry_update(ptep, pte); /* fallback */

if ((addr >= VMALLOC_START) && (addr < VMALLOC_END))
- make_mmu_page_writable(__va(pte_pfn(pte) << PAGE_SHIFT));
-}
-
-void make_mmu_pages_readonly(void *va, unsigned nr)
-{
- if (xen_feature(writable_mmu_structures))
+ make_page_writable(__va(pte_pfn(pte) << PAGE_SHIFT), feature);
+}
+
+void make_pages_readonly(void *va, unsigned nr, unsigned int feature)
+{
+ if (xen_feature(feature))
return;

while (nr-- != 0) {
- make_mmu_page_readonly(va);
+ make_page_readonly(va, feature);
va = (void*)((unsigned long)va + PAGE_SIZE);
}
}

-void make_mmu_pages_writable(void *va, unsigned nr)
-{
- if (xen_feature(writable_mmu_structures))
+void make_pages_writable(void *va, unsigned nr, unsigned int feature)
+{
+ if (xen_feature(feature))
return;
+
while (nr-- != 0) {
- make_mmu_page_writable(va);
+ make_page_writable(va, feature);
va = (void*)((unsigned long)va + PAGE_SIZE);
}
}
@@ -239,7 +240,7 @@
pud = (user_mode ? pud_offset_u(vaddr) : pud_offset(pgd, vaddr));
if (pud_none(*pud)) {
pmd = (pmd_t *) spp_getpage();
- make_mmu_page_readonly(pmd);
+ make_page_readonly(pmd, XENFEAT_writable_page_tables);
xen_pmd_pin(__pa(pmd));
set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER));
if (pmd != pmd_offset(pud, 0)) {
@@ -250,7 +251,7 @@
pmd = pmd_offset(pud, vaddr);
if (pmd_none(*pmd)) {
pte = (pte_t *) spp_getpage();
- make_mmu_page_readonly(pte);
+ make_page_readonly(pte, XENFEAT_writable_page_tables);
xen_pte_pin(__pa(pte));
set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER));
if (pte != pte_offset_kernel(pmd, 0)) {
@@ -292,7 +293,7 @@
if (pud_none(*pud)) {

pmd = (pmd_t *) spp_getpage();
- make_mmu_page_readonly(pmd);
+ make_page_readonly(pmd, XENFEAT_writable_page_tables);
xen_pmd_pin(__pa(pmd));

set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER));
@@ -306,7 +307,7 @@

if (pmd_none(*pmd)) {
pte = (pte_t *) spp_getpage();
- make_mmu_page_readonly(pte);
+ make_page_readonly(pte, XENFEAT_writable_page_tables);
xen_pte_pin(__pa(pte));

set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER));
@@ -401,11 +402,9 @@
{
int readonly = 0;

- if (xen_feature(writable_mmu_structures))
- return 0;
-
/* Make old and new page tables read-only. */
- if ((paddr >= (xen_start_info->pt_base - __START_KERNEL_map))
+ if (!xen_feature(XENFEAT_writable_page_tables)
+ && (paddr >= (xen_start_info->pt_base - __START_KERNEL_map))
&& (paddr < ((table_start << PAGE_SHIFT) + tables_space)))
readonly = 1;
/*
@@ -438,7 +437,7 @@
}

pmd = alloc_static_page(&pmd_phys);
- early_make_mmu_page_readonly(pmd);
+ early_make_page_readonly(pmd, XENFEAT_writable_page_tables);
xen_pmd_pin(pmd_phys);
set_pud(pud, __pud(pmd_phys | _KERNPG_TABLE));
for (j = 0; j < PTRS_PER_PMD; pmd++, j++) {
@@ -467,7 +466,8 @@
__set_pte(pte, __pte(paddr | _KERNPG_TABLE));
}
pte = pte_save;
- early_make_mmu_page_readonly(pte);
+ early_make_page_readonly(
+ pte, XENFEAT_writable_page_tables);
xen_pte_pin(pte_phys);
set_pmd(pmd, __pmd(pte_phys | _KERNPG_TABLE));
}
@@ -516,11 +516,16 @@
_KERNPG_TABLE | _PAGE_USER);
memcpy((void *)level2_kernel_pgt, page, PAGE_SIZE);

- early_make_mmu_page_readonly(init_level4_pgt);
- early_make_mmu_page_readonly(init_level4_user_pgt);
- early_make_mmu_page_readonly(level3_kernel_pgt);
- early_make_mmu_page_readonly(level3_user_pgt);
- early_make_mmu_page_readonly(level2_kernel_pgt);
+ early_make_page_readonly(init_level4_pgt,
+ XENFEAT_writable_page_tables);
+ early_make_page_readonly(init_level4_user_pgt,
+ XENFEAT_writable_page_tables));
+ early_make_page_readonly(level3_kernel_pgt,
+ XENFEAT_writable_page_tables));
+ early_make_page_readonly(level3_user_pgt,
+ XENFEAT_writable_page_tables));
+ early_make_page_readonly(level2_kernel_pgt,
+ XENFEAT_writable_page_tables));

xen_pgd_pin(__pa_symbol(init_level4_pgt));
xen_pgd_pin(__pa_symbol(init_level4_user_pgt));
@@ -558,7 +563,8 @@
pmd = (pmd_t *)&page[pmd_index(va)];
if (pmd_none(*pmd)) {
pte_page = alloc_static_page(&phys);
- early_make_mmu_page_readonly(pte_page);
+ early_make_page_readonly(
+ pte_page, XENFEAT_writable_page_tables);
xen_pte_pin(phys);
set_pmd(pmd, __pmd(phys | _KERNPG_TABLE | _PAGE_USER));
} else {
@@ -605,7 +611,7 @@
for (; start < end; start = next) {
unsigned long pud_phys;
pud_t *pud = alloc_static_page(&pud_phys);
- early_make_mmu_page_readonly(pud);
+ early_make_page_readonly(pud, XENFEAT_writable_page_tables);
xen_pud_pin(pud_phys);
next = start + PGDIR_SIZE;
if (next > end)
@@ -810,11 +816,13 @@
set_page_count(virt_to_page(addr), 1);
memset((void *)(addr & ~(PAGE_SIZE-1)), 0xcc, PAGE_SIZE);
xen_pte_unpin(__pa(addr));
- make_mmu_page_writable(__va(__pa(addr)));
+ make_page_writable(
+ __va(__pa(addr)), XENFEAT_writable_page_tables);
/*
* Make pages from __PAGE_OFFSET address as well
*/
- make_mmu_page_writable((void *)addr);
+ make_page_writable(
+ (void *)addr, XENFEAT_writable_page_tables);
free_page(addr);
totalram_pages++;
}
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgalloc.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgalloc.h Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgalloc.h Mon Jan 30 11:49:31 2006
@@ -42,7 +42,7 @@
static inline void pte_free_kernel(pte_t *pte)
{
free_page((unsigned long)pte);
- make_mmu_page_writable(pte);
+ make_page_writable(pte, XENFEAT_writable_page_tables);
}

extern void pte_free(struct page *pte);
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h Mon Jan 30 11:49:31 2006
@@ -412,21 +412,13 @@
ptep_set_access_flags(__vma, __address, __ptep, __entry, 1); \
} while (0)

-#ifndef CONFIG_XEN_SHADOW_MODE
-void make_lowmem_mmu_page_readonly(void *va);
-void make_lowmem_mmu_page_writable(void *va);
-void make_mmu_page_readonly(void *va);
-void make_mmu_page_writable(void *va);
-void make_mmu_pages_readonly(void *va, unsigned int nr);
-void make_mmu_pages_writable(void *va, unsigned int nr);
-#else
-#define make_lowmem_mmu_page_readonly(_va) ((void)0)
-#define make_lowmem_mmu_page_writable(_va) ((void)0)
-#define make_mmu_page_readonly(_va) ((void)0)
-#define make_mmu_page_writable(_va) ((void)0)
-#define make_mmu_pages_readonly(_va, _nr) ((void)0)
-#define make_mmu_pages_writable(_va, _nr) ((void)0)
-#endif
+#include <asm-xen/features.h>
+void make_lowmem_page_readonly(void *va, unsigned int feature);
+void make_lowmem_page_writable(void *va, unsigned int feature);
+void make_page_readonly(void *va, unsigned int feature);
+void make_page_writable(void *va, unsigned int feature);
+void make_pages_readonly(void *va, unsigned int nr, unsigned int feature);
+void make_pages_writable(void *va, unsigned int nr, unsigned int feature);

#define virt_to_ptep(__va) \
({ \
diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgalloc.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgalloc.h Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgalloc.h Mon Jan 30 11:49:31 2006
@@ -7,10 +7,11 @@
#include <linux/mm.h>
#include <asm/io.h> /* for phys_to_virt and page_to_pseudophys */

-void make_mmu_page_readonly(void *va);
-void make_mmu_page_writable(void *va);
-void make_mmu_pages_readonly(void *va, unsigned int nr);
-void make_mmu_pages_writable(void *va, unsigned int nr);
+#include <asm-xen/features.h>
+void make_page_readonly(void *va, unsigned int feature);
+void make_page_writable(void *va, unsigned int feature);
+void make_pages_readonly(void *va, unsigned int nr, unsigned int feature);
+void make_pages_writable(void *va, unsigned int nr, unsigned int feature);

#define __user_pgd(pgd) ((pgd) + PTRS_PER_PGD)

@@ -161,7 +162,7 @@
{
pte_t *pte = (pte_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
if (pte)
- make_mmu_page_readonly(pte);
+ make_page_readonly(pte, XENFEAT_writable_page_tables);

return pte;
}
@@ -181,7 +182,7 @@
{
BUG_ON((unsigned long)pte & (PAGE_SIZE-1));
xen_pte_unpin(__pa(pte));
- make_mmu_page_writable(pte);
+ make_page_writable(pte, XENFEAT_writable_page_tables);
free_page((unsigned long)pte);
}

diff -r 1712b52e0074 -r a0a59beb6596 linux-2.6-xen-sparse/include/asm-xen/features.h
--- a/linux-2.6-xen-sparse/include/asm-xen/features.h Mon Jan 30 10:23:32 2006
+++ b/linux-2.6-xen-sparse/include/asm-xen/features.h Mon Jan 30 11:49:31 2006
@@ -15,6 +15,6 @@

extern unsigned long xen_features[XENFEAT_NR_SUBMAPS];

-#define xen_feature(flag) (test_bit(_XENFEAT_ ## flag, xen_features))
+#define xen_feature(flag) (test_bit(flag, xen_features))

-#endif
+#endif /* __ASM_XEN_FEATURES_H__ */
diff -r 1712b52e0074 -r a0a59beb6596 xen/include/public/version.h
--- a/xen/include/public/version.h Mon Jan 30 10:23:32 2006
+++ b/xen/include/public/version.h Mon Jan 30 11:49:31 2006
@@ -45,8 +45,8 @@
uint32_t submap; /* OUT: 32-bit submap */
} xen_feature_info_t;

-#define _XENFEAT_writable_mmu_structures 0
-#define XENFEAT_writable_mmu_structures (1UL<<_XENFEAT_writable_mmu_structures)
+#define XENFEAT_writable_page_tables 0
+#define XENFEAT_writable_descriptor_tables 1

#define XENFEAT_NR_SUBMAPS 1


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