diff options
author | Aníbal Limón <anibal.limon@linux.intel.com> | 2015-03-26 16:19:58 +0000 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2015-04-07 10:22:15 +0900 |
commit | 5edcbfd1368e84fce913ceeeca7b712c524dc20d (patch) | |
tree | b9adc4423ce3f180d8742364fc75e20d0bddbf54 | |
parent | 720d110389f20012b478d376abcb3121c2fcb075 (diff) |
x86_64: Add support to build kexec-tools with x32 ABI
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.
Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
Signed-off-by: Mariano Lopez <mariano.lopez@linux.intel.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r-- | configure.ac | 9 | ||||
-rw-r--r-- | kexec/arch/x86_64/kexec-elf-rel-x86_64.c | 4 | ||||
-rw-r--r-- | kexec/kexec-syscall.h | 4 | ||||
-rw-r--r-- | purgatory/arch/x86_64/Makefile | 4 |
4 files changed, 20 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index c410e90..1ecadd5 100644 --- a/configure.ac +++ b/configure.ac @@ -52,6 +52,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 c795037..06db7f0 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 ce2e20b..cab5535 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 |