summaryrefslogtreecommitdiffstats
path: root/purgatory
diff options
context:
space:
mode:
authorAmerigo Wang <amwang@redhat.com>2011-03-03 00:10:43 +0800
committerSimon Horman <horms@verge.net.au>2011-03-03 07:10:48 +0900
commit1100580b05e3fdfe648d9be8617d962b11f4b88b (patch)
tree73d3fcc4f00d360b4467dd08ea5d65f7468dd714 /purgatory
parentb6a18093576eb207d898fe90d7823c4c083f70e1 (diff)
downloadkexec-tools-1100580b05e3fdfe648d9be8617d962b11f4b88b.tar.gz
get the backup area dynamically
Currently we hard-coded the first 640K area as backup area, however, this is not correct on some system which has reserved memory area in the first 640K: BIOS-e820: 0000000000010000 - 0000000000097000 (usable) BIOS-e820: 0000000000097000 - 00000000000a0000 (reserved) on such system we still mark all the first 640K as usable in capture kernel, this will cause kernel panic. The solution, pointed by Vivek, is that we can get the backup area dynamically by reading /proc/iomem. The reporter has tested this patch and it fixes the problem. Signed-off-by: WANG Cong <amwang@redhat.com> Acked-by: Vivek Goyal <vgoyal@redhat.com> Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'purgatory')
-rw-r--r--purgatory/arch/i386/crashdump_backup.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/purgatory/arch/i386/crashdump_backup.c b/purgatory/arch/i386/crashdump_backup.c
index c6194460..365eb5d8 100644
--- a/purgatory/arch/i386/crashdump_backup.c
+++ b/purgatory/arch/i386/crashdump_backup.c
@@ -20,13 +20,15 @@
#include <stdint.h>
#include <string.h>
-#include "../../../kexec/arch/i386/crashdump-x86.h"
/* Backup region start gets set after /proc/iomem has been parsed. */
/* We reuse the same code for x86_64 also so changing backup_start to
unsigned long */
unsigned long backup_start = 0;
+unsigned long backup_src_start = 0;
+unsigned long backup_src_size = 0;
+
/* Backup first 640K of memory to backup region as reserved by kexec.
* Assuming first 640K has to be present on i386 machines and no address
* validity checks have to be performed. */
@@ -34,11 +36,16 @@ unsigned long backup_start = 0;
void crashdump_backup_memory(void)
{
void *dest, *src;
+ size_t size;
+
+ src = (void *) backup_src_start;
+ size = (size_t) backup_src_size;
- src = (void *) BACKUP_SRC_START;
+ if (!size)
+ return;
if (backup_start) {
dest = (void *)(backup_start);
- memcpy(dest, src, BACKUP_SRC_SIZE);
+ memcpy(dest, src, size);
}
}