[PATCH] kdump: Retrieve saved max pfn
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 <vgoyal@in.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
d58831e416
commit
92aa63a5a1
3 changed files with 24 additions and 0 deletions
|
@ -59,6 +59,9 @@
|
||||||
#include "setup_arch_pre.h"
|
#include "setup_arch_pre.h"
|
||||||
#include <bios_ebda.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
|
/* 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*
|
immediately after the boot time page tables. It contains a *physical*
|
||||||
address, and must not be in the .bss segment! */
|
address, and must not be in the .bss segment! */
|
||||||
|
@ -736,6 +739,15 @@ static void __init parse_cmdline_early (char ** cmdline_p)
|
||||||
if (to != command_line)
|
if (to != command_line)
|
||||||
to--;
|
to--;
|
||||||
if (!memcmp(from+7, "exactmap", 8)) {
|
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;
|
from += 8+7;
|
||||||
e820.nr_map = 0;
|
e820.nr_map = 0;
|
||||||
userdef = 1;
|
userdef = 1;
|
||||||
|
|
|
@ -22,6 +22,10 @@ extern unsigned long min_low_pfn;
|
||||||
*/
|
*/
|
||||||
extern unsigned long max_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
|
* node_bootmem_map is a map pointer - the bits represent all physical
|
||||||
* memory pages (including holes) on the node.
|
* memory pages (including holes) on the node.
|
||||||
|
|
|
@ -33,6 +33,14 @@ EXPORT_SYMBOL(max_pfn); /* This is exported so
|
||||||
* dma_get_required_mask(), which uses
|
* dma_get_required_mask(), which uses
|
||||||
* it, can be an inline function */
|
* 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 */
|
/* return the number of _pages_ that will be allocated for the boot bitmap */
|
||||||
unsigned long __init bootmem_bootmap_pages (unsigned long pages)
|
unsigned long __init bootmem_bootmap_pages (unsigned long pages)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue