panic("Cannot find bootmem map of size %ld\n",bootmap_size);
bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn);
#ifdef CONFIG_XEN
- e820_bootmem_free(NODE_DATA(0), 0, xen_start_info->nr_pages<<PAGE_SHIFT);
-#else
- e820_bootmem_free(NODE_DATA(0), 0, end_pfn << PAGE_SHIFT);
+ if (xen_start_info->nr_pages < end_pfn)
+ e820_bootmem_free(NODE_DATA(0), 0,
+ xen_start_info->nr_pages<<PAGE_SHIFT);
+ else
#endif
+ e820_bootmem_free(NODE_DATA(0), 0, end_pfn << PAGE_SHIFT);
reserve_bootmem(bootmap, bootmap_size);
}
#endif
page = (unsigned long *)xen_start_info->pt_base;
addr = page[pgd_index(__START_KERNEL_map)];
addr_to_page(addr, page);
- addr = page[pud_index(__START_KERNEL_map)];
- addr_to_page(addr, page);
#if CONFIG_XEN_COMPAT <= 0x030002
/* On Xen 3.0.2 and older we may need to explicitly specify _PAGE_USER
/* Mess with the initial mapping of page 0. It's not needed. */
BUILD_BUG_ON(__START_KERNEL <= __START_KERNEL_map);
- addr = page[pmd_index(__START_KERNEL_map)];
+ addr = page[pud_index(__START_KERNEL_map)];
+ addr_to_page(addr, pg);
+ addr = pg[pmd_index(__START_KERNEL_map)];
addr_to_page(addr, pg);
pte.pte = pg[pte_index(__START_KERNEL_map)];
BUG_ON(!(pte.pte & _PAGE_PRESENT));
/* Construct mapping of initial pte page in our own directories. */
init_level4_pgt[pgd_index(__START_KERNEL_map)] =
__pgd(__pa_symbol(level3_kernel_pgt) | _PAGE_TABLE);
- level3_kernel_pgt[pud_index(__START_KERNEL_map)] =
- __pud(__pa_symbol(level2_kernel_pgt) | _PAGE_TABLE);
- memcpy(level2_kernel_pgt, page, PAGE_SIZE);
+ memcpy(level3_kernel_pgt + pud_index(__START_KERNEL_map),
+ page + pud_index(__START_KERNEL_map),
+ (PTRS_PER_PUD - pud_index(__START_KERNEL_map))
+ * sizeof(*level3_kernel_pgt));
__user_pgd(init_level4_pgt)[pgd_index(VSYSCALL_START)] =
__pgd(__pa_symbol(level3_user_pgt) | _PAGE_TABLE);
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);
if (!xen_feature(XENFEAT_writable_page_tables)) {
xen_pgd_pin(__pa_symbol(init_level4_pgt));
while (va < (__START_KERNEL_map
+ (start_pfn << PAGE_SHIFT)
+ tables_space)) {
+ if (!(pmd_index(va) | pte_index(va))) {
+ pud_t *pud;
+
+ page = (unsigned long *)init_level4_pgt;
+ addr = page[pgd_index(va)];
+ addr_to_page(addr, page);
+ pud = (pud_t *)&page[pud_index(va)];
+ if (pud_none(*pud)) {
+ page = alloc_static_page(&phys);
+ early_make_page_readonly(
+ page, XENFEAT_writable_page_tables);
+ set_pud(pud, __pud(phys | _KERNPG_TABLE));
+ } else {
+ addr = page[pud_index(va)];
+ addr_to_page(addr, page);
+ }
+ }
pmd = (pmd_t *)&page[pmd_index(va)];
if (pmd_none(*pmd)) {
pte_page = alloc_static_page(&phys);
/* Finally, blow away any spurious initial mappings. */
while (1) {
+ if (!(pmd_index(va) | pte_index(va))) {
+ page = (unsigned long *)init_level4_pgt;
+ addr = page[pgd_index(va)];
+ addr_to_page(addr, page);
+ if (pud_none(((pud_t *)page)[pud_index(va)]))
+ break;
+ addr = page[pud_index(va)];
+ addr_to_page(addr, page);
+ }
pmd = (pmd_t *)&page[pmd_index(va)];
if (pmd_none(*pmd))
break;