aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/head32.c2
-rw-r--r--arch/x86/kernel/head64.c2
-rw-r--r--arch/x86/kernel/setup.c39
-rw-r--r--arch/x86/kernel/vmlinux_32.lds.S7
-rw-r--r--arch/x86/kernel/vmlinux_64.lds.S5
5 files changed, 48 insertions, 7 deletions
diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index ac108d1fe182..29f1095b0849 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -18,7 +18,7 @@ void __init i386_start_kernel(void)
18{ 18{
19 reserve_trampoline_memory(); 19 reserve_trampoline_memory();
20 20
21 reserve_early(__pa_symbol(&_text), __pa_symbol(&_end), "TEXT DATA BSS"); 21 reserve_early(__pa_symbol(&_text), __pa_symbol(&__bss_stop), "TEXT DATA BSS");
22 22
23#ifdef CONFIG_BLK_DEV_INITRD 23#ifdef CONFIG_BLK_DEV_INITRD
24 /* Reserve INITRD */ 24 /* Reserve INITRD */
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index f5b272247690..70eaa852c732 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -100,7 +100,7 @@ void __init x86_64_start_reservations(char *real_mode_data)
100 100
101 reserve_trampoline_memory(); 101 reserve_trampoline_memory();
102 102
103 reserve_early(__pa_symbol(&_text), __pa_symbol(&_end), "TEXT DATA BSS"); 103 reserve_early(__pa_symbol(&_text), __pa_symbol(&__bss_stop), "TEXT DATA BSS");
104 104
105#ifdef CONFIG_BLK_DEV_INITRD 105#ifdef CONFIG_BLK_DEV_INITRD
106 /* Reserve INITRD */ 106 /* Reserve INITRD */
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index f28c56e6bf94..e6b742d2a3f5 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -114,6 +114,9 @@
114 114
115unsigned int boot_cpu_id __read_mostly; 115unsigned int boot_cpu_id __read_mostly;
116 116
117static __initdata unsigned long _brk_start = (unsigned long)__brk_base;
118unsigned long _brk_end = (unsigned long)__brk_base;
119
117#ifdef CONFIG_X86_64 120#ifdef CONFIG_X86_64
118int default_cpu_present_to_apicid(int mps_cpu) 121int default_cpu_present_to_apicid(int mps_cpu)
119{ 122{
@@ -337,6 +340,34 @@ static void __init relocate_initrd(void)
337} 340}
338#endif 341#endif
339 342
343void * __init extend_brk(size_t size, size_t align)
344{
345 size_t mask = align - 1;
346 void *ret;
347
348 BUG_ON(_brk_start == 0);
349 BUG_ON(align & mask);
350
351 _brk_end = (_brk_end + mask) & ~mask;
352 BUG_ON((char *)(_brk_end + size) > __brk_limit);
353
354 ret = (void *)_brk_end;
355 _brk_end += size;
356
357 memset(ret, 0, size);
358
359 return ret;
360}
361
362static void __init reserve_brk(void)
363{
364 if (_brk_end > _brk_start)
365 reserve_early(__pa(_brk_start), __pa(_brk_end), "BRK");
366
367 /* Mark brk area as locked down and no longer taking any new allocations */
368 _brk_start = 0;
369}
370
340static void __init reserve_initrd(void) 371static void __init reserve_initrd(void)
341{ 372{
342 u64 ramdisk_image = boot_params.hdr.ramdisk_image; 373 u64 ramdisk_image = boot_params.hdr.ramdisk_image;
@@ -717,11 +748,7 @@ void __init setup_arch(char **cmdline_p)
717 init_mm.start_code = (unsigned long) _text; 748 init_mm.start_code = (unsigned long) _text;
718 init_mm.end_code = (unsigned long) _etext; 749 init_mm.end_code = (unsigned long) _etext;
719 init_mm.end_data = (unsigned long) _edata; 750 init_mm.end_data = (unsigned long) _edata;
720#ifdef CONFIG_X86_32 751 init_mm.brk = _brk_end;
721 init_mm.brk = init_pg_tables_end + PAGE_OFFSET;
722#else
723 init_mm.brk = (unsigned long) &_end;
724#endif
725 752
726 code_resource.start = virt_to_phys(_text); 753 code_resource.start = virt_to_phys(_text);
727 code_resource.end = virt_to_phys(_etext)-1; 754 code_resource.end = virt_to_phys(_etext)-1;
@@ -842,6 +869,8 @@ void __init setup_arch(char **cmdline_p)
842 setup_bios_corruption_check(); 869 setup_bios_corruption_check();
843#endif 870#endif
844 871
872 reserve_brk();
873
845 /* max_pfn_mapped is updated here */ 874 /* max_pfn_mapped is updated here */
846 max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT); 875 max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT);
847 max_pfn_mapped = max_low_pfn_mapped; 876 max_pfn_mapped = max_low_pfn_mapped;
diff --git a/arch/x86/kernel/vmlinux_32.lds.S b/arch/x86/kernel/vmlinux_32.lds.S
index 0d860963f268..27e44aa21585 100644
--- a/arch/x86/kernel/vmlinux_32.lds.S
+++ b/arch/x86/kernel/vmlinux_32.lds.S
@@ -189,7 +189,14 @@ SECTIONS
189 *(.bss) 189 *(.bss)
190 . = ALIGN(4); 190 . = ALIGN(4);
191 __bss_stop = .; 191 __bss_stop = .;
192
193 . = ALIGN(PAGE_SIZE);
194 __brk_base = . ;
195 . += 1024 * 1024 ;
196 __brk_limit = . ;
197
192 _end = . ; 198 _end = . ;
199
193 /* This is where the kernel creates the early boot page tables */ 200 /* This is where the kernel creates the early boot page tables */
194 . = ALIGN(PAGE_SIZE); 201 . = ALIGN(PAGE_SIZE);
195 pg0 = . ; 202 pg0 = . ;
diff --git a/arch/x86/kernel/vmlinux_64.lds.S b/arch/x86/kernel/vmlinux_64.lds.S
index fe5d21ce7241..ff373423138c 100644
--- a/arch/x86/kernel/vmlinux_64.lds.S
+++ b/arch/x86/kernel/vmlinux_64.lds.S
@@ -247,6 +247,11 @@ SECTIONS
247 *(.bss.page_aligned) 247 *(.bss.page_aligned)
248 *(.bss) 248 *(.bss)
249 __bss_stop = .; 249 __bss_stop = .;
250
251 . = ALIGN(PAGE_SIZE);
252 __brk_base = . ;
253 . += 1024 * 1024 ;
254 __brk_limit = . ;
250 } 255 }
251 256
252 _end = . ; 257 _end = . ;