diff options
Diffstat (limited to 'arch/x86_64/mm/init.c')
-rw-r--r-- | arch/x86_64/mm/init.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c index b0a607892183..69e22d3c9238 100644 --- a/arch/x86_64/mm/init.c +++ b/arch/x86_64/mm/init.c | |||
@@ -565,11 +565,11 @@ void free_init_pages(char *what, unsigned long begin, unsigned long end) | |||
565 | 565 | ||
566 | printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10); | 566 | printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10); |
567 | for (addr = begin; addr < end; addr += PAGE_SIZE) { | 567 | for (addr = begin; addr < end; addr += PAGE_SIZE) { |
568 | ClearPageReserved(virt_to_page(addr)); | 568 | struct page *page = pfn_to_page(addr >> PAGE_SHIFT); |
569 | init_page_count(virt_to_page(addr)); | 569 | ClearPageReserved(page); |
570 | memset((void *)(addr & ~(PAGE_SIZE-1)), | 570 | init_page_count(page); |
571 | POISON_FREE_INITMEM, PAGE_SIZE); | 571 | memset(page_address(page), POISON_FREE_INITMEM, PAGE_SIZE); |
572 | free_page(addr); | 572 | __free_page(page); |
573 | totalram_pages++; | 573 | totalram_pages++; |
574 | } | 574 | } |
575 | } | 575 | } |
@@ -579,17 +579,18 @@ void free_initmem(void) | |||
579 | memset(__initdata_begin, POISON_FREE_INITDATA, | 579 | memset(__initdata_begin, POISON_FREE_INITDATA, |
580 | __initdata_end - __initdata_begin); | 580 | __initdata_end - __initdata_begin); |
581 | free_init_pages("unused kernel memory", | 581 | free_init_pages("unused kernel memory", |
582 | (unsigned long)(&__init_begin), | 582 | __pa_symbol(&__init_begin), |
583 | (unsigned long)(&__init_end)); | 583 | __pa_symbol(&__init_end)); |
584 | } | 584 | } |
585 | 585 | ||
586 | #ifdef CONFIG_DEBUG_RODATA | 586 | #ifdef CONFIG_DEBUG_RODATA |
587 | 587 | ||
588 | void mark_rodata_ro(void) | 588 | void mark_rodata_ro(void) |
589 | { | 589 | { |
590 | unsigned long addr = (unsigned long)__start_rodata; | 590 | unsigned long addr = (unsigned long)__va(__pa_symbol(&__start_rodata)); |
591 | unsigned long end = (unsigned long)__va(__pa_symbol(&__end_rodata)); | ||
591 | 592 | ||
592 | for (; addr < (unsigned long)__end_rodata; addr += PAGE_SIZE) | 593 | for (; addr < end; addr += PAGE_SIZE) |
593 | change_page_attr_addr(addr, 1, PAGE_KERNEL_RO); | 594 | change_page_attr_addr(addr, 1, PAGE_KERNEL_RO); |
594 | 595 | ||
595 | printk ("Write protecting the kernel read-only data: %luk\n", | 596 | printk ("Write protecting the kernel read-only data: %luk\n", |
@@ -608,7 +609,7 @@ void mark_rodata_ro(void) | |||
608 | #ifdef CONFIG_BLK_DEV_INITRD | 609 | #ifdef CONFIG_BLK_DEV_INITRD |
609 | void free_initrd_mem(unsigned long start, unsigned long end) | 610 | void free_initrd_mem(unsigned long start, unsigned long end) |
610 | { | 611 | { |
611 | free_init_pages("initrd memory", start, end); | 612 | free_init_pages("initrd memory", __pa(start), __pa(end)); |
612 | } | 613 | } |
613 | #endif | 614 | #endif |
614 | 615 | ||