Messages in this thread Patch in this message | | | From | Yinghai Lu <> | Subject | [PATCH] x86: cleanup max_pfn_mapped usage - 32bit | Date | Sun, 1 Jun 2008 23:53:50 -0700 |
| |
32bit in head_32.S after initial page table is done, we get initial max_pfn_mapped, and then kernel_physical_mapping_init will give us final one.
We need to use that to make sure find_e820_area to get valid address for boot_map and NODE_DATA(0) for numa32.
XEN PV and lguest may need to assign max_pfn_mapped too.
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Index: linux-2.6/arch/x86/kernel/head_32.S =================================================================== --- linux-2.6.orig/arch/x86/kernel/head_32.S +++ linux-2.6/arch/x86/kernel/head_32.S @@ -220,6 +220,8 @@ default_entry: jb 10b 1: movl %edi,pa(init_pg_tables_end) + shrl $12, %eax + movl %eax, pa(max_pfn_mapped) /* Do early initialization of the fixmap area */ movl $pa(swapper_pg_fixmap)+PDE_ATTR,%eax @@ -251,6 +253,8 @@ page_pde_offset = (__PAGE_OFFSET >> 20); cmpl %ebp,%eax jb 10b movl %edi,pa(init_pg_tables_end) + shrl $12, %eax + movl %eax, pa(max_pfn_mapped) /* Do early initialization of the fixmap area */ movl $pa(swapper_pg_fixmap)+PDE_ATTR,%eax Index: linux-2.6/arch/x86/kernel/setup_32.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/setup_32.c +++ linux-2.6/arch/x86/kernel/setup_32.c @@ -587,7 +587,7 @@ void __init setup_bootmem_allocator(void */ bootmap_size = bootmem_bootmap_pages(max_low_pfn)<<PAGE_SHIFT; bootmap = find_e820_area(min_low_pfn<<PAGE_SHIFT, - max_low_pfn<<PAGE_SHIFT, bootmap_size, + max_pfn_mapped<<PAGE_SHIFT, bootmap_size, PAGE_SIZE); if (bootmap == -1L) panic("Cannot find bootmem map of size %ld\n", bootmap_size); @@ -596,6 +596,8 @@ void __init setup_bootmem_allocator(void reserve_initrd(); #endif bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, max_low_pfn); + printk(KERN_INFO " mapped low ram: 0 - %08lx\n", + max_pfn_mapped<<PAGE_SHIFT); printk(KERN_INFO " low ram: %08lx - %08lx\n", min_low_pfn<<PAGE_SHIFT, max_low_pfn<<PAGE_SHIFT); printk(KERN_INFO " bootmap %08lx - %08lx\n", Index: linux-2.6/arch/x86/mm/discontig_32.c =================================================================== --- linux-2.6.orig/arch/x86/mm/discontig_32.c +++ linux-2.6/arch/x86/mm/discontig_32.c @@ -163,7 +163,8 @@ static void __init allocate_pgdat(int ni else { unsigned long pgdat_phys; pgdat_phys = find_e820_area(min_low_pfn<<PAGE_SHIFT, - max_low_pfn<<PAGE_SHIFT, sizeof(pg_data_t), + (nid ? max_low_pfn:max_pfn_mapped)<<PAGE_SHIFT, + sizeof(pg_data_t), PAGE_SIZE); NODE_DATA(nid) = (pg_data_t *)(pfn_to_kaddr(pgdat_phys>>PAGE_SHIFT)); reserve_early(pgdat_phys, pgdat_phys + sizeof(pg_data_t),
| |