diff options
author | Bernhard Walle <bwalle@suse.de> | 2008-11-26 10:00:39 +0100 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2008-11-28 13:53:02 +0900 |
commit | 73a97629eab98f06b2b1a707e9b310d5fd9f9520 (patch) | |
tree | 022922e618421d535b4ad8994e2d34b6a99575c7 | |
parent | fcd049da6ac36183e2dc69bd1f479d059e8dd9a7 (diff) |
Don't use /sys/firmware/memmap for Xen
On Xen, we have to use /proc/iomem to retrieve the memory area for the kexec'd
kernel, not /sys/firmware/memmap. Dom0 kernel gets a E820 map that contains
only one region:
0000000000000000-0000000018e5e000 (System RAM)
Compared to the /proc/iomem:
00000000-0009cbff : System RAM
0009cc00-0009ffff : reserved
000ce000-000d3fff : reserved
000e0000-000fffff : reserved
00100000-1fd6ffff : System RAM
01000000-04ffffff : Crash kernel
1ec00000-1fbfffff : Hypervisor code and data
1f0b4680-1f0b4873 : Crash note
1f0b4900-1f0b4a93 : Crash note
1f0b4b80-1f0b4d13 : Crash note
1f0b4e00-1f0b4f93 : Crash note
...
Without that patch, /proc/vmcore is empty in the kexec'd kernel and I'm unable
to copy the crashdump.
Signed-off-by: Bernhard Walle <bwalle@suse.de>
Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r-- | kexec/arch/i386/kexec-x86-common.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/kexec/arch/i386/kexec-x86-common.c b/kexec/arch/i386/kexec-x86-common.c index 00c2be3..1453780 100644 --- a/kexec/arch/i386/kexec-x86-common.c +++ b/kexec/arch/i386/kexec-x86-common.c @@ -27,6 +27,7 @@ #include "../../kexec.h" #include "../../kexec-syscall.h" #include "../../firmware_memmap.h" +#include "../../crashdump.h" #include "kexec-x86.h" static struct memory_range memory_range[MAX_MEMORY_RANGES]; @@ -147,7 +148,14 @@ int get_memory_ranges(struct memory_range **range, int *ranges, { int ret, i; - if (have_sys_firmware_memmap()) + /* + * When using Xen, /sys/firmware/memmap (i.e., the E820 map) is + * wrong, it just provides one large memory are and that cannot + * be used for Kdump. Use always the /proc/iomem interface there + * even if we have /sys/firmware/memmap. Without that, /proc/vmcore + * is empty in the kdump kernel. + */ + if (!xen_present() && have_sys_firmware_memmap()) ret = get_memory_ranges_sysfs(range, ranges); else ret = get_memory_ranges_proc_iomem(range, ranges); |