aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/kernel/e820.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/kernel/e820.c')
-rw-r--r--arch/x86_64/kernel/e820.c53
1 files changed, 43 insertions, 10 deletions
diff --git a/arch/x86_64/kernel/e820.c b/arch/x86_64/kernel/e820.c
index 1362aad4f3aa..a4739dc82937 100644
--- a/arch/x86_64/kernel/e820.c
+++ b/arch/x86_64/kernel/e820.c
@@ -596,31 +596,64 @@ void __init setup_memory_region(void)
596 e820_print_map(who); 596 e820_print_map(who);
597} 597}
598 598
599void __init parse_memopt(char *p, char **from) 599static int __init parse_memopt(char *p)
600{ 600{
601 end_user_pfn = memparse(p, from); 601 if (!p)
602 return -EINVAL;
603 end_user_pfn = memparse(p, &p);
602 end_user_pfn >>= PAGE_SHIFT; 604 end_user_pfn >>= PAGE_SHIFT;
605 return 0;
603} 606}
607early_param("mem", parse_memopt);
608
609static int userdef __initdata;
604 610
605void __init parse_memmapopt(char *p, char **from) 611static int __init parse_memmap_opt(char *p)
606{ 612{
613 char *oldp;
607 unsigned long long start_at, mem_size; 614 unsigned long long start_at, mem_size;
608 615
609 mem_size = memparse(p, from); 616 if (!strcmp(p, "exactmap")) {
610 p = *from; 617#ifdef CONFIG_CRASH_DUMP
618 /* If we are doing a crash dump, we
619 * still need to know the real mem
620 * size before original memory map is
621 * reset.
622 */
623 saved_max_pfn = e820_end_of_ram();
624#endif
625 end_pfn_map = 0;
626 e820.nr_map = 0;
627 userdef = 1;
628 return 0;
629 }
630
631 oldp = p;
632 mem_size = memparse(p, &p);
633 if (p == oldp)
634 return -EINVAL;
611 if (*p == '@') { 635 if (*p == '@') {
612 start_at = memparse(p+1, from); 636 start_at = memparse(p+1, &p);
613 add_memory_region(start_at, mem_size, E820_RAM); 637 add_memory_region(start_at, mem_size, E820_RAM);
614 } else if (*p == '#') { 638 } else if (*p == '#') {
615 start_at = memparse(p+1, from); 639 start_at = memparse(p+1, &p);
616 add_memory_region(start_at, mem_size, E820_ACPI); 640 add_memory_region(start_at, mem_size, E820_ACPI);
617 } else if (*p == '$') { 641 } else if (*p == '$') {
618 start_at = memparse(p+1, from); 642 start_at = memparse(p+1, &p);
619 add_memory_region(start_at, mem_size, E820_RESERVED); 643 add_memory_region(start_at, mem_size, E820_RESERVED);
620 } else { 644 } else {
621 end_user_pfn = (mem_size >> PAGE_SHIFT); 645 end_user_pfn = (mem_size >> PAGE_SHIFT);
622 } 646 }
623 p = *from; 647 return *p == '\0' ? 0 : -EINVAL;
648}
649early_param("memmap", parse_memmap_opt);
650
651void finish_e820_parsing(void)
652{
653 if (userdef) {
654 printk(KERN_INFO "user-defined physical RAM map:\n");
655 e820_print_map("user");
656 }
624} 657}
625 658
626unsigned long pci_mem_start = 0xaeedbabe; 659unsigned long pci_mem_start = 0xaeedbabe;