[PATCH] kdump: x86_64: add memmmap command line option
) From: Vivek Goyal <vgoyal@in.ibm.com> - This patch introduces the memmap option for x86_64 similar to i386. - memmap=exactmap enables setting of an exact E820 memory map, as specified by the user. Changes in this version: - Used e820_end_of_ram() to find the max_pfn as suggested by Andi kleen. - removed PFN_UP & PFN_DOWN macros - Printing the user defined map also. Signed-off-by: Murali M Chakravarthy <muralim@in.ibm.com> Signed-off-by: Hariprasad Nellitheertha <nharipra@gmail.com> Signed-off-by: Vivek Goyal <vgoyal@in.ibm.com> Cc: Andi Kleen <ak@muc.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
bf2083050d
commit
69cda7b1f0
4 changed files with 50 additions and 1 deletions
|
@ -832,7 +832,7 @@ running once the system is up.
|
||||||
mem=nopentium [BUGS=IA-32] Disable usage of 4MB pages for kernel
|
mem=nopentium [BUGS=IA-32] Disable usage of 4MB pages for kernel
|
||||||
memory.
|
memory.
|
||||||
|
|
||||||
memmap=exactmap [KNL,IA-32] Enable setting of an exact
|
memmap=exactmap [KNL,IA-32,X86_64] Enable setting of an exact
|
||||||
E820 memory map, as specified by the user.
|
E820 memory map, as specified by the user.
|
||||||
Such memmap=exactmap lines can be constructed based on
|
Such memmap=exactmap lines can be constructed based on
|
||||||
BIOS output or other requirements. See the memmap=nn@ss
|
BIOS output or other requirements. See the memmap=nn@ss
|
||||||
|
|
|
@ -559,6 +559,27 @@ void __init parse_memopt(char *p, char **from)
|
||||||
end_user_pfn >>= PAGE_SHIFT;
|
end_user_pfn >>= PAGE_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init parse_memmapopt(char *p, char **from)
|
||||||
|
{
|
||||||
|
unsigned long long start_at, mem_size;
|
||||||
|
|
||||||
|
mem_size = memparse(p, from);
|
||||||
|
p = *from;
|
||||||
|
if (*p == '@') {
|
||||||
|
start_at = memparse(p+1, from);
|
||||||
|
add_memory_region(start_at, mem_size, E820_RAM);
|
||||||
|
} else if (*p == '#') {
|
||||||
|
start_at = memparse(p+1, from);
|
||||||
|
add_memory_region(start_at, mem_size, E820_ACPI);
|
||||||
|
} else if (*p == '$') {
|
||||||
|
start_at = memparse(p+1, from);
|
||||||
|
add_memory_region(start_at, mem_size, E820_RESERVED);
|
||||||
|
} else {
|
||||||
|
end_user_pfn = (mem_size >> PAGE_SHIFT);
|
||||||
|
}
|
||||||
|
p = *from;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long pci_mem_start = 0xaeedbabe;
|
unsigned long pci_mem_start = 0xaeedbabe;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -275,6 +275,7 @@ static __init void parse_cmdline_early (char ** cmdline_p)
|
||||||
{
|
{
|
||||||
char c = ' ', *to = command_line, *from = COMMAND_LINE;
|
char c = ' ', *to = command_line, *from = COMMAND_LINE;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
int userdef = 0;
|
||||||
|
|
||||||
/* Save unparsed command line copy for /proc/cmdline */
|
/* Save unparsed command line copy for /proc/cmdline */
|
||||||
memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
|
memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
|
||||||
|
@ -357,6 +358,28 @@ static __init void parse_cmdline_early (char ** cmdline_p)
|
||||||
if (!memcmp(from, "mem=", 4))
|
if (!memcmp(from, "mem=", 4))
|
||||||
parse_memopt(from+4, &from);
|
parse_memopt(from+4, &from);
|
||||||
|
|
||||||
|
if (!memcmp(from, "memmap=", 7)) {
|
||||||
|
/* exactmap option is for used defined memory */
|
||||||
|
if (!memcmp(from+7, "exactmap", 8)) {
|
||||||
|
#ifdef CONFIG_CRASH_DUMP
|
||||||
|
/* If we are doing a crash dump, we
|
||||||
|
* still need to know the real mem
|
||||||
|
* size before original memory map is
|
||||||
|
* reset.
|
||||||
|
*/
|
||||||
|
saved_max_pfn = e820_end_of_ram();
|
||||||
|
#endif
|
||||||
|
from += 8+7;
|
||||||
|
end_pfn_map = 0;
|
||||||
|
e820.nr_map = 0;
|
||||||
|
userdef = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
parse_memmapopt(from+7, &from);
|
||||||
|
userdef = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NUMA
|
#ifdef CONFIG_NUMA
|
||||||
if (!memcmp(from, "numa=", 5))
|
if (!memcmp(from, "numa=", 5))
|
||||||
numa_setup(from+5);
|
numa_setup(from+5);
|
||||||
|
@ -403,6 +426,10 @@ static __init void parse_cmdline_early (char ** cmdline_p)
|
||||||
break;
|
break;
|
||||||
*(to++) = c;
|
*(to++) = c;
|
||||||
}
|
}
|
||||||
|
if (userdef) {
|
||||||
|
printk(KERN_INFO "user-defined physical RAM map:\n");
|
||||||
|
e820_print_map("user");
|
||||||
|
}
|
||||||
*to = '\0';
|
*to = '\0';
|
||||||
*cmdline_p = command_line;
|
*cmdline_p = command_line;
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,7 @@ extern unsigned long e820_hole_size(unsigned long start_pfn,
|
||||||
unsigned long end_pfn);
|
unsigned long end_pfn);
|
||||||
|
|
||||||
extern void __init parse_memopt(char *p, char **end);
|
extern void __init parse_memopt(char *p, char **end);
|
||||||
|
extern void __init parse_memmapopt(char *p, char **end);
|
||||||
|
|
||||||
extern struct e820map e820;
|
extern struct e820map e820;
|
||||||
#endif/*!__ASSEMBLY__*/
|
#endif/*!__ASSEMBLY__*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue