diff options
-rw-r--r-- | kexec/arch/i386/crashdump-x86.c | 24 | ||||
-rw-r--r-- | kexec/kexec-syscall.h | 34 |
2 files changed, 53 insertions, 5 deletions
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c index d6c9211..01f470d 100644 --- a/kexec/arch/i386/crashdump-x86.c +++ b/kexec/arch/i386/crashdump-x86.c @@ -615,10 +615,10 @@ static int get_crash_notes(int cpu, uint64_t *addr, uint64_t *len) return get_crash_notes_per_cpu(cpu, addr, len); } -static enum coretype get_core_type(struct kexec_info *info, +static enum coretype get_core_type(struct crash_elf_info *elf_info, struct memory_range *range, int ranges) { - if ((info->kexec_flags & KEXEC_ARCH_MASK) == KEXEC_ARCH_X86_64) + if ((elf_info->machine) == EM_X86_64) return CORE_TYPE_ELF64; else { /* fall back to default */ @@ -720,23 +720,37 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline, int nr_ranges, align = 1024, i; struct memory_range *mem_range, *memmap_p; struct crash_elf_info elf_info; + unsigned kexec_arch; memset(&elf_info, 0x0, sizeof(elf_info)); /* Constant parts of the elf_info */ + memset(&elf_info, 0, sizeof(elf_info)); elf_info.data = ELFDATA2LSB; get_backup_area(&elf_info.backup_src_start, &elf_info.backup_src_end); info->backup_src_start = elf_info.backup_src_start; info->backup_src_size = elf_info.backup_src_end - elf_info.backup_src_start + 1; + /* Get the architecture of the running kernel */ + kexec_arch = info->kexec_flags & KEXEC_ARCH_MASK; + if (kexec_arch == KEXEC_ARCH_DEFAULT) + kexec_arch = KEXEC_ARCH_NATIVE; + /* Get the elf architecture of the running kernel */ - if ((info->kexec_flags & KEXEC_ARCH_MASK) == KEXEC_ARCH_X86_64) { + switch(kexec_arch) { + case KEXEC_ARCH_X86_64: elf_info.machine = EM_X86_64; - } else { + break; + case KEXEC_ARCH_386: elf_info.machine = EM_386; elf_info.lowmem_limit = X86_MAXMEM; elf_info.get_note_info = get_crash_notes; + break; + default: + fprintf(stderr, "unsupported crashdump architecture: %04x\n", + kexec_arch); + return -1; } if (get_crash_memory_ranges(&mem_range, &nr_ranges, @@ -750,7 +764,7 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline, */ if (arch_options.core_header_type == CORE_TYPE_UNDEF) { arch_options.core_header_type = - get_core_type(info, mem_range, nr_ranges); + get_core_type(&elf_info, mem_range, nr_ranges); } /* Get the elf class... */ elf_info.class = ELFCLASS32; diff --git a/kexec/kexec-syscall.h b/kexec/kexec-syscall.h index 7f41a1b..03d7abc 100644 --- a/kexec/kexec-syscall.h +++ b/kexec/kexec-syscall.h @@ -99,4 +99,38 @@ static inline long kexec_reboot(void) #define KEXEC_MAX_SEGMENTS 16 +#ifdef __i386__ +#define KEXEC_ARCH_NATIVE KEXEC_ARCH_386 +#endif +#ifdef __sh__ +#define KEXEC_ARCH_NATIVE KEXEC_ARCH_SH +#endif +#ifdef __cris__ +#define KEXEC_ARCH_NATIVE KEXEC_ARCH_CRIS +#endif +#ifdef __ia64__ +#define KEXEC_ARCH_NATIVE KEXEC_ARCH_IA_64 +#endif +#ifdef __powerpc64__ +#define KEXEC_ARCH_NATIVE KEXEC_ARCH_PPC64 +#endif +#ifdef __powerpc__ +#define KEXEC_ARCH_NATIVE KEXEC_ARCH_PPC +#endif +#ifdef __x86_64__ +#define KEXEC_ARCH_NATIVE KEXEC_ARCH_X86_64 +#endif +#ifdef __s390x__ +#define KEXEC_ARCH_NATIVE KEXEC_ARCH_S390 +#endif +#ifdef __s390__ +#define KEXEC_ARCH_NATIVE KEXEC_ARCH_S390 +#endif +#ifdef __arm__ +#define KEXEC_ARCH_NATIVE KEXEC_ARCH_ARM +#endif +#if defined(__mips__) +#define KEXEC_ARCH_NATIVE KEXEC_ARCH_MIPS +#endif + #endif /* KEXEC_SYSCALL_H */ |