# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID c42a9e2f6c5b270cbcbfc9b918de9b66750448b3
# Parent bca2fd76995ea8c811cc52a7edaabaeae03a677a
Fix x86/64 pagetable initialisation so that only things that
need to be are mapped read-only.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
diff -r bca2fd76995e -r c42a9e2f6c5b
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 Wed Aug 24 15:21:48 2005
+++ b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c Wed Aug 24 15:22:44 2005
@@ -441,6 +441,31 @@
*dst = val;
}
+static inline int make_readonly(unsigned long paddr)
+{
+ int readonly = 0;
+
+ /* Make new page tables read-only. */
+ if ((paddr < ((table_start << PAGE_SHIFT) + tables_space)) &&
+ (paddr >= (table_start << PAGE_SHIFT)))
+ readonly = 1;
+
+ /* Make old page tables read-only. */
+ if ((paddr < ((xen_start_info.pt_base - __START_KERNEL_map) +
+ (xen_start_info.nr_pt_frames << PAGE_SHIFT))) &&
+ (paddr >= (xen_start_info.pt_base - __START_KERNEL_map)))
+ readonly = 1;
+
+ /*
+ * No need for writable mapping of kernel image. This also ensures that
+ * page and descriptor tables embedded inside don't have writable mappings.
+ */
+ if ((paddr >= __pa_symbol(&_text)) && (paddr < __pa_symbol(&_end)))
+ readonly = 1;
+
+ return readonly;
+}
+
void __init phys_pud_init(pud_t *pud, unsigned long address, unsigned long end)
{
long i, j, k;
@@ -477,9 +502,7 @@
pte = alloc_low_page(&pte_phys);
pte_save = pte;
for (k = 0; k < PTRS_PER_PTE; pte++, k++, paddr +=
PTE_SIZE) {
- if (paddr < (table_start << PAGE_SHIFT)
- + tables_space)
- {
+ if (make_readonly(paddr)) {
__set_pte(pte,
__pte(paddr | (_KERNPG_TABLE &
~_PAGE_RW)));
continue;
diff -r bca2fd76995e -r c42a9e2f6c5b xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Wed Aug 24 15:21:48 2005
+++ b/xen/arch/x86/mm.c Wed Aug 24 15:22:44 2005
@@ -1449,8 +1449,10 @@
if ( ((x & PGT_type_mask) != PGT_l2_page_table) ||
((type & PGT_type_mask) != PGT_l1_page_table) )
MEM_LOG("Bad type (saw %" PRtype_info
- "!= exp %" PRtype_info ") for pfn %lx",
- x, type, page_to_pfn(page));
+ "!= exp %" PRtype_info ") "
+ "for mfn %lx (pfn %x)",
+ x, type, page_to_pfn(page),
+ machine_to_phys_mapping[page_to_pfn(page)]);
return 0;
}
else if ( (x & PGT_va_mask) == PGT_va_mutable )
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|