From: kaf24@firebug.cl.cam.ac.uk Date: Wed, 24 Aug 2005 15:22:44 +0000 (+0000) Subject: Fix x86/64 pagetable initialisation so that only things that X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16844^2~22 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=dbd731f86ba471981fcbc31084cbd2a7dc2f8219;p=xen.git Fix x86/64 pagetable initialisation so that only things that need to be are mapped read-only. Signed-off-by: Keir Fraser --- diff --git a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c index f4c35e4a6b..0618209c9f 100644 --- a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c @@ -441,6 +441,31 @@ static inline void __set_pte(pte_t *dst, pte_t val) *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 @@ void __init phys_pud_init(pud_t *pud, unsigned long address, unsigned long end) 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 --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 476db18885..0141937ad2 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -1449,8 +1449,10 @@ int get_page_type(struct pfn_info *page, unsigned long type) 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 )