mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
93a72052be
The Xen PV drivers in a crashed HVM guest can not connect to the dom0 backend drivers because both frontend and backend drivers are still in connected state. To run the connection reset function only in case of a crashdump, the is_kdump_kernel() function needs to be available for the PV driver modules. Consolidate elfcorehdr_addr, setup_elfcorehdr and saved_max_pfn into kernel/crash_dump.c Also export elfcorehdr_addr to make is_kdump_kernel() usable for modules. Leave 'elfcorehdr' as early_param(). This changes powerpc from __setup() to early_param(). It adds an address range check from x86 also on ia64 and powerpc. [akpm@linux-foundation.org: additional #includes] [akpm@linux-foundation.org: remove elfcorehdr_addr export] [akpm@linux-foundation.org: fix for Tejun's mm/nobootmem.c changes] Signed-off-by: Olaf Hering <olaf@aepfle.de> Cc: Russell King <rmk@arm.linux.org.uk> Cc: "Luck, Tony" <tony.luck@intel.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mundt <lethal@linux-sh.org> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
50 lines
1.5 KiB
C
50 lines
1.5 KiB
C
/*
|
|
* kernel/crash_dump.c - Memory preserving reboot related code.
|
|
*
|
|
* Created by: Simon Horman <horms@verge.net.au>
|
|
* Original code moved from kernel/crash.c
|
|
* Original code comment copied from the i386 version of this file
|
|
*/
|
|
|
|
#include <linux/errno.h>
|
|
#include <linux/types.h>
|
|
#include <linux/crash_dump.h>
|
|
|
|
#include <asm/page.h>
|
|
#include <asm/uaccess.h>
|
|
|
|
/**
|
|
* copy_oldmem_page - copy one page from "oldmem"
|
|
* @pfn: page frame number to be copied
|
|
* @buf: target memory address for the copy; this can be in kernel address
|
|
* space or user address space (see @userbuf)
|
|
* @csize: number of bytes to copy
|
|
* @offset: offset in bytes into the page (based on pfn) to begin the copy
|
|
* @userbuf: if set, @buf is in user address space, use copy_to_user(),
|
|
* otherwise @buf is in kernel address space, use memcpy().
|
|
*
|
|
* Copy a page from "oldmem". For this page, there is no pte mapped
|
|
* in the current kernel. We stitch up a pte, similar to kmap_atomic.
|
|
*
|
|
* Calling copy_to_user() in atomic context is not desirable. Hence first
|
|
* copying the data to a pre-allocated kernel page and then copying to user
|
|
* space in non-atomic context.
|
|
*/
|
|
ssize_t
|
|
copy_oldmem_page(unsigned long pfn, char *buf,
|
|
size_t csize, unsigned long offset, int userbuf)
|
|
{
|
|
void *vaddr;
|
|
|
|
if (!csize)
|
|
return 0;
|
|
vaddr = __va(pfn<<PAGE_SHIFT);
|
|
if (userbuf) {
|
|
if (copy_to_user(buf, (vaddr + offset), csize)) {
|
|
return -EFAULT;
|
|
}
|
|
} else
|
|
memcpy(buf, (vaddr + offset), csize);
|
|
return csize;
|
|
}
|
|
|