Re: [PATCH 07/24] arm64: ilp32: add documentation on the ILP32 ABI for ARM64
Hi Pavel, On Wed, May 23, 2018 at 04:06:20PM +0200, Pavel Machek wrote: > On Wed 2018-05-16 11:18:52, Yury Norov wrote: > > Based on Andrew Pinski's patch-series. > > > > Signed-off-by: Yury Norov <yno...@caviumnetworks.com> > > So Andrew's signoff should be here? Yes it should, but it lost since v4. I'll restore it. > > --- > > Documentation/arm64/ilp32.txt | 45 +++ > > 1 file changed, 45 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 ..d0fd5109c4b2 > > --- /dev/null > > +++ b/Documentation/arm64/ilp32.txt > > @@ -0,0 +1,45 @@ > > +ILP32 AARCH64 SYSCALL ABI > > += > > + > > +This document describes the ILP32 syscall ABI and where it differs > > +from the generic compat linux syscall interface. > > I was hoping to learn what ILP32 is / what is it good for, but no, > this does not tell me... it would be good to do a short explanation > here, and maybe reference it from cover letter of the series... > Pavel ILP32 is ABI acronym that means "Integers, Longs and Pointers are 32-bit". And LP64 means "Longs and Pointers are 64-bit". There's AN490 - "ILP32 for AArch64 Whitepaper" from ARM which covers the topic: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0490a/ar01s01.html And some talks: http://connect.linaro.org/resource/bkk16/bkk16-305b/ Briefly, ILP32 is 32-bit ABI that works with AARCH64 instruction set. It looks better in some performance tests, and is useful for compatibility with 32-bit legacy code. If you're more familiar with x86 terminology, in ARM world LP64 corresponds to x86_64, AARCH32_EL0 corresponds to x86_32, and ILP32 corresponds to x32 ABI. I'll add link to AN490 in next submission. Yury > -- > (english) http://www.livejournal.com/~pavelmachek > (cesky, pictures) > http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v9 00/24] ILP32 for ARM64
This series enables AARCH64 with ILP32 mode. As supporting work, it introduces ARCH_32BIT_OFF_T configuration option that is enabled for existing 32-bit architectures but disabled for new arches (so 64-bit off_t userspace type is used by new userspace). Also it deprecates getrlimit and setrlimit syscalls prior to prlimit64. Based on kernel v4.16. Tested with LTP, glibc testsuite, trinity, lmbench, CPUSpec. This series on github: https://github.com/norov/linux/tree/ilp32-4.16 Linaro toolchain: http://snapshots.linaro.org/components/toolchain/binaries/7.3-2018.04-rc1/aarch64-linux-gnu_ilp32/ Debian repo: http://people.linaro.org/~wookey/ilp32/ OpenSUSE repo: https://build.opensuse.org/project/show/devel:ARM:Factory:Contrib:ILP32 Changes: v3: https://lkml.org/lkml/2014/9/3/704 v4: https://lkml.org/lkml/2015/4/13/691 v5: https://lkml.org/lkml/2015/9/29/911 v6: https://lkml.org/lkml/2016/5/23/661 v7: https://lkml.org/lkml/2017/1/9/213 v8: https://lkml.org/lkml/2017/6/19/624 v9: - rebased on top of v4.16; - signal subsystem reworked to avoid code duplication, as requested by Dave Martin (patches 18 and 20); - new files introduced in series use SPDX notation for license; - linux-api and linux-arch CCed as the series changes kernel ABI; - checkpatch and other minor fixes. - Zhou Chengming's reported-by for patch 2 and signed-off-by for patch 21 removed because his email became invalid. Zhou, please share your new email. Andrew Pinski (4): arm64: rename COMPAT to AARCH32_EL0 in Kconfig arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it arm64:ilp32: add ARM64_ILP32 to Kconfig Catalin Marinas (1): arm64: ilp32: Make the Kconfig option default y Dave Martin (1): arm64: signal: Make parse_user_sigframe() independent of rt_sigframe layout James Morse (1): ptrace: Add compat PTRACE_{G,S}ETSIGMASK handlers Philipp Tomsich (1): arm64:ilp32: add vdso-ilp32 and use for signal return Yury Norov (16): compat ABI: use non-compat openat and open_by_handle_at variants 32-bit userspace ABI: introduce ARCH_32BIT_OFF_T config option asm-generic: Drop getrlimit and setrlimit syscalls from default list thread: move thread bits accessors to separated file arm64: ilp32: add documentation on the ILP32 ABI for ARM64 arm64: rename functions that reference compat term arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64 arm64: introduce binfmt_elf32.c arm64: change compat_elf_hwcap and compat_elf_hwcap2 prefix to a32 arm64: ilp32: introduce binfmt_ilp32.c arm64: ilp32: share aarch32 syscall handlers arm64: signal: share lp64 signal structures and routines to ilp32 arm64: signal32: move ilp32 and aarch32 common code to separated file arm64: ilp32: introduce ilp32-specific sigframe and ucontext arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 Documentation/arm64/ilp32.txt | 45 +++ arch/Kconfig | 15 + arch/arc/Kconfig | 1 + arch/arc/include/uapi/asm/unistd.h| 1 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig| 18 +- arch/arm64/Makefile | 3 + arch/arm64/include/asm/compat.h | 19 +- arch/arm64/include/asm/elf.h | 36 +- arch/arm64/include/asm/fpsimd.h | 2 +- arch/arm64/include/asm/ftrace.h | 2 +- arch/arm64/include/asm/hwcap.h| 8 +- arch/arm64/include/asm/is_compat.h| 78 arch/arm64/include/asm/processor.h| 15 +- arch/arm64/include/asm/ptrace.h | 12 +- arch/arm64/include/asm/seccomp.h | 2 +- arch/arm64/include/asm/signal32.h | 19 +- arch/arm64/include/asm/signal32_common.h | 13 + arch/arm64/include/asm/signal_common.h| 306 +++ arch/arm64/include/asm/signal_ilp32.h | 23 ++ arch/arm64/include/asm/syscall.h | 2 +- arch/arm64/include/asm/thread_info.h | 4 +- arch/arm64/include/asm/unistd.h | 6 +- arch/arm64/include/asm/vdso.h | 6 + arch/arm64/include/uapi/asm/bitsperlong.h | 9 +- arch/arm64/include/uapi/asm/unistd.h | 13 + arch/arm64/kernel/Makefile| 8 +- arch/arm64/kernel/armv8_deprecated.c | 6 +- arch/arm64/kernel/asm-offsets.c | 9 +- arch/arm64/kernel/binfmt_elf32.c | 35 ++ arch/arm64/kernel/binfmt_ilp32.c | 87 + arch/arm64/kernel/cpufeature.c| 28 +- arch/arm64/kernel/cpuinfo.c | 18 +- arch/arm64/kernel/debug-monitors.c| 4 +- arch/arm64/kernel/entry.S
[PATCH 02/24] ptrace: Add compat PTRACE_{G,S}ETSIGMASK handlers
From: James Morse <james.mo...@arm.com> compat_ptrace_request() lacks handlers for PTRACE_{G,S}ETSIGMASK, instead using those in ptrace_request(). The compat variant should read a compat_sigset_t from userspace instead of ptrace_request()s sigset_t. While compat_sigset_t is the same size as sigset_t, it is defined as 2xu32, instead of a single u64. On a big-endian CPU this means that compat_sigset_t is passed to user-space using middle-endianness, where the least-significant u32 is written most significant byte first. If ptrace_request()s code is used userspace will read the most significant u32 where it expected the least significant. Instead of duplicating ptrace_request()s code as a special case in the arch code, handle it here. Fixes: 29000caecbe87 ("ptrace: add ability to get/set signal-blocked mask") CC: Andrey Vagin <ava...@openvz.org> Signed-off-by: James Morse <james.mo...@arm.com> Yury: Replace sigset_{to,from}_compat() with new {get,put}_compat_sigset() Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- kernel/ptrace.c | 48 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 21fec73d45d4..214944d7c268 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -880,6 +880,22 @@ static int ptrace_regset(struct task_struct *task, int req, unsigned int type, EXPORT_SYMBOL_GPL(task_user_regset_view); #endif +static int ptrace_setsigmask(struct task_struct *child, sigset_t *new_set) +{ + sigdelsetmask(new_set, sigmask(SIGKILL)|sigmask(SIGSTOP)); + + /* +* Every thread does recalc_sigpending() after resume, so +* retarget_shared_pending() and recalc_sigpending() are not +* called here. +*/ + spin_lock_irq(>sighand->siglock); + child->blocked = *new_set; + spin_unlock_irq(>sighand->siglock); + + return 0; +} + int ptrace_request(struct task_struct *child, long request, unsigned long addr, unsigned long data) { @@ -951,18 +967,7 @@ int ptrace_request(struct task_struct *child, long request, break; } - sigdelsetmask(_set, sigmask(SIGKILL)|sigmask(SIGSTOP)); - - /* -* Every thread does recalc_sigpending() after resume, so -* retarget_shared_pending() and recalc_sigpending() are not -* called here. -*/ - spin_lock_irq(>sighand->siglock); - child->blocked = new_set; - spin_unlock_irq(>sighand->siglock); - - ret = 0; + ret = ptrace_setsigmask(child, _set); break; } @@ -1181,6 +1186,7 @@ int compat_ptrace_request(struct task_struct *child, compat_long_t request, { compat_ulong_t __user *datap = compat_ptr(data); compat_ulong_t word; + sigset_t new_set; siginfo_t siginfo; int ret; @@ -1221,6 +1227,24 @@ int compat_ptrace_request(struct task_struct *child, compat_long_t request, else ret = ptrace_setsiginfo(child, ); break; + case PTRACE_GETSIGMASK: + if (addr != sizeof(compat_sigset_t)) + return -EINVAL; + + ret = put_compat_sigset((compat_sigset_t __user *) datap, + >blocked, sizeof(compat_sigset_t)); + break; + case PTRACE_SETSIGMASK: + if (addr != sizeof(compat_sigset_t)) + return -EINVAL; + + ret = get_compat_sigset(_set, + (compat_sigset_t __user *) datap); + if (ret) + break; + + ret = ptrace_setsigmask(child, _set); + break; #ifdef CONFIG_HAVE_ARCH_TRACEHOOK case PTRACE_GETREGSET: case PTRACE_SETREGSET: -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 03/24] compat ABI: use non-compat openat and open_by_handle_at variants
The only difference between native and compat openat and open_by_handle_at is that non-compat version forces O_LARGEFILE, and it should be the default behaviour for all architectures, as we are going to drop the support of 32-bit userspace off_t. The exception is tile32 that continues with compat version of syscalls. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Acked-by: Arnd Bergmann <a...@arndb.de> Acked-by: Chris Metcalf <cmetc...@ezchip.com> [for tile] --- arch/tile/kernel/compat.c | 3 +++ include/uapi/asm-generic/unistd.h | 5 ++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/tile/kernel/compat.c b/arch/tile/kernel/compat.c index bdaf71d31a4a..3b7853c59395 100644 --- a/arch/tile/kernel/compat.c +++ b/arch/tile/kernel/compat.c @@ -103,6 +103,9 @@ COMPAT_SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned int, offset_high, #define compat_sys_readahead sys32_readahead #define sys_llseek compat_sys_llseek +#define sys_openat compat_sys_openat +#define sys_open_by_handle_at compat_sys_open_by_handle_at + /* Call the assembly trampolines where necessary. */ #define compat_sys_rt_sigreturn _compat_sys_rt_sigreturn #define sys_clone _sys_clone diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 8b87de067bc7..426a1a496d9d 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -179,7 +179,7 @@ __SYSCALL(__NR_fchownat, sys_fchownat) #define __NR_fchown 55 __SYSCALL(__NR_fchown, sys_fchown) #define __NR_openat 56 -__SC_COMP(__NR_openat, sys_openat, compat_sys_openat) +__SYSCALL(__NR_openat, sys_openat) #define __NR_close 57 __SYSCALL(__NR_close, sys_close) #define __NR_vhangup 58 @@ -676,8 +676,7 @@ __SYSCALL(__NR_fanotify_mark, sys_fanotify_mark) #define __NR_name_to_handle_at 264 __SYSCALL(__NR_name_to_handle_at, sys_name_to_handle_at) #define __NR_open_by_handle_at 265 -__SC_COMP(__NR_open_by_handle_at, sys_open_by_handle_at, \ - compat_sys_open_by_handle_at) +__SYSCALL(__NR_open_by_handle_at, sys_open_by_handle_at) #define __NR_clock_adjtime 266 __SC_COMP(__NR_clock_adjtime, sys_clock_adjtime, compat_sys_clock_adjtime) #define __NR_syncfs 267 -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 01/24] arm64: signal: Make parse_user_sigframe() independent of rt_sigframe layout
From: Dave Martin <dave.mar...@arm.com> ILP32 uses the same struct sigcontext as the native ABI (i.e., LP64), but a different layout for the rest of the signal frame (since siginfo_t and ucontext_t are both ABI-dependent). Since the purpose of parse_user_sigframe() is really to parse sigcontext and not the whole signal frame, the function does not need to depend on the layout of rt_sigframe -- the only purpose of the rt_sigframe pointer is for use as a base to measure the signal frame size. So, this patch renames the function to make it clear that only the sigcontext is really being parsed, and makes the sigframe base pointer generic. A macro is defined to provide a suitable duck-typed interface that can be used with both sigframe definitions. Suggested-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Dave Martin <dave.mar...@arm.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/kernel/signal.c | 14 -- 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index f60c052e8d1c..65406218743c 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -334,17 +334,16 @@ extern int restore_sve_fpsimd_context(struct user_ctxs *user); #endif /* ! CONFIG_ARM64_SVE */ - -static int parse_user_sigframe(struct user_ctxs *user, - struct rt_sigframe __user *sf) +static int __parse_user_sigcontext(struct user_ctxs *user, + struct sigcontext __user const *sc, + void __user const *sigframe_base) { - struct sigcontext __user *const sc = >uc.uc_mcontext; struct _aarch64_ctx __user *head; char __user *base = (char __user *)>__reserved; size_t offset = 0; size_t limit = sizeof(sc->__reserved); bool have_extra_context = false; - char const __user *const sfp = (char const __user *)sf; + char const __user *const sfp = (char const __user *)sigframe_base; user->fpsimd = NULL; user->sve = NULL; @@ -493,6 +492,9 @@ static int parse_user_sigframe(struct user_ctxs *user, return -EINVAL; } +#define parse_user_sigcontext(user, sf) \ + __parse_user_sigcontext(user, &(sf)->uc.uc_mcontext, sf) + static int restore_sigframe(struct pt_regs *regs, struct rt_sigframe __user *sf) { @@ -518,7 +520,7 @@ static int restore_sigframe(struct pt_regs *regs, err |= !valid_user_regs(>user_regs, current); if (err == 0) - err = parse_user_sigframe(, sf); + err = parse_user_sigcontext(, sf); if (err == 0) { if (!user.fpsimd) -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 09/24] arm64: rename functions that reference compat term
The ILP32 for ARM64 patch series introduces another 'compat' mode for arm64. So to avoid confusing, aarch32-only functions renamed in according to it. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/include/asm/ptrace.h | 10 ++-- arch/arm64/include/asm/signal32.h| 13 ++-- arch/arm64/kernel/armv8_deprecated.c | 6 +- arch/arm64/kernel/cpufeature.c | 6 +- arch/arm64/kernel/debug-monitors.c | 4 +- arch/arm64/kernel/perf_callchain.c | 22 +++ arch/arm64/kernel/perf_regs.c| 2 +- arch/arm64/kernel/process.c | 4 +- arch/arm64/kernel/signal.c | 8 +-- arch/arm64/kernel/signal32.c | 88 ++-- arch/arm64/kernel/sys_compat.c | 10 ++-- arch/arm64/kernel/traps.c| 6 +- 12 files changed, 90 insertions(+), 89 deletions(-) diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h index 0c85b469ad68..1ca181a6903a 100644 --- a/arch/arm64/include/asm/ptrace.h +++ b/arch/arm64/include/asm/ptrace.h @@ -155,16 +155,16 @@ static inline void forget_syscall(struct pt_regs *regs) #define arch_has_single_step() (1) #ifdef CONFIG_AARCH32_EL0 -#define compat_thumb_mode(regs) \ +#define a32_thumb_mode(regs) \ (((regs)->pstate & COMPAT_PSR_T_BIT)) #else -#define compat_thumb_mode(regs) (0) +#define a32_thumb_mode(regs) (0) #endif #define user_mode(regs)\ (((regs)->pstate & PSR_MODE_MASK) == PSR_MODE_EL0t) -#define compat_user_mode(regs) \ +#define a32_user_mode(regs)\ (((regs)->pstate & (PSR_MODE32_BIT | PSR_MODE_MASK)) == \ (PSR_MODE32_BIT | PSR_MODE_EL0t)) @@ -178,10 +178,10 @@ static inline void forget_syscall(struct pt_regs *regs) (!((regs)->pstate & PSR_F_BIT)) #define GET_USP(regs) \ - (!compat_user_mode(regs) ? (regs)->sp : (regs)->compat_sp) + (!a32_user_mode(regs) ? (regs)->sp : (regs)->compat_sp) #define SET_USP(ptregs, value) \ - (!compat_user_mode(regs) ? ((regs)->sp = value) : ((regs)->compat_sp = value)) + (!a32_user_mode(regs) ? ((regs)->sp = value) : ((regs)->compat_sp = value)) extern int regs_query_register_offset(const char *name); extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h index 2ebde460f5a0..92f48828b13a 100644 --- a/arch/arm64/include/asm/signal32.h +++ b/arch/arm64/include/asm/signal32.h @@ -24,27 +24,28 @@ #define AARCH32_KERN_SIGRET_CODE_OFFSET0x500 -int compat_setup_frame(int usig, struct ksignal *ksig, sigset_t *set, +int a32_setup_frame(int usig, struct ksignal *ksig, sigset_t *set, struct pt_regs *regs); -int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, + +int a32_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, struct pt_regs *regs); -void compat_setup_restart_syscall(struct pt_regs *regs); +void a32_setup_restart_syscall(struct pt_regs *regs); #else -static inline int compat_setup_frame(int usid, struct ksignal *ksig, +static inline int a32_setup_frame(int usid, struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) { return -ENOSYS; } -static inline int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, +static inline int a32_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) { return -ENOSYS; } -static inline void compat_setup_restart_syscall(struct pt_regs *regs) +static inline void a32_setup_restart_syscall(struct pt_regs *regs) { } #endif /* CONFIG_AARCH32_EL0 */ diff --git a/arch/arm64/kernel/armv8_deprecated.c b/arch/arm64/kernel/armv8_deprecated.c index 68450e954d47..b4f5ab915a0d 100644 --- a/arch/arm64/kernel/armv8_deprecated.c +++ b/arch/arm64/kernel/armv8_deprecated.c @@ -555,7 +555,7 @@ static int setend_set_hw_mode(bool enable) return 0; } -static int compat_setend_handler(struct pt_regs *regs, u32 big_endian) +static int __a32_setend_handler(struct pt_regs *regs, u32 big_endian) { char *insn; @@ -578,14 +578,14 @@ static int compat_setend_handler(struct pt_regs *regs, u32 big_endian) static int a32_setend_handler(struct pt_regs *regs, u32 instr) { - int rc = compat_setend_handler(regs, (instr >> 9) & 1); + int rc = __a32_setend_handler(regs, (instr >> 9) & 1); arm64_skip_faulting_instruction(regs, 4); return rc; } static int t16_setend_handler(struct pt_regs *regs, u32 instr) { - int rc = compat_setend_handler(regs, (instr >> 3) & 1); + int rc = __a32_setend_handler(regs, (instr >> 3) & 1); arm64_skip_faulting_instruction(regs, 2); return rc; } diff --git a/arch/arm64/kernel/cpuf
[PATCH 10/24] arm64: uapi: set __BITS_PER_LONG correctly for ILP32 and LP64
From: Andrew Pinski <apin...@cavium.com> Define __BITS_PER_LONG depending on the ABI used (i.e. check whether __ILP32__ or __LP64__ is defined). This is necessary for glibc to determine the appropriate type definitions for the system call interface. Signed-off-by: Andrew Pinski <apin...@cavium.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Reviewed-by: David Daney <dda...@caviumnetworks.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 485d60bee26c..9a05a9659e76 100644 --- a/arch/arm64/include/uapi/asm/bitsperlong.h +++ b/arch/arm64/include/uapi/asm/bitsperlong.h @@ -17,7 +17,14 @@ #ifndef __ASM_BITSPERLONG_H #define __ASM_BITSPERLONG_H -#define __BITS_PER_LONG 64 +#if defined(__LP64__) +/* Assuming __LP64__ will be defined for native ELF64's and not for ILP32. */ +# define __BITS_PER_LONG 64 +#elif defined(__ILP32__) +# define __BITS_PER_LONG 32 +#else +# error "Neither LP64 nor ILP32: unsupported ABI in asm/bitsperlong.h" +#endif #include -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 11/24] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat)
Based on patch of Andrew Pinski. 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. Corresponding functions are located in to avoid mess in headers. Some files include both and , and this is wrong because has already included. It was fixed too. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamv2...@gmail.com> --- arch/arm64/include/asm/compat.h | 19 ++ arch/arm64/include/asm/elf.h | 10 +++--- arch/arm64/include/asm/ftrace.h | 2 +- arch/arm64/include/asm/is_compat.h | 52 arch/arm64/include/asm/processor.h | 9 ++--- arch/arm64/include/asm/syscall.h | 2 +- arch/arm64/include/asm/thread_info.h | 2 +- arch/arm64/kernel/hw_breakpoint.c| 8 ++--- arch/arm64/kernel/perf_regs.c| 2 +- arch/arm64/kernel/process.c | 7 ++-- arch/arm64/kernel/ptrace.c | 11 +++--- arch/arm64/kernel/signal.c | 4 +-- arch/arm64/kernel/traps.c| 3 +- arch/arm64/mm/mmap.c | 2 +- 14 files changed, 85 insertions(+), 48 deletions(-) create mode 100644 arch/arm64/include/asm/is_compat.h diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h index c00c62e1a4a3..412d7c07a3dd 100644 --- a/arch/arm64/include/asm/compat.h +++ b/arch/arm64/include/asm/compat.h @@ -25,6 +25,8 @@ #include #include +#include + #define COMPAT_USER_HZ 100 #ifdef __AARCH64EB__ #define COMPAT_UTS_MACHINE "armv8b\0\0" @@ -234,23 +236,6 @@ struct compat_shmid64_ds { compat_ulong_t __unused5; }; -static inline int is_compat_task(void) -{ - return test_thread_flag(TIF_32BIT); -} - -static inline int is_compat_thread(struct thread_info *thread) -{ - return test_ti_thread_flag(thread, TIF_32BIT); -} - -#else /* !CONFIG_COMPAT */ - -static inline int is_compat_thread(struct thread_info *thread) -{ - return 0; -} - #endif /* CONFIG_COMPAT */ #endif /* __KERNEL__ */ #endif /* __ASM_COMPAT_H */ diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index fac1c4de7898..b4b10eefc667 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -16,6 +16,10 @@ #ifndef __ASM_ELF_H #define __ASM_ELF_H +#ifndef __ASSEMBLY__ +#include +#endif + #include /* @@ -156,13 +160,9 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp); /* 1GB of VA */ -#ifdef CONFIG_COMPAT -#define STACK_RND_MASK (test_thread_flag(TIF_32BIT) ? \ +#define STACK_RND_MASK (is_compat_task() ? \ 0x7ff >> (PAGE_SHIFT - 12) : \ 0x3 >> (PAGE_SHIFT - 12)) -#else -#define STACK_RND_MASK (0x3 >> (PAGE_SHIFT - 12)) -#endif #ifdef __AARCH64EB__ #define COMPAT_ELF_PLATFORM("v8b") diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h index caa955f10e19..0feb28ad10dd 100644 --- a/arch/arm64/include/asm/ftrace.h +++ b/arch/arm64/include/asm/ftrace.h @@ -54,7 +54,7 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr) #define ARCH_TRACE_IGNORE_COMPAT_SYSCALLS static inline bool arch_trace_is_compat_syscall(struct pt_regs *regs) { - return is_compat_task(); + return is_a32_compat_task(); } #endif /* ifndef __ASSEMBLY__ */ diff --git a/arch/arm64/include/asm/is_compat.h b/arch/arm64/include/asm/is_compat.h new file mode 100644 index ..19868588fbef --- /dev/null +++ b/arch/arm64/include/asm/is_compat.h @@ -0,0 +1,52 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +#ifndef __ASM_IS_COMPAT_H +#define __ASM_IS_COMPAT_H +#ifndef __ASSEMBLY__ + +#include + +#ifdef CONFIG_AARCH32_EL0 + +static inline int is_a32_compat_task(void) +{ + return test_thread_flag(TIF_32BIT); +} + +static inline int is_a32_compat_thread(struct thread_info *thread) +{ + return test_ti_thread_flag(thread, TIF_32BIT); +} + +#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 /* CONFIG_AARCH32_EL0 */ + +#ifdef CONFIG_COMPAT + +static inline int is_compat_task(void) +{ + return is_a32_compat_task(); +} + +#endif /* CONFIG_COMPAT */ + +static inline int is_compat_thread(struct thread_info *thread) +{ + return is_a32_compat_thread(thread); +} + + +#endif /* !__ASSEMBLY__ */ +#endif /* __ASM_IS_COMPAT_H */ diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 79cbc385f52a..78f9e71ad6fc 100644 --- a/arch/arm64/include/asm/processor.h
[PATCH 14/24] arm64: change compat_elf_hwcap and compat_elf_hwcap2 prefix to a32
ILP32 patch series introduces new type of binaries which is also compat. So rename existung aarch32 compat_elf_hwcap's helps to avoid confusing. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/include/asm/hwcap.h | 2 +- arch/arm64/kernel/binfmt_elf32.c | 4 ++-- arch/arm64/kernel/cpufeature.c | 14 +++--- arch/arm64/kernel/cpuinfo.c | 10 +- drivers/clocksource/arm_arch_timer.c | 2 +- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 99dfd9277559..428b745b5386 100644 --- a/arch/arm64/include/asm/hwcap.h +++ b/arch/arm64/include/asm/hwcap.h @@ -47,7 +47,7 @@ #define ELF_HWCAP (elf_hwcap) #ifdef CONFIG_AARCH32_EL0 -extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; +extern unsigned int a32_elf_hwcap, a32_elf_hwcap2; #endif enum { diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c index 440fa84f62b3..2b49d2a40d8b 100644 --- a/arch/arm64/kernel/binfmt_elf32.c +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -20,8 +20,8 @@ }) #define COMPAT_ARCH_DLINFO -#define COMPAT_ELF_HWCAP (compat_elf_hwcap) -#define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) +#define COMPAT_ELF_HWCAP (a32_elf_hwcap) +#define COMPAT_ELF_HWCAP2 (a32_elf_hwcap2) #define compat_arch_setup_additional_pages \ aarch32_setup_vectors_page diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index 28b7bc582334..4867fb142e86 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -38,15 +38,15 @@ unsigned long elf_hwcap __read_mostly; EXPORT_SYMBOL_GPL(elf_hwcap); #ifdef CONFIG_AARCH32_EL0 -#define COMPAT_ELF_HWCAP_DEFAULT \ +#define AARCH32_EL0_ELF_HWCAP_DEFAULT \ (COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\ COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\ COMPAT_HWCAP_TLS|COMPAT_HWCAP_VFP|\ COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\ COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV|\ COMPAT_HWCAP_LPAE) -unsigned int compat_elf_hwcap __read_mostly = COMPAT_ELF_HWCAP_DEFAULT; -unsigned int compat_elf_hwcap2 __read_mostly; +unsigned int a32_elf_hwcap __read_mostly = AARCH32_EL0_ELF_HWCAP_DEFAULT; +unsigned int a32_elf_hwcap2 __read_mostly; #endif DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS); @@ -1151,10 +1151,10 @@ static void __init cap_set_elf_hwcap(const struct arm64_cpu_capabilities *cap) break; #ifdef CONFIG_AARCH32_EL0 case CAP_COMPAT_HWCAP: - compat_elf_hwcap |= (u32)cap->hwcap; + a32_elf_hwcap |= (u32)cap->hwcap; break; case CAP_COMPAT_HWCAP2: - compat_elf_hwcap2 |= (u32)cap->hwcap; + a32_elf_hwcap2 |= (u32)cap->hwcap; break; #endif default: @@ -1174,10 +1174,10 @@ static bool cpus_have_elf_hwcap(const struct arm64_cpu_capabilities *cap) break; #ifdef CONFIG_AARCH32_EL0 case CAP_COMPAT_HWCAP: - rc = (compat_elf_hwcap & (u32)cap->hwcap) != 0; + rc = (a32_elf_hwcap & (u32)cap->hwcap) != 0; break; case CAP_COMPAT_HWCAP2: - rc = (compat_elf_hwcap2 & (u32)cap->hwcap) != 0; + rc = (a32_elf_hwcap2 & (u32)cap->hwcap) != 0; break; #endif default: diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c index 23fdf30dc0a3..a57a6fd0afab 100644 --- a/arch/arm64/kernel/cpuinfo.c +++ b/arch/arm64/kernel/cpuinfo.c @@ -120,7 +120,7 @@ static const char *const compat_hwcap2_str[] = { static int c_show(struct seq_file *m, void *v) { int i, j; - bool compat = personality(current->personality) == PER_LINUX32; + bool aarch32 = personality(current->personality) == PER_LINUX32; for_each_online_cpu(i) { struct cpuinfo_arm64 *cpuinfo = _cpu(cpu_data, i); @@ -132,7 +132,7 @@ static int c_show(struct seq_file *m, void *v) * "processor". Give glibc what it expects. */ seq_printf(m, "processor\t: %d\n", i); - if (compat) + if (aarch32) seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n", MIDR_REVISION(midr), COMPAT_ELF_PLATFORM); @@ -147,14 +147,14 @@ static int c_show(struct seq_file *m, void *v) * software which does already (at least for 32-bit). */ seq_puts(m, "Features\t:"); - if (compat) { + if (aarc
[PATCH 12/24] arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64
ILP32 tasks are needed to be distinguished from LP64 and AARCH32. This patch adds helper functions is_ilp32_compat_{task,thread} and thread flag TIF_32BIT_AARCH64 to address it. This is a preparation for following patches in ILP32 patchset. For consistency, SET_PERSONALITY is changed here accordingly. Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Reviewed-by: David Daney <dda...@caviumnetworks.com> --- arch/arm64/include/asm/elf.h | 2 ++ arch/arm64/include/asm/is_compat.h | 30 ++-- arch/arm64/include/asm/thread_info.h | 2 ++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index b4b10eefc667..023b2fbc1454 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -143,6 +143,7 @@ typedef struct user_fpsimd_state elf_fpregset_t; #define SET_PERSONALITY(ex)\ ({ \ + clear_thread_flag(TIF_32BIT_AARCH64); \ clear_thread_flag(TIF_32BIT); \ current->personality &= ~READ_IMPLIES_EXEC; \ }) @@ -194,6 +195,7 @@ typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; */ #define COMPAT_SET_PERSONALITY(ex) \ ({ \ + clear_thread_flag(TIF_32BIT_AARCH64); \ set_thread_flag(TIF_32BIT); \ }) #define COMPAT_ARCH_DLINFO diff --git a/arch/arm64/include/asm/is_compat.h b/arch/arm64/include/asm/is_compat.h index 19868588fbef..484c01def030 100644 --- a/arch/arm64/include/asm/is_compat.h +++ b/arch/arm64/include/asm/is_compat.h @@ -33,18 +33,44 @@ static inline int is_a32_compat_thread(struct thread_info *thread) #endif /* CONFIG_AARCH32_EL0 */ +#ifdef CONFIG_ARM64_ILP32 + +static inline int is_ilp32_compat_task(void) +{ + return test_thread_flag(TIF_32BIT_AARCH64); +} + +static inline int is_ilp32_compat_thread(struct thread_info *thread) +{ + return test_ti_thread_flag(thread, TIF_32BIT_AARCH64); +} + +#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 /* CONFIG_ARM64_ILP32 */ + #ifdef CONFIG_COMPAT static inline int is_compat_task(void) { - return is_a32_compat_task(); + return is_a32_compat_task() || is_ilp32_compat_task(); } #endif /* CONFIG_COMPAT */ static inline int is_compat_thread(struct thread_info *thread) { - return is_a32_compat_thread(thread); + return is_a32_compat_thread(thread) || is_ilp32_compat_thread(thread); } diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index 6d2d58daa9d7..8ed56630e6a5 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h @@ -94,6 +94,7 @@ void arch_release_task_struct(struct task_struct *tsk); #define TIF_32BIT 22 /* AARCH32 process */ #define TIF_SVE23 /* Scalable Vector Extension in use */ #define TIF_SVE_VL_INHERIT 24 /* Inherit sve_vl_onexec across exec */ +#define TIF_32BIT_AARCH64 25 /* 32 bit process on AArch64(ILP32) */ #define _TIF_SIGPENDING(1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) @@ -108,6 +109,7 @@ void arch_release_task_struct(struct task_struct *tsk); #define _TIF_FSCHECK (1 << TIF_FSCHECK) #define _TIF_32BIT (1 << TIF_32BIT) #define _TIF_SVE (1 << TIF_SVE) +#define _TIF_32BIT_AARCH64 (1 << TIF_32BIT_AARCH64) #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \ -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 16/24] arm64: ilp32: share aarch32 syscall handlers
According to userspace/kernel ABI, userspace off_t is passed in register pair just like in aarch32. In this patch corresponding aarch32 handlers are shared to ilp32 code. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/entry32.S| 80 arch/arm64/kernel/entry32_common.S | 97 ++ 3 files changed, 98 insertions(+), 80 deletions(-) create mode 100644 arch/arm64/kernel/entry32_common.S diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 3114191750ae..2dde9ae508ec 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,6 +29,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o +arm64-obj-$(CONFIG_COMPAT) += entry32_common.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/entry32.S b/arch/arm64/kernel/entry32.S index f332d5d1f6b4..4bede0324440 100644 --- a/arch/arm64/kernel/entry32.S +++ b/arch/arm64/kernel/entry32.S @@ -39,83 +39,3 @@ ENTRY(compat_sys_rt_sigreturn_wrapper) mov x0, sp b compat_sys_rt_sigreturn ENDPROC(compat_sys_rt_sigreturn_wrapper) - -ENTRY(compat_sys_statfs64_wrapper) - mov w3, #84 - cmp w1, #88 - cselw1, w3, w1, eq - b compat_sys_statfs64 -ENDPROC(compat_sys_statfs64_wrapper) - -ENTRY(compat_sys_fstatfs64_wrapper) - mov w3, #84 - cmp w1, #88 - cselw1, w3, w1, eq - b compat_sys_fstatfs64 -ENDPROC(compat_sys_fstatfs64_wrapper) - -/* - * Note: off_4k (w5) is always in units of 4K. If we can't do the - * requested offset because it is not page-aligned, we return -EINVAL. - */ -ENTRY(compat_sys_mmap2_wrapper) -#if PAGE_SHIFT > 12 - tst w5, #~PAGE_MASK >> 12 - b.ne1f - lsr w5, w5, #PAGE_SHIFT - 12 -#endif - b sys_mmap_pgoff -1: mov x0, #-EINVAL - ret -ENDPROC(compat_sys_mmap2_wrapper) - -/* - * Wrappers for AArch32 syscalls that either take 64-bit parameters - * in registers or that take 32-bit parameters which require sign - * extension. - */ -ENTRY(compat_sys_pread64_wrapper) - regs_to_64 x3, x4, x5 - b sys_pread64 -ENDPROC(compat_sys_pread64_wrapper) - -ENTRY(compat_sys_pwrite64_wrapper) - regs_to_64 x3, x4, x5 - b sys_pwrite64 -ENDPROC(compat_sys_pwrite64_wrapper) - -ENTRY(compat_sys_truncate64_wrapper) - regs_to_64 x1, x2, x3 - b sys_truncate -ENDPROC(compat_sys_truncate64_wrapper) - -ENTRY(compat_sys_ftruncate64_wrapper) - regs_to_64 x1, x2, x3 - b sys_ftruncate -ENDPROC(compat_sys_ftruncate64_wrapper) - -ENTRY(compat_sys_readahead_wrapper) - regs_to_64 x1, x2, x3 - mov w2, w4 - b sys_readahead -ENDPROC(compat_sys_readahead_wrapper) - -ENTRY(compat_sys_fadvise64_64_wrapper) - mov w6, w1 - regs_to_64 x1, x2, x3 - regs_to_64 x2, x4, x5 - mov w3, w6 - b sys_fadvise64_64 -ENDPROC(compat_sys_fadvise64_64_wrapper) - -ENTRY(compat_sys_sync_file_range2_wrapper) - regs_to_64 x2, x2, x3 - regs_to_64 x3, x4, x5 - b sys_sync_file_range2 -ENDPROC(compat_sys_sync_file_range2_wrapper) - -ENTRY(compat_sys_fallocate_wrapper) - regs_to_64 x2, x2, x3 - regs_to_64 x3, x4, x5 - b sys_fallocate -ENDPROC(compat_sys_fallocate_wrapper) diff --git a/arch/arm64/kernel/entry32_common.S b/arch/arm64/kernel/entry32_common.S new file mode 100644 index ..6ef4752162d0 --- /dev/null +++ b/arch/arm64/kernel/entry32_common.S @@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +/* + * Compat system call wrappers + * + * Copyright (C) 2012 ARM Ltd. + * Authors: Will Deacon <will.dea...@arm.com> + * Catalin Marinas <catalin.mari...@arm.com> + */ + +#include +#include + +#include +#include +#include +#include + +/* + * Note: off_4k (w5) is always in units of 4K. If we can't do the + * requested offset because it is not page-aligned, we return -EINVAL. + */ +ENTRY(compat_sys_mmap2_wrapper) +#if PAGE_SHIFT > 12 + tst w5, #~PAGE_MASK >> 12 + b.ne1f + lsr w5, w5, #PAGE_SHIFT - 12 +#endif + b sys_mmap_pgoff +1: mov x0, #-EINVAL + ret +ENDPROC(compat_sys_mmap2_wrapper) + +/* + * Wrappers for AArch32 syscalls that either take 64-bit parameters + * in registers or that take 32-bit parameters which require sign + * extension. +
[PATCH 15/24] arm64: ilp32: introduce binfmt_ilp32.c
Like binfmt_elf32.c for AARCH32, binfmt_ilp32.c is needed to handle ILP32 binaries. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamv2...@gmail.com> --- arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/binfmt_ilp32.c | 87 2 files changed, 88 insertions(+) create mode 100644 arch/arm64/kernel/binfmt_ilp32.c diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index c63e0164fc12..3114191750ae 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -28,6 +28,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o +arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c new file mode 100644 index ..26b2477d190d --- /dev/null +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/* + * Support for ILP32 Linux/aarch64 ELF binaries. + */ +#undef CONFIG_AARCH32_EL0 +#define compat_elf_gregset_t elf_gregset_t + +#include +#include + +#undef ELF_CLASS +#define ELF_CLASS ELFCLASS32 + +#undef elfhdr +#undef elf_phdr +#undef elf_shdr +#undef elf_note +#undef elf_addr_t +#define elfhdr elf32_hdr +#define elf_phdr elf32_phdr +#define elf_shdr elf32_shdr +#define elf_note elf32_note +#define elf_addr_t Elf32_Addr + +/* + * Some data types as stored in coredump. + */ +#define user_long_tcompat_long_t +#define user_siginfo_t compat_siginfo_t +#define copy_siginfo_to_user copy_siginfo_to_user32 + +/* + * The machine-dependent core note format types are defined in elfcore-compat.h, + * which requires asm/elf.h to define compat_elf_gregset_t et al. + */ +#define elf_prstatus compat_elf_prstatus +#define elf_prpsinfo compat_elf_prpsinfo + +/* AARCH64 ILP32 EABI. */ +#undef elf_check_arch +#define elf_check_arch(x) (((x)->e_machine == EM_AARCH64) \ + && (x)->e_ident[EI_CLASS] == ELFCLASS32) + +#undef SET_PERSONALITY +#define SET_PERSONALITY(ex)\ +do { \ + set_bit(TIF_32BIT, >mm->context.flags);\ + set_thread_flag(TIF_32BIT_AARCH64); \ + clear_thread_flag(TIF_32BIT); \ +} while (0) + +#undef ARCH_DLINFO +#define ARCH_DLINFO\ +do { \ + NEW_AUX_ENT(AT_SYSINFO_EHDR,\ + (elf_addr_t)(long)current->mm->context.vdso); \ +} while (0) + +#undef ELF_PLATFORM +#ifdef __AARCH64EB__ +#define ELF_PLATFORM ("aarch64_be:ilp32") +#else +#define ELF_PLATFORM ("aarch64:ilp32") +#endif + +#undef ELF_ET_DYN_BASE +#define ELF_ET_DYN_BASE COMPAT_ELF_ET_DYN_BASE + +#undef ELF_HWCAP +#undef ELF_HWCAP2 +#define ELF_HWCAP ((u32) elf_hwcap) +#define ELF_HWCAP2 ((u32) (elf_hwcap >> 32)) + +/* + * 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 + * might make some debugging less confusing not to duplicate them. + */ +#define elf_format compat_elf_format +#define init_elf_binfmtinit_compat_elf_binfmt +#define exit_elf_binfmtexit_compat_elf_binfmt + +#undef ns_to_timeval +#define ns_to_timeval ns_to_compat_timeval + +#include "../../../fs/binfmt_elf.c" -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 19/24] arm64: signal32: move ilp32 and aarch32 common code to separated file
ILP32 needs to mix 32bit struct siginfo and 64bit sigframe for its signal handlers. Move the existing compat code for copying siginfo to user space and manipulating signal masks into signal32_common.c so it can be used to deliver aarch32 and ilp32 signals. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/include/asm/signal32_common.h | 13 + arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/signal32.c | 23 +-- arch/arm64/kernel/signal32_common.c | 37 4 files changed, 52 insertions(+), 23 deletions(-) create mode 100644 arch/arm64/include/asm/signal32_common.h create mode 100644 arch/arm64/kernel/signal32_common.c diff --git a/arch/arm64/include/asm/signal32_common.h b/arch/arm64/include/asm/signal32_common.h new file mode 100644 index ..10bcdf6b8b4c --- /dev/null +++ b/arch/arm64/include/asm/signal32_common.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +#ifndef __ASM_SIGNAL32_COMMON_H +#define __ASM_SIGNAL32_COMMON_H + +#ifdef CONFIG_COMPAT + +int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set); +int get_sigset_t(sigset_t *set, const compat_sigset_t __user *uset); + +#endif /* CONFIG_COMPAT*/ + +#endif /* __ASM_SIGNAL32_COMMON_H */ diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index a6db407d4089..9e127c47a25c 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,7 +29,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o -arm64-obj-$(CONFIG_COMPAT) += entry32_common.o +arm64-obj-$(CONFIG_COMPAT) += entry32_common.o signal32_common.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c index 739e13b54820..fdcc210028b5 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -103,28 +104,6 @@ struct a32_rt_sigframe { #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) -static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set) -{ - compat_sigset_t cset; - - cset.sig[0] = set->sig[0] & 0xull; - cset.sig[1] = set->sig[0] >> 32; - - return copy_to_user(uset, , sizeof(*uset)); -} - -static inline int get_sigset_t(sigset_t *set, - const compat_sigset_t __user *uset) -{ - compat_sigset_t s32; - - if (copy_from_user(, uset, sizeof(*uset))) - return -EFAULT; - - set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); - return 0; -} - /* * VFP save/restore code. * diff --git a/arch/arm64/kernel/signal32_common.c b/arch/arm64/kernel/signal32_common.c new file mode 100644 index ..21995fc4e0b4 --- /dev/null +++ b/arch/arm64/kernel/signal32_common.c @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/* + * Based on arch/arm/kernel/signal.c + * + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Modified by Will Deacon <will.dea...@arm.com> + */ + +#include +#include +#include + +#include +#include + +int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set) +{ + compat_sigset_t cset; + + cset.sig[0] = set->sig[0] & 0xull; + cset.sig[1] = set->sig[0] >> 32; + + return copy_to_user(uset, , sizeof(*uset)); +} + +int get_sigset_t(sigset_t *set, const compat_sigset_t __user *uset) +{ + compat_sigset_t s32; + + if (copy_from_user(, uset, sizeof(*uset))) + return -EFAULT; + + set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); + return 0; +} -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 17/24] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it
From: Andrew Pinski <apin...@cavium.com> Add a separate syscall-table for ILP32, which dispatches either to native LP64 system call implementation or to compat-syscalls, as appropriate. Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamv2...@gmail.com> --- arch/arm64/include/asm/unistd.h | 8 ++- arch/arm64/include/uapi/asm/unistd.h | 12 arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/entry.S| 31 +- arch/arm64/kernel/sys_ilp32.c| 90 5 files changed, 137 insertions(+), 6 deletions(-) create mode 100644 arch/arm64/kernel/sys_ilp32.c diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index 99d29290c98b..1bf5572cd078 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -13,12 +13,16 @@ * 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_AARCH32_EL0 + +#ifdef CONFIG_COMPAT #define __ARCH_WANT_COMPAT_STAT64 +#define __ARCH_WANT_SYS_LLSEEK +#endif + +#ifdef CONFIG_AARCH32_EL0 #define __ARCH_WANT_SYS_GETHOSTNAME #define __ARCH_WANT_SYS_PAUSE #define __ARCH_WANT_SYS_GETPGRP -#define __ARCH_WANT_SYS_LLSEEK #define __ARCH_WANT_SYS_NICE #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK diff --git a/arch/arm64/include/uapi/asm/unistd.h b/arch/arm64/include/uapi/asm/unistd.h index 439b1c55c827..80f1cb4ae2e1 100644 --- a/arch/arm64/include/uapi/asm/unistd.h +++ b/arch/arm64/include/uapi/asm/unistd.h @@ -15,7 +15,19 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/* + * Use AARCH32 interface for sys_sync_file_range() as it passes 64-bit arguments. + */ +#if defined(__ILP32__) || defined(__SYSCALL_COMPAT) +#define __ARCH_WANT_SYNC_FILE_RANGE2 +#endif + +/* + * AARCH64/ILP32 is introduced after next syscalls were deprecated. + */ +#if !(defined(__ILP32__) || defined(__SYSCALL_COMPAT)) #define __ARCH_WANT_RENAMEAT #define __ARCH_WANT_SET_GET_RLIMIT +#endif #include diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 2dde9ae508ec..a6db407d4089 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -28,7 +28,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o -arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o +arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o arm64-obj-$(CONFIG_COMPAT) += entry32_common.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/entry.S b/arch/arm64/kernel/entry.S index 698907724eed..d03542418f9b 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -401,6 +401,23 @@ tsk.reqx28 // current thread_info .text +#ifdef CONFIG_ARM64_ILP32 +/* + * AARCH64/ILP32. Zero top halves of x0-x7 + * registers as userspace may put garbage there. + */ + .macro delouse_input_regs + mov w0, w0 + mov w1, w1 + mov w2, w2 + mov w3, w3 + mov w4, w4 + mov w5, w5 + mov w6, w6 + mov w7, w7 + .endm +#endif + /* * Exception vectors. */ @@ -695,6 +712,7 @@ el0_svc_compat: */ ldr x16, [tsk, #TSK_TI_FLAGS] // load thread flags adrpstbl, compat_sys_call_table // load compat syscall table pointer + ldr x19, [tsk, #TSK_TI_FLAGS] mov wscno, w7 // syscall number in w7 (r7) mov wsc_nr, #__NR_compat_syscalls b el0_svc_naked @@ -916,14 +934,15 @@ ENDPROC(ret_to_user) el0_svc: ldr x16, [tsk, #TSK_TI_FLAGS] // load thread flags adrpstbl, sys_call_table// load syscall table pointer + ldr x19, [tsk, #TSK_TI_FLAGS] mov wscno, w8 // syscall number in w8 mov wsc_nr, #__NR_syscalls #ifdef CONFIG_ARM64_SVE alternative_if_not ARM64_SVE - b el0_svc_naked + b el0_svc_select_table alternative_else_nop_endif - tbz x16, #TIF_SVE, el0_svc_naked// Skip unless TIF_SVE set: + tbz x16, #TIF_SVE, el0_svc_select_table // Skip unless TIF_SVE set: bic x16, x16, #_TIF_SVE // discard SVE state str x16, [tsk, #TSK_TI_FLAGS] @@ -939,12 +958,18 @@ alternative_else_nop_endif msr cpacr_el1, x9 // synchronised by eret to el0 #endif +el0_svc_select_table: +#ifdef CO
[PATCH 20/24] arm64: ilp32: introduce ilp32-specific sigframe and ucontext
From: Yury Norov <yno...@caviumnetworks.comk> ILP32 uses AARCH32 compat structures and syscall handlers for signals. But ILP32 rt_sigframe and ucontext structures differ from both LP64 and AARCH32. >From software point of view ILP32 is typical 32-bit compat ABI, and from hardware point of view, it's just like LP64. struct rt_sigframe defined in this patch in arch/arm64/kernel/signal_ilp32.c redefines one in arch/arm64/kernel/signal.c. And functions located in arch/arm64/include/signal_common.h pick up new structure to generate the code suitable for ILP32. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/include/asm/signal_ilp32.h | 23 ++ arch/arm64/kernel/Makefile| 3 +- arch/arm64/kernel/entry_ilp32.S | 12 + arch/arm64/kernel/signal_ilp32.c | 65 +++ 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 arch/arm64/include/asm/signal_ilp32.h create mode 100644 arch/arm64/kernel/entry_ilp32.S create mode 100644 arch/arm64/kernel/signal_ilp32.c diff --git a/arch/arm64/include/asm/signal_ilp32.h b/arch/arm64/include/asm/signal_ilp32.h new file mode 100644 index ..7ee97c133605 --- /dev/null +++ b/arch/arm64/include/asm/signal_ilp32.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +#ifndef __ASM_SIGNAL_ILP32_H +#define __ASM_SIGNAL_ILP32_H + +#ifdef CONFIG_ARM64_ILP32 + +#include + +int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, + struct pt_regs *regs); + +#else + +static inline int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, + sigset_t *set, struct pt_regs *regs) +{ + return -ENOSYS; +} + +#endif /* CONFIG_ARM64_ILP32 */ + +#endif /* __ASM_SIGNAL_ILP32_H */ diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 9e127c47a25c..27ddf5369f89 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -28,7 +28,8 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o -arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o +arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o \ + signal_ilp32.o entry_ilp32.o arm64-obj-$(CONFIG_COMPAT) += entry32_common.o signal32_common.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/entry_ilp32.S b/arch/arm64/kernel/entry_ilp32.S new file mode 100644 index ..562d5d0a7d82 --- /dev/null +++ b/arch/arm64/kernel/entry_ilp32.S @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +/* + * ILP32 system call wrappers + */ + +#include + +ENTRY(ilp32_sys_rt_sigreturn_wrapper) + mov x0, sp + b ilp32_sys_rt_sigreturn +ENDPROC(ilp32_sys_rt_sigreturn_wrapper) diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c new file mode 100644 index ..f4bcb7332010 --- /dev/null +++ b/arch/arm64/kernel/signal_ilp32.c @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/* + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2018 Cavium Networks. + * Yury Norov <yno...@caviumnetworks.com> + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#define get_sigset(s, m) get_sigset_t(s, m) +#define put_sigset(s, m) put_sigset_t(m, s) + +#define restore_altstack(stack) compat_restore_altstack(stack) +#define __save_altstack(stack, sp) __compat_save_altstack(stack, sp) +#define copy_siginfo_to_user(frame_info, ksig_info) \ + copy_siginfo_to_user32(frame_info, ksig_info) + +#define setup_return(regs, ka, user_layout, usig) \ +{ \ + __setup_return(regs, ka, user_layout, usig);\ + regs->regs[30] =\ + (unsigned long)VDSO_SYMBOL(current->mm->context.vdso, \ + sigtramp_ilp32);\ +} + +struct ilp32_ucontext { + u32 uc_flags; + u32 uc_link; + compat_stack_t uc_stack; + compat_sigset_t uc_sigmask; + /* glibc uses a 1024-bit sigset_t */ + __u8__unused[1024 / 8 - sizeof(compat_sigset_t)]; + /* last for future expansion */ + struct sigcontext uc_mcontext; +}; + +struct rt_sigframe { + struct compat_siginfo info; + struct ilp32_ucontext uc; +}; + +#include + +asmlinkage long ilp32_sys_rt_sigreturn(struct pt_regs *regs) +{ +
[PATCH 18/24] arm64: signal: share lp64 signal structures and routines to ilp32
Following patches of the series introduce ILP32-specific structures and handlers for signal subsystem. In this patch, functions and structures that common for LP64 and ILP32 are moved to arch/arm64/include/asm/signal_common.h to let ILP32 code reuse them. Some functions work with struct rt_sigframe which differs for ILP32. Therefore, to let ILP32 generate correct code, body of that functions are moved to arch/arm64/include/asm/signal_common.h. Others just declared in new header. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/include/asm/signal_common.h | 306 ++ arch/arm64/kernel/signal.c | 336 - 2 files changed, 359 insertions(+), 283 deletions(-) create mode 100644 arch/arm64/include/asm/signal_common.h diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h new file mode 100644 index ..84abe973e8b3 --- /dev/null +++ b/arch/arm64/include/asm/signal_common.h @@ -0,0 +1,306 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +/* + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2018 Cavium Networks. + */ + +#ifndef __ASM_SIGNAL_COMMON_H +#define __ASM_SIGNAL_COMMON_H + +#include +#include + +#define EXTRA_CONTEXT_SIZE round_up(sizeof(struct extra_context), 16) +#define TERMINATOR_SIZE round_up(sizeof(struct _aarch64_ctx), 16) +#define SIGCONTEXT_RESERVED_SIZE sizeof(((struct sigcontext *)0)->__reserved) +#define RT_SIGFRAME_RESERVED_OFFSET \ + offsetof(struct rt_sigframe, uc.uc_mcontext.__reserved) + +/* + * Sanity limit on the approximate maximum size of signal frame we'll + * try to generate. Stack alignment padding and the frame record are + * not taken into account. This limit is not a guarantee and is + * NOT ABI. + */ +#define SIGFRAME_MAXSZ SZ_64K + +struct rt_sigframe_user_layout { + void __user *sigframe; + struct frame_record __user *next_frame; + + unsigned long size; /* size of allocated sigframe data */ + unsigned long limit;/* largest allowed size */ + + unsigned long fpsimd_offset; + unsigned long esr_offset; + unsigned long sve_offset; + unsigned long extra_offset; + unsigned long end_offset; +}; + +struct user_ctxs { + struct fpsimd_context __user *fpsimd; + struct sve_context __user *sve; +}; + +struct frame_record { + u64 fp; + u64 lr; +}; + +void __user *apply_user_offset(struct rt_sigframe_user_layout const *user, + unsigned long offset); + +int setup_sigframe_layout(struct rt_sigframe_user_layout *user); +int setup_extra_context(char __user *sfp, unsigned long sf_size, + char __user *exprap); +int __parse_user_sigcontext(struct user_ctxs *user, + struct sigcontext __user const *sc, + void __user const *sigframe_base); +#define parse_user_sigcontext(user, sf) \ + __parse_user_sigcontext(user, &(sf)->uc.uc_mcontext, sf) + +int preserve_fpsimd_context(struct fpsimd_context __user *ctx); +int restore_fpsimd_context(struct fpsimd_context __user *ctx); + +#ifdef CONFIG_ARM64_SVE +int preserve_sve_context(struct sve_context __user *ctx); +int restore_sve_fpsimd_context(struct user_ctxs *user); +#else /* ! CONFIG_ARM64_SVE */ + +/* Turn any non-optimised out attempts to use these into a link error: */ +extern int preserve_sve_context(void __user *ctx); +extern int restore_sve_fpsimd_context(struct user_ctxs *user); + +#endif /* ! CONFIG_ARM64_SVE */ + +int sigframe_alloc(struct rt_sigframe_user_layout *user, + unsigned long *offset, size_t size); +int sigframe_alloc_end(struct rt_sigframe_user_layout *user); + +void __setup_return(struct pt_regs *regs, struct k_sigaction *ka, + struct rt_sigframe_user_layout *user, int usig); + +static void init_user_layout(struct rt_sigframe_user_layout *user) +{ + memset(user, 0, sizeof(*user)); + user->size = RT_SIGFRAME_RESERVED_OFFSET; + + user->limit = user->size + SIGCONTEXT_RESERVED_SIZE; + + user->limit -= TERMINATOR_SIZE; + user->limit -= EXTRA_CONTEXT_SIZE; + /* Reserve space for extension and terminator ^ */ +} + +static size_t sigframe_size(struct rt_sigframe_user_layout const *user) +{ + return round_up(max(user->size, sizeof(struct rt_sigframe)), 16); +} + +static int get_sigframe(struct rt_sigframe_user_layout *user, +struct ksignal *ksig, struct pt_regs *regs) +{ + unsigned long sp, sp_top; + int err; + + init_user_layout(user); + err = setup_sigframe_layout(user); + if (err) + return err; + + sp = sp_top = sigsp(regs->sp, ksig); + + sp = round_down(sp - sizeof(struct frame_record), 16); + user->next_frame = (struc
[PATCH 22/24] arm64:ilp32: add vdso-ilp32 and use for signal return
From: Philipp Tomsich <philipp.toms...@theobroma-systems.com> ILP32 VDSO exports following symbols: __kernel_rt_sigreturn; __kernel_gettimeofday; __kernel_clock_gettime; __kernel_clock_getres. What shared object to use, kernel selects depending on result of is_ilp32_compat_task() in arch/arm64/kernel/vdso.c, so it substitutes correct pages and spec. Adjusted to move the data page before code pages in sync with commit 601255ae3c98 ("arm64: vdso: move data page before code pages") Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamv2...@gmail.com> --- arch/arm64/Makefile | 3 + arch/arm64/include/asm/vdso.h | 6 ++ arch/arm64/kernel/Makefile| 1 + arch/arm64/kernel/asm-offsets.c | 7 ++ arch/arm64/kernel/vdso-ilp32/.gitignore | 2 + arch/arm64/kernel/vdso-ilp32/Makefile | 82 ++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S | 22 + arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S | 84 +++ arch/arm64/kernel/vdso.c | 61 -- arch/arm64/kernel/vdso/gettimeofday.S | 20 - arch/arm64/kernel/vdso/vdso.S | 6 +- 11 files changed, 280 insertions(+), 14 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/Makefile b/arch/arm64/Makefile index b481b4a7c011..55fb91420ebc 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -160,6 +160,9 @@ archclean: prepare: vdso_prepare vdso_prepare: prepare0 $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso include/generated/vdso-offsets.h +ifeq ($(CONFIG_ARM64_ILP32), y) + $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso-ilp32 include/generated/vdso-ilp32-offsets.h +endif define archhelp echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h index 839ce0031bd5..33a4e10014aa 100644 --- a/arch/arm64/include/asm/vdso.h +++ b/arch/arm64/include/asm/vdso.h @@ -29,6 +29,12 @@ #include +#ifdef CONFIG_ARM64_ILP32 +#include +#else +#define vdso_offset_sigtramp_ilp32 ({ BUILD_BUG(); 0; }) +#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 27ddf5369f89..6510dad702d0 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -62,6 +62,7 @@ arm64-obj-$(CONFIG_HARDEN_BRANCH_PREDICTOR) += bpi.o endif obj-y += $(arm64-obj-y) vdso/ probes/ +obj-$(CONFIG_ARM64_ILP32) += vdso-ilp32/ obj-m += $(arm64-obj-m) head-y := head.o extra-y+= $(head-y) vmlinux.lds diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index a416c2333e2f..54c9768dd964 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -124,6 +124,13 @@ int main(void) DEFINE(TSPEC_TV_SEC, offsetof(struct timespec, tv_sec)); DEFINE(TSPEC_TV_NSEC,offsetof(struct timespec, tv_nsec)); BLANK(); +#ifdef CONFIG_COMPAT + DEFINE(COMPAT_TVAL_TV_SEC, offsetof(struct compat_timeval, tv_sec)); + DEFINE(COMPAT_TVAL_TV_USEC, offsetof(struct compat_timeval, tv_usec)); + DEFINE(COMPAT_TSPEC_TV_SEC, offsetof(struct compat_timespec, tv_sec)); + DEFINE(COMPAT_TSPEC_TV_NSEC, offsetof(struct compat_timespec, tv_nsec)); + BLANK(); +#endif DEFINE(TZ_MINWEST, offsetof(struct timezone, tz_minuteswest)); DEFINE(TZ_DSTTIME, offsetof(struct timezone, tz_dsttime)); BLANK(); diff --git a/arch/arm64/kernel/vdso-ilp32/.gitignore b/arch/arm64/kernel/vdso-ilp32/.gitignore new file mode 100644 index ..61806c3fd68b --- /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 ..e372740e43b5 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/Makefile @@ -0,0 +1,82 @@ +# SPDX-License-Identifier: GPL-2.0+ + +# +# Building a vDSO image for AArch64. +# +# Author: Will Deacon <will.dea...@arm.com> +# Heavily based on the vDSO Makefiles for oth
[PATCH 23/24] arm64:ilp32: add ARM64_ILP32 to Kconfig
From: Andrew Pinski <apin...@cavium.com> This patch adds the config option for ILP32. Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Reviewed-by: David Daney <dda...@caviumnetworks.com> --- arch/arm64/Kconfig | 9 - 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 0685754a9f7b..a3134b8e3123 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1226,7 +1226,7 @@ source "fs/Kconfig.binfmt" config COMPAT def_bool y - depends on AARCH32_EL0 + depends on AARCH32_EL0 || ARM64_ILP32 config AARCH32_EL0 bool "Kernel support for 32-bit EL0" @@ -1247,6 +1247,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 COMPAT && SYSVIPC -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 24/24] arm64: ilp32: Make the Kconfig option default y
From: Catalin Marinas <catalin.mari...@arm.com> The intention of the ILP32 branches is to enable ILP32 by default. This default is to be revisited for upstream merging. Signed-off-by: Catalin Marinas <catalin.mari...@arm.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index a3134b8e3123..3551990a2726 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1249,6 +1249,7 @@ config AARCH32_EL0 config ARM64_ILP32 bool "Kernel support for ILP32" + default y 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 -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 21/24] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32
ILP32 has context-related structures different from both aarch32 and aarch64/lp64. In this patch compat_arch_ptrace() renamed to compat_a32_ptrace(), and compat_arch_ptrace() only makes choice between compat_a32_ptrace() and new compat_ilp32_ptrace() handler. compat_ilp32_ptrace() calls generic compat_ptrace_request() for all requests except PTRACE_GETSIGMASK and PTRACE_SETSIGMASK, which need special handling. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamv2...@gmail.com> --- arch/arm64/kernel/ptrace.c | 21 +++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 4d0a541d049b..da7f47c7e586 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -1038,9 +1038,11 @@ static const struct user_regset_view user_aarch64_view = { .regsets = aarch64_regsets, .n = ARRAY_SIZE(aarch64_regsets) }; -#ifdef CONFIG_AARCH32_EL0 +#ifdef CONFIG_COMPAT #include +#endif +#ifdef CONFIG_AARCH32_EL0 enum compat_regset { REGSET_COMPAT_GPR, REGSET_COMPAT_VFP, @@ -1503,7 +1505,7 @@ 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, +static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, compat_ulong_t caddr, compat_ulong_t cdata) { unsigned long addr = caddr; @@ -1580,8 +1582,23 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, return ret; } + +#else +#define compat_a32_ptrace(child, request, caddr, cdata) (0) #endif /* CONFIG_AARCH32_EL0 */ +#ifdef CONFIG_COMPAT +long compat_arch_ptrace(struct task_struct *child, compat_long_t request, + compat_ulong_t caddr, compat_ulong_t cdata) +{ + if (is_a32_compat_task()) + return compat_a32_ptrace(child, request, caddr, cdata); + + /* ILP32 */ + return compat_ptrace_request(child, request, caddr, cdata); +} +#endif + const struct user_regset_view *task_user_regset_view(struct task_struct *task) { #ifdef CONFIG_AARCH32_EL0 -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 13/24] arm64: introduce binfmt_elf32.c
As we support more than one compat formats, it looks more reasonable to not use fs/compat_binfmt.c. Custom binfmt_elf32.c allows to move aarch32 specific definitions there and make code more maintainable and readable. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/Kconfig | 1 - arch/arm64/include/asm/elf.h | 26 +++- arch/arm64/include/asm/hwcap.h | 2 -- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/binfmt_elf32.c | 35 5 files changed, 39 insertions(+), 27 deletions(-) create mode 100644 arch/arm64/kernel/binfmt_elf32.c diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index a16916be20f5..0685754a9f7b 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1232,7 +1232,6 @@ config AARCH32_EL0 bool "Kernel support for 32-bit EL0" def_bool y depends on ARM64_4K_PAGES || EXPERT - select COMPAT_BINFMT_ELF if BINFMT_ELF select HAVE_UID16 select OLD_SIGSUSPEND3 select COMPAT_OLD_SIGACTION diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 023b2fbc1454..f04b27bd9bb6 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -175,36 +175,16 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, /* PIE load location for compat arm. Must match ARM ELF_ET_DYN_BASE. */ #define COMPAT_ELF_ET_DYN_BASE 0x00040UL +#endif /*CONFIG_COMPAT */ +#ifdef CONFIG_AARCH32_EL0 /* AArch32 registers. */ #define COMPAT_ELF_NGREG 18 typedef unsigned int compat_elf_greg_t; typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; - -/* AArch32 EABI. */ -#define EF_ARM_EABI_MASK 0xff00 -#define compat_elf_check_arch(x) (system_supports_32bit_el0() && \ -((x)->e_machine == EM_ARM) && \ -((x)->e_flags & EF_ARM_EABI_MASK)) - -#define compat_start_threadcompat_start_thread -/* - * Unlike the native SET_PERSONALITY macro, the compat version maintains - * READ_IMPLIES_EXEC across an execve() since this is the behaviour on - * arch/arm/. - */ -#define COMPAT_SET_PERSONALITY(ex) \ -({ \ - clear_thread_flag(TIF_32BIT_AARCH64); \ - set_thread_flag(TIF_32BIT); \ - }) -#define COMPAT_ARCH_DLINFO extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp); -#define compat_arch_setup_additional_pages \ - aarch32_setup_vectors_page - -#endif /* CONFIG_COMPAT */ +#endif /* CONFIG_AARCH32_EL0 */ #endif /* !__ASSEMBLY__ */ diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 2c7fc5d89813..99dfd9277559 100644 --- a/arch/arm64/include/asm/hwcap.h +++ b/arch/arm64/include/asm/hwcap.h @@ -47,8 +47,6 @@ #define ELF_HWCAP (elf_hwcap) #ifdef CONFIG_AARCH32_EL0 -#define COMPAT_ELF_HWCAP (compat_elf_hwcap) -#define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; #endif diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index cff1a78bdf4c..c63e0164fc12 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -27,7 +27,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE $(call if_changed,objcopy) arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ - sys_compat.o entry32.o + sys_compat.o entry32.o binfmt_elf32.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c new file mode 100644 index ..440fa84f62b3 --- /dev/null +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/* + * Support for AArch32 Linux ELF binaries. + */ + +/* AArch32 EABI. */ +#define EF_ARM_EABI_MASK 0xff00 + +#define compat_start_threadcompat_start_thread +/* + * Unlike the native SET_PERSONALITY macro, the compat version inherits + * READ_IMPLIES_EXEC across a fork() since this is the behaviour on + * arch/arm/. + */ +#define COMPAT_SET_PERSONALITY(ex) \ +({ \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + set_thread_flag(TIF_32BIT);
[PATCH 07/24] arm64: ilp32: add documentation on the ILP32 ABI for ARM64
Based on Andrew Pinski's patch-series. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- Documentation/arm64/ilp32.txt | 45 +++ 1 file changed, 45 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 ..d0fd5109c4b2 --- /dev/null +++ b/Documentation/arm64/ilp32.txt @@ -0,0 +1,45 @@ +ILP32 AARCH64 SYSCALL ABI += + +This document describes the ILP32 syscall ABI and where it differs +from the generic compat linux syscall interface. + +AARCH64/ILP32 userspace can pass garbage in the top halve of w0-w7 registers +(syscall arguments). So top 32 bits are zeroed for them. + +Comparing to AARCH32, AARCH64/ILP32 has 64-bit length of following types: +ino_t is u64 type. +off_t is s64 type. +blkcnt_tis s64 type. +fsblkcnt_t is u64 type. +fsfilcnt_t is u64 type. +rlim_t is u64 type. + +AARCH64/ILP32 ABI uses standard syscall table which can be found at +include/uapi/asm-generic/unistd.h, with the exceptions listed below. + +Syscalls which pass 64-bit values are handled by the code shared from +AARCH32 and pass that value as a pair. Following syscalls are affected: +fadvise64_64() +fallocate() +ftruncate64() +pread64() +pwrite64() +readahead() +sync_file_range() +truncate64() + +ptrace() syscall is handled by compat version. + +shmat() syscall is handled by non-compat handler as aarch64/ilp32 has no +limitation on 4-pages alignment for shared memory. + +statfs() and fstatfs() take the size of struct statfs as an argument. +It is calculated differently in kernel and user spaces. So AARCH32 handlers +are taken to handle it. + +struct rt_sigframe is redefined and contains struct compat_siginfo, +as compat syscalls expect, and struct ilp32_ucontext, to handle +AARCH64 register set and 32-bit userspace register representation. + +elf_gregset_t is taken from lp64 to handle registers properly. -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 08/24] arm64: rename COMPAT to AARCH32_EL0 in Kconfig
From: Andrew Pinski <apin...@cavium.com> In this patchset ILP32 ABI support is added. Additionally to AARCH32, which is binary-compatible with ARM, ILP32 is (mostly) ABI-compatible. >From now, AARCH32_EL0 (former COMPAT) config option means the support of AARCH32 userspace, and ARM64_ILP32 - support of ILP32 ABI (see following patches), and COMPAT indicates that one of them or both is enabled. Where needed, CONFIG_COMPAT is changed over to use CONFIG_AARCH32_EL0 instead. Reviewed-by: David Daney <dda...@caviumnetworks.com> Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Bamvor Jian Zhang <bamv2...@gmail.com> --- arch/arm64/Kconfig | 9 +++-- arch/arm64/include/asm/fpsimd.h | 2 +- arch/arm64/include/asm/hwcap.h | 4 ++-- arch/arm64/include/asm/processor.h | 6 +++--- arch/arm64/include/asm/ptrace.h | 2 +- arch/arm64/include/asm/seccomp.h | 2 +- arch/arm64/include/asm/signal32.h| 6 -- arch/arm64/include/asm/unistd.h | 2 +- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/asm-offsets.c | 2 +- arch/arm64/kernel/cpufeature.c | 8 arch/arm64/kernel/cpuinfo.c | 8 arch/arm64/kernel/entry.S| 6 +++--- arch/arm64/kernel/head.S | 2 +- arch/arm64/kernel/perf_callchain.c | 6 +++--- arch/arm64/kernel/ptrace.c | 8 arch/arm64/kernel/traps.c| 2 +- arch/arm64/kernel/vdso.c | 4 ++-- drivers/clocksource/arm_arch_timer.c | 2 +- 19 files changed, 45 insertions(+), 38 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 7381eeb7ef8e..a16916be20f5 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -433,7 +433,7 @@ config ARM64_ERRATUM_834220 config ARM64_ERRATUM_845719 bool "Cortex-A53: 845719: a load might read incorrect data" - depends on COMPAT + depends on AARCH32_EL0 default y help This option adds an alternative code sequence to work around ARM @@ -906,7 +906,7 @@ config HARDEN_BRANCH_PREDICTOR menuconfig ARMV8_DEPRECATED bool "Emulate deprecated/obsolete ARMv8 instructions" - depends on COMPAT + depends on AARCH32_EL0 depends on SYSCTL help Legacy software support may require certain instructions @@ -1225,7 +1225,12 @@ menu "Userspace binary formats" source "fs/Kconfig.binfmt" config COMPAT + def_bool y + depends on AARCH32_EL0 + +config AARCH32_EL0 bool "Kernel support for 32-bit EL0" + def_bool y depends on ARM64_4K_PAGES || EXPERT select COMPAT_BINFMT_ELF if BINFMT_ELF select HAVE_UID16 diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h index 8857a0f0d0f7..0971bf730d44 100644 --- a/arch/arm64/include/asm/fpsimd.h +++ b/arch/arm64/include/asm/fpsimd.h @@ -49,7 +49,7 @@ struct fpsimd_state { unsigned int cpu; }; -#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_MASK0xf89f #define VFP_FPSCR_CTRL_MASK0x07f79f00 diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 400b80b49595..2c7fc5d89813 100644 --- a/arch/arm64/include/asm/hwcap.h +++ b/arch/arm64/include/asm/hwcap.h @@ -46,7 +46,7 @@ */ #define ELF_HWCAP (elf_hwcap) -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define COMPAT_ELF_HWCAP (compat_elf_hwcap) #define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; @@ -54,7 +54,7 @@ extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; enum { CAP_HWCAP = 1, -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 CAP_COMPAT_HWCAP, CAP_COMPAT_HWCAP2, #endif diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index fce604e3e599..79cbc385f52a 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -104,7 +104,7 @@ struct cpu_context { struct thread_struct { struct cpu_context cpu_context;/* cpu context */ unsigned long tp_value; /* TLS register */ -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 unsigned long tp2_value; #endif struct fpsimd_state fpsimd_state; @@ -126,7 +126,7 @@ static inline void arch_thread_struct_whitelist(unsigned long *offs
[PATCH 04/24] 32-bit userspace ABI: introduce ARCH_32BIT_OFF_T config option
All new 32-bit architectures should have 64-bit userspace off_t type, but existing architectures has 32-bit ones. To enforce the rule, new config option is added to arch/Kconfig that defaults ARCH_32BIT_OFF_T to be disabled for new 32-bit architectures. All existing 32-bit architectures enable it explicitly. New option affects force_o_largefile() behaviour. Namely, if userspace off_t is 64-bits long, we have no reason to reject user to open big files. Note that even if architectures has only 64-bit off_t in the kernel (arc, c6x, h8300, hexagon, metag, nios2, openrisc, tile32 and unicore32), a libc may use 32-bit off_t, and therefore want to limit the file size to 4GB unless specified differently in the open flags. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Acked-by: Arnd Bergmann <a...@arndb.de> --- arch/Kconfig| 15 +++ arch/arc/Kconfig| 1 + arch/arm/Kconfig| 1 + arch/blackfin/Kconfig | 1 + arch/cris/Kconfig | 1 + arch/frv/Kconfig| 1 + arch/h8300/Kconfig | 1 + arch/hexagon/Kconfig| 1 + arch/m32r/Kconfig | 1 + arch/m68k/Kconfig | 1 + arch/metag/Kconfig | 1 + arch/microblaze/Kconfig | 1 + arch/mips/Kconfig | 1 + arch/mn10300/Kconfig| 1 + arch/nios2/Kconfig | 1 + arch/openrisc/Kconfig | 1 + arch/parisc/Kconfig | 1 + arch/powerpc/Kconfig| 1 + arch/score/Kconfig | 1 + arch/sh/Kconfig | 1 + arch/sparc/Kconfig | 1 + arch/tile/Kconfig | 1 + arch/unicore32/Kconfig | 1 + arch/x86/Kconfig| 1 + arch/x86/um/Kconfig | 1 + arch/xtensa/Kconfig | 1 + include/linux/fcntl.h | 2 +- 27 files changed, 41 insertions(+), 1 deletion(-) diff --git a/arch/Kconfig b/arch/Kconfig index 76c0b54443b1..ee079244dc3c 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -264,6 +264,21 @@ config ARCH_THREAD_STACK_ALLOCATOR config ARCH_WANTS_DYNAMIC_TASK_STRUCT bool +config ARCH_32BIT_OFF_T + bool + depends on !64BIT + help + All new 32-bit architectures should have 64-bit off_t type on + userspace side which corresponds to the loff_t kernel type. This + is the requirement for modern ABIs. Some existing architectures + already have 32-bit off_t. This option is enabled for all such + architectures explicitly. Namely: arc, arm, blackfin, cris, frv, + h8300, hexagon, m32r, m68k, metag, microblaze, mips32, mn10300, + nios2, openrisc, parisc32, powerpc32, score, sh, sparc, tile32, + unicore32, x86_32 and xtensa. This is the complete list. Any + new 32-bit architecture should declare 64-bit off_t type on user + side and so should not enable this option. + config HAVE_REGS_AND_STACK_ACCESS_API bool help diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index d76bf4a83740..9b48c82a12f6 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig @@ -11,6 +11,7 @@ config ARC select ARC_TIMERS select ARCH_HAS_SG_CHAIN select ARCH_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC + select ARCH_32BIT_OFF_T select BUILDTIME_EXTABLE_SORT select CLONE_BACKWARDS select COMMON_CLK diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 7e3d53575486..825a611a9d86 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -2,6 +2,7 @@ config ARM bool default y + select ARCH_32BIT_OFF_T select ARCH_CLOCKSOURCE_DATA select ARCH_DISCARD_MEMBLOCK if !HAVE_ARCH_PFN_VALID && !KEXEC select ARCH_HAS_DEBUG_VIRTUAL if MMU diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index d9c2866ba618..5a99c1ccad67 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig @@ -13,6 +13,7 @@ config RWSEM_XCHGADD_ALGORITHM config BLACKFIN def_bool y + select ARCH_32BIT_OFF_T select HAVE_ARCH_KGDB select HAVE_ARCH_TRACEHOOK select HAVE_DYNAMIC_FTRACE diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index cd5a0865c97f..db7ea0a9e805 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig @@ -54,6 +54,7 @@ config LOCKDEP_SUPPORT config CRIS bool default y + select ARCH_32BIT_OFF_T select HAVE_IDE select GENERIC_ATOMIC64 select HAVE_UID16 diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig index af369b05fed5..9dc671f8f4a6 100644 --- a/arch/frv/Kconfig +++ b/arch/frv/Kconfig @@ -2,6 +2,7 @@ config FRV bool default y + select ARCH_32BIT_OFF_T select HAVE_IDE select HAVE_ARCH_TRACEHOOK select HAVE_PERF_EVENTS diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig index 091d6d04b5e5..6fc8a034ddb6 100644 --- a/arch/h8300/Kconfig +++ b/arch/h8300/Kconfig @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 config H8300 def_bool y + select ARCH_32BIT_OFF_T select GENERIC_ATOMIC64 select HAVE_
[PATCH 06/24] thread: move thread bits accessors to separated file
Thread bits may be accessed from low-level code, so isolating is a measure to avoid circular dependencies in header files. The exact reason for circular dependency is WARN_ON() macro added in patch edd63a27 "set_restore_sigmask() is never called without SIGPENDING (and never should be)" Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- include/linux/sched.h | 1 + include/linux/thread_bits.h | 76 + include/linux/thread_info.h | 64 +-- 3 files changed, 78 insertions(+), 63 deletions(-) create mode 100644 include/linux/thread_bits.h diff --git a/include/linux/sched.h b/include/linux/sched.h index b161ef8a902e..c1bddf06baed 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -27,6 +27,7 @@ #include #include #include +#include /* task_struct member predeclarations (sorted alphabetically): */ struct audit_context; diff --git a/include/linux/thread_bits.h b/include/linux/thread_bits.h new file mode 100644 index ..7512f8527e9a --- /dev/null +++ b/include/linux/thread_bits.h @@ -0,0 +1,76 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +/* Common low-level thread bits accessors */ + +#ifndef _LINUX_THREAD_BITS_H +#define _LINUX_THREAD_BITS_H + +#ifndef __ASSEMBLY__ + +/* + * For per-arch arch_within_stack_frames() implementations, defined in + * asm/thread_info.h. + */ +enum { + BAD_STACK = -1, + NOT_STACK = 0, + GOOD_FRAME, + GOOD_STACK, +}; + +#include +#include + +#ifdef CONFIG_THREAD_INFO_IN_TASK +/* + * For CONFIG_THREAD_INFO_IN_TASK kernels we need for the + * definition of current, but for !CONFIG_THREAD_INFO_IN_TASK kernels, + * including can cause a circular dependency on some platforms. + */ +#include +#define current_thread_info() ((struct thread_info *)current) +#endif + +/* + * flag set/clear/test wrappers + * - pass TIF_ constants to these functions + */ + +static inline void set_ti_thread_flag(struct thread_info *ti, int flag) +{ + set_bit(flag, (unsigned long *)>flags); +} + +static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) +{ + clear_bit(flag, (unsigned long *)>flags); +} + +static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_and_set_bit(flag, (unsigned long *)>flags); +} + +static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_and_clear_bit(flag, (unsigned long *)>flags); +} + +static inline int test_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_bit(flag, (unsigned long *)>flags); +} + +#define set_thread_flag(flag) \ + set_ti_thread_flag(current_thread_info(), flag) +#define clear_thread_flag(flag) \ + clear_ti_thread_flag(current_thread_info(), flag) +#define test_and_set_thread_flag(flag) \ + test_and_set_ti_thread_flag(current_thread_info(), flag) +#define test_and_clear_thread_flag(flag) \ + test_and_clear_ti_thread_flag(current_thread_info(), flag) +#define test_thread_flag(flag) \ + test_ti_thread_flag(current_thread_info(), flag) + +#endif /* !__ASSEMBLY__ */ +#endif /* _LINUX_THREAD_BITS_H */ diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h index 34f053a150a9..793ab9b290ad 100644 --- a/include/linux/thread_info.h +++ b/include/linux/thread_info.h @@ -11,30 +11,9 @@ #include #include #include - -#ifdef CONFIG_THREAD_INFO_IN_TASK -/* - * For CONFIG_THREAD_INFO_IN_TASK kernels we need for the - * definition of current, but for !CONFIG_THREAD_INFO_IN_TASK kernels, - * including can cause a circular dependency on some platforms. - */ -#include -#define current_thread_info() ((struct thread_info *)current) -#endif +#include #include - -/* - * For per-arch arch_within_stack_frames() implementations, defined in - * asm/thread_info.h. - */ -enum { - BAD_STACK = -1, - NOT_STACK = 0, - GOOD_FRAME, - GOOD_STACK, -}; - #include #ifdef __KERNEL__ @@ -49,47 +28,6 @@ enum { # define THREADINFO_GFP(GFP_KERNEL_ACCOUNT) #endif -/* - * flag set/clear/test wrappers - * - pass TIF_ constants to these functions - */ - -static inline void set_ti_thread_flag(struct thread_info *ti, int flag) -{ - set_bit(flag, (unsigned long *)>flags); -} - -static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) -{ - clear_bit(flag, (unsigned long *)>flags); -} - -static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_and_set_bit(flag, (unsigned long *)>flags); -} - -static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_and_clear_bit(flag, (unsigned long *)>flags); -} - -static inline int test_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_bit(flag, (unsigned long *)>flags); -} - -#define set_
Re: [PATCH v9 00/24] ILP32 for ARM64
Hi all, On Tue, May 15, 2018 at 10:11:50PM +0300, Yury Norov wrote: > This series enables AARCH64 with ILP32 mode. > > As supporting work, it introduces ARCH_32BIT_OFF_T configuration > option that is enabled for existing 32-bit architectures but disabled > for new arches (so 64-bit off_t userspace type is used by new userspace). > Also it deprecates getrlimit and setrlimit syscalls prior to prlimit64. > > Based on kernel v4.16. Tested with LTP, glibc testsuite, trinity, lmbench, > CPUSpec. > > This series on github: > https://github.com/norov/linux/tree/ilp32-4.16 > Linaro toolchain: > http://snapshots.linaro.org/components/toolchain/binaries/7.3-2018.04-rc1/aarch64-linux-gnu_ilp32/ > Debian repo: > http://people.linaro.org/~wookey/ilp32/ > OpenSUSE repo: > https://build.opensuse.org/project/show/devel:ARM:Factory:Contrib:ILP32 > > Changes: > v3: https://lkml.org/lkml/2014/9/3/704 > v4: https://lkml.org/lkml/2015/4/13/691 > v5: https://lkml.org/lkml/2015/9/29/911 > v6: https://lkml.org/lkml/2016/5/23/661 > v7: https://lkml.org/lkml/2017/1/9/213 > v8: https://lkml.org/lkml/2017/6/19/624 > v9: - rebased on top of v4.16; > - signal subsystem reworked to avoid code duplication, as requested > by Dave Martin (patches 18 and 20); > - new files introduced in series use SPDX notation for license; > - linux-api and linux-arch CCed as the series changes kernel ABI; > - checkpatch and other minor fixes. My mail server seems broken. I will try to submit series tomorroe again. Sorry for noise. Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 01/24] arm64: signal: Make parse_user_sigframe() independent of rt_sigframe layout
From: Dave Martin <dave.mar...@arm.com> ILP32 uses the same struct sigcontext as the native ABI (i.e., LP64), but a different layout for the rest of the signal frame (since siginfo_t and ucontext_t are both ABI-dependent). Since the purpose of parse_user_sigframe() is really to parse sigcontext and not the whole signal frame, the function does not need to depend on the layout of rt_sigframe -- the only purpose of the rt_sigframe pointer is for use as a base to measure the signal frame size. So, this patch renames the function to make it clear that only the sigcontext is really being parsed, and makes the sigframe base pointer generic. A macro is defined to provide a suitable duck-typed interface that can be used with both sigframe definitions. Suggested-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Dave Martin <dave.mar...@arm.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/kernel/signal.c | 14 -- 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index f60c052e8d1c..65406218743c 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -334,17 +334,16 @@ extern int restore_sve_fpsimd_context(struct user_ctxs *user); #endif /* ! CONFIG_ARM64_SVE */ - -static int parse_user_sigframe(struct user_ctxs *user, - struct rt_sigframe __user *sf) +static int __parse_user_sigcontext(struct user_ctxs *user, + struct sigcontext __user const *sc, + void __user const *sigframe_base) { - struct sigcontext __user *const sc = >uc.uc_mcontext; struct _aarch64_ctx __user *head; char __user *base = (char __user *)>__reserved; size_t offset = 0; size_t limit = sizeof(sc->__reserved); bool have_extra_context = false; - char const __user *const sfp = (char const __user *)sf; + char const __user *const sfp = (char const __user *)sigframe_base; user->fpsimd = NULL; user->sve = NULL; @@ -493,6 +492,9 @@ static int parse_user_sigframe(struct user_ctxs *user, return -EINVAL; } +#define parse_user_sigcontext(user, sf) \ + __parse_user_sigcontext(user, &(sf)->uc.uc_mcontext, sf) + static int restore_sigframe(struct pt_regs *regs, struct rt_sigframe __user *sf) { @@ -518,7 +520,7 @@ static int restore_sigframe(struct pt_regs *regs, err |= !valid_user_regs(>user_regs, current); if (err == 0) - err = parse_user_sigframe(, sf); + err = parse_user_sigcontext(, sf); if (err == 0) { if (!user.fpsimd) -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 02/24] ptrace: Add compat PTRACE_{G,S}ETSIGMASK handlers
From: James Morse <james.mo...@arm.com> compat_ptrace_request() lacks handlers for PTRACE_{G,S}ETSIGMASK, instead using those in ptrace_request(). The compat variant should read a compat_sigset_t from userspace instead of ptrace_request()s sigset_t. While compat_sigset_t is the same size as sigset_t, it is defined as 2xu32, instead of a single u64. On a big-endian CPU this means that compat_sigset_t is passed to user-space using middle-endianness, where the least-significant u32 is written most significant byte first. If ptrace_request()s code is used userspace will read the most significant u32 where it expected the least significant. Instead of duplicating ptrace_request()s code as a special case in the arch code, handle it here. Fixes: 29000caecbe87 ("ptrace: add ability to get/set signal-blocked mask") CC: Andrey Vagin <ava...@openvz.org> Reported-by: Zhou Chengming <zhouchengmi...@huawei.com> Signed-off-by: James Morse <james.mo...@arm.com> Yury: Replace sigset_{to,from}_compat() with new {get,put}_compat_sigset() Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- kernel/ptrace.c | 48 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 21fec73d45d4..214944d7c268 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -880,6 +880,22 @@ static int ptrace_regset(struct task_struct *task, int req, unsigned int type, EXPORT_SYMBOL_GPL(task_user_regset_view); #endif +static int ptrace_setsigmask(struct task_struct *child, sigset_t *new_set) +{ + sigdelsetmask(new_set, sigmask(SIGKILL)|sigmask(SIGSTOP)); + + /* +* Every thread does recalc_sigpending() after resume, so +* retarget_shared_pending() and recalc_sigpending() are not +* called here. +*/ + spin_lock_irq(>sighand->siglock); + child->blocked = *new_set; + spin_unlock_irq(>sighand->siglock); + + return 0; +} + int ptrace_request(struct task_struct *child, long request, unsigned long addr, unsigned long data) { @@ -951,18 +967,7 @@ int ptrace_request(struct task_struct *child, long request, break; } - sigdelsetmask(_set, sigmask(SIGKILL)|sigmask(SIGSTOP)); - - /* -* Every thread does recalc_sigpending() after resume, so -* retarget_shared_pending() and recalc_sigpending() are not -* called here. -*/ - spin_lock_irq(>sighand->siglock); - child->blocked = new_set; - spin_unlock_irq(>sighand->siglock); - - ret = 0; + ret = ptrace_setsigmask(child, _set); break; } @@ -1181,6 +1186,7 @@ int compat_ptrace_request(struct task_struct *child, compat_long_t request, { compat_ulong_t __user *datap = compat_ptr(data); compat_ulong_t word; + sigset_t new_set; siginfo_t siginfo; int ret; @@ -1221,6 +1227,24 @@ int compat_ptrace_request(struct task_struct *child, compat_long_t request, else ret = ptrace_setsiginfo(child, ); break; + case PTRACE_GETSIGMASK: + if (addr != sizeof(compat_sigset_t)) + return -EINVAL; + + ret = put_compat_sigset((compat_sigset_t __user *) datap, + >blocked, sizeof(compat_sigset_t)); + break; + case PTRACE_SETSIGMASK: + if (addr != sizeof(compat_sigset_t)) + return -EINVAL; + + ret = get_compat_sigset(_set, + (compat_sigset_t __user *) datap); + if (ret) + break; + + ret = ptrace_setsigmask(child, _set); + break; #ifdef CONFIG_HAVE_ARCH_TRACEHOOK case PTRACE_GETREGSET: case PTRACE_SETREGSET: -- 2.17.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v9 00/24] ILP32 for ARM64
This series enables AARCH64 with ILP32 mode. As supporting work, it introduces ARCH_32BIT_OFF_T configuration option that is enabled for existing 32-bit architectures but disabled for new arches (so 64-bit off_t userspace type is used by new userspace). Also it deprecates getrlimit and setrlimit syscalls prior to prlimit64. Based on kernel v4.16. Tested with LTP, glibc testsuite, trinity, lmbench, CPUSpec. This series on github: https://github.com/norov/linux/tree/ilp32-4.16 Linaro toolchain: http://snapshots.linaro.org/components/toolchain/binaries/7.3-2018.04-rc1/aarch64-linux-gnu_ilp32/ Debian repo: http://people.linaro.org/~wookey/ilp32/ OpenSUSE repo: https://build.opensuse.org/project/show/devel:ARM:Factory:Contrib:ILP32 Changes: v3: https://lkml.org/lkml/2014/9/3/704 v4: https://lkml.org/lkml/2015/4/13/691 v5: https://lkml.org/lkml/2015/9/29/911 v6: https://lkml.org/lkml/2016/5/23/661 v7: https://lkml.org/lkml/2017/1/9/213 v8: https://lkml.org/lkml/2017/6/19/624 v9: - rebased on top of v4.16; - signal subsystem reworked to avoid code duplication, as requested by Dave Martin (patches 18 and 20); - new files introduced in series use SPDX notation for license; - linux-api and linux-arch CCed as the series changes kernel ABI; - checkpatch and other minor fixes. Andrew Pinski (4): arm64: rename COMPAT to AARCH32_EL0 in Kconfig arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it arm64:ilp32: add ARM64_ILP32 to Kconfig Catalin Marinas (1): arm64: ilp32: Make the Kconfig option default y Dave Martin (1): arm64: signal: Make parse_user_sigframe() independent of rt_sigframe layout James Morse (1): ptrace: Add compat PTRACE_{G,S}ETSIGMASK handlers Philipp Tomsich (1): arm64:ilp32: add vdso-ilp32 and use for signal return Yury Norov (16): compat ABI: use non-compat openat and open_by_handle_at variants 32-bit userspace ABI: introduce ARCH_32BIT_OFF_T config option asm-generic: Drop getrlimit and setrlimit syscalls from default list thread: move thread bits accessors to separated file arm64: ilp32: add documentation on the ILP32 ABI for ARM64 arm64: rename functions that reference compat term arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64 arm64: introduce binfmt_elf32.c arm64: change compat_elf_hwcap and compat_elf_hwcap2 prefix to a32 arm64: ilp32: introduce binfmt_ilp32.c arm64: ilp32: share aarch32 syscall handlers arm64: signal: share lp64 signal structures and routines to ilp32 arm64: signal32: move ilp32 and aarch32 common code to separated file arm64: ilp32: introduce ilp32-specific sigframe and ucontext arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 Documentation/arm64/ilp32.txt | 45 +++ arch/Kconfig | 15 + arch/arc/Kconfig | 1 + arch/arc/include/uapi/asm/unistd.h| 1 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig| 18 +- arch/arm64/Makefile | 3 + arch/arm64/include/asm/compat.h | 19 +- arch/arm64/include/asm/elf.h | 36 +- arch/arm64/include/asm/fpsimd.h | 2 +- arch/arm64/include/asm/ftrace.h | 2 +- arch/arm64/include/asm/hwcap.h| 8 +- arch/arm64/include/asm/is_compat.h| 78 arch/arm64/include/asm/processor.h| 15 +- arch/arm64/include/asm/ptrace.h | 12 +- arch/arm64/include/asm/seccomp.h | 2 +- arch/arm64/include/asm/signal32.h | 19 +- arch/arm64/include/asm/signal32_common.h | 13 + arch/arm64/include/asm/signal_common.h| 306 +++ arch/arm64/include/asm/signal_ilp32.h | 23 ++ arch/arm64/include/asm/syscall.h | 2 +- arch/arm64/include/asm/thread_info.h | 4 +- arch/arm64/include/asm/unistd.h | 6 +- arch/arm64/include/asm/vdso.h | 6 + arch/arm64/include/uapi/asm/bitsperlong.h | 9 +- arch/arm64/include/uapi/asm/unistd.h | 13 + arch/arm64/kernel/Makefile| 8 +- arch/arm64/kernel/armv8_deprecated.c | 6 +- arch/arm64/kernel/asm-offsets.c | 9 +- arch/arm64/kernel/binfmt_elf32.c | 35 ++ arch/arm64/kernel/binfmt_ilp32.c | 87 + arch/arm64/kernel/cpufeature.c| 28 +- arch/arm64/kernel/cpuinfo.c | 18 +- arch/arm64/kernel/debug-monitors.c| 4 +- arch/arm64/kernel/entry.S | 37 +- arch/arm64/kernel/entry32.S | 80 arch/arm64/kernel/entry32_common.S| 97 + arch/arm64/kernel
Re: [PATCH v16 06/13] task_isolation: userspace hard isolation from kernel
Hi Chris, On Fri, Nov 03, 2017 at 01:04:45PM -0400, Chris Metcalf wrote: > The existing nohz_full mode is designed as a "soft" isolation mode > that makes tradeoffs to minimize userspace interruptions while > still attempting to avoid overheads in the kernel entry/exit path, > to provide 100% kernel semantics, etc. > > However, some applications require a "hard" commitment from the > kernel to avoid interruptions, in particular userspace device driver > style applications, such as high-speed networking code. > > This change introduces a framework to allow applications > to elect to have the "hard" semantics as needed, specifying > prctl(PR_TASK_ISOLATION, PR_TASK_ISOLATION_ENABLE) to do so. > > The kernel must be built with the new TASK_ISOLATION Kconfig flag > to enable this mode, and the kernel booted with an appropriate > "nohz_full=CPULIST isolcpus=CPULIST" boot argument to enable > nohz_full and isolcpus. The "task_isolation" state is then indicated > by setting a new task struct field, task_isolation_flag, to the > value passed by prctl(), and also setting a TIF_TASK_ISOLATION > bit in the thread_info flags. When the kernel is returning to > userspace from the prctl() call and sees TIF_TASK_ISOLATION set, > it calls the new task_isolation_start() routine to arrange for > the task to avoid being interrupted in the future. > > With interrupts disabled, task_isolation_start() ensures that kernel > subsystems that might cause a future interrupt are quiesced. If it > doesn't succeed, it adjusts the syscall return value to indicate that > fact, and userspace can retry as desired. In addition to stopping > the scheduler tick, the code takes any actions that might avoid > a future interrupt to the core, such as a worker thread being > scheduled that could be quiesced now (e.g. the vmstat worker) > or a future IPI to the core to clean up some state that could be > cleaned up now (e.g. the mm lru per-cpu cache). > > Once the task has returned to userspace after issuing the prctl(), > if it enters the kernel again via system call, page fault, or any > other exception or irq, the kernel will kill it with SIGKILL. > In addition to sending a signal, the code supports a kernel > command-line "task_isolation_debug" flag which causes a stack > backtrace to be generated whenever a task loses isolation. > > To allow the state to be entered and exited, the syscall checking > test ignores the prctl(PR_TASK_ISOLATION) syscall so that we can > clear the bit again later, and ignores exit/exit_group to allow > exiting the task without a pointless signal being delivered. > > The prctl() API allows for specifying a signal number to use instead > of the default SIGKILL, to allow for catching the notification > signal; for example, in a production environment, it might be > helpful to log information to the application logging mechanism > before exiting. Or, the signal handler might choose to reset the > program counter back to the code segment intended to be run isolated > via prctl() to continue execution. > > In a number of cases we can tell on a remote cpu that we are > going to be interrupting the cpu, e.g. via an IPI or a TLB flush. > In that case we generate the diagnostic (and optional stack dump) > on the remote core to be able to deliver better diagnostics. > If the interrupt is not something caught by Linux (e.g. a > hypervisor interrupt) we can also request a reschedule IPI to > be sent to the remote core so it can be sure to generate a > signal to notify the process. > > Separate patches that follow provide these changes for x86, tile, > arm, and arm64. > > Signed-off-by: Chris Metcalf> --- > Documentation/admin-guide/kernel-parameters.txt | 6 + > include/linux/isolation.h | 175 +++ > include/linux/sched.h | 4 + > include/uapi/linux/prctl.h | 6 + > init/Kconfig| 28 ++ > kernel/Makefile | 1 + > kernel/context_tracking.c | 2 + > kernel/isolation.c | 402 > > kernel/signal.c | 2 + > kernel/sys.c| 6 + > 10 files changed, 631 insertions(+) > create mode 100644 include/linux/isolation.h > create mode 100644 kernel/isolation.c [...] > + * This routine is called from syscall entry, prevents most syscalls > + * from executing, and if needed raises a signal to notify the process. > + * > + * Note that we have to stop isolation before we even print a message > + * here, since otherwise we might end up reporting an interrupt due to > + * kicking the printk handling code, rather than reporting the true > + * cause of interrupt here. > + */ > +int task_isolation_syscall(int syscall) > +{ All callers of this function call it like this: if (work & _TIF_TASK_ISOLATION)
Re: [PATCH v16 00/13] support "task_isolation" mode
> disabled, so that's what we're doing in the patch series now. > > However, it doesn't seem possible to do the synchronous cancellation of > the vmstat deferred work with irqs disabled, though if there's a way, > it would be a little cleaner to do that; Christoph? We can certainly > update the statistics with interrupts disabled via > refresh_cpu_vm_stats(false), but that's not sufficient. For now, I > just issue the cancellation during sys_prctl() call, and then if it > isn't synchronized by the time we are exiting to userspace, we just > jam in an EAGAIN and let userspace retry. In practice, this doesn't > seem to ever happen. > > > What about using a per-cpu flag to stop doing new deferred work? > > Andy also suggested we could structure the code to have the prctl() > set a per-cpu flag to stop adding new future work (e.g. vmstat per-cpu > data, or lru page cache). Then, we could flush those structures right > from the sys_prctl() call, and when we were returning to user space, > we'd be confident that there wasn't going to be any new work added. > > With the current set of things that we are disabling for task > isolation, though, it didn't seem necessary. Quiescing the vmstat > shepherd seems like it is generally pretty safe since we will likely > be able to sync up the per-cpu cache and kill the deferred work with > high probability, with no expectation that additional work will show > up. And since we can flush the LRU page cache with interrupts > disabled, that turns out not to be an issue either. > > I could imagine that if we have to deal with some new kind of deferred > work, we might find the per-cpu flag becomes a good solution, but for > now we don't have a good use case for that approach. > > > How about stopping the dyn tick? > > Right now we try to stop it on return to userspace, but if we can't, > we just return EAGAIN to userspace. In practice, what I see is that > usually the tick stops immediately, but occasionally it doesn't; in > this case I've always seen that nr_running is >1, presumably with some > temporary kernel worker threads, and the user code just needs to call > prctl() until those threads are done. We could structure things with > a completion that we wait for, which is set by the timer code when it > finally does stop the tick, but this may be overkill, particularly > since we'll only be running this prctl() loop from userspace on cores > where we have no other useful work that we're trying to run anyway. > > > What about TLB flushing? > > We talked about this at Plumbers and some of the email discussion also > was about TLB flushing. I haven't tried to add it to this patch set, > because I really want to avoid scope creep; in any case, I think I > managed to convince Andy that he was going to work on it himself. :) > Paul McKenney already contributed some framework for such a patch, in > commit b8c17e6664c4 ("rcu: Maintain special bits at bottom of > ->dynticks counter"). > > What about that d*mn 1 Hz clock? > > It's still there, so this code still requires some further work before > it can actually get a process into long-term task isolation (without > the obvious one-line kernel hack). Frederic suggested a while ago > forcing updates on cpustats was required as the last gating factor; do > we think that is still true? Christoph was working on this at one > point - any progress from your point of view? I tested your series on ThunderX 2 machine. When I run 10 giga-ticks test, it always passed. If I run for more, the test exits like this: # time ./isolation 1000 /sys devices: OK (using task isolation cpu 100) prctl unaffinitized: OK prctl on cpu 0: OK ==> hello, world test_off: OK Received signal 11 successfully test_segv: OK test_fault: OK test_fault (SIGUSR1): OK test_syscall: OK test_syscall (SIGUSR1): OK test_schedule: OK test_schedule (SIGUSR1): OK testing task isolation jitter for 1 ticks ERROR: Program unexpectedly entered kernel. INFO: loop times: 1 cycles (count: 128606844716) 2 cycles (count: 31558352292) 3 cycles (count: 4) 29 cycles (count: 437) 30 cycles (count: 1874) 31 cycles (count: 221) 57 cycles (count: 4) 58 cycles (count: 6) 59 cycles (count: 1) real 15m58.643s user 15m58.626s sys 0m0.012s I pass task_isolation_debug to boot parameters: # cat /proc/cmdline BOOT_IMAGE=/boot/Image-isol nohz_full=100-110 isolcpus=100-110 task_isolation_debug root=UUID=75b9dd5b-58d8-4a50-8868-004cb7c1f25f ro text But dmesg looks empty... I investigate it, but at now I have no ideas what happens. Have you seen that before? Anyway, we are going to include your test in our scenario, with some modifications. I've added --dry-run option to make it easier to demonstrate the effect of isolation on jitt
Re: [PATCH v8 00/20] ILP32 for ARM64
Hi Catalin, all (Exclude Bamvor as his email became invalid) This is 4.15-based kernel. https://github.com/norov/linux/commits/ilp32-4.15 I tested it with LTP, no regressions found. Kernel v4.15 incorporates SVE series from Dave Martin, so I updated ILP32 patches to agree with it. SVE-related changes are mostly in patches: arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext arm64: signal32: move ilp32 and aarch32 common code to separated file arm64: signal: share lp64 signal structures and routines to ilp32 arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it Dave kindly reviewed that patches and proposed improvements: https://www.spinics.net/lists/arm-kernel/msg629221.html There's no ABI-related changes proposed, or urgent fixes; so I'll rework signal subsystem during 4.16 cycle. Are there any news with upstreaming this series? Thanks, Yury On Mon, Jun 19, 2017 at 06:49:43PM +0300, Yury Norov wrote: > This series enables aarch64 with ilp32 mode. > > As supporting work, it introduces ARCH_32BIT_OFF_T configuration > option that is enabled for existing 32-bit architectures but disabled > for new arches (so 64-bit off_t userspace type is used by new userspace). > Also it deprecates getrlimit and setrlimit syscalls prior to prlimit64. > > This version is based on linux-next from 2017-06-16. It works with > glibc-2.25, and tested with LTP, glibc testsuite, trinity, lmbench, > CPUSpec. > > Patches 1, 2, 3 and 8 are general, and may be applied separately. > > Kernel, GLIBC and OpenSUSE-based distro: > https://github.com/norov/linux/tree/ilp32-20170616.0 > https://github.com/norov/glibc/tree/dev9 > https://build.opensuse.org/project/show/devel:ARM:Factory:Contrib:ILP32 > > (GLIBC patches are managed by Steve Ellcey, so my tree is only for > reference.) > > Changes: > v3: https://lkml.org/lkml/2014/9/3/704 > v4: https://lkml.org/lkml/2015/4/13/691 > v5: https://lkml.org/lkml/2015/9/29/911 > v6: https://lkml.org/lkml/2016/5/23/661 > v7: https://lkml.org/lkml/2017/1/9/213 > v8: - off_t referred in patches 2 and 13 stands for userspace type which is > underlined in corresponding patch comments and ARCH_32BIT_OFF_T config > option description; > - __IGNORE_getrlimit and __IGNORE_setrlimit are added to > scripts/checksyscalls.sh (patch 3); > - for CONFIG_COMPAT, bool changed to def_bool y and 'select COMPAT' is > dropped for AARCH32_EL0 and ARM64_ILP32 optiond (patches 5 and 20); > - x19 register is used to load TSK_TI_FLAGS in svc path in > arch/arm64/kernel/entry.S to avoid register clobbering (patch 14). > - ilp32 vdso-related files are syncronized wirh lp64 ones, mostly > Makefiles > (patch 19); > - in arch/arm64/mm/mmap.c, arch_mmap_rnd() swithed to use is_compat_task() > (patch 9); > - rebased on next-20170616. > > Andrew Pinski (6): > arm64: rename COMPAT to AARCH32_EL0 in Kconfig > arm64: ensure the kernel is compiled for LP64 > arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 > arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use > it > arm64: ilp32: introduce ilp32-specific handlers for sigframe and > ucontext > arm64:ilp32: add ARM64_ILP32 to Kconfig > > Philipp Tomsich (1): > arm64:ilp32: add vdso-ilp32 and use for signal return > > Yury Norov (13): > compat ABI: use non-compat openat and open_by_handle_at variants > 32-bit userspace ABI: introduce ARCH_32BIT_OFF_T config option > asm-generic: Drop getrlimit and setrlimit syscalls from default list > arm64: ilp32: add documentation on the ILP32 ABI for ARM64 > thread: move thread bits accessors to separated file > arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) > arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64 > arm64: introduce binfmt_elf32.c > arm64: ilp32: introduce binfmt_ilp32.c > arm64: ilp32: share aarch32 syscall handlers > arm64: signal: share lp64 signal routines to ilp32 > arm64: signal32: move ilp32 and aarch32 common code to separated file > arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 > > Documentation/arm64/ilp32.txt | 45 +++ > arch/Kconfig | 15 +++ > arch/arc/Kconfig | 1 + > arch/arc/include/uapi/asm/unistd.h| 1 + > arch/arm/Kconfig | 1 + > arch/arm64/Kconfig| 17 ++- > arch/arm64/Makefile | 8 ++ > arch/arm64/include/asm/compat.h | 19 +-- > arch/arm64/include/asm/elf.h | 40 ++ > arch/arm64/include/asm/
Re: [PATCH v8 00/20] ILP32 for ARM64
Hi Catalin, Arnd, all, This is ILP32 patches on top of 4.14 kernel: https://github.com/norov/linux/commits/ilp32-4.14 I tested the series with LTP lite built by Linaro toolchain, and no regressions found. By the way, do you have plans to upstream arch subseries? https://lkml.org/lkml/2017/9/25/574 Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] arm64: fix documentation on kernel pages mappings to HYP VA
On Wed, Sep 27, 2017 at 10:13:33AM +0100, Will Deacon wrote: > On Wed, Sep 27, 2017 at 09:31:41AM +0100, Marc Zyngier wrote: > > On Tue, Sep 26 2017 at 9:45:42 pm BST, Yury Norov > > <yno...@caviumnetworks.com> wrote: > > > On Wed, Sep 13, 2017 at 09:08:30PM +0300, Yury Norov wrote: > > >> The Documentation/arm64/memory.txt says: > > >> When using KVM, the hypervisor maps kernel pages in EL2, at a fixed > > >> offset from the kernel VA (top 24bits of the kernel VA set to zero): > > >> > > >> In fact, kernel addresses are transleted to HYP with kern_hyp_va macro, > > >> which has more options, and none of them assumes clearing of top 24bits > > >> of the kernel VA. > > >> > > >> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> > > >> --- > > >> Documentation/arm64/memory.txt | 15 +-- > > >> 1 file changed, 9 insertions(+), 6 deletions(-) > > >> > > >> diff --git a/Documentation/arm64/memory.txt > > >> b/Documentation/arm64/memory.txt > > >> index d7273a5f6456..c39895d7e3a2 100644 > > >> --- a/Documentation/arm64/memory.txt > > >> +++ b/Documentation/arm64/memory.txt > > >> @@ -86,9 +86,12 @@ Translation table lookup with 64KB pages: > > >> +-> [63] TTBR0/1 > > >> > > >> > > >> -When using KVM, the hypervisor maps kernel pages in EL2, at a fixed > > >> -offset from the kernel VA (top 24bits of the kernel VA set to zero): > > >> - > > >> -Start End SizeUse > > >> > > >> -0040007f 256GB kernel > > >> objects mapped in HYP > > >> +When using KVM without Virtualization Host Extensions, the hypervisor > > >> maps > > >> +kernel pages in EL2, at a fixed offset from the kernel VA. Namely, top > > >> 16 > > >> +or 25 bits of the kernel VA set to zero depending on ARM64_VA_BITS_48 or > > >> +ARM64_VA_BITS_39 config option selected; or top 17 or 26 bits of the > > >> kernel > > >> +VA set to zero if CPU has Reduced HYP mapping offset capability. See > > >> +kern_hyp_va macro. > > > > What is this "Reduced HYP mapping offset capability"? This is the description of ARM64_HYP_OFFSET_LOW capability in arch/arm64/kernel/cpufeature.c > > You're missing the point that the location of the EL2 mapping is > > conditioned by the location of the identity mapping that is used to > > bring up / tear down KVM. You have to express the VA transformation in > > terms of both VA_BITS (and there is more cases than just 39 or 48 bits) > > *and* the idmap address, not to mention the case where KVM's VA_BITS is > > larger than the rest of the kernel. See the extensive blurb in > > kvm_mmu.h. > > > > >> + > > >> +When using KVM with Virtualization Host Extensions, no additional > > >> mappings > > >> +created as host kernel already operates in EL2. > > > > This bit is fine. > > FWIW, I was going to queue a simplified version along the lines of the patch > below. > > Will Thanks. Yury > --->8 > > commit dbf7393b7738a0ba0284551e7b6e014cfb100661 > Author: Yury Norov <yno...@caviumnetworks.com> > Date: Wed Sep 13 21:08:30 2017 +0300 > > arm64: fix documentation on kernel pages mappings to HYP VA > > The Documentation/arm64/memory.txt says: > When using KVM, the hypervisor maps kernel pages in EL2, at a fixed > offset from the kernel VA (top 24bits of the kernel VA set to zero): > > In fact, kernel addresses are transleted to HYP with kern_hyp_va macro, > which has more options, and none of them assumes clearing of top 24bits > of the kernel VA. > > Signed-off-by: Yury Norov <yno...@caviumnetworks.com> > [will: removed gory details] > Signed-off-by: Will Deacon <will.dea...@arm.com> > > diff --git a/Documentation/arm64/memory.txt b/Documentation/arm64/memory.txt > index d7273a5f6456..ea9ee39784a2 100644 > --- a/Documentation/arm64/memory.txt > +++ b/Documentation/arm64/memory.txt > @@ -86,9 +86,9 @@ Translation table lookup with 64KB pages: > +-> [63] TTBR0/1 > > > -When using KVM, the hypervisor maps kernel pages in EL2, at a fixed
Re: [PATCH] Documentation: kernel-api: add bitmap operations from linux/bitmap.h
On Sun, Sep 17, 2017 at 07:07:10PM -0700, Randy Dunlap wrote: > From: Randy Dunlap <rdun...@infradead.org> > > Add to kernel-api Bitmap Operations section. > Fix kernel-doc nitpicks in . > > Signed-off-by: Randy Dunlap <rdun...@infradead.org> > Cc: Yury Norov <yno...@caviumnetworks.com> Acked-by: Yury Norov <yno...@caviumnetworks.com> > --- > Documentation/core-api/kernel-api.rst |3 +++ > include/linux/bitmap.h|9 + > 2 files changed, 8 insertions(+), 4 deletions(-) > > --- lnx-414-rc1.orig/Documentation/core-api/kernel-api.rst > +++ lnx-414-rc1/Documentation/core-api/kernel-api.rst > @@ -59,6 +59,9 @@ Bitmap Operations > .. kernel-doc:: lib/bitmap.c > :internal: > > +.. kernel-doc:: include/linux/bitmap.h > + :internal: > + > Command-line Parsing > > > --- lnx-414-rc1.orig/include/linux/bitmap.h > +++ lnx-414-rc1/include/linux/bitmap.h > @@ -360,8 +360,9 @@ static inline int bitmap_parse(const cha > return __bitmap_parse(buf, buflen, 0, maskp, nmaskbits); > } > > -/* > +/** > * BITMAP_FROM_U64() - Represent u64 value in the format suitable for bitmap. > + * @n: u64 value > * > * Linux bitmaps are internally arrays of unsigned longs, i.e. 32-bit > * integers in 32-bit environment, and 64-bit integers in 64-bit one. > @@ -392,14 +393,14 @@ static inline int bitmap_parse(const cha > ((unsigned long) ((u64)(n) >> 32)) > #endif > > -/* > +/** > * bitmap_from_u64 - Check and swap words within u64. > * @mask: source bitmap > * @dst: destination bitmap > * > - * In 32-bit Big Endian kernel, when using (u32 *)()[*] > + * In 32-bit Big Endian kernel, when using ``(u32 *)()[*]`` > * to read u64 mask, we will get the wrong word. > - * That is "(u32 *)()[0]" gets the upper 32 bits, > + * That is ``(u32 *)()[0]`` gets the upper 32 bits, > * but we expect the lower 32-bits of u64. > */ > static inline void bitmap_from_u64(unsigned long *dst, u64 mask) > -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v8 00/20] ILP32 for ARM64
Hi all, Linaro has announced the support for ILP32-enabled cross-toolchain: https://lists.linaro.org/pipermail/linaro-toolchain/2017-September/006247.html Files: http://snapshots.linaro.org/components/toolchain/binaries/7.1-2017.08-rc1/aarch64-linux-gnu_ilp32/ Yury On Mon, Jun 19, 2017 at 06:49:43PM +0300, Yury Norov wrote: > This series enables aarch64 with ilp32 mode. > > As supporting work, it introduces ARCH_32BIT_OFF_T configuration > option that is enabled for existing 32-bit architectures but disabled > for new arches (so 64-bit off_t userspace type is used by new userspace). > Also it deprecates getrlimit and setrlimit syscalls prior to prlimit64. > > This version is based on linux-next from 2017-06-16. It works with > glibc-2.25, and tested with LTP, glibc testsuite, trinity, lmbench, > CPUSpec. > > Patches 1, 2, 3 and 8 are general, and may be applied separately. > > Kernel, GLIBC and OpenSUSE-based distro: > https://github.com/norov/linux/tree/ilp32-20170616.0 > https://github.com/norov/glibc/tree/dev9 > https://build.opensuse.org/project/show/devel:ARM:Factory:Contrib:ILP32 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] arm64: fix documentation on kernel pages mappings to HYP VA
The Documentation/arm64/memory.txt says: When using KVM, the hypervisor maps kernel pages in EL2, at a fixed offset from the kernel VA (top 24bits of the kernel VA set to zero): In fact, kernel addresses are transleted to HYP with kern_hyp_va macro, which has more options, and none of them assumes clearing of top 24bits of the kernel VA. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- Documentation/arm64/memory.txt | 15 +-- 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Documentation/arm64/memory.txt b/Documentation/arm64/memory.txt index d7273a5f6456..c39895d7e3a2 100644 --- a/Documentation/arm64/memory.txt +++ b/Documentation/arm64/memory.txt @@ -86,9 +86,12 @@ Translation table lookup with 64KB pages: +-> [63] TTBR0/1 -When using KVM, the hypervisor maps kernel pages in EL2, at a fixed -offset from the kernel VA (top 24bits of the kernel VA set to zero): - -Start End SizeUse -0040 007f 256GB kernel objects mapped in HYP +When using KVM without Virtualization Host Extensions, the hypervisor maps +kernel pages in EL2, at a fixed offset from the kernel VA. Namely, top 16 +or 25 bits of the kernel VA set to zero depending on ARM64_VA_BITS_48 or +ARM64_VA_BITS_39 config option selected; or top 17 or 26 bits of the kernel +VA set to zero if CPU has Reduced HYP mapping offset capability. See +kern_hyp_va macro. + +When using KVM with Virtualization Host Extensions, no additional mappings +created as host kernel already operates in EL2. -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v8 00/20] ILP32 for ARM64
On Mon, Aug 21, 2017 at 01:21:24PM +0300, Yury Norov wrote: > On Tue, Aug 08, 2017 at 02:34:11PM +0100, Catalin Marinas wrote: > > On Mon, Jul 24, 2017 at 02:26:24PM +0300, Yury Norov wrote: > > > This is the 4.12 and linux-next - based kernel patches: > > > https://github.com/norov/linux/tree/ilp32-4.12 > > > https://github.com/norov/linux/tree/ilp32-20170724 > > > > I published the 4.12 branch here: > > > > https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git/log/?h=staging/ilp32-4.12 > > > > (or git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git > > staging/ilp32-4.12) > > > > There are two patches on top, one to fix SET_PERSONALITY and the other > > to make ILP32 default y since you'd expect people using this branch to > > need such option enabled. > > > > I'll publish a 4.13-based branch when the corresponding kernel version > > is released. > > Hi Catalin, > > This is the rc-6 based ilp32 series: > https://github.com/norov/linux/tree/ilp32-4.13-rc6 > > It includes latest version of SET_PERSONALITY() rework: > https://www.spinics.net/lists/arm-kernel/msg602005.html > > All patches prior to 3fc85ee96eb8 ("arm64: ilp32: add documentation on > the ILP32 ABI for ARM64") are looking not ilp32-specific and may be > applied independently. > > It also includes your patch "arm64: ilp32: Make the Kconfig option > default y" on the top of series. > > Yury Hi Catalin, all, This is 4.13-based and next-20170901-based ilp32 patches. https://github.com/norov/linux/tree/ilp32-4.13 https://github.com/norov/linux/tree/ilp32-20170901 Next-based series includes the patch that moves TASK_* definitions to Also, Szabolcs has created arm/ilp32 branch for glibc. https://sourceware.org/glibc/wiki/GlibcGit/arm_namespace Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v8 00/20] ILP32 for ARM64
On Tue, Aug 08, 2017 at 02:34:11PM +0100, Catalin Marinas wrote: > On Mon, Jul 24, 2017 at 02:26:24PM +0300, Yury Norov wrote: > > This is the 4.12 and linux-next - based kernel patches: > > https://github.com/norov/linux/tree/ilp32-4.12 > > https://github.com/norov/linux/tree/ilp32-20170724 > > I published the 4.12 branch here: > > https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git/log/?h=staging/ilp32-4.12 > > (or git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git > staging/ilp32-4.12) > > There are two patches on top, one to fix SET_PERSONALITY and the other > to make ILP32 default y since you'd expect people using this branch to > need such option enabled. > > I'll publish a 4.13-based branch when the corresponding kernel version > is released. Hi Catalin, This is the rc-6 based ilp32 series: https://github.com/norov/linux/tree/ilp32-4.13-rc6 It includes latest version of SET_PERSONALITY() rework: https://www.spinics.net/lists/arm-kernel/msg602005.html All patches prior to 3fc85ee96eb8 ("arm64: ilp32: add documentation on the ILP32 ABI for ARM64") are looking not ilp32-specific and may be applied independently. It also includes your patch "arm64: ilp32: Make the Kconfig option default y" on the top of series. Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v8 00/20] ILP32 for ARM64
Hi Catalin, On Thu, Jul 27, 2017 at 06:12:22PM +0100, Catalin Marinas wrote: > Hi Yury, > > On Mon, Jul 24, 2017 at 02:26:24PM +0300, Yury Norov wrote: [...] > > This is the 4.12 and linux-next - based kernel patches: > > https://github.com/norov/linux/tree/ilp32-4.12 > > https://github.com/norov/linux/tree/ilp32-20170724 > > Thanks. I'll publish the 4.12-based branch sometime next week. > > At this stage I don't see much value in a linux-next based ILP32. I > would rather like to see a 4.13-rc3 based one, in preparation for a 4.13 > branch once released. > > > Should I resend kernel patches to LKML, or links above are enough for > > you? > > The 4.12 link is ok. However, could you please post a 4.13-rcX based > series, maybe split in two so that a few generic patches can be merged > in 4.14? This is the 4.13-rc3 - based branch: https://github.com/norov/linux/tree/ilp32-4.13-rc3 Patches prior to 52315bc30f4967 ("arm64: ilp32: add documentation on the ILP32 ABI for ARM64") are looking like generic. Note that this series includes the patch "ptrace: Add compat PTRACE_{G,S}ETSIGMASK handlers": https://patchwork.kernel.org/patch/9817343/ It is still under discussion in maillist. If it will be rejected, we'd rework arm64 ptrace accordingly. > Given the reworking of the sigcontext code in 4.13, it would be > good to review the ILP32 changes in this area again. Thanks, I forgot to mention it in previous email. Changes are mostly located in patches d87e8ed73d59 ("arm64: signal: share lp64 signal structures and routines to ilp32") and 99c30e5df3f4 ("arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext"). All reviews are appreciated. Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v8 00/20] ILP32 for ARM64
Hi Catalin, Hope you spent your vacation well. On Fri, Jul 07, 2017 at 06:11:36PM +0100, Catalin Marinas wrote: > Hi Yury, > > Just a quick reply as I'm about to go on holiday for the next two weeks. > > On Fri, Jul 07, 2017 at 12:59:02AM +0300, Yury Norov wrote: > > On Thu, Jun 29, 2017 at 05:10:36PM +0100, Catalin Marinas wrote: > > > On Mon, Jun 19, 2017 at 06:49:43PM +0300, Yury Norov wrote: > > > > This series enables aarch64 with ilp32 mode. > > > > > > What I'd like to propose is that Will and I (as arm64 maintainers, maybe > > > with with the help of others including this series' authors) take over > > > the series and push it to a staging branch under the arm64 kernel on > > > git.kernel.org. This is aimed as a commitment to keep the ABI *stable* > > > and will be rebased with every kernel release (starting with 4.13). The > > > decision to merge upstream will be revisited every 6 months, assessing > > > the progress on the points I mentioned above, with a time limit of 2 > > > years when, if still not upstream, we will stop maintaining such branch. > > > > Thanks for the email. I appreciate your concern about long-term > > support load for a new ABI. I also think that stabilizing the ABI > > is a good idea. > > > > At this point, most people expect the ABI to not change unless > > critical issues are uncovered. IMO, if there is a good technical reason > > to change the ABI -- the change will happen even on the "staging" branch. > > What I would like is that we change the ABI *only* if there is a serious > bug, otherwise we should try hard to keep it stable. The "good technical > reason" can be subjective (i.e. let's pass 64-bit arguments in a single > register because some benchmark is slightly faster; with a wider user > base, we may get more suggestions for ABI changes that we should > reject). > > > And vise-versa, if there is no need for a change, the ABI will be stable > > on my local branch, just like on staging branch you propose. I think it > > will be that way until there will appear strong community of users who > > will resist the changing of ABI. From this point of view, I don't see > > major difference for ILP32 where to host the patchset. > > If we don't treat the ABI as stable now, regardless of the number of > users, then it is not ready for upstream (we already have a user in the > openSUSE build). > > The arm64 git.kernel.org suggestion was more of an endorsement from the > maintainers that the ABI is stable. If you want to maintain it in your > own tree, that's fine by me. If you want wider visibility, we could > mirror it to git.kernel.org (though given how many trees are there, it > may not mean much). I fully agree with your suggestion and think that it will be the big support for the project. I only want to clarity some details. But it doesn't mean I'm skeptic with it. > > Is my understanding correct that you, Will and me will be responsible > > for rebasing and maintainance of patches? To be clear, this it not an > > automatic task - sometimes simple rebase take the whole day of my time, > > and I rebase almost every week. The rebase in 2-month timeframe may become > > unpredictable task, by time and amount of work. I think you understand what > > I mean, as once before you already told that the series is too intrusive. > > I am fully aware there is significant effort to rebase the series and if > you can help maintain such branch it would be great. I don't see the > point of rebasing weekly though and it's not just the git handling > process but doing the validation of such branch, regression testing etc. > > If it's too time consuming, we could do it only for LTS releases. > > > To make it more easy for maintainance, I would suggest to split the series > > to 3 parts: > > - arch and generic patches that not related to ilp32 or arm64 (already > >done); > > That's fine. > > > - arm64 patches that do cleanup and refactoring in aim to apply > >ilp32 patches smoothly, but not ilp32-specific; > > If there are such changes, that's fine. However, I wouldn't merge the > AARCH32_EL0 #ifdef'ery since it's unnecessary if we never merge the > ILP32 patches. > > > If we'll follow your suggestion, does it mean that you expect the 4.12-based > > branch from me soon to put on staging? > > We can create one for 4.12 if you want (in about 2-3 weeks time when I'm > back). If there is no rush we could aim for 4.13 (there are some > non-trivial conflicts in the sigframe handling code as we are preparing > it for SVE support). > >
Re: [PATCH 08/20] thread: move thread bits accessors to separated file
On Mon, Jul 17, 2017 at 04:57:02PM +0200, Andreas Schwab wrote: > On Jun 19 2017, Yury Norov <yno...@caviumnetworks.com> wrote: > > > diff --git a/include/linux/thread_bits.h b/include/linux/thread_bits.h > > new file mode 100644 > > index ..87354331bc7b > > --- /dev/null > > +++ b/include/linux/thread_bits.h > > @@ -0,0 +1,63 @@ > > +/* thread_bits.h: common low-level thread bits accessors */ > > + > > +#ifndef _LINUX_THREAD_BITS_H > > +#define _LINUX_THREAD_BITS_H > > + > > +#ifndef __ASSEMBLY__ > > + > > +#include > > +#include > > + > > +#ifdef CONFIG_THREAD_INFO_IN_TASK > > +/* > > + * For CONFIG_THREAD_INFO_IN_TASK kernels we need for the > > + * definition of current, but for !CONFIG_THREAD_INFO_IN_TASK kernels, > > + * including can cause a circular dependency on some > > platforms. > > + */ > > +#include > > +#define current_thread_info() ((struct thread_info *)current) > > +#endif > > This is duplicate. > > > diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h > > index d7d3ea637dd0..c40a89357329 100644 > > --- a/include/linux/thread_info.h > > +++ b/include/linux/thread_info.h > > @@ -7,9 +7,21 @@ > > #ifndef _LINUX_THREAD_INFO_H > > #define _LINUX_THREAD_INFO_H > > > > +/* > > + * For per-arch arch_within_stack_frames() implementations, defined in > > + * asm/thread_info.h. > > + */ > > +enum { > > + BAD_STACK = -1, > > + NOT_STACK = 0, > > + GOOD_FRAME, > > + GOOD_STACK, > > +}; > > + > > That should be kept after the includes. Thanks, will fix. -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v8 00/20] ILP32 for ARM64
Hi Catalin, On Thu, Jun 29, 2017 at 05:10:36PM +0100, Catalin Marinas wrote: > Hi Yury, > > On Mon, Jun 19, 2017 at 06:49:43PM +0300, Yury Norov wrote: > > This series enables aarch64 with ilp32 mode. > > Thanks for putting this series together, I do appreciate the effort. > There are still some review comments coming in but I'm happy with how > the ABI looks now. I did some LTP testing (AArch64/LP64, AArch64/ILP32, > AArch32) and benchmarking and didn't see any regressions (apart from an > LTP bug with sync_file_range2). James Morse is working on reproducing > similar testing in ARM. Szabolcs reported some glibc test-suite > regressions on the libc-alpha list which I assume will be followed up. > VDSO in C is another issue I'd like sorted but this is not strictly > specific to ILP32 and can be done as a follow up. Note that I didn't run > any big-endian tests, though this is something that needs doing. > > Now, having agreed on the ABI and implementation very close to being > ready doesn't necessarily make the code suitable for upstream. With my > maintainer hat on, I'm trying to see where ILP32 will be in 2-5-10 > years, whether anyone still cares about it in this time frame. The > difference from a driver or SoC support is that ABIs are very hard to > revert, though are as (or even more) likely to bit-rot when not in use > or regularly tested (we have the big-endian experience here). > > There are two main aspects to make the code upstream-worthy: > > 1. Actual/real users (current, future). I don't mean just a few distros >showing that it can be done but actual/planned real deployments > > 2. Long term testing/maintenance plan. This is not about kernel code >maintenance but a healthy ILP32 ecosystem: >a) readily available toolchains (x86-hosted and AArch64-hosted) >b) filesystems (can be large distros like openSUSE or more > embedded-oriented like Yocto or OpenEmbedded) >c) suitable continuous regression testing (kernel + userland) >d) commitment from all parties involved (including ARM Ltd) to treat > the ILP32 ABI as a (nearly) first class citizen > > It is pretty clear from private discussions that there are potential > users but at the moment I can't tell if those would turn into real > deployments of production systems. As for (2), the long term plans are > not convincing (or I haven't spotted them yet), so I'd like to see the > interested parties putting a plan together (something along the lines of > kernelci.org + LTP, glibc buildbot). > > What I'd like to propose is that Will and I (as arm64 maintainers, maybe > with with the help of others including this series' authors) take over > the series and push it to a staging branch under the arm64 kernel on > git.kernel.org. This is aimed as a commitment to keep the ABI *stable* > and will be rebased with every kernel release (starting with 4.13). The > decision to merge upstream will be revisited every 6 months, assessing > the progress on the points I mentioned above, with a time limit of 2 > years when, if still not upstream, we will stop maintaining such branch. > > I am aware that the above proposal has an impact on the glibc patches > since they will not merge a new ABI upstream until officially supported > by the kernel. I cc'ed some of the glibc developers and they will follow > up on the libc-alpha list. Thanks for the email. I appreciate your concern about long-term support load for a new ABI. I also think that stabilizing the ABI is a good idea. At this point, most people expect the ABI to not change unless critical issues are uncovered. IMO, if there is a good technical reason to change the ABI -- the change will happen even on the "staging" branch. And vise-versa, if there is no need for a change, the ABI will be stable on my local branch, just like on staging branch you propose. I think it will be that way until there will appear strong community of users who will resist the changing of ABI. From this point of view, I don't see major difference for ILP32 where to host the patchset. Is my understanding correct that you, Will and me will be responsible for rebasing and maintainance of patches? To be clear, this it not an automatic task - sometimes simple rebase take the whole day of my time, and I rebase almost every week. The rebase in 2-month timeframe may become unpredictable task, by time and amount of work. I think you understand what I mean, as once before you already told that the series is too intrusive. To make it more easy for maintainance, I would suggest to split the series to 3 parts: - arch and generic patches that not related to ilp32 or arm64 (already done); - arm64 patches that do cleanup and refactoring in aim to apply ilp32 patches smoothly, but not ilp32-specific; - ilp32-speci
Re: [PATCH 18/20] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32
On Fri, Jun 23, 2017 at 06:03:37PM +0100, James Morse wrote: > Hi Yury, > > On 04/06/17 13:00, Yury Norov wrote: > > ILP32 has context-related structures different from both aarch32 and > > aarch64/lp64. In this patch compat_arch_ptrace() renamed to > > compat_a32_ptrace(), and compat_arch_ptrace() only makes choice between > > compat_a32_ptrace() and new compat_ilp32_ptrace() handler. > > > > compat_ilp32_ptrace() calls generic compat_ptrace_request() for all > > requests except PTRACE_GETSIGMASK and PTRACE_SETSIGMASK, which need > > special handling. > > Can you elaborate on this special handling? > > How come we don't need to wrap PTRACE_{G,S}ETSIGMASK for aarch32 compat? > >From kernel/signal32.c that uses compat_sigset_t too. > > It looks like aarch64, ilp32 and aarch32 all use the same size sigset_t, > so doesn't compat_ptrace_request() already do everything we need? > > ... > > Is this fixing an endian problem? If so, can we document it as such. Do we > already have the same bug for aarch32 compat? Originally, the problem was found by Zhou Chengming: https://lkml.org/lkml/2016/6/27/18 But I think you right, this is the fix for endian. It lookd like aarch32 is buggy, but IIUC to confirm it, the BE arm64 machine is needed. I use qemu and AFAIR it has no BE support. Zhou, can you test it on your machine and if the bug will be reproduced, send the patch for aarch32? Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 05/20] arm64: rename COMPAT to AARCH32_EL0 in Kconfig
On Wed, Jun 21, 2017 at 02:10:03AM +0300, Yury Norov wrote: > On Mon, Jun 19, 2017 at 04:58:16PM +0100, James Morse wrote: > > Hi Yury, [...] > > This is confusing as 'is_compat_task()' matches one of aarch32 or ilp32, but > > compat_user_mode(regs) only matches aarch32 as it checks the saved spsr. I > > can't > > see any problem caused by this today, but its going to bite someone in the > > future. Can this be renamed aarch32_user_mode()? (turns out 'a32' is the > > name of > > just one of aarch32's instruction sets[0].) > > compat_thumb_mode may be also renamed, and compat_setup_frame and > compat_setup_rt_frame, and some others. If you think that it may > confuse, I'll do rename. So this is what I found for now. I'm not sure this list is complete though. Some aarch32 functions and macros with 'compat' in the name are exported to userspace, so I left them untouched. Also, we derive binfmt_elf32.c for aarch32 from general compat_binfmt, so some aarch32 functions should have 'compat' name. Maybe it was not the best idea to reuse existing 'compat' term with new meaning. But if we choose to introduce some new term for it, like 'is_32_task()', we'd finish with another portion of painful renaming. Anyway, the patch in ready. If you / anyone will find something else to rename - just let me know. rename compat functions: https://github.com/norov/linux/commit/6d46b52e1dab6490076c09ddfbcd4f4821dbadae rename compat_elf_hwcap and compat_elf_hwcap2 (I will meld with previous one): https://github.com/norov/linux/commit/a1d94452e14b2d7aa5b99a94f9f928f1ebe9566f Yury commit 6d46b52e1dab6490076c09ddfbcd4f4821dbadae Author: Yury Norov <yno...@caviumnetworks.com> Date: Wed Jun 21 14:25:25 2017 +0300 arm64: rename functions like compat_foo() to a32_foo() The ILP32 for ARM64 patch series introduces another 'compat' mode for arm64. So to avoid confusing, aarc32-only functions renamed in according to it. diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h index d668b3900b52..58762bd39314 100644 --- a/arch/arm64/include/asm/ptrace.h +++ b/arch/arm64/include/asm/ptrace.h @@ -126,16 +126,16 @@ struct pt_regs { #define arch_has_single_step() (1) #ifdef CONFIG_AARCH32_EL0 -#define compat_thumb_mode(regs) \ +#define a32_thumb_mode(regs) \ (((regs)->pstate & COMPAT_PSR_T_BIT)) #else -#define compat_thumb_mode(regs) (0) +#define a32_thumb_mode(regs) (0) #endif #define user_mode(regs)\ (((regs)->pstate & PSR_MODE_MASK) == PSR_MODE_EL0t) -#define compat_user_mode(regs) \ +#define a32_user_mode(regs)\ (((regs)->pstate & (PSR_MODE32_BIT | PSR_MODE_MASK)) == \ (PSR_MODE32_BIT | PSR_MODE_EL0t)) @@ -149,10 +149,10 @@ struct pt_regs { (!((regs)->pstate & PSR_F_BIT)) #define GET_USP(regs) \ - (!compat_user_mode(regs) ? (regs)->sp : (regs)->compat_sp) + (!a32_user_mode(regs) ? (regs)->sp : (regs)->compat_sp) #define SET_USP(ptregs, value) \ - (!compat_user_mode(regs) ? ((regs)->sp = value) : ((regs)->compat_sp = value)) + (!a32_user_mode(regs) ? ((regs)->sp = value) : ((regs)->compat_sp = value)) extern int regs_query_register_offset(const char *name); extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h index e68fcce538e1..0bde8a0e33c7 100644 --- a/arch/arm64/include/asm/signal32.h +++ b/arch/arm64/include/asm/signal32.h @@ -26,27 +26,27 @@ extern const compat_ulong_t aarch32_sigret_code[6]; -int compat_setup_frame(int usig, struct ksignal *ksig, sigset_t *set, +int a32_setup_frame(int usig, struct ksignal *ksig, sigset_t *set, struct pt_regs *regs); -int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, +int a32_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, struct pt_regs *regs); -void compat_setup_restart_syscall(struct pt_regs *regs); +void a32_setup_restart_syscall(struct pt_regs *regs); #else -static inline int compat_setup_frame(int usid, struct ksignal *ksig, +static inline int a32_setup_frame(int usid, struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) { return -ENOSYS; } -static inline int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, +static inline int a32_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) { return -ENOSYS; } -static inline void compat_setup_restart_syscall(struct pt_regs *regs) +static inline void a32_setup_restart_syscall(struct pt_regs *regs) { } #endif /* CONFIG_AARCH32_EL0 */ diff --git a/arch/arm64/kernel/armv8_deprecated.c b/arch/arm64/kernel/armv8_deprecated.c inde
Re: [PATCH 05/20] arm64: rename COMPAT to AARCH32_EL0 in Kconfig
On Mon, Jun 19, 2017 at 04:58:16PM +0100, James Morse wrote: > Hi Yury, > > On 04/06/17 12:59, Yury Norov wrote: > > From: Andrew Pinski <apin...@cavium.com> > > > > In this patchset ILP32 ABI support is added. Additionally to AARCH32, > > which is binary-compatible with ARM, ILP32 is (mostly) ABI-compatible. > > > > From now, AARCH32_EL0 (former COMPAT) config option means the support of > > AARCH32 userspace, ARM64_ILP32 - support of ILP32 ABI (see next patches), > > and COMPAT indicates that one of them, or both, is enabled. > > > > Where needed, CONFIG_COMPAT is changed over to use CONFIG_AARCH32_EL0 > > instead > > Nit: You have 'COMPAT' around compat_hwcap_str's definition, but its only user > is wrapped in 'AARCH32_EL0'. > > > After this patch > arch/arm64/kernel/perf_callchain.c::perf_callchain_user() still has: > > if (!compat_user_mode(regs)) { > > /* AARCH64 mode */ > ... > > } else { > > #ifdef CONFIG_COMPAT > > /* AARCH32 compat mode */ > ... > > #endif > > } > > I think this one should become CONFIG_AARCH32_EL0. compat to this code means > the > fp is 'compat_fp' in x11, and it should read a 32bit call chain from > user-space. Thanks, will fix it. > This is confusing as 'is_compat_task()' matches one of aarch32 or ilp32, but > compat_user_mode(regs) only matches aarch32 as it checks the saved spsr. I > can't > see any problem caused by this today, but its going to bite someone in the > future. Can this be renamed aarch32_user_mode()? (turns out 'a32' is the name > of > just one of aarch32's instruction sets[0].) compat_thumb_mode may be also renamed, and compat_setup_frame and compat_setup_rt_frame, and some others. If you think that it may confuse, I'll do rename. Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 16/20] arm64: signal32: move ilp32 and aarch32 common code to separated file
On Mon, Jun 19, 2017 at 05:16:42PM +0100, James Morse wrote: > Hi Yury, > > On 04/06/17 13:00, Yury Norov wrote: > > Signed-off-by: Yury Norov <yno...@caviumnetworks.com> > > Can I offer a body for the commit message: > ILP32 needs to mix 32bit struct siginfo and 64bit sigframe for its signal > handlers. Move the existing compat code for copying siginfo to user space and > manipulating signal masks into signal32_common.c so it can be used to deliver > aarch32 and ilp32 signals. Ok > > diff --git a/arch/arm64/include/asm/signal32.h > > b/arch/arm64/include/asm/signal32.h > > index e68fcce538e1..1c4ede717bd2 100644 > > --- a/arch/arm64/include/asm/signal32.h > > +++ b/arch/arm64/include/asm/signal32.h > > @@ -13,6 +13,9 @@ > > * 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 > > + > > #ifndef __ASM_SIGNAL32_H > > #define __ASM_SIGNAL32_H > > Nit: This should go inside the guard. Ok, thanks. Will fix this and all below > > diff --git a/arch/arm64/kernel/signal32_common.c > > b/arch/arm64/kernel/signal32_common.c > > new file mode 100644 > > index ..5bddc25dca12 > > --- /dev/null > > +++ b/arch/arm64/kernel/signal32_common.c > > @@ -0,0 +1,135 @@ > [...] > > +#include > > +#include > > +#include > > What do you need ratelimit.h for? > > > > +#include > > + > > +#include > > I can't see anything using these ESR_ macros in here... > > > > +#include > > This was for the VFP save/restore code, which you didn't move... > > > > +#include > > +#include > > [...] > > > > +int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t > > *from) > [...] > > + case __SI_FAULT: > > + err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr, > > + >si_addr); > > This looks tricky. si_addr comes from FAR_EL1 when user-space touches > something > it shouldn't. This could be a 64bit value as ilp32 processes can still branch > to > 64bit addresses in registers and generate loads that cross the invisible 4GB > boundary. Here you truncate the 64bit address. > Obviously this can't happen at all with aarch32, and for C programs its into > undefined-behaviour territory, but it doesn't feel right to pass an address to > user-space that we know is wrong... but we don't have an alternative. > > This looks like a class of problem particular to ilp32/x32: 'accessed an > address > you can't encode with a signal'. After a quick dig in x86's x32 code, it looks > like they only pass the first 32bits of si_addr too. > > One option is to mint a new si_code to go with SIGBUS meaning something like > 'address overflowed si_addr'. Alternatively we could just kill tasks that do > this. New SIGBUS sounds reasonable at the first glance, but I think it should be discussed widely at first, and the patch that implements it should touch all arches that may be affected. Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 07/20] arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64
From: Andrew Pinski <apin...@cavium.com> Define __BITS_PER_LONG depending on the ABI used (i.e. check whether __ILP32__ or __LP64__ is defined). This is necessary for glibc to determine the appropriate type definitions for the system call interface. Signed-off-by: Andrew Pinski <apin...@cavium.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Reviewed-by: David Daney <dda...@caviumnetworks.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 fce9c2924fa3..4265243e326f 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 +#if defined(__LP64__) +/* Assuming __LP64__ will be defined for native ELF64's and not for ILP32. */ +# define __BITS_PER_LONG 64 +#elif defined(__ILP32__) +# define __BITS_PER_LONG 32 +#else +# error "Neither LP64 nor ILP32: unsupported ABI in asm/bitsperlong.h" +#endif #include -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 13/20] arm64: ilp32: share aarch32 syscall handlers
According to userspace/kernel ABI, userspace off_t is passed in register pair just like in aarch32. In this patch corresponding aarch32 handlers are shared to ilp32 code. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/entry32.S| 80 --- arch/arm64/kernel/entry32_common.S | 107 + 3 files changed, 108 insertions(+), 80 deletions(-) create mode 100644 arch/arm64/kernel/entry32_common.S diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 41d9a3ab07a7..7243ffe358b4 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -30,6 +30,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o +arm64-obj-$(CONFIG_COMPAT) += entry32_common.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/entry32.S b/arch/arm64/kernel/entry32.S index f332d5d1f6b4..4bede0324440 100644 --- a/arch/arm64/kernel/entry32.S +++ b/arch/arm64/kernel/entry32.S @@ -39,83 +39,3 @@ ENTRY(compat_sys_rt_sigreturn_wrapper) mov x0, sp b compat_sys_rt_sigreturn ENDPROC(compat_sys_rt_sigreturn_wrapper) - -ENTRY(compat_sys_statfs64_wrapper) - mov w3, #84 - cmp w1, #88 - cselw1, w3, w1, eq - b compat_sys_statfs64 -ENDPROC(compat_sys_statfs64_wrapper) - -ENTRY(compat_sys_fstatfs64_wrapper) - mov w3, #84 - cmp w1, #88 - cselw1, w3, w1, eq - b compat_sys_fstatfs64 -ENDPROC(compat_sys_fstatfs64_wrapper) - -/* - * Note: off_4k (w5) is always in units of 4K. If we can't do the - * requested offset because it is not page-aligned, we return -EINVAL. - */ -ENTRY(compat_sys_mmap2_wrapper) -#if PAGE_SHIFT > 12 - tst w5, #~PAGE_MASK >> 12 - b.ne1f - lsr w5, w5, #PAGE_SHIFT - 12 -#endif - b sys_mmap_pgoff -1: mov x0, #-EINVAL - ret -ENDPROC(compat_sys_mmap2_wrapper) - -/* - * Wrappers for AArch32 syscalls that either take 64-bit parameters - * in registers or that take 32-bit parameters which require sign - * extension. - */ -ENTRY(compat_sys_pread64_wrapper) - regs_to_64 x3, x4, x5 - b sys_pread64 -ENDPROC(compat_sys_pread64_wrapper) - -ENTRY(compat_sys_pwrite64_wrapper) - regs_to_64 x3, x4, x5 - b sys_pwrite64 -ENDPROC(compat_sys_pwrite64_wrapper) - -ENTRY(compat_sys_truncate64_wrapper) - regs_to_64 x1, x2, x3 - b sys_truncate -ENDPROC(compat_sys_truncate64_wrapper) - -ENTRY(compat_sys_ftruncate64_wrapper) - regs_to_64 x1, x2, x3 - b sys_ftruncate -ENDPROC(compat_sys_ftruncate64_wrapper) - -ENTRY(compat_sys_readahead_wrapper) - regs_to_64 x1, x2, x3 - mov w2, w4 - b sys_readahead -ENDPROC(compat_sys_readahead_wrapper) - -ENTRY(compat_sys_fadvise64_64_wrapper) - mov w6, w1 - regs_to_64 x1, x2, x3 - regs_to_64 x2, x4, x5 - mov w3, w6 - b sys_fadvise64_64 -ENDPROC(compat_sys_fadvise64_64_wrapper) - -ENTRY(compat_sys_sync_file_range2_wrapper) - regs_to_64 x2, x2, x3 - regs_to_64 x3, x4, x5 - b sys_sync_file_range2 -ENDPROC(compat_sys_sync_file_range2_wrapper) - -ENTRY(compat_sys_fallocate_wrapper) - regs_to_64 x2, x2, x3 - regs_to_64 x3, x4, x5 - b sys_fallocate -ENDPROC(compat_sys_fallocate_wrapper) diff --git a/arch/arm64/kernel/entry32_common.S b/arch/arm64/kernel/entry32_common.S new file mode 100644 index ..f4a5e4de6201 --- /dev/null +++ b/arch/arm64/kernel/entry32_common.S @@ -0,0 +1,107 @@ +/* + * Compat system call wrappers + * + * Copyright (C) 2012 ARM Ltd. + * Authors: Will Deacon <will.dea...@arm.com> + * Catalin Marinas <catalin.mari...@arm.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 +#include + +#include +#include +#include +#include + +/
[PATCH 15/20] arm64: signal: share lp64 signal routines to ilp32
After that, it will be possible to reuse it in ilp32. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/include/asm/signal_common.h | 33 arch/arm64/kernel/signal.c | 93 +- 2 files changed, 92 insertions(+), 34 deletions(-) create mode 100644 arch/arm64/include/asm/signal_common.h diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h new file mode 100644 index ..f68238160940 --- /dev/null +++ b/arch/arm64/include/asm/signal_common.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2017 Cavium Networks. + * + * 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/>. + */ + +#ifndef __ASM_SIGNAL_COMMON_H +#define __ASM_SIGNAL_COMMON_H + +#include +#include +#include + +int preserve_fpsimd_context(struct fpsimd_context __user *ctx); +int restore_fpsimd_context(struct fpsimd_context __user *ctx); +int setup_sigcontext(struct sigcontext __user *uc_mcontext, struct pt_regs *regs); +int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sf); +void setup_return(struct pt_regs *regs, struct k_sigaction *ka, + void __user *frame, off_t sigframe_off, int usig); + +#endif /* __ASM_SIGNAL_COMMON_H */ diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 5fa1b401c5d6..9f2ea60b9fac 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -34,18 +34,26 @@ #include #include #include +#include + +#define RT_SIGFRAME_FP_POS (offsetof(struct rt_sigframe, sig) \ + + offsetof(struct sigframe, fp)) + +struct sigframe { + struct ucontext uc; + u64 fp; + u64 lr; +}; /* * Do a signal return; undo the signal stack. These are aligned to 128-bit. */ struct rt_sigframe { struct siginfo info; - struct ucontext uc; - u64 fp; - u64 lr; + struct sigframe sig; }; -static int preserve_fpsimd_context(struct fpsimd_context __user *ctx) +int preserve_fpsimd_context(struct fpsimd_context __user *ctx) { struct fpsimd_state *fpsimd = >thread.fpsimd_state; int err; @@ -65,7 +73,7 @@ static int preserve_fpsimd_context(struct fpsimd_context __user *ctx) return err ? -EFAULT : 0; } -static int restore_fpsimd_context(struct fpsimd_context __user *ctx) +int restore_fpsimd_context(struct fpsimd_context __user *ctx) { struct fpsimd_state fpsimd; __u32 magic, size; @@ -93,22 +101,30 @@ static int restore_fpsimd_context(struct fpsimd_context __user *ctx) } static int restore_sigframe(struct pt_regs *regs, - struct rt_sigframe __user *sf) + struct sigframe __user *sf) { sigset_t set; - int i, err; - void *aux = sf->uc.uc_mcontext.__reserved; - + int err; err = __copy_from_user(, >uc.uc_sigmask, sizeof(set)); if (err == 0) set_current_blocked(); + err |= restore_sigcontext(regs, >uc.uc_mcontext); + return err; +} + + +int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *uc_mcontext) +{ + int i, err = 0; + void *aux = uc_mcontext->__reserved; + for (i = 0; i < 31; i++) - __get_user_error(regs->regs[i], >uc.uc_mcontext.regs[i], + __get_user_error(regs->regs[i], _mcontext->regs[i], err); - __get_user_error(regs->sp, >uc.uc_mcontext.sp, err); - __get_user_error(regs->pc, >uc.uc_mcontext.pc, err); - __get_user_error(regs->pstate, >uc.uc_mcontext.pstate, err); + __get_user_error(regs->sp, _mcontext->sp, err); + __get_user_error(regs->pc, _mcontext->pc, err); + __get_user_error(regs->pstate, _mcontext->pstate, err); /* * Avoid sys_rt_sigreturn() restarting. @@ -145,10 +161,10 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) goto badframe; - if (restore_sigframe(regs, frame)) + if (restore_sigframe(regs, >sig)) goto badframe; - if (restore_altstack(>uc.uc_stack)) + if (restor
[PATCH 19/20] arm64:ilp32: add vdso-ilp32 and use for signal return
From: Philipp Tomsich <philipp.toms...@theobroma-systems.com> ILP32 VDSO exports following symbols: __kernel_rt_sigreturn; __kernel_gettimeofday; __kernel_clock_gettime; __kernel_clock_getres. What shared object to use, kernel selects depending on result of is_ilp32_compat_task() in arch/arm64/kernel/vdso.c, so it substitutes correct pages and spec. Adjusted to move the data page before code pages in sync with commit 601255ae3c98 ("arm64: vdso: move data page before code pages") Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/Makefile | 3 + arch/arm64/include/asm/vdso.h | 6 ++ arch/arm64/kernel/Makefile| 1 + arch/arm64/kernel/asm-offsets.c | 7 ++ arch/arm64/kernel/signal.c| 2 + arch/arm64/kernel/vdso-ilp32/.gitignore | 2 + arch/arm64/kernel/vdso-ilp32/Makefile | 80 ++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S | 33 ++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S | 95 +++ arch/arm64/kernel/vdso.c | 59 +++-- arch/arm64/kernel/vdso/gettimeofday.S | 20 +- arch/arm64/kernel/vdso/vdso.S | 6 +- 12 files changed, 301 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/Makefile b/arch/arm64/Makefile index 807451ffcc29..b4e3537db2b0 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -155,6 +155,9 @@ archclean: prepare: vdso_prepare vdso_prepare: prepare0 $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso include/generated/vdso-offsets.h +ifeq ($(CONFIG_ARM64_ILP32), y) + $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso-ilp32 include/generated/vdso-ilp32-offsets.h +endif define archhelp echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h index 839ce0031bd5..33a4e10014aa 100644 --- a/arch/arm64/include/asm/vdso.h +++ b/arch/arm64/include/asm/vdso.h @@ -29,6 +29,12 @@ #include +#ifdef CONFIG_ARM64_ILP32 +#include +#else +#define vdso_offset_sigtramp_ilp32 ({ BUILD_BUG(); 0; }) +#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 a228aa7abc03..527fecea4e51 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -58,6 +58,7 @@ arm64-reloc-test-y := reloc_test_core.o reloc_test_syms.o arm64-obj-$(CONFIG_CRASH_DUMP) += crash_dump.o obj-y += $(arm64-obj-y) vdso/ probes/ +obj-$(CONFIG_ARM64_ILP32) += vdso-ilp32/ obj-m += $(arm64-obj-m) head-y := head.o extra-y+= $(head-y) vmlinux.lds diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index aec5b6cedc7c..c8a09718e998 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -121,6 +121,13 @@ int main(void) DEFINE(TSPEC_TV_SEC, offsetof(struct timespec, tv_sec)); DEFINE(TSPEC_TV_NSEC,offsetof(struct timespec, tv_nsec)); BLANK(); +#ifdef CONFIG_COMPAT + DEFINE(COMPAT_TVAL_TV_SEC, offsetof(struct compat_timeval, tv_sec)); + DEFINE(COMPAT_TVAL_TV_USEC, offsetof(struct compat_timeval, tv_usec)); + DEFINE(COMPAT_TSPEC_TV_SEC, offsetof(struct compat_timespec, tv_sec)); + DEFINE(COMPAT_TSPEC_TV_NSEC, offsetof(struct compat_timespec, tv_nsec)); + BLANK(); +#endif DEFINE(TZ_MINWEST, offsetof(struct timezone, tz_minuteswest)); DEFINE(TZ_DSTTIME, offsetof(struct timezone, tz_dsttime)); BLANK(); diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index b78f4c255636..a7f201dba9de 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -267,6 +267,8 @@ void setup_return(struct pt_regs *regs, struct k_sigaction *ka, if (ka->sa.sa_flags & SA_RESTORER) sigtramp = ka->sa.sa_restorer; + else if (is_ilp32_compat_task()) + sigtramp = VDSO_SYMBOL(current->mm->context.vdso, sigtramp_ilp32); else si
[PATCH 16/20] arm64: signal32: move ilp32 and aarch32 common code to separated file
Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/include/asm/signal32.h| 3 + arch/arm64/include/asm/signal32_common.h | 27 +++ arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/signal32.c | 107 arch/arm64/kernel/signal32_common.c | 135 +++ 5 files changed, 166 insertions(+), 108 deletions(-) create mode 100644 arch/arm64/include/asm/signal32_common.h create mode 100644 arch/arm64/kernel/signal32_common.c diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h index e68fcce538e1..1c4ede717bd2 100644 --- a/arch/arm64/include/asm/signal32.h +++ b/arch/arm64/include/asm/signal32.h @@ -13,6 +13,9 @@ * 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 + #ifndef __ASM_SIGNAL32_H #define __ASM_SIGNAL32_H diff --git a/arch/arm64/include/asm/signal32_common.h b/arch/arm64/include/asm/signal32_common.h new file mode 100644 index ..36c1ebc07a97 --- /dev/null +++ b/arch/arm64/include/asm/signal32_common.h @@ -0,0 +1,27 @@ +/* + * 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/>. + */ +#ifndef __ASM_SIGNAL32_COMMON_H +#define __ASM_SIGNAL32_COMMON_H + +#ifdef CONFIG_COMPAT + +int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from); +int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from); + +int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set); +int get_sigset_t(sigset_t *set, const compat_sigset_t __user *uset); + +#endif /* CONFIG_COMPAT*/ + +#endif /* __ASM_SIGNAL32_COMMON_H */ diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index c329a4e28a92..9c7912936049 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -30,7 +30,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o -arm64-obj-$(CONFIG_COMPAT) += entry32_common.o +arm64-obj-$(CONFIG_COMPAT) += entry32_common.o signal32_common.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c index c747a0fc5d7d..181cc3012bda 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c @@ -103,113 +103,6 @@ struct compat_rt_sigframe { #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) -static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set) -{ - compat_sigset_t cset; - - cset.sig[0] = set->sig[0] & 0xull; - cset.sig[1] = set->sig[0] >> 32; - - return copy_to_user(uset, , sizeof(*uset)); -} - -static inline int get_sigset_t(sigset_t *set, - const compat_sigset_t __user *uset) -{ - compat_sigset_t s32; - - if (copy_from_user(, uset, sizeof(*uset))) - return -EFAULT; - - set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); - return 0; -} - -int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) -{ - int err; - - if (!access_ok(VERIFY_WRITE, to, sizeof(*to))) - return -EFAULT; - - /* If you change siginfo_t structure, please be sure -* this code is fixed accordingly. -* It should never copy any pad contained in the structure -* to avoid security leaks, but must copy the generic -* 3 ints plus the relevant union member. -* This routine must convert siginfo from 64bit to 32bit as well -* at the same time. -*/ - err = __put_user(from->si_signo, >si_signo); - err |= __put_user(from->si_errno, >si_errno); - err |= __put_user((short)from->si_code, >si_code); - if (from->si_code < 0) - err |= __copy_to_user(>_sifields._pad, >_sifields._pad, - SI_PAD_SIZE); - else switch (from->si_code & __SI_MASK) {
[PATCH 18/20] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32
ILP32 has context-related structures different from both aarch32 and aarch64/lp64. In this patch compat_arch_ptrace() renamed to compat_a32_ptrace(), and compat_arch_ptrace() only makes choice between compat_a32_ptrace() and new compat_ilp32_ptrace() handler. compat_ilp32_ptrace() calls generic compat_ptrace_request() for all requests except PTRACE_GETSIGMASK and PTRACE_SETSIGMASK, which need special handling. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> Signed-off-by: Chengming Zhou <zhouchengmi...@huawei.com> --- arch/arm64/kernel/ptrace.c | 65 -- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index e2b7c040bf84..28f96765e8cc 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -765,9 +765,11 @@ static const struct user_regset_view user_aarch64_view = { .regsets = aarch64_regsets, .n = ARRAY_SIZE(aarch64_regsets) }; -#ifdef CONFIG_AARCH32_EL0 +#ifdef CONFIG_COMPAT #include +#endif +#ifdef CONFIG_AARCH32_EL0 enum compat_regset { REGSET_COMPAT_GPR, REGSET_COMPAT_VFP, @@ -1223,7 +1225,7 @@ 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, +static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, compat_ulong_t caddr, compat_ulong_t cdata) { unsigned long addr = caddr; @@ -1300,8 +1302,67 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, return ret; } + +#else +#define compat_a32_ptrace(child, request, caddr, cdata) (0) #endif /* CONFIG_AARCH32_EL0 */ +#ifdef CONFIG_ARM64_ILP32 +#include + +static long compat_ilp32_ptrace(struct task_struct *child, compat_long_t request, + compat_ulong_t caddr, compat_ulong_t cdata) +{ + sigset_t new_set; + + switch (request) { + case PTRACE_GETSIGMASK: + if (caddr != sizeof(compat_sigset_t)) + return -EINVAL; + + return put_sigset_t((compat_sigset_t __user *) (u64) cdata, + >blocked); + + case PTRACE_SETSIGMASK: + if (caddr != sizeof(compat_sigset_t)) + return -EINVAL; + + if (get_sigset_t(_set, (compat_sigset_t __user *) (u64) cdata)) + return -EFAULT; + + sigdelsetmask(_set, sigmask(SIGKILL)|sigmask(SIGSTOP)); + + /* +* Every thread does recalc_sigpending() after resume, so +* retarget_shared_pending() and recalc_sigpending() are not +* called here. +*/ + spin_lock_irq(>sighand->siglock); + child->blocked = new_set; + spin_unlock_irq(>sighand->siglock); + + return 0; + + default: + return compat_ptrace_request(child, request, caddr, cdata); + } +} + +#else +#define compat_ilp32_ptrace(child, request, caddr, cdata) (0) +#endif + +#ifdef CONFIG_COMPAT +long compat_arch_ptrace(struct task_struct *child, compat_long_t request, + compat_ulong_t caddr, compat_ulong_t cdata) +{ + if (is_a32_compat_task()) + return compat_a32_ptrace(child, request, caddr, cdata); + + return compat_ilp32_ptrace(child, request, caddr, cdata); +} +#endif + const struct user_regset_view *task_user_regset_view(struct task_struct *task) { #ifdef CONFIG_AARCH32_EL0 -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 17/20] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext
From: Andrew Pinski <apin...@cavium.com> ILP32 uses AARCH32 compat structures and syscall handlers for signals. But ILP32 struct rt_sigframe and ucontext differs from both LP64 and AARCH32. So some specific mechanism is needed to take care of it. Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/include/asm/signal_ilp32.h | 38 arch/arm64/kernel/Makefile| 3 +- arch/arm64/kernel/entry_ilp32.S | 22 + arch/arm64/kernel/signal.c| 3 + arch/arm64/kernel/signal_ilp32.c | 170 ++ 5 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 arch/arm64/include/asm/signal_ilp32.h create mode 100644 arch/arm64/kernel/entry_ilp32.S create mode 100644 arch/arm64/kernel/signal_ilp32.c diff --git a/arch/arm64/include/asm/signal_ilp32.h b/arch/arm64/include/asm/signal_ilp32.h new file mode 100644 index ..3c6d737c07c0 --- /dev/null +++ b/arch/arm64/include/asm/signal_ilp32.h @@ -0,0 +1,38 @@ +/* + * 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 +#include + +#ifndef __ASM_SIGNAL_ILP32_H +#define __ASM_SIGNAL_ILP32_H + +#ifdef CONFIG_ARM64_ILP32 + +#include + +int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, + struct pt_regs *regs); + +#else + +static inline int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, + struct pt_regs *regs) +{ + return -ENOSYS; +} + +#endif /* CONFIG_ARM64_ILP32 */ + +#endif /* __ASM_SIGNAL_ILP32_H */ diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 9c7912936049..a228aa7abc03 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,7 +29,8 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o -arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o +arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o \ + signal_ilp32.o entry_ilp32.o arm64-obj-$(CONFIG_COMPAT) += entry32_common.o signal32_common.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/entry_ilp32.S b/arch/arm64/kernel/entry_ilp32.S new file mode 100644 index ..a8bb94b3901b --- /dev/null +++ b/arch/arm64/kernel/entry_ilp32.S @@ -0,0 +1,22 @@ +/* + * ILP32 system call wrappers + * + * 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 + +ENTRY(ilp32_sys_rt_sigreturn_wrapper) + mov x0, sp + b ilp32_sys_rt_sigreturn +ENDPROC(ilp32_sys_rt_sigreturn_wrapper) diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 9f2ea60b9fac..b78f4c255636 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -35,6 +35,7 @@ #include #include #include +#include #define RT_SIGFRAME_FP_POS (offsetof(struct rt_sigframe, sig) \ + offsetof(struct sigframe, fp)) @@ -325,6 +326,8 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) ret = compat_setup_rt_frame(usig, ksig, oldset, regs); else ret = compat_setup_frame(usig, ksig, oldset, regs); + } else if (is_ilp32_compat_task()) { + ret = ilp32_setup_rt_frame(usig, ksig, oldset, regs); } else { ret = setup_rt_frame(usig, ksig, oldset, regs); } diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c new file
[PATCH 20/20] arm64:ilp32: add ARM64_ILP32 to Kconfig
From: Andrew Pinski <apin...@cavium.com> This patch adds the config option for ILP32. Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Reviewed-by: David Daney <dda...@caviumnetworks.com> --- arch/arm64/Kconfig | 9 - 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 168ab2cc426b..242771c764a5 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1079,7 +1079,7 @@ source "fs/Kconfig.binfmt" config COMPAT def_bool y - depends on AARCH32_EL0 + depends on AARCH32_EL0 || ARM64_ILP32 config AARCH32_EL0 bool "Kernel support for 32-bit EL0" @@ -1100,6 +1100,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 COMPAT && SYSVIPC -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 14/20] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it
From: Andrew Pinski <apin...@cavium.com> Add a separate syscall-table for ILP32, which dispatches either to native LP64 system call implementation or to compat-syscalls, as appropriate. Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/include/asm/unistd.h | 8 ++- arch/arm64/include/uapi/asm/unistd.h | 12 + arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/entry.S| 28 +- arch/arm64/kernel/sys_ilp32.c| 100 +++ 5 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 arch/arm64/kernel/sys_ilp32.c diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index 99d29290c98b..1bf5572cd078 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -13,12 +13,16 @@ * 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_AARCH32_EL0 + +#ifdef CONFIG_COMPAT #define __ARCH_WANT_COMPAT_STAT64 +#define __ARCH_WANT_SYS_LLSEEK +#endif + +#ifdef CONFIG_AARCH32_EL0 #define __ARCH_WANT_SYS_GETHOSTNAME #define __ARCH_WANT_SYS_PAUSE #define __ARCH_WANT_SYS_GETPGRP -#define __ARCH_WANT_SYS_LLSEEK #define __ARCH_WANT_SYS_NICE #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK diff --git a/arch/arm64/include/uapi/asm/unistd.h b/arch/arm64/include/uapi/asm/unistd.h index 48355a683e25..e7106bb45095 100644 --- a/arch/arm64/include/uapi/asm/unistd.h +++ b/arch/arm64/include/uapi/asm/unistd.h @@ -14,7 +14,19 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/* + * Use AARCH32 interface for sys_sync_file_range() as it passes 64-bit arguments. + */ +#if defined(__ILP32__) || defined(__SYSCALL_COMPAT) +#define __ARCH_WANT_SYNC_FILE_RANGE2 +#endif + +/* + * AARCH64/ILP32 is introduced after next syscalls were deprecated. + */ +#if !(defined(__ILP32__) || defined(__SYSCALL_COMPAT)) #define __ARCH_WANT_RENAMEAT #define __ARCH_WANT_SET_GET_RLIMIT +#endif #include diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 7243ffe358b4..c329a4e28a92 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,7 +29,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o -arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o +arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o arm64-obj-$(CONFIG_COMPAT) += entry32_common.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/entry.S b/arch/arm64/kernel/entry.S index 279bc2ab10c3..3723a20ab503 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -308,6 +308,23 @@ tsk.reqx28 // current thread_info .text +#ifdef CONFIG_ARM64_ILP32 +/* + * AARCH64/ILP32. Zero top halves of x0-x7 + * registers as userspace may put garbage there. + */ + .macro delouse_input_regs + mov w0, w0 + mov w1, w1 + mov w2, w2 + mov w3, w3 + mov w4, w4 + mov w5, w5 + mov w6, w6 + mov w7, w7 + .endm +#endif + /* * Exception vectors. */ @@ -577,6 +594,7 @@ el0_svc_compat: * AArch32 syscall handling */ adrpstbl, compat_sys_call_table // load compat syscall table pointer + ldr x19, [tsk, #TSK_TI_FLAGS] uxtwscno, w7// syscall number in w7 (r7) mov sc_nr, #__NR_compat_syscalls b el0_svc_naked @@ -798,15 +816,21 @@ ENDPROC(ret_from_fork) .align 6 el0_svc: adrpstbl, sys_call_table// load syscall table pointer + ldr x19, [tsk, #TSK_TI_FLAGS] uxtwscno, w8// syscall number in w8 mov sc_nr, #__NR_syscalls +#ifdef CONFIG_ARM64_ILP32 + tst x19, #_TIF_32BIT_AARCH64 + b.eqel0_svc_naked // We are using LP64 syscall table + adrpstbl, sys_call_ilp32_table // load ilp32 syscall table pointer + delouse_input_regs +#endif el0_svc_naked: // compat entry point stp x0, scno, [sp, #S_ORIG_X0] // save the original x0 and syscall number enable_dbg_and_irq ct_user_exit 1 - ldr x16, [tsk, #TSK_TI_FLAGS] // check for syscall hooks - tst x16, #_TIF_SYSCALL_WORK + tst x19, #_TIF_SYSCALL_WORK // check for sysca
[PATCH 12/20] arm64: ilp32: introduce binfmt_ilp32.c
Like binfmt_elf32.c, binfmt_ilp32.c is needed to handle ILP32 binaries. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/binfmt_ilp32.c | 85 2 files changed, 86 insertions(+) create mode 100644 arch/arm64/kernel/binfmt_ilp32.c diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index de6c84702d83..41d9a3ab07a7 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,6 +29,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o +arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c new file mode 100644 index ..bb31325e6f80 --- /dev/null +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -0,0 +1,85 @@ +/* + * Support for ILP32 Linux/aarch64 ELF binaries. + */ +#undef CONFIG_AARCH32_EL0 +#define compat_elf_gregset_t elf_gregset_t + +#include +#include + +#undef ELF_CLASS +#define ELF_CLASS ELFCLASS32 + +#undef elfhdr +#undef elf_phdr +#undef elf_shdr +#undef elf_note +#undef elf_addr_t +#define elfhdr elf32_hdr +#define elf_phdr elf32_phdr +#define elf_shdr elf32_shdr +#define elf_note elf32_note +#define elf_addr_t Elf32_Addr + +/* + * Some data types as stored in coredump. + */ +#define user_long_tcompat_long_t +#define user_siginfo_t compat_siginfo_t +#define copy_siginfo_to_user copy_siginfo_to_user32 + +/* + * The machine-dependent core note format types are defined in elfcore-compat.h, + * which requires asm/elf.h to define compat_elf_gregset_t et al. + */ +#define elf_prstatus compat_elf_prstatus +#define elf_prpsinfo compat_elf_prpsinfo + +/* AARCH64 ILP32 EABI. */ +#undef elf_check_arch +#define elf_check_arch(x) (((x)->e_machine == EM_AARCH64) \ + && (x)->e_ident[EI_CLASS] == ELFCLASS32) + +#undef SET_PERSONALITY +#define SET_PERSONALITY(ex)\ +do { \ + set_bit(TIF_32BIT, >mm->context.flags);\ + set_thread_flag(TIF_32BIT_AARCH64); \ + clear_thread_flag(TIF_32BIT); \ +} while (0) + +#undef ARCH_DLINFO +#define ARCH_DLINFO\ +do { \ + NEW_AUX_ENT(AT_SYSINFO_EHDR,\ + (elf_addr_t)(long)current->mm->context.vdso); \ +} while (0) + +#undef ELF_PLATFORM +#ifdef __AARCH64EB__ +#define ELF_PLATFORM ("aarch64_be:ilp32") +#else +#define ELF_PLATFORM ("aarch64:ilp32") +#endif + +#undef ELF_ET_DYN_BASE +#define ELF_ET_DYN_BASE COMPAT_ELF_ET_DYN_BASE + +#undef ELF_HWCAP +#undef ELF_HWCAP2 +#define ELF_HWCAP ((u32) elf_hwcap) +#define ELF_HWCAP2 ((u32) (elf_hwcap >> 32)) + +/* + * 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 + * might make some debugging less confusing not to duplicate them. + */ +#define elf_format compat_elf_format +#define init_elf_binfmtinit_compat_elf_binfmt +#define exit_elf_binfmtexit_compat_elf_binfmt + +#undef ns_to_timeval +#define ns_to_timeval ns_to_compat_timeval + +#include "../../../fs/binfmt_elf.c" -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 11/20] arm64: introduce binfmt_elf32.c
As we support more than one compat formats, it looks more reasonable to not use fs/compat_binfmt.c. Custom binfmt_elf32.c allows to move aarch32 specific definitions there and make code more maintainable and readable. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/Kconfig | 1 - arch/arm64/include/asm/elf.h | 30 +++--- arch/arm64/include/asm/hwcap.h | 2 -- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/binfmt_elf32.c | 37 + 5 files changed, 41 insertions(+), 31 deletions(-) create mode 100644 arch/arm64/kernel/binfmt_elf32.c diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 8713a2807582..168ab2cc426b 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1085,7 +1085,6 @@ config AARCH32_EL0 bool "Kernel support for 32-bit EL0" def_bool y depends on ARM64_4K_PAGES || EXPERT - select COMPAT_BINFMT_ELF if BINFMT_ELF select HAVE_UID16 select OLD_SIGSUSPEND3 select COMPAT_OLD_SIGACTION diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 8f7bafa60d01..2a727658f51c 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -174,39 +174,15 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, #endif #ifdef CONFIG_COMPAT - #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) +#endif /* CONFIG_COMPAT */ +#ifdef CONFIG_AARCH32_EL0 /* AArch32 registers. */ #define COMPAT_ELF_NGREG 18 typedef unsigned int compat_elf_greg_t; typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; - -/* AArch32 EABI. */ -#define EF_ARM_EABI_MASK 0xff00 -#define compat_elf_check_arch(x) (system_supports_32bit_el0() && \ -((x)->e_machine == EM_ARM) && \ -((x)->e_flags & EF_ARM_EABI_MASK)) - -#define compat_start_threadcompat_start_thread -/* - * Unlike the native SET_PERSONALITY macro, the compat version inherits - * READ_IMPLIES_EXEC across a fork() since this is the behaviour on - * arch/arm/. - */ -#define COMPAT_SET_PERSONALITY(ex) \ -({ \ - set_bit(TIF_32BIT, >mm->context.flags);\ - clear_thread_flag(TIF_32BIT_AARCH64); \ - set_thread_flag(TIF_32BIT); \ - }) -#define COMPAT_ARCH_DLINFO -extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, - int uses_interp); -#define compat_arch_setup_additional_pages \ - aarch32_setup_vectors_page - -#endif /* CONFIG_COMPAT */ +#endif /* CONFIG_AARCH32_EL0 */ #endif /* !__ASSEMBLY__ */ diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 2c7fc5d89813..99dfd9277559 100644 --- a/arch/arm64/include/asm/hwcap.h +++ b/arch/arm64/include/asm/hwcap.h @@ -47,8 +47,6 @@ #define ELF_HWCAP (elf_hwcap) #ifdef CONFIG_AARCH32_EL0 -#define COMPAT_ELF_HWCAP (compat_elf_hwcap) -#define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; #endif diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 49fefa42d136..de6c84702d83 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -28,7 +28,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE $(call if_changed,objcopy) arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ - sys_compat.o entry32.o + sys_compat.o entry32.o binfmt_elf32.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c new file mode 100644 index ..ff1f192a738a --- /dev/null +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -0,0 +1,37 @@ +/* + * Support for AArch32 Linux ELF binaries. + */ + +/* AArch32 EABI. */ +#define EF_ARM_EABI_MASK 0xff00 + +#define compat_start_threadcompat_start_thread +/* + * Unlike the native SET_PERSONALITY macro, the compat version inherits + * READ_IMPLIES_EXEC across a fork() since this is the behaviour on + * arch/arm/. + */ +#define COMPAT_SET_PERSONALITY(ex) \ +({ \ + set_bit(TIF_32BIT, >mm->context.flags);\ + clear_thread_flag(TIF_32BIT_AARCH64);
[PATCH 10/20] arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64
ILP32 tasks are needed to be distinguished from lp64 and aarch32. This patch adds helper functions is_ilp32_compat_{task,thread} and thread flag TIF_32BIT_AARCH64 to address it. This is a preparation for following patches in ilp32 patchset. For consistency, SET_PERSONALITY is changed here accordingly. Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Reviewed-by: David Daney <dda...@caviumnetworks.com> --- arch/arm64/include/asm/elf.h | 2 ++ arch/arm64/include/asm/is_compat.h | 30 -- arch/arm64/include/asm/thread_info.h | 2 ++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 6a37b6facc69..8f7bafa60d01 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -145,6 +145,7 @@ typedef struct user_fpsimd_state elf_fpregset_t; #define SET_PERSONALITY(ex)\ ({ \ clear_bit(TIF_32BIT, >mm->context.flags); \ + clear_thread_flag(TIF_32BIT_AARCH64); \ clear_thread_flag(TIF_32BIT); \ current->personality &= ~READ_IMPLIES_EXEC; \ }) @@ -196,6 +197,7 @@ typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; #define COMPAT_SET_PERSONALITY(ex) \ ({ \ set_bit(TIF_32BIT, >mm->context.flags);\ + clear_thread_flag(TIF_32BIT_AARCH64); \ set_thread_flag(TIF_32BIT); \ }) #define COMPAT_ARCH_DLINFO diff --git a/arch/arm64/include/asm/is_compat.h b/arch/arm64/include/asm/is_compat.h index 8dba5caaf5d1..7726bebc4115 100644 --- a/arch/arm64/include/asm/is_compat.h +++ b/arch/arm64/include/asm/is_compat.h @@ -45,18 +45,44 @@ static inline int is_a32_compat_thread(struct thread_info *thread) #endif /* CONFIG_AARCH32_EL0 */ +#ifdef CONFIG_ARM64_ILP32 + +static inline int is_ilp32_compat_task(void) +{ + return test_thread_flag(TIF_32BIT_AARCH64); +} + +static inline int is_ilp32_compat_thread(struct thread_info *thread) +{ + return test_ti_thread_flag(thread, TIF_32BIT_AARCH64); +} + +#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 /* CONFIG_ARM64_ILP32 */ + #ifdef CONFIG_COMPAT static inline int is_compat_task(void) { - return is_a32_compat_task(); + return is_a32_compat_task() || is_ilp32_compat_task(); } #endif /* CONFIG_COMPAT */ static inline int is_compat_thread(struct thread_info *thread) { - return is_a32_compat_thread(thread); + return is_a32_compat_thread(thread) || is_ilp32_compat_thread(thread); } diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index a7ffea24d94d..abb60b5fc9f4 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h @@ -96,6 +96,7 @@ struct thread_info { #define TIF_RESTORE_SIGMASK20 #define TIF_SINGLESTEP 21 #define TIF_32BIT 22 /* AARCH32 process */ +#define TIF_32BIT_AARCH64 23 /* 32 bit process on AArch64(ILP32) */ #define _TIF_SIGPENDING(1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) @@ -108,6 +109,7 @@ struct thread_info { #define _TIF_SECCOMP (1 << TIF_SECCOMP) #define _TIF_UPROBE(1 << TIF_UPROBE) #define _TIF_32BIT (1 << TIF_32BIT) +#define _TIF_32BIT_AARCH64 (1 << TIF_32BIT_AARCH64) #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \ -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 09/20] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat)
Based on patch of Andrew Pinski. 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. Corresponding functions are located in to avoid mess in headers. Some files include both and , and this is wrong because has already included. It was fixed too. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/include/asm/compat.h | 19 ++- arch/arm64/include/asm/elf.h | 10 +++--- arch/arm64/include/asm/ftrace.h | 2 +- arch/arm64/include/asm/is_compat.h | 64 arch/arm64/include/asm/memory.h | 5 +-- arch/arm64/include/asm/processor.h | 5 +-- arch/arm64/include/asm/syscall.h | 2 +- arch/arm64/include/asm/thread_info.h | 2 +- arch/arm64/kernel/hw_breakpoint.c| 8 ++--- arch/arm64/kernel/perf_regs.c| 2 +- arch/arm64/kernel/process.c | 7 ++-- arch/arm64/kernel/ptrace.c | 11 +++ arch/arm64/kernel/signal.c | 4 +-- arch/arm64/kernel/traps.c| 3 +- arch/arm64/mm/mmap.c | 2 +- 15 files changed, 98 insertions(+), 48 deletions(-) create mode 100644 arch/arm64/include/asm/is_compat.h diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h index e39d487bf724..463533b1ae32 100644 --- a/arch/arm64/include/asm/compat.h +++ b/arch/arm64/include/asm/compat.h @@ -25,6 +25,8 @@ #include #include +#include + #define COMPAT_USER_HZ 100 #ifdef __AARCH64EB__ #define COMPAT_UTS_MACHINE "armv8b\0\0" @@ -299,23 +301,6 @@ struct compat_shmid64_ds { compat_ulong_t __unused5; }; -static inline int is_compat_task(void) -{ - return test_thread_flag(TIF_32BIT); -} - -static inline int is_compat_thread(struct thread_info *thread) -{ - return test_ti_thread_flag(thread, TIF_32BIT); -} - -#else /* !CONFIG_COMPAT */ - -static inline int is_compat_thread(struct thread_info *thread) -{ - return 0; -} - #endif /* CONFIG_COMPAT */ #endif /* __KERNEL__ */ #endif /* __ASM_COMPAT_H */ diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index ac3fb7441510..6a37b6facc69 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -16,6 +16,10 @@ #ifndef __ASM_ELF_H #define __ASM_ELF_H +#ifndef __ASSEMBLY__ +#include +#endif + #include /* @@ -158,13 +162,9 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp); /* 1GB of VA */ -#ifdef CONFIG_COMPAT -#define STACK_RND_MASK (test_thread_flag(TIF_32BIT) ? \ +#define STACK_RND_MASK (is_compat_task() ? \ 0x7ff >> (PAGE_SHIFT - 12) : \ 0x3 >> (PAGE_SHIFT - 12)) -#else -#define STACK_RND_MASK (0x3 >> (PAGE_SHIFT - 12)) -#endif #ifdef __AARCH64EB__ #define COMPAT_ELF_PLATFORM("v8b") diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h index caa955f10e19..0feb28ad10dd 100644 --- a/arch/arm64/include/asm/ftrace.h +++ b/arch/arm64/include/asm/ftrace.h @@ -54,7 +54,7 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr) #define ARCH_TRACE_IGNORE_COMPAT_SYSCALLS static inline bool arch_trace_is_compat_syscall(struct pt_regs *regs) { - return is_compat_task(); + return is_a32_compat_task(); } #endif /* ifndef __ASSEMBLY__ */ diff --git a/arch/arm64/include/asm/is_compat.h b/arch/arm64/include/asm/is_compat.h new file mode 100644 index ..8dba5caaf5d1 --- /dev/null +++ b/arch/arm64/include/asm/is_compat.h @@ -0,0 +1,64 @@ +/* + * 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/>. + */ + +#ifndef __ASM_IS_COMPAT_H +#define __ASM_IS_COMPAT_H +#ifndef __ASSEMBLY__ + +#include + +#ifdef CONFIG_AARCH32_EL0 + +static inline int is_a32_compat_task(void) +{ + return test_thread_flag(TIF_32BIT); +} + +static inline int is_a32_compat_thread(struct thread_info *thread) +{ + return test_ti_thread_flag(thread, TIF_32BIT); +} + +#else + +static inline int is_a32_compat_task(void) + +{ +
[PATCH 06/20] arm64: ensure the kernel is compiled for LP64
From: Andrew Pinski <apin...@cavium.com> The kernel needs to be compiled as a LP64 binary for ARM64, even when using a compiler that defaults to code-generation for the ILP32 ABI. Consequently, we need to explicitly pass '-mabi=lp64' (supported on gcc-4.9 and newer). Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Reviewed-by: David Daney <dda...@caviumnetworks.com> --- arch/arm64/Makefile | 5 + 1 file changed, 5 insertions(+) diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 1ce57b42f390..807451ffcc29 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -50,15 +50,20 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads) KBUILD_AFLAGS += $(lseinstr) $(brokengasinst) +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 UTS_MACHINE:= aarch64_be else KBUILD_CPPFLAGS+= -mlittle-endian AS += -EL LD += -EL +LDFLAGS+= -maarch64linux UTS_MACHINE:= aarch64 endif -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 05/20] arm64: rename COMPAT to AARCH32_EL0 in Kconfig
From: Andrew Pinski <apin...@cavium.com> In this patchset ILP32 ABI support is added. Additionally to AARCH32, which is binary-compatible with ARM, ILP32 is (mostly) ABI-compatible. >From now, AARCH32_EL0 (former COMPAT) config option means the support of AARCH32 userspace, and ARM64_ILP32 - support of ILP32 ABI (see following patches), and COMPAT indicates that one of them or both is enabled. Where needed, CONFIG_COMPAT is changed over to use CONFIG_AARCH32_EL0 instead Reviewed-by: David Daney <dda...@caviumnetworks.com> Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/Kconfig | 9 +++-- arch/arm64/include/asm/fpsimd.h | 2 +- arch/arm64/include/asm/hwcap.h | 4 ++-- arch/arm64/include/asm/processor.h | 6 +++--- arch/arm64/include/asm/ptrace.h | 2 +- arch/arm64/include/asm/seccomp.h | 2 +- arch/arm64/include/asm/signal32.h| 6 -- arch/arm64/include/asm/unistd.h | 2 +- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/asm-offsets.c | 2 +- arch/arm64/kernel/cpufeature.c | 8 arch/arm64/kernel/cpuinfo.c | 8 arch/arm64/kernel/entry.S| 6 +++--- arch/arm64/kernel/head.S | 2 +- arch/arm64/kernel/ptrace.c | 8 arch/arm64/kernel/traps.c| 2 +- arch/arm64/kernel/vdso.c | 4 ++-- drivers/clocksource/arm_arch_timer.c | 2 +- 18 files changed, 42 insertions(+), 35 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 30cadd9a1dab..8713a2807582 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -407,7 +407,7 @@ config ARM64_ERRATUM_834220 config ARM64_ERRATUM_845719 bool "Cortex-A53: 845719: a load might read incorrect data" - depends on COMPAT + depends on AARCH32_EL0 default y help This option adds an alternative code sequence to work around ARM @@ -800,7 +800,7 @@ config FORCE_MAX_ZONEORDER menuconfig ARMV8_DEPRECATED bool "Emulate deprecated/obsolete ARMv8 instructions" - depends on COMPAT + depends on AARCH32_EL0 help Legacy software support may require certain instructions that have been deprecated or obsoleted in the architecture. @@ -1078,7 +1078,12 @@ menu "Userspace binary formats" source "fs/Kconfig.binfmt" config COMPAT + def_bool y + depends on AARCH32_EL0 + +config AARCH32_EL0 bool "Kernel support for 32-bit EL0" + def_bool y depends on ARM64_4K_PAGES || EXPERT select COMPAT_BINFMT_ELF if BINFMT_ELF select HAVE_UID16 diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h index 50f559f574fe..63b19f128c6c 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_MASK0xf89f #define VFP_FPSCR_CTRL_MASK0x07f79f00 diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 400b80b49595..2c7fc5d89813 100644 --- a/arch/arm64/include/asm/hwcap.h +++ b/arch/arm64/include/asm/hwcap.h @@ -46,7 +46,7 @@ */ #define ELF_HWCAP (elf_hwcap) -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define COMPAT_ELF_HWCAP (compat_elf_hwcap) #define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; @@ -54,7 +54,7 @@ extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; enum { CAP_HWCAP = 1, -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 CAP_COMPAT_HWCAP, CAP_COMPAT_HWCAP2, #endif diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 9428b93fefb2..2bbbd33549c0 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -81,7 +81,7 @@ struct cpu_context { struct thread_struct { struct cpu_context cpu_context;/* cpu context */ unsigned long tp_value; /* TLS register */ -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 unsigned long tp2_value; #endif struct fpsimd_state fpsimd_state; @@ -90,7 +90,7 @@ struct thread_struct { struct debug_info debug; /* debugging */ }; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define task_user_tls(t)
[PATCH 04/20] arm64: ilp32: add documentation on the ILP32 ABI for ARM64
Based on Andrew Pinski's patch-series. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- Documentation/arm64/ilp32.txt | 45 +++ 1 file changed, 45 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 ..08935a34e7e9 --- /dev/null +++ b/Documentation/arm64/ilp32.txt @@ -0,0 +1,45 @@ +ILP32 AARCH64 SYSCALL ABI += + +This document describes the ILP32 syscall ABI and where it differs +from the generic compat linux syscall interface. + +AARCH64/ILP32 userspace can pass garbage in the top halve of w0-w7 registers +(syscall arguments). So top 32 bits are zeroed for them. + +Comparing to AARCH32, AARCH64/ILP32 has 64-bit length of following types: +ino_t is u64 type. +off_t is s64 type. +blkcnt_tis s64 type. +fsblkcnt_t is u64 type. +fsfilcnt_t is u64 type. +rlim_t is u64 type. + +AARCH64/ILP32 ABI uses standard syscall table which can be found at +include/uapi/asm-generic/unistd.h, with the exceptions listed below. + +Syscalls which pass 64-bit values are handled by the code shared from +AARCH32 and pass that value as a pair. Next syscalls are affected: +fadvise64_64() +fallocate() +ftruncate64() +pread64() +pwrite64() +readahead() +sync_file_range() +truncate64() + +ptrace() syscall is handled by compat version. + +shmat() syscall is handled by non-compat handler as aarch64/ilp32 has no +limitation on 4-pages alignement for shared memory. + +statfs() and fstatfs() take the size of struct statfs as an argument. +It is calculated differently in kernel and user spaces. So AARCH32 handlers +are taken to handle it. + +struct rt_sigframe is redefined and contains struct compat_siginfo, +as compat syscalls expects, and struct ilp32_sigframe, to handle +AARCH64 register set and 32-bit userspace register representation. + +elf_gregset_t is taken from lp64 to handle registers properly. -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 03/20] asm-generic: Drop getrlimit and setrlimit syscalls from default list
The newer prlimit64 syscall provides all the functionality provided by the getrlimit and setrlimit syscalls and adds the pid of target process, so future architectures won't need to include getrlimit and setrlimit. Therefore drop getrlimit and setrlimit syscalls from the generic syscall list unless __ARCH_WANT_SET_GET_RLIMIT is defined by the architecture's unistd.h prior to including asm-generic/unistd.h, and adjust all architectures using the generic syscall list to define it so that no in-tree architectures are affected. Cc: Arnd Bergmann <a...@arndb.de> Cc: James Hogan <james.ho...@imgtec.com> Cc: linux-a...@vger.kernel.org Cc: linux-snps-...@lists.infradead.org Cc: Catalin Marinas <catalin.mari...@arm.com> Cc: Will Deacon <will.dea...@arm.com> Cc: linux-arm-ker...@lists.infradead.org Cc: Mark Salter <msal...@redhat.com> Cc: Aurelien Jacquiot <a-jacqu...@ti.com> Cc: linux-c6x-...@linux-c6x.org Cc: Richard Kuo <r...@codeaurora.org> Cc: linux-hexa...@vger.kernel.org Cc: linux-me...@vger.kernel.org Cc: Jonas Bonn <jo...@southpole.se> Cc: li...@lists.openrisc.net Cc: Chen Liqin <liqin.li...@gmail.com> Cc: Lennox Wu <lennox...@gmail.com> Cc: Chris Metcalf <cmetc...@mellanox.com> Cc: Guan Xuetao <g...@mprc.pku.edu.cn> Cc: Ley Foon Tan <lf...@altera.com> Cc: nios2-...@lists.rocketboards.org Cc: Yoshinori Sato <ys...@users.sourceforge.jp> Cc: uclinux-h8-de...@lists.sourceforge.jp Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Acked-by: Arnd Bergmann <a...@arndb.de> Acked-by: Mark Salter <msal...@redhat.com> [c6x] Acked-by: James Hogan <james.ho...@imgtec.com> [metag] Acked-by: Ley Foon Tan <lf...@altera.com> [nios2] Acked-by: Stafford Horne <sho...@gmail.com> [openrisc] Acked-by: Will Deacon <will.dea...@arm.com> [arm64] Acked-by: Vineet Gupta <vgu...@synopsys.com> #arch/arc bits --- arch/arc/include/uapi/asm/unistd.h | 1 + arch/arm64/include/uapi/asm/unistd.h | 1 + arch/c6x/include/uapi/asm/unistd.h | 1 + arch/h8300/include/uapi/asm/unistd.h | 1 + arch/hexagon/include/uapi/asm/unistd.h | 1 + arch/metag/include/uapi/asm/unistd.h | 1 + arch/nios2/include/uapi/asm/unistd.h | 1 + arch/openrisc/include/uapi/asm/unistd.h | 1 + arch/score/include/uapi/asm/unistd.h | 1 + arch/tile/include/uapi/asm/unistd.h | 1 + arch/unicore32/include/uapi/asm/unistd.h | 1 + include/uapi/asm-generic/unistd.h| 5 + scripts/checksyscalls.sh | 5 + 13 files changed, 21 insertions(+) diff --git a/arch/arc/include/uapi/asm/unistd.h b/arch/arc/include/uapi/asm/unistd.h index 9a34136d84b2..ac6496527ad6 100644 --- a/arch/arc/include/uapi/asm/unistd.h +++ b/arch/arc/include/uapi/asm/unistd.h @@ -16,6 +16,7 @@ #define _UAPI_ASM_ARC_UNISTD_H #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_VFORK diff --git a/arch/arm64/include/uapi/asm/unistd.h b/arch/arm64/include/uapi/asm/unistd.h index 043d17a21342..48355a683e25 100644 --- a/arch/arm64/include/uapi/asm/unistd.h +++ b/arch/arm64/include/uapi/asm/unistd.h @@ -15,5 +15,6 @@ */ #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #include diff --git a/arch/c6x/include/uapi/asm/unistd.h b/arch/c6x/include/uapi/asm/unistd.h index 12d73d9d81f5..f67623137853 100644 --- a/arch/c6x/include/uapi/asm/unistd.h +++ b/arch/c6x/include/uapi/asm/unistd.h @@ -15,6 +15,7 @@ */ #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SYS_CLONE /* Use the standard ABI for syscalls. */ diff --git a/arch/h8300/include/uapi/asm/unistd.h b/arch/h8300/include/uapi/asm/unistd.h index 7dd20ef7625a..2f98394b77d4 100644 --- a/arch/h8300/include/uapi/asm/unistd.h +++ b/arch/h8300/include/uapi/asm/unistd.h @@ -1,5 +1,6 @@ #define __ARCH_NOMMU #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #include diff --git a/arch/hexagon/include/uapi/asm/unistd.h b/arch/hexagon/include/uapi/asm/unistd.h index 21517600432b..52d585c5cdb2 100644 --- a/arch/hexagon/include/uapi/asm/unistd.h +++ b/arch/hexagon/include/uapi/asm/unistd.h @@ -28,6 +28,7 @@ #define sys_mmap2 sys_mmap_pgoff #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_VFORK diff --git a/arch/metag/include/uapi/asm/unistd.h b/arch/metag/include/uapi/asm/unistd.h index 459b6ec15848..16b5cb32ec21 100644 --- a/arch/metag/include/uapi/asm/unistd.h +++ b/arch/metag/include/uapi/asm/unistd.h @@ -8,6 +8,7 @@ */ #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT /* Use the standard ABI for syscalls. */ #include diff --git a/arch/nios2/include/uapi/asm/unistd.h b/arch/nios2/include/uapi/asm/unistd.h index 51a32c71ce2b..b0dda4de2bc
[PATCH 02/20] 32-bit userspace ABI: introduce ARCH_32BIT_OFF_T config option
All new 32-bit architectures should have 64-bit userspace off_t type, but existing architectures has 32-bit ones. To handle it, new config option is added to arch/Kconfig that defaults ARCH_32BIT_OFF_T to be disabled for non-64 bit architectures. All existing 32-bit architectures enable it explicitly here. New option affects force_o_largefile() behaviour. Namely, if userspace off_t is 64-bits long, we have no reason to reject user to open big files. Note that even if architectures has only 64-bit off_t in the kernel (arc, c6x, h8300, hexagon, metag, nios2, openrisc, tile32 and unicore32), a libc may use 32-bit off_t, and therefore want to limit the file size to 4GB unless specified differently in the open flags. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Acked-by: Arnd Bergmann <a...@arndb.de> --- arch/Kconfig| 15 +++ arch/arc/Kconfig| 1 + arch/arm/Kconfig| 1 + arch/blackfin/Kconfig | 1 + arch/cris/Kconfig | 1 + arch/frv/Kconfig| 1 + arch/h8300/Kconfig | 1 + arch/hexagon/Kconfig| 1 + arch/m32r/Kconfig | 1 + arch/m68k/Kconfig | 1 + arch/metag/Kconfig | 1 + arch/microblaze/Kconfig | 1 + arch/mips/Kconfig | 1 + arch/mn10300/Kconfig| 1 + arch/nios2/Kconfig | 1 + arch/openrisc/Kconfig | 1 + arch/parisc/Kconfig | 1 + arch/powerpc/Kconfig| 1 + arch/score/Kconfig | 1 + arch/sh/Kconfig | 1 + arch/sparc/Kconfig | 1 + arch/tile/Kconfig | 1 + arch/unicore32/Kconfig | 1 + arch/x86/Kconfig| 1 + arch/x86/um/Kconfig | 1 + arch/xtensa/Kconfig | 1 + include/linux/fcntl.h | 2 +- 27 files changed, 41 insertions(+), 1 deletion(-) diff --git a/arch/Kconfig b/arch/Kconfig index 3eac97a4c7b3..350822854148 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -246,6 +246,21 @@ config ARCH_THREAD_STACK_ALLOCATOR config ARCH_WANTS_DYNAMIC_TASK_STRUCT bool +config ARCH_32BIT_OFF_T + bool + depends on !64BIT + help + All new 32-bit architectures should have 64-bit off_t type on + userspace side which corresponds to the loff_t kernel type. This + is the requirement for modern ABIs. Some existing architectures + already have 32-bit off_t. This option is enabled for all such + architectures explicitly. Namely: arc, arm, blackfin, cris, frv, + h8300, hexagon, m32r, m68k, metag, microblaze, mips32, mn10300, + nios2, openrisc, parisc32, powerpc32, score, sh, sparc, tile32, + unicore32, x86_32 and xtensa. This is the complete list. Any + new 32-bit architecture should declare 64-bit off_t type on user + side and so should not enable this option. + config HAVE_REGS_AND_STACK_ACCESS_API bool help diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index a5459698f0ee..cab9c53e0354 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig @@ -11,6 +11,7 @@ config ARC select ARC_TIMERS select ARCH_HAS_SG_CHAIN select ARCH_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC + select ARCH_32BIT_OFF_T select BUILDTIME_EXTABLE_SORT select CLONE_BACKWARDS select COMMON_CLK diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 43f45d3b40e8..dfa038164209 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1,6 +1,7 @@ config ARM bool default y + select ARCH_32BIT_OFF_T select ARCH_CLOCKSOURCE_DATA select ARCH_HAS_DEBUG_VIRTUAL select ARCH_HAS_DEVMEM_IS_ALLOWED diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index 3c1bd640042a..26418e78f06b 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig @@ -12,6 +12,7 @@ config RWSEM_XCHGADD_ALGORITHM config BLACKFIN def_bool y + select ARCH_32BIT_OFF_T select HAVE_ARCH_KGDB select HAVE_ARCH_TRACEHOOK select HAVE_DYNAMIC_FTRACE diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index 71b758dc3a96..8c059f07ddb6 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig @@ -50,6 +50,7 @@ config LOCKDEP_SUPPORT config CRIS bool default y + select ARCH_32BIT_OFF_T select HAVE_IDE select GENERIC_ATOMIC64 select HAVE_UID16 diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig index eefd9a4ed156..2f1490448fd4 100644 --- a/arch/frv/Kconfig +++ b/arch/frv/Kconfig @@ -1,6 +1,7 @@ config FRV bool default y + select ARCH_32BIT_OFF_T select HAVE_IDE select HAVE_ARCH_TRACEHOOK select HAVE_PERF_EVENTS diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig index 6e3d36f37a02..0086abbd8440 100644 --- a/arch/h8300/Kconfig +++ b/arch/h8300/Kconfig @@ -1,5 +1,6 @@ config H8300 def_bool y + select ARCH_32BIT_OFF_T select GENERIC_ATOMIC64 select HAVE_UID16 select VIRT_TO_BUS diff --git a/arch/hexagon/Kconfig b/arch/hexagon/K
[PATCH 01/20] compat ABI: use non-compat openat and open_by_handle_at variants
The only difference is that non-compat version forces O_LARGEFILE, and it should be the default behaviour for all architectures, as we are going to drop the support of 32-bit userspace off_t. The exception is tile32 that continues with compat version of syscalls. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Acked-by: Arnd Bergmann <a...@arndb.de> Acked-by: Chris Metcalf <cmetc...@ezchip.com> [for tile] --- arch/tile/kernel/compat.c | 3 +++ include/uapi/asm-generic/unistd.h | 5 ++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/tile/kernel/compat.c b/arch/tile/kernel/compat.c index bdaf71d31a4a..3b7853c59395 100644 --- a/arch/tile/kernel/compat.c +++ b/arch/tile/kernel/compat.c @@ -103,6 +103,9 @@ COMPAT_SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned int, offset_high, #define compat_sys_readahead sys32_readahead #define sys_llseek compat_sys_llseek +#define sys_openat compat_sys_openat +#define sys_open_by_handle_at compat_sys_open_by_handle_at + /* Call the assembly trampolines where necessary. */ #define compat_sys_rt_sigreturn _compat_sys_rt_sigreturn #define sys_clone _sys_clone diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 061185a5eb51..429dd335def6 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -178,7 +178,7 @@ __SYSCALL(__NR_fchownat, sys_fchownat) #define __NR_fchown 55 __SYSCALL(__NR_fchown, sys_fchown) #define __NR_openat 56 -__SC_COMP(__NR_openat, sys_openat, compat_sys_openat) +__SYSCALL(__NR_openat, sys_openat) #define __NR_close 57 __SYSCALL(__NR_close, sys_close) #define __NR_vhangup 58 @@ -675,8 +675,7 @@ __SYSCALL(__NR_fanotify_mark, sys_fanotify_mark) #define __NR_name_to_handle_at 264 __SYSCALL(__NR_name_to_handle_at, sys_name_to_handle_at) #define __NR_open_by_handle_at 265 -__SC_COMP(__NR_open_by_handle_at, sys_open_by_handle_at, \ - compat_sys_open_by_handle_at) +__SYSCALL(__NR_open_by_handle_at, sys_open_by_handle_at) #define __NR_clock_adjtime 266 __SC_COMP(__NR_clock_adjtime, sys_clock_adjtime, compat_sys_clock_adjtime) #define __NR_syncfs 267 -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v8 00/20] ILP32 for ARM64
This series enables aarch64 with ilp32 mode. As supporting work, it introduces ARCH_32BIT_OFF_T configuration option that is enabled for existing 32-bit architectures but disabled for new arches (so 64-bit off_t userspace type is used by new userspace). Also it deprecates getrlimit and setrlimit syscalls prior to prlimit64. This version is based on linux-next from 2017-06-16. It works with glibc-2.25, and tested with LTP, glibc testsuite, trinity, lmbench, CPUSpec. Patches 1, 2, 3 and 8 are general, and may be applied separately. Kernel, GLIBC and OpenSUSE-based distro: https://github.com/norov/linux/tree/ilp32-20170616.0 https://github.com/norov/glibc/tree/dev9 https://build.opensuse.org/project/show/devel:ARM:Factory:Contrib:ILP32 (GLIBC patches are managed by Steve Ellcey, so my tree is only for reference.) Changes: v3: https://lkml.org/lkml/2014/9/3/704 v4: https://lkml.org/lkml/2015/4/13/691 v5: https://lkml.org/lkml/2015/9/29/911 v6: https://lkml.org/lkml/2016/5/23/661 v7: https://lkml.org/lkml/2017/1/9/213 v8: - off_t referred in patches 2 and 13 stands for userspace type which is underlined in corresponding patch comments and ARCH_32BIT_OFF_T config option description; - __IGNORE_getrlimit and __IGNORE_setrlimit are added to scripts/checksyscalls.sh (patch 3); - for CONFIG_COMPAT, bool changed to def_bool y and 'select COMPAT' is dropped for AARCH32_EL0 and ARM64_ILP32 optiond (patches 5 and 20); - x19 register is used to load TSK_TI_FLAGS in svc path in arch/arm64/kernel/entry.S to avoid register clobbering (patch 14). - ilp32 vdso-related files are syncronized wirh lp64 ones, mostly Makefiles (patch 19); - in arch/arm64/mm/mmap.c, arch_mmap_rnd() swithed to use is_compat_task() (patch 9); - rebased on next-20170616. Andrew Pinski (6): arm64: rename COMPAT to AARCH32_EL0 in Kconfig arm64: ensure the kernel is compiled for LP64 arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext arm64:ilp32: add ARM64_ILP32 to Kconfig Philipp Tomsich (1): arm64:ilp32: add vdso-ilp32 and use for signal return Yury Norov (13): compat ABI: use non-compat openat and open_by_handle_at variants 32-bit userspace ABI: introduce ARCH_32BIT_OFF_T config option asm-generic: Drop getrlimit and setrlimit syscalls from default list arm64: ilp32: add documentation on the ILP32 ABI for ARM64 thread: move thread bits accessors to separated file arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64 arm64: introduce binfmt_elf32.c arm64: ilp32: introduce binfmt_ilp32.c arm64: ilp32: share aarch32 syscall handlers arm64: signal: share lp64 signal routines to ilp32 arm64: signal32: move ilp32 and aarch32 common code to separated file arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 Documentation/arm64/ilp32.txt | 45 +++ arch/Kconfig | 15 +++ arch/arc/Kconfig | 1 + arch/arc/include/uapi/asm/unistd.h| 1 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig| 17 ++- arch/arm64/Makefile | 8 ++ arch/arm64/include/asm/compat.h | 19 +-- arch/arm64/include/asm/elf.h | 40 ++ arch/arm64/include/asm/fpsimd.h | 2 +- arch/arm64/include/asm/ftrace.h | 2 +- arch/arm64/include/asm/hwcap.h| 6 +- arch/arm64/include/asm/is_compat.h| 90 ++ arch/arm64/include/asm/memory.h | 5 +- arch/arm64/include/asm/processor.h| 11 +- arch/arm64/include/asm/ptrace.h | 2 +- arch/arm64/include/asm/seccomp.h | 2 +- arch/arm64/include/asm/signal32.h | 9 +- arch/arm64/include/asm/signal32_common.h | 27 arch/arm64/include/asm/signal_common.h| 33 + arch/arm64/include/asm/signal_ilp32.h | 38 ++ arch/arm64/include/asm/syscall.h | 2 +- arch/arm64/include/asm/thread_info.h | 4 +- arch/arm64/include/asm/unistd.h | 6 +- arch/arm64/include/asm/vdso.h | 6 + arch/arm64/include/uapi/asm/bitsperlong.h | 9 +- arch/arm64/include/uapi/asm/unistd.h | 13 ++ arch/arm64/kernel/Makefile| 8 +- arch/arm64/kernel/asm-offsets.c | 9 +- arch/arm64/kernel/binfmt_elf32.c | 37 ++ arch/arm64/kernel/binfmt_ilp32.c | 85 + arch/arm64/kernel/cpufeature.c| 8 +- arch/arm64/kernel/cpuinfo.c | 8 +- arch/arm64/kernel
Re: [PATCH 02/20] 32-bit ABI: introduce ARCH_32BIT_OFF_T config option
On Thu, Jun 08, 2017 at 04:09:50PM +0100, Catalin Marinas wrote: > On Sun, Jun 04, 2017 at 02:59:51PM +0300, Yury Norov wrote: > > All new 32-bit architectures should have 64-bit off_t type, but existing > > architectures has 32-bit ones. > > > > To handle it, new config option is added to arch/Kconfig that defaults > > ARCH_32BIT_OFF_T to be disabled for non-64 bit architectures. All existing > > 32-bit architectures enable it explicitly here. > > > > New option affects force_o_largefile() behaviour. Namely, if off_t is > > 64-bits long, we have no reason to reject user to open big files. > > > > Note that even if architectures has only 64-bit off_t in the kernel > > (arc, c6x, h8300, hexagon, metag, nios2, openrisc, tile32 and unicore32), > > a libc may use 32-bit off_t, and therefore want to limit the file size > > to 4GB unless specified differently in the open flags. > > > > Signed-off-by: Yury Norov <yno...@caviumnetworks.com> > > Acked-by: Arnd Bergmann <a...@arndb.de> > [...] > > diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h > > index 1b48d9c9a561..297993c92490 100644 > > --- a/include/linux/fcntl.h > > +++ b/include/linux/fcntl.h > > @@ -11,7 +11,7 @@ > > O_NOATIME | O_CLOEXEC | O_PATH | __O_TMPFILE) > > > > #ifndef force_o_largefile > > -#define force_o_largefile() (BITS_PER_LONG != 32) > > +#define force_o_largefile() (!IS_ENABLED(CONFIG_ARCH_32BIT_OFF_T)) > > #endif > > I may have confused myself with which off_t is 64-bit here for new > 32-bit architectures. Are we referring to the glibc definition, the > kernel one or simply that force_o_largefile() is true by default. > Because the type off_t for 32-bit kernel builds is still, well, 32-bit. > > Otherwise it seems that the first paragraph in the description above > should read "all new 32-bit ABIs on a 64-bit kernel..." but then > AArch64/ILP32 is no longer the same as a new, pure 32-bit architecture. This is all about userspace off_t types, like Arnd told in the comment to patch 13. I'll underline it in the comment to the patch. If it's not enough, I can also rename the config option to CONFIG_ARCH_32BIT_USER_OFF_T or similar. For me it's too much, but if you find it reasonable, I'll do it. Just let me know. Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 14/20] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it
On Thu, Jun 08, 2017 at 04:05:36PM +0100, James Morse wrote: > Hi Yury, > > On 04/06/17 13:00, Yury Norov wrote: > > From: Andrew Pinski <apin...@cavium.com> > > > > Add a separate syscall-table for ILP32, which dispatches either to native > > LP64 system call implementation or to compat-syscalls, as appropriate. > > (I'm still reading through this series trying to understand it, but spotted > this: ) > > > diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S > > index 279bc2ab10c3..7d52fe1ec6bd 100644 > > --- a/arch/arm64/kernel/entry.S > > +++ b/arch/arm64/kernel/entry.S > > @@ -577,6 +594,7 @@ el0_svc_compat: > > * AArch32 syscall handling > > */ > > adrpstbl, compat_sys_call_table // load compat syscall table > > pointer > > + ldr x16, [tsk, #TSK_TI_FLAGS] > > uxtwscno, w7// syscall number in w7 (r7) > > mov sc_nr, #__NR_compat_syscalls > > b el0_svc_naked > > @@ -798,15 +816,21 @@ ENDPROC(ret_from_fork) > > .align 6 > > el0_svc: > > adrpstbl, sys_call_table// load syscall table pointer > > + ldr x16, [tsk, #TSK_TI_FLAGS] > > uxtwscno, w8// syscall number in w8 > > mov sc_nr, #__NR_syscalls > > +#ifdef CONFIG_ARM64_ILP32 > > + tst x16, #_TIF_32BIT_AARCH64 > > + b.eqel0_svc_naked // We are using LP64 syscall > > table > > + adrpstbl, sys_call_ilp32_table // load ilp32 syscall table > > pointer > > + delouse_input_regs > > +#endif > > el0_svc_naked: // compat entry point > > stp x0, scno, [sp, #S_ORIG_X0] // save the original x0 and > > syscall number > > enable_dbg_and_irq > > ct_user_exit 1 > > > > > - ldr x16, [tsk, #TSK_TI_FLAGS] // check for syscall hooks > > If built with CONFIG_CONTEXT_TRACKING, ct_user_exit will call > context_tracking_user_exit(), this will clobber x16 which you depend on not > changing below: > > > > - tst x16, #_TIF_SYSCALL_WORK > > + tst x16, #_TIF_SYSCALL_WORK // check for syscall hooks > > > b.ne__sys_trace > > cmp scno, sc_nr // check upper syscall limit > > b.hsni_sys Hi James, Thanks for the catch. I'll use x19 insteas - it's callee-saved. Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 19/20] arm64:ilp32: add vdso-ilp32 and use for signal return
On Thu, Jun 08, 2017 at 04:24:34PM +0100, Catalin Marinas wrote: > On Sun, Jun 04, 2017 at 03:00:08PM +0300, Yury Norov wrote: > > From: Philipp Tomsich <philipp.toms...@theobroma-systems.com> > > > > ILP32 VDSO exports following symbols: > > __kernel_rt_sigreturn; > > __kernel_gettimeofday; > > __kernel_clock_gettime; > > __kernel_clock_getres. > > > > What shared object to use, kernel selects depending on result of > > is_ilp32_compat_task() in arch/arm64/kernel/vdso.c, so it substitutes > > correct pages and spec. > > > > Adjusted to move the data page before code pages in sync with > > commit 601255ae3c98 ("arm64: vdso: move data page before code pages") > > > > Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> > > Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> > > Signed-off-by: Yury Norov <yno...@caviumnetworks.com> > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> > > --- > > arch/arm64/Makefile | 3 + > > arch/arm64/include/asm/vdso.h | 6 ++ > > arch/arm64/kernel/Makefile| 1 + > > arch/arm64/kernel/asm-offsets.c | 7 ++ > > arch/arm64/kernel/signal.c| 2 + > > arch/arm64/kernel/vdso-ilp32/.gitignore | 2 + > > arch/arm64/kernel/vdso-ilp32/Makefile | 80 ++ > > arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S | 33 ++ > > arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S | 95 > > +++ > > arch/arm64/kernel/vdso.c | 65 +++--- > > arch/arm64/kernel/vdso/gettimeofday.S | 20 +- > > arch/arm64/kernel/vdso/vdso.S | 6 +- > > 12 files changed, 304 insertions(+), 16 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 > > Does this patch get simpler with Andrew Pinski's vdso in C proposal? > I have to read the other thread in detail, Will followed up already. Not much. arch/arm64/kernel/vdso/gettimeofday.S is removed by Andrew, so it will also disappear here. New gettimeofday.c is just compiled with mabi=ilp32, and almost don't need modifications. Makefiles will be modified accordingly. The rest is the same. This is the draft for the changes we need to apply ilp32 series on top of Andrew's patch (there's few typos though, so only for reference): http://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1409447.html > > diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h > > index 839ce0031bd5..649a9a416500 100644 > > --- a/arch/arm64/include/asm/vdso.h > > +++ b/arch/arm64/include/asm/vdso.h > > @@ -29,6 +29,12 @@ > > > > #include > > > > +#ifdef CONFIG_ARM64_ILP32 > > +#include > > +#else > > +#define vdso_offset_sigtramp_ilp32 > > +#endif > > BTW, here you could do something like: > > #define vdso_offset_sigtramp_ilp32({ BUILD_BUG(); 0; }) OK, will change -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 05/20] arm64: rename COMPAT to AARCH32_EL0 in Kconfig
Hi Catalin, thanks for review. On Thu, Jun 08, 2017 at 03:09:12PM +0100, Catalin Marinas wrote: > On Sun, Jun 04, 2017 at 02:59:54PM +0300, Yury Norov wrote: > > --- a/arch/arm64/Kconfig > > +++ b/arch/arm64/Kconfig > > @@ -402,7 +402,7 @@ config ARM64_ERRATUM_834220 > > > > config ARM64_ERRATUM_845719 > > bool "Cortex-A53: 845719: a load might read incorrect data" > > - depends on COMPAT > > + depends on AARCH32_EL0 > > default y > > help > > This option adds an alternative code sequence to work around ARM > > @@ -784,7 +784,7 @@ config FORCE_MAX_ZONEORDER > > > > menuconfig ARMV8_DEPRECATED > > bool "Emulate deprecated/obsolete ARMv8 instructions" > > - depends on COMPAT > > + depends on AARCH32_EL0 > > help > > Legacy software support may require certain instructions > > that have been deprecated or obsoleted in the architecture. > > @@ -1062,9 +1062,15 @@ menu "Userspace binary formats" > > source "fs/Kconfig.binfmt" > > > > config COMPAT > > + bool > > + depends on AARCH32_EL0 > > You could just use "def_bool y" here > > > + > > +config AARCH32_EL0 > > bool "Kernel support for 32-bit EL0" > > + def_bool y > > depends on ARM64_4K_PAGES || EXPERT > > select COMPAT_BINFMT_ELF if BINFMT_ELF > > + select COMPAT > > and avoid the explicit select. in patch 20 COMPAT becomes depending also on ARM64_ILP32, like this: - depends on AARCH32_EL0 + depends on AARCH32_EL0 || ARM64_ILP32 So this is a preparation for it. If it looks confusing, I think it's better to underline it in the description to the patch in addition to this: > From now, AARCH32_EL0 (former COMPAT) config option means the support of > AARCH32 userspace, ARM64_ILP32 - support of ILP32 ABI (see next patches), > and COMPAT indicates that one of them, or both, is enabled. But if you prefer, I can do like you suggested here and make COMPAT depend on AARCH32_EL0 in the last patch. > > > select HAVE_UID16 > > select OLD_SIGSUSPEND3 > > select COMPAT_OLD_SIGACTION > [...] > > --- a/arch/arm64/kernel/cpuinfo.c > > +++ b/arch/arm64/kernel/cpuinfo.c > > @@ -139,15 +139,17 @@ static int c_show(struct seq_file *m, void *v) > > */ > > seq_puts(m, "Features\t:"); > > if (compat) { > > -#ifdef CONFIG_COMPAT > > - for (j = 0; compat_hwcap_str[j]; j++) > > - if (compat_elf_hwcap & (1 << j)) > > - seq_printf(m, " %s", > > compat_hwcap_str[j]); > > - > > - for (j = 0; compat_hwcap2_str[j]; j++) > > - if (compat_elf_hwcap2 & (1 << j)) > > - seq_printf(m, " %s", > > compat_hwcap2_str[j]); > > -#endif /* CONFIG_COMPAT */ > > +#ifdef CONFIG_AARCH32_EL0 > > + if (personality(current->personality) == PER_LINUX32) { > > + for (j = 0; compat_hwcap_str[j]; j++) > > + if (compat_elf_hwcap & (1 << j)) > > + seq_printf(m, " %s", > > compat_hwcap_str[j]); > > + > > + for (j = 0; compat_hwcap2_str[j]; j++) > > + if (compat_elf_hwcap2 & (1 << j)) > > + seq_printf(m, " %s", > > compat_hwcap2_str[j]); > > + } > > +#endif /* CONFIG_AARCH32_EL0 */ > > I don't understand this hunk. Why do you need another check on > personality? "compat" is already true if PER_LINUX32. I think it's rebase issue. I'll fix it. Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 03/20] asm-generic: Drop getrlimit and setrlimit syscalls from default list
On Mon, Jun 05, 2017 at 03:44:06PM +0100, James Hogan wrote: > Hi Yury, > > On Sun, Jun 04, 2017 at 02:59:52PM +0300, Yury Norov wrote: > > The newer prlimit64 syscall provides all the functionality provided by > > the getrlimit and setrlimit syscalls and adds the pid of target process, > > so future architectures won't need to include getrlimit and setrlimit. > > > > Therefore drop getrlimit and setrlimit syscalls from the generic syscall > > list unless __ARCH_WANT_SET_GET_RLIMIT is defined by the architecture's > > unistd.h prior to including asm-generic/unistd.h, and adjust all > > architectures > > using the generic syscall list to define it so that no in-tree architectures > > are affected. > > > > Cc: Arnd Bergmann <a...@arndb.de> > > Cc: James Hogan <james.ho...@imgtec.com> > > Cc: linux-a...@vger.kernel.org > > Cc: linux-snps-...@lists.infradead.org > > Cc: Catalin Marinas <catalin.mari...@arm.com> > > Cc: Will Deacon <will.dea...@arm.com> > > Cc: linux-arm-ker...@lists.infradead.org > > Cc: Mark Salter <msal...@redhat.com> > > Cc: Aurelien Jacquiot <a-jacqu...@ti.com> > > Cc: linux-c6x-...@linux-c6x.org > > Cc: Richard Kuo <r...@codeaurora.org> > > Cc: linux-hexa...@vger.kernel.org > > Cc: linux-me...@vger.kernel.org > > Cc: Jonas Bonn <jo...@southpole.se> > > Cc: li...@lists.openrisc.net > > Cc: Chen Liqin <liqin.li...@gmail.com> > > Cc: Lennox Wu <lennox...@gmail.com> > > Cc: Chris Metcalf <cmetc...@mellanox.com> > > Cc: Guan Xuetao <g...@mprc.pku.edu.cn> > > Cc: Ley Foon Tan <lf...@altera.com> > > Cc: nios2-...@lists.rocketboards.org > > Cc: Yoshinori Sato <ys...@users.sourceforge.jp> > > Cc: uclinux-h8-de...@lists.sourceforge.jp > > Signed-off-by: Yury Norov <yno...@caviumnetworks.com> > > Acked-by: Arnd Bergmann <a...@arndb.de> > > Acked-by: Mark Salter <msal...@redhat.com> [c6x] > > Acked-by: James Hogan <james.ho...@imgtec.com> [metag] > > Acked-by: Ley Foon Tan <lf...@altera.com> [nios2] > > Acked-by: Stafford Horne <sho...@gmail.com> [openrisc] > > Acked-by: Will Deacon <will.dea...@arm.com> [arm64] > > Acked-by: Vineet Gupta <vgu...@synopsys.com> #arch/arc bits > > --- > > arch/arc/include/uapi/asm/unistd.h | 1 + > > arch/arm64/include/uapi/asm/unistd.h | 1 + > > arch/c6x/include/uapi/asm/unistd.h | 1 + > > arch/h8300/include/uapi/asm/unistd.h | 1 + > > arch/hexagon/include/uapi/asm/unistd.h | 1 + > > arch/metag/include/uapi/asm/unistd.h | 1 + > > arch/nios2/include/uapi/asm/unistd.h | 1 + > > arch/openrisc/include/uapi/asm/unistd.h | 1 + > > arch/score/include/uapi/asm/unistd.h | 1 + > > arch/tile/include/uapi/asm/unistd.h | 1 + > > arch/unicore32/include/uapi/asm/unistd.h | 1 + > > include/uapi/asm-generic/unistd.h| 5 + > > Don't forget to add __IGNORE_getrlimit and __IGNORE_setrlimit to > scripts/checksyscalls.sh, or you'll get warnings about missing syscalls. > > Cheers > James Hi James, Thanks for the hint. Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 16/20] arm64: signal32: move ilp32 and aarch32 common code to separated file
Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/include/asm/signal32.h| 3 + arch/arm64/include/asm/signal32_common.h | 27 +++ arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/signal32.c | 107 arch/arm64/kernel/signal32_common.c | 135 +++ 5 files changed, 166 insertions(+), 108 deletions(-) create mode 100644 arch/arm64/include/asm/signal32_common.h create mode 100644 arch/arm64/kernel/signal32_common.c diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h index e68fcce538e1..1c4ede717bd2 100644 --- a/arch/arm64/include/asm/signal32.h +++ b/arch/arm64/include/asm/signal32.h @@ -13,6 +13,9 @@ * 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 + #ifndef __ASM_SIGNAL32_H #define __ASM_SIGNAL32_H diff --git a/arch/arm64/include/asm/signal32_common.h b/arch/arm64/include/asm/signal32_common.h new file mode 100644 index ..36c1ebc07a97 --- /dev/null +++ b/arch/arm64/include/asm/signal32_common.h @@ -0,0 +1,27 @@ +/* + * 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/>. + */ +#ifndef __ASM_SIGNAL32_COMMON_H +#define __ASM_SIGNAL32_COMMON_H + +#ifdef CONFIG_COMPAT + +int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from); +int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from); + +int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set); +int get_sigset_t(sigset_t *set, const compat_sigset_t __user *uset); + +#endif /* CONFIG_COMPAT*/ + +#endif /* __ASM_SIGNAL32_COMMON_H */ diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 7e0c48f858f1..1dd659907f34 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -30,7 +30,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o -arm64-obj-$(CONFIG_COMPAT) += entry32_common.o +arm64-obj-$(CONFIG_COMPAT) += entry32_common.o signal32_common.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c index c747a0fc5d7d..181cc3012bda 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c @@ -103,113 +103,6 @@ struct compat_rt_sigframe { #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) -static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set) -{ - compat_sigset_t cset; - - cset.sig[0] = set->sig[0] & 0xull; - cset.sig[1] = set->sig[0] >> 32; - - return copy_to_user(uset, , sizeof(*uset)); -} - -static inline int get_sigset_t(sigset_t *set, - const compat_sigset_t __user *uset) -{ - compat_sigset_t s32; - - if (copy_from_user(, uset, sizeof(*uset))) - return -EFAULT; - - set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); - return 0; -} - -int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) -{ - int err; - - if (!access_ok(VERIFY_WRITE, to, sizeof(*to))) - return -EFAULT; - - /* If you change siginfo_t structure, please be sure -* this code is fixed accordingly. -* It should never copy any pad contained in the structure -* to avoid security leaks, but must copy the generic -* 3 ints plus the relevant union member. -* This routine must convert siginfo from 64bit to 32bit as well -* at the same time. -*/ - err = __put_user(from->si_signo, >si_signo); - err |= __put_user(from->si_errno, >si_errno); - err |= __put_user((short)from->si_code, >si_code); - if (from->si_code < 0) - err |= __copy_to_user(>_sifields._pad, >_sifields._pad, - SI_PAD_SIZE); - else switch (from->si_code & __SI_MASK) {
[PATCH 13/20] arm64: ilp32: share aarch32 syscall handlers
off_t is passed in register pair just like in aarch32. In this patch corresponding aarch32 handlers are shared to ilp32 code. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/entry32.S| 80 --- arch/arm64/kernel/entry32_common.S | 107 + 3 files changed, 108 insertions(+), 80 deletions(-) create mode 100644 arch/arm64/kernel/entry32_common.S diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 5ba41095c466..f6f12e2e5010 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -30,6 +30,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o +arm64-obj-$(CONFIG_COMPAT) += entry32_common.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/entry32.S b/arch/arm64/kernel/entry32.S index f332d5d1f6b4..4bede0324440 100644 --- a/arch/arm64/kernel/entry32.S +++ b/arch/arm64/kernel/entry32.S @@ -39,83 +39,3 @@ ENTRY(compat_sys_rt_sigreturn_wrapper) mov x0, sp b compat_sys_rt_sigreturn ENDPROC(compat_sys_rt_sigreturn_wrapper) - -ENTRY(compat_sys_statfs64_wrapper) - mov w3, #84 - cmp w1, #88 - cselw1, w3, w1, eq - b compat_sys_statfs64 -ENDPROC(compat_sys_statfs64_wrapper) - -ENTRY(compat_sys_fstatfs64_wrapper) - mov w3, #84 - cmp w1, #88 - cselw1, w3, w1, eq - b compat_sys_fstatfs64 -ENDPROC(compat_sys_fstatfs64_wrapper) - -/* - * Note: off_4k (w5) is always in units of 4K. If we can't do the - * requested offset because it is not page-aligned, we return -EINVAL. - */ -ENTRY(compat_sys_mmap2_wrapper) -#if PAGE_SHIFT > 12 - tst w5, #~PAGE_MASK >> 12 - b.ne1f - lsr w5, w5, #PAGE_SHIFT - 12 -#endif - b sys_mmap_pgoff -1: mov x0, #-EINVAL - ret -ENDPROC(compat_sys_mmap2_wrapper) - -/* - * Wrappers for AArch32 syscalls that either take 64-bit parameters - * in registers or that take 32-bit parameters which require sign - * extension. - */ -ENTRY(compat_sys_pread64_wrapper) - regs_to_64 x3, x4, x5 - b sys_pread64 -ENDPROC(compat_sys_pread64_wrapper) - -ENTRY(compat_sys_pwrite64_wrapper) - regs_to_64 x3, x4, x5 - b sys_pwrite64 -ENDPROC(compat_sys_pwrite64_wrapper) - -ENTRY(compat_sys_truncate64_wrapper) - regs_to_64 x1, x2, x3 - b sys_truncate -ENDPROC(compat_sys_truncate64_wrapper) - -ENTRY(compat_sys_ftruncate64_wrapper) - regs_to_64 x1, x2, x3 - b sys_ftruncate -ENDPROC(compat_sys_ftruncate64_wrapper) - -ENTRY(compat_sys_readahead_wrapper) - regs_to_64 x1, x2, x3 - mov w2, w4 - b sys_readahead -ENDPROC(compat_sys_readahead_wrapper) - -ENTRY(compat_sys_fadvise64_64_wrapper) - mov w6, w1 - regs_to_64 x1, x2, x3 - regs_to_64 x2, x4, x5 - mov w3, w6 - b sys_fadvise64_64 -ENDPROC(compat_sys_fadvise64_64_wrapper) - -ENTRY(compat_sys_sync_file_range2_wrapper) - regs_to_64 x2, x2, x3 - regs_to_64 x3, x4, x5 - b sys_sync_file_range2 -ENDPROC(compat_sys_sync_file_range2_wrapper) - -ENTRY(compat_sys_fallocate_wrapper) - regs_to_64 x2, x2, x3 - regs_to_64 x3, x4, x5 - b sys_fallocate -ENDPROC(compat_sys_fallocate_wrapper) diff --git a/arch/arm64/kernel/entry32_common.S b/arch/arm64/kernel/entry32_common.S new file mode 100644 index ..f4a5e4de6201 --- /dev/null +++ b/arch/arm64/kernel/entry32_common.S @@ -0,0 +1,107 @@ +/* + * Compat system call wrappers + * + * Copyright (C) 2012 ARM Ltd. + * Authors: Will Deacon <will.dea...@arm.com> + * Catalin Marinas <catalin.mari...@arm.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 +#include + +#include +#include +#include +#include + +/* + * Note: off_4k (w5) is always in units of 4K.
[PATCH 19/20] arm64:ilp32: add vdso-ilp32 and use for signal return
From: Philipp Tomsich <philipp.toms...@theobroma-systems.com> ILP32 VDSO exports following symbols: __kernel_rt_sigreturn; __kernel_gettimeofday; __kernel_clock_gettime; __kernel_clock_getres. What shared object to use, kernel selects depending on result of is_ilp32_compat_task() in arch/arm64/kernel/vdso.c, so it substitutes correct pages and spec. Adjusted to move the data page before code pages in sync with commit 601255ae3c98 ("arm64: vdso: move data page before code pages") Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/Makefile | 3 + arch/arm64/include/asm/vdso.h | 6 ++ arch/arm64/kernel/Makefile| 1 + arch/arm64/kernel/asm-offsets.c | 7 ++ arch/arm64/kernel/signal.c| 2 + arch/arm64/kernel/vdso-ilp32/.gitignore | 2 + arch/arm64/kernel/vdso-ilp32/Makefile | 80 ++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S | 33 ++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S | 95 +++ arch/arm64/kernel/vdso.c | 65 +++--- arch/arm64/kernel/vdso/gettimeofday.S | 20 +- arch/arm64/kernel/vdso/vdso.S | 6 +- 12 files changed, 304 insertions(+), 16 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/Makefile b/arch/arm64/Makefile index 5ddfb3140f7a..ee9f47190d8f 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -152,6 +152,9 @@ archclean: prepare: vdso_prepare vdso_prepare: prepare0 $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso include/generated/vdso-offsets.h +ifeq ($(CONFIG_ARM64_ILP32), y) + $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso-ilp32 include/generated/vdso-ilp32-offsets.h +endif define archhelp echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h index 839ce0031bd5..649a9a416500 100644 --- a/arch/arm64/include/asm/vdso.h +++ b/arch/arm64/include/asm/vdso.h @@ -29,6 +29,12 @@ #include +#ifdef CONFIG_ARM64_ILP32 +#include +#else +#define vdso_offset_sigtramp_ilp32 +#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 f3bf1b74bb4a..0e628f67e249 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -58,6 +58,7 @@ arm64-reloc-test-y := reloc_test_core.o reloc_test_syms.o arm64-obj-$(CONFIG_CRASH_DUMP) += crash_dump.o obj-y += $(arm64-obj-y) vdso/ probes/ +obj-$(CONFIG_ARM64_ILP32) += vdso-ilp32/ obj-m += $(arm64-obj-m) head-y := head.o extra-y+= $(head-y) vmlinux.lds diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index aec5b6cedc7c..c8a09718e998 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -121,6 +121,13 @@ int main(void) DEFINE(TSPEC_TV_SEC, offsetof(struct timespec, tv_sec)); DEFINE(TSPEC_TV_NSEC,offsetof(struct timespec, tv_nsec)); BLANK(); +#ifdef CONFIG_COMPAT + DEFINE(COMPAT_TVAL_TV_SEC, offsetof(struct compat_timeval, tv_sec)); + DEFINE(COMPAT_TVAL_TV_USEC, offsetof(struct compat_timeval, tv_usec)); + DEFINE(COMPAT_TSPEC_TV_SEC, offsetof(struct compat_timespec, tv_sec)); + DEFINE(COMPAT_TSPEC_TV_NSEC, offsetof(struct compat_timespec, tv_nsec)); + BLANK(); +#endif DEFINE(TZ_MINWEST, offsetof(struct timezone, tz_minuteswest)); DEFINE(TZ_DSTTIME, offsetof(struct timezone, tz_dsttime)); BLANK(); diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index b78f4c255636..a7f201dba9de 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -267,6 +267,8 @@ void setup_return(struct pt_regs *regs, struct k_sigaction *ka, if (ka->sa.sa_flags & SA_RESTORER) sigtramp = ka->sa.sa_restorer; + else if (is_ilp32_compat_task()) + sigtramp = VDSO_SYMBOL(current->mm->context.vdso, sigtramp_ilp32); else sigtramp = VDSO_SYMBOL(current
[PATCH 15/20] arm64: signal: share lp64 signal routines to ilp32
After that, it will be possible to reuse it in ilp32. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/include/asm/signal_common.h | 33 arch/arm64/kernel/signal.c | 93 +- 2 files changed, 92 insertions(+), 34 deletions(-) create mode 100644 arch/arm64/include/asm/signal_common.h diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h new file mode 100644 index ..f68238160940 --- /dev/null +++ b/arch/arm64/include/asm/signal_common.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2017 Cavium Networks. + * + * 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/>. + */ + +#ifndef __ASM_SIGNAL_COMMON_H +#define __ASM_SIGNAL_COMMON_H + +#include +#include +#include + +int preserve_fpsimd_context(struct fpsimd_context __user *ctx); +int restore_fpsimd_context(struct fpsimd_context __user *ctx); +int setup_sigcontext(struct sigcontext __user *uc_mcontext, struct pt_regs *regs); +int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sf); +void setup_return(struct pt_regs *regs, struct k_sigaction *ka, + void __user *frame, off_t sigframe_off, int usig); + +#endif /* __ASM_SIGNAL_COMMON_H */ diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 5fa1b401c5d6..9f2ea60b9fac 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -34,18 +34,26 @@ #include #include #include +#include + +#define RT_SIGFRAME_FP_POS (offsetof(struct rt_sigframe, sig) \ + + offsetof(struct sigframe, fp)) + +struct sigframe { + struct ucontext uc; + u64 fp; + u64 lr; +}; /* * Do a signal return; undo the signal stack. These are aligned to 128-bit. */ struct rt_sigframe { struct siginfo info; - struct ucontext uc; - u64 fp; - u64 lr; + struct sigframe sig; }; -static int preserve_fpsimd_context(struct fpsimd_context __user *ctx) +int preserve_fpsimd_context(struct fpsimd_context __user *ctx) { struct fpsimd_state *fpsimd = >thread.fpsimd_state; int err; @@ -65,7 +73,7 @@ static int preserve_fpsimd_context(struct fpsimd_context __user *ctx) return err ? -EFAULT : 0; } -static int restore_fpsimd_context(struct fpsimd_context __user *ctx) +int restore_fpsimd_context(struct fpsimd_context __user *ctx) { struct fpsimd_state fpsimd; __u32 magic, size; @@ -93,22 +101,30 @@ static int restore_fpsimd_context(struct fpsimd_context __user *ctx) } static int restore_sigframe(struct pt_regs *regs, - struct rt_sigframe __user *sf) + struct sigframe __user *sf) { sigset_t set; - int i, err; - void *aux = sf->uc.uc_mcontext.__reserved; - + int err; err = __copy_from_user(, >uc.uc_sigmask, sizeof(set)); if (err == 0) set_current_blocked(); + err |= restore_sigcontext(regs, >uc.uc_mcontext); + return err; +} + + +int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *uc_mcontext) +{ + int i, err = 0; + void *aux = uc_mcontext->__reserved; + for (i = 0; i < 31; i++) - __get_user_error(regs->regs[i], >uc.uc_mcontext.regs[i], + __get_user_error(regs->regs[i], _mcontext->regs[i], err); - __get_user_error(regs->sp, >uc.uc_mcontext.sp, err); - __get_user_error(regs->pc, >uc.uc_mcontext.pc, err); - __get_user_error(regs->pstate, >uc.uc_mcontext.pstate, err); + __get_user_error(regs->sp, _mcontext->sp, err); + __get_user_error(regs->pc, _mcontext->pc, err); + __get_user_error(regs->pstate, _mcontext->pstate, err); /* * Avoid sys_rt_sigreturn() restarting. @@ -145,10 +161,10 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) goto badframe; - if (restore_sigframe(regs, frame)) + if (restore_sigframe(regs, >sig)) goto badframe; - if (restore_altstack(>uc.uc_stack)) + if (restor
[PATCH 17/20] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext
From: Andrew Pinski <apin...@cavium.com> ILP32 uses AARCH32 compat structures and syscall handlers for signals. But ILP32 struct rt_sigframe and ucontext differs from both LP64 and AARCH32. So some specific mechanism is needed to take care of it. Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/include/asm/signal_ilp32.h | 38 arch/arm64/kernel/Makefile| 3 +- arch/arm64/kernel/entry_ilp32.S | 22 + arch/arm64/kernel/signal.c| 3 + arch/arm64/kernel/signal_ilp32.c | 170 ++ 5 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 arch/arm64/include/asm/signal_ilp32.h create mode 100644 arch/arm64/kernel/entry_ilp32.S create mode 100644 arch/arm64/kernel/signal_ilp32.c diff --git a/arch/arm64/include/asm/signal_ilp32.h b/arch/arm64/include/asm/signal_ilp32.h new file mode 100644 index ..3c6d737c07c0 --- /dev/null +++ b/arch/arm64/include/asm/signal_ilp32.h @@ -0,0 +1,38 @@ +/* + * 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 +#include + +#ifndef __ASM_SIGNAL_ILP32_H +#define __ASM_SIGNAL_ILP32_H + +#ifdef CONFIG_ARM64_ILP32 + +#include + +int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, + struct pt_regs *regs); + +#else + +static inline int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, + struct pt_regs *regs) +{ + return -ENOSYS; +} + +#endif /* CONFIG_ARM64_ILP32 */ + +#endif /* __ASM_SIGNAL_ILP32_H */ diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 1dd659907f34..f3bf1b74bb4a 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,7 +29,8 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o -arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o +arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o \ + signal_ilp32.o entry_ilp32.o arm64-obj-$(CONFIG_COMPAT) += entry32_common.o signal32_common.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/entry_ilp32.S b/arch/arm64/kernel/entry_ilp32.S new file mode 100644 index ..a8bb94b3901b --- /dev/null +++ b/arch/arm64/kernel/entry_ilp32.S @@ -0,0 +1,22 @@ +/* + * ILP32 system call wrappers + * + * 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 + +ENTRY(ilp32_sys_rt_sigreturn_wrapper) + mov x0, sp + b ilp32_sys_rt_sigreturn +ENDPROC(ilp32_sys_rt_sigreturn_wrapper) diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 9f2ea60b9fac..b78f4c255636 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -35,6 +35,7 @@ #include #include #include +#include #define RT_SIGFRAME_FP_POS (offsetof(struct rt_sigframe, sig) \ + offsetof(struct sigframe, fp)) @@ -325,6 +326,8 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) ret = compat_setup_rt_frame(usig, ksig, oldset, regs); else ret = compat_setup_frame(usig, ksig, oldset, regs); + } else if (is_ilp32_compat_task()) { + ret = ilp32_setup_rt_frame(usig, ksig, oldset, regs); } else { ret = setup_rt_frame(usig, ksig, oldset, regs); } diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c new file
[PATCH 12/20] arm64: ilp32: introduce binfmt_ilp32.c
Like binfmt_elf32.c, binfmt_ilp32.c is needed to handle ILP32 binaries Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/binfmt_ilp32.c | 85 2 files changed, 86 insertions(+) create mode 100644 arch/arm64/kernel/binfmt_ilp32.c diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 6f872741fd3d..5ba41095c466 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,6 +29,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o +arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c new file mode 100644 index ..bb31325e6f80 --- /dev/null +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -0,0 +1,85 @@ +/* + * Support for ILP32 Linux/aarch64 ELF binaries. + */ +#undef CONFIG_AARCH32_EL0 +#define compat_elf_gregset_t elf_gregset_t + +#include +#include + +#undef ELF_CLASS +#define ELF_CLASS ELFCLASS32 + +#undef elfhdr +#undef elf_phdr +#undef elf_shdr +#undef elf_note +#undef elf_addr_t +#define elfhdr elf32_hdr +#define elf_phdr elf32_phdr +#define elf_shdr elf32_shdr +#define elf_note elf32_note +#define elf_addr_t Elf32_Addr + +/* + * Some data types as stored in coredump. + */ +#define user_long_tcompat_long_t +#define user_siginfo_t compat_siginfo_t +#define copy_siginfo_to_user copy_siginfo_to_user32 + +/* + * The machine-dependent core note format types are defined in elfcore-compat.h, + * which requires asm/elf.h to define compat_elf_gregset_t et al. + */ +#define elf_prstatus compat_elf_prstatus +#define elf_prpsinfo compat_elf_prpsinfo + +/* AARCH64 ILP32 EABI. */ +#undef elf_check_arch +#define elf_check_arch(x) (((x)->e_machine == EM_AARCH64) \ + && (x)->e_ident[EI_CLASS] == ELFCLASS32) + +#undef SET_PERSONALITY +#define SET_PERSONALITY(ex)\ +do { \ + set_bit(TIF_32BIT, >mm->context.flags);\ + set_thread_flag(TIF_32BIT_AARCH64); \ + clear_thread_flag(TIF_32BIT); \ +} while (0) + +#undef ARCH_DLINFO +#define ARCH_DLINFO\ +do { \ + NEW_AUX_ENT(AT_SYSINFO_EHDR,\ + (elf_addr_t)(long)current->mm->context.vdso); \ +} while (0) + +#undef ELF_PLATFORM +#ifdef __AARCH64EB__ +#define ELF_PLATFORM ("aarch64_be:ilp32") +#else +#define ELF_PLATFORM ("aarch64:ilp32") +#endif + +#undef ELF_ET_DYN_BASE +#define ELF_ET_DYN_BASE COMPAT_ELF_ET_DYN_BASE + +#undef ELF_HWCAP +#undef ELF_HWCAP2 +#define ELF_HWCAP ((u32) elf_hwcap) +#define ELF_HWCAP2 ((u32) (elf_hwcap >> 32)) + +/* + * 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 + * might make some debugging less confusing not to duplicate them. + */ +#define elf_format compat_elf_format +#define init_elf_binfmtinit_compat_elf_binfmt +#define exit_elf_binfmtexit_compat_elf_binfmt + +#undef ns_to_timeval +#define ns_to_timeval ns_to_compat_timeval + +#include "../../../fs/binfmt_elf.c" -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 18/20] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32
ILP32 has context-related structures different from both aarch32 and aarch64/lp64. In this patch compat_arch_ptrace() renamed to compat_a32_ptrace(), and compat_arch_ptrace() only makes choice between compat_a32_ptrace() and new compat_ilp32_ptrace() handler. compat_ilp32_ptrace() calls generic compat_ptrace_request() for all requests except PTRACE_GETSIGMASK and PTRACE_SETSIGMASK, which need special handling. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> Signed-off-by: Chengming Zhou <zhouchengmi...@huawei.com> --- arch/arm64/kernel/ptrace.c | 65 -- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index e2b7c040bf84..28f96765e8cc 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -765,9 +765,11 @@ static const struct user_regset_view user_aarch64_view = { .regsets = aarch64_regsets, .n = ARRAY_SIZE(aarch64_regsets) }; -#ifdef CONFIG_AARCH32_EL0 +#ifdef CONFIG_COMPAT #include +#endif +#ifdef CONFIG_AARCH32_EL0 enum compat_regset { REGSET_COMPAT_GPR, REGSET_COMPAT_VFP, @@ -1223,7 +1225,7 @@ 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, +static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, compat_ulong_t caddr, compat_ulong_t cdata) { unsigned long addr = caddr; @@ -1300,8 +1302,67 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, return ret; } + +#else +#define compat_a32_ptrace(child, request, caddr, cdata) (0) #endif /* CONFIG_AARCH32_EL0 */ +#ifdef CONFIG_ARM64_ILP32 +#include + +static long compat_ilp32_ptrace(struct task_struct *child, compat_long_t request, + compat_ulong_t caddr, compat_ulong_t cdata) +{ + sigset_t new_set; + + switch (request) { + case PTRACE_GETSIGMASK: + if (caddr != sizeof(compat_sigset_t)) + return -EINVAL; + + return put_sigset_t((compat_sigset_t __user *) (u64) cdata, + >blocked); + + case PTRACE_SETSIGMASK: + if (caddr != sizeof(compat_sigset_t)) + return -EINVAL; + + if (get_sigset_t(_set, (compat_sigset_t __user *) (u64) cdata)) + return -EFAULT; + + sigdelsetmask(_set, sigmask(SIGKILL)|sigmask(SIGSTOP)); + + /* +* Every thread does recalc_sigpending() after resume, so +* retarget_shared_pending() and recalc_sigpending() are not +* called here. +*/ + spin_lock_irq(>sighand->siglock); + child->blocked = new_set; + spin_unlock_irq(>sighand->siglock); + + return 0; + + default: + return compat_ptrace_request(child, request, caddr, cdata); + } +} + +#else +#define compat_ilp32_ptrace(child, request, caddr, cdata) (0) +#endif + +#ifdef CONFIG_COMPAT +long compat_arch_ptrace(struct task_struct *child, compat_long_t request, + compat_ulong_t caddr, compat_ulong_t cdata) +{ + if (is_a32_compat_task()) + return compat_a32_ptrace(child, request, caddr, cdata); + + return compat_ilp32_ptrace(child, request, caddr, cdata); +} +#endif + const struct user_regset_view *task_user_regset_view(struct task_struct *task) { #ifdef CONFIG_AARCH32_EL0 -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 14/20] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it
From: Andrew Pinski <apin...@cavium.com> Add a separate syscall-table for ILP32, which dispatches either to native LP64 system call implementation or to compat-syscalls, as appropriate. Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/include/asm/unistd.h | 8 ++- arch/arm64/include/uapi/asm/unistd.h | 12 + arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/entry.S| 28 +- arch/arm64/kernel/sys_ilp32.c| 100 +++ 5 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 arch/arm64/kernel/sys_ilp32.c diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index 99d29290c98b..1bf5572cd078 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -13,12 +13,16 @@ * 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_AARCH32_EL0 + +#ifdef CONFIG_COMPAT #define __ARCH_WANT_COMPAT_STAT64 +#define __ARCH_WANT_SYS_LLSEEK +#endif + +#ifdef CONFIG_AARCH32_EL0 #define __ARCH_WANT_SYS_GETHOSTNAME #define __ARCH_WANT_SYS_PAUSE #define __ARCH_WANT_SYS_GETPGRP -#define __ARCH_WANT_SYS_LLSEEK #define __ARCH_WANT_SYS_NICE #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK diff --git a/arch/arm64/include/uapi/asm/unistd.h b/arch/arm64/include/uapi/asm/unistd.h index 48355a683e25..e7106bb45095 100644 --- a/arch/arm64/include/uapi/asm/unistd.h +++ b/arch/arm64/include/uapi/asm/unistd.h @@ -14,7 +14,19 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/* + * Use AARCH32 interface for sys_sync_file_range() as it passes 64-bit arguments. + */ +#if defined(__ILP32__) || defined(__SYSCALL_COMPAT) +#define __ARCH_WANT_SYNC_FILE_RANGE2 +#endif + +/* + * AARCH64/ILP32 is introduced after next syscalls were deprecated. + */ +#if !(defined(__ILP32__) || defined(__SYSCALL_COMPAT)) #define __ARCH_WANT_RENAMEAT #define __ARCH_WANT_SET_GET_RLIMIT +#endif #include diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index f6f12e2e5010..7e0c48f858f1 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,7 +29,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o -arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o +arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o arm64-obj-$(CONFIG_COMPAT) += entry32_common.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/entry.S b/arch/arm64/kernel/entry.S index 279bc2ab10c3..7d52fe1ec6bd 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -308,6 +308,23 @@ tsk.reqx28 // current thread_info .text +#ifdef CONFIG_ARM64_ILP32 +/* + * AARCH64/ILP32. Zero top halves of x0-x7 + * registers as userspace may put garbage there. + */ + .macro delouse_input_regs + mov w0, w0 + mov w1, w1 + mov w2, w2 + mov w3, w3 + mov w4, w4 + mov w5, w5 + mov w6, w6 + mov w7, w7 + .endm +#endif + /* * Exception vectors. */ @@ -577,6 +594,7 @@ el0_svc_compat: * AArch32 syscall handling */ adrpstbl, compat_sys_call_table // load compat syscall table pointer + ldr x16, [tsk, #TSK_TI_FLAGS] uxtwscno, w7// syscall number in w7 (r7) mov sc_nr, #__NR_compat_syscalls b el0_svc_naked @@ -798,15 +816,21 @@ ENDPROC(ret_from_fork) .align 6 el0_svc: adrpstbl, sys_call_table// load syscall table pointer + ldr x16, [tsk, #TSK_TI_FLAGS] uxtwscno, w8// syscall number in w8 mov sc_nr, #__NR_syscalls +#ifdef CONFIG_ARM64_ILP32 + tst x16, #_TIF_32BIT_AARCH64 + b.eqel0_svc_naked // We are using LP64 syscall table + adrpstbl, sys_call_ilp32_table // load ilp32 syscall table pointer + delouse_input_regs +#endif el0_svc_naked: // compat entry point stp x0, scno, [sp, #S_ORIG_X0] // save the original x0 and syscall number enable_dbg_and_irq ct_user_exit 1 - ldr x16, [tsk, #TSK_TI_FLAGS] // check for syscall hooks - tst x16, #_TIF_SYSCALL_WORK + tst x16, #_TIF_SYSCALL_WORK // check for sysca
[PATCH 08/20] thread: move thread bits accessors to separated file
They may be accessed from low-level code, so isolating is a measure to avoid circular dependencies in header files. The exact reason for circular dependency is WARN_ON() macro added in patch edd63a27 "set_restore_sigmask() is never called without SIGPENDING (and never should be)" Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- include/linux/thread_bits.h | 63 +++ include/linux/thread_info.h | 66 + 2 files changed, 75 insertions(+), 54 deletions(-) create mode 100644 include/linux/thread_bits.h diff --git a/include/linux/thread_bits.h b/include/linux/thread_bits.h new file mode 100644 index ..87354331bc7b --- /dev/null +++ b/include/linux/thread_bits.h @@ -0,0 +1,63 @@ +/* thread_bits.h: common low-level thread bits accessors */ + +#ifndef _LINUX_THREAD_BITS_H +#define _LINUX_THREAD_BITS_H + +#ifndef __ASSEMBLY__ + +#include +#include + +#ifdef CONFIG_THREAD_INFO_IN_TASK +/* + * For CONFIG_THREAD_INFO_IN_TASK kernels we need for the + * definition of current, but for !CONFIG_THREAD_INFO_IN_TASK kernels, + * including can cause a circular dependency on some platforms. + */ +#include +#define current_thread_info() ((struct thread_info *)current) +#endif + +/* + * flag set/clear/test wrappers + * - pass TIF_ constants to these functions + */ + +static inline void set_ti_thread_flag(struct thread_info *ti, int flag) +{ + set_bit(flag, (unsigned long *)>flags); +} + +static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) +{ + clear_bit(flag, (unsigned long *)>flags); +} + +static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_and_set_bit(flag, (unsigned long *)>flags); +} + +static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_and_clear_bit(flag, (unsigned long *)>flags); +} + +static inline int test_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_bit(flag, (unsigned long *)>flags); +} + +#define set_thread_flag(flag) \ + set_ti_thread_flag(current_thread_info(), flag) +#define clear_thread_flag(flag) \ + clear_ti_thread_flag(current_thread_info(), flag) +#define test_and_set_thread_flag(flag) \ + test_and_set_ti_thread_flag(current_thread_info(), flag) +#define test_and_clear_thread_flag(flag) \ + test_and_clear_ti_thread_flag(current_thread_info(), flag) +#define test_thread_flag(flag) \ + test_ti_thread_flag(current_thread_info(), flag) + +#endif /* !__ASSEMBLY__ */ +#endif /* _LINUX_THREAD_BITS_H */ diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h index d7d3ea637dd0..2467f350d659 100644 --- a/include/linux/thread_info.h +++ b/include/linux/thread_info.h @@ -7,9 +7,21 @@ #ifndef _LINUX_THREAD_INFO_H #define _LINUX_THREAD_INFO_H +/* + * For per-arch arch_within_stack_frames() implementations, defined in + * asm/thread_info.h. + */ +enum { + BAD_STACK = -1, + NOT_STACK = 0, + GOOD_FRAME, + GOOD_STACK, +}; + #include #include #include +#include #ifdef CONFIG_THREAD_INFO_IN_TASK /* @@ -21,19 +33,6 @@ #define current_thread_info() ((struct thread_info *)current) #endif -#include - -/* - * For per-arch arch_within_stack_frames() implementations, defined in - * asm/thread_info.h. - */ -enum { - BAD_STACK = -1, - NOT_STACK = 0, - GOOD_FRAME, - GOOD_STACK, -}; - #include #ifdef __KERNEL__ @@ -45,47 +44,6 @@ enum { # define THREADINFO_GFP(GFP_KERNEL_ACCOUNT | __GFP_NOTRACK) #endif -/* - * flag set/clear/test wrappers - * - pass TIF_ constants to these functions - */ - -static inline void set_ti_thread_flag(struct thread_info *ti, int flag) -{ - set_bit(flag, (unsigned long *)>flags); -} - -static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) -{ - clear_bit(flag, (unsigned long *)>flags); -} - -static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_and_set_bit(flag, (unsigned long *)>flags); -} - -static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_and_clear_bit(flag, (unsigned long *)>flags); -} - -static inline int test_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_bit(flag, (unsigned long *)>flags); -} - -#define set_thread_flag(flag) \ - set_ti_thread_flag(current_thread_info(), flag) -#define clear_thread_flag(flag) \ - clear_ti_thread_flag(current_thread_info(), flag) -#define test_and_set_thread_flag(flag) \ - test_and_set_ti_thread_flag(current_thread_info(), flag) -#define test_and_clear_thread_flag(flag) \ - test_and_clear_ti_thread_flag(current_thread_info(), flag) -#define test_thread_flag(flag) \ - test_ti_thread_flag(current_thread_info(), flag)
[PATCH 09/20] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat)
Based on patch of Andrew Pinski. 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. Corresponding functions are located in to avoid mess in headers. Some files include both and , and this is wrong because has already included. It was fixed too. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/include/asm/compat.h | 19 ++- arch/arm64/include/asm/elf.h | 10 +++--- arch/arm64/include/asm/ftrace.h | 2 +- arch/arm64/include/asm/is_compat.h | 64 arch/arm64/include/asm/memory.h | 5 +-- arch/arm64/include/asm/processor.h | 5 +-- arch/arm64/include/asm/syscall.h | 2 +- arch/arm64/include/asm/thread_info.h | 2 +- arch/arm64/kernel/hw_breakpoint.c| 8 ++--- arch/arm64/kernel/perf_regs.c| 2 +- arch/arm64/kernel/process.c | 7 ++-- arch/arm64/kernel/ptrace.c | 11 +++ arch/arm64/kernel/signal.c | 4 +-- arch/arm64/kernel/traps.c| 3 +- 14 files changed, 97 insertions(+), 47 deletions(-) create mode 100644 arch/arm64/include/asm/is_compat.h diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h index e39d487bf724..463533b1ae32 100644 --- a/arch/arm64/include/asm/compat.h +++ b/arch/arm64/include/asm/compat.h @@ -25,6 +25,8 @@ #include #include +#include + #define COMPAT_USER_HZ 100 #ifdef __AARCH64EB__ #define COMPAT_UTS_MACHINE "armv8b\0\0" @@ -299,23 +301,6 @@ struct compat_shmid64_ds { compat_ulong_t __unused5; }; -static inline int is_compat_task(void) -{ - return test_thread_flag(TIF_32BIT); -} - -static inline int is_compat_thread(struct thread_info *thread) -{ - return test_ti_thread_flag(thread, TIF_32BIT); -} - -#else /* !CONFIG_COMPAT */ - -static inline int is_compat_thread(struct thread_info *thread) -{ - return 0; -} - #endif /* CONFIG_COMPAT */ #endif /* __KERNEL__ */ #endif /* __ASM_COMPAT_H */ diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index ac3fb7441510..6a37b6facc69 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -16,6 +16,10 @@ #ifndef __ASM_ELF_H #define __ASM_ELF_H +#ifndef __ASSEMBLY__ +#include +#endif + #include /* @@ -158,13 +162,9 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp); /* 1GB of VA */ -#ifdef CONFIG_COMPAT -#define STACK_RND_MASK (test_thread_flag(TIF_32BIT) ? \ +#define STACK_RND_MASK (is_compat_task() ? \ 0x7ff >> (PAGE_SHIFT - 12) : \ 0x3 >> (PAGE_SHIFT - 12)) -#else -#define STACK_RND_MASK (0x3 >> (PAGE_SHIFT - 12)) -#endif #ifdef __AARCH64EB__ #define COMPAT_ELF_PLATFORM("v8b") diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h index caa955f10e19..0feb28ad10dd 100644 --- a/arch/arm64/include/asm/ftrace.h +++ b/arch/arm64/include/asm/ftrace.h @@ -54,7 +54,7 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr) #define ARCH_TRACE_IGNORE_COMPAT_SYSCALLS static inline bool arch_trace_is_compat_syscall(struct pt_regs *regs) { - return is_compat_task(); + return is_a32_compat_task(); } #endif /* ifndef __ASSEMBLY__ */ diff --git a/arch/arm64/include/asm/is_compat.h b/arch/arm64/include/asm/is_compat.h new file mode 100644 index ..8dba5caaf5d1 --- /dev/null +++ b/arch/arm64/include/asm/is_compat.h @@ -0,0 +1,64 @@ +/* + * 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/>. + */ + +#ifndef __ASM_IS_COMPAT_H +#define __ASM_IS_COMPAT_H +#ifndef __ASSEMBLY__ + +#include + +#ifdef CONFIG_AARCH32_EL0 + +static inline int is_a32_compat_task(void) +{ + return test_thread_flag(TIF_32BIT); +} + +static inline int is_a32_compat_thread(struct thread_info *thread) +{ + return test_ti_thread_flag(thread, TIF_32BIT); +} + +#else + +static inline int is_a32_compat_task(void) + +{ + return 0; +} + +static inline int is_a32
[PATCH 11/20] arm64: introduce binfmt_elf32.c
As we support more than one compat formats, it looks more reasonable to not use fs/compat_binfmt.c. Custom binfmt_elf32.c allows to move aarch32 specific definitions there and make code more maintainable and readable. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/Kconfig | 1 - arch/arm64/include/asm/elf.h | 27 ++- arch/arm64/include/asm/hwcap.h | 2 -- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/binfmt_elf32.c | 38 ++ 5 files changed, 41 insertions(+), 29 deletions(-) create mode 100644 arch/arm64/kernel/binfmt_elf32.c diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 417760b2663b..2275db8dc7c9 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1069,7 +1069,6 @@ config AARCH32_EL0 bool "Kernel support for 32-bit EL0" def_bool y depends on ARM64_4K_PAGES || EXPERT - select COMPAT_BINFMT_ELF if BINFMT_ELF select COMPAT select HAVE_UID16 select OLD_SIGSUSPEND3 diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 8f7bafa60d01..f57a001a70bb 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -177,35 +177,12 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) +#ifdef CONFIG_AARCH32_EL0 /* AArch32 registers. */ #define COMPAT_ELF_NGREG 18 typedef unsigned int compat_elf_greg_t; typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; - -/* AArch32 EABI. */ -#define EF_ARM_EABI_MASK 0xff00 -#define compat_elf_check_arch(x) (system_supports_32bit_el0() && \ -((x)->e_machine == EM_ARM) && \ -((x)->e_flags & EF_ARM_EABI_MASK)) - -#define compat_start_threadcompat_start_thread -/* - * Unlike the native SET_PERSONALITY macro, the compat version inherits - * READ_IMPLIES_EXEC across a fork() since this is the behaviour on - * arch/arm/. - */ -#define COMPAT_SET_PERSONALITY(ex) \ -({ \ - set_bit(TIF_32BIT, >mm->context.flags);\ - clear_thread_flag(TIF_32BIT_AARCH64); \ - set_thread_flag(TIF_32BIT); \ - }) -#define COMPAT_ARCH_DLINFO -extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, - int uses_interp); -#define compat_arch_setup_additional_pages \ - aarch32_setup_vectors_page - +#endif /* CONFIG_AARCH32_EL0 */ #endif /* CONFIG_COMPAT */ #endif /* !__ASSEMBLY__ */ diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 2c7fc5d89813..99dfd9277559 100644 --- a/arch/arm64/include/asm/hwcap.h +++ b/arch/arm64/include/asm/hwcap.h @@ -47,8 +47,6 @@ #define ELF_HWCAP (elf_hwcap) #ifdef CONFIG_AARCH32_EL0 -#define COMPAT_ELF_HWCAP (compat_elf_hwcap) -#define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; #endif diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 3c70db6bd570..6f872741fd3d 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -28,7 +28,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE $(call if_changed,objcopy) arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ - sys_compat.o entry32.o + sys_compat.o entry32.o binfmt_elf32.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c new file mode 100644 index ..de84bd206960 --- /dev/null +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -0,0 +1,38 @@ +/* + * Support for AArch32 Linux ELF binaries. + */ + +/* AArch32 EABI. */ +#define EF_ARM_EABI_MASK 0xff00 + +#define compat_start_threadcompat_start_thread + +/* + * Unlike the native SET_PERSONALITY macro, the compat version inherits + * READ_IMPLIES_EXEC across a fork() since this is the behaviour on + * arch/arm/. + */ +#define COMPAT_SET_PERSONALITY(ex) \ +({ \ + set_bit(TIF_32BIT, >mm->context.flags);\ + clear_thread_flag(TIF_32BIT_AARCH64); \ + set_thread_flag(TIF_32BIT);
[PATCH 10/20] arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64
ILP32 tasks are needed to be distinguished from lp64 and aarch32. This patch adds helper functions is_ilp32_compat_{task,thread} and thread flag TIF_32BIT_AARCH64 to address it. This is a preparation for following patches in ilp32 patchset. For consistency, SET_PERSONALITY is changed here accordingly. Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Reviewed-by: David Daney <dda...@caviumnetworks.com> --- arch/arm64/include/asm/elf.h | 2 ++ arch/arm64/include/asm/is_compat.h | 30 -- arch/arm64/include/asm/thread_info.h | 2 ++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 6a37b6facc69..8f7bafa60d01 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -145,6 +145,7 @@ typedef struct user_fpsimd_state elf_fpregset_t; #define SET_PERSONALITY(ex)\ ({ \ clear_bit(TIF_32BIT, >mm->context.flags); \ + clear_thread_flag(TIF_32BIT_AARCH64); \ clear_thread_flag(TIF_32BIT); \ current->personality &= ~READ_IMPLIES_EXEC; \ }) @@ -196,6 +197,7 @@ typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; #define COMPAT_SET_PERSONALITY(ex) \ ({ \ set_bit(TIF_32BIT, >mm->context.flags);\ + clear_thread_flag(TIF_32BIT_AARCH64); \ set_thread_flag(TIF_32BIT); \ }) #define COMPAT_ARCH_DLINFO diff --git a/arch/arm64/include/asm/is_compat.h b/arch/arm64/include/asm/is_compat.h index 8dba5caaf5d1..7726bebc4115 100644 --- a/arch/arm64/include/asm/is_compat.h +++ b/arch/arm64/include/asm/is_compat.h @@ -45,18 +45,44 @@ static inline int is_a32_compat_thread(struct thread_info *thread) #endif /* CONFIG_AARCH32_EL0 */ +#ifdef CONFIG_ARM64_ILP32 + +static inline int is_ilp32_compat_task(void) +{ + return test_thread_flag(TIF_32BIT_AARCH64); +} + +static inline int is_ilp32_compat_thread(struct thread_info *thread) +{ + return test_ti_thread_flag(thread, TIF_32BIT_AARCH64); +} + +#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 /* CONFIG_ARM64_ILP32 */ + #ifdef CONFIG_COMPAT static inline int is_compat_task(void) { - return is_a32_compat_task(); + return is_a32_compat_task() || is_ilp32_compat_task(); } #endif /* CONFIG_COMPAT */ static inline int is_compat_thread(struct thread_info *thread) { - return is_a32_compat_thread(thread); + return is_a32_compat_thread(thread) || is_ilp32_compat_thread(thread); } diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index a7ffea24d94d..abb60b5fc9f4 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h @@ -96,6 +96,7 @@ struct thread_info { #define TIF_RESTORE_SIGMASK20 #define TIF_SINGLESTEP 21 #define TIF_32BIT 22 /* AARCH32 process */ +#define TIF_32BIT_AARCH64 23 /* 32 bit process on AArch64(ILP32) */ #define _TIF_SIGPENDING(1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) @@ -108,6 +109,7 @@ struct thread_info { #define _TIF_SECCOMP (1 << TIF_SECCOMP) #define _TIF_UPROBE(1 << TIF_UPROBE) #define _TIF_32BIT (1 << TIF_32BIT) +#define _TIF_32BIT_AARCH64 (1 << TIF_32BIT_AARCH64) #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \ -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 07/20] arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64
From: Andrew Pinski <apin...@cavium.com> Define __BITS_PER_LONG depending on the ABI used (i.e. check whether __ILP32__ or __LP64__ is defined). This is necessary for glibc to determine the appropriate type definitions for the system call interface. Signed-off-by: Andrew Pinski <apin...@cavium.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Reviewed-by: David Daney <dda...@caviumnetworks.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 fce9c2924fa3..4265243e326f 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 +#if defined(__LP64__) +/* Assuming __LP64__ will be defined for native ELF64's and not for ILP32. */ +# define __BITS_PER_LONG 64 +#elif defined(__ILP32__) +# define __BITS_PER_LONG 32 +#else +# error "Neither LP64 nor ILP32: unsupported ABI in asm/bitsperlong.h" +#endif #include -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 05/20] arm64: rename COMPAT to AARCH32_EL0 in Kconfig
From: Andrew Pinski <apin...@cavium.com> In this patchset ILP32 ABI support is added. Additionally to AARCH32, which is binary-compatible with ARM, ILP32 is (mostly) ABI-compatible. >From now, AARCH32_EL0 (former COMPAT) config option means the support of AARCH32 userspace, ARM64_ILP32 - support of ILP32 ABI (see next patches), and COMPAT indicates that one of them, or both, is enabled. Where needed, CONFIG_COMPAT is changed over to use CONFIG_AARCH32_EL0 instead Reviewed-by: David Daney <dda...@caviumnetworks.com> Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/Kconfig | 10 -- arch/arm64/include/asm/fpsimd.h | 2 +- arch/arm64/include/asm/hwcap.h | 4 ++-- arch/arm64/include/asm/processor.h | 6 +++--- arch/arm64/include/asm/ptrace.h | 2 +- arch/arm64/include/asm/seccomp.h | 2 +- arch/arm64/include/asm/signal32.h| 6 -- arch/arm64/include/asm/unistd.h | 2 +- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/asm-offsets.c | 2 +- arch/arm64/kernel/cpufeature.c | 8 arch/arm64/kernel/cpuinfo.c | 20 +++- arch/arm64/kernel/entry.S| 6 +++--- arch/arm64/kernel/head.S | 2 +- arch/arm64/kernel/ptrace.c | 8 arch/arm64/kernel/traps.c| 2 +- arch/arm64/kernel/vdso.c | 4 ++-- drivers/clocksource/arm_arch_timer.c | 2 +- 18 files changed, 50 insertions(+), 40 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 848a34116c67..417760b2663b 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -402,7 +402,7 @@ config ARM64_ERRATUM_834220 config ARM64_ERRATUM_845719 bool "Cortex-A53: 845719: a load might read incorrect data" - depends on COMPAT + depends on AARCH32_EL0 default y help This option adds an alternative code sequence to work around ARM @@ -784,7 +784,7 @@ config FORCE_MAX_ZONEORDER menuconfig ARMV8_DEPRECATED bool "Emulate deprecated/obsolete ARMv8 instructions" - depends on COMPAT + depends on AARCH32_EL0 help Legacy software support may require certain instructions that have been deprecated or obsoleted in the architecture. @@ -1062,9 +1062,15 @@ menu "Userspace binary formats" source "fs/Kconfig.binfmt" config COMPAT + bool + depends on AARCH32_EL0 + +config AARCH32_EL0 bool "Kernel support for 32-bit EL0" + def_bool y depends on ARM64_4K_PAGES || EXPERT select COMPAT_BINFMT_ELF if BINFMT_ELF + select COMPAT select HAVE_UID16 select OLD_SIGSUSPEND3 select COMPAT_OLD_SIGACTION diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h index 50f559f574fe..63b19f128c6c 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_MASK0xf89f #define VFP_FPSCR_CTRL_MASK0x07f79f00 diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 400b80b49595..2c7fc5d89813 100644 --- a/arch/arm64/include/asm/hwcap.h +++ b/arch/arm64/include/asm/hwcap.h @@ -46,7 +46,7 @@ */ #define ELF_HWCAP (elf_hwcap) -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define COMPAT_ELF_HWCAP (compat_elf_hwcap) #define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; @@ -54,7 +54,7 @@ extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; enum { CAP_HWCAP = 1, -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 CAP_COMPAT_HWCAP, CAP_COMPAT_HWCAP2, #endif diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 9428b93fefb2..2bbbd33549c0 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -81,7 +81,7 @@ struct cpu_context { struct thread_struct { struct cpu_context cpu_context;/* cpu context */ unsigned long tp_value; /* TLS register */ -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 unsigned long tp2_value; #endif struct fpsimd_state fpsimd_state; @@ -90,7 +90,7 @@ struct thread_struct { struct debug_info
[PATCH 04/20] arm64: ilp32: add documentation on the ILP32 ABI for ARM64
Based on Andrew Pinski's patch-series. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- Documentation/arm64/ilp32.txt | 45 +++ 1 file changed, 45 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 ..08935a34e7e9 --- /dev/null +++ b/Documentation/arm64/ilp32.txt @@ -0,0 +1,45 @@ +ILP32 AARCH64 SYSCALL ABI += + +This document describes the ILP32 syscall ABI and where it differs +from the generic compat linux syscall interface. + +AARCH64/ILP32 userspace can pass garbage in the top halve of w0-w7 registers +(syscall arguments). So top 32 bits are zeroed for them. + +Comparing to AARCH32, AARCH64/ILP32 has 64-bit length of following types: +ino_t is u64 type. +off_t is s64 type. +blkcnt_tis s64 type. +fsblkcnt_t is u64 type. +fsfilcnt_t is u64 type. +rlim_t is u64 type. + +AARCH64/ILP32 ABI uses standard syscall table which can be found at +include/uapi/asm-generic/unistd.h, with the exceptions listed below. + +Syscalls which pass 64-bit values are handled by the code shared from +AARCH32 and pass that value as a pair. Next syscalls are affected: +fadvise64_64() +fallocate() +ftruncate64() +pread64() +pwrite64() +readahead() +sync_file_range() +truncate64() + +ptrace() syscall is handled by compat version. + +shmat() syscall is handled by non-compat handler as aarch64/ilp32 has no +limitation on 4-pages alignement for shared memory. + +statfs() and fstatfs() take the size of struct statfs as an argument. +It is calculated differently in kernel and user spaces. So AARCH32 handlers +are taken to handle it. + +struct rt_sigframe is redefined and contains struct compat_siginfo, +as compat syscalls expects, and struct ilp32_sigframe, to handle +AARCH64 register set and 32-bit userspace register representation. + +elf_gregset_t is taken from lp64 to handle registers properly. -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 03/20] asm-generic: Drop getrlimit and setrlimit syscalls from default list
The newer prlimit64 syscall provides all the functionality provided by the getrlimit and setrlimit syscalls and adds the pid of target process, so future architectures won't need to include getrlimit and setrlimit. Therefore drop getrlimit and setrlimit syscalls from the generic syscall list unless __ARCH_WANT_SET_GET_RLIMIT is defined by the architecture's unistd.h prior to including asm-generic/unistd.h, and adjust all architectures using the generic syscall list to define it so that no in-tree architectures are affected. Cc: Arnd Bergmann <a...@arndb.de> Cc: James Hogan <james.ho...@imgtec.com> Cc: linux-a...@vger.kernel.org Cc: linux-snps-...@lists.infradead.org Cc: Catalin Marinas <catalin.mari...@arm.com> Cc: Will Deacon <will.dea...@arm.com> Cc: linux-arm-ker...@lists.infradead.org Cc: Mark Salter <msal...@redhat.com> Cc: Aurelien Jacquiot <a-jacqu...@ti.com> Cc: linux-c6x-...@linux-c6x.org Cc: Richard Kuo <r...@codeaurora.org> Cc: linux-hexa...@vger.kernel.org Cc: linux-me...@vger.kernel.org Cc: Jonas Bonn <jo...@southpole.se> Cc: li...@lists.openrisc.net Cc: Chen Liqin <liqin.li...@gmail.com> Cc: Lennox Wu <lennox...@gmail.com> Cc: Chris Metcalf <cmetc...@mellanox.com> Cc: Guan Xuetao <g...@mprc.pku.edu.cn> Cc: Ley Foon Tan <lf...@altera.com> Cc: nios2-...@lists.rocketboards.org Cc: Yoshinori Sato <ys...@users.sourceforge.jp> Cc: uclinux-h8-de...@lists.sourceforge.jp Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Acked-by: Arnd Bergmann <a...@arndb.de> Acked-by: Mark Salter <msal...@redhat.com> [c6x] Acked-by: James Hogan <james.ho...@imgtec.com> [metag] Acked-by: Ley Foon Tan <lf...@altera.com> [nios2] Acked-by: Stafford Horne <sho...@gmail.com> [openrisc] Acked-by: Will Deacon <will.dea...@arm.com> [arm64] Acked-by: Vineet Gupta <vgu...@synopsys.com> #arch/arc bits --- arch/arc/include/uapi/asm/unistd.h | 1 + arch/arm64/include/uapi/asm/unistd.h | 1 + arch/c6x/include/uapi/asm/unistd.h | 1 + arch/h8300/include/uapi/asm/unistd.h | 1 + arch/hexagon/include/uapi/asm/unistd.h | 1 + arch/metag/include/uapi/asm/unistd.h | 1 + arch/nios2/include/uapi/asm/unistd.h | 1 + arch/openrisc/include/uapi/asm/unistd.h | 1 + arch/score/include/uapi/asm/unistd.h | 1 + arch/tile/include/uapi/asm/unistd.h | 1 + arch/unicore32/include/uapi/asm/unistd.h | 1 + include/uapi/asm-generic/unistd.h| 5 + 12 files changed, 16 insertions(+) diff --git a/arch/arc/include/uapi/asm/unistd.h b/arch/arc/include/uapi/asm/unistd.h index 9a34136d84b2..ac6496527ad6 100644 --- a/arch/arc/include/uapi/asm/unistd.h +++ b/arch/arc/include/uapi/asm/unistd.h @@ -16,6 +16,7 @@ #define _UAPI_ASM_ARC_UNISTD_H #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_VFORK diff --git a/arch/arm64/include/uapi/asm/unistd.h b/arch/arm64/include/uapi/asm/unistd.h index 043d17a21342..48355a683e25 100644 --- a/arch/arm64/include/uapi/asm/unistd.h +++ b/arch/arm64/include/uapi/asm/unistd.h @@ -15,5 +15,6 @@ */ #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #include diff --git a/arch/c6x/include/uapi/asm/unistd.h b/arch/c6x/include/uapi/asm/unistd.h index 12d73d9d81f5..f67623137853 100644 --- a/arch/c6x/include/uapi/asm/unistd.h +++ b/arch/c6x/include/uapi/asm/unistd.h @@ -15,6 +15,7 @@ */ #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SYS_CLONE /* Use the standard ABI for syscalls. */ diff --git a/arch/h8300/include/uapi/asm/unistd.h b/arch/h8300/include/uapi/asm/unistd.h index 7dd20ef7625a..2f98394b77d4 100644 --- a/arch/h8300/include/uapi/asm/unistd.h +++ b/arch/h8300/include/uapi/asm/unistd.h @@ -1,5 +1,6 @@ #define __ARCH_NOMMU #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #include diff --git a/arch/hexagon/include/uapi/asm/unistd.h b/arch/hexagon/include/uapi/asm/unistd.h index 21517600432b..52d585c5cdb2 100644 --- a/arch/hexagon/include/uapi/asm/unistd.h +++ b/arch/hexagon/include/uapi/asm/unistd.h @@ -28,6 +28,7 @@ #define sys_mmap2 sys_mmap_pgoff #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_VFORK diff --git a/arch/metag/include/uapi/asm/unistd.h b/arch/metag/include/uapi/asm/unistd.h index 459b6ec15848..16b5cb32ec21 100644 --- a/arch/metag/include/uapi/asm/unistd.h +++ b/arch/metag/include/uapi/asm/unistd.h @@ -8,6 +8,7 @@ */ #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT /* Use the standard ABI for syscalls. */ #include diff --git a/arch/nios2/include/uapi/asm/unistd.h b/arch/nios2/include/uapi/asm/unistd.h index 51a32c71ce2b..b0dda4de2bc7 100644 --- a/arch/nios2/include/uapi/asm/unistd.h +++
[PATCH 06/20] arm64: ensure the kernel is compiled for LP64
From: Andrew Pinski <apin...@cavium.com> The kernel needs to be compiled as a LP64 binary for ARM64, even when using a compiler that defaults to code-generation for the ILP32 ABI. Consequently, we need to explicitly pass '-mabi=lp64' (supported on gcc-4.9 and newer). Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Reviewed-by: David Daney <dda...@caviumnetworks.com> --- arch/arm64/Makefile | 5 + 1 file changed, 5 insertions(+) diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index f839ecd919f9..5ddfb3140f7a 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -50,15 +50,20 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads) KBUILD_AFLAGS += $(lseinstr) $(brokengasinst) +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 UTS_MACHINE:= aarch64_be else KBUILD_CPPFLAGS+= -mlittle-endian AS += -EL LD += -EL +LDFLAGS+= -maarch64linux UTS_MACHINE:= aarch64 endif -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[no subject]
Subject: [PATCH v7 resend 2 00/20] ILP32 for ARM64 Hi Catalin, Here is a rebase of latest kernel patchset against next-20170602. There's almost no changes, but there are some conflicts that are not trivial, and I'd like to refresh the submission therefore. How are your experiments with testing and benchmarking of ILP32 are going? In my current tests I see 0 failures on LTP. Benchmarking on SPEC CPU2006 and LMBench shows no difference for LP64 and expected performance boost for ILP32 (compared to LP64 results). Steve Ellcey is handling upstream submission of Glibc patches. The patches are ready and have been reviewed and reworked per community’s comments. There are no outstanding userspace ABI issues from Glibc. Glibc submission is now waiting on ILP32 kernel submission. Catalin, regarding rootfs, is OpenSuSe’s build sufficient for your experiments? I’ve also seen Wookey merging patches for ILP32 triplet to binutils and pushing them to Debian. One last thing I wanted to check with you about is ILP32 PCS - does, in your view, ARM Ltd. needs to publish any additional docs for ABI to become official? Below is the regular description. Thanks. Yury This series enables aarch64 with ilp32 mode. As supporting work, it introduces ARCH_32BIT_OFF_T configuration option that is enabled for existing 32-bit architectures but disabled for new arches (so 64-bit off_t is is used by new userspace). Also it deprecates getrlimit and setrlimit syscalls prior to prlimit64. This version is based on linux-next from 2017-03-01. It works with glibc-2.25, and tested with LTP, glibc testsuite, trinity, lmbench, CPUSpec. Patches 1, 2, 3 and 8 are general, and may be applied separately. This is the rebase of v7 - still no major changes has been made. Kernel and GLIBC trees: https://github.com/norov/linux/tree/ilp32-20170602 https://github.com/norov/glibc/tree/dev9 (GLIBC patches are managed by Steve Ellcey, so my tree is only for reference.) Changes: v3: https://lkml.org/lkml/2014/9/3/704 v4: https://lkml.org/lkml/2015/4/13/691 v5: https://lkml.org/lkml/2015/9/29/911 v6: https://lkml.org/lkml/2016/5/23/661 v7: RFC nowrap: https://lkml.org/lkml/2016/6/17/990 v7: RFC2 nowrap: https://lkml.org/lkml/2016/8/17/245 v7: RFC3 nowrap: https://lkml.org/lkml/2016/10/21/883 v7: https://lkml.org/lkml/2017/1/9/213 v7: Resend: http://lists.infradead.org/pipermail/linux-arm-kernel/2017-March/490801.html v7: Resend 2: - vdso-ilp32 Makefile synced with lp64 Makefile (patch 19); - rebased on next-20170602. Andrew Pinski (6): arm64: rename COMPAT to AARCH32_EL0 in Kconfig arm64: ensure the kernel is compiled for LP64 arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext arm64:ilp32: add ARM64_ILP32 to Kconfig Philipp Tomsich (1): arm64:ilp32: add vdso-ilp32 and use for signal return Yury Norov (13): compat ABI: use non-compat openat and open_by_handle_at variants 32-bit ABI: introduce ARCH_32BIT_OFF_T config option asm-generic: Drop getrlimit and setrlimit syscalls from default list arm64: ilp32: add documentation on the ILP32 ABI for ARM64 thread: move thread bits accessors to separated file arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64 arm64: introduce binfmt_elf32.c arm64: ilp32: introduce binfmt_ilp32.c arm64: ilp32: share aarch32 syscall handlers arm64: signal: share lp64 signal routines to ilp32 arm64: signal32: move ilp32 and aarch32 common code to separated file arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 Documentation/arm64/ilp32.txt | 45 +++ arch/Kconfig | 4 + arch/arc/Kconfig | 1 + arch/arc/include/uapi/asm/unistd.h| 1 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig| 19 ++- arch/arm64/Makefile | 8 ++ arch/arm64/include/asm/compat.h | 19 +-- arch/arm64/include/asm/elf.h | 37 ++ arch/arm64/include/asm/fpsimd.h | 2 +- arch/arm64/include/asm/ftrace.h | 2 +- arch/arm64/include/asm/hwcap.h| 6 +- arch/arm64/include/asm/is_compat.h| 90 ++ arch/arm64/include/asm/memory.h | 5 +- arch/arm64/include/asm/processor.h| 11 +- arch/arm64/include/asm/ptrace.h | 2 +- arch/arm64/include/asm/seccomp.h | 2 +- arch/arm64/include/asm/signal32.h | 9 +- arch/arm64/include/asm/signal32_common.h | 27 arch/arm64/include/asm/signal_common.h| 33 + arch/arm64/include/asm/signal_ilp32.h | 38 ++ arch
[PATCH 01/20] compat ABI: use non-compat openat and open_by_handle_at variants
The only difference is that non-compat version forces O_LARGEFILE, and it should be the default behaviour for all architectures, as we don't support 32-bit off_t. The only exception is tile32, that continues with compat version of syscalls. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Acked-by: Arnd Bergmann <a...@arndb.de> Acked-by: Chris Metcalf <cmetc...@ezchip.com> [for tile] --- arch/tile/kernel/compat.c | 3 +++ include/uapi/asm-generic/unistd.h | 5 ++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/tile/kernel/compat.c b/arch/tile/kernel/compat.c index bdaf71d31a4a..3b7853c59395 100644 --- a/arch/tile/kernel/compat.c +++ b/arch/tile/kernel/compat.c @@ -103,6 +103,9 @@ COMPAT_SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned int, offset_high, #define compat_sys_readahead sys32_readahead #define sys_llseek compat_sys_llseek +#define sys_openat compat_sys_openat +#define sys_open_by_handle_at compat_sys_open_by_handle_at + /* Call the assembly trampolines where necessary. */ #define compat_sys_rt_sigreturn _compat_sys_rt_sigreturn #define sys_clone _sys_clone diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 061185a5eb51..429dd335def6 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -178,7 +178,7 @@ __SYSCALL(__NR_fchownat, sys_fchownat) #define __NR_fchown 55 __SYSCALL(__NR_fchown, sys_fchown) #define __NR_openat 56 -__SC_COMP(__NR_openat, sys_openat, compat_sys_openat) +__SYSCALL(__NR_openat, sys_openat) #define __NR_close 57 __SYSCALL(__NR_close, sys_close) #define __NR_vhangup 58 @@ -675,8 +675,7 @@ __SYSCALL(__NR_fanotify_mark, sys_fanotify_mark) #define __NR_name_to_handle_at 264 __SYSCALL(__NR_name_to_handle_at, sys_name_to_handle_at) #define __NR_open_by_handle_at 265 -__SC_COMP(__NR_open_by_handle_at, sys_open_by_handle_at, \ - compat_sys_open_by_handle_at) +__SYSCALL(__NR_open_by_handle_at, sys_open_by_handle_at) #define __NR_clock_adjtime 266 __SC_COMP(__NR_clock_adjtime, sys_clock_adjtime, compat_sys_clock_adjtime) #define __NR_syncfs 267 -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v7 resend 00/20] ILP32 for ARM64
On Tue, Apr 11, 2017 at 08:42:24PM +0200, Florian Weimer wrote: > On 04/11/2017 08:36 PM, Yury Norov wrote: > >>Also, the latest benchmarks I've seen were mostly for user space > >>while I'm more concerned with the user-kernel interface > >>(https://marc.info/?l=linux-arm-kernel=148690490713310=2). > > > >>On the glibc testing side, have the regressions been identified/fixed? > > > >I run LTP for testing the ABI and kernel, and there is no failures in > >ltplite scenario. With glibc testsuite, there's only 3 failures > >comparing to lp64. (Steve, fix me if something changed.) This is > >slides on ilp32 from Linaro Connect, hope you'll find it useful. > > > >https://docs.google.com/presentation/d/1TKZqgH0XJUgMMGkw2fJA3Lzr57slht1sGKYJVBJTNM4/edit?usp=sharing > > The listed failures are: > > misc/tst-sync_file_range > nptl/tst-stack4 > malloc/tst-mallocstate > > If necessary, I will fix malloc/tst-mallocstate once there's support for a > new architecture in build-many-glibcs.py. The failure is > architecture-independent, it's related to the lack of a compat symbol and > the difficulty of checking for that at the Makefile or test level. > > nptl/tst-stack4 is also a generic failure, I think. That would be great, thanks. > misc/tst-sync_file_range is probably a real failure related to argument > passing. I think this system call was problematic on other architectures, > too. At first glance, it's pretty trivial, both on glibc and kernel side: GLIBC: int sync_file_range (int fd, __off64_t offset, __off64_t len, unsigned int flags) { #if defined (__NR_sync_file_range2) return SYSCALL_CANCEL (sync_file_range2, fd, flags, SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); #elif defined (__NR_sync_file_range) return SYSCALL_CANCEL (sync_file_range, fd, __ALIGNMENT_ARG SYSCALL_LL64 (offset), SYSCALL_LL64 (len), flags); #endif } And kernel: ENTRY(compat_sys_sync_file_range2_wrapper) regs_to_64 x2, x2, x3 regs_to_64 x3, x4, x5 b sys_sync_file_range2 ENDPROC(compat_sys_sync_file_range2_wrapper) Anyway, I'll check everything and report here. Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v7 resend 00/20] ILP32 for ARM64
> Also, the latest benchmarks I've seen were mostly for user space > while I'm more concerned with the user-kernel interface > (https://marc.info/?l=linux-arm-kernel=148690490713310=2). > On the glibc testing side, have the regressions been identified/fixed? I run LTP for testing the ABI and kernel, and there is no failures in ltplite scenario. With glibc testsuite, there's only 3 failures comparing to lp64. (Steve, fix me if something changed.) This is slides on ilp32 from Linaro Connect, hope you'll find it useful. https://docs.google.com/presentation/d/1TKZqgH0XJUgMMGkw2fJA3Lzr57slht1sGKYJVBJTNM4/edit?usp=sharing Yury -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v7 resend 00/20] ILP32 for ARM64
Hi Catalin, According to latest plans figured out on Linaro Connect, ILP32 should be taken in 4.12 merge window. The window will be opened in less than a month, so I'd like to remind it to you, and ask if you have any questions/requests related to ILP32. Is it still realistic idea to take patches in 4.12? This is the rebase of ILP32 on latest linux-next: https://github.com/norov/linux/tree/ilp32-20170410 And glibc that I use for testing: https://github.com/norov/glibc/commits/dev9 Yury On Thu, Mar 02, 2017 at 12:49:08AM +0530, Yury Norov wrote: > This series enables aarch64 with ilp32 mode. > > As supporting work, it introduces ARCH_32BIT_OFF_T configuration > option that is enabled for existing 32-bit architectures but disabled > for new arches (so 64-bit off_t is is used by new userspace). Also it > deprecates getrlimit and setrlimit syscalls prior to prlimit64. > > This version is based on linux-next from 2017-03-01. It works with > glibc-2.25, and tested with LTP, glibc testsuite, trinity, lmbench, > CPUSpec. > > Patches 1, 2, 3 and 8 are general, and may be applied separately. > > This is the rebase of v7 - no major changes has been made. > > Kernel and GLIBC trees: > https://github.com/norov/linux/tree/ilp32-20170301 > https://github.com/norov/glibc/tree/dev9 > > (GLIBC patches are managed by Steve Ellcey, so my tree is only for > reference.) > > Changes: > v3: https://lkml.org/lkml/2014/9/3/704 > v4: https://lkml.org/lkml/2015/4/13/691 > v5: https://lkml.org/lkml/2015/9/29/911 > v6: https://lkml.org/lkml/2016/5/23/661 > v7: RFC nowrap: https://lkml.org/lkml/2016/6/17/990 > v7: RFC2 nowrap: https://lkml.org/lkml/2016/8/17/245 > v7: RFC3 nowrap: https://lkml.org/lkml/2016/10/21/883 > v7: https://lkml.org/lkml/2017/1/9/213 > v7: Resend: fixed couple of typos, rebased on next-20170301 > > Andrew Pinski (6): > arm64: rename COMPAT to AARCH32_EL0 in Kconfig > arm64: ensure the kernel is compiled for LP64 > arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 > arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use > it > arm64: ilp32: introduce ilp32-specific handlers for sigframe and > ucontext > arm64:ilp32: add ARM64_ILP32 to Kconfig > > Philipp Tomsich (1): > arm64:ilp32: add vdso-ilp32 and use for signal return > > Yury Norov (13): > compat ABI: use non-compat openat and open_by_handle_at variants > 32-bit ABI: introduce ARCH_32BIT_OFF_T config option > asm-generic: Drop getrlimit and setrlimit syscalls from default list > arm64: ilp32: add documentation on the ILP32 ABI for ARM64 > thread: move thread bits accessors to separated file > arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) > arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64 > arm64: introduce binfmt_elf32.c > arm64: ilp32: introduce binfmt_ilp32.c > arm64: ilp32: share aarch32 syscall handlers > arm64: signal: share lp64 signal routines to ilp32 > arm64: signal32: move ilp32 and aarch32 common code to separated file > arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 > > Documentation/arm64/ilp32.txt | 45 +++ > arch/Kconfig | 4 + > arch/arc/Kconfig | 1 + > arch/arc/include/uapi/asm/unistd.h| 1 + > arch/arm/Kconfig | 1 + > arch/arm64/Kconfig| 19 ++- > arch/arm64/Makefile | 5 + > arch/arm64/include/asm/compat.h | 19 +-- > arch/arm64/include/asm/elf.h | 32 ++--- > arch/arm64/include/asm/fpsimd.h | 2 +- > arch/arm64/include/asm/ftrace.h | 2 +- > arch/arm64/include/asm/hwcap.h| 6 +- > arch/arm64/include/asm/is_compat.h| 90 ++ > arch/arm64/include/asm/memory.h | 5 +- > arch/arm64/include/asm/processor.h| 11 +- > arch/arm64/include/asm/ptrace.h | 2 +- > arch/arm64/include/asm/seccomp.h | 2 +- > arch/arm64/include/asm/signal32.h | 9 +- > arch/arm64/include/asm/signal32_common.h | 27 > arch/arm64/include/asm/signal_common.h| 33 + > arch/arm64/include/asm/signal_ilp32.h | 38 ++ > arch/arm64/include/asm/syscall.h | 2 +- > arch/arm64/include/asm/thread_info.h | 4 +- > arch/arm64/include/asm/unistd.h | 8 +- > arch/arm64/include/asm/vdso.h | 6 + > arch/arm64/include/uapi/asm/bitsperlong.h | 9 +- > arch/arm64/include/uapi/asm/unistd.h | 13
[PATCH 05/20] arm64: rename COMPAT to AARCH32_EL0 in Kconfig
From: Andrew Pinski <apin...@cavium.com> In this patchset ILP32 ABI support is added. Additionally to AARCH32, which is binary-compatible with ARM, ILP32 is (mostly) ABI-compatible. >From now, AARCH32_EL0 (former COMPAT) config option means the support of AARCH32 userspace, ARM64_ILP32 - support of ILP32 ABI (see next patches), and COMPAT indicates that one of them, or both, is enabled. Where needed, CONFIG_COMPAT is changed over to use CONFIG_AARCH32_EL0 instead Reviewed-by: David Daney <dda...@caviumnetworks.com> Signed-off-by: Andrew Pinski <andrew.pin...@caviumnetworks.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangj...@linaro.org> --- arch/arm64/Kconfig | 10 -- arch/arm64/include/asm/fpsimd.h | 2 +- arch/arm64/include/asm/hwcap.h | 4 ++-- arch/arm64/include/asm/processor.h | 6 +++--- arch/arm64/include/asm/ptrace.h | 2 +- arch/arm64/include/asm/seccomp.h | 2 +- arch/arm64/include/asm/signal32.h| 6 -- arch/arm64/include/asm/unistd.h | 2 +- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/asm-offsets.c | 2 +- arch/arm64/kernel/cpufeature.c | 8 arch/arm64/kernel/cpuinfo.c | 20 +++- arch/arm64/kernel/entry.S| 6 +++--- arch/arm64/kernel/head.S | 2 +- arch/arm64/kernel/ptrace.c | 8 arch/arm64/kernel/traps.c| 2 +- arch/arm64/kernel/vdso.c | 4 ++-- drivers/clocksource/arm_arch_timer.c | 2 +- 18 files changed, 50 insertions(+), 40 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 896eba6..d35cea4 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -403,7 +403,7 @@ config ARM64_ERRATUM_834220 config ARM64_ERRATUM_845719 bool "Cortex-A53: 845719: a load might read incorrect data" - depends on COMPAT + depends on AARCH32_EL0 default y help This option adds an alternative code sequence to work around ARM @@ -764,7 +764,7 @@ config FORCE_MAX_ZONEORDER menuconfig ARMV8_DEPRECATED bool "Emulate deprecated/obsolete ARMv8 instructions" - depends on COMPAT + depends on AARCH32_EL0 help Legacy software support may require certain instructions that have been deprecated or obsoleted in the architecture. @@ -1042,9 +1042,15 @@ menu "Userspace binary formats" source "fs/Kconfig.binfmt" config COMPAT + bool + depends on AARCH32_EL0 + +config AARCH32_EL0 bool "Kernel support for 32-bit EL0" + def_bool y depends on ARM64_4K_PAGES || EXPERT select COMPAT_BINFMT_ELF if BINFMT_ELF + select COMPAT select HAVE_UID16 select OLD_SIGSUSPEND3 select COMPAT_OLD_SIGACTION 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_MASK0xf89f #define VFP_FPSCR_CTRL_MASK0x07f79f00 diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 400b80b..2c7fc5d 100644 --- a/arch/arm64/include/asm/hwcap.h +++ b/arch/arm64/include/asm/hwcap.h @@ -46,7 +46,7 @@ */ #define ELF_HWCAP (elf_hwcap) -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define COMPAT_ELF_HWCAP (compat_elf_hwcap) #define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; @@ -54,7 +54,7 @@ extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; enum { CAP_HWCAP = 1, -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 CAP_COMPAT_HWCAP, CAP_COMPAT_HWCAP2, #endif diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index c97b8bd..f3f3599 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -79,7 +79,7 @@ struct cpu_context { struct thread_struct { struct cpu_context cpu_context;/* cpu context */ unsigned long tp_value; /* TLS register */ -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 unsigned long tp2_value; #endif struct fpsimd_state fpsimd_state; @@ -88,7 +88,7 @@ struct thread_struct { struct debug_info
[PATCH 01/20] compat ABI: use non-compat openat and open_by_handle_at variants
The only difference is that non-compat version forces O_LARGEFILE, and it should be the default behaviour for all architectures, as we don't support 32-bit off_t. The only exception is tile32, that continues with compat version of syscalls. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Acked-by: Arnd Bergmann <a...@arndb.de> Acked-by: Chris Metcalf <cmetc...@ezchip.com> [for tile] --- arch/tile/kernel/compat.c | 3 +++ include/uapi/asm-generic/unistd.h | 5 ++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/tile/kernel/compat.c b/arch/tile/kernel/compat.c index bdaf71d..3b7853c 100644 --- a/arch/tile/kernel/compat.c +++ b/arch/tile/kernel/compat.c @@ -103,6 +103,9 @@ COMPAT_SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned int, offset_high, #define compat_sys_readahead sys32_readahead #define sys_llseek compat_sys_llseek +#define sys_openat compat_sys_openat +#define sys_open_by_handle_at compat_sys_open_by_handle_at + /* Call the assembly trampolines where necessary. */ #define compat_sys_rt_sigreturn _compat_sys_rt_sigreturn #define sys_clone _sys_clone diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 9b1462e..a6062be 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -178,7 +178,7 @@ __SYSCALL(__NR_fchownat, sys_fchownat) #define __NR_fchown 55 __SYSCALL(__NR_fchown, sys_fchown) #define __NR_openat 56 -__SC_COMP(__NR_openat, sys_openat, compat_sys_openat) +__SYSCALL(__NR_openat, sys_openat) #define __NR_close 57 __SYSCALL(__NR_close, sys_close) #define __NR_vhangup 58 @@ -676,8 +676,7 @@ __SYSCALL(__NR_fanotify_mark, sys_fanotify_mark) #define __NR_name_to_handle_at 264 __SYSCALL(__NR_name_to_handle_at, sys_name_to_handle_at) #define __NR_open_by_handle_at 265 -__SC_COMP(__NR_open_by_handle_at, sys_open_by_handle_at, \ - compat_sys_open_by_handle_at) +__SYSCALL(__NR_open_by_handle_at, sys_open_by_handle_at) #define __NR_clock_adjtime 266 __SC_COMP(__NR_clock_adjtime, sys_clock_adjtime, compat_sys_clock_adjtime) #define __NR_syncfs 267 -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 04/20] arm64: ilp32: add documentation on the ILP32 ABI for ARM64
Based on Andrew Pinski's patch-series. Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- Documentation/arm64/ilp32.txt | 45 +++ 1 file changed, 45 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 000..08935a3 --- /dev/null +++ b/Documentation/arm64/ilp32.txt @@ -0,0 +1,45 @@ +ILP32 AARCH64 SYSCALL ABI += + +This document describes the ILP32 syscall ABI and where it differs +from the generic compat linux syscall interface. + +AARCH64/ILP32 userspace can pass garbage in the top halve of w0-w7 registers +(syscall arguments). So top 32 bits are zeroed for them. + +Comparing to AARCH32, AARCH64/ILP32 has 64-bit length of following types: +ino_t is u64 type. +off_t is s64 type. +blkcnt_tis s64 type. +fsblkcnt_t is u64 type. +fsfilcnt_t is u64 type. +rlim_t is u64 type. + +AARCH64/ILP32 ABI uses standard syscall table which can be found at +include/uapi/asm-generic/unistd.h, with the exceptions listed below. + +Syscalls which pass 64-bit values are handled by the code shared from +AARCH32 and pass that value as a pair. Next syscalls are affected: +fadvise64_64() +fallocate() +ftruncate64() +pread64() +pwrite64() +readahead() +sync_file_range() +truncate64() + +ptrace() syscall is handled by compat version. + +shmat() syscall is handled by non-compat handler as aarch64/ilp32 has no +limitation on 4-pages alignement for shared memory. + +statfs() and fstatfs() take the size of struct statfs as an argument. +It is calculated differently in kernel and user spaces. So AARCH32 handlers +are taken to handle it. + +struct rt_sigframe is redefined and contains struct compat_siginfo, +as compat syscalls expects, and struct ilp32_sigframe, to handle +AARCH64 register set and 32-bit userspace register representation. + +elf_gregset_t is taken from lp64 to handle registers properly. -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 03/20] asm-generic: Drop getrlimit and setrlimit syscalls from default list
The newer prlimit64 syscall provides all the functionality provided by the getrlimit and setrlimit syscalls and adds the pid of target process, so future architectures won't need to include getrlimit and setrlimit. Therefore drop getrlimit and setrlimit syscalls from the generic syscall list unless __ARCH_WANT_SET_GET_RLIMIT is defined by the architecture's unistd.h prior to including asm-generic/unistd.h, and adjust all architectures using the generic syscall list to define it so that no in-tree architectures are affected. Cc: Arnd Bergmann <a...@arndb.de> Cc: James Hogan <james.ho...@imgtec.com> Cc: linux-a...@vger.kernel.org Cc: linux-snps-...@lists.infradead.org Cc: Catalin Marinas <catalin.mari...@arm.com> Cc: Will Deacon <will.dea...@arm.com> Cc: linux-arm-ker...@lists.infradead.org Cc: Mark Salter <msal...@redhat.com> Cc: Aurelien Jacquiot <a-jacqu...@ti.com> Cc: linux-c6x-...@linux-c6x.org Cc: Richard Kuo <r...@codeaurora.org> Cc: linux-hexa...@vger.kernel.org Cc: linux-me...@vger.kernel.org Cc: Jonas Bonn <jo...@southpole.se> Cc: li...@lists.openrisc.net Cc: Chen Liqin <liqin.li...@gmail.com> Cc: Lennox Wu <lennox...@gmail.com> Cc: Chris Metcalf <cmetc...@mellanox.com> Cc: Guan Xuetao <g...@mprc.pku.edu.cn> Cc: Ley Foon Tan <lf...@altera.com> Cc: nios2-...@lists.rocketboards.org Cc: Yoshinori Sato <ys...@users.sourceforge.jp> Cc: uclinux-h8-de...@lists.sourceforge.jp Acked-by: Arnd Bergmann <a...@arndb.de> Acked-by: Mark Salter <msal...@redhat.com> [c6x] Acked-by: James Hogan <james.ho...@imgtec.com> [metag] Acked-by: Ley Foon Tan <lf...@altera.com> [nios2] Acked-by: Stafford Horne <sho...@gmail.com> [openrisc] Acked-by: Vineet Gupta <vgu...@synopsys.com> #arch/arc bits Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arc/include/uapi/asm/unistd.h | 1 + arch/arm64/include/uapi/asm/unistd.h | 1 + arch/c6x/include/uapi/asm/unistd.h | 1 + arch/h8300/include/uapi/asm/unistd.h | 1 + arch/hexagon/include/uapi/asm/unistd.h | 1 + arch/metag/include/uapi/asm/unistd.h | 1 + arch/nios2/include/uapi/asm/unistd.h | 1 + arch/openrisc/include/uapi/asm/unistd.h | 1 + arch/score/include/uapi/asm/unistd.h | 1 + arch/tile/include/uapi/asm/unistd.h | 1 + arch/unicore32/include/uapi/asm/unistd.h | 1 + include/uapi/asm-generic/unistd.h| 5 + 12 files changed, 16 insertions(+) diff --git a/arch/arc/include/uapi/asm/unistd.h b/arch/arc/include/uapi/asm/unistd.h index 9a34136..ac64965 100644 --- a/arch/arc/include/uapi/asm/unistd.h +++ b/arch/arc/include/uapi/asm/unistd.h @@ -16,6 +16,7 @@ #define _UAPI_ASM_ARC_UNISTD_H #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_VFORK diff --git a/arch/arm64/include/uapi/asm/unistd.h b/arch/arm64/include/uapi/asm/unistd.h index 043d17a..48355a6 100644 --- a/arch/arm64/include/uapi/asm/unistd.h +++ b/arch/arm64/include/uapi/asm/unistd.h @@ -15,5 +15,6 @@ */ #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #include diff --git a/arch/c6x/include/uapi/asm/unistd.h b/arch/c6x/include/uapi/asm/unistd.h index 12d73d9..f676231 100644 --- a/arch/c6x/include/uapi/asm/unistd.h +++ b/arch/c6x/include/uapi/asm/unistd.h @@ -15,6 +15,7 @@ */ #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SYS_CLONE /* Use the standard ABI for syscalls. */ diff --git a/arch/h8300/include/uapi/asm/unistd.h b/arch/h8300/include/uapi/asm/unistd.h index 7dd20ef..2f98394 100644 --- a/arch/h8300/include/uapi/asm/unistd.h +++ b/arch/h8300/include/uapi/asm/unistd.h @@ -1,5 +1,6 @@ #define __ARCH_NOMMU #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #include diff --git a/arch/hexagon/include/uapi/asm/unistd.h b/arch/hexagon/include/uapi/asm/unistd.h index 2151760..52d585c 100644 --- a/arch/hexagon/include/uapi/asm/unistd.h +++ b/arch/hexagon/include/uapi/asm/unistd.h @@ -28,6 +28,7 @@ #define sys_mmap2 sys_mmap_pgoff #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_VFORK diff --git a/arch/metag/include/uapi/asm/unistd.h b/arch/metag/include/uapi/asm/unistd.h index 459b6ec..16b5cb3 100644 --- a/arch/metag/include/uapi/asm/unistd.h +++ b/arch/metag/include/uapi/asm/unistd.h @@ -8,6 +8,7 @@ */ #define __ARCH_WANT_RENAMEAT +#define __ARCH_WANT_SET_GET_RLIMIT /* Use the standard ABI for syscalls. */ #include diff --git a/arch/nios2/include/uapi/asm/unistd.h b/arch/nios2/include/uapi/asm/unistd.h index 51a32c7..b0dda4d 100644 --- a/arch/nios2/include/uapi/asm/unistd.h +++ b/arch/nios2/include/uapi/asm/unistd.h @@ -18,6 +18,7 @@ #define sys_mmap2 sys_mmap_pgoff #define __ARCH_WANT_RENAMEAT +#defin
[PATCH 16/20] arm64: signal32: move ilp32 and aarch32 common code to separated file
Signed-off-by: Yury Norov <yno...@caviumnetworks.com> --- arch/arm64/include/asm/signal32.h| 3 + arch/arm64/include/asm/signal32_common.h | 27 +++ arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/signal32.c | 107 arch/arm64/kernel/signal32_common.c | 135 +++ 5 files changed, 166 insertions(+), 108 deletions(-) create mode 100644 arch/arm64/include/asm/signal32_common.h create mode 100644 arch/arm64/kernel/signal32_common.c diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h index e68fcce..1c4ede7 100644 --- a/arch/arm64/include/asm/signal32.h +++ b/arch/arm64/include/asm/signal32.h @@ -13,6 +13,9 @@ * 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 + #ifndef __ASM_SIGNAL32_H #define __ASM_SIGNAL32_H diff --git a/arch/arm64/include/asm/signal32_common.h b/arch/arm64/include/asm/signal32_common.h new file mode 100644 index 000..36c1ebc --- /dev/null +++ b/arch/arm64/include/asm/signal32_common.h @@ -0,0 +1,27 @@ +/* + * 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/>. + */ +#ifndef __ASM_SIGNAL32_COMMON_H +#define __ASM_SIGNAL32_COMMON_H + +#ifdef CONFIG_COMPAT + +int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from); +int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from); + +int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set); +int get_sigset_t(sigset_t *set, const compat_sigset_t __user *uset); + +#endif /* CONFIG_COMPAT*/ + +#endif /* __ASM_SIGNAL32_COMMON_H */ diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 4ea7b97f..9463af5 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -30,7 +30,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0)+= sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o binfmt_elf32.o arm64-obj-$(CONFIG_ARM64_ILP32)+= binfmt_ilp32.o sys_ilp32.o -arm64-obj-$(CONFIG_COMPAT) += entry32_common.o +arm64-obj-$(CONFIG_COMPAT) += entry32_common.o signal32_common.o arm64-obj-$(CONFIG_FUNCTION_TRACER)+= ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES)+= arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c index c747a0f..181cc30 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c @@ -103,113 +103,6 @@ struct compat_rt_sigframe { #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) -static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set) -{ - compat_sigset_t cset; - - cset.sig[0] = set->sig[0] & 0xull; - cset.sig[1] = set->sig[0] >> 32; - - return copy_to_user(uset, , sizeof(*uset)); -} - -static inline int get_sigset_t(sigset_t *set, - const compat_sigset_t __user *uset) -{ - compat_sigset_t s32; - - if (copy_from_user(, uset, sizeof(*uset))) - return -EFAULT; - - set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); - return 0; -} - -int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) -{ - int err; - - if (!access_ok(VERIFY_WRITE, to, sizeof(*to))) - return -EFAULT; - - /* If you change siginfo_t structure, please be sure -* this code is fixed accordingly. -* It should never copy any pad contained in the structure -* to avoid security leaks, but must copy the generic -* 3 ints plus the relevant union member. -* This routine must convert siginfo from 64bit to 32bit as well -* at the same time. -*/ - err = __put_user(from->si_signo, >si_signo); - err |= __put_user(from->si_errno, >si_errno); - err |= __put_user((short)from->si_code, >si_code); - if (from->si_code < 0) - err |= __copy_to_user(>_sifields._pad, >_sifields._pad, - SI_PAD_SIZE); - else switch (from->si_code & __SI_MASK) { - case __SI_KILL: -
[PATCH 07/20] arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64
From: Andrew Pinski <apin...@cavium.com> Define __BITS_PER_LONG depending on the ABI used (i.e. check whether __ILP32__ or __LP64__ is defined). This is necessary for glibc to determine the appropriate type definitions for the system call interface. Signed-off-by: Andrew Pinski <apin...@cavium.com> Signed-off-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muell...@theobroma-systems.com> Signed-off-by: Yury Norov <yno...@caviumnetworks.com> Reviewed-by: David Daney <dda...@caviumnetworks.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..4265243 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 +#if defined(__LP64__) +/* Assuming __LP64__ will be defined for native ELF64's and not for ILP32. */ +# define __BITS_PER_LONG 64 +#elif defined(__ILP32__) +# define __BITS_PER_LONG 32 +#else +# error "Neither LP64 nor ILP32: unsupported ABI in asm/bitsperlong.h" +#endif #include -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html