Commit 69cda7b1 authored by akpm@osdl.org's avatar akpm@osdl.org Committed by Linus Torvalds
Browse files

[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: default avatarMurali M Chakravarthy <muralim@in.ibm.com>
Signed-off-by: default avatarHariprasad Nellitheertha <nharipra@gmail.com>
Signed-off-by: default avatarVivek Goyal <vgoyal@in.ibm.com>
Cc: Andi Kleen <ak@muc.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent bf208305
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -832,7 +832,7 @@ running once the system is up.
	mem=nopentium	[BUGS=IA-32] Disable usage of 4MB pages for kernel
			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.
			Such memmap=exactmap lines can be constructed based on
			BIOS output or other requirements. See the memmap=nn@ss
+21 −0
Original line number Diff line number Diff line
@@ -559,6 +559,27 @@ void __init parse_memopt(char *p, char **from)
	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;

/*
+27 −0
Original line number Diff line number Diff line
@@ -275,6 +275,7 @@ static __init void parse_cmdline_early (char ** cmdline_p)
{
	char c = ' ', *to = command_line, *from = COMMAND_LINE;
	int len = 0;
	int userdef = 0;

	/* Save unparsed command line copy for /proc/cmdline */
	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))
			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
		if (!memcmp(from, "numa=", 5))
			numa_setup(from+5); 
@@ -403,6 +426,10 @@ static __init void parse_cmdline_early (char ** cmdline_p)
			break;
		*(to++) = c;
	}
	if (userdef) {
		printk(KERN_INFO "user-defined physical RAM map:\n");
		e820_print_map("user");
	}
	*to = '\0';
	*cmdline_p = command_line;
}
+1 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ extern unsigned long e820_hole_size(unsigned long start_pfn,
				    unsigned long end_pfn);

extern void __init parse_memopt(char *p, char **end);
extern void __init parse_memmapopt(char *p, char **end);

extern struct e820map e820;
#endif/*!__ASSEMBLY__*/