Retrieve saved max pfn
PATCH 8/17 Retrieve saved max pfn
From: "Vivek Goyal" <[email protected]>
o 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 <[email protected]>
---
linux-2.6.12-rc1-mm1-1M-root/arch/i386/kernel/setup.c | 12 ++++++++++++ linux-2.6.12-rc1-mm1-1M-root/include/linux/bootmem.h | 4 ++++ linux-2.6.12-rc1-mm1-1M-root/mm/bootmem.c | 8 ++++++++ 3 files changed, 24 insertions(+)
arch/i386/kernel/setup.c renamed from arch/i386/kernel/setup.c~crashdump-x86-retrieve-max-pfn +12 -0
@@ -57,6 +57,9 @@#include "setup_arch_pre.h" #include <bios_ebda.h> +/* 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! */
@@ -715,6 +718,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 ;
include/linux/bootmem.h renamed from include/linux/bootmem.h~crashdump-x86-retrieve-max-pfn +4 -0
@@ -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.
mm/bootmem.c renamed from mm/bootmem.c~crashdump-x86-retrieve-max-pfn +8 -0
@@ -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) {
_