瀏覽代碼

x86: fix CONFIG_X86_RESERVE_LOW_64K=y

The bad_bios_dmi_table() quirk never triggered because we do DMI setup
too late. Move it a bit earlier.

Also change the CONFIG_X86_RESERVE_LOW_64K quirk to operate on the e820
table directly instead of messing with early reservations - this handles
overlaps (which do occur in this low range of RAM) more gracefully.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Yinghai Lu 16 年之前
父節點
當前提交
2216d199b1
共有 1 個文件被更改,包括 6 次插入5 次删除
  1. 6 5
      arch/x86/kernel/setup.c

+ 6 - 5
arch/x86/kernel/setup.c

@@ -735,7 +735,8 @@ static int __init dmi_low_memory_corruption(const struct dmi_system_id *d)
 		"%s detected: BIOS may corrupt low RAM, working it around.\n",
 		"%s detected: BIOS may corrupt low RAM, working it around.\n",
 		d->ident);
 		d->ident);
 
 
-	reserve_early_overlap_ok(0x0, 0x10000, "BIOS quirk");
+	e820_update_range(0, 0x10000, E820_RAM, E820_RESERVED);
+	sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
 
 
 	return 0;
 	return 0;
 }
 }
@@ -784,8 +785,6 @@ void __init setup_arch(char **cmdline_p)
 	printk(KERN_INFO "Command line: %s\n", boot_command_line);
 	printk(KERN_INFO "Command line: %s\n", boot_command_line);
 #endif
 #endif
 
 
-	dmi_check_system(bad_bios_dmi_table);
-
 	early_cpu_init();
 	early_cpu_init();
 	early_ioremap_init();
 	early_ioremap_init();
 
 
@@ -880,6 +879,10 @@ void __init setup_arch(char **cmdline_p)
 
 
 	finish_e820_parsing();
 	finish_e820_parsing();
 
 
+	dmi_scan_machine();
+
+	dmi_check_system(bad_bios_dmi_table);
+
 #ifdef CONFIG_X86_32
 #ifdef CONFIG_X86_32
 	probe_roms();
 	probe_roms();
 #endif
 #endif
@@ -967,8 +970,6 @@ void __init setup_arch(char **cmdline_p)
 	vsmp_init();
 	vsmp_init();
 #endif
 #endif
 
 
-	dmi_scan_machine();
-
 	io_delay_init();
 	io_delay_init();
 
 
 	/*
 	/*