From 9c31eb1df9cf5c265c486a50dd97e8af7754e56e Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Wed, 23 Jan 2008 13:22:29 -0200 Subject: [PATCH] Pull xen_extend_init_mapping() from XS upstream (FIXME) Signed-off-by: Eduardo Habkost --- arch/x86/mm/init_64.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 55 insertions(+), 1 deletions(-) diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 2e6af9d..9df9ee4 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -550,6 +550,60 @@ static void xen_finish_init_mapping(void) xprintk("finished!\n"); } +static void __init xen_extend_init_mapping(unsigned long tables_space) +{ + unsigned long va = __START_KERNEL_map; + unsigned long phys, addr, *pte_page; + pmd_t *pmd; + pte_t *pte, new_pte; + unsigned long *page = (unsigned long *)init_level4_pgt; + + addr = page[pgd_index(va)]; + addr_to_page(addr, page); + addr = page[pud_index(va)]; + addr_to_page(addr, page); + + /* Kill mapping of low 1MB. */ + while (va < (unsigned long)&_text) { + HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0); + va += PAGE_SIZE; + } + + /* Ensure init mappings cover kernel text/data and initial tables. */ + while (va < (__START_KERNEL_map + + (start_pfn << PAGE_SHIFT) + + tables_space)) { + pmd = (pmd_t *)&page[pmd_index(va)]; + if (pmd_none(*pmd)) { + pte_page = alloc_low_page(&phys); + early_make_page_readonly( + pte_page, XENFEAT_writable_page_tables); + set_pmd(pmd, __pmd(phys | _KERNPG_TABLE)); + } else { + addr = page[pmd_index(va)]; + addr_to_page(addr, pte_page); + } + pte = (pte_t *)&pte_page[pte_index(va)]; + if (pte_none(*pte)) { + new_pte = pfn_pte( + (va - __START_KERNEL_map) >> PAGE_SHIFT, + __pgprot(_KERNPG_TABLE)); + set_pte_at(&init_mm, va, pte, new_pte); + } + va += PAGE_SIZE; + } + + /* Finally, blow away any spurious initial mappings. */ + while (1) { + pmd = (pmd_t *)&page[pmd_index(va)]; + if (pmd_none(*pmd)) + break; + HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0); + va += PAGE_SIZE; + } +} + + #else /* !XEN */ @@ -770,7 +824,7 @@ static void __init find_early_table_space(unsigned long end) round_up(ptes * 8, PAGE_SIZE); /*FIXME: what does this do? */ - //extend_init_mapping(tables); + xen_extend_init_mapping(tables); table_start = start_pfn; table_end = table_start + (tables>>PAGE_SHIFT); -- 1.5.4.1