x86: move saving e820_saved to setup_memory_map
PATCH 1/1 x86: move saving e820_saved to setup_memory_map
so other path that will override memory_setup or machine_specific_memory_setup could have e820_saved too
--- arch/x86/kernel/e820.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
arch/x86/kernel/e820.c +5 -3
@@ -1294,8 +1294,6 @@ char *__init default_machine_specific_mee820_add_region (HIGH_MEMORY , mem_size <<10 ,E820_RAM ); } -memcpy (&e820_saved, &e820,sizeof (struct e820map )); -/* In case someone cares... */ return who; }
@@ -1313,8 +1311,12 @@ char * __init __attribute__((weak)) memovoid __init setup_memory_map (void ) { +char *who; + + who =memory_setup (); +memcpy (&e820_saved, &e820,sizeof (struct e820map ));printk (KERN_INFO "BIOS-provided physical RAM map:\n" ); -e820_print_map (memory_setup ()); +e820_print_map (who); }#ifdef CONFIG_X86_64
PATCH 1/1 x86: make e820_saved have update from setup_data
seperate reserve_setup_data into e820_reserved_setup_data, and reserve_early_setup_data.
So could use e820_reserved_setup_data to backup e820 with setup_data
--- arch/x86/kernel/setup.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-)
arch/x86/kernel/setup.c +23 -5
@@ -394,11 +394,10 @@ static void __init parse_setup_data(void } } -static void __init reserve_setup_data (void ) +static void __init e820_reserve_setup_data (void ) {struct setup_data *data;u64 pa_data; -char buf[32 ];int found =0 ;if (boot_params.hdr.version <0x0209 )
@@ -406,8 +405,6 @@ static void __init reserve_setup_data(vo pa_data = boot_params.hdr.setup_data;while (pa_data) { data =early_ioremap (pa_data,sizeof (*data)); -sprintf (buf,"setup data %x" , data->type); -reserve_early (pa_data, pa_data+sizeof (*data)+data->len, buf);e820_update_range (pa_data,sizeof (*data)+data->len,E820_RAM ,E820_RESERVED_KERN ); found =1 ;
@@ -418,10 +415,29 @@ static void __init reserve_setup_data(voreturn ;sanitize_e820_map (e820.map,ARRAY_SIZE (e820.map), &e820.nr_map); +memcpy (&e820_saved, &e820,sizeof (struct e820map ));printk (KERN_INFO "extended physical RAM map:\n" );e820_print_map ("reserve setup_data" ); } +static void __init reserve_early_setup_data (void ) +{ +struct setup_data *data; +u64 pa_data; +char buf[32 ]; + +if (boot_params.hdr.version <0x0209 ) +return ; + pa_data = boot_params.hdr.setup_data; +while (pa_data) { + data =early_ioremap (pa_data,sizeof (*data)); +sprintf (buf,"setup data %x" , data->type); +reserve_early (pa_data, pa_data+sizeof (*data)+data->len, buf); + pa_data = data->next; +early_iounmap (data,sizeof (*data)); + } +} +/* * --------- Crashkernel reservation ------------------------------ */
@@ -626,6 +642,8 @@ void __init setup_arch(char **cmdline_p)setup_memory_map ();parse_setup_data (); +/* update the e820_saved too */ +e820_reserve_setup_data ();copy_edd ();
@@ -656,7 +674,7 @@ void __init setup_arch(char **cmdline_p)parse_early_param ();/* after early param, so could get panic from serial */ -reserve_setup_data (); +reserve_early_setup_data ();if (acpi_mps_check ()) {#ifdef CONFIG_X86_LOCAL_APIC
PATCH 1/1 x86: let early_reserve_e820 update e820_saved too
In reply to Yinghai Luso when it is called after early_param, e820_saved get updated too. esp for mpc update.
--- arch/x86/kernel/e820.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-)
arch/x86/kernel/e820.c +28 -3
@@ -414,8 +414,9 @@ static int __init append_e820_map(structreturn __append_e820_map (biosmap, nr_map); } -u64 __init e820_update_range (u64 start,u64 size,unsigned old_type, -unsigned new_type) +static u64 __init e820_update_range_map (struct e820map *e820x,u64 start, +u64 size,unsigned old_type, +unsigned new_type) {int i;u64 real_updated_size =0 ;
@@ -426,7 +427,7 @@ u64 __init e820_update_range(u64 start, size =ULLONG_MAX - start;for (i =0 ; i < e820.nr_map; i++) { -struct e820entry *ei = &e820.map[i]; +struct e820entry *ei = &e820x->map[i];u64 final_start, final_end;if (ei->type != old_type)continue ;
@@ -454,6 +455,19 @@ u64 __init e820_update_range(u64 start,return real_updated_size; } +u64 __init e820_update_range (u64 start,u64 size,unsigned old_type, +unsigned new_type) +{ +return e820_update_range_map (&e820, start, size, old_type, new_type); +} + +static u64 __init e820_update_range_saved (u64 start,u64 size, +unsigned old_type,unsigned new_type) +{ +return e820_update_range_map (&e820_saved, start, size, old_type, + new_type); +} +/* make e820 not cover the range */ u64 __init e820_remove_range (u64 start,u64 size,unsigned old_type,int checktype)
@@ -503,6 +517,15 @@ void __init update_e820(void)printk (KERN_INFO "modified physical RAM map:\n" );e820_print_map ("modified" ); } +static void __init update_e820_saved (void ) +{ +int nr_map; + + nr_map = e820_saved.nr_map; +if (sanitize_e820_map (e820_saved.map,ARRAY_SIZE (e820_saved.map), &nr_map)) +return ; + e820_saved.nr_map = nr_map; +}#define MAX_GAP_END 0x100000000ull/* * Search for a gap in the e820 memory space from start_addr to end_addr.
@@ -1007,8 +1030,10 @@ u64 __init early_reserve_e820(u64 startt addr =round_down (start + size - sizet, align);e820_update_range (addr, sizet,E820_RAM ,E820_RESERVED ); +e820_update_range_saved (addr, sizet,E820_RAM ,E820_RESERVED );printk (KERN_INFO "update e820 for early_reserve_e820\n" );update_e820 (); +update_e820_saved ();return addr; }
Re: [PATCH] x86: make e820_saved have update from setup_data
In reply to Yinghai Luarch/x86/kernel/setup.c void __init setup_arch(char **cmdline_p) · line 646
Quoted 3 lines · Yinghai Lu
arch/x86/kernel/setup.c +2
-0+/* update the e820_saved too */ +e820_reserve_setup_data ();
Why do you want to update the e820_saved here? /sys/firmware/memmap should provide the real BIOS-provided memory map, IMO ...
Bernhard
Signature · 1 line
Bernhard Walle, SUSE LINUX Products GmbH, Architecture Development
Re: [PATCH] x86: make e820_saved have update from setup_data
Quoted 7 lines · Bernhard Walle
arch/x86/kernel/setup.c void __init setup_arch(char **cmdline_p) · line 646
Quoted 3 lines · Yinghai Lu
arch/x86/kernel/setup.c +2
-0+/* update the e820_saved too */ +e820_reserve_setup_data ();Why do you want to update the
e820_savedhere?/sys/firmware/memmapshould provide the real BIOS-provided memory map, IMO ...
that setup_data is another half memmap for efi.
YH
H. Peter Anvin
reviewerRe: [PATCH] x86: make e820_saved have update from setup_data
In reply to Bernhard WalleQuoted 6 lines · Bernhard Walle
arch/x86/kernel/setup.c void __init setup_arch(char **cmdline_p) · line 646
Quoted 2 lines · Yinghai Lu
arch/x86/kernel/setup.c +2
-0+/* update the e820_saved too */ +e820_reserve_setup_data ();Why do you want to update the
e820_savedhere?/sys/firmware/memmapshould provide the real BIOS-provided memory map, IMO ...
I would concur with that.
-hpa
Ingo Molnar
AppliedQuoted 2 lines · Yinghai Lu
so other path that will override
memory_setupormachine_specific_memory_setupcould havee820_savedtoo
applied to tip/x86/core, thanks Yinghai.
Ingo
Ingo Molnar
AppliedRe: [PATCH] x86: let early_reserve_e820 update e820_saved too
In reply to Yinghai LuQuoted 2 lines · Yinghai Lu
so when it is called after
early_param,e820_savedget updated too. esp for mpc update.
applied to tip/x86/core, thanks Yinghai.
Ingo