diff options
Diffstat (limited to 'arch/x86_64/mm/init.c')
-rw-r--r-- | arch/x86_64/mm/init.c | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c index 7af1742aa958..e5f7f1c34462 100644 --- a/arch/x86_64/mm/init.c +++ b/arch/x86_64/mm/init.c | |||
@@ -72,7 +72,7 @@ void show_mem(void) | |||
72 | show_free_areas(); | 72 | show_free_areas(); |
73 | printk(KERN_INFO "Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); | 73 | printk(KERN_INFO "Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); |
74 | 74 | ||
75 | for_each_pgdat(pgdat) { | 75 | for_each_online_pgdat(pgdat) { |
76 | for (i = 0; i < pgdat->node_spanned_pages; ++i) { | 76 | for (i = 0; i < pgdat->node_spanned_pages; ++i) { |
77 | page = pfn_to_page(pgdat->node_start_pfn + i); | 77 | page = pfn_to_page(pgdat->node_start_pfn + i); |
78 | total++; | 78 | total++; |
@@ -94,7 +94,7 @@ void show_mem(void) | |||
94 | 94 | ||
95 | int after_bootmem; | 95 | int after_bootmem; |
96 | 96 | ||
97 | static void *spp_getpage(void) | 97 | static __init void *spp_getpage(void) |
98 | { | 98 | { |
99 | void *ptr; | 99 | void *ptr; |
100 | if (after_bootmem) | 100 | if (after_bootmem) |
@@ -108,7 +108,7 @@ static void *spp_getpage(void) | |||
108 | return ptr; | 108 | return ptr; |
109 | } | 109 | } |
110 | 110 | ||
111 | static void set_pte_phys(unsigned long vaddr, | 111 | static __init void set_pte_phys(unsigned long vaddr, |
112 | unsigned long phys, pgprot_t prot) | 112 | unsigned long phys, pgprot_t prot) |
113 | { | 113 | { |
114 | pgd_t *pgd; | 114 | pgd_t *pgd; |
@@ -157,7 +157,8 @@ static void set_pte_phys(unsigned long vaddr, | |||
157 | } | 157 | } |
158 | 158 | ||
159 | /* NOTE: this is meant to be run only at boot */ | 159 | /* NOTE: this is meant to be run only at boot */ |
160 | void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t prot) | 160 | void __init |
161 | __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t prot) | ||
161 | { | 162 | { |
162 | unsigned long address = __fix_to_virt(idx); | 163 | unsigned long address = __fix_to_virt(idx); |
163 | 164 | ||
@@ -225,6 +226,33 @@ static __meminit void unmap_low_page(int i) | |||
225 | ti->allocated = 0; | 226 | ti->allocated = 0; |
226 | } | 227 | } |
227 | 228 | ||
229 | /* Must run before zap_low_mappings */ | ||
230 | __init void *early_ioremap(unsigned long addr, unsigned long size) | ||
231 | { | ||
232 | unsigned long map = round_down(addr, LARGE_PAGE_SIZE); | ||
233 | |||
234 | /* actually usually some more */ | ||
235 | if (size >= LARGE_PAGE_SIZE) { | ||
236 | printk("SMBIOS area too long %lu\n", size); | ||
237 | return NULL; | ||
238 | } | ||
239 | set_pmd(temp_mappings[0].pmd, __pmd(map | _KERNPG_TABLE | _PAGE_PSE)); | ||
240 | map += LARGE_PAGE_SIZE; | ||
241 | set_pmd(temp_mappings[1].pmd, __pmd(map | _KERNPG_TABLE | _PAGE_PSE)); | ||
242 | __flush_tlb(); | ||
243 | return temp_mappings[0].address + (addr & (LARGE_PAGE_SIZE-1)); | ||
244 | } | ||
245 | |||
246 | /* To avoid virtual aliases later */ | ||
247 | __init void early_iounmap(void *addr, unsigned long size) | ||
248 | { | ||
249 | if ((void *)round_down((unsigned long)addr, LARGE_PAGE_SIZE) != temp_mappings[0].address) | ||
250 | printk("early_iounmap: bad address %p\n", addr); | ||
251 | set_pmd(temp_mappings[0].pmd, __pmd(0)); | ||
252 | set_pmd(temp_mappings[1].pmd, __pmd(0)); | ||
253 | __flush_tlb(); | ||
254 | } | ||
255 | |||
228 | static void __meminit | 256 | static void __meminit |
229 | phys_pmd_init(pmd_t *pmd, unsigned long address, unsigned long end) | 257 | phys_pmd_init(pmd_t *pmd, unsigned long address, unsigned long end) |
230 | { | 258 | { |
@@ -344,7 +372,7 @@ void __meminit init_memory_mapping(unsigned long start, unsigned long end) | |||
344 | pud_t *pud; | 372 | pud_t *pud; |
345 | 373 | ||
346 | if (after_bootmem) | 374 | if (after_bootmem) |
347 | pud = pud_offset_k(pgd, __PAGE_OFFSET); | 375 | pud = pud_offset_k(pgd, start & PGDIR_MASK); |
348 | else | 376 | else |
349 | pud = alloc_low_page(&map, &pud_phys); | 377 | pud = alloc_low_page(&map, &pud_phys); |
350 | 378 | ||
@@ -486,7 +514,7 @@ void __init clear_kernel_mapping(unsigned long address, unsigned long size) | |||
486 | void online_page(struct page *page) | 514 | void online_page(struct page *page) |
487 | { | 515 | { |
488 | ClearPageReserved(page); | 516 | ClearPageReserved(page); |
489 | set_page_count(page, 1); | 517 | init_page_count(page); |
490 | __free_page(page); | 518 | __free_page(page); |
491 | totalram_pages++; | 519 | totalram_pages++; |
492 | num_physpages++; | 520 | num_physpages++; |
@@ -592,7 +620,7 @@ void free_initmem(void) | |||
592 | addr = (unsigned long)(&__init_begin); | 620 | addr = (unsigned long)(&__init_begin); |
593 | for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { | 621 | for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { |
594 | ClearPageReserved(virt_to_page(addr)); | 622 | ClearPageReserved(virt_to_page(addr)); |
595 | set_page_count(virt_to_page(addr), 1); | 623 | init_page_count(virt_to_page(addr)); |
596 | memset((void *)(addr & ~(PAGE_SIZE-1)), 0xcc, PAGE_SIZE); | 624 | memset((void *)(addr & ~(PAGE_SIZE-1)), 0xcc, PAGE_SIZE); |
597 | free_page(addr); | 625 | free_page(addr); |
598 | totalram_pages++; | 626 | totalram_pages++; |
@@ -632,7 +660,7 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
632 | printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); | 660 | printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); |
633 | for (; start < end; start += PAGE_SIZE) { | 661 | for (; start < end; start += PAGE_SIZE) { |
634 | ClearPageReserved(virt_to_page(start)); | 662 | ClearPageReserved(virt_to_page(start)); |
635 | set_page_count(virt_to_page(start), 1); | 663 | init_page_count(virt_to_page(start)); |
636 | free_page(start); | 664 | free_page(start); |
637 | totalram_pages++; | 665 | totalram_pages++; |
638 | } | 666 | } |