diff options
Diffstat (limited to 'kexec')
-rw-r--r-- | kexec/arch/s390/crashdump-s390.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/kexec/arch/s390/crashdump-s390.c b/kexec/arch/s390/crashdump-s390.c index 86a30a8..10f4d60 100644 --- a/kexec/arch/s390/crashdump-s390.c +++ b/kexec/arch/s390/crashdump-s390.c @@ -12,25 +12,26 @@ #include <stdio.h> #include <elf.h> #include <limits.h> +#include <string.h> #include "../../kexec.h" #include "../../kexec-syscall.h" #include "../../kexec/crashdump.h" #include "kexec-s390.h" /* - * Load additional segments for kdump kernel + * Create ELF core header */ -int load_crashdump_segments(struct kexec_info *info, unsigned long crash_base, - unsigned long crash_end) +static int create_elf_header(struct kexec_info *info, unsigned long crash_base, + unsigned long crash_end) { +#ifdef WITH_ELF_HEADER static struct memory_range crash_memory_range[MAX_MEMORY_RANGES]; - unsigned long bufsz, elfcorehdr, elfcorehdr_size, crash_size; + unsigned long elfcorehdr, elfcorehdr_size, bufsz; struct crash_elf_info elf_info; char str[COMMAND_LINESIZE]; int ranges; void *tmp; - crash_size = crash_end - crash_base + 1; memset(&elf_info, 0, sizeof(elf_info)); elf_info.data = ELFDATA2MSB; @@ -49,6 +50,23 @@ int load_crashdump_segments(struct kexec_info *info, unsigned long crash_base, elfcorehdr = add_buffer(info, tmp, bufsz, bufsz, 1024, crash_base, crash_end, -1); elfcorehdr_size = bufsz; + snprintf(str, sizeof(str), " elfcorehdr=%ld@%ldK\n", + elfcorehdr_size, elfcorehdr / 1024); + command_line_add(str); +#endif + return 0; +} + +/* + * Load additional segments for kdump kernel + */ +int load_crashdump_segments(struct kexec_info *info, unsigned long crash_base, + unsigned long crash_end) +{ + unsigned long crash_size = crash_size = crash_end - crash_base + 1; + + if (create_elf_header(info, crash_base, crash_end)) + return -1; elf_rel_build_load(info, &info->rhdr, (const char *) purgatory, purgatory_size, crash_base + 0x2000, crash_base + 0x10000, -1, 0); @@ -57,9 +75,6 @@ int load_crashdump_segments(struct kexec_info *info, unsigned long crash_base, elf_rel_set_symbol(&info->rhdr, "crash_size", &crash_size, sizeof(crash_size)); info->entry = (void *) elf_rel_get_addr(&info->rhdr, "purgatory_start"); - snprintf(str, sizeof(str), " elfcorehdr=%ld@%ldK\n", - elfcorehdr_size, elfcorehdr / 1024); - command_line_add(str); return 0; } #else |