summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kexec/arch/i386/crashdump-x86.c24
-rw-r--r--kexec/kexec-syscall.h34
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 */