Skip to contentSkip to conversation

x86: move saving e820_saved to setup_memory_map

PATCH Applied Yinghai Lu 4 participants 8 messages Jul 3, 2008 – Jul 9, 2008 x86

lore
Share & tools
lore

Yinghai Lu

author
#0 lore raw

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
Index: linux-2.6/arch/x86/kernel/e820.c
===================================================================
@@ -1294,8 +1294,6 @@ char *__init default_machine_specific_me
 		e820_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)) memo
 
 void __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
author
#1 lore raw

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
Index: linux-2.6/arch/x86/kernel/setup.c
===================================================================
@@ -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(vo
 		return;
 
 	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
#2 lore raw

Re: [PATCH] x86: make e820_saved have update from setup_data

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_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
author
#3 lore raw

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_saved here? /sys/firmware/memmap should provide the real BIOS-provided memory map, IMO ...

that setup_data is another half memmap for efi.

YH

#4 lore raw

Re: [PATCH] x86: make e820_saved have update from setup_data

In reply to Bernhard Walle
Quoted 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_saved here? /sys/firmware/memmap should provide the real BIOS-provided memory map, IMO ...

I would concur with that.

-hpa

author
#5 lore raw

PATCH 1/1 x86: let early_reserve_e820 update e820_saved too

In reply to Yinghai Lu

so 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
Index: linux-2.6/arch/x86/kernel/e820.c
===================================================================
@@ -414,8 +414,9 @@ static int __init append_e820_map(struct
 	return __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;
 }
Applied
#6 lore raw

Re: [PATCH] x86: let early_reserve_e820 update e820_saved too

Quoted 2 lines · Yinghai Lu

so when it is called after early_param, e820_saved get updated too. esp for mpc update.

applied to tip/x86/core, thanks Yinghai.

Ingo

Applied
#7 lore raw
In reply to Yinghai Lu
Quoted 2 lines · Yinghai Lu

so other path that will override memory_setup or machine_specific_memory_setup could have e820_saved too

applied to tip/x86/core, thanks Yinghai.

Ingo