| From fd40eee42273220fb0050fe10744b10067adc0a7 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= <anibal.limon@linux.intel.com> |
| 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 <anibal.limon@linux.intel.com> |
| Signed-off-by: Mariano Lopez <mariano.lopez@linux.intel.com> |
| |
| --- |
| 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 |