diff options
Diffstat (limited to 'arch/x86/mm/init_32.c')
-rw-r--r-- | arch/x86/mm/init_32.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 30938c1d8d5d..bca79091b9d6 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -25,11 +25,11 @@ | |||
25 | #include <linux/pfn.h> | 25 | #include <linux/pfn.h> |
26 | #include <linux/poison.h> | 26 | #include <linux/poison.h> |
27 | #include <linux/bootmem.h> | 27 | #include <linux/bootmem.h> |
28 | #include <linux/slab.h> | ||
29 | #include <linux/proc_fs.h> | 28 | #include <linux/proc_fs.h> |
30 | #include <linux/memory_hotplug.h> | 29 | #include <linux/memory_hotplug.h> |
31 | #include <linux/initrd.h> | 30 | #include <linux/initrd.h> |
32 | #include <linux/cpumask.h> | 31 | #include <linux/cpumask.h> |
32 | #include <linux/gfp.h> | ||
33 | 33 | ||
34 | #include <asm/asm.h> | 34 | #include <asm/asm.h> |
35 | #include <asm/bios_ebda.h> | 35 | #include <asm/bios_ebda.h> |
@@ -241,6 +241,7 @@ kernel_physical_mapping_init(unsigned long start, | |||
241 | unsigned long page_size_mask) | 241 | unsigned long page_size_mask) |
242 | { | 242 | { |
243 | int use_pse = page_size_mask == (1<<PG_LEVEL_2M); | 243 | int use_pse = page_size_mask == (1<<PG_LEVEL_2M); |
244 | unsigned long last_map_addr = end; | ||
244 | unsigned long start_pfn, end_pfn; | 245 | unsigned long start_pfn, end_pfn; |
245 | pgd_t *pgd_base = swapper_pg_dir; | 246 | pgd_t *pgd_base = swapper_pg_dir; |
246 | int pgd_idx, pmd_idx, pte_ofs; | 247 | int pgd_idx, pmd_idx, pte_ofs; |
@@ -341,9 +342,10 @@ repeat: | |||
341 | prot = PAGE_KERNEL_EXEC; | 342 | prot = PAGE_KERNEL_EXEC; |
342 | 343 | ||
343 | pages_4k++; | 344 | pages_4k++; |
344 | if (mapping_iter == 1) | 345 | if (mapping_iter == 1) { |
345 | set_pte(pte, pfn_pte(pfn, init_prot)); | 346 | set_pte(pte, pfn_pte(pfn, init_prot)); |
346 | else | 347 | last_map_addr = (pfn << PAGE_SHIFT) + PAGE_SIZE; |
348 | } else | ||
347 | set_pte(pte, pfn_pte(pfn, prot)); | 349 | set_pte(pte, pfn_pte(pfn, prot)); |
348 | } | 350 | } |
349 | } | 351 | } |
@@ -368,7 +370,7 @@ repeat: | |||
368 | mapping_iter = 2; | 370 | mapping_iter = 2; |
369 | goto repeat; | 371 | goto repeat; |
370 | } | 372 | } |
371 | return 0; | 373 | return last_map_addr; |
372 | } | 374 | } |
373 | 375 | ||
374 | pte_t *kmap_pte; | 376 | pte_t *kmap_pte; |
@@ -412,7 +414,7 @@ static void __init permanent_kmaps_init(pgd_t *pgd_base) | |||
412 | pkmap_page_table = pte; | 414 | pkmap_page_table = pte; |
413 | } | 415 | } |
414 | 416 | ||
415 | static void __init add_one_highpage_init(struct page *page, int pfn) | 417 | static void __init add_one_highpage_init(struct page *page) |
416 | { | 418 | { |
417 | ClearPageReserved(page); | 419 | ClearPageReserved(page); |
418 | init_page_count(page); | 420 | init_page_count(page); |
@@ -445,7 +447,7 @@ static int __init add_highpages_work_fn(unsigned long start_pfn, | |||
445 | if (!pfn_valid(node_pfn)) | 447 | if (!pfn_valid(node_pfn)) |
446 | continue; | 448 | continue; |
447 | page = pfn_to_page(node_pfn); | 449 | page = pfn_to_page(node_pfn); |
448 | add_one_highpage_init(page, node_pfn); | 450 | add_one_highpage_init(page); |
449 | } | 451 | } |
450 | 452 | ||
451 | return 0; | 453 | return 0; |
@@ -703,8 +705,8 @@ void __init find_low_pfn_range(void) | |||
703 | } | 705 | } |
704 | 706 | ||
705 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 707 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
706 | void __init initmem_init(unsigned long start_pfn, | 708 | void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn, |
707 | unsigned long end_pfn) | 709 | int acpi, int k8) |
708 | { | 710 | { |
709 | #ifdef CONFIG_HIGHMEM | 711 | #ifdef CONFIG_HIGHMEM |
710 | highstart_pfn = highend_pfn = max_pfn; | 712 | highstart_pfn = highend_pfn = max_pfn; |
@@ -748,6 +750,7 @@ static void __init zone_sizes_init(void) | |||
748 | free_area_init_nodes(max_zone_pfns); | 750 | free_area_init_nodes(max_zone_pfns); |
749 | } | 751 | } |
750 | 752 | ||
753 | #ifndef CONFIG_NO_BOOTMEM | ||
751 | static unsigned long __init setup_node_bootmem(int nodeid, | 754 | static unsigned long __init setup_node_bootmem(int nodeid, |
752 | unsigned long start_pfn, | 755 | unsigned long start_pfn, |
753 | unsigned long end_pfn, | 756 | unsigned long end_pfn, |
@@ -764,13 +767,14 @@ static unsigned long __init setup_node_bootmem(int nodeid, | |||
764 | printk(KERN_INFO " node %d bootmap %08lx - %08lx\n", | 767 | printk(KERN_INFO " node %d bootmap %08lx - %08lx\n", |
765 | nodeid, bootmap, bootmap + bootmap_size); | 768 | nodeid, bootmap, bootmap + bootmap_size); |
766 | free_bootmem_with_active_regions(nodeid, end_pfn); | 769 | free_bootmem_with_active_regions(nodeid, end_pfn); |
767 | early_res_to_bootmem(start_pfn<<PAGE_SHIFT, end_pfn<<PAGE_SHIFT); | ||
768 | 770 | ||
769 | return bootmap + bootmap_size; | 771 | return bootmap + bootmap_size; |
770 | } | 772 | } |
773 | #endif | ||
771 | 774 | ||
772 | void __init setup_bootmem_allocator(void) | 775 | void __init setup_bootmem_allocator(void) |
773 | { | 776 | { |
777 | #ifndef CONFIG_NO_BOOTMEM | ||
774 | int nodeid; | 778 | int nodeid; |
775 | unsigned long bootmap_size, bootmap; | 779 | unsigned long bootmap_size, bootmap; |
776 | /* | 780 | /* |
@@ -782,11 +786,13 @@ void __init setup_bootmem_allocator(void) | |||
782 | if (bootmap == -1L) | 786 | if (bootmap == -1L) |
783 | panic("Cannot find bootmem map of size %ld\n", bootmap_size); | 787 | panic("Cannot find bootmem map of size %ld\n", bootmap_size); |
784 | reserve_early(bootmap, bootmap + bootmap_size, "BOOTMAP"); | 788 | reserve_early(bootmap, bootmap + bootmap_size, "BOOTMAP"); |
789 | #endif | ||
785 | 790 | ||
786 | printk(KERN_INFO " mapped low ram: 0 - %08lx\n", | 791 | printk(KERN_INFO " mapped low ram: 0 - %08lx\n", |
787 | max_pfn_mapped<<PAGE_SHIFT); | 792 | max_pfn_mapped<<PAGE_SHIFT); |
788 | printk(KERN_INFO " low ram: 0 - %08lx\n", max_low_pfn<<PAGE_SHIFT); | 793 | printk(KERN_INFO " low ram: 0 - %08lx\n", max_low_pfn<<PAGE_SHIFT); |
789 | 794 | ||
795 | #ifndef CONFIG_NO_BOOTMEM | ||
790 | for_each_online_node(nodeid) { | 796 | for_each_online_node(nodeid) { |
791 | unsigned long start_pfn, end_pfn; | 797 | unsigned long start_pfn, end_pfn; |
792 | 798 | ||
@@ -804,6 +810,7 @@ void __init setup_bootmem_allocator(void) | |||
804 | bootmap = setup_node_bootmem(nodeid, start_pfn, end_pfn, | 810 | bootmap = setup_node_bootmem(nodeid, start_pfn, end_pfn, |
805 | bootmap); | 811 | bootmap); |
806 | } | 812 | } |
813 | #endif | ||
807 | 814 | ||
808 | after_bootmem = 1; | 815 | after_bootmem = 1; |
809 | } | 816 | } |
@@ -892,8 +899,7 @@ void __init mem_init(void) | |||
892 | reservedpages << (PAGE_SHIFT-10), | 899 | reservedpages << (PAGE_SHIFT-10), |
893 | datasize >> 10, | 900 | datasize >> 10, |
894 | initsize >> 10, | 901 | initsize >> 10, |
895 | (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10)) | 902 | totalhigh_pages << (PAGE_SHIFT-10)); |
896 | ); | ||
897 | 903 | ||
898 | printk(KERN_INFO "virtual kernel memory layout:\n" | 904 | printk(KERN_INFO "virtual kernel memory layout:\n" |
899 | " fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n" | 905 | " fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n" |
@@ -997,7 +1003,7 @@ static noinline int do_test_wp_bit(void) | |||
997 | const int rodata_test_data = 0xC3; | 1003 | const int rodata_test_data = 0xC3; |
998 | EXPORT_SYMBOL_GPL(rodata_test_data); | 1004 | EXPORT_SYMBOL_GPL(rodata_test_data); |
999 | 1005 | ||
1000 | static int kernel_set_to_readonly; | 1006 | int kernel_set_to_readonly __read_mostly; |
1001 | 1007 | ||
1002 | void set_kernel_text_rw(void) | 1008 | void set_kernel_text_rw(void) |
1003 | { | 1009 | { |