1*4882a593SmuzhiyunFrom fd40eee42273220fb0050fe10744b10067adc0a7 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= <anibal.limon@linux.intel.com>
3*4882a593SmuzhiyunDate: Fri, 31 Aug 2018 17:31:50 +0200
4*4882a593SmuzhiyunSubject: [PATCH] x86_64: Add support to build kexec-tools with x32 ABI
5*4882a593SmuzhiyunMIME-Version: 1.0
6*4882a593SmuzhiyunContent-Type: text/plain; charset=UTF-8
7*4882a593SmuzhiyunContent-Transfer-Encoding: 8bit
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunSummary of changes,
10*4882a593Smuzhiyun
11*4882a593Smuzhiyunconfigure.ac: Add test for detect x32 ABI.
12*4882a593Smuzhiyunpurgatory/arch/x86_64/Makefile: Not use mcmodel large when
13*4882a593Smuzhiyun	x32 ABI is set.
14*4882a593Smuzhiyunkexec/arch/x86_64/kexec-elf-rel-x86_64.c: When x32 ABI is set
15*4882a593Smuzhiyun	use ELFCLASS32 instead of ELFCLASS64.
16*4882a593Smuzhiyunkexec/kexec-syscall.h: Add correct syscall number for x32 ABI.
17*4882a593Smuzhiyun
18*4882a593SmuzhiyunUpstream-Status: Submitted
19*4882a593Smuzhiyun
20*4882a593SmuzhiyunSigned-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
21*4882a593SmuzhiyunSigned-off-by: Mariano Lopez <mariano.lopez@linux.intel.com>
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun---
24*4882a593Smuzhiyun configure.ac                             | 9 +++++++++
25*4882a593Smuzhiyun kexec/arch/x86_64/kexec-elf-rel-x86_64.c | 4 ++++
26*4882a593Smuzhiyun kexec/kexec-syscall.h                    | 4 ++++
27*4882a593Smuzhiyun purgatory/arch/x86_64/Makefile           | 4 +++-
28*4882a593Smuzhiyun 4 files changed, 20 insertions(+), 1 deletion(-)
29*4882a593Smuzhiyun
30*4882a593Smuzhiyundiff --git a/configure.ac b/configure.ac
31*4882a593Smuzhiyunindex e05d601..c428146 100644
32*4882a593Smuzhiyun--- a/configure.ac
33*4882a593Smuzhiyun+++ b/configure.ac
34*4882a593Smuzhiyun@@ -54,6 +54,15 @@ case $target_cpu in
35*4882a593Smuzhiyun 		;;
36*4882a593Smuzhiyun 	ia64|x86_64|alpha|m68k )
37*4882a593Smuzhiyun 		ARCH="$target_cpu"
38*4882a593Smuzhiyun+
39*4882a593Smuzhiyun+		dnl ---Test for x32 ABI in x86_64
40*4882a593Smuzhiyun+		if test "x$ARCH" = "xx86_64" ; then
41*4882a593Smuzhiyun+			AC_EGREP_CPP(x32_test,
42*4882a593Smuzhiyun+			[#if defined(__x86_64__) && defined (__ILP32__)
43*4882a593Smuzhiyun+				x32_test
44*4882a593Smuzhiyun+			#endif
45*4882a593Smuzhiyun+			], SUBARCH='x32', SUBARCH='64')
46*4882a593Smuzhiyun+		fi
47*4882a593Smuzhiyun 		;;
48*4882a593Smuzhiyun 	* )
49*4882a593Smuzhiyun 		AC_MSG_ERROR([unsupported architecture $target_cpu])
50*4882a593Smuzhiyundiff --git a/kexec/arch/x86_64/kexec-elf-rel-x86_64.c b/kexec/arch/x86_64/kexec-elf-rel-x86_64.c
51*4882a593Smuzhiyunindex 761a4ed..1c0e3f8 100644
52*4882a593Smuzhiyun--- a/kexec/arch/x86_64/kexec-elf-rel-x86_64.c
53*4882a593Smuzhiyun+++ b/kexec/arch/x86_64/kexec-elf-rel-x86_64.c
54*4882a593Smuzhiyun@@ -8,7 +8,11 @@ int machine_verify_elf_rel(struct mem_ehdr *ehdr)
55*4882a593Smuzhiyun 	if (ehdr->ei_data != ELFDATA2LSB) {
56*4882a593Smuzhiyun 		return 0;
57*4882a593Smuzhiyun 	}
58*4882a593Smuzhiyun+#ifdef __ILP32__
59*4882a593Smuzhiyun+	if (ehdr->ei_class != ELFCLASS32) {
60*4882a593Smuzhiyun+#else
61*4882a593Smuzhiyun 	if (ehdr->ei_class != ELFCLASS64) {
62*4882a593Smuzhiyun+#endif
63*4882a593Smuzhiyun 		return 0;
64*4882a593Smuzhiyun 	}
65*4882a593Smuzhiyun 	if (ehdr->e_machine != EM_X86_64) {
66*4882a593Smuzhiyundiff --git a/kexec/kexec-syscall.h b/kexec/kexec-syscall.h
67*4882a593Smuzhiyunindex 2a3794d..3e67078 100644
68*4882a593Smuzhiyun--- a/kexec/kexec-syscall.h
69*4882a593Smuzhiyun+++ b/kexec/kexec-syscall.h
70*4882a593Smuzhiyun@@ -31,8 +31,12 @@
71*4882a593Smuzhiyun #define __NR_kexec_load		268
72*4882a593Smuzhiyun #endif
73*4882a593Smuzhiyun #ifdef __x86_64__
74*4882a593Smuzhiyun+#ifdef __ILP32__
75*4882a593Smuzhiyun+#define __NR_kexec_load		528
76*4882a593Smuzhiyun+#else
77*4882a593Smuzhiyun #define __NR_kexec_load		246
78*4882a593Smuzhiyun #endif
79*4882a593Smuzhiyun+#endif
80*4882a593Smuzhiyun #ifdef __s390x__
81*4882a593Smuzhiyun #define __NR_kexec_load		277
82*4882a593Smuzhiyun #endif
83*4882a593Smuzhiyundiff --git a/purgatory/arch/x86_64/Makefile b/purgatory/arch/x86_64/Makefile
84*4882a593Smuzhiyunindex 7300937..4af11e4 100644
85*4882a593Smuzhiyun--- a/purgatory/arch/x86_64/Makefile
86*4882a593Smuzhiyun+++ b/purgatory/arch/x86_64/Makefile
87*4882a593Smuzhiyun@@ -23,4 +23,6 @@ x86_64_PURGATORY_SRCS += purgatory/arch/i386/console-x86.c
88*4882a593Smuzhiyun x86_64_PURGATORY_SRCS += purgatory/arch/i386/vga.c
89*4882a593Smuzhiyun x86_64_PURGATORY_SRCS += purgatory/arch/i386/pic.c
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun-x86_64_PURGATORY_EXTRA_CFLAGS = -mcmodel=large
92*4882a593Smuzhiyun+ifeq ($(SUBARCH),64)
93*4882a593Smuzhiyun+        x86_64_PURGATORY_EXTRA_CFLAGS = -mcmodel=large
94*4882a593Smuzhiyun+endif
95