diff options
-rw-r--r-- | include/elf.h | 3 | ||||
-rw-r--r-- | kexec/kexec-elf-exec.c | 6 |
2 files changed, 7 insertions, 2 deletions
diff --git a/include/elf.h b/include/elf.h index 5db637b..b7677a2 100644 --- a/include/elf.h +++ b/include/elf.h @@ -258,7 +258,8 @@ typedef struct #define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ #define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ #define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ -#define EM_NUM 95 +#define EM_AARCH64 183 /* ARM AARCH64 */ +#define EM_NUM 184 /* If it is necessary to assign new unofficial EM_* values, please pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the diff --git a/kexec/kexec-elf-exec.c b/kexec/kexec-elf-exec.c index cb62d04..a9329ac 100644 --- a/kexec/kexec-elf-exec.c +++ b/kexec/kexec-elf-exec.c @@ -63,9 +63,13 @@ int elf_exec_load(struct mem_ehdr *ehdr, struct kexec_info *info) /* If I have a dynamic executable find it's size * and then find a location for it in memory. + * Note on arm64: + * arm64's vmlinux has virtual address in physical address + * field of PT_LOAD segments. So the following validity check + * and relocation makes no sense on arm64. */ base = 0; - if (ehdr->e_type == ET_DYN) { + if ((ehdr->e_machine != EM_AARCH64) && (ehdr->e_type == ET_DYN)) { unsigned long first, last, align; first = ULONG_MAX; last = 0; |