From: Vivek Goyal This patch retrieves the max_pfn being used by previous kernel and stores it in a safe location (saved_max_pfn) before it is overwritten due to user defined memory map. This pfn is used to make sure that user does not try to read the physical memory beyond saved_max_pfn. Signed-off-by: Vivek Goyal Signed-off-by: Andrew Morton --- arch/i386/kernel/setup.c | 12 ++++++++++++ include/linux/bootmem.h | 4 ++++ mm/bootmem.c | 8 ++++++++ 3 files changed, 24 insertions(+) diff -puN arch/i386/kernel/setup.c~kdump-retrieve-saved-max-pfn arch/i386/kernel/setup.c --- 25/arch/i386/kernel/setup.c~kdump-retrieve-saved-max-pfn 2005-05-09 20:10:01.000000000 -0700 +++ 25-akpm/arch/i386/kernel/setup.c 2005-05-09 20:10:01.000000000 -0700 @@ -58,6 +58,9 @@ #include "setup_arch_pre.h" #include +/* Forward Declaration. */ +void __init find_max_pfn(void); + /* This value is set up by the early boot code to point to the value immediately after the boot time page tables. It contains a *physical* address, and must not be in the .bss segment! */ @@ -716,6 +719,15 @@ static void __init parse_cmdline_early ( if (to != command_line) to--; 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. + */ + find_max_pfn(); + saved_max_pfn = max_pfn; +#endif from += 8+7; e820.nr_map = 0; userdef = 1; diff -puN include/linux/bootmem.h~kdump-retrieve-saved-max-pfn include/linux/bootmem.h --- 25/include/linux/bootmem.h~kdump-retrieve-saved-max-pfn 2005-05-09 20:10:01.000000000 -0700 +++ 25-akpm/include/linux/bootmem.h 2005-05-09 20:10:01.000000000 -0700 @@ -22,6 +22,10 @@ extern unsigned long min_low_pfn; */ extern unsigned long max_pfn; +#ifdef CONFIG_CRASH_DUMP +extern unsigned long saved_max_pfn; +#endif + /* * node_bootmem_map is a map pointer - the bits represent all physical * memory pages (including holes) on the node. diff -puN mm/bootmem.c~kdump-retrieve-saved-max-pfn mm/bootmem.c --- 25/mm/bootmem.c~kdump-retrieve-saved-max-pfn 2005-05-09 20:10:01.000000000 -0700 +++ 25-akpm/mm/bootmem.c 2005-05-09 20:10:01.000000000 -0700 @@ -33,6 +33,14 @@ EXPORT_SYMBOL(max_pfn); /* This is expo * dma_get_required_mask(), which uses * it, can be an inline function */ +#ifdef CONFIG_CRASH_DUMP +/* + * If we have booted due to a crash, max_pfn will be a very low value. We need + * to know the amount of memory that the previous kernel used. + */ +unsigned long saved_max_pfn; +#endif + /* return the number of _pages_ that will be allocated for the boot bitmap */ unsigned long __init bootmem_bootmap_pages (unsigned long pages) { _