--- arch/x86/kernel/e820.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) Index: linux-2.6/arch/x86/kernel/e820.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/e820.c +++ linux-2.6/arch/x86/kernel/e820.c @@ -836,6 +836,7 @@ static int __init parse_memopt(char *p) early_param("mem", parse_memopt); static bool __initdata exactmap_parsed; +static bool __initdata exactusablemap_parsed; static int __init parse_memmap_one(char *p) { @@ -845,7 +846,7 @@ static int __init parse_memmap_one(char if (!p) return -EINVAL; - if (!strncmp(p, "exactmap", 8)) { + if (!strncmp(p, "exactmap", 8) || !strncmp(p, "exactusablemap", 14)) { if (exactmap_parsed) return 0; @@ -858,6 +859,13 @@ static int __init parse_memmap_one(char */ saved_max_pfn = e820_end_of_ram_pfn(); #endif + if (!strncmp(p, "exactusablemap", 14)) { + /* remove all old E820_RAM ranges */ + e820_remove_range(0, ULLONG_MAX, E820_RAM, 1); + exactusablemap_parsed = true; + userdef = 1; + return 0; + } e820.nr_map = 0; userdef = 1; return 0; @@ -871,6 +879,11 @@ static int __init parse_memmap_one(char userdef = 1; if (*p == '@') { start_at = memparse(p+1, &p); + if (exactusablemap_parsed) { + /* remove all range with other types */ + e820_remove_range(start_at, mem_size, + E820_RAM, 0); + } e820_add_region(start_at, mem_size, E820_RAM); } else if (*p == '#') { start_at = memparse(p+1, &p); @@ -890,6 +903,11 @@ static int __init parse_memmap_opt(char p = strstr(p, "exactmap"); if (p) parse_memmap_one("exactmap"); + else { + p = strstr(boot_command_line, "exactusablemap"); + if (p) + parse_memmap_one("exactusablemap"); + } while (str) { char *k = strchr(str, ',');