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

[Xen-changelog] Split XENFEAT_writable_mmu_structures into



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# 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@xxxxxxxxxxxxx>

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