|
@@ -114,6 +114,9 @@
|
|
|
|
|
|
unsigned int boot_cpu_id __read_mostly;
|
|
unsigned int boot_cpu_id __read_mostly;
|
|
|
|
|
|
|
|
+static __initdata unsigned long _brk_start = (unsigned long)__brk_base;
|
|
|
|
+unsigned long _brk_end = (unsigned long)__brk_base;
|
|
|
|
+
|
|
#ifdef CONFIG_X86_64
|
|
#ifdef CONFIG_X86_64
|
|
int default_cpu_present_to_apicid(int mps_cpu)
|
|
int default_cpu_present_to_apicid(int mps_cpu)
|
|
{
|
|
{
|
|
@@ -337,6 +340,34 @@ static void __init relocate_initrd(void)
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+void * __init extend_brk(size_t size, size_t align)
|
|
|
|
+{
|
|
|
|
+ size_t mask = align - 1;
|
|
|
|
+ void *ret;
|
|
|
|
+
|
|
|
|
+ BUG_ON(_brk_start == 0);
|
|
|
|
+ BUG_ON(align & mask);
|
|
|
|
+
|
|
|
|
+ _brk_end = (_brk_end + mask) & ~mask;
|
|
|
|
+ BUG_ON((char *)(_brk_end + size) > __brk_limit);
|
|
|
|
+
|
|
|
|
+ ret = (void *)_brk_end;
|
|
|
|
+ _brk_end += size;
|
|
|
|
+
|
|
|
|
+ memset(ret, 0, size);
|
|
|
|
+
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void __init reserve_brk(void)
|
|
|
|
+{
|
|
|
|
+ if (_brk_end > _brk_start)
|
|
|
|
+ reserve_early(__pa(_brk_start), __pa(_brk_end), "BRK");
|
|
|
|
+
|
|
|
|
+ /* Mark brk area as locked down and no longer taking any new allocations */
|
|
|
|
+ _brk_start = 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static void __init reserve_initrd(void)
|
|
static void __init reserve_initrd(void)
|
|
{
|
|
{
|
|
u64 ramdisk_image = boot_params.hdr.ramdisk_image;
|
|
u64 ramdisk_image = boot_params.hdr.ramdisk_image;
|
|
@@ -717,11 +748,7 @@ void __init setup_arch(char **cmdline_p)
|
|
init_mm.start_code = (unsigned long) _text;
|
|
init_mm.start_code = (unsigned long) _text;
|
|
init_mm.end_code = (unsigned long) _etext;
|
|
init_mm.end_code = (unsigned long) _etext;
|
|
init_mm.end_data = (unsigned long) _edata;
|
|
init_mm.end_data = (unsigned long) _edata;
|
|
-#ifdef CONFIG_X86_32
|
|
|
|
- init_mm.brk = init_pg_tables_end + PAGE_OFFSET;
|
|
|
|
-#else
|
|
|
|
- init_mm.brk = (unsigned long) &_end;
|
|
|
|
-#endif
|
|
|
|
|
|
+ init_mm.brk = _brk_end;
|
|
|
|
|
|
code_resource.start = virt_to_phys(_text);
|
|
code_resource.start = virt_to_phys(_text);
|
|
code_resource.end = virt_to_phys(_etext)-1;
|
|
code_resource.end = virt_to_phys(_etext)-1;
|
|
@@ -842,6 +869,8 @@ void __init setup_arch(char **cmdline_p)
|
|
setup_bios_corruption_check();
|
|
setup_bios_corruption_check();
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+ reserve_brk();
|
|
|
|
+
|
|
/* max_pfn_mapped is updated here */
|
|
/* max_pfn_mapped is updated here */
|
|
max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT);
|
|
max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT);
|
|
max_pfn_mapped = max_low_pfn_mapped;
|
|
max_pfn_mapped = max_low_pfn_mapped;
|