diff options
author | Bernhard Walle <bwalle@suse.de> | 2007-07-10 10:23:16 +0200 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2007-07-27 14:08:32 +0900 |
commit | b9c3648e690ad0dad12389659673206213a09760 (patch) | |
tree | a40271dee3ba106a8bf005e16b37423f46477963 | |
parent | b84b87747a16f0afbef6f6802bb794a94f4961d9 (diff) |
Determine ELF32/ELF64 automatically on i386
On i386, kexec generates ELF64 core headers by default if the user doesn't
override this via a command line option. Because GDB cannot analyse
ELF64 core dumps on 32 bit platforms, it's a bad idea to use ELF64 if it's not
needed.
This patch selects ELF32 if the biggest memory address fits in 32 bit address
space, which should be the case on non PAE systems. If the user specifies
a command line option, that option overrides the detection.
Signed-off-by: Bernhard Walle <bwalle@suse.de>
Signed-off-by: Simon Horman <horms@verge.net.au>
-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); |