|
@@ -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;
|
|
struct setup_data *data;
|
|
u64 pa_data;
|
|
u64 pa_data;
|
|
- char buf[32];
|
|
|
|
int found = 0;
|
|
int found = 0;
|
|
|
|
|
|
if (boot_params.hdr.version < 0x0209)
|
|
if (boot_params.hdr.version < 0x0209)
|
|
@@ -406,8 +405,6 @@ static void __init reserve_setup_data(void)
|
|
pa_data = boot_params.hdr.setup_data;
|
|
pa_data = boot_params.hdr.setup_data;
|
|
while (pa_data) {
|
|
while (pa_data) {
|
|
data = early_ioremap(pa_data, sizeof(*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_update_range(pa_data, sizeof(*data)+data->len,
|
|
E820_RAM, E820_RESERVED_KERN);
|
|
E820_RAM, E820_RESERVED_KERN);
|
|
found = 1;
|
|
found = 1;
|
|
@@ -418,10 +415,29 @@ static void __init reserve_setup_data(void)
|
|
return;
|
|
return;
|
|
|
|
|
|
sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
|
|
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");
|
|
printk(KERN_INFO "extended physical RAM map:\n");
|
|
e820_print_map("reserve setup_data");
|
|
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 ------------------------------
|
|
* --------- Crashkernel reservation ------------------------------
|
|
*/
|
|
*/
|
|
@@ -626,6 +642,8 @@ void __init setup_arch(char **cmdline_p)
|
|
|
|
|
|
setup_memory_map();
|
|
setup_memory_map();
|
|
parse_setup_data();
|
|
parse_setup_data();
|
|
|
|
+ /* update the e820_saved too */
|
|
|
|
+ e820_reserve_setup_data();
|
|
|
|
|
|
copy_edd();
|
|
copy_edd();
|
|
|
|
|
|
@@ -656,7 +674,7 @@ void __init setup_arch(char **cmdline_p)
|
|
parse_early_param();
|
|
parse_early_param();
|
|
|
|
|
|
/* after early param, so could get panic from serial */
|
|
/* after early param, so could get panic from serial */
|
|
- reserve_setup_data();
|
|
|
|
|
|
+ reserve_early_setup_data();
|
|
|
|
|
|
if (acpi_mps_check()) {
|
|
if (acpi_mps_check()) {
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|