aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/e820.h2
-rw-r--r--arch/x86/kernel/e820.c30
-rw-r--r--arch/x86/kernel/mpparse.c6
3 files changed, 9 insertions, 29 deletions
diff --git a/arch/x86/include/asm/e820.h b/arch/x86/include/asm/e820.h
index 908b96957d8..37782566af2 100644
--- a/arch/x86/include/asm/e820.h
+++ b/arch/x86/include/asm/e820.h
@@ -117,7 +117,7 @@ static inline void early_memtest(unsigned long start, unsigned long end)
117 117
118extern unsigned long e820_end_of_ram_pfn(void); 118extern unsigned long e820_end_of_ram_pfn(void);
119extern unsigned long e820_end_of_low_ram_pfn(void); 119extern unsigned long e820_end_of_low_ram_pfn(void);
120extern u64 early_reserve_e820(u64 startt, u64 sizet, u64 align); 120extern u64 early_reserve_e820(u64 sizet, u64 align);
121 121
122void memblock_x86_fill(void); 122void memblock_x86_fill(void);
123void memblock_find_dma_reserve(void); 123void memblock_find_dma_reserve(void);
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
index 0f9ff58d06d..b99d9402ae8 100644
--- a/arch/x86/kernel/e820.c
+++ b/arch/x86/kernel/e820.c
@@ -737,35 +737,17 @@ core_initcall(e820_mark_nvs_memory);
737/* 737/*
738 * pre allocated 4k and reserved it in memblock and e820_saved 738 * pre allocated 4k and reserved it in memblock and e820_saved
739 */ 739 */
740u64 __init early_reserve_e820(u64 startt, u64 sizet, u64 align) 740u64 __init early_reserve_e820(u64 size, u64 align)
741{ 741{
742 u64 size = 0;
743 u64 addr; 742 u64 addr;
744 u64 start;
745 743
746 for (start = startt; ; start += size) { 744 addr = __memblock_alloc_base(size, align, MEMBLOCK_ALLOC_ACCESSIBLE);
747 start = memblock_x86_find_in_range_size(start, &size, align); 745 if (addr) {
748 if (!start) 746 e820_update_range_saved(addr, size, E820_RAM, E820_RESERVED);
749 return 0; 747 printk(KERN_INFO "update e820_saved for early_reserve_e820\n");
750 if (size >= sizet) 748 update_e820_saved();
751 break;
752 } 749 }
753 750
754#ifdef CONFIG_X86_32
755 if (start >= MAXMEM)
756 return 0;
757 if (start + size > MAXMEM)
758 size = MAXMEM - start;
759#endif
760
761 addr = round_down(start + size - sizet, align);
762 if (addr < start)
763 return 0;
764 memblock_x86_reserve_range(addr, addr + sizet, "new next");
765 e820_update_range_saved(addr, sizet, E820_RAM, E820_RESERVED);
766 printk(KERN_INFO "update e820_saved for early_reserve_e820\n");
767 update_e820_saved();
768
769 return addr; 751 return addr;
770} 752}
771 753
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 9103b89c145..8faeaa0ed2c 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -836,10 +836,8 @@ early_param("alloc_mptable", parse_alloc_mptable_opt);
836 836
837void __init early_reserve_e820_mpc_new(void) 837void __init early_reserve_e820_mpc_new(void)
838{ 838{
839 if (enable_update_mptable && alloc_mptable) { 839 if (enable_update_mptable && alloc_mptable)
840 u64 startt = 0; 840 mpc_new_phys = early_reserve_e820(mpc_new_length, 4);
841 mpc_new_phys = early_reserve_e820(startt, mpc_new_length, 4);
842 }
843} 841}
844 842
845static int __init update_mp_table(void) 843static int __init update_mp_table(void)