diff options
author | Sachin P. Sant <sachinp@in.ibm.com> | 2007-01-23 20:12:33 +0530 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2007-01-29 16:54:29 +0900 |
commit | f8afe9befb4918853b3002725e53ddbbd43cf719 (patch) | |
tree | a1fc121f0b2702b14147067f3702a38ea6c4dd17 /kexec/arch/ppc64/crashdump-ppc64.c | |
parent | 7792798a79b78a5d566f70c9f00237d050b01350 (diff) |
cp /proc/vmcore fails on core generated using latest kexec tools.
* On ppc64 memory ranges in device-tree is denoted as start and size.
* While in case of other architectures like i386 it is represented as start and
* end. Because of this when loading the memory ranges in crashdump-elf.c the
* filesz calculation using start and end values of memory range goes for a toss.
*
* phdr->p_filesz = phdr->p_memsz = mend - mstart + 1;
*
* Because of the +1 in above statement the generated vmcore is not a valid
* dump file.
*
* There are different ways in which this problem can be fixed.
* A. Add a ifdef in crashdump-elf.c for elf machine type.
* if EM_PPC64 then
* filesz = end - start;
* else
* filesz = end - start + 1;
* fi
* B. Change the ppc64 specific code so as to follow the i386 convention when
* it comes to representing memory ranges.
* C. Create a PPC64 specific function to populate crash ranges and not use
* the generic function from crashdump-elf.c
*
* Of all these solutions B is the smallest and works well. Here is a patch
* to implement the same.
*
Signed-off-by : Sachin Sant <sachinp@in.ibm.com>
Removed trailing whitespace
Signed-off-by : Simon Horman <horms@verge.net.au>
Diffstat (limited to 'kexec/arch/ppc64/crashdump-ppc64.c')
-rw-r--r-- | kexec/arch/ppc64/crashdump-ppc64.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/kexec/arch/ppc64/crashdump-ppc64.c b/kexec/arch/ppc64/crashdump-ppc64.c index 33d4b18..d3231b6 100644 --- a/kexec/arch/ppc64/crashdump-ppc64.c +++ b/kexec/arch/ppc64/crashdump-ppc64.c @@ -120,7 +120,7 @@ static int get_crash_memory_ranges(struct memory_range **range, int *ranges) /* create a separate program header for the backup region */ crash_memory_range[0].start = BACKUP_SRC_START; - crash_memory_range[0].end = BACKUP_SRC_END; + crash_memory_range[0].end = BACKUP_SRC_END + 1; crash_memory_range[0].type = RANGE_RAM; memory_ranges++; @@ -165,8 +165,8 @@ static int get_crash_memory_ranges(struct memory_range **range, int *ranges) start = ((unsigned long long *)buf)[0]; end = start + ((unsigned long long *)buf)[1]; - if (start == 0 && end >= BACKUP_SRC_END) - start = BACKUP_SRC_END; + if (start == 0 && end >= (BACKUP_SRC_END + 1)) + start = BACKUP_SRC_END + 1; cstart = crash_base; cend = crash_base + crash_size; @@ -309,7 +309,8 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline, { void *tmp; unsigned long sz, elfcorehdr; - int nr_ranges, align = 1024; + int nr_ranges, align = 1024, i; + unsigned long long end; struct memory_range *mem_range; if (get_crash_memory_ranges(&mem_range, &nr_ranges) < 0) @@ -323,6 +324,22 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline, 0, max_addr, 1); reserve(info->backup_start, sz); + /* On ppc64 memory ranges in device-tree is denoted as start + * and size rather than start and end, as is the case with + * other architectures like i386 . Because of this when loading + * the memory ranges in crashdump-elf.c the filesz calculation + * [ end - start + 1 ] goes for a toss. + * + * To be in sync with other archs adjust the end value for + * every crash memory range before calling the generic function + */ + + for (i = 0; i < nr_ranges; i++) { + end = crash_memory_range[i].end - 1; + crash_memory_range[i].end = end; + } + + /* Create elf header segment and store crash image data. */ if (arch_options.core_header_type == CORE_TYPE_ELF64) { if (crash_create_elf64_headers(info, &elf_info64, |