diff options
author | Koen Kooi <koen.kooi@linaro.org> | 2014-12-11 14:07:15 +0100 |
---|---|---|
committer | Koen Kooi <koen.kooi@linaro.org> | 2014-12-11 14:07:52 +0100 |
commit | ac57693aa20a33e6ab1438e7fa0ed093e2427a1a (patch) | |
tree | 246e579c3f443e6e8951315115382550bf8d4463 /meta-aarch64 | |
parent | a628df7e1e8e6767c6168e32398b902af4d58cc6 (diff) |
linux-libc-headers 3.18: move to meta-linaro-integration
Otherwise the PREFERRED_VERSION in jenkins-init will fail.
Change-Id: I99fed8e321090d6a624d95740017c6013e3511f0
Signed-off-by: Koen Kooi <koen.kooi@linaro.org>
Diffstat (limited to 'meta-aarch64')
26 files changed, 0 insertions, 2630 deletions
diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0001-ARM64-Force-LP64-to-compile-the-kernel.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0001-ARM64-Force-LP64-to-compile-the-kernel.patch deleted file mode 100644 index 7e203b43..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0001-ARM64-Force-LP64-to-compile-the-kernel.patch +++ /dev/null @@ -1,38 +0,0 @@ -From a774e70e50f898c7380f6cfb368d55a99ed71956 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:18:55 -0700 -Subject: [PATCH 01/25] ARM64: Force LP64 to compile the kernel - -Sometimes the compiler is set to default to ILP32 ABI so we want to make sure the kernel can compile in that case. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/Makefile | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile -index 20901ff..f3ef4a3 100644 ---- a/arch/arm64/Makefile -+++ b/arch/arm64/Makefile -@@ -20,14 +20,18 @@ LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) - KBUILD_DEFCONFIG := defconfig - - KBUILD_CFLAGS += -mgeneral-regs-only -+KBUILD_CFLAGS += $(call cc-option,-mabi=lp64) -+KBUILD_AFLAGS += $(call cc-option,-mabi=lp64) - ifeq ($(CONFIG_CPU_BIG_ENDIAN), y) - KBUILD_CPPFLAGS += -mbig-endian - AS += -EB - LD += -EB -+LDFLAGS += -maarch64linuxb - else - KBUILD_CPPFLAGS += -mlittle-endian - AS += -EL - LD += -EL -+LDFLAGS += -maarch64linux - endif - - CHECKFLAGS += -D__aarch64__ --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0002-ARM64-Rename-COMPAT-to-AARCH32_EL0-in-Kconfig.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0002-ARM64-Rename-COMPAT-to-AARCH32_EL0-in-Kconfig.patch deleted file mode 100644 index 74f70ba7..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0002-ARM64-Rename-COMPAT-to-AARCH32_EL0-in-Kconfig.patch +++ /dev/null @@ -1,44 +0,0 @@ -From b82c6e533186cab8617838c403a2406961b1f73b Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:18:56 -0700 -Subject: [PATCH 02/25] ARM64: Rename COMPAT to AARCH32_EL0 in Kconfig - -We want to split CONFIG_COMPAT so we can use the COMPAT interface in some cases including -for compat binfmt. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/Kconfig | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig -index 9532f8d..f28af3f 100644 ---- a/arch/arm64/Kconfig -+++ b/arch/arm64/Kconfig -@@ -408,9 +408,13 @@ menu "Userspace binary formats" - source "fs/Kconfig.binfmt" - - config COMPAT -+ def_bool y -+ depends on AARCH32_EL0 -+ select COMPAT_BINFMT_ELF -+ -+config AARCH32_EL0 - bool "Kernel support for 32-bit EL0" - depends on !ARM64_64K_PAGES -- select COMPAT_BINFMT_ELF - select HAVE_UID16 - select OLD_SIGSUSPEND3 - select COMPAT_OLD_SIGACTION -@@ -424,7 +428,7 @@ config COMPAT - - config SYSVIPC_COMPAT - def_bool y -- depends on COMPAT && SYSVIPC -+ depends on AARCH32_EL0 && SYSVIPC - - endmenu - --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0003-ARM64-Change-some-CONFIG_COMPAT-over-to-use-CONFIG_A.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0003-ARM64-Change-some-CONFIG_COMPAT-over-to-use-CONFIG_A.patch deleted file mode 100644 index 521558f0..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0003-ARM64-Change-some-CONFIG_COMPAT-over-to-use-CONFIG_A.patch +++ /dev/null @@ -1,385 +0,0 @@ -From 1b07bd82e000daf0755b0671cd7763bde5d76473 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:18:57 -0700 -Subject: [PATCH 03/25] ARM64: Change some CONFIG_COMPAT over to use - CONFIG_AARCH32_EL0 instead - -This patch changes CONFIG_COMPAT checks inside the arm64 which are AARCH32 specific - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/asm/elf.h | 20 +++++++++++++++++--- - arch/arm64/include/asm/fpsimd.h | 2 +- - arch/arm64/include/asm/ptrace.h | 2 +- - arch/arm64/include/asm/signal32.h | 4 ++-- - arch/arm64/include/asm/stat.h | 4 ++-- - arch/arm64/include/asm/unistd.h | 2 +- - arch/arm64/kernel/Makefile | 2 +- - arch/arm64/kernel/asm-offsets.c | 2 +- - arch/arm64/kernel/entry.S | 6 +++--- - arch/arm64/kernel/head.S | 2 +- - arch/arm64/kernel/ptrace.c | 34 ++++++++++++++++++++++++++++------ - arch/arm64/kernel/signal.c | 15 +++++++++++++++ - arch/arm64/kernel/traps.c | 2 +- - arch/arm64/kernel/vdso.c | 5 +++-- - drivers/clocksource/arm_arch_timer.c | 2 +- - 15 files changed, 78 insertions(+), 26 deletions(-) - -diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h -index 1f65be3..afa0f43 100644 ---- a/arch/arm64/include/asm/elf.h -+++ b/arch/arm64/include/asm/elf.h -@@ -171,14 +171,16 @@ extern unsigned long arch_randomize_brk(struct mm_struct *mm); - - #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) - -+#ifdef CONFIG_AARCH32_EL0 -+ - /* AArch32 registers. */ --#define COMPAT_ELF_NGREG 18 -+#define COMPAT_A32_ELF_NGREG 18 - typedef unsigned int compat_elf_greg_t; --typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; -+typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_A32_ELF_NGREG]; - - /* AArch32 EABI. */ - #define EF_ARM_EABI_MASK 0xff000000 --#define compat_elf_check_arch(x) (((x)->e_machine == EM_ARM) && \ -+#define compat_a32_elf_check_arch(x) (((x)->e_machine == EM_ARM) && \ - ((x)->e_flags & EF_ARM_EABI_MASK)) - - #define compat_start_thread compat_start_thread -@@ -189,6 +191,18 @@ extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, - #define compat_arch_setup_additional_pages \ - aarch32_setup_vectors_page - -+#else -+ -+typedef elf_greg_t compat_elf_greg_t; -+typedef elf_gregset_t compat_elf_gregset_t; -+#define compat_a32_elf_check_arch(x) 0 -+#define COMPAT_SET_PERSONALITY(ex) -+#define COMPAT_ARCH_DLINFO -+ -+#endif -+ -+#define compat_elf_check_arch(x) compat_a32_elf_check_arch(x) -+ - #endif /* CONFIG_COMPAT */ - - #endif -diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h -index 50f559f..63b19f1 100644 ---- a/arch/arm64/include/asm/fpsimd.h -+++ b/arch/arm64/include/asm/fpsimd.h -@@ -52,7 +52,7 @@ struct fpsimd_partial_state { - }; - - --#if defined(__KERNEL__) && defined(CONFIG_COMPAT) -+#if defined(__KERNEL__) && defined(CONFIG_AARCH32_EL0) - /* Masks for extracting the FPSR and FPCR from the FPSCR */ - #define VFP_FPSCR_STAT_MASK 0xf800009f - #define VFP_FPSCR_CTRL_MASK 0x07f79f00 -diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h -index 41ed9e1..690a380 100644 ---- a/arch/arm64/include/asm/ptrace.h -+++ b/arch/arm64/include/asm/ptrace.h -@@ -113,7 +113,7 @@ struct pt_regs { - - #define arch_has_single_step() (1) - --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - #define compat_thumb_mode(regs) \ - (((regs)->pstate & COMPAT_PSR_T_BIT)) - #else -diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h -index eeaa975..522c345 100644 ---- a/arch/arm64/include/asm/signal32.h -+++ b/arch/arm64/include/asm/signal32.h -@@ -17,7 +17,7 @@ - #define __ASM_SIGNAL32_H - - #ifdef __KERNEL__ --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - #include <linux/compat.h> - - #define AARCH32_KERN_SIGRET_CODE_OFFSET 0x500 -@@ -47,6 +47,6 @@ static inline int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t - static inline void compat_setup_restart_syscall(struct pt_regs *regs) - { - } --#endif /* CONFIG_COMPAT */ -+#endif /* CONFIG_AARCH32_EL0 */ - #endif /* __KERNEL__ */ - #endif /* __ASM_SIGNAL32_H */ -diff --git a/arch/arm64/include/asm/stat.h b/arch/arm64/include/asm/stat.h -index 15e3559..e3b5865 100644 ---- a/arch/arm64/include/asm/stat.h -+++ b/arch/arm64/include/asm/stat.h -@@ -18,7 +18,7 @@ - - #include <uapi/asm/stat.h> - --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - - #include <asm/compat.h> - -@@ -57,5 +57,5 @@ struct stat64 { - compat_u64 st_ino; - }; - --#endif -+#endif /* CONFIG_AARCH32_EL0 */ - #endif -diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h -index 6d2bf41..70e5559 100644 ---- a/arch/arm64/include/asm/unistd.h -+++ b/arch/arm64/include/asm/unistd.h -@@ -13,7 +13,7 @@ - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - #define __ARCH_WANT_COMPAT_SYS_GETDENTS64 - #define __ARCH_WANT_COMPAT_STAT64 - #define __ARCH_WANT_SYS_GETHOSTNAME -diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile -index 5bd029b..f59d113 100644 ---- a/arch/arm64/kernel/Makefile -+++ b/arch/arm64/kernel/Makefile -@@ -17,7 +17,7 @@ arm64-obj-y := cputable.o debug-monitors.o entry.o irq.o fpsimd.o \ - hyp-stub.o psci.o cpu_ops.o insn.o return_address.o \ - cpuinfo.o - --arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ -+arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ - sys_compat.o - arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o - arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o -diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c -index 9a9fce0..d9c429c 100644 ---- a/arch/arm64/kernel/asm-offsets.c -+++ b/arch/arm64/kernel/asm-offsets.c -@@ -53,7 +53,7 @@ int main(void) - DEFINE(S_X7, offsetof(struct pt_regs, regs[7])); - DEFINE(S_LR, offsetof(struct pt_regs, regs[30])); - DEFINE(S_SP, offsetof(struct pt_regs, sp)); --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - DEFINE(S_COMPAT_SP, offsetof(struct pt_regs, compat_sp)); - #endif - DEFINE(S_PSTATE, offsetof(struct pt_regs, pstate)); -diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S -index 726b910..5a1430c 100644 ---- a/arch/arm64/kernel/entry.S -+++ b/arch/arm64/kernel/entry.S -@@ -196,7 +196,7 @@ ENTRY(vectors) - ventry el0_fiq_invalid // FIQ 64-bit EL0 - ventry el0_error_invalid // Error 64-bit EL0 - --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - ventry el0_sync_compat // Synchronous 32-bit EL0 - ventry el0_irq_compat // IRQ 32-bit EL0 - ventry el0_fiq_invalid_compat // FIQ 32-bit EL0 -@@ -236,7 +236,7 @@ el0_error_invalid: - inv_entry 0, BAD_ERROR - ENDPROC(el0_error_invalid) - --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - el0_fiq_invalid_compat: - inv_entry 0, BAD_FIQ, 32 - ENDPROC(el0_fiq_invalid_compat) -@@ -398,7 +398,7 @@ el0_sync: - b.ge el0_dbg - b el0_inv - --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - .align 6 - el0_sync_compat: - kernel_entry 0, 32 -diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S -index 0a6e4f9..1934bc8 100644 ---- a/arch/arm64/kernel/head.S -+++ b/arch/arm64/kernel/head.S -@@ -323,7 +323,7 @@ CPU_LE( movk x0, #0x30d0, lsl #16 ) // Clear EE and E0E on LE systems - mov x0, #0x33ff - msr cptr_el2, x0 // Disable copro. traps to EL2 - --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - msr hstr_el2, xzr // Disable CP15 traps to EL2 - #endif - -diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c -index 8a4ae8e..04f32d7 100644 ---- a/arch/arm64/kernel/ptrace.c -+++ b/arch/arm64/kernel/ptrace.c -@@ -36,6 +36,7 @@ - #include <linux/regset.h> - #include <linux/tracehook.h> - #include <linux/elf.h> -+#include <linux/errno.h> - - #include <asm/compat.h> - #include <asm/debug-monitors.h> -@@ -75,7 +76,7 @@ static void ptrace_hbptriggered(struct perf_event *bp, - .si_addr = (void __user *)(bkpt->trigger), - }; - --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - int i; - - if (!is_compat_task()) -@@ -617,6 +618,7 @@ static const struct user_regset_view user_aarch64_view = { - - #ifdef CONFIG_COMPAT - #include <linux/compat.h> -+#ifdef CONFIG_AARCH32_EL0 - - enum compat_regset { - REGSET_COMPAT_GPR, -@@ -793,7 +795,7 @@ static int compat_vfp_set(struct task_struct *target, - static const struct user_regset aarch32_regsets[] = { - [REGSET_COMPAT_GPR] = { - .core_note_type = NT_PRSTATUS, -- .n = COMPAT_ELF_NGREG, -+ .n = COMPAT_A32_ELF_NGREG, - .size = sizeof(compat_elf_greg_t), - .align = sizeof(compat_elf_greg_t), - .get = compat_gpr_get, -@@ -991,8 +993,8 @@ static int compat_ptrace_sethbpregs(struct task_struct *tsk, compat_long_t num, - } - #endif /* CONFIG_HAVE_HW_BREAKPOINT */ - --long compat_arch_ptrace(struct task_struct *child, compat_long_t request, -- compat_ulong_t caddr, compat_ulong_t cdata) -+long compat_a32_arch_ptrace(struct task_struct *child, compat_long_t request, -+ compat_ulong_t caddr, compat_ulong_t cdata) - { - unsigned long addr = caddr; - unsigned long data = cdata; -@@ -1068,11 +1070,31 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, - - return ret; - } --#endif /* CONFIG_COMPAT */ -+#else /* !CONFIG_AARCH32_EL0 */ -+long compat_a32_arch_ptrace(struct task_struct *child, compat_long_t request, -+ compat_ulong_t caddr, compat_ulong_t cdata) -+{ -+ return -EINVAL; -+} -+#endif /* !CONFIG_AARCH32_EL0 */ -+ -+/* -+ * In ILP32, compat_arch_ptrace is used via the compat syscall, we don't need -+ * to do anything special for ILP32 though; only for AARCH32. -+ */ -+long compat_arch_ptrace(struct task_struct *child, compat_long_t request, -+ compat_ulong_t caddr, compat_ulong_t cdata) -+{ -+ if (is_compat_task()) -+ return compat_a32_arch_ptrace(child, request, caddr, cdata); -+ return compat_ptrace_request(child, request, caddr, cdata); -+} -+#endif -+ - - const struct user_regset_view *task_user_regset_view(struct task_struct *task) - { --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - if (is_compat_thread(task_thread_info(task))) - return &user_aarch32_view; - #endif -diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c -index 6fa7921..8527d99 100644 ---- a/arch/arm64/kernel/signal.c -+++ b/arch/arm64/kernel/signal.c -@@ -421,3 +421,18 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, - fpsimd_restore_current_state(); - - } -+ -+/* -+ * Some functions are needed for compat ptrace but we don't define -+ * them if we don't have AARCH32 support compiled in -+ */ -+#if defined CONFIG_COMPAT && !defined CONFIG_AARCH32_EL0 -+int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) -+{ -+ return -EFAULT; -+} -+int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) -+{ -+ return -EFAULT; -+} -+#endif -diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c -index de1b085..4fd16f3 100644 ---- a/arch/arm64/kernel/traps.c -+++ b/arch/arm64/kernel/traps.c -@@ -287,7 +287,7 @@ long compat_arm_syscall(struct pt_regs *regs); - - asmlinkage long do_ni_syscall(struct pt_regs *regs) - { --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - long ret; - if (is_compat_task()) { - ret = compat_arm_syscall(regs); -diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c -index 32aeea0..a777ac3 100644 ---- a/arch/arm64/kernel/vdso.c -+++ b/arch/arm64/kernel/vdso.c -@@ -35,6 +35,7 @@ - #include <asm/signal32.h> - #include <asm/vdso.h> - #include <asm/vdso_datapage.h> -+#include <asm/compat.h> - - extern char vdso_start, vdso_end; - static unsigned long vdso_pages; -@@ -49,7 +50,7 @@ static union { - } vdso_data_store __page_aligned_data; - struct vdso_data *vdso_data = &vdso_data_store.data; - --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - /* - * Create and map the vectors page for AArch32 tasks. - */ -@@ -107,7 +108,7 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) - - return PTR_ERR_OR_ZERO(ret); - } --#endif /* CONFIG_COMPAT */ -+#endif /* CONFIG_AARCH32_EL0 */ - - static struct vm_special_mapping vdso_spec[2]; - -diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c -index 43005d4..9d4e24c 100644 ---- a/drivers/clocksource/arm_arch_timer.c -+++ b/drivers/clocksource/arm_arch_timer.c -@@ -309,7 +309,7 @@ static void arch_timer_evtstrm_enable(int divider) - | ARCH_TIMER_VIRT_EVT_EN; - arch_timer_set_cntkctl(cntkctl); - elf_hwcap |= HWCAP_EVTSTRM; --#ifdef CONFIG_COMPAT -+#ifdef CONFIG_AARCH32_EL0 - compat_elf_hwcap |= COMPAT_HWCAP_EVTSTRM; - #endif - } --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0004-ARM64-ILP32-Set-kernel_long-to-long-long-so-we-can-r.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0004-ARM64-ILP32-Set-kernel_long-to-long-long-so-we-can-r.patch deleted file mode 100644 index f9b67d88..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0004-ARM64-ILP32-Set-kernel_long-to-long-long-so-we-can-r.patch +++ /dev/null @@ -1,34 +0,0 @@ -From d95606261541cbd57ecf8a16d5b36541a12edaac Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:18:58 -0700 -Subject: [PATCH 04/25] ARM64:ILP32: Set kernel_long to long long so we can - reuse most of the same syscalls as LP64 - -Since we want time_t and some other userland types to be the same between ILP32 and LP64, we define __kernel_long_t to be long long. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/uapi/asm/posix_types.h | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/arch/arm64/include/uapi/asm/posix_types.h b/arch/arm64/include/uapi/asm/posix_types.h -index 7985ff6..0961945 100644 ---- a/arch/arm64/include/uapi/asm/posix_types.h -+++ b/arch/arm64/include/uapi/asm/posix_types.h -@@ -5,6 +5,12 @@ typedef unsigned short __kernel_old_uid_t; - typedef unsigned short __kernel_old_gid_t; - #define __kernel_old_uid_t __kernel_old_uid_t - -+#ifdef __ILP32__ -+typedef long long __kernel_long_t; -+typedef unsigned long long __kernel_ulong_t; -+#define __kernel_long_t __kernel_long_t -+#endif -+ - #include <asm-generic/posix_types.h> - --#endif /* __ASM_POSIX_TYPES_H */ -+#endif /* __ASM_POSIX_TYPES_H */ --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0005-ARM64-UAPI-Set-the-correct-__BITS_PER_LONG-for-ILP32.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0005-ARM64-UAPI-Set-the-correct-__BITS_PER_LONG-for-ILP32.patch deleted file mode 100644 index 2fb9d760..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0005-ARM64-UAPI-Set-the-correct-__BITS_PER_LONG-for-ILP32.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 77cac67f6e71bfe42253aaf674d5a49e17a5812e Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:18:59 -0700 -Subject: [PATCH 05/25] ARM64:UAPI: Set the correct __BITS_PER_LONG for ILP32 - -We need to say to the userland API that bits per long is 32bits for ILP32. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/uapi/asm/bitsperlong.h | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -diff --git a/arch/arm64/include/uapi/asm/bitsperlong.h b/arch/arm64/include/uapi/asm/bitsperlong.h -index fce9c29..bb716d0 100644 ---- a/arch/arm64/include/uapi/asm/bitsperlong.h -+++ b/arch/arm64/include/uapi/asm/bitsperlong.h -@@ -16,7 +16,14 @@ - #ifndef __ASM_BITSPERLONG_H - #define __ASM_BITSPERLONG_H - --#define __BITS_PER_LONG 64 -+/* Assuming __LP64__ will be defined for native ELF64's and not for ILP32. */ -+#ifdef __LP64__ -+# define __BITS_PER_LONG 64 -+#elif defined(__ILP32__) -+# define __BITS_PER_LONG 32 -+#else -+# error "Unknown ABI; not ILP32 or LP64" -+#endif - - #include <asm-generic/bitsperlong.h> - --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0006-Allow-for-some-signal-structures-to-be-the-same-betw.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0006-Allow-for-some-signal-structures-to-be-the-same-betw.patch deleted file mode 100644 index 2795d6e5..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0006-Allow-for-some-signal-structures-to-be-the-same-betw.patch +++ /dev/null @@ -1,133 +0,0 @@ -From 22cc53f5d94dcc75af3e900e223dd870146490ae Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:00 -0700 -Subject: [PATCH 06/25] Allow for some signal structures to be the same between - a 32bit ABI and the 64bit ABI - -In ARM64, we want to allow the signal related structures to be same between the -32bit (ILP32) and the 64bit ABIs (LP64). We still want to use the generic -include files so we need some new defines that are used in UAPI; they -default to the same as it is before. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - include/uapi/asm-generic/siginfo.h | 17 +++++++++++++---- - include/uapi/asm-generic/signal.h | 27 +++++++++++++++++++++++---- - 2 files changed, 36 insertions(+), 8 deletions(-) - -diff --git a/include/uapi/asm-generic/siginfo.h b/include/uapi/asm-generic/siginfo.h -index ba5be7f..cb44f86 100644 ---- a/include/uapi/asm-generic/siginfo.h -+++ b/include/uapi/asm-generic/siginfo.h -@@ -4,9 +4,17 @@ - #include <linux/compiler.h> - #include <linux/types.h> - -+#ifndef __SIGINFO_VOIDPTR -+#define __SIGINFO_VOIDPTR(field) void __user *field -+#endif -+ -+#ifndef __SIGINFO_BAND -+#define __SIGINFO_BAND(field) __ARCH_SI_BAND_T field -+#endif -+ - typedef union sigval { - int sival_int; -- void __user *sival_ptr; -+ __SIGINFO_VOIDPTR(sival_ptr); - } sigval_t; - - /* -@@ -86,7 +94,7 @@ typedef struct siginfo { - - /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ - struct { -- void __user *_addr; /* faulting insn/memory ref. */ -+ __SIGINFO_VOIDPTR(_addr); /* faulting insn/memory ref. */ - #ifdef __ARCH_SI_TRAPNO - int _trapno; /* TRAP # which caused the signal */ - #endif -@@ -95,13 +103,13 @@ typedef struct siginfo { - - /* SIGPOLL */ - struct { -- __ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */ -+ __SIGINFO_BAND(_band); /* POLL_IN, POLL_OUT, POLL_MSG */ - int _fd; - } _sigpoll; - - /* SIGSYS */ - struct { -- void __user *_call_addr; /* calling user insn */ -+ __SIGINFO_VOIDPTR(_call_addr); /* calling user insn */ - int _syscall; /* triggering system call number */ - unsigned int _arch; /* AUDIT_ARCH_* of syscall */ - } _sigsys; -@@ -283,6 +291,7 @@ typedef struct sigevent { - int _pad[SIGEV_PAD_SIZE]; - int _tid; - -+ /* Note these two are handled only in userspace */ - struct { - void (*_function)(sigval_t); - void *_attribute; /* really pthread_attr_t */ -diff --git a/include/uapi/asm-generic/signal.h b/include/uapi/asm-generic/signal.h -index 9df61f1..c4ce238 100644 ---- a/include/uapi/asm-generic/signal.h -+++ b/include/uapi/asm-generic/signal.h -@@ -4,7 +4,9 @@ - #include <linux/types.h> - - #define _NSIG 64 -+#ifndef _NSIG_BPW - #define _NSIG_BPW __BITS_PER_LONG -+#endif - #define _NSIG_WORDS (_NSIG / _NSIG_BPW) - - #define SIGHUP 1 -@@ -83,9 +85,13 @@ - #define MINSIGSTKSZ 2048 - #define SIGSTKSZ 8192 - -+#ifndef __SIGSET_INNER_TYPE -+#define __SIGSET_INNER_TYPE unsigned long -+#endif -+ - #ifndef __ASSEMBLY__ - typedef struct { -- unsigned long sig[_NSIG_WORDS]; -+ __SIGSET_INNER_TYPE sig[_NSIG_WORDS]; - } sigset_t; - - /* not actually used, but required for linux/syscalls.h */ -@@ -98,11 +104,24 @@ typedef unsigned long old_sigset_t; - #endif - - #ifndef __KERNEL__ -+ -+#ifndef __SIGACTION_HANDLER -+#define __SIGACTION_HANDLER(field) __sighandler_t field -+#endif -+ -+#ifndef __SIGACTION_FLAGS -+#define __SIGACTION_FLAGS(field) unsigned long field -+#endif -+ -+#ifndef __SIGACTION_RESTORER -+#define __SIGACTION_RESTORER(field) __sigrestore_t field -+#endif -+ - struct sigaction { -- __sighandler_t sa_handler; -- unsigned long sa_flags; -+ __SIGACTION_HANDLER(sa_handler); -+ __SIGACTION_FLAGS(sa_flags); - #ifdef SA_RESTORER -- __sigrestore_t sa_restorer; -+ __SIGACTION_RESTORER(sa_restorer); - #endif - sigset_t sa_mask; /* mask last for extensibility */ - }; --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0007-ARM64-ILP32-Use-the-same-size-and-layout-of-the-sign.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0007-ARM64-ILP32-Use-the-same-size-and-layout-of-the-sign.patch deleted file mode 100644 index 02e5b2d2..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0007-ARM64-ILP32-Use-the-same-size-and-layout-of-the-sign.patch +++ /dev/null @@ -1,115 +0,0 @@ -From d3813d97d5face12f9762a394e845fff7774c0dc Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:01 -0700 -Subject: [PATCH 07/25] ARM64:ILP32: Use the same size and layout of the signal - structures for ILP32 as for LP64 - -Defines the macros which allow the signal structures to be the same between ILP32 and LP64. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/uapi/asm/siginfo.h | 33 +++++++++++++++++++++++++++++++++ - arch/arm64/include/uapi/asm/signal.h | 34 ++++++++++++++++++++++++++++++++++ - 2 files changed, 67 insertions(+) - -diff --git a/arch/arm64/include/uapi/asm/siginfo.h b/arch/arm64/include/uapi/asm/siginfo.h -index 5a74a08..c80c612 100644 ---- a/arch/arm64/include/uapi/asm/siginfo.h -+++ b/arch/arm64/include/uapi/asm/siginfo.h -@@ -1,5 +1,6 @@ - /* - * Copyright (C) 2012 ARM Ltd. -+ * Copyright (C) 2014 Cavium Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as -@@ -18,6 +19,38 @@ - - #define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) - -+#ifdef __ILP32__ -+ -+/* -+ * For ILP32, the siginfo structures should share the same layout and -+ * alignement requirements as LP64 ABI. -+ * To do this, use an extra pad field and add aligned attribute -+ * to the structure. -+ */ -+ -+# ifdef __AARCH64EB__ -+# define __SIGINFO_INNER(type, field) \ -+ int __pad#field; \ -+ type field -+# else -+# define __SIGINFO_INNER(type, field) \ -+ type field; \ -+ int __pad#field -+# endif -+ -+# undef __SIGINFO_VOIDPTR -+# define __SIGINFO_VOIDPTR(field) \ -+ __SIGINFO_INNER(void __user*, field) -+# undef __SIGINFO_BAND -+ -+# define __SIGINFO_BAND(field) \ -+ __SIGINFO_INNER(long, field) -+ -+/* Make the alignment of siginfo always 8 byte aligned. */ -+#define __ARCH_SI_ATTRIBUTES __attribute__((aligned(8))) -+ -+#endif -+ - #include <asm-generic/siginfo.h> - - #endif -diff --git a/arch/arm64/include/uapi/asm/signal.h b/arch/arm64/include/uapi/asm/signal.h -index 8d1e723..d33a5f7 100644 ---- a/arch/arm64/include/uapi/asm/signal.h -+++ b/arch/arm64/include/uapi/asm/signal.h -@@ -16,9 +16,43 @@ - #ifndef __ASM_SIGNAL_H - #define __ASM_SIGNAL_H - -+#include <asm/posix-types.h> -+ - /* Required for AArch32 compatibility. */ - #define SA_RESTORER 0x04000000 - -+/* -+ * Since sigset is a bitmask, we need the same size fields for ILP32 -+ * and LP64. With big-endian, 32bit bitmask does not match up to -+ * 64bit bitmask (unlike with little-endian). -+ */ -+#ifdef __ILP32__ -+ -+#define __SIGSET_INNER_TYPE __kernel_ulong_t -+#define _NSIG_BPW 64 -+ -+# ifdef __AARCH64EB__ -+# define __SIGNAL_INNER(type, field) \ -+ int __pad_##field; \ -+ type field; -+# else -+# define __SIGNAL_INNER(type, field) \ -+ type field; \ -+ int __pad_##field; -+# endif -+ -+# define __SIGACTION_HANDLER(field) \ -+ __SIGNAL_INNER(__sighandler_t, field) -+ -+ -+#define __SIGACTION_FLAGS(field) \ -+ __kernel_ulong_t field -+ -+#define __SIGACTION_RESTORER(field) \ -+ __SIGNAL_INNER(__sigrestore_t, field) -+ -+#endif -+ - #include <asm-generic/signal.h> - - #endif --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0008-Allow-a-32bit-ABI-to-use-the-naming-of-the-64bit-ABI.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0008-Allow-a-32bit-ABI-to-use-the-naming-of-the-64bit-ABI.patch deleted file mode 100644 index 6252ee5d..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0008-Allow-a-32bit-ABI-to-use-the-naming-of-the-64bit-ABI.patch +++ /dev/null @@ -1,36 +0,0 @@ -From f7185bf731efd1015821f4153ac17d653dbd23c9 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:02 -0700 -Subject: [PATCH 08/25] Allow a 32bit ABI to use the naming of the 64bit ABI - syscalls to avoid confusion of not splitting the registers - -In the ARM64 ILP32 case, we want to say the syscalls that normally would pass -64bit as two arguments are now passing as one so want to use the 64bit -naming scheme. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - include/uapi/asm-generic/unistd.h | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h -index 22749c1..5996166 100644 ---- a/include/uapi/asm-generic/unistd.h -+++ b/include/uapi/asm-generic/unistd.h -@@ -883,8 +883,12 @@ __SYSCALL(__NR_fork, sys_ni_syscall) - * they take different names. - * Here we map the numbers so that both versions - * use the same syscall table layout. -+ * For 32bit abis where 64bit can be passed via one -+ * register, use the same naming as the 64bit ones -+ * as they will only have a 64 bit off_t. - */ --#if __BITS_PER_LONG == 64 && !defined(__SYSCALL_COMPAT) -+#if (__BITS_PER_LONG == 64 && !defined(__SYSCALL_COMPAT)) || \ -+ defined(__ARCH_WANT_64BIT_SYSCALLS) - #define __NR_fcntl __NR3264_fcntl - #define __NR_statfs __NR3264_statfs - #define __NR_fstatfs __NR3264_fstatfs --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0009-ARM64-ILP32-Use-the-same-syscall-names-as-LP64.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0009-ARM64-ILP32-Use-the-same-syscall-names-as-LP64.patch deleted file mode 100644 index 180e841e..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0009-ARM64-ILP32-Use-the-same-syscall-names-as-LP64.patch +++ /dev/null @@ -1,30 +0,0 @@ -From ed722513a020c655797eb855c2d6ccf525d1c10c Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:03 -0700 -Subject: [PATCH 09/25] ARM64:ILP32: Use the same syscall names as LP64 - -Define __SYSCALL_NONCOMPAT so we use the 64bit naming scheme for ILP32. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/uapi/asm/unistd.h | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/arch/arm64/include/uapi/asm/unistd.h b/arch/arm64/include/uapi/asm/unistd.h -index 1caadc2..13cbf8d 100644 ---- a/arch/arm64/include/uapi/asm/unistd.h -+++ b/arch/arm64/include/uapi/asm/unistd.h -@@ -13,4 +13,10 @@ - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -+ -+/* For ILP32, we want to use the non compat names. */ -+#if defined(__ILP32__) -+#define __ARCH_WANT_64BIT_SYSCALLS -+#endif -+ - #include <asm-generic/unistd.h> --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0010-ARM64-Introduce-is_a32_task-is_a32_thread-and-TIF_AA.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0010-ARM64-Introduce-is_a32_task-is_a32_thread-and-TIF_AA.patch deleted file mode 100644 index a8abde52..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0010-ARM64-Introduce-is_a32_task-is_a32_thread-and-TIF_AA.patch +++ /dev/null @@ -1,246 +0,0 @@ -From bfe2beb3a5384b06868a0ff6cff23a94825b81b7 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:04 -0700 -Subject: [PATCH 10/25] ARM64: Introduce is_a32_task/is_a32_thread and - TIF_AARCH32 and use them in the correct locations - -This patch introduces is_a32_compat_task and is_a32_thread so it is easier to say this is a a32 specific thread or a generic compat thread/task. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/asm/compat.h | 21 +++++++++++++++++++++ - arch/arm64/include/asm/elf.h | 12 ++++++++++-- - arch/arm64/include/asm/thread_info.h | 1 + - arch/arm64/kernel/hw_breakpoint.c | 7 ++++--- - arch/arm64/kernel/process.c | 6 +++--- - arch/arm64/kernel/ptrace.c | 8 ++++---- - arch/arm64/kernel/signal.c | 5 +++-- - arch/arm64/kernel/traps.c | 2 +- - 8 files changed, 47 insertions(+), 15 deletions(-) - -diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h -index 56de5aa..91ccca6 100644 ---- a/arch/arm64/include/asm/compat.h -+++ b/arch/arm64/include/asm/compat.h -@@ -311,5 +311,26 @@ static inline int is_compat_thread(struct thread_info *thread) - } - - #endif /* CONFIG_COMPAT */ -+ -+#ifdef CONFIG_AARCH32_EL0 -+static inline int is_a32_compat_task(void) -+{ -+ return test_thread_flag(TIF_AARCH32); -+} -+static inline int is_a32_compat_thread(struct thread_info *thread) -+{ -+ return test_ti_thread_flag(thread, TIF_AARCH32); -+} -+#else -+static inline int is_a32_compat_task(void) -+{ -+ return 0; -+} -+static inline int is_a32_compat_thread(struct thread_info *thread) -+{ -+ return 0; -+} -+#endif -+ - #endif /* __KERNEL__ */ - #endif /* __ASM_COMPAT_H */ -diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h -index afa0f43..69291a0 100644 ---- a/arch/arm64/include/asm/elf.h -+++ b/arch/arm64/include/asm/elf.h -@@ -135,7 +135,11 @@ extern unsigned long randomize_et_dyn(unsigned long base); - */ - #define ELF_PLAT_INIT(_r, load_addr) (_r)->regs[0] = 0 - --#define SET_PERSONALITY(ex) clear_thread_flag(TIF_32BIT); -+#define SET_PERSONALITY(ex) \ -+do { \ -+ clear_thread_flag(TIF_AARCH32); \ -+ clear_thread_flag(TIF_32BIT); \ -+} while (0) - - #define ARCH_DLINFO \ - do { \ -@@ -184,7 +188,11 @@ typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_A32_ELF_NGREG]; - ((x)->e_flags & EF_ARM_EABI_MASK)) - - #define compat_start_thread compat_start_thread --#define COMPAT_SET_PERSONALITY(ex) set_thread_flag(TIF_32BIT); -+#define COMPAT_SET_PERSONALITY(ex) \ -+do { \ -+ set_thread_flag(TIF_AARCH32); \ -+ set_thread_flag(TIF_32BIT); \ -+} while (0) - #define COMPAT_ARCH_DLINFO - extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, - int uses_interp); -diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h -index 459bf8e..a185105 100644 ---- a/arch/arm64/include/asm/thread_info.h -+++ b/arch/arm64/include/asm/thread_info.h -@@ -119,6 +119,7 @@ static inline struct thread_info *current_thread_info(void) - #define TIF_SINGLESTEP 21 - #define TIF_32BIT 22 /* 32bit process */ - #define TIF_SWITCH_MM 23 /* deferred switch_mm */ -+#define TIF_AARCH32 24 /* AARCH32 process */ - - #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) - #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) -diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c -index df1cf15..8e46a67 100644 ---- a/arch/arm64/kernel/hw_breakpoint.c -+++ b/arch/arm64/kernel/hw_breakpoint.c -@@ -28,6 +28,7 @@ - #include <linux/ptrace.h> - #include <linux/smp.h> - -+#include <asm/compat.h> - #include <asm/current.h> - #include <asm/debug-monitors.h> - #include <asm/hw_breakpoint.h> -@@ -433,7 +434,7 @@ static int arch_build_bp_info(struct perf_event *bp) - * Watchpoints can be of length 1, 2, 4 or 8 bytes. - */ - if (info->ctrl.type == ARM_BREAKPOINT_EXECUTE) { -- if (is_compat_task()) { -+ if (is_a32_compat_task()) { - if (info->ctrl.len != ARM_BREAKPOINT_LEN_2 && - info->ctrl.len != ARM_BREAKPOINT_LEN_4) - return -EINVAL; -@@ -490,7 +491,7 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) - * AArch32 tasks expect some simple alignment fixups, so emulate - * that here. - */ -- if (is_compat_task()) { -+ if (is_a32_compat_task()) { - if (info->ctrl.len == ARM_BREAKPOINT_LEN_8) - alignment_mask = 0x7; - else -@@ -677,7 +678,7 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr, - - info = counter_arch_bp(wp); - /* AArch32 watchpoints are either 4 or 8 bytes aligned. */ -- if (is_compat_task()) { -+ if (is_a32_compat_task()) { - if (info->ctrl.len == ARM_BREAKPOINT_LEN_8) - alignment_mask = 0x7; - else -diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c -index fde9923..4ae5562 100644 ---- a/arch/arm64/kernel/process.c -+++ b/arch/arm64/kernel/process.c -@@ -253,7 +253,7 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start, - if (likely(!(p->flags & PF_KTHREAD))) { - *childregs = *current_pt_regs(); - childregs->regs[0] = 0; -- if (is_compat_thread(task_thread_info(p))) { -+ if (is_a32_compat_thread(task_thread_info(p))) { - if (stack_start) - childregs->compat_sp = stack_start; - } else { -@@ -294,12 +294,12 @@ static void tls_thread_switch(struct task_struct *next) - { - unsigned long tpidr, tpidrro; - -- if (!is_compat_task()) { -+ if (!is_a32_compat_task()) { - asm("mrs %0, tpidr_el0" : "=r" (tpidr)); - current->thread.tp_value = tpidr; - } - -- if (is_compat_thread(task_thread_info(next))) { -+ if (is_a32_compat_thread(task_thread_info(next))) { - tpidr = 0; - tpidrro = next->thread.tp_value; - } else { -diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c -index 04f32d7..6d6f62d 100644 ---- a/arch/arm64/kernel/ptrace.c -+++ b/arch/arm64/kernel/ptrace.c -@@ -79,7 +79,7 @@ static void ptrace_hbptriggered(struct perf_event *bp, - #ifdef CONFIG_AARCH32_EL0 - int i; - -- if (!is_compat_task()) -+ if (!is_a32_compat_task()) - goto send_sig; - - for (i = 0; i < ARM_MAX_BRP; ++i) { -@@ -1085,7 +1085,7 @@ long compat_a32_arch_ptrace(struct task_struct *child, compat_long_t request, - long compat_arch_ptrace(struct task_struct *child, compat_long_t request, - compat_ulong_t caddr, compat_ulong_t cdata) - { -- if (is_compat_task()) -+ if (is_a32_compat_task()) - return compat_a32_arch_ptrace(child, request, caddr, cdata); - return compat_ptrace_request(child, request, caddr, cdata); - } -@@ -1095,7 +1095,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, - const struct user_regset_view *task_user_regset_view(struct task_struct *task) - { - #ifdef CONFIG_AARCH32_EL0 -- if (is_compat_thread(task_thread_info(task))) -+ if (is_a32_compat_thread(task_thread_info(task))) - return &user_aarch32_view; - #endif - return &user_aarch64_view; -@@ -1122,7 +1122,7 @@ static void tracehook_report_syscall(struct pt_regs *regs, - * A scratch register (ip(r12) on AArch32, x7 on AArch64) is - * used to denote syscall entry/exit: - */ -- regno = (is_compat_task() ? 12 : 7); -+ regno = (is_a32_compat_task() ? 12 : 7); - saved_reg = regs->regs[regno]; - regs->regs[regno] = dir; - -diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c -index 8527d99..f47c064 100644 ---- a/arch/arm64/kernel/signal.c -+++ b/arch/arm64/kernel/signal.c -@@ -26,6 +26,7 @@ - #include <linux/tracehook.h> - #include <linux/ratelimit.h> - -+#include <asm/compat.h> - #include <asm/debug-monitors.h> - #include <asm/elf.h> - #include <asm/cacheflush.h> -@@ -276,7 +277,7 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, - - static void setup_restart_syscall(struct pt_regs *regs) - { -- if (is_compat_task()) -+ if (is_a32_compat_task()) - compat_setup_restart_syscall(regs); - else - regs->regs[8] = __NR_restart_syscall; -@@ -302,7 +303,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) - /* - * Set up the stack frame - */ -- if (is_compat_task()) { -+ if (is_a32_compat_task()) { - if (ksig->ka.sa.sa_flags & SA_SIGINFO) - ret = compat_setup_rt_frame(usig, ksig, oldset, regs); - else -diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c -index 4fd16f3..dd21920 100644 ---- a/arch/arm64/kernel/traps.c -+++ b/arch/arm64/kernel/traps.c -@@ -289,7 +289,7 @@ asmlinkage long do_ni_syscall(struct pt_regs *regs) - { - #ifdef CONFIG_AARCH32_EL0 - long ret; -- if (is_compat_task()) { -+ if (is_a32_compat_task()) { - ret = compat_arm_syscall(regs); - if (ret != -ENOSYS) - return ret; --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0011-ARM64-Add-is_ilp32_compat_task-and-is_ilp32_compat_t.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0011-ARM64-Add-is_ilp32_compat_task-and-is_ilp32_compat_t.patch deleted file mode 100644 index 93314a68..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0011-ARM64-Add-is_ilp32_compat_task-and-is_ilp32_compat_t.patch +++ /dev/null @@ -1,49 +0,0 @@ -From a7324076e52f254064f913d48b0ba75edfabbff7 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:05 -0700 -Subject: [PATCH 11/25] ARM64: Add is_ilp32_compat_task and - is_ilp32_compat_thread - -This patch adds the functions which returns if the current task is an -ILP32 task and one returns if the thread is an ILP32 thread. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/asm/compat.h | 22 ++++++++++++++++++++++ - 1 file changed, 22 insertions(+) - -diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h -index 91ccca6..fe390b7 100644 ---- a/arch/arm64/include/asm/compat.h -+++ b/arch/arm64/include/asm/compat.h -@@ -332,5 +332,27 @@ static inline int is_a32_compat_thread(struct thread_info *thread) - } - #endif - -+#ifdef CONFIG_ARM64_ILP32 -+static inline int is_ilp32_compat_task(void) -+{ -+ return test_thread_flag(TIF_32BIT) && !is_a32_compat_task(); -+} -+static inline int is_ilp32_compat_thread(struct thread_info *thread) -+{ -+ return test_ti_thread_flag(thread, TIF_32BIT) && -+ !is_a32_compat_thread(thread); -+} -+#else -+static inline int is_ilp32_compat_task(void) -+{ -+ return 0; -+} -+static inline int is_ilp32_compat_thread(struct thread_info *thread) -+{ -+ return 0; -+} -+#endif -+ -+ - #endif /* __KERNEL__ */ - #endif /* __ASM_COMPAT_H */ --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0012-ARM64-ILP32-COMPAT_USE_64BIT_TIME-is-true-for-ILP32-.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0012-ARM64-ILP32-COMPAT_USE_64BIT_TIME-is-true-for-ILP32-.patch deleted file mode 100644 index c99f2f3e..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0012-ARM64-ILP32-COMPAT_USE_64BIT_TIME-is-true-for-ILP32-.patch +++ /dev/null @@ -1,33 +0,0 @@ -From b0eeee72d3cb1ae38c676c3bb13e19928b0c5033 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:06 -0700 -Subject: [PATCH 12/25] ARM64:ILP32: COMPAT_USE_64BIT_TIME is true for ILP32 - tasks - -Since __kernel_long_t (time_t) is long long, we need to tell the rest of -kernel that we use 64bit time_t for compat when the task is not an -AARCH32 task. The reason why we check AARCH32 rather than ILP32 here is -because if we don't have AARCH32 compiled in (which is going to be the common case due to AARCH32 requiring 4k pages). - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/asm/compat.h | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h -index fe390b7..074bcc3 100644 ---- a/arch/arm64/include/asm/compat.h -+++ b/arch/arm64/include/asm/compat.h -@@ -76,6 +76,9 @@ struct compat_timeval { - s32 tv_usec; - }; - -+/* ILP32 uses 64bit time_t and not the above compat structures */ -+#define COMPAT_USE_64BIT_TIME (!is_a32_compat_task()) -+ - struct compat_stat { - #ifdef __AARCH64EB__ - short st_dev; --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0013-ARM64-ILP32-Use-the-non-compat-HWCAP-for-ILP32.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0013-ARM64-ILP32-Use-the-non-compat-HWCAP-for-ILP32.patch deleted file mode 100644 index da56b4d2..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0013-ARM64-ILP32-Use-the-non-compat-HWCAP-for-ILP32.patch +++ /dev/null @@ -1,48 +0,0 @@ -From d2848980dd76673d626b81acd23989bbcceb4fd4 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:07 -0700 -Subject: [PATCH 13/25] ARM64:ILP32: Use the non compat HWCAP for ILP32 - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/asm/compat.h | 10 ++++++++++ - arch/arm64/include/asm/hwcap.h | 2 -- - 2 files changed, 10 insertions(+), 2 deletions(-) - -diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h -index 074bcc3..0f4ecfe 100644 ---- a/arch/arm64/include/asm/compat.h -+++ b/arch/arm64/include/asm/compat.h -@@ -296,6 +296,16 @@ struct compat_shmid64_ds { - compat_ulong_t __unused5; - }; - -+#define COMPAT_ELF_HWCAP \ -+ (is_a32_compat_task() \ -+ ? compat_elf_hwcap \ -+ : elf_hwcap) -+ -+#define COMPAT_ELF_HWCAP2 \ -+ (is_a32_compat_task() \ -+ ? compat_elf_hwcap2 \ -+ : 0) -+ - static inline int is_compat_task(void) - { - return test_thread_flag(TIF_32BIT); -diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h -index 024c461..31e7e02 100644 ---- a/arch/arm64/include/asm/hwcap.h -+++ b/arch/arm64/include/asm/hwcap.h -@@ -46,8 +46,6 @@ - #define ELF_HWCAP (elf_hwcap) - - #ifdef CONFIG_COMPAT --#define COMPAT_ELF_HWCAP (compat_elf_hwcap) --#define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) - extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; - #endif - --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0014-ARM64-ILP32-use-the-standard-start_thread-for-ILP32-.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0014-ARM64-ILP32-use-the-standard-start_thread-for-ILP32-.patch deleted file mode 100644 index 477f93c1..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0014-ARM64-ILP32-use-the-standard-start_thread-for-ILP32-.patch +++ /dev/null @@ -1,39 +0,0 @@ -From f2211ab8a3053b89db4ec8d1e9dbe8a2eaebde3b Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:08 -0700 -Subject: [PATCH 14/25] ARM64:ILP32 use the standard start_thread for ILP32 so - the processor state is not AARCH32 - -If we have both ILP32 and AARCH32 compiled in, we need use the non compat start -thread for ILP32. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/asm/processor.h | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h -index 286b1be..7bd9f32 100644 ---- a/arch/arm64/include/asm/processor.h -+++ b/arch/arm64/include/asm/processor.h -@@ -104,6 +104,17 @@ static inline void start_thread(struct pt_regs *regs, unsigned long pc, - static inline void compat_start_thread(struct pt_regs *regs, unsigned long pc, - unsigned long sp) - { -+#ifdef CONFIG_ARM64_ILP32 -+ /* -+ * ILP32 thread are started the same way as LP64 threads. -+ * Note we cannot use is_ilp32_compat_task here as that -+ * would introduce a header depency issue. -+ */ -+ if (!test_thread_flag(TIF_AARCH32)) { -+ start_thread(regs, pc, sp); -+ return; -+ } -+#endif - start_thread_common(regs, pc); - regs->pstate = COMPAT_PSR_MODE_USR; - if (pc & 1) --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0015-compat_binfmt_elf-coredump-Allow-some-core-dump-macr.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0015-compat_binfmt_elf-coredump-Allow-some-core-dump-macr.patch deleted file mode 100644 index 102694b2..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0015-compat_binfmt_elf-coredump-Allow-some-core-dump-macr.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 22718fe0b2005d61399c73be4d65c162d4a4cd6e Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:09 -0700 -Subject: [PATCH 15/25] compat_binfmt_elf: coredump: Allow some core dump - macros be overridden for compat. - -On some targets (x86 [32bit and x32] and arm64 [aarch32 and ilp32]), there are -two compat elf abis. This adds a few more "#define * COMPAT_*" for compat -targets to define if needed. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - fs/compat_binfmt_elf.c | 17 +++++++++++++++++ - 1 file changed, 17 insertions(+) - -diff --git a/fs/compat_binfmt_elf.c b/fs/compat_binfmt_elf.c -index 4d24d17..8307927 100644 ---- a/fs/compat_binfmt_elf.c -+++ b/fs/compat_binfmt_elf.c -@@ -130,6 +130,23 @@ static void cputime_to_compat_timeval(const cputime_t cputime, - #define arch_setup_additional_pages compat_arch_setup_additional_pages - #endif - -+ -+#ifdef COMPAT_PR_REG_SIZE -+#define PR_REG_SIZE COMPAT_PR_REG_SIZE -+#endif -+ -+#ifdef COMPAT_PRSTATUS_SIZE -+#define PRSTATUS_SIZE COMPAT_PRSTATUS_SIZE -+#endif -+ -+#ifdef COMPAT_PR_REG_PTR -+#define PR_REG_PTR COMPAT_PR_REG_PTR -+#endif -+ -+#ifdef COMPAT_SET_PR_FPVALID -+#define SET_PR_FPVALID COMPAT_SET_PR_FPVALID -+#endif -+ - /* - * Rename a few of the symbols that binfmt_elf.c will define. - * These are all local so the names don't really matter, but it --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0016-ARM64-ILP32-Support-core-dump-for-ILP32.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0016-ARM64-ILP32-Support-core-dump-for-ILP32.patch deleted file mode 100644 index 83b8129e..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0016-ARM64-ILP32-Support-core-dump-for-ILP32.patch +++ /dev/null @@ -1,110 +0,0 @@ -From 4aaf156c46c2a751aeeff02b2387a12cc5d34d97 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:10 -0700 -Subject: [PATCH 16/25] ARM64:ILP32: Support core dump for ILP32 - -This patch supports core dumping on ILP32. -We need a few extra macros (COMPAT_PR_REG_SIZE and COMPAT_PRSTATUS_SIZE) due -to size differences of the register sets. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/asm/elf.h | 23 +++++++++++++++++++++-- - arch/arm64/kernel/ptrace.c | 12 ++++++------ - 2 files changed, 27 insertions(+), 8 deletions(-) - -diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h -index 69291a0..fdd3fdb 100644 ---- a/arch/arm64/include/asm/elf.h -+++ b/arch/arm64/include/asm/elf.h -@@ -179,8 +179,8 @@ extern unsigned long arch_randomize_brk(struct mm_struct *mm); - - /* AArch32 registers. */ - #define COMPAT_A32_ELF_NGREG 18 --typedef unsigned int compat_elf_greg_t; --typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_A32_ELF_NGREG]; -+typedef unsigned int compat_a32_elf_greg_t; -+typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_A32_ELF_NGREG]; - - /* AArch32 EABI. */ - #define EF_ARM_EABI_MASK 0xff000000 -@@ -209,6 +209,25 @@ typedef elf_gregset_t compat_elf_gregset_t; - - #endif - -+/* -+ * If ILP32 is turned on, we want to define the compat_elf_greg_t to the non compat -+ * one and define PR_REG_SIZE/PRSTATUS_SIZE/SET_PR_FPVALID so we pick up the correct -+ * ones for AARCH32. -+ */ -+#ifdef CONFIG_ARM64_ILP32 -+typedef elf_greg_t compat_elf_greg_t; -+typedef elf_gregset_t compat_elf_gregset_t; -+#define COMPAT_PR_REG_SIZE(S) (is_a32_compat_task() ? 72 : 272) -+#define COMPAT_PRSTATUS_SIZE(S) (is_a32_compat_task() ? 124 : 352) -+#define COMPAT_SET_PR_FPVALID(S, V) \ -+do { \ -+ *(int *) (((void *) &((S)->pr_reg)) + PR_REG_SIZE((S)->pr_reg)) = (V); \ -+} while (0) -+#else -+typedef compat_a32_elf_greg_t compat_elf_greg_t; -+typedef compat_a32_elf_gregset_t compat_elf_gregset_t; -+#endif -+ - #define compat_elf_check_arch(x) compat_a32_elf_check_arch(x) - - #endif /* CONFIG_COMPAT */ -diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c -index 6d6f62d..6a9d395 100644 ---- a/arch/arm64/kernel/ptrace.c -+++ b/arch/arm64/kernel/ptrace.c -@@ -796,8 +796,8 @@ static const struct user_regset aarch32_regsets[] = { - [REGSET_COMPAT_GPR] = { - .core_note_type = NT_PRSTATUS, - .n = COMPAT_A32_ELF_NGREG, -- .size = sizeof(compat_elf_greg_t), -- .align = sizeof(compat_elf_greg_t), -+ .size = sizeof(compat_a32_elf_greg_t), -+ .align = sizeof(compat_a32_elf_greg_t), - .get = compat_gpr_get, - .set = compat_gpr_set - }, -@@ -830,7 +830,7 @@ static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off, - tmp = tsk->mm->start_data; - else if (off == COMPAT_PT_TEXT_END_ADDR) - tmp = tsk->mm->end_code; -- else if (off < sizeof(compat_elf_gregset_t)) -+ else if (off < sizeof(compat_a32_elf_gregset_t)) - return copy_regset_to_user(tsk, &user_aarch32_view, - REGSET_COMPAT_GPR, off, - sizeof(compat_ulong_t), ret); -@@ -851,7 +851,7 @@ static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off, - if (off & 3 || off >= COMPAT_USER_SZ) - return -EIO; - -- if (off >= sizeof(compat_elf_gregset_t)) -+ if (off >= sizeof(compat_a32_elf_gregset_t)) - return 0; - - set_fs(KERNEL_DS); -@@ -1014,7 +1014,7 @@ long compat_a32_arch_ptrace(struct task_struct *child, compat_long_t request, - ret = copy_regset_to_user(child, - &user_aarch32_view, - REGSET_COMPAT_GPR, -- 0, sizeof(compat_elf_gregset_t), -+ 0, sizeof(compat_a32_elf_gregset_t), - datap); - break; - -@@ -1022,7 +1022,7 @@ long compat_a32_arch_ptrace(struct task_struct *child, compat_long_t request, - ret = copy_regset_from_user(child, - &user_aarch32_view, - REGSET_COMPAT_GPR, -- 0, sizeof(compat_elf_gregset_t), -+ 0, sizeof(compat_a32_elf_gregset_t), - datap); - break; - --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0017-ARM64-Add-loading-of-ILP32-binaries.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0017-ARM64-Add-loading-of-ILP32-binaries.patch deleted file mode 100644 index d212539f..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0017-ARM64-Add-loading-of-ILP32-binaries.patch +++ /dev/null @@ -1,108 +0,0 @@ -From 942b8485587dedca256087f5f5dff54eb9793169 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:11 -0700 -Subject: [PATCH 17/25] ARM64: Add loading of ILP32 binaries - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/asm/elf.h | 59 +++++++++++++++++++++++++++++++++++++------- - 1 file changed, 50 insertions(+), 9 deletions(-) - -diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h -index fdd3fdb..e9f3891 100644 ---- a/arch/arm64/include/asm/elf.h -+++ b/arch/arm64/include/asm/elf.h -@@ -16,6 +16,7 @@ - #ifndef __ASM_ELF_H - #define __ASM_ELF_H - -+#include <asm/errno.h> - #include <asm/hwcap.h> - - /* -@@ -188,25 +189,26 @@ typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_A32_ELF_NGREG]; - ((x)->e_flags & EF_ARM_EABI_MASK)) - - #define compat_start_thread compat_start_thread --#define COMPAT_SET_PERSONALITY(ex) \ -+#define COMPAT_A32_SET_PERSONALITY(ex) \ - do { \ - set_thread_flag(TIF_AARCH32); \ - set_thread_flag(TIF_32BIT); \ - } while (0) --#define COMPAT_ARCH_DLINFO -+#define COMPAT_A32_ARCH_DLINFO do {} while (0) - extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, - int uses_interp); --#define compat_arch_setup_additional_pages \ -- aarch32_setup_vectors_page - - #else -- - typedef elf_greg_t compat_elf_greg_t; - typedef elf_gregset_t compat_elf_gregset_t; - #define compat_a32_elf_check_arch(x) 0 --#define COMPAT_SET_PERSONALITY(ex) --#define COMPAT_ARCH_DLINFO -- -+#define COMPAT_A32_SET_PERSONALITY(ex) do {} while (0) -+#define COMPAT_A32_ARCH_DLINFO do {} while (0) -+static inline int aarch32_setup_vectors_page(struct linux_binprm *bprm, -+ int uses_interp) -+{ -+ return -EINVAL; -+} - #endif - - /* -@@ -228,7 +230,46 @@ typedef compat_a32_elf_greg_t compat_elf_greg_t; - typedef compat_a32_elf_gregset_t compat_elf_gregset_t; - #endif - --#define compat_elf_check_arch(x) compat_a32_elf_check_arch(x) -+#ifdef CONFIG_ARM64_ILP32 -+#define compat_ilp32_elf_check_arch(x) ((x)->e_machine == EM_AARCH64) -+#define COMPAT_ILP32_SET_PERSONALITY(ex) \ -+do { \ -+ clear_thread_flag(TIF_AARCH32); \ -+ set_thread_flag(TIF_32BIT); \ -+} while (0) -+#define COMPAT_ILP32_ARCH_DLINFO \ -+do { \ -+ NEW_AUX_ENT(AT_SYSINFO_EHDR, \ -+ (elf_addr_t)(long)current->mm->context.vdso); \ -+} while (0) -+#else -+#define compat_ilp32_elf_check_arch(x) 0 -+#define COMPAT_ILP32_SET_PERSONALITY(ex) do {} while (0) -+#define COMPAT_ILP32_ARCH_DLINFO do {} while (0) -+#endif -+ -+#define compat_elf_check_arch(x) (compat_a32_elf_check_arch(x) || compat_ilp32_elf_check_arch(x)) -+#define COMPAT_SET_PERSONALITY(ex) \ -+do { \ -+ if (compat_a32_elf_check_arch(&ex)) \ -+ COMPAT_A32_SET_PERSONALITY(ex); \ -+ else \ -+ COMPAT_ILP32_SET_PERSONALITY(ex); \ -+} while (0) -+ -+/* ILP32 uses the "LP64-like" vdso pages */ -+#define compat_arch_setup_additional_pages \ -+ (is_a32_compat_task() \ -+ ? &aarch32_setup_vectors_page \ -+ : &(arch_setup_additional_pages)) -+ -+#define COMPAT_ARCH_DLINFO \ -+do { \ -+ if (is_a32_compat_task()) \ -+ COMPAT_A32_ARCH_DLINFO; \ -+ else \ -+ COMPAT_ILP32_ARCH_DLINFO; \ -+} while (0) - - #endif /* CONFIG_COMPAT */ - --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0018-ARM64-Add-vdso-for-ILP32-and-use-it-for-the-signal-r.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0018-ARM64-Add-vdso-for-ILP32-and-use-it-for-the-signal-r.patch deleted file mode 100644 index 1096f5c3..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0018-ARM64-Add-vdso-for-ILP32-and-use-it-for-the-signal-r.patch +++ /dev/null @@ -1,452 +0,0 @@ -From 31c359a223b271aa7ae1f06caebee50ae1e8c39e Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:12 -0700 -Subject: [PATCH 18/25] ARM64: Add vdso for ILP32 and use it for the signal - return - -This patch adds the VDSO for ILP32. We need to use a different -VDSO than LP64 since ILP32 uses ELF32 while LP64 uses ELF64. - -After this patch, signal handling works mostly. In that signals -go through their action and then returned correctly. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/asm/vdso.h | 4 ++ - arch/arm64/kernel/Makefile | 5 ++ - arch/arm64/kernel/signal.c | 4 ++ - arch/arm64/kernel/vdso-ilp32/.gitignore | 2 + - arch/arm64/kernel/vdso-ilp32/Makefile | 72 ++++++++++++++++++++ - arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S | 33 +++++++++ - arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S | 98 +++++++++++++++++++++++++++ - arch/arm64/kernel/vdso.c | 69 +++++++++++++++---- - 8 files changed, 274 insertions(+), 13 deletions(-) - create mode 100644 arch/arm64/kernel/vdso-ilp32/.gitignore - create mode 100644 arch/arm64/kernel/vdso-ilp32/Makefile - create mode 100644 arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S - create mode 100644 arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S - -diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h -index 839ce00..84050c6 100644 ---- a/arch/arm64/include/asm/vdso.h -+++ b/arch/arm64/include/asm/vdso.h -@@ -29,6 +29,10 @@ - - #include <generated/vdso-offsets.h> - -+#ifdef CONFIG_ARM64_ILP32 -+#include <generated/vdso-ilp32-offsets.h> -+#endif -+ - #define VDSO_SYMBOL(base, name) \ - ({ \ - (void *)(vdso_offset_##name - VDSO_LBASE + (unsigned long)(base)); \ -diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile -index f59d113..ceb9bf7 100644 ---- a/arch/arm64/kernel/Makefile -+++ b/arch/arm64/kernel/Makefile -@@ -33,6 +33,7 @@ arm64-obj-$(CONFIG_EFI) += efi.o efi-stub.o efi-entry.o - arm64-obj-$(CONFIG_PCI) += pci.o - - obj-y += $(arm64-obj-y) vdso/ -+obj-$(CONFIG_ARM64_ILP32) += vdso-ilp32/ - obj-m += $(arm64-obj-m) - head-y := head.o - extra-y := $(head-y) vmlinux.lds -@@ -40,3 +41,7 @@ extra-y := $(head-y) vmlinux.lds - # vDSO - this must be built first to generate the symbol offsets - $(call objectify,$(arm64-obj-y)): $(obj)/vdso/vdso-offsets.h - $(obj)/vdso/vdso-offsets.h: $(obj)/vdso -+ -+# vDSO - this must be built first to generate the symbol offsets -+$(call objectify,$(arm64-obj-y)): $(obj)/vdso-ilp32/vdso-ilp32-offsets.h -+$(obj)/vdso-ilp32/vdso-ilp32-offsets.h: $(obj)/vdso-ilp32 -diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c -index f47c064..5311147 100644 ---- a/arch/arm64/kernel/signal.c -+++ b/arch/arm64/kernel/signal.c -@@ -242,6 +242,10 @@ static void setup_return(struct pt_regs *regs, struct k_sigaction *ka, - - if (ka->sa.sa_flags & SA_RESTORER) - sigtramp = ka->sa.sa_restorer; -+#ifdef CONFIG_ARM64_ILP32 -+ else if (is_ilp32_compat_task()) -+ sigtramp = VDSO_SYMBOL(current->mm->context.vdso, sigtramp_ilp32); -+#endif - else - sigtramp = VDSO_SYMBOL(current->mm->context.vdso, sigtramp); - -diff --git a/arch/arm64/kernel/vdso-ilp32/.gitignore b/arch/arm64/kernel/vdso-ilp32/.gitignore -new file mode 100644 -index 0000000..61806c3 ---- /dev/null -+++ b/arch/arm64/kernel/vdso-ilp32/.gitignore -@@ -0,0 +1,2 @@ -+vdso-ilp32.lds -+vdso-ilp32-offsets.h -diff --git a/arch/arm64/kernel/vdso-ilp32/Makefile b/arch/arm64/kernel/vdso-ilp32/Makefile -new file mode 100644 -index 0000000..c8f5472 ---- /dev/null -+++ b/arch/arm64/kernel/vdso-ilp32/Makefile -@@ -0,0 +1,72 @@ -+# -+# Building a vDSO image for AArch64. -+# -+# Author: Will Deacon <will.deacon@arm.com> -+# Heavily based on the vDSO Makefiles for other archs. -+# -+ -+obj-ilp32-vdso := gettimeofday-ilp32.o note-ilp32.o sigreturn-ilp32.o -+ -+# Build rules -+targets := $(obj-ilp32-vdso) vdso-ilp32.so vdso-ilp32.so.dbg -+obj-ilp32-vdso := $(addprefix $(obj)/, $(obj-ilp32-vdso)) -+ -+ccflags-y := -shared -fno-common -fno-builtin -+ccflags-y += -nostdlib -Wl,-soname=linux-ilp32-vdso.so.1 \ -+ $(call cc-ldoption, -Wl$(comma)--hash-style=sysv) -+ -+obj-y += vdso-ilp32.o -+extra-y += vdso-ilp32.lds vdso-ilp32-offsets.h -+CPPFLAGS_vdso-ilp32.lds += -P -C -U$(ARCH) -mabi=ilp32 -+ -+# Force dependency (incbin is bad) -+$(obj)/vdso-ilp32.o : $(obj)/vdso-ilp32.so -+ -+# Link rule for the .so file, .lds has to be first -+$(obj)/vdso-ilp32.so.dbg: $(src)/vdso-ilp32.lds $(obj-ilp32-vdso) -+ $(call if_changed,vdso-ilp32ld) -+ -+# Strip rule for the .so file -+$(obj)/%.so: OBJCOPYFLAGS := -S -+$(obj)/%.so: $(obj)/%.so.dbg FORCE -+ $(call if_changed,objcopy) -+ -+# Generate VDSO offsets using helper script -+gen-vdsosym := $(srctree)/$(src)/../vdso/gen_vdso_offsets.sh -+quiet_cmd_vdsosym = VDSOSYM $@ -+define cmd_vdsosym -+ $(NM) $< | $(gen-vdsosym) | LC_ALL=C sort > $@ && \ -+ cp $@ include/generated/ -+endef -+ -+$(obj)/vdso-ilp32-offsets.h: $(obj)/vdso-ilp32.so.dbg FORCE -+ $(call if_changed,vdsosym) -+ -+# Assembly rules for the .S files -+#$(obj-ilp32-vdso): %.o: $(src)/../vdso/$(subst -ilp32,,%.S) -+# $(call if_changed_dep,vdso-ilp32as) -+ -+$(obj)/gettimeofday-ilp32.o: $(src)/../vdso/gettimeofday.S -+ $(call if_changed_dep,vdso-ilp32as) -+ -+$(obj)/note-ilp32.o: $(src)/../vdso/note.S -+ $(call if_changed_dep,vdso-ilp32as) -+ -+$(obj)/sigreturn-ilp32.o: $(src)/../vdso/sigreturn.S -+ $(call if_changed_dep,vdso-ilp32as) -+ -+# Actual build commands -+quiet_cmd_vdso-ilp32ld = VDSOILP32L $@ -+ cmd_vdso-ilp32ld = $(CC) $(c_flags) -mabi=ilp32 -Wl,-n -Wl,-T $^ -o $@ -+quiet_cmd_vdso-ilp32as = VDSOILP32A $@ -+ cmd_vdso-ilp32as = $(CC) $(a_flags) -mabi=ilp32 -c -o $@ $< -+ -+# Install commands for the unstripped file -+quiet_cmd_vdso_install = INSTALL $@ -+ cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@ -+ -+vdso-ilp32.so: $(obj)/vdso-ilp32.so.dbg -+ @mkdir -p $(MODLIB)/vdso -+ $(call cmd,vdso_install) -+ -+vdso_install: vdso-ilp32.so -diff --git a/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S -new file mode 100644 -index 0000000..46ac072 ---- /dev/null -+++ b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S -@@ -0,0 +1,33 @@ -+/* -+ * Copyright (C) 2012 ARM Limited -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see <http://www.gnu.org/licenses/>. -+ * -+ * Author: Will Deacon <will.deacon@arm.com> -+ */ -+ -+#include <linux/init.h> -+#include <linux/linkage.h> -+#include <linux/const.h> -+#include <asm/page.h> -+ -+ __PAGE_ALIGNED_DATA -+ -+ .globl vdso_ilp32_start, vdso_ilp32_end -+ .balign PAGE_SIZE -+vdso_ilp32_start: -+ .incbin "arch/arm64/kernel/vdso-ilp32/vdso-ilp32.so" -+ .balign PAGE_SIZE -+vdso_ilp32_end: -+ -+ .previous -diff --git a/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S -new file mode 100644 -index 0000000..ac8029b ---- /dev/null -+++ b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S -@@ -0,0 +1,98 @@ -+/* -+ * GNU linker script for the VDSO library. -+ * -+ * Copyright (C) 2012 ARM Limited -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see <http://www.gnu.org/licenses/>. -+ * -+ * Author: Will Deacon <will.deacon@arm.com> -+ * Heavily based on the vDSO linker scripts for other archs. -+ */ -+ -+#include <linux/const.h> -+#include <asm/page.h> -+#include <asm/vdso.h> -+ -+/*OUTPUT_FORMAT("elf32-littleaarch64", "elf32-bigaarch64", "elf32-littleaarch64") -+OUTPUT_ARCH(aarch64) -+*/ -+SECTIONS -+{ -+ PROVIDE(_vdso_data = . - PAGE_SIZE); -+ . = VDSO_LBASE + SIZEOF_HEADERS; -+ -+ .hash : { *(.hash) } :text -+ .gnu.hash : { *(.gnu.hash) } -+ .dynsym : { *(.dynsym) } -+ .dynstr : { *(.dynstr) } -+ .gnu.version : { *(.gnu.version) } -+ .gnu.version_d : { *(.gnu.version_d) } -+ .gnu.version_r : { *(.gnu.version_r) } -+ -+ .note : { *(.note.*) } :text :note -+ -+ . = ALIGN(16); -+ -+ .text : { *(.text*) } :text =0xd503201f -+ PROVIDE (__etext = .); -+ PROVIDE (_etext = .); -+ PROVIDE (etext = .); -+ -+ .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr -+ .eh_frame : { KEEP (*(.eh_frame)) } :text -+ -+ .dynamic : { *(.dynamic) } :text :dynamic -+ -+ .rodata : { *(.rodata*) } :text -+ -+ _end = .; -+ PROVIDE(end = .); -+ -+ /DISCARD/ : { -+ *(.note.GNU-stack) -+ *(.data .data.* .gnu.linkonce.d.* .sdata*) -+ *(.bss .sbss .dynbss .dynsbss) -+ } -+} -+ -+/* -+ * We must supply the ELF program headers explicitly to get just one -+ * PT_LOAD segment, and set the flags explicitly to make segments read-only. -+ */ -+PHDRS -+{ -+ text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */ -+ dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ -+ note PT_NOTE FLAGS(4); /* PF_R */ -+ eh_frame_hdr PT_GNU_EH_FRAME; -+} -+ -+/* -+ * This controls what symbols we export from the DSO. -+ */ -+VERSION -+{ -+ LINUX_2.6.39 { -+ global: -+ __kernel_rt_sigreturn; -+ __kernel_gettimeofday; -+ __kernel_clock_gettime; -+ __kernel_clock_getres; -+ local: *; -+ }; -+} -+ -+/* -+ * Make the sigreturn code visible to the kernel. -+ */ -+VDSO_sigtramp_ilp32 = __kernel_rt_sigreturn; -diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c -index a777ac3..21b3726 100644 ---- a/arch/arm64/kernel/vdso.c -+++ b/arch/arm64/kernel/vdso.c -@@ -41,6 +41,12 @@ extern char vdso_start, vdso_end; - static unsigned long vdso_pages; - static struct page **vdso_pagelist; - -+#ifdef CONFIG_ARM64_ILP32 -+extern char vdso_ilp32_start, vdso_ilp32_end; -+static unsigned long vdso_ilp32_pages; -+static struct page **vdso_ilp32_pagelist; -+#endif -+ - /* - * The vDSO data page. - */ -@@ -110,24 +116,31 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) - } - #endif /* CONFIG_AARCH32_EL0 */ - --static struct vm_special_mapping vdso_spec[2]; -+static struct vm_special_mapping vdso_spec[2][2]; - --static int __init vdso_init(void) -+static inline int __init vdso_init_common(char *vdso_start, char *vdso_end, -+ unsigned long *vdso_pagesp, -+ struct page ***vdso_pagelistp, -+ bool ilp32) - { - int i; -+ unsigned long vdso_pages; -+ struct page **vdso_pagelist; - -- if (memcmp(&vdso_start, "\177ELF", 4)) { -+ if (memcmp(vdso_start, "\177ELF", 4)) { - pr_err("vDSO is not a valid ELF object!\n"); - return -EINVAL; - } - -- vdso_pages = (&vdso_end - &vdso_start) >> PAGE_SHIFT; -+ vdso_pages = (vdso_end - vdso_start) >> PAGE_SHIFT; -+ *vdso_pagesp = vdso_pages; - pr_info("vdso: %ld pages (%ld code @ %p, %ld data @ %p)\n", -- vdso_pages + 1, vdso_pages, &vdso_start, 1L, vdso_data); -+ vdso_pages + 1, vdso_pages, vdso_start, 1L, vdso_data); - - /* Allocate the vDSO pagelist, plus a page for the data. */ - vdso_pagelist = kcalloc(vdso_pages + 1, sizeof(struct page *), - GFP_KERNEL); -+ *vdso_pagelistp = vdso_pagelist; - if (vdso_pagelist == NULL) - return -ENOMEM; - -@@ -136,33 +149,63 @@ static int __init vdso_init(void) - - /* Grab the vDSO code pages. */ - for (i = 0; i < vdso_pages; i++) -- vdso_pagelist[i + 1] = virt_to_page(&vdso_start + i * PAGE_SIZE); -+ vdso_pagelist[i + 1] = virt_to_page(vdso_start + i * PAGE_SIZE); - - /* Populate the special mapping structures */ -- vdso_spec[0] = (struct vm_special_mapping) { -+ vdso_spec[ilp32][0] = (struct vm_special_mapping) { - .name = "[vvar]", - .pages = vdso_pagelist, - }; - -- vdso_spec[1] = (struct vm_special_mapping) { -+ vdso_spec[ilp32][1] = (struct vm_special_mapping) { - .name = "[vdso]", - .pages = &vdso_pagelist[1], - }; - - return 0; - } -+ -+static int __init vdso_init(void) -+{ -+ return vdso_init_common(&vdso_start, &vdso_end, -+ &vdso_pages, &vdso_pagelist, 0); -+} - arch_initcall(vdso_init); - -+#ifdef CONFIG_ARM64_ILP32 -+static int __init vdso_ilp32_init(void) -+{ -+ return vdso_init_common(&vdso_ilp32_start, &vdso_ilp32_end, -+ &vdso_ilp32_pages, &vdso_ilp32_pagelist, 1); -+} -+arch_initcall(vdso_ilp32_init); -+#endif -+ - int arch_setup_additional_pages(struct linux_binprm *bprm, - int uses_interp) - { - struct mm_struct *mm = current->mm; - unsigned long vdso_base, vdso_text_len, vdso_mapping_len; - void *ret; -- -- vdso_text_len = vdso_pages << PAGE_SHIFT; -+ struct page **pagelist; -+ unsigned long pages; -+ bool ilp32; -+ -+#ifdef CONFIG_ARM64_ILP32 -+ ilp32 = is_ilp32_compat_task(); -+ if (is_ilp32_compat_task()) { -+ pages = vdso_ilp32_pages; -+ pagelist = vdso_ilp32_pagelist; -+ } else -+#endif -+ { -+ ilp32 = false; -+ pages = vdso_pages; -+ pagelist = vdso_pagelist; -+ } -+ vdso_text_len = pages << PAGE_SHIFT; - /* Be sure to map the data page */ -- vdso_mapping_len = vdso_text_len + PAGE_SIZE; -+ vdso_mapping_len = (pages + 1) << PAGE_SHIFT; - - down_write(&mm->mmap_sem); - vdso_base = get_unmapped_area(NULL, 0, vdso_mapping_len, 0, 0); -@@ -172,7 +215,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, - } - ret = _install_special_mapping(mm, vdso_base, PAGE_SIZE, - VM_READ|VM_MAYREAD, -- &vdso_spec[0]); -+ &vdso_spec[ilp32][0]); - if (IS_ERR(ret)) - goto up_fail; - -@@ -181,7 +224,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, - ret = _install_special_mapping(mm, vdso_base, vdso_text_len, - VM_READ|VM_EXEC| - VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, -- &vdso_spec[1]); -+ &vdso_spec[ilp32][1]); - if (IS_ERR(ret)) - goto up_fail; - --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0019-ptrace-Allow-compat-to-use-the-native-siginfo.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0019-ptrace-Allow-compat-to-use-the-native-siginfo.patch deleted file mode 100644 index 5811e4eb..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0019-ptrace-Allow-compat-to-use-the-native-siginfo.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 13737c6712659357fde2e64fa6ed6830ea700dc0 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:13 -0700 -Subject: [PATCH 19/25] ptrace: Allow compat to use the native siginfo - -With ARM64 ILP32 ABI, we want to use the non-compat -siginfo as we want to simplify signal handling for this new ABI. -This patch just adds a new define COMPAT_USE_NATIVE_SIGINFO and -if it is true then read/write in the compat case as it was the -non-compat case. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - include/linux/compat.h | 4 ++++ - kernel/ptrace.c | 25 ++++++++++++++++++------- - 2 files changed, 22 insertions(+), 7 deletions(-) - -diff --git a/include/linux/compat.h b/include/linux/compat.h -index e649426..2d8c535 100644 ---- a/include/linux/compat.h -+++ b/include/linux/compat.h -@@ -24,6 +24,10 @@ - #define COMPAT_USE_64BIT_TIME 0 - #endif - -+#ifndef COMPAT_USE_NATIVE_SIGINFO -+#define COMPAT_USE_NATIVE_SIGINFO 0 -+#endif -+ - #ifndef __SC_DELOUSE - #define __SC_DELOUSE(t,v) ((t)(unsigned long)(v)) - #endif -diff --git a/kernel/ptrace.c b/kernel/ptrace.c -index 54e7522..40ae023 100644 ---- a/kernel/ptrace.c -+++ b/kernel/ptrace.c -@@ -657,7 +657,7 @@ static int ptrace_peek_siginfo(struct task_struct *child, - break; - - #ifdef CONFIG_COMPAT -- if (unlikely(is_compat_task())) { -+ if (unlikely(is_compat_task() && !COMPAT_USE_NATIVE_SIGINFO)) { - compat_siginfo_t __user *uinfo = compat_ptr(data); - - if (copy_siginfo_to_user32(uinfo, &info) || -@@ -1126,16 +1126,27 @@ int compat_ptrace_request(struct task_struct *child, compat_long_t request, - - case PTRACE_GETSIGINFO: - ret = ptrace_getsiginfo(child, &siginfo); -- if (!ret) -- ret = copy_siginfo_to_user32( -- (struct compat_siginfo __user *) datap, -- &siginfo); -+ if (!ret) { -+ if (COMPAT_USE_NATIVE_SIGINFO) -+ ret = copy_siginfo_to_user( -+ (struct siginfo __user *) datap, -+ &siginfo); -+ else -+ ret = copy_siginfo_to_user32( -+ (struct compat_siginfo __user *) datap, -+ &siginfo); -+ } - break; - - case PTRACE_SETSIGINFO: - memset(&siginfo, 0, sizeof siginfo); -- if (copy_siginfo_from_user32( -- &siginfo, (struct compat_siginfo __user *) datap)) -+ if (COMPAT_USE_NATIVE_SIGINFO) -+ ret = copy_from_user(&siginfo, datap, sizeof(siginfo)); -+ else -+ ret = copy_siginfo_from_user32( -+ &siginfo, -+ (struct compat_siginfo __user *) datap); -+ if (ret) - ret = -EFAULT; - else - ret = ptrace_setsiginfo(child, &siginfo); --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0020-ARM64-ILP32-The-native-siginfo-is-used-instead-of-th.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0020-ARM64-ILP32-The-native-siginfo-is-used-instead-of-th.patch deleted file mode 100644 index ca10f086..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0020-ARM64-ILP32-The-native-siginfo-is-used-instead-of-th.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 3a33f13ccf73bf00fcbd5afc90ec22793c1c3d29 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:14 -0700 -Subject: [PATCH 20/25] ARM64:ILP32: The native siginfo is used instead of the - compat siginfo - -Set COMPAT_USE_NATIVE_SIGINFO to be true for non AARCH32 tasks. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/asm/compat.h | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h -index 0f4ecfe..a8c4caf 100644 ---- a/arch/arm64/include/asm/compat.h -+++ b/arch/arm64/include/asm/compat.h -@@ -211,6 +211,9 @@ typedef struct compat_siginfo { - } _sifields; - } compat_siginfo_t; - -+/* ILP32 uses the native siginfo and not the compat struct */ -+#define COMPAT_USE_NATIVE_SIGINFO (!is_a32_compat_task()) -+ - #define COMPAT_OFF_T_MAX 0x7fffffff - #define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL - --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0021-ARM64-ILP32-Use-a-seperate-syscall-table-as-a-few-sy.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0021-ARM64-ILP32-Use-a-seperate-syscall-table-as-a-few-sy.patch deleted file mode 100644 index 0a37fcb0..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0021-ARM64-ILP32-Use-a-seperate-syscall-table-as-a-few-sy.patch +++ /dev/null @@ -1,301 +0,0 @@ -From c167810daa92daa4dfcec57e3f9f996ee34ee000 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:15 -0700 -Subject: [PATCH 21/25] ARM64:ILP32: Use a seperate syscall table as a few - syscalls need to be using the compat syscalls - -Some syscalls are still need to use the compat versions. -So we need to have a seperate syscall table for ILP32. -This patch adds them including documentation on why we need to use each one. - -This list is based on the list from https://lkml.org/lkml/2013/9/11/478. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/include/asm/syscalls.h | 4 + - arch/arm64/include/asm/unistd.h | 4 + - arch/arm64/kernel/Makefile | 1 + - arch/arm64/kernel/entry.S | 13 ++- - arch/arm64/kernel/sys_ilp32.c | 195 ++++++++++++++++++++++++++++++++++++++ - 5 files changed, 216 insertions(+), 1 deletion(-) - create mode 100644 arch/arm64/kernel/sys_ilp32.c - -diff --git a/arch/arm64/include/asm/syscalls.h b/arch/arm64/include/asm/syscalls.h -index 48fe7c6..b58dad7 100644 ---- a/arch/arm64/include/asm/syscalls.h -+++ b/arch/arm64/include/asm/syscalls.h -@@ -25,6 +25,10 @@ - */ - asmlinkage long sys_rt_sigreturn_wrapper(void); - -+#ifdef CONFIG_ARM64_ILP32 -+long ilp32_sys_sigaltstack(const stack_t __user *, stack_t __user *); -+#endif -+ - #include <asm-generic/syscalls.h> - - #endif /* __ASM_SYSCALLS_H */ -diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h -index 70e5559..c99815a 100644 ---- a/arch/arm64/include/asm/unistd.h -+++ b/arch/arm64/include/asm/unistd.h -@@ -13,6 +13,10 @@ - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -+#ifdef CONFIG_ARM64_ILP32 -+#define __ARCH_WANT_COMPAT_SYS_PREADV64 -+#define __ARCH_WANT_COMPAT_SYS_PWRITEV64 -+#endif - #ifdef CONFIG_AARCH32_EL0 - #define __ARCH_WANT_COMPAT_SYS_GETDENTS64 - #define __ARCH_WANT_COMPAT_STAT64 -diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile -index ceb9bf7..98c6c85 100644 ---- a/arch/arm64/kernel/Makefile -+++ b/arch/arm64/kernel/Makefile -@@ -19,6 +19,7 @@ arm64-obj-y := cputable.o debug-monitors.o entry.o irq.o fpsimd.o \ - - arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ - sys_compat.o -+arm64-obj-$(CONFIG_ARM64_ILP32) += sys_ilp32.o - arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o - arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o - arm64-obj-$(CONFIG_SMP) += smp.o smp_spin_table.o topology.o -diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S -index 5a1430c..537be14 100644 ---- a/arch/arm64/kernel/entry.S -+++ b/arch/arm64/kernel/entry.S -@@ -642,9 +642,14 @@ ENDPROC(ret_from_fork) - */ - .align 6 - el0_svc: -- adrp stbl, sys_call_table // load syscall table pointer - uxtw scno, w8 // syscall number in w8 - mov sc_nr, #__NR_syscalls -+#ifdef CONFIG_ARM64_ILP32 -+ get_thread_info tsk -+ ldr x16, [tsk, #TI_FLAGS] -+ tbnz x16, #TIF_32BIT, el0_ilp32_svc // We are using ILP32 -+#endif -+ adrp stbl, sys_call_table // load syscall table pointer - el0_svc_naked: // compat entry point - stp x0, scno, [sp, #S_ORIG_X0] // save the original x0 and syscall number - enable_dbg_and_irq -@@ -663,6 +668,12 @@ ni_sys: - b do_ni_syscall - ENDPROC(el0_svc) - -+#ifdef CONFIG_ARM64_ILP32 -+el0_ilp32_svc: -+ adrp stbl, sys_call_ilp32_table // load syscall table pointer -+ b el0_svc_naked -+#endif -+ - /* - * This is the really slow path. We're going to be doing context - * switches, and waiting for our parent to respond. -diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c -new file mode 100644 -index 0000000..893f7d6 ---- /dev/null -+++ b/arch/arm64/kernel/sys_ilp32.c -@@ -0,0 +1,195 @@ -+/* -+ * AArch64- ILP32 specific system calls implementation -+ * -+ * Copyright (C) 2013 Cavium Inc. -+ * Author: Andrew Pinski <apinski@cavium.com> -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. If not, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#include <linux/compiler.h> -+#include <linux/errno.h> -+#include <linux/fs.h> -+#include <linux/mm.h> -+#include <linux/export.h> -+#include <linux/sched.h> -+#include <linux/slab.h> -+#include <linux/syscalls.h> -+#include <linux/compat.h> -+ -+/* -+ * Wrappers to pass the pt_regs argument. -+ */ -+#define sys_rt_sigreturn sys_rt_sigreturn_wrapper -+ -+/* -+ * Note places where mention unsigned long bitmaps, could -+ * use the non compat version for little-endian but big-endian -+ * has issues to do layout of the bits in the bitmaps. -+ */ -+ -+/* Using Compat syscalls where necessary */ -+#define sys_ioctl compat_sys_ioctl -+/* iovec */ -+#define sys_readv compat_sys_readv -+#define sys_writev compat_sys_writev -+#define sys_preadv compat_sys_preadv64 -+#define sys_pwritev compat_sys_pwritev64 -+#define sys_vmsplice compat_sys_vmsplice -+/* robust_list_head */ -+#define sys_set_robust_list compat_sys_set_robust_list -+#define sys_get_robust_list compat_sys_get_robust_list -+ -+/* kexec_segment */ -+#define sys_kexec_load compat_sys_kexec_load -+ -+/* Ptrace has some structures which are different between ILP32 and LP64 */ -+#define sys_ptrace compat_sys_ptrace -+ -+/* struct msghdr */ -+#define sys_recvfrom compat_sys_recvfrom -+#define sys_recvmmsg compat_sys_recvmmsg -+#define sys_sendmmsg compat_sys_sendmmsg -+#define sys_sendmsg compat_sys_sendmsg -+#define sys_recvmsg compat_sys_recvmsg -+ -+/* -+ * Note the timeval is taken care by COMPAT_USE_64BIT_TIME -+ * being true. -+ */ -+#define sys_setsockopt compat_sys_setsockopt -+#define sys_getsockopt compat_sys_getsockopt -+ -+/* Array of pointers */ -+#define sys_execve compat_sys_execve -+#define sys_move_pages compat_sys_move_pages -+ -+/* iovec */ -+#define sys_process_vm_readv compat_sys_process_vm_readv -+#define sys_process_vm_writev compat_sys_process_vm_writev -+ -+/* -+ * The NFSv4 and ncpfs structures are depend on the long and -+ * pointer sizes. -+ */ -+#define sys_mount compat_sys_mount -+ -+/* NUMA */ -+/* unsigned long bitmaps */ -+#define sys_get_mempolicy compat_sys_get_mempolicy -+#define sys_set_mempolicy compat_sys_set_mempolicy -+#define sys_mbind compat_sys_mbind -+ -+/* array of pointers */ -+/* unsigned long bitmaps */ -+#define sys_migrate_pages compat_sys_migrate_pages -+ -+/* Scheduler */ -+/* unsigned long bitmaps */ -+#define sys_sched_setaffinity compat_sys_sched_setaffinity -+#define sys_sched_getaffinity compat_sys_sched_getaffinity -+ -+/* iov usage */ -+#define sys_keyctl compat_sys_keyctl -+ -+/* aio */ -+/* Array of pointers (iocb's) */ -+#define sys_io_submit compat_sys_io_submit -+ -+/* We need to make sure the pointer gets copied correctly. */ -+asmlinkage long ilp32_sys_mq_notify(mqd_t mqdes, -+ const struct sigevent __user *u_notification) -+{ -+ struct sigevent __user *p = NULL; -+ -+ if (u_notification) { -+ struct sigevent n; -+ -+ p = compat_alloc_user_space(sizeof(*p)); -+ if (copy_from_user(&n, u_notification, sizeof(*p))) -+ return -EFAULT; -+ if (n.sigev_notify == SIGEV_THREAD) -+ n.sigev_value.sival_ptr = compat_ptr((uintptr_t)n.sigev_value.sival_ptr); -+ if (copy_to_user(p, &n, sizeof(*p))) -+ return -EFAULT; -+ } -+ return sys_mq_notify(mqdes, p); -+} -+ -+/* -+ * sigevent contains sigval_t which is now 64bit always -+ * but need special handling due to padding for SIGEV_THREAD. -+ */ -+#define sys_mq_notify ilp32_sys_mq_notify -+ -+ -+/* -+ * sigaltstack needs some special handling as the -+ * padding for stack_t might not be non-zero. -+ */ -+long ilp32_sys_sigaltstack(const stack_t __user *uss_ptr, -+ stack_t __user *uoss_ptr) -+{ -+ stack_t uss, uoss; -+ int ret; -+ mm_segment_t seg; -+ -+ if (uss_ptr) { -+ if (!access_ok(VERIFY_READ, uss_ptr, sizeof(*uss_ptr))) -+ return -EFAULT; -+ if (__get_user(uss.ss_sp, &uss_ptr->ss_sp) | -+ __get_user(uss.ss_flags, &uss_ptr->ss_flags) | -+ __get_user(uss.ss_size, &uss_ptr->ss_size)) -+ return -EFAULT; -+ /* Zero extend the sp address and the size. */ -+ uss.ss_sp = (void *)(uintptr_t)(unsigned int)(uintptr_t)uss.ss_sp; -+ uss.ss_size = (size_t)(unsigned int)uss.ss_size; -+ } -+ seg = get_fs(); -+ set_fs(KERNEL_DS); -+ /* -+ * Note we need to use uoss as we have changed the segment to the -+ * kernel one so passing an user one around is wrong. -+ */ -+ ret = sys_sigaltstack((stack_t __force __user *) (uss_ptr ? &uss : NULL), -+ (stack_t __force __user *) &uoss); -+ set_fs(seg); -+ if (ret >= 0 && uoss_ptr) { -+ if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(stack_t)) || -+ __put_user(uoss.ss_sp, &uoss_ptr->ss_sp) || -+ __put_user(uoss.ss_flags, &uoss_ptr->ss_flags) || -+ __put_user(uoss.ss_size, &uoss_ptr->ss_size)) -+ ret = -EFAULT; -+ } -+ return ret; -+} -+ -+/* -+ * sigaltstack needs some special handling as the padding -+ * for stack_t might not be non-zero. -+ */ -+#define sys_sigaltstack ilp32_sys_sigaltstack -+ -+#include <asm/syscalls.h> -+ -+#undef __SYSCALL -+#define __SYSCALL(nr, sym) [nr] = sym, -+ -+/* -+ * The sys_call_ilp32_table array must be 4K aligned to be accessible from -+ * kernel/entry.S. -+ */ -+void *sys_call_ilp32_table[__NR_syscalls] __aligned(4096) = { -+ [0 ... __NR_syscalls - 1] = sys_ni_syscall, -+#include <asm/unistd.h> -+}; --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0022-ARM64-ILP32-Fix-signal-return-for-ILP32-when-the-use.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0022-ARM64-ILP32-Fix-signal-return-for-ILP32-when-the-use.patch deleted file mode 100644 index c9d647e1..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0022-ARM64-ILP32-Fix-signal-return-for-ILP32-when-the-use.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 83c39e04015427c69d2f48735095a56c4aa63259 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:16 -0700 -Subject: [PATCH 22/25] ARM64:ILP32: Fix signal return for ILP32 when the user - modified the signal stack - -If the user decided to change the stack_t that was on the stack when returning -from the signal handler, the stack_t's padding for ILP32 might be not zero. -So we need to use the syscall version of restore_altstack (ilp32_sys_sigaltstack). - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/kernel/signal.c | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c -index 5311147..6316d54 100644 ---- a/arch/arm64/kernel/signal.c -+++ b/arch/arm64/kernel/signal.c -@@ -35,6 +35,7 @@ - #include <asm/fpsimd.h> - #include <asm/signal32.h> - #include <asm/vdso.h> -+#include <asm/syscalls.h> - - /* - * Do a signal return; undo the signal stack. These are aligned to 128-bit. -@@ -149,6 +150,19 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) - if (restore_sigframe(regs, frame)) - goto badframe; - -+#ifdef CONFIG_ARM64_ILP32 -+ /* -+ * ILP32 has to be handled "special" due to maybe not zeroing out -+ * the upper 32bits of the pointer if the user changed the frame. -+ */ -+ if (is_ilp32_compat_task()) { -+ if (ilp32_sys_sigaltstack(&frame->uc.uc_stack, -+ NULL) == -EFAULT) -+ goto badframe; -+ return regs->regs[0]; -+ } -+#endif -+ - if (restore_altstack(&frame->uc.uc_stack)) - goto badframe; - --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0023-ARM64-Add-ARM64_ILP32-to-Kconfig.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0023-ARM64-Add-ARM64_ILP32-to-Kconfig.patch deleted file mode 100644 index d61f526d..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0023-ARM64-Add-ARM64_ILP32-to-Kconfig.patch +++ /dev/null @@ -1,42 +0,0 @@ -From b5f1db849f9c2773d318f27091bb42dd0941af7b Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:17 -0700 -Subject: [PATCH 23/25] ARM64: Add ARM64_ILP32 to Kconfig - -This patch adds the config option for ILP32. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - arch/arm64/Kconfig | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig -index f28af3f..9b92318 100644 ---- a/arch/arm64/Kconfig -+++ b/arch/arm64/Kconfig -@@ -409,7 +409,7 @@ source "fs/Kconfig.binfmt" - - config COMPAT - def_bool y -- depends on AARCH32_EL0 -+ depends on AARCH32_EL0 || ARM64_ILP32 - select COMPAT_BINFMT_ELF - - config AARCH32_EL0 -@@ -426,6 +426,13 @@ config AARCH32_EL0 - - If you want to execute 32-bit userspace applications, say Y. - -+config ARM64_ILP32 -+ bool "Kernel support for ILP32" -+ help -+ This option enables support for AArch64 ILP32 user space. ILP32 -+ is an ABI where long and pointers are 32bits but it uses the AARCH64 -+ instruction set. -+ - config SYSVIPC_COMPAT - def_bool y - depends on AARCH32_EL0 && SYSVIPC --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0024-Add-documentation-about-ARM64-ILP32-ABI.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0024-Add-documentation-about-ARM64-ILP32-ABI.patch deleted file mode 100644 index 3e3ebe9a..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0024-Add-documentation-about-ARM64-ILP32-ABI.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 912465ff3a6c600fbd9315533cf8d4ec8c570b63 Mon Sep 17 00:00:00 2001 -From: Andrew Pinski <apinski@cavium.com> -Date: Wed, 3 Sep 2014 14:19:18 -0700 -Subject: [PATCH 24/25] Add documentation about ARM64 ILP32 ABI - -This adds the documentation about the ILP32 ABI and what is difference between it and the normal generic 32bit ABI. - -Signed-off-by: Andrew Pinski <apinski@cavium.com> ---- - Documentation/arm64/ilp32.txt | 57 +++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 57 insertions(+) - create mode 100644 Documentation/arm64/ilp32.txt - -diff --git a/Documentation/arm64/ilp32.txt b/Documentation/arm64/ilp32.txt -new file mode 100644 -index 0000000..0863aa4 ---- /dev/null -+++ b/Documentation/arm64/ilp32.txt -@@ -0,0 +1,57 @@ -+ ILP32 AARCH64 SYSCALL ABI -+ ===================== -+ -+Author: Andrew Pinski <apinski@cavium.com> -+Date: May 23, 2014 -+ -+This document describes the ILP32 syscall ABI and where it differs -+from the generic linux syscall interface. -+ILP32 sets __kernel_long_t and __kernel_ulong_t both to 64bit -+(long long). This effects the following types: -+* time_t: unsigned long long -+* clock_t: unsigned long long -+* fsword_t: long long -+* suseconds_t: long long -+* swblk_t: long long -+* fd_mask_t: long long -+ -+Some structures are changed to reduce the difference in the code path -+for both ILP32 and LP64 ABIs for signal handling. -+ -+The following structures have been changed so the layout of the structures are the same between ILP32 and LP64 ABIs. -+* timespec: Uses time_t and suseconds_t -+* timeval: Uses time_t and suseconds_t -+* stat: Uses timespec/time_t. -+* semid64_ds: Uses time_t. -+* msqid64_ds: Uses time_t. -+* shmid64_ds: Uses time_t. -+* rt_sigframe: Uses siginfo and ucontext. -+* siginfo_t: Uses clock_t and sigval_t -+* ucontext: Uses stack_t and sigset_t -+* stack_t: NOTE special handling inside the kernel is done to make sure -+ the pointers are zero extended -+* sigval_t: Contains pointers -+* sigevent: Uses sigval_t which causes it to be the same. Special -+ handing is needed for reading; in the mq_notify syscall -+* sigaction: NOTE the userland structure inside glibc does -+ not match the kernel structure here (this causes issues with LTP). -+ Uses sigset_t. -+* fd_set: This is done to avoid endian issues between ILP32 and LP64 -+ Also the syscall which uses fd_set uses timespec -+ -+ -+Also the syscalls which normally would pass 64bit values as two -+arguments; now pass the 64bit value as one argument. Also they have -+been renamed (removing the 64 from the name) to avoid confusion. -+The list of these syscalls: -+* fcntl -+* statfs -+* fstatfs -+* truncate -+* ftruncate -+* lseek -+* sendfile -+* newfstatat -+* fstat -+* mmap -+* fadvise64 --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0025-ARM64-ILP32-fix-the-compilation-error-due-to-mistype.patch b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0025-ARM64-ILP32-fix-the-compilation-error-due-to-mistype.patch deleted file mode 100644 index 6d17221c..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers/0025-ARM64-ILP32-fix-the-compilation-error-due-to-mistype.patch +++ /dev/null @@ -1,30 +0,0 @@ -From a33d84566e90cc279db7cc54de45ab92ce10bdf6 Mon Sep 17 00:00:00 2001 -From: Andrey Konovalov <andrey.konovalov@linaro.org> -Date: Wed, 15 Oct 2014 14:49:53 +0400 -Subject: [PATCH 25/25] ARM64:ILP32: fix the compilation error due to mistyped - header file name - -There is a misprint in the v3 patch "ARM64:ILP32: Use the same size and -layout of the signal structures for ILP32 as for LP64". - -Signed-off-by: Andrey Konovalov <andrey.konovalov@linaro.org> ---- - arch/arm64/include/uapi/asm/signal.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/arch/arm64/include/uapi/asm/signal.h b/arch/arm64/include/uapi/asm/signal.h -index d33a5f7..f378ff4 100644 ---- a/arch/arm64/include/uapi/asm/signal.h -+++ b/arch/arm64/include/uapi/asm/signal.h -@@ -16,7 +16,7 @@ - #ifndef __ASM_SIGNAL_H - #define __ASM_SIGNAL_H - --#include <asm/posix-types.h> -+#include <asm/posix_types.h> - - /* Required for AArch32 compatibility. */ - #define SA_RESTORER 0x04000000 --- -1.9.3 - diff --git a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers_3.18.bb b/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers_3.18.bb deleted file mode 100644 index 88df4378..00000000 --- a/meta-aarch64/recipes-kernel/linux-libc-headers/linux-libc-headers_3.18.bb +++ /dev/null @@ -1,35 +0,0 @@ -KORG_ARCHIVE_COMPRESSION = "xz" - -require recipes-kernel/linux-libc-headers/linux-libc-headers.inc - -SRC_URI_append_aarchilp32 = " \ - file://0001-ARM64-Force-LP64-to-compile-the-kernel.patch \ - file://0002-ARM64-Rename-COMPAT-to-AARCH32_EL0-in-Kconfig.patch \ - file://0003-ARM64-Change-some-CONFIG_COMPAT-over-to-use-CONFIG_A.patch \ - file://0004-ARM64-ILP32-Set-kernel_long-to-long-long-so-we-can-r.patch \ - file://0005-ARM64-UAPI-Set-the-correct-__BITS_PER_LONG-for-ILP32.patch \ - file://0006-Allow-for-some-signal-structures-to-be-the-same-betw.patch \ - file://0007-ARM64-ILP32-Use-the-same-size-and-layout-of-the-sign.patch \ - file://0008-Allow-a-32bit-ABI-to-use-the-naming-of-the-64bit-ABI.patch \ - file://0009-ARM64-ILP32-Use-the-same-syscall-names-as-LP64.patch \ - file://0010-ARM64-Introduce-is_a32_task-is_a32_thread-and-TIF_AA.patch \ - file://0011-ARM64-Add-is_ilp32_compat_task-and-is_ilp32_compat_t.patch \ - file://0012-ARM64-ILP32-COMPAT_USE_64BIT_TIME-is-true-for-ILP32-.patch \ - file://0013-ARM64-ILP32-Use-the-non-compat-HWCAP-for-ILP32.patch \ - file://0014-ARM64-ILP32-use-the-standard-start_thread-for-ILP32-.patch \ - file://0015-compat_binfmt_elf-coredump-Allow-some-core-dump-macr.patch \ - file://0016-ARM64-ILP32-Support-core-dump-for-ILP32.patch \ - file://0017-ARM64-Add-loading-of-ILP32-binaries.patch \ - file://0018-ARM64-Add-vdso-for-ILP32-and-use-it-for-the-signal-r.patch \ - file://0019-ptrace-Allow-compat-to-use-the-native-siginfo.patch \ - file://0020-ARM64-ILP32-The-native-siginfo-is-used-instead-of-th.patch \ - file://0021-ARM64-ILP32-Use-a-seperate-syscall-table-as-a-few-sy.patch \ - file://0022-ARM64-ILP32-Fix-signal-return-for-ILP32-when-the-use.patch \ - file://0023-ARM64-Add-ARM64_ILP32-to-Kconfig.patch \ - file://0024-Add-documentation-about-ARM64-ILP32-ABI.patch \ - file://0025-ARM64-ILP32-fix-the-compilation-error-due-to-mistype.patch \ - " - -SRC_URI[md5sum] = "9e854df51ca3fef8bfe566dbd7b89241" -SRC_URI[sha256sum] = "becc413cc9e6d7f5cc52a3ce66d65c3725bc1d1cc1001f4ce6c32b69eb188cbd" - |