diff options
-rw-r--r-- | kexec/arch/i386/crashdump-x86.c | 26 | ||||
-rw-r--r-- | kexec/arch/i386/kexec-x86.c | 2 | ||||
-rw-r--r-- | kexec/arch/i386/kexec-x86.h | 20 |
3 files changed, 39 insertions, 9 deletions
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c index 39fb922..b3e6ede 100644 --- a/kexec/arch/i386/crashdump-x86.c +++ b/kexec/arch/i386/crashdump-x86.c @@ -486,6 +486,23 @@ static struct crash_elf_info elf_info32 = get_note_info: get_crash_notes, }; +static enum coretype get_core_type(struct kexec_info *info, + struct memory_range *range, int ranges) +{ + if (info->kexec_flags & KEXEC_ARCH_X86_64) + return CORE_TYPE_ELF64; + else { + /* fall back to default */ + if (ranges == 0) + return CORE_TYPE_ELF64; + + if (range[ranges].end > 0xFFFFFFFFUL) + return CORE_TYPE_ELF64; + else + return CORE_TYPE_ELF32; + } +} + /* Loads additional segments in case of a panic kernel is being loaded. * One segment for backup region, another segment for storing elf headers * for crash memory image. @@ -501,6 +518,15 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline, if (get_crash_memory_ranges(&mem_range, &nr_ranges) < 0) return -1; + /* + * if the core type has not been set on command line, set it here + * automatically + */ + if (arch_options.core_header_type == CORE_TYPE_UNDEF) { + arch_options.core_header_type = + get_core_type(info, mem_range, nr_ranges); + } + /* Memory regions which panic kernel can safely use to boot into */ sz = (sizeof(struct memory_range) * (KEXEC_MAX_SEGMENTS + 1)); memmap_p = xmalloc(sz); diff --git a/kexec/arch/i386/kexec-x86.c b/kexec/arch/i386/kexec-x86.c index 1c8d188..b737c6f 100644 --- a/kexec/arch/i386/kexec-x86.c +++ b/kexec/arch/i386/kexec-x86.c @@ -145,7 +145,7 @@ struct arch_options_t arch_options = { .serial_baud = 0, .console_vga = 0, .console_serial = 0, - .core_header_type = CORE_TYPE_ELF64, + .core_header_type = CORE_TYPE_UNDEF, }; int arch_process_options(int argc, char **argv) diff --git a/kexec/arch/i386/kexec-x86.h b/kexec/arch/i386/kexec-x86.h index 42bc276..36ed9d5 100644 --- a/kexec/arch/i386/kexec-x86.h +++ b/kexec/arch/i386/kexec-x86.h @@ -2,8 +2,12 @@ #define KEXEC_X86_H #define MAX_MEMORY_RANGES 64 -#define CORE_TYPE_ELF32 1 -#define CORE_TYPE_ELF64 2 + +enum coretype { + CORE_TYPE_UNDEF = 0, + CORE_TYPE_ELF32 = 1, + CORE_TYPE_ELF64 = 2 +}; extern unsigned char compat_x86_64[]; extern uint32_t compat_x86_64_size, compat_x86_64_entry32; @@ -40,12 +44,12 @@ struct entry16_regs { }; struct arch_options_t { - uint8_t reset_vga; - uint16_t serial_base; - uint32_t serial_baud; - uint8_t console_vga; - uint8_t console_serial; - int core_header_type; + uint8_t reset_vga; + uint16_t serial_base; + uint32_t serial_baud; + uint8_t console_vga; + uint8_t console_serial; + enum coretype core_header_type; }; int multiboot_x86_probe(const char *buf, off_t len); |