From fd40eee42273220fb0050fe10744b10067adc0a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= Date: Fri, 31 Aug 2018 17:31:50 +0200 Subject: [PATCH] x86_64: Add support to build kexec-tools with x32 ABI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary of changes, configure.ac: Add test for detect x32 ABI. purgatory/arch/x86_64/Makefile: Not use mcmodel large when x32 ABI is set. kexec/arch/x86_64/kexec-elf-rel-x86_64.c: When x32 ABI is set use ELFCLASS32 instead of ELFCLASS64. kexec/kexec-syscall.h: Add correct syscall number for x32 ABI. Upstream-Status: Submitted Signed-off-by: Aníbal Limón Signed-off-by: Mariano Lopez --- configure.ac | 9 +++++++++ kexec/arch/x86_64/kexec-elf-rel-x86_64.c | 4 ++++ kexec/kexec-syscall.h | 4 ++++ purgatory/arch/x86_64/Makefile | 4 +++- 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index e05d601..c428146 100644 --- a/configure.ac +++ b/configure.ac @@ -54,6 +54,15 @@ case $target_cpu in ;; ia64|x86_64|alpha|m68k ) ARCH="$target_cpu" + + dnl ---Test for x32 ABI in x86_64 + if test "x$ARCH" = "xx86_64" ; then + AC_EGREP_CPP(x32_test, + [#if defined(__x86_64__) && defined (__ILP32__) + x32_test + #endif + ], SUBARCH='x32', SUBARCH='64') + fi ;; * ) AC_MSG_ERROR([unsupported architecture $target_cpu]) diff --git a/kexec/arch/x86_64/kexec-elf-rel-x86_64.c b/kexec/arch/x86_64/kexec-elf-rel-x86_64.c index 761a4ed..1c0e3f8 100644 --- a/kexec/arch/x86_64/kexec-elf-rel-x86_64.c +++ b/kexec/arch/x86_64/kexec-elf-rel-x86_64.c @@ -8,7 +8,11 @@ int machine_verify_elf_rel(struct mem_ehdr *ehdr) if (ehdr->ei_data != ELFDATA2LSB) { return 0; } +#ifdef __ILP32__ + if (ehdr->ei_class != ELFCLASS32) { +#else if (ehdr->ei_class != ELFCLASS64) { +#endif return 0; } if (ehdr->e_machine != EM_X86_64) { diff --git a/kexec/kexec-syscall.h b/kexec/kexec-syscall.h index 2a3794d..3e67078 100644 --- a/kexec/kexec-syscall.h +++ b/kexec/kexec-syscall.h @@ -31,8 +31,12 @@ #define __NR_kexec_load 268 #endif #ifdef __x86_64__ +#ifdef __ILP32__ +#define __NR_kexec_load 528 +#else #define __NR_kexec_load 246 #endif +#endif #ifdef __s390x__ #define __NR_kexec_load 277 #endif diff --git a/purgatory/arch/x86_64/Makefile b/purgatory/arch/x86_64/Makefile index 7300937..4af11e4 100644 --- a/purgatory/arch/x86_64/Makefile +++ b/purgatory/arch/x86_64/Makefile @@ -23,4 +23,6 @@ x86_64_PURGATORY_SRCS += purgatory/arch/i386/console-x86.c x86_64_PURGATORY_SRCS += purgatory/arch/i386/vga.c x86_64_PURGATORY_SRCS += purgatory/arch/i386/pic.c -x86_64_PURGATORY_EXTRA_CFLAGS = -mcmodel=large +ifeq ($(SUBARCH),64) + x86_64_PURGATORY_EXTRA_CFLAGS = -mcmodel=large +endif