|
@@ -670,6 +670,46 @@ static int __init early_parse_mem(char *p)
|
|
|
}
|
|
|
early_param("mem", early_parse_mem);
|
|
|
|
|
|
+static int __init early_parse_memmap(char *p)
|
|
|
+{
|
|
|
+ char *oldp;
|
|
|
+ u64 start_at, mem_size;
|
|
|
+
|
|
|
+ if (!p)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (!strncmp(p, "exactmap", 8)) {
|
|
|
+ pr_err("\"memmap=exactmap\" invalid on MIPS\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ oldp = p;
|
|
|
+ mem_size = memparse(p, &p);
|
|
|
+ if (p == oldp)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (*p == '@') {
|
|
|
+ start_at = memparse(p+1, &p);
|
|
|
+ add_memory_region(start_at, mem_size, BOOT_MEM_RAM);
|
|
|
+ } else if (*p == '#') {
|
|
|
+ pr_err("\"memmap=nn#ss\" (force ACPI data) invalid on MIPS\n");
|
|
|
+ return -EINVAL;
|
|
|
+ } else if (*p == '$') {
|
|
|
+ start_at = memparse(p+1, &p);
|
|
|
+ add_memory_region(start_at, mem_size, BOOT_MEM_RESERVED);
|
|
|
+ } else {
|
|
|
+ pr_err("\"memmap\" invalid format!\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*p == '\0') {
|
|
|
+ usermem = 1;
|
|
|
+ return 0;
|
|
|
+ } else
|
|
|
+ return -EINVAL;
|
|
|
+}
|
|
|
+early_param("memmap", early_parse_memmap);
|
|
|
+
|
|
|
#ifdef CONFIG_PROC_VMCORE
|
|
|
unsigned long setup_elfcorehdr, setup_elfcorehdr_size;
|
|
|
static int __init early_parse_elfcorehdr(char *p)
|