* [PATCH v6 00/21] ILP32 for ARM64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich This series enables aarch64 with ilp32 mode, and as supporting work, introduces compat wrappers based on s390 solution, and also 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). This version is based on kernel v4.6. It works with glibc-2.23, and tested with LTP. It was tested on QEMU and ThunderX machines. No major differences found. This is not RFC anymore, because ILP32 is now tested in big-endian mode; signals, vDSO and other subsystems are tested, and look working 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: ABI reworked significantly; - syscall input arguments are deloused with compat wrappers; - vDSO is now working for both BE and LE; - signal subsystem is reworked to handle signal context properly; - binfmt_elf is reworked, and now most of places where execution mode should be detected, are handled statically; - many other less-important fixes. ILP32 glibc branch is available here: https://github.com/norov/glibc/tree/ilp32-2.23 It is tested with this series with no major downsides. I will send it to glibc-alpha soon, after final revise. Please review and comment it as well. Andrew Pinski (6): arm64: ensure the kernel is compiled for LP64 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: 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 (15): all: introduce COMPAT_WRAPPER option and enable it for s390 all: s390: move wrapper infrastructure to generic headers all: s390: move compat_wrappers.c from arch/s390/kernel to kernel/ all: wrap needed syscalls in generic unistd compat ABI: use non-compat openat and open_by_handle_at variants 32-bit ABI: introduce ARCH_32BIT_OFF_T config option 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: ptrace: handle ptrace_request differently for aarch32 and ilp32 arm64: signal: share lp64 signal routines to ilp32 arm64: signal32: move ilp32 and aarch32 common code to separated file Documentation/arm64/ilp32.txt | 25 +++ arch/Kconfig | 8 + arch/arc/Kconfig | 1 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig | 20 +- arch/arm64/Makefile | 5 + arch/arm64/include/asm/compat.h | 19 +- arch/arm64/include/asm/elf.h | 35 +--- 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 | 84 ++++++++ arch/arm64/include/asm/memory.h | 3 +- arch/arm64/include/asm/processor.h | 11 +- arch/arm64/include/asm/ptrace.h | 2 +- arch/arm64/include/asm/signal32.h | 6 +- arch/arm64/include/asm/signal32_common.h | 25 +++ arch/arm64/include/asm/signal_common.h | 33 +++ arch/arm64/include/asm/signal_ilp32.h | 34 ++++ arch/arm64/include/asm/syscall.h | 2 +- arch/arm64/include/asm/thread_info.h | 4 +- arch/arm64/include/asm/unistd.h | 11 +- arch/arm64/include/asm/unistd32.h | 2 +- arch/arm64/include/asm/vdso.h | 6 + arch/arm64/include/uapi/asm/bitsperlong.h | 9 +- arch/arm64/kernel/Makefile | 14 +- arch/arm64/kernel/asm-offsets.c | 9 +- arch/arm64/kernel/binfmt_elf32.c | 33 +++ arch/arm64/kernel/binfmt_ilp32.c | 91 +++++++++ arch/arm64/kernel/cpufeature.c | 8 +- arch/arm64/kernel/cpuinfo.c | 4 +- arch/arm64/kernel/entry.S | 16 +- arch/arm64/kernel/entry_ilp32.S | 23 +++ arch/arm64/kernel/head.S | 2 +- arch/arm64/kernel/hw_breakpoint.c | 10 +- arch/arm64/kernel/perf_regs.c | 2 +- arch/arm64/kernel/process.c | 7 +- arch/arm64/kernel/ptrace.c | 67 ++++++- arch/arm64/kernel/signal.c | 100 ++++++---- arch/arm64/kernel/signal32.c | 85 -------- arch/arm64/kernel/signal32_common.c | 115 +++++++++++ arch/arm64/kernel/signal_ilp32.c | 192 ++++++++++++++++++ arch/arm64/kernel/sys32.c | 1 + arch/arm64/kernel/sys_ilp32.c | 86 ++++++++ arch/arm64/kernel/traps.c | 5 +- arch/arm64/kernel/vdso-ilp32/.gitignore | 2 + arch/arm64/kernel/vdso-ilp32/Makefile | 74 +++++++ 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/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/s390/Kconfig | 1 + arch/s390/include/asm/compat.h | 17 +- arch/s390/kernel/Makefile | 2 +- arch/s390/kernel/compat_linux.c | 4 + arch/s390/kernel/compat_wrapper.c | 180 ----------------- arch/score/Kconfig | 1 + arch/sh/Kconfig | 1 + arch/sparc/Kconfig | 1 + arch/tile/Kconfig | 1 + arch/tile/kernel/compat.c | 3 + arch/unicore32/Kconfig | 1 + arch/x86/Kconfig | 1 + arch/x86/um/Kconfig | 1 + arch/xtensa/Kconfig | 1 + drivers/clocksource/arm_arch_timer.c | 2 +- include/linux/compat.h | 277 ++++++++++++++++++++++++++ include/linux/fcntl.h | 2 +- include/linux/ptrace.h | 6 + include/linux/syscalls.h | 57 +----- include/linux/syscalls_structs.h | 60 ++++++ include/linux/thread_bits.h | 55 +++++ include/linux/thread_info.h | 44 +--- include/uapi/asm-generic/unistd.h | 231 ++++++++++----------- kernel/Makefile | 1 + kernel/compat_wrapper.c | 175 ++++++++++++++++ kernel/ptrace.c | 10 +- 92 files changed, 2024 insertions(+), 641 deletions(-) create mode 100644 Documentation/arm64/ilp32.txt create mode 100644 arch/arm64/include/asm/is_compat.h create mode 100644 arch/arm64/include/asm/signal32_common.h create mode 100644 arch/arm64/include/asm/signal_common.h create mode 100644 arch/arm64/include/asm/signal_ilp32.h create mode 100644 arch/arm64/kernel/binfmt_elf32.c create mode 100644 arch/arm64/kernel/binfmt_ilp32.c create mode 100644 arch/arm64/kernel/entry_ilp32.S create mode 100644 arch/arm64/kernel/signal32_common.c create mode 100644 arch/arm64/kernel/signal_ilp32.c create mode 100644 arch/arm64/kernel/sys_ilp32.c 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 delete mode 100644 arch/s390/kernel/compat_wrapper.c create mode 100644 include/linux/syscalls_structs.h create mode 100644 include/linux/thread_bits.h create mode 100644 kernel/compat_wrapper.c -- 2.5.0 ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH v6 00/21] ILP32 for ARM64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel This series enables aarch64 with ilp32 mode, and as supporting work, introduces compat wrappers based on s390 solution, and also 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). This version is based on kernel v4.6. It works with glibc-2.23, and tested with LTP. It was tested on QEMU and ThunderX machines. No major differences found. This is not RFC anymore, because ILP32 is now tested in big-endian mode; signals, vDSO and other subsystems are tested, and look working 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: ABI reworked significantly; - syscall input arguments are deloused with compat wrappers; - vDSO is now working for both BE and LE; - signal subsystem is reworked to handle signal context properly; - binfmt_elf is reworked, and now most of places where execution mode should be detected, are handled statically; - many other less-important fixes. ILP32 glibc branch is available here: https://github.com/norov/glibc/tree/ilp32-2.23 It is tested with this series with no major downsides. I will send it to glibc-alpha soon, after final revise. Please review and comment it as well. Andrew Pinski (6): arm64: ensure the kernel is compiled for LP64 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: 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 (15): all: introduce COMPAT_WRAPPER option and enable it for s390 all: s390: move wrapper infrastructure to generic headers all: s390: move compat_wrappers.c from arch/s390/kernel to kernel/ all: wrap needed syscalls in generic unistd compat ABI: use non-compat openat and open_by_handle_at variants 32-bit ABI: introduce ARCH_32BIT_OFF_T config option 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: ptrace: handle ptrace_request differently for aarch32 and ilp32 arm64: signal: share lp64 signal routines to ilp32 arm64: signal32: move ilp32 and aarch32 common code to separated file Documentation/arm64/ilp32.txt | 25 +++ arch/Kconfig | 8 + arch/arc/Kconfig | 1 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig | 20 +- arch/arm64/Makefile | 5 + arch/arm64/include/asm/compat.h | 19 +- arch/arm64/include/asm/elf.h | 35 +--- 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 | 84 ++++++++ arch/arm64/include/asm/memory.h | 3 +- arch/arm64/include/asm/processor.h | 11 +- arch/arm64/include/asm/ptrace.h | 2 +- arch/arm64/include/asm/signal32.h | 6 +- arch/arm64/include/asm/signal32_common.h | 25 +++ arch/arm64/include/asm/signal_common.h | 33 +++ arch/arm64/include/asm/signal_ilp32.h | 34 ++++ arch/arm64/include/asm/syscall.h | 2 +- arch/arm64/include/asm/thread_info.h | 4 +- arch/arm64/include/asm/unistd.h | 11 +- arch/arm64/include/asm/unistd32.h | 2 +- arch/arm64/include/asm/vdso.h | 6 + arch/arm64/include/uapi/asm/bitsperlong.h | 9 +- arch/arm64/kernel/Makefile | 14 +- arch/arm64/kernel/asm-offsets.c | 9 +- arch/arm64/kernel/binfmt_elf32.c | 33 +++ arch/arm64/kernel/binfmt_ilp32.c | 91 +++++++++ arch/arm64/kernel/cpufeature.c | 8 +- arch/arm64/kernel/cpuinfo.c | 4 +- arch/arm64/kernel/entry.S | 16 +- arch/arm64/kernel/entry_ilp32.S | 23 +++ arch/arm64/kernel/head.S | 2 +- arch/arm64/kernel/hw_breakpoint.c | 10 +- arch/arm64/kernel/perf_regs.c | 2 +- arch/arm64/kernel/process.c | 7 +- arch/arm64/kernel/ptrace.c | 67 ++++++- arch/arm64/kernel/signal.c | 100 ++++++---- arch/arm64/kernel/signal32.c | 85 -------- arch/arm64/kernel/signal32_common.c | 115 +++++++++++ arch/arm64/kernel/signal_ilp32.c | 192 ++++++++++++++++++ arch/arm64/kernel/sys32.c | 1 + arch/arm64/kernel/sys_ilp32.c | 86 ++++++++ arch/arm64/kernel/traps.c | 5 +- arch/arm64/kernel/vdso-ilp32/.gitignore | 2 + arch/arm64/kernel/vdso-ilp32/Makefile | 74 +++++++ 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/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/s390/Kconfig | 1 + arch/s390/include/asm/compat.h | 17 +- arch/s390/kernel/Makefile | 2 +- arch/s390/kernel/compat_linux.c | 4 + arch/s390/kernel/compat_wrapper.c | 180 ----------------- arch/score/Kconfig | 1 + arch/sh/Kconfig | 1 + arch/sparc/Kconfig | 1 + arch/tile/Kconfig | 1 + arch/tile/kernel/compat.c | 3 + arch/unicore32/Kconfig | 1 + arch/x86/Kconfig | 1 + arch/x86/um/Kconfig | 1 + arch/xtensa/Kconfig | 1 + drivers/clocksource/arm_arch_timer.c | 2 +- include/linux/compat.h | 277 ++++++++++++++++++++++++++ include/linux/fcntl.h | 2 +- include/linux/ptrace.h | 6 + include/linux/syscalls.h | 57 +----- include/linux/syscalls_structs.h | 60 ++++++ include/linux/thread_bits.h | 55 +++++ include/linux/thread_info.h | 44 +--- include/uapi/asm-generic/unistd.h | 231 ++++++++++----------- kernel/Makefile | 1 + kernel/compat_wrapper.c | 175 ++++++++++++++++ kernel/ptrace.c | 10 +- 92 files changed, 2024 insertions(+), 641 deletions(-) create mode 100644 Documentation/arm64/ilp32.txt create mode 100644 arch/arm64/include/asm/is_compat.h create mode 100644 arch/arm64/include/asm/signal32_common.h create mode 100644 arch/arm64/include/asm/signal_common.h create mode 100644 arch/arm64/include/asm/signal_ilp32.h create mode 100644 arch/arm64/kernel/binfmt_elf32.c create mode 100644 arch/arm64/kernel/binfmt_ilp32.c create mode 100644 arch/arm64/kernel/entry_ilp32.S create mode 100644 arch/arm64/kernel/signal32_common.c create mode 100644 arch/arm64/kernel/signal_ilp32.c create mode 100644 arch/arm64/kernel/sys_ilp32.c 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 delete mode 100644 arch/s390/kernel/compat_wrapper.c create mode 100644 include/linux/syscalls_structs.h create mode 100644 include/linux/thread_bits.h create mode 100644 kernel/compat_wrapper.c -- 2.5.0 ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH v6 00/21] ILP32 for ARM64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich This series enables aarch64 with ilp32 mode, and as supporting work, introduces compat wrappers based on s390 solution, and also 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). This version is based on kernel v4.6. It works with glibc-2.23, and tested with LTP. It was tested on QEMU and ThunderX machines. No major differences found. This is not RFC anymore, because ILP32 is now tested in big-endian mode; signals, vDSO and other subsystems are tested, and look working 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: ABI reworked significantly; - syscall input arguments are deloused with compat wrappers; - vDSO is now working for both BE and LE; - signal subsystem is reworked to handle signal context properly; - binfmt_elf is reworked, and now most of places where execution mode should be detected, are handled statically; - many other less-important fixes. ILP32 glibc branch is available here: https://github.com/norov/glibc/tree/ilp32-2.23 It is tested with this series with no major downsides. I will send it to glibc-alpha soon, after final revise. Please review and comment it as well. Andrew Pinski (6): arm64: ensure the kernel is compiled for LP64 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: 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 (15): all: introduce COMPAT_WRAPPER option and enable it for s390 all: s390: move wrapper infrastructure to generic headers all: s390: move compat_wrappers.c from arch/s390/kernel to kernel/ all: wrap needed syscalls in generic unistd compat ABI: use non-compat openat and open_by_handle_at variants 32-bit ABI: introduce ARCH_32BIT_OFF_T config option 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: ptrace: handle ptrace_request differently for aarch32 and ilp32 arm64: signal: share lp64 signal routines to ilp32 arm64: signal32: move ilp32 and aarch32 common code to separated file Documentation/arm64/ilp32.txt | 25 +++ arch/Kconfig | 8 + arch/arc/Kconfig | 1 + arch/arm/Kconfig | 1 + arch/arm64/Kconfig | 20 +- arch/arm64/Makefile | 5 + arch/arm64/include/asm/compat.h | 19 +- arch/arm64/include/asm/elf.h | 35 +--- 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 | 84 ++++++++ arch/arm64/include/asm/memory.h | 3 +- arch/arm64/include/asm/processor.h | 11 +- arch/arm64/include/asm/ptrace.h | 2 +- arch/arm64/include/asm/signal32.h | 6 +- arch/arm64/include/asm/signal32_common.h | 25 +++ arch/arm64/include/asm/signal_common.h | 33 +++ arch/arm64/include/asm/signal_ilp32.h | 34 ++++ arch/arm64/include/asm/syscall.h | 2 +- arch/arm64/include/asm/thread_info.h | 4 +- arch/arm64/include/asm/unistd.h | 11 +- arch/arm64/include/asm/unistd32.h | 2 +- arch/arm64/include/asm/vdso.h | 6 + arch/arm64/include/uapi/asm/bitsperlong.h | 9 +- arch/arm64/kernel/Makefile | 14 +- arch/arm64/kernel/asm-offsets.c | 9 +- arch/arm64/kernel/binfmt_elf32.c | 33 +++ arch/arm64/kernel/binfmt_ilp32.c | 91 +++++++++ arch/arm64/kernel/cpufeature.c | 8 +- arch/arm64/kernel/cpuinfo.c | 4 +- arch/arm64/kernel/entry.S | 16 +- arch/arm64/kernel/entry_ilp32.S | 23 +++ arch/arm64/kernel/head.S | 2 +- arch/arm64/kernel/hw_breakpoint.c | 10 +- arch/arm64/kernel/perf_regs.c | 2 +- arch/arm64/kernel/process.c | 7 +- arch/arm64/kernel/ptrace.c | 67 ++++++- arch/arm64/kernel/signal.c | 100 ++++++---- arch/arm64/kernel/signal32.c | 85 -------- arch/arm64/kernel/signal32_common.c | 115 +++++++++++ arch/arm64/kernel/signal_ilp32.c | 192 ++++++++++++++++++ arch/arm64/kernel/sys32.c | 1 + arch/arm64/kernel/sys_ilp32.c | 86 ++++++++ arch/arm64/kernel/traps.c | 5 +- arch/arm64/kernel/vdso-ilp32/.gitignore | 2 + arch/arm64/kernel/vdso-ilp32/Makefile | 74 +++++++ 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/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/s390/Kconfig | 1 + arch/s390/include/asm/compat.h | 17 +- arch/s390/kernel/Makefile | 2 +- arch/s390/kernel/compat_linux.c | 4 + arch/s390/kernel/compat_wrapper.c | 180 ----------------- arch/score/Kconfig | 1 + arch/sh/Kconfig | 1 + arch/sparc/Kconfig | 1 + arch/tile/Kconfig | 1 + arch/tile/kernel/compat.c | 3 + arch/unicore32/Kconfig | 1 + arch/x86/Kconfig | 1 + arch/x86/um/Kconfig | 1 + arch/xtensa/Kconfig | 1 + drivers/clocksource/arm_arch_timer.c | 2 +- include/linux/compat.h | 277 ++++++++++++++++++++++++++ include/linux/fcntl.h | 2 +- include/linux/ptrace.h | 6 + include/linux/syscalls.h | 57 +----- include/linux/syscalls_structs.h | 60 ++++++ include/linux/thread_bits.h | 55 +++++ include/linux/thread_info.h | 44 +--- include/uapi/asm-generic/unistd.h | 231 ++++++++++----------- kernel/Makefile | 1 + kernel/compat_wrapper.c | 175 ++++++++++++++++ kernel/ptrace.c | 10 +- 92 files changed, 2024 insertions(+), 641 deletions(-) create mode 100644 Documentation/arm64/ilp32.txt create mode 100644 arch/arm64/include/asm/is_compat.h create mode 100644 arch/arm64/include/asm/signal32_common.h create mode 100644 arch/arm64/include/asm/signal_common.h create mode 100644 arch/arm64/include/asm/signal_ilp32.h create mode 100644 arch/arm64/kernel/binfmt_elf32.c create mode 100644 arch/arm64/kernel/binfmt_ilp32.c create mode 100644 arch/arm64/kernel/entry_ilp32.S create mode 100644 arch/arm64/kernel/signal32_common.c create mode 100644 arch/arm64/kernel/signal_ilp32.c create mode 100644 arch/arm64/kernel/sys_ilp32.c 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 delete mode 100644 arch/s390/kernel/compat_wrapper.c create mode 100644 include/linux/syscalls_structs.h create mode 100644 include/linux/thread_bits.h create mode 100644 kernel/compat_wrapper.c -- 2.5.0 ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- Documentation/adding-syscalls.txt | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Documentation/adding-syscalls.txt b/Documentation/adding-syscalls.txt index cc2d4ac..d02a6bd 100644 --- a/Documentation/adding-syscalls.txt +++ b/Documentation/adding-syscalls.txt @@ -341,6 +341,38 @@ To summarize, you need: - instance of __SC_COMP not __SYSCALL in include/uapi/asm-generic/unistd.h +Compatibility System Calls Wrappers +-------------------------------- + +Some architectures prevent 32-bit userspace from access to top halves of 64-bit +registers, but some not. It's not a problem if specific argument is the same +size in kernel and userspace. It also is not a problem if system call is already +handled by compatible routine. Otherwise we'd take care of it. Usually, glibc +and compiler handles register's top halve, but from kernel side, we cannot rely +on it, as malicious code may cause incorrect behaviour and/or security +vulnerabilities. + +For now, only s390 and arm64/ilp32 are affected. + +To clear that top halves, automatic wrappers are introduced. They clear all +required registers before passing control to regular syscall handler. + +If your architecture allows userspace code to access top halves of register, +you need to: + - enable COMPAT_WRAPPER in configuration file; + - declare: "#define __SC_WRAP(nr, sym) [nr] = compat_##sym,", just before + compatible syscall table declaration, if you use generic unistd; or + - declare compat wrappers manually, if you use non-generic syscall table. + The list of unsafe syscalls is in kernel/compat_wrapper. + +If you write new syscall, make sure, its arguments are the same size in both +64- and 32-bits modes. If no, and if there's no explicit compat version for +syscall handler, you need to: + - declare compat version prototype in 'include/linux/compat.h'; + - in 'include/uapi/asm-generic/unistd.h' declare syscall with macro '__SC_WRAP' + instead of '__SYSCALL'; + - add corresponding line to 'kernel/compat_wrapper.c' to let it generate wrapper. + Compatibility System Calls (x86) -------------------------------- -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- Documentation/adding-syscalls.txt | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Documentation/adding-syscalls.txt b/Documentation/adding-syscalls.txt index cc2d4ac..d02a6bd 100644 --- a/Documentation/adding-syscalls.txt +++ b/Documentation/adding-syscalls.txt @@ -341,6 +341,38 @@ To summarize, you need: - instance of __SC_COMP not __SYSCALL in include/uapi/asm-generic/unistd.h +Compatibility System Calls Wrappers +-------------------------------- + +Some architectures prevent 32-bit userspace from access to top halves of 64-bit +registers, but some not. It's not a problem if specific argument is the same +size in kernel and userspace. It also is not a problem if system call is already +handled by compatible routine. Otherwise we'd take care of it. Usually, glibc +and compiler handles register's top halve, but from kernel side, we cannot rely +on it, as malicious code may cause incorrect behaviour and/or security +vulnerabilities. + +For now, only s390 and arm64/ilp32 are affected. + +To clear that top halves, automatic wrappers are introduced. They clear all +required registers before passing control to regular syscall handler. + +If your architecture allows userspace code to access top halves of register, +you need to: + - enable COMPAT_WRAPPER in configuration file; + - declare: "#define __SC_WRAP(nr, sym) [nr] = compat_##sym,", just before + compatible syscall table declaration, if you use generic unistd; or + - declare compat wrappers manually, if you use non-generic syscall table. + The list of unsafe syscalls is in kernel/compat_wrapper. + +If you write new syscall, make sure, its arguments are the same size in both +64- and 32-bits modes. If no, and if there's no explicit compat version for +syscall handler, you need to: + - declare compat version prototype in 'include/linux/compat.h'; + - in 'include/uapi/asm-generic/unistd.h' declare syscall with macro '__SC_WRAP' + instead of '__SYSCALL'; + - add corresponding line to 'kernel/compat_wrapper.c' to let it generate wrapper. + Compatibility System Calls (x86) -------------------------------- -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- Documentation/adding-syscalls.txt | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Documentation/adding-syscalls.txt b/Documentation/adding-syscalls.txt index cc2d4ac..d02a6bd 100644 --- a/Documentation/adding-syscalls.txt +++ b/Documentation/adding-syscalls.txt @@ -341,6 +341,38 @@ To summarize, you need: - instance of __SC_COMP not __SYSCALL in include/uapi/asm-generic/unistd.h +Compatibility System Calls Wrappers +-------------------------------- + +Some architectures prevent 32-bit userspace from access to top halves of 64-bit +registers, but some not. It's not a problem if specific argument is the same +size in kernel and userspace. It also is not a problem if system call is already +handled by compatible routine. Otherwise we'd take care of it. Usually, glibc +and compiler handles register's top halve, but from kernel side, we cannot rely +on it, as malicious code may cause incorrect behaviour and/or security +vulnerabilities. + +For now, only s390 and arm64/ilp32 are affected. + +To clear that top halves, automatic wrappers are introduced. They clear all +required registers before passing control to regular syscall handler. + +If your architecture allows userspace code to access top halves of register, +you need to: + - enable COMPAT_WRAPPER in configuration file; + - declare: "#define __SC_WRAP(nr, sym) [nr] = compat_##sym,", just before + compatible syscall table declaration, if you use generic unistd; or + - declare compat wrappers manually, if you use non-generic syscall table. + The list of unsafe syscalls is in kernel/compat_wrapper. + +If you write new syscall, make sure, its arguments are the same size in both +64- and 32-bits modes. If no, and if there's no explicit compat version for +syscall handler, you need to: + - declare compat version prototype in 'include/linux/compat.h'; + - in 'include/uapi/asm-generic/unistd.h' declare syscall with macro '__SC_WRAP' + instead of '__SYSCALL'; + - add corresponding line to 'kernel/compat_wrapper.c' to let it generate wrapper. + Compatibility System Calls (x86) -------------------------------- -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-24 0:04 ` Yury Norov @ 2016-05-25 19:30 ` David Miller -1 siblings, 0 replies; 207+ messages in thread From: David Miller @ 2016-05-25 19:30 UTC (permalink / raw) To: ynorov Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich From: Yury Norov <ynorov@caviumnetworks.com> Date: Tue, 24 May 2016 03:04:30 +0300 > +To clear that top halves, automatic wrappers are introduced. They clear all > +required registers before passing control to regular syscall handler. Why have one of these for every single compat system call, rather than simply clearing the top half of all of these registers unconditionally in the 32-bit system call trap before the system call is invoked? That's what we do on sparc64. And with that, you only need wrappers for the case where there needs to be proper sign extention of a 32-bit signed argument. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-25 19:30 ` David Miller 0 siblings, 0 replies; 207+ messages in thread From: David Miller @ 2016-05-25 19:30 UTC (permalink / raw) To: linux-arm-kernel From: Yury Norov <ynorov@caviumnetworks.com> Date: Tue, 24 May 2016 03:04:30 +0300 > +To clear that top halves, automatic wrappers are introduced. They clear all > +required registers before passing control to regular syscall handler. Why have one of these for every single compat system call, rather than simply clearing the top half of all of these registers unconditionally in the 32-bit system call trap before the system call is invoked? That's what we do on sparc64. And with that, you only need wrappers for the case where there needs to be proper sign extention of a 32-bit signed argument. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-25 19:30 ` David Miller (?) @ 2016-05-25 20:03 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-25 20:03 UTC (permalink / raw) To: David Miller Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Wed, May 25, 2016 at 12:30:17PM -0700, David Miller wrote: > From: Yury Norov <ynorov@caviumnetworks.com> > Date: Tue, 24 May 2016 03:04:30 +0300 > > > +To clear that top halves, automatic wrappers are introduced. They clear all > > +required registers before passing control to regular syscall handler. > > Why have one of these for every single compat system call, rather than > simply clearing the top half of all of these registers unconditionally > in the 32-bit system call trap before the system call is invoked? > > That's what we do on sparc64. > > And with that, you only need wrappers for the case where there needs > to be proper sign extention of a 32-bit signed argument. It was discussed as one of possible solutions. The downside of it is that we cannot pass 64-bit types (like off_t) in single register. The other downside is that we clear top halves for every single syscall, and it looks excessive. So, from spark64 and s390 approaches we choosed second. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-25 20:03 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-25 20:03 UTC (permalink / raw) To: linux-arm-kernel On Wed, May 25, 2016 at 12:30:17PM -0700, David Miller wrote: > From: Yury Norov <ynorov@caviumnetworks.com> > Date: Tue, 24 May 2016 03:04:30 +0300 > > > +To clear that top halves, automatic wrappers are introduced. They clear all > > +required registers before passing control to regular syscall handler. > > Why have one of these for every single compat system call, rather than > simply clearing the top half of all of these registers unconditionally > in the 32-bit system call trap before the system call is invoked? > > That's what we do on sparc64. > > And with that, you only need wrappers for the case where there needs > to be proper sign extention of a 32-bit signed argument. It was discussed as one of possible solutions. The downside of it is that we cannot pass 64-bit types (like off_t) in single register. The other downside is that we clear top halves for every single syscall, and it looks excessive. So, from spark64 and s390 approaches we choosed second. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-25 20:03 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-25 20:03 UTC (permalink / raw) To: David Miller Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Wed, May 25, 2016 at 12:30:17PM -0700, David Miller wrote: > From: Yury Norov <ynorov@caviumnetworks.com> > Date: Tue, 24 May 2016 03:04:30 +0300 > > > +To clear that top halves, automatic wrappers are introduced. They clear all > > +required registers before passing control to regular syscall handler. > > Why have one of these for every single compat system call, rather than > simply clearing the top half of all of these registers unconditionally > in the 32-bit system call trap before the system call is invoked? > > That's what we do on sparc64. > > And with that, you only need wrappers for the case where there needs > to be proper sign extention of a 32-bit signed argument. It was discussed as one of possible solutions. The downside of it is that we cannot pass 64-bit types (like off_t) in single register. The other downside is that we clear top halves for every single syscall, and it looks excessive. So, from spark64 and s390 approaches we choosed second. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-25 20:03 ` Yury Norov @ 2016-05-25 20:21 ` David Miller -1 siblings, 0 replies; 207+ messages in thread From: David Miller @ 2016-05-25 20:21 UTC (permalink / raw) To: ynorov Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich From: Yury Norov <ynorov@caviumnetworks.com> Date: Wed, 25 May 2016 23:03:27 +0300 > On Wed, May 25, 2016 at 12:30:17PM -0700, David Miller wrote: >> From: Yury Norov <ynorov@caviumnetworks.com> >> Date: Tue, 24 May 2016 03:04:30 +0300 >> >> > +To clear that top halves, automatic wrappers are introduced. They clear all >> > +required registers before passing control to regular syscall handler. >> >> Why have one of these for every single compat system call, rather than >> simply clearing the top half of all of these registers unconditionally >> in the 32-bit system call trap before the system call is invoked? >> >> That's what we do on sparc64. >> >> And with that, you only need wrappers for the case where there needs >> to be proper sign extention of a 32-bit signed argument. > > It was discussed as one of possible solutions. The downside of it is > that we cannot pass 64-bit types (like off_t) in single register. Wrappers can be added for the cases where you'd like to do that. > The other downside is that we clear top halves for every single > syscall, and it looks excessive. So, from spark64 and s390 approaches > we choosed second. It's like 4 cpu cycles even on crappy sparc64 cpus which only dual issue. :) And that's a pretty low cost for the benefits if you ask me. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-25 20:21 ` David Miller 0 siblings, 0 replies; 207+ messages in thread From: David Miller @ 2016-05-25 20:21 UTC (permalink / raw) To: linux-arm-kernel From: Yury Norov <ynorov@caviumnetworks.com> Date: Wed, 25 May 2016 23:03:27 +0300 > On Wed, May 25, 2016 at 12:30:17PM -0700, David Miller wrote: >> From: Yury Norov <ynorov@caviumnetworks.com> >> Date: Tue, 24 May 2016 03:04:30 +0300 >> >> > +To clear that top halves, automatic wrappers are introduced. They clear all >> > +required registers before passing control to regular syscall handler. >> >> Why have one of these for every single compat system call, rather than >> simply clearing the top half of all of these registers unconditionally >> in the 32-bit system call trap before the system call is invoked? >> >> That's what we do on sparc64. >> >> And with that, you only need wrappers for the case where there needs >> to be proper sign extention of a 32-bit signed argument. > > It was discussed as one of possible solutions. The downside of it is > that we cannot pass 64-bit types (like off_t) in single register. Wrappers can be added for the cases where you'd like to do that. > The other downside is that we clear top halves for every single > syscall, and it looks excessive. So, from spark64 and s390 approaches > we choosed second. It's like 4 cpu cycles even on crappy sparc64 cpus which only dual issue. :) And that's a pretty low cost for the benefits if you ask me. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-25 20:21 ` David Miller @ 2016-05-25 20:47 ` Arnd Bergmann -1 siblings, 0 replies; 207+ messages in thread From: Arnd Bergmann @ 2016-05-25 20:47 UTC (permalink / raw) To: David Miller Cc: ynorov, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Wednesday, May 25, 2016 1:21:45 PM CEST David Miller wrote: > From: Yury Norov <ynorov@caviumnetworks.com> > Date: Wed, 25 May 2016 23:03:27 +0300 > > > On Wed, May 25, 2016 at 12:30:17PM -0700, David Miller wrote: > >> From: Yury Norov <ynorov@caviumnetworks.com> > >> Date: Tue, 24 May 2016 03:04:30 +0300 > >> > >> > +To clear that top halves, automatic wrappers are introduced. They clear all > >> > +required registers before passing control to regular syscall handler. > >> > >> Why have one of these for every single compat system call, rather than > >> simply clearing the top half of all of these registers unconditionally > >> in the 32-bit system call trap before the system call is invoked? > >> > >> That's what we do on sparc64. > >> > >> And with that, you only need wrappers for the case where there needs > >> to be proper sign extention of a 32-bit signed argument. > > > > It was discussed as one of possible solutions. The downside of it is > > that we cannot pass 64-bit types (like off_t) in single register. > > Wrappers can be added for the cases where you'd like to do that. If we clear the upper halves on the initial entry, we can't use a wrapper to restore them, so would have to instead pass them as register pairs as we do on the other 32-bit architectures. > > The other downside is that we clear top halves for every single > > syscall, and it looks excessive. So, from spark64 and s390 approaches > > we choosed second. > > It's like 4 cpu cycles even on crappy sparc64 cpus which only dual > issue. :) > > And that's a pretty low cost for the benefits if you ask me. To clarify what we are talking about: These syscalls that normally pass 64-bit arguments as register pairs are intentionally overridden to make them faster on ilp32 mode compare to other compat modes: +#define compat_sys_fadvise64_64 sys_fadvise64_64 +#define compat_sys_fallocate sys_fallocate +#define compat_sys_ftruncate64 sys_ftruncate +#define compat_sys_lookup_dcookie sys_lookup_dcookie +#define compat_sys_readahead sys_readahead +#define compat_sys_sync_file_range sys_sync_file_range +#define compat_sys_truncate64 sys_truncate +#define sys_llseek sys_lseek +static unsigned long compat_sys_pread64(unsigned int fd, + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) +{ + return sys_pread64(fd, (char *) ubuf, count, offset); +} + +static unsigned long compat_sys_pwrite64(unsigned int fd, + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) +{ + return sys_pwrite64(fd, (char *) ubuf, count, offset); +} If we use the normal calling conventions, we could remove these overrides along with the respective special-case handling in glibc. None of them look particularly performance-sensitive, but I could be wrong there. Arnd ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-25 20:47 ` Arnd Bergmann 0 siblings, 0 replies; 207+ messages in thread From: Arnd Bergmann @ 2016-05-25 20:47 UTC (permalink / raw) To: linux-arm-kernel On Wednesday, May 25, 2016 1:21:45 PM CEST David Miller wrote: > From: Yury Norov <ynorov@caviumnetworks.com> > Date: Wed, 25 May 2016 23:03:27 +0300 > > > On Wed, May 25, 2016 at 12:30:17PM -0700, David Miller wrote: > >> From: Yury Norov <ynorov@caviumnetworks.com> > >> Date: Tue, 24 May 2016 03:04:30 +0300 > >> > >> > +To clear that top halves, automatic wrappers are introduced. They clear all > >> > +required registers before passing control to regular syscall handler. > >> > >> Why have one of these for every single compat system call, rather than > >> simply clearing the top half of all of these registers unconditionally > >> in the 32-bit system call trap before the system call is invoked? > >> > >> That's what we do on sparc64. > >> > >> And with that, you only need wrappers for the case where there needs > >> to be proper sign extention of a 32-bit signed argument. > > > > It was discussed as one of possible solutions. The downside of it is > > that we cannot pass 64-bit types (like off_t) in single register. > > Wrappers can be added for the cases where you'd like to do that. If we clear the upper halves on the initial entry, we can't use a wrapper to restore them, so would have to instead pass them as register pairs as we do on the other 32-bit architectures. > > The other downside is that we clear top halves for every single > > syscall, and it looks excessive. So, from spark64 and s390 approaches > > we choosed second. > > It's like 4 cpu cycles even on crappy sparc64 cpus which only dual > issue. :) > > And that's a pretty low cost for the benefits if you ask me. To clarify what we are talking about: These syscalls that normally pass 64-bit arguments as register pairs are intentionally overridden to make them faster on ilp32 mode compare to other compat modes: +#define compat_sys_fadvise64_64 sys_fadvise64_64 +#define compat_sys_fallocate sys_fallocate +#define compat_sys_ftruncate64 sys_ftruncate +#define compat_sys_lookup_dcookie sys_lookup_dcookie +#define compat_sys_readahead sys_readahead +#define compat_sys_sync_file_range sys_sync_file_range +#define compat_sys_truncate64 sys_truncate +#define sys_llseek sys_lseek +static unsigned long compat_sys_pread64(unsigned int fd, + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) +{ + return sys_pread64(fd, (char *) ubuf, count, offset); +} + +static unsigned long compat_sys_pwrite64(unsigned int fd, + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) +{ + return sys_pwrite64(fd, (char *) ubuf, count, offset); +} If we use the normal calling conventions, we could remove these overrides along with the respective special-case handling in glibc. None of them look particularly performance-sensitive, but I could be wrong there. Arnd ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-25 20:47 ` Arnd Bergmann @ 2016-05-25 20:50 ` David Miller -1 siblings, 0 replies; 207+ messages in thread From: David Miller @ 2016-05-25 20:50 UTC (permalink / raw) To: arnd Cc: ynorov, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich From: Arnd Bergmann <arnd@arndb.de> Date: Wed, 25 May 2016 22:47:33 +0200 > If we use the normal calling conventions, we could remove these overrides > along with the respective special-case handling in glibc. None of them > look particularly performance-sensitive, but I could be wrong there. You could set the lowest bit in the system call entry pointer to indicate the upper-half clears should be elided. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-25 20:50 ` David Miller 0 siblings, 0 replies; 207+ messages in thread From: David Miller @ 2016-05-25 20:50 UTC (permalink / raw) To: linux-arm-kernel From: Arnd Bergmann <arnd@arndb.de> Date: Wed, 25 May 2016 22:47:33 +0200 > If we use the normal calling conventions, we could remove these overrides > along with the respective special-case handling in glibc. None of them > look particularly performance-sensitive, but I could be wrong there. You could set the lowest bit in the system call entry pointer to indicate the upper-half clears should be elided. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-25 20:50 ` David Miller @ 2016-05-25 21:01 ` Arnd Bergmann -1 siblings, 0 replies; 207+ messages in thread From: Arnd Bergmann @ 2016-05-25 21:01 UTC (permalink / raw) To: David Miller Cc: ynorov, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > From: Arnd Bergmann <arnd@arndb.de> > Date: Wed, 25 May 2016 22:47:33 +0200 > > > If we use the normal calling conventions, we could remove these overrides > > along with the respective special-case handling in glibc. None of them > > look particularly performance-sensitive, but I could be wrong there. > > You could set the lowest bit in the system call entry pointer to indicate > the upper-half clears should be elided. Right, but that would introduce an extra conditional branch in the syscall hotpath, and likely eliminate the gains from passing the loff_t arguments in a single register instead of a pair. Arnd ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-25 21:01 ` Arnd Bergmann 0 siblings, 0 replies; 207+ messages in thread From: Arnd Bergmann @ 2016-05-25 21:01 UTC (permalink / raw) To: linux-arm-kernel On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > From: Arnd Bergmann <arnd@arndb.de> > Date: Wed, 25 May 2016 22:47:33 +0200 > > > If we use the normal calling conventions, we could remove these overrides > > along with the respective special-case handling in glibc. None of them > > look particularly performance-sensitive, but I could be wrong there. > > You could set the lowest bit in the system call entry pointer to indicate > the upper-half clears should be elided. Right, but that would introduce an extra conditional branch in the syscall hotpath, and likely eliminate the gains from passing the loff_t arguments in a single register instead of a pair. Arnd ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-25 21:01 ` Arnd Bergmann @ 2016-05-25 21:28 ` David Miller -1 siblings, 0 replies; 207+ messages in thread From: David Miller @ 2016-05-25 21:28 UTC (permalink / raw) To: arnd Cc: ynorov, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich From: Arnd Bergmann <arnd@arndb.de> Date: Wed, 25 May 2016 23:01:06 +0200 > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: >> From: Arnd Bergmann <arnd@arndb.de> >> Date: Wed, 25 May 2016 22:47:33 +0200 >> >> > If we use the normal calling conventions, we could remove these overrides >> > along with the respective special-case handling in glibc. None of them >> > look particularly performance-sensitive, but I could be wrong there. >> >> You could set the lowest bit in the system call entry pointer to indicate >> the upper-half clears should be elided. > > Right, but that would introduce an extra conditional branch in the syscall > hotpath, and likely eliminate the gains from passing the loff_t arguments > in a single register instead of a pair. Ok, then, how much are you really gaining from avoiding a 'shift' and an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? And the executing the wrappers, those have a non-trivial cost too. Cost wise, this seems like it all cancels out in the end, but what do I know? ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-25 21:28 ` David Miller 0 siblings, 0 replies; 207+ messages in thread From: David Miller @ 2016-05-25 21:28 UTC (permalink / raw) To: linux-arm-kernel From: Arnd Bergmann <arnd@arndb.de> Date: Wed, 25 May 2016 23:01:06 +0200 > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: >> From: Arnd Bergmann <arnd@arndb.de> >> Date: Wed, 25 May 2016 22:47:33 +0200 >> >> > If we use the normal calling conventions, we could remove these overrides >> > along with the respective special-case handling in glibc. None of them >> > look particularly performance-sensitive, but I could be wrong there. >> >> You could set the lowest bit in the system call entry pointer to indicate >> the upper-half clears should be elided. > > Right, but that would introduce an extra conditional branch in the syscall > hotpath, and likely eliminate the gains from passing the loff_t arguments > in a single register instead of a pair. Ok, then, how much are you really gaining from avoiding a 'shift' and an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? And the executing the wrappers, those have a non-trivial cost too. Cost wise, this seems like it all cancels out in the end, but what do I know? ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-25 21:28 ` David Miller @ 2016-05-26 14:20 ` Catalin Marinas -1 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-26 14:20 UTC (permalink / raw) To: David Miller Cc: arnd, ynorov, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Wed, May 25, 2016 at 02:28:21PM -0700, David Miller wrote: > From: Arnd Bergmann <arnd@arndb.de> > Date: Wed, 25 May 2016 23:01:06 +0200 > > > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > >> From: Arnd Bergmann <arnd@arndb.de> > >> Date: Wed, 25 May 2016 22:47:33 +0200 > >> > >> > If we use the normal calling conventions, we could remove these overrides > >> > along with the respective special-case handling in glibc. None of them > >> > look particularly performance-sensitive, but I could be wrong there. > >> > >> You could set the lowest bit in the system call entry pointer to indicate > >> the upper-half clears should be elided. > > > > Right, but that would introduce an extra conditional branch in the syscall > > hotpath, and likely eliminate the gains from passing the loff_t arguments > > in a single register instead of a pair. > > Ok, then, how much are you really gaining from avoiding a 'shift' and > an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? It's possible a few more cycles overall. Whether this is noticeable, I can't really tell without some benchmarks (e.g. a getpid wrapper zeroing top 32-bit of all possible 6 arguments, called in a loop). On arm64 with ILP32 we have three types of syscalls w.r.t. parameter width (I guess that's true for all other compat implementations): 1. User syscall definition with 32-bit arguments, kernel handling 32-bit arguments 2. User 32-bit arguments, kernel 64-bit arguments 3. User 64-bit arguments, kernel 64-bit arguments For (1), the AArch64 ABI (AAPCS) allows us to ignore the garbage in the top 32-bit of a 64-bit register as long as the callee has 32-bit arguments (IOW, the generated code will use 32-git Wn instead of 64-bit Xn registers). In this case, zeroing the top 32-bit of all 6 arguments is unnecessary. In the 2nd case, we need sign or zero extension of 32-bit arguments. For sign extension we would still need a wrapper as the generic one can only zero-extend without knowing the underlying type. How many cases do we have where sign extension is required (off_t is a signed type but does it actually make sense as a negative value)? The __SC_WRAP and COMPAT_SYSCALL_WRAP macros introduced by patches 3-5 in this series handle such conversion for both sign and unsigned arguments. We don't have such problem with AArch32 tasks since the architecture guarantees zeroing or preserving the top half of all registers. For (3), with the current ILP32 approach we wouldn't need any wrapper. If we are to pass the argument as two 32-bit values, we would need both the user (glibc) to split the argument and the kernel to re-construct it. This would be in addition to any default top 32-bit zeroing on kernel entry. The overhead may be lost in the noise (we need some data) but IIRC our decision was mostly based on a cleaner user implementation for point (3) above. Since an AArch64/ILP32 process can freely use 64-bit registers, we found it nicer to be able to pass such value directly to the kernel. Reusing the s390 macros should reduce the amount of new code added to the kernel. While writing the above, I realised the current ILP32 patches still miss on converting pointers passed from user space (unless I got myself confused in macros). The new __SC_WRAP() and COMPAT_SYSCALL_WRAPx() macros take care of zero or sign extension via __SC_COMPAT_CAST(). However, we have two more existing cases which I don't see covered: a) Native syscalls taking a pointer argument and invoked directly from ILP32. For example, sys_read() takes a pointer but I don't see any __SC_WRAP added by patch 5 b) Current compat syscalls taking a pointer argument. For example, compat_sys_vmsplice() gets the iov32 pointer and the compiler assumes it is a 64-bit variable. I don't see where the upper half is zeroed We can solve (a) by adding more __SC_WRAP annotations in the generic unistd.h. For (b), we would need an __SC_DELOUSE with a bit of penalty on AArch32/compat support where it isn't needed. So maybe davem has a point on the overall impact of always zeroing the upper half of the arguments ;) (both from a performance and maintainability perspective). I guess this part of the ABI is still up for discussion. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-26 14:20 ` Catalin Marinas 0 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-26 14:20 UTC (permalink / raw) To: linux-arm-kernel On Wed, May 25, 2016 at 02:28:21PM -0700, David Miller wrote: > From: Arnd Bergmann <arnd@arndb.de> > Date: Wed, 25 May 2016 23:01:06 +0200 > > > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > >> From: Arnd Bergmann <arnd@arndb.de> > >> Date: Wed, 25 May 2016 22:47:33 +0200 > >> > >> > If we use the normal calling conventions, we could remove these overrides > >> > along with the respective special-case handling in glibc. None of them > >> > look particularly performance-sensitive, but I could be wrong there. > >> > >> You could set the lowest bit in the system call entry pointer to indicate > >> the upper-half clears should be elided. > > > > Right, but that would introduce an extra conditional branch in the syscall > > hotpath, and likely eliminate the gains from passing the loff_t arguments > > in a single register instead of a pair. > > Ok, then, how much are you really gaining from avoiding a 'shift' and > an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? It's possible a few more cycles overall. Whether this is noticeable, I can't really tell without some benchmarks (e.g. a getpid wrapper zeroing top 32-bit of all possible 6 arguments, called in a loop). On arm64 with ILP32 we have three types of syscalls w.r.t. parameter width (I guess that's true for all other compat implementations): 1. User syscall definition with 32-bit arguments, kernel handling 32-bit arguments 2. User 32-bit arguments, kernel 64-bit arguments 3. User 64-bit arguments, kernel 64-bit arguments For (1), the AArch64 ABI (AAPCS) allows us to ignore the garbage in the top 32-bit of a 64-bit register as long as the callee has 32-bit arguments (IOW, the generated code will use 32-git Wn instead of 64-bit Xn registers). In this case, zeroing the top 32-bit of all 6 arguments is unnecessary. In the 2nd case, we need sign or zero extension of 32-bit arguments. For sign extension we would still need a wrapper as the generic one can only zero-extend without knowing the underlying type. How many cases do we have where sign extension is required (off_t is a signed type but does it actually make sense as a negative value)? The __SC_WRAP and COMPAT_SYSCALL_WRAP macros introduced by patches 3-5 in this series handle such conversion for both sign and unsigned arguments. We don't have such problem with AArch32 tasks since the architecture guarantees zeroing or preserving the top half of all registers. For (3), with the current ILP32 approach we wouldn't need any wrapper. If we are to pass the argument as two 32-bit values, we would need both the user (glibc) to split the argument and the kernel to re-construct it. This would be in addition to any default top 32-bit zeroing on kernel entry. The overhead may be lost in the noise (we need some data) but IIRC our decision was mostly based on a cleaner user implementation for point (3) above. Since an AArch64/ILP32 process can freely use 64-bit registers, we found it nicer to be able to pass such value directly to the kernel. Reusing the s390 macros should reduce the amount of new code added to the kernel. While writing the above, I realised the current ILP32 patches still miss on converting pointers passed from user space (unless I got myself confused in macros). The new __SC_WRAP() and COMPAT_SYSCALL_WRAPx() macros take care of zero or sign extension via __SC_COMPAT_CAST(). However, we have two more existing cases which I don't see covered: a) Native syscalls taking a pointer argument and invoked directly from ILP32. For example, sys_read() takes a pointer but I don't see any __SC_WRAP added by patch 5 b) Current compat syscalls taking a pointer argument. For example, compat_sys_vmsplice() gets the iov32 pointer and the compiler assumes it is a 64-bit variable. I don't see where the upper half is zeroed We can solve (a) by adding more __SC_WRAP annotations in the generic unistd.h. For (b), we would need an __SC_DELOUSE with a bit of penalty on AArch32/compat support where it isn't needed. So maybe davem has a point on the overall impact of always zeroing the upper half of the arguments ;) (both from a performance and maintainability perspective). I guess this part of the ABI is still up for discussion. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-26 14:20 ` Catalin Marinas (?) @ 2016-05-26 14:50 ` Szabolcs Nagy -1 siblings, 0 replies; 207+ messages in thread From: Szabolcs Nagy @ 2016-05-26 14:50 UTC (permalink / raw) To: Catalin Marinas, David Miller Cc: nd, arnd, ynorov, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On 26/05/16 15:20, Catalin Marinas wrote: > While writing the above, I realised the current ILP32 patches still miss > on converting pointers passed from user space (unless I got myself > confused in macros). The new __SC_WRAP() and COMPAT_SYSCALL_WRAPx() > macros take care of zero or sign extension via __SC_COMPAT_CAST(). > However, we have two more existing cases which I don't see covered: > > a) Native syscalls taking a pointer argument and invoked directly from > ILP32. For example, sys_read() takes a pointer but I don't see any > __SC_WRAP added by patch 5 > > b) Current compat syscalls taking a pointer argument. For example, > compat_sys_vmsplice() gets the iov32 pointer and the compiler assumes > it is a 64-bit variable. I don't see where the upper half is zeroed > on x32 sign/zero extension is currently left to userspace, which is difficult to deal with, (long long)arg does the wrong thing for pointer args. > We can solve (a) by adding more __SC_WRAP annotations in the generic > unistd.h. For (b), we would need an __SC_DELOUSE with a bit of penalty > on AArch32/compat support where it isn't needed. So maybe davem has a > point on the overall impact of always zeroing the upper half of the > arguments ;) (both from a performance and maintainability perspective). > I guess this part of the ABI is still up for discussion. > ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-26 14:50 ` Szabolcs Nagy 0 siblings, 0 replies; 207+ messages in thread From: Szabolcs Nagy @ 2016-05-26 14:50 UTC (permalink / raw) To: linux-arm-kernel On 26/05/16 15:20, Catalin Marinas wrote: > While writing the above, I realised the current ILP32 patches still miss > on converting pointers passed from user space (unless I got myself > confused in macros). The new __SC_WRAP() and COMPAT_SYSCALL_WRAPx() > macros take care of zero or sign extension via __SC_COMPAT_CAST(). > However, we have two more existing cases which I don't see covered: > > a) Native syscalls taking a pointer argument and invoked directly from > ILP32. For example, sys_read() takes a pointer but I don't see any > __SC_WRAP added by patch 5 > > b) Current compat syscalls taking a pointer argument. For example, > compat_sys_vmsplice() gets the iov32 pointer and the compiler assumes > it is a 64-bit variable. I don't see where the upper half is zeroed > on x32 sign/zero extension is currently left to userspace, which is difficult to deal with, (long long)arg does the wrong thing for pointer args. > We can solve (a) by adding more __SC_WRAP annotations in the generic > unistd.h. For (b), we would need an __SC_DELOUSE with a bit of penalty > on AArch32/compat support where it isn't needed. So maybe davem has a > point on the overall impact of always zeroing the upper half of the > arguments ;) (both from a performance and maintainability perspective). > I guess this part of the ABI is still up for discussion. > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-26 14:50 ` Szabolcs Nagy 0 siblings, 0 replies; 207+ messages in thread From: Szabolcs Nagy @ 2016-05-26 14:50 UTC (permalink / raw) To: Catalin Marinas, David Miller Cc: nd, arnd, ynorov, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On 26/05/16 15:20, Catalin Marinas wrote: > While writing the above, I realised the current ILP32 patches still miss > on converting pointers passed from user space (unless I got myself > confused in macros). The new __SC_WRAP() and COMPAT_SYSCALL_WRAPx() > macros take care of zero or sign extension via __SC_COMPAT_CAST(). > However, we have two more existing cases which I don't see covered: > > a) Native syscalls taking a pointer argument and invoked directly from > ILP32. For example, sys_read() takes a pointer but I don't see any > __SC_WRAP added by patch 5 > > b) Current compat syscalls taking a pointer argument. For example, > compat_sys_vmsplice() gets the iov32 pointer and the compiler assumes > it is a 64-bit variable. I don't see where the upper half is zeroed > on x32 sign/zero extension is currently left to userspace, which is difficult to deal with, (long long)arg does the wrong thing for pointer args. > We can solve (a) by adding more __SC_WRAP annotations in the generic > unistd.h. For (b), we would need an __SC_DELOUSE with a bit of penalty > on AArch32/compat support where it isn't needed. So maybe davem has a > point on the overall impact of always zeroing the upper half of the > arguments ;) (both from a performance and maintainability perspective). > I guess this part of the ABI is still up for discussion. > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-26 14:50 ` Szabolcs Nagy @ 2016-05-26 15:19 ` Catalin Marinas -1 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-26 15:19 UTC (permalink / raw) To: Szabolcs Nagy Cc: David Miller, nd, arnd, ynorov, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Thu, May 26, 2016 at 03:50:01PM +0100, Szabolcs Nagy wrote: > On 26/05/16 15:20, Catalin Marinas wrote: > > While writing the above, I realised the current ILP32 patches still miss > > on converting pointers passed from user space (unless I got myself > > confused in macros). The new __SC_WRAP() and COMPAT_SYSCALL_WRAPx() > > macros take care of zero or sign extension via __SC_COMPAT_CAST(). > > However, we have two more existing cases which I don't see covered: > > > > a) Native syscalls taking a pointer argument and invoked directly from > > ILP32. For example, sys_read() takes a pointer but I don't see any > > __SC_WRAP added by patch 5 > > > > b) Current compat syscalls taking a pointer argument. For example, > > compat_sys_vmsplice() gets the iov32 pointer and the compiler assumes > > it is a 64-bit variable. I don't see where the upper half is zeroed > > on x32 sign/zero extension is currently left to userspace, > which is difficult to deal with, (long long)arg does the > wrong thing for pointer args. I agree, I don't think we should leave sign/zero extension to user. We should do it in the kernel either in a way similar to s390 (specific __SC_COMPAT_CAST, __SC_DELOUSE) or by always zeroing the arguments upper half on kernel entry with a few additional wrappers (where we have 64-bit arguments or they require sign extension). The latter has the disadvantage of having to split 64-bit arguments in user space while the former adds more maintenance burden to the kernel. I can't comment on performance aspects without some real numbers. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-26 15:19 ` Catalin Marinas 0 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-26 15:19 UTC (permalink / raw) To: linux-arm-kernel On Thu, May 26, 2016 at 03:50:01PM +0100, Szabolcs Nagy wrote: > On 26/05/16 15:20, Catalin Marinas wrote: > > While writing the above, I realised the current ILP32 patches still miss > > on converting pointers passed from user space (unless I got myself > > confused in macros). The new __SC_WRAP() and COMPAT_SYSCALL_WRAPx() > > macros take care of zero or sign extension via __SC_COMPAT_CAST(). > > However, we have two more existing cases which I don't see covered: > > > > a) Native syscalls taking a pointer argument and invoked directly from > > ILP32. For example, sys_read() takes a pointer but I don't see any > > __SC_WRAP added by patch 5 > > > > b) Current compat syscalls taking a pointer argument. For example, > > compat_sys_vmsplice() gets the iov32 pointer and the compiler assumes > > it is a 64-bit variable. I don't see where the upper half is zeroed > > on x32 sign/zero extension is currently left to userspace, > which is difficult to deal with, (long long)arg does the > wrong thing for pointer args. I agree, I don't think we should leave sign/zero extension to user. We should do it in the kernel either in a way similar to s390 (specific __SC_COMPAT_CAST, __SC_DELOUSE) or by always zeroing the arguments upper half on kernel entry with a few additional wrappers (where we have 64-bit arguments or they require sign extension). The latter has the disadvantage of having to split 64-bit arguments in user space while the former adds more maintenance burden to the kernel. I can't comment on performance aspects without some real numbers. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-26 14:20 ` Catalin Marinas @ 2016-05-26 19:43 ` David Miller -1 siblings, 0 replies; 207+ messages in thread From: David Miller @ 2016-05-26 19:43 UTC (permalink / raw) To: catalin.marinas Cc: arnd, ynorov, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich From: Catalin Marinas <catalin.marinas@arm.com> Date: Thu, 26 May 2016 15:20:58 +0100 > We can solve (a) by adding more __SC_WRAP annotations in the generic > unistd.h. ... I really think it's much more robust to clear the tops of the registers by default. Then you won't be auditing constantly and adding more and more wrappers. You can't even quantify the performance gains for me in any precise way. Whatever you gain by avoiding the 64-bit decompostion/reconstitution for those few system calls with 64-bit registers, you are losing by calling the wrappers for more common system calls, more often. "it's more natural to pass 64-bit values in a register" is not a clear justification for this change. This looks way over engineered to me. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-26 19:43 ` David Miller 0 siblings, 0 replies; 207+ messages in thread From: David Miller @ 2016-05-26 19:43 UTC (permalink / raw) To: linux-arm-kernel From: Catalin Marinas <catalin.marinas@arm.com> Date: Thu, 26 May 2016 15:20:58 +0100 > We can solve (a) by adding more __SC_WRAP annotations in the generic > unistd.h. ... I really think it's much more robust to clear the tops of the registers by default. Then you won't be auditing constantly and adding more and more wrappers. You can't even quantify the performance gains for me in any precise way. Whatever you gain by avoiding the 64-bit decompostion/reconstitution for those few system calls with 64-bit registers, you are losing by calling the wrappers for more common system calls, more often. "it's more natural to pass 64-bit values in a register" is not a clear justification for this change. This looks way over engineered to me. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-26 19:43 ` David Miller @ 2016-05-27 10:10 ` Catalin Marinas -1 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-27 10:10 UTC (permalink / raw) To: David Miller Cc: arnd, ynorov, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Thu, May 26, 2016 at 12:43:44PM -0700, David Miller wrote: > From: Catalin Marinas <catalin.marinas@arm.com> > Date: Thu, 26 May 2016 15:20:58 +0100 > > > We can solve (a) by adding more __SC_WRAP annotations in the generic > > unistd.h. > ... > > I really think it's much more robust to clear the tops of the registers > by default. Then you won't be auditing constantly and adding more and > more wrappers. I think we could avoid adding a new __SC_WRAP by redefining __SYSCALL for ILP32 to always invoke a wrapper. But given the wrapper overhead, cache locality, I don't think we would notice any performance difference in either case. > You can't even quantify the performance gains for me in any precise > way. Whatever you gain by avoiding the 64-bit > decompostion/reconstitution for those few system calls with 64-bit > registers, you are losing by calling the wrappers for more common > system calls, more often. I hope Yury can provide some numbers. All being equal, I would go for the lowest code maintenance cost (which is probably less annotations and wrappers). > "it's more natural to pass 64-bit values in a register" is not a clear > justification for this change. It's more related to how we went about the ILP32 ABI. We initially asked for a 64-bit native ABI similar to x32 until the libc-alpha community raised some POSIX compliance issues on time structures. So we decided to go for a 32-bit-like ABI while keeping the syscall interface close to the AArch64/ILP32 procedure calling standard (64-bit values passed in a single register). And now we have this discussion, revisiting this decision again (which is perfectly fine, we better get it right before any merging plans; thanks for your input). -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 10:10 ` Catalin Marinas 0 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-27 10:10 UTC (permalink / raw) To: linux-arm-kernel On Thu, May 26, 2016 at 12:43:44PM -0700, David Miller wrote: > From: Catalin Marinas <catalin.marinas@arm.com> > Date: Thu, 26 May 2016 15:20:58 +0100 > > > We can solve (a) by adding more __SC_WRAP annotations in the generic > > unistd.h. > ... > > I really think it's much more robust to clear the tops of the registers > by default. Then you won't be auditing constantly and adding more and > more wrappers. I think we could avoid adding a new __SC_WRAP by redefining __SYSCALL for ILP32 to always invoke a wrapper. But given the wrapper overhead, cache locality, I don't think we would notice any performance difference in either case. > You can't even quantify the performance gains for me in any precise > way. Whatever you gain by avoiding the 64-bit > decompostion/reconstitution for those few system calls with 64-bit > registers, you are losing by calling the wrappers for more common > system calls, more often. I hope Yury can provide some numbers. All being equal, I would go for the lowest code maintenance cost (which is probably less annotations and wrappers). > "it's more natural to pass 64-bit values in a register" is not a clear > justification for this change. It's more related to how we went about the ILP32 ABI. We initially asked for a 64-bit native ABI similar to x32 until the libc-alpha community raised some POSIX compliance issues on time structures. So we decided to go for a 32-bit-like ABI while keeping the syscall interface close to the AArch64/ILP32 procedure calling standard (64-bit values passed in a single register). And now we have this discussion, revisiting this decision again (which is perfectly fine, we better get it right before any merging plans; thanks for your input). -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-25 21:28 ` David Miller (?) @ 2016-05-26 20:48 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-26 20:48 UTC (permalink / raw) To: David Miller Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Wed, May 25, 2016 at 02:28:21PM -0700, David Miller wrote: > From: Arnd Bergmann <arnd@arndb.de> > Date: Wed, 25 May 2016 23:01:06 +0200 > > > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > >> From: Arnd Bergmann <arnd@arndb.de> > >> Date: Wed, 25 May 2016 22:47:33 +0200 > >> > >> > If we use the normal calling conventions, we could remove these overrides > >> > along with the respective special-case handling in glibc. None of them > >> > look particularly performance-sensitive, but I could be wrong there. > >> > >> You could set the lowest bit in the system call entry pointer to indicate > >> the upper-half clears should be elided. > > > > Right, but that would introduce an extra conditional branch in the syscall > > hotpath, and likely eliminate the gains from passing the loff_t arguments > > in a single register instead of a pair. > > Ok, then, how much are you really gaining from avoiding a 'shift' and > an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? 4 cycles in kernel and ~same cost in glibc to create a pair. And 8 'mov's that exist for every syscall, even yield(). > And the executing the wrappers, those have a non-trivial cost too. The cost is pretty trivial though. See kernel/compat_wrapper.o: COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); 0: a9bf7bfd stp x29, x30, [sp,#-16]! 4: 910003fd mov x29, sp 8: 2a0003e0 mov w0, w0 c: 94000000 bl 0 <sys_creat> 10: a8c17bfd ldp x29, x30, [sp],#16 14: d65f03c0 ret > Cost wise, this seems like it all cancels out in the end, but what > do I know? I think you know something, and I also think Heiko and other s390 guys know something as well. So I'd like to listen their arguments here. For me spark64 way is looking reasonable only because it's really simple and takes less coding. I'll try it on some branch and share here what happened. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-26 20:48 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-26 20:48 UTC (permalink / raw) To: linux-arm-kernel On Wed, May 25, 2016 at 02:28:21PM -0700, David Miller wrote: > From: Arnd Bergmann <arnd@arndb.de> > Date: Wed, 25 May 2016 23:01:06 +0200 > > > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > >> From: Arnd Bergmann <arnd@arndb.de> > >> Date: Wed, 25 May 2016 22:47:33 +0200 > >> > >> > If we use the normal calling conventions, we could remove these overrides > >> > along with the respective special-case handling in glibc. None of them > >> > look particularly performance-sensitive, but I could be wrong there. > >> > >> You could set the lowest bit in the system call entry pointer to indicate > >> the upper-half clears should be elided. > > > > Right, but that would introduce an extra conditional branch in the syscall > > hotpath, and likely eliminate the gains from passing the loff_t arguments > > in a single register instead of a pair. > > Ok, then, how much are you really gaining from avoiding a 'shift' and > an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? 4 cycles in kernel and ~same cost in glibc to create a pair. And 8 'mov's that exist for every syscall, even yield(). > And the executing the wrappers, those have a non-trivial cost too. The cost is pretty trivial though. See kernel/compat_wrapper.o: COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); 0: a9bf7bfd stp x29, x30, [sp,#-16]! 4: 910003fd mov x29, sp 8: 2a0003e0 mov w0, w0 c: 94000000 bl 0 <sys_creat> 10: a8c17bfd ldp x29, x30, [sp],#16 14: d65f03c0 ret > Cost wise, this seems like it all cancels out in the end, but what > do I know? I think you know something, and I also think Heiko and other s390 guys know something as well. So I'd like to listen their arguments here. For me spark64 way is looking reasonable only because it's really simple and takes less coding. I'll try it on some branch and share here what happened. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-26 20:48 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-26 20:48 UTC (permalink / raw) To: David Miller Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Wed, May 25, 2016 at 02:28:21PM -0700, David Miller wrote: > From: Arnd Bergmann <arnd@arndb.de> > Date: Wed, 25 May 2016 23:01:06 +0200 > > > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > >> From: Arnd Bergmann <arnd@arndb.de> > >> Date: Wed, 25 May 2016 22:47:33 +0200 > >> > >> > If we use the normal calling conventions, we could remove these overrides > >> > along with the respective special-case handling in glibc. None of them > >> > look particularly performance-sensitive, but I could be wrong there. > >> > >> You could set the lowest bit in the system call entry pointer to indicate > >> the upper-half clears should be elided. > > > > Right, but that would introduce an extra conditional branch in the syscall > > hotpath, and likely eliminate the gains from passing the loff_t arguments > > in a single register instead of a pair. > > Ok, then, how much are you really gaining from avoiding a 'shift' and > an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? 4 cycles in kernel and ~same cost in glibc to create a pair. And 8 'mov's that exist for every syscall, even yield(). > And the executing the wrappers, those have a non-trivial cost too. The cost is pretty trivial though. See kernel/compat_wrapper.o: COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); 0: a9bf7bfd stp x29, x30, [sp,#-16]! 4: 910003fd mov x29, sp 8: 2a0003e0 mov w0, w0 c: 94000000 bl 0 <sys_creat> 10: a8c17bfd ldp x29, x30, [sp],#16 14: d65f03c0 ret > Cost wise, this seems like it all cancels out in the end, but what > do I know? I think you know something, and I also think Heiko and other s390 guys know something as well. So I'd like to listen their arguments here. For me spark64 way is looking reasonable only because it's really simple and takes less coding. I'll try it on some branch and share here what happened. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-26 20:48 ` Yury Norov @ 2016-05-26 22:29 ` Catalin Marinas -1 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-26 22:29 UTC (permalink / raw) To: Yury Norov Cc: David Miller, arnd, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Thu, May 26, 2016 at 11:48:19PM +0300, Yury Norov wrote: > On Wed, May 25, 2016 at 02:28:21PM -0700, David Miller wrote: > > From: Arnd Bergmann <arnd@arndb.de> > > Date: Wed, 25 May 2016 23:01:06 +0200 > > > > > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > > >> From: Arnd Bergmann <arnd@arndb.de> > > >> Date: Wed, 25 May 2016 22:47:33 +0200 > > >> > > >> > If we use the normal calling conventions, we could remove these overrides > > >> > along with the respective special-case handling in glibc. None of them > > >> > look particularly performance-sensitive, but I could be wrong there. > > >> > > >> You could set the lowest bit in the system call entry pointer to indicate > > >> the upper-half clears should be elided. > > > > > > Right, but that would introduce an extra conditional branch in the syscall > > > hotpath, and likely eliminate the gains from passing the loff_t arguments > > > in a single register instead of a pair. > > > > Ok, then, how much are you really gaining from avoiding a 'shift' and > > an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? > > 4 cycles in kernel and ~same cost in glibc to create a pair. It would take a single instruction per argument in the kernel to do shift+or and maybe 1-2 more instructions to move the remaining arguments in place (we do this for a few wrappers in arch/arm64/kernel/entry32.S). And the glibc counterpart. > And 8 'mov's that exist for every syscall, even yield(). > > > And the executing the wrappers, those have a non-trivial cost too. > > The cost is pretty trivial though. See kernel/compat_wrapper.o: > COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); > 0: a9bf7bfd stp x29, x30, [sp,#-16]! > 4: 910003fd mov x29, sp > 8: 2a0003e0 mov w0, w0 > c: 94000000 bl 0 <sys_creat> > 10: a8c17bfd ldp x29, x30, [sp],#16 > 14: d65f03c0 ret I would say the above could be more expensive than 8 movs (16 bytes to write, read, a branch and a ret). You can also add the I-cache locality, having wrappers for each syscalls instead of a single place for zeroing the upper half (where no other wrapper is necessary). Can we trick the compiler into doing a tail call optimisation. This could have simply been: COMPAT_SYSCALL_WRAP2(creat, ...): mov w0, w0 b <sys_creat> > > Cost wise, this seems like it all cancels out in the end, but what > > do I know? > > I think you know something, and I also think Heiko and other s390 guys > know something as well. So I'd like to listen their arguments here. > > For me spark64 way is looking reasonable only because it's really simple > and takes less coding. I'll try it on some branch and share here what happened. The kernel code will definitely look simpler ;). It would be good to see if there actually is any performance impact. Even with 16 more cycles on syscall entry, would they be lost in the noise? You don't need a full implementation, just some dummy mov x0, x0 on the entry path. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-26 22:29 ` Catalin Marinas 0 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-26 22:29 UTC (permalink / raw) To: linux-arm-kernel On Thu, May 26, 2016 at 11:48:19PM +0300, Yury Norov wrote: > On Wed, May 25, 2016 at 02:28:21PM -0700, David Miller wrote: > > From: Arnd Bergmann <arnd@arndb.de> > > Date: Wed, 25 May 2016 23:01:06 +0200 > > > > > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > > >> From: Arnd Bergmann <arnd@arndb.de> > > >> Date: Wed, 25 May 2016 22:47:33 +0200 > > >> > > >> > If we use the normal calling conventions, we could remove these overrides > > >> > along with the respective special-case handling in glibc. None of them > > >> > look particularly performance-sensitive, but I could be wrong there. > > >> > > >> You could set the lowest bit in the system call entry pointer to indicate > > >> the upper-half clears should be elided. > > > > > > Right, but that would introduce an extra conditional branch in the syscall > > > hotpath, and likely eliminate the gains from passing the loff_t arguments > > > in a single register instead of a pair. > > > > Ok, then, how much are you really gaining from avoiding a 'shift' and > > an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? > > 4 cycles in kernel and ~same cost in glibc to create a pair. It would take a single instruction per argument in the kernel to do shift+or and maybe 1-2 more instructions to move the remaining arguments in place (we do this for a few wrappers in arch/arm64/kernel/entry32.S). And the glibc counterpart. > And 8 'mov's that exist for every syscall, even yield(). > > > And the executing the wrappers, those have a non-trivial cost too. > > The cost is pretty trivial though. See kernel/compat_wrapper.o: > COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); > 0: a9bf7bfd stp x29, x30, [sp,#-16]! > 4: 910003fd mov x29, sp > 8: 2a0003e0 mov w0, w0 > c: 94000000 bl 0 <sys_creat> > 10: a8c17bfd ldp x29, x30, [sp],#16 > 14: d65f03c0 ret I would say the above could be more expensive than 8 movs (16 bytes to write, read, a branch and a ret). You can also add the I-cache locality, having wrappers for each syscalls instead of a single place for zeroing the upper half (where no other wrapper is necessary). Can we trick the compiler into doing a tail call optimisation. This could have simply been: COMPAT_SYSCALL_WRAP2(creat, ...): mov w0, w0 b <sys_creat> > > Cost wise, this seems like it all cancels out in the end, but what > > do I know? > > I think you know something, and I also think Heiko and other s390 guys > know something as well. So I'd like to listen their arguments here. > > For me spark64 way is looking reasonable only because it's really simple > and takes less coding. I'll try it on some branch and share here what happened. The kernel code will definitely look simpler ;). It would be good to see if there actually is any performance impact. Even with 16 more cycles on syscall entry, would they be lost in the noise? You don't need a full implementation, just some dummy mov x0, x0 on the entry path. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-26 22:29 ` Catalin Marinas (?) @ 2016-05-27 0:37 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-27 0:37 UTC (permalink / raw) To: Catalin Marinas Cc: David Miller, arnd, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Thu, May 26, 2016 at 11:29:45PM +0100, Catalin Marinas wrote: > On Thu, May 26, 2016 at 11:48:19PM +0300, Yury Norov wrote: > > On Wed, May 25, 2016 at 02:28:21PM -0700, David Miller wrote: > > > From: Arnd Bergmann <arnd@arndb.de> > > > Date: Wed, 25 May 2016 23:01:06 +0200 > > > > > > > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > > > >> From: Arnd Bergmann <arnd@arndb.de> > > > >> Date: Wed, 25 May 2016 22:47:33 +0200 > > > >> > > > >> > If we use the normal calling conventions, we could remove these overrides > > > >> > along with the respective special-case handling in glibc. None of them > > > >> > look particularly performance-sensitive, but I could be wrong there. > > > >> > > > >> You could set the lowest bit in the system call entry pointer to indicate > > > >> the upper-half clears should be elided. > > > > > > > > Right, but that would introduce an extra conditional branch in the syscall > > > > hotpath, and likely eliminate the gains from passing the loff_t arguments > > > > in a single register instead of a pair. > > > > > > Ok, then, how much are you really gaining from avoiding a 'shift' and > > > an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? > > > > 4 cycles in kernel and ~same cost in glibc to create a pair. > > It would take a single instruction per argument in the kernel to do > shift+or and maybe 1-2 more instructions to move the remaining arguments > in place (we do this for a few wrappers in arch/arm64/kernel/entry32.S). > And the glibc counterpart. > > > And 8 'mov's that exist for every syscall, even yield(). > > > > > And the executing the wrappers, those have a non-trivial cost too. > > > > The cost is pretty trivial though. See kernel/compat_wrapper.o: > > COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); > > 0: a9bf7bfd stp x29, x30, [sp,#-16]! > > 4: 910003fd mov x29, sp > > 8: 2a0003e0 mov w0, w0 > > c: 94000000 bl 0 <sys_creat> > > 10: a8c17bfd ldp x29, x30, [sp],#16 > > 14: d65f03c0 ret > > I would say the above could be more expensive than 8 movs (16 bytes to > write, read, a branch and a ret). You can also add the I-cache locality, > having wrappers for each syscalls instead of a single place for zeroing > the upper half (where no other wrapper is necessary). > > Can we trick the compiler into doing a tail call optimisation. This > could have simply been: > > COMPAT_SYSCALL_WRAP2(creat, ...): > mov w0, w0 > b <sys_creat> What you talk about was in my initial version. But Heiko insisted on having all wrappers together. http://www.spinics.net/lists/linux-s390/msg11593.html Grep your email for discussion. > > > > Cost wise, this seems like it all cancels out in the end, but what > > > do I know? > > > > I think you know something, and I also think Heiko and other s390 guys > > know something as well. So I'd like to listen their arguments here. > > > > For me spark64 way is looking reasonable only because it's really simple > > and takes less coding. I'll try it on some branch and share here what happened. > > The kernel code will definitely look simpler ;). It would be good to see > if there actually is any performance impact. Even with 16 more cycles on > syscall entry, would they be lost in the noise? You don't need a full > implementation, just some dummy mov x0, x0 on the entry path. > > -- > Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 0:37 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-27 0:37 UTC (permalink / raw) To: linux-arm-kernel On Thu, May 26, 2016 at 11:29:45PM +0100, Catalin Marinas wrote: > On Thu, May 26, 2016 at 11:48:19PM +0300, Yury Norov wrote: > > On Wed, May 25, 2016 at 02:28:21PM -0700, David Miller wrote: > > > From: Arnd Bergmann <arnd@arndb.de> > > > Date: Wed, 25 May 2016 23:01:06 +0200 > > > > > > > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > > > >> From: Arnd Bergmann <arnd@arndb.de> > > > >> Date: Wed, 25 May 2016 22:47:33 +0200 > > > >> > > > >> > If we use the normal calling conventions, we could remove these overrides > > > >> > along with the respective special-case handling in glibc. None of them > > > >> > look particularly performance-sensitive, but I could be wrong there. > > > >> > > > >> You could set the lowest bit in the system call entry pointer to indicate > > > >> the upper-half clears should be elided. > > > > > > > > Right, but that would introduce an extra conditional branch in the syscall > > > > hotpath, and likely eliminate the gains from passing the loff_t arguments > > > > in a single register instead of a pair. > > > > > > Ok, then, how much are you really gaining from avoiding a 'shift' and > > > an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? > > > > 4 cycles in kernel and ~same cost in glibc to create a pair. > > It would take a single instruction per argument in the kernel to do > shift+or and maybe 1-2 more instructions to move the remaining arguments > in place (we do this for a few wrappers in arch/arm64/kernel/entry32.S). > And the glibc counterpart. > > > And 8 'mov's that exist for every syscall, even yield(). > > > > > And the executing the wrappers, those have a non-trivial cost too. > > > > The cost is pretty trivial though. See kernel/compat_wrapper.o: > > COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); > > 0: a9bf7bfd stp x29, x30, [sp,#-16]! > > 4: 910003fd mov x29, sp > > 8: 2a0003e0 mov w0, w0 > > c: 94000000 bl 0 <sys_creat> > > 10: a8c17bfd ldp x29, x30, [sp],#16 > > 14: d65f03c0 ret > > I would say the above could be more expensive than 8 movs (16 bytes to > write, read, a branch and a ret). You can also add the I-cache locality, > having wrappers for each syscalls instead of a single place for zeroing > the upper half (where no other wrapper is necessary). > > Can we trick the compiler into doing a tail call optimisation. This > could have simply been: > > COMPAT_SYSCALL_WRAP2(creat, ...): > mov w0, w0 > b <sys_creat> What you talk about was in my initial version. But Heiko insisted on having all wrappers together. http://www.spinics.net/lists/linux-s390/msg11593.html Grep your email for discussion. > > > > Cost wise, this seems like it all cancels out in the end, but what > > > do I know? > > > > I think you know something, and I also think Heiko and other s390 guys > > know something as well. So I'd like to listen their arguments here. > > > > For me spark64 way is looking reasonable only because it's really simple > > and takes less coding. I'll try it on some branch and share here what happened. > > The kernel code will definitely look simpler ;). It would be good to see > if there actually is any performance impact. Even with 16 more cycles on > syscall entry, would they be lost in the noise? You don't need a full > implementation, just some dummy mov x0, x0 on the entry path. > > -- > Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 0:37 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-27 0:37 UTC (permalink / raw) To: Catalin Marinas Cc: David Miller, arnd, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Thu, May 26, 2016 at 11:29:45PM +0100, Catalin Marinas wrote: > On Thu, May 26, 2016 at 11:48:19PM +0300, Yury Norov wrote: > > On Wed, May 25, 2016 at 02:28:21PM -0700, David Miller wrote: > > > From: Arnd Bergmann <arnd@arndb.de> > > > Date: Wed, 25 May 2016 23:01:06 +0200 > > > > > > > On Wednesday, May 25, 2016 1:50:39 PM CEST David Miller wrote: > > > >> From: Arnd Bergmann <arnd@arndb.de> > > > >> Date: Wed, 25 May 2016 22:47:33 +0200 > > > >> > > > >> > If we use the normal calling conventions, we could remove these overrides > > > >> > along with the respective special-case handling in glibc. None of them > > > >> > look particularly performance-sensitive, but I could be wrong there. > > > >> > > > >> You could set the lowest bit in the system call entry pointer to indicate > > > >> the upper-half clears should be elided. > > > > > > > > Right, but that would introduce an extra conditional branch in the syscall > > > > hotpath, and likely eliminate the gains from passing the loff_t arguments > > > > in a single register instead of a pair. > > > > > > Ok, then, how much are you really gaining from avoiding a 'shift' and > > > an 'or' to build the full 64-bit value? 3 cycles? Maybe 4? > > > > 4 cycles in kernel and ~same cost in glibc to create a pair. > > It would take a single instruction per argument in the kernel to do > shift+or and maybe 1-2 more instructions to move the remaining arguments > in place (we do this for a few wrappers in arch/arm64/kernel/entry32.S). > And the glibc counterpart. > > > And 8 'mov's that exist for every syscall, even yield(). > > > > > And the executing the wrappers, those have a non-trivial cost too. > > > > The cost is pretty trivial though. See kernel/compat_wrapper.o: > > COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); > > 0: a9bf7bfd stp x29, x30, [sp,#-16]! > > 4: 910003fd mov x29, sp > > 8: 2a0003e0 mov w0, w0 > > c: 94000000 bl 0 <sys_creat> > > 10: a8c17bfd ldp x29, x30, [sp],#16 > > 14: d65f03c0 ret > > I would say the above could be more expensive than 8 movs (16 bytes to > write, read, a branch and a ret). You can also add the I-cache locality, > having wrappers for each syscalls instead of a single place for zeroing > the upper half (where no other wrapper is necessary). > > Can we trick the compiler into doing a tail call optimisation. This > could have simply been: > > COMPAT_SYSCALL_WRAP2(creat, ...): > mov w0, w0 > b <sys_creat> What you talk about was in my initial version. But Heiko insisted on having all wrappers together. http://www.spinics.net/lists/linux-s390/msg11593.html Grep your email for discussion. > > > > Cost wise, this seems like it all cancels out in the end, but what > > > do I know? > > > > I think you know something, and I also think Heiko and other s390 guys > > know something as well. So I'd like to listen their arguments here. > > > > For me spark64 way is looking reasonable only because it's really simple > > and takes less coding. I'll try it on some branch and share here what happened. > > The kernel code will definitely look simpler ;). It would be good to see > if there actually is any performance impact. Even with 16 more cycles on > syscall entry, would they be lost in the noise? You don't need a full > implementation, just some dummy mov x0, x0 on the entry path. > > -- > Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-27 0:37 ` Yury Norov @ 2016-05-27 6:03 ` Heiko Carstens -1 siblings, 0 replies; 207+ messages in thread From: Heiko Carstens @ 2016-05-27 6:03 UTC (permalink / raw) To: Yury Norov Cc: Catalin Marinas, David Miller, arnd, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich > > > The cost is pretty trivial though. See kernel/compat_wrapper.o: > > > COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); > > > 0: a9bf7bfd stp x29, x30, [sp,#-16]! > > > 4: 910003fd mov x29, sp > > > 8: 2a0003e0 mov w0, w0 > > > c: 94000000 bl 0 <sys_creat> > > > 10: a8c17bfd ldp x29, x30, [sp],#16 > > > 14: d65f03c0 ret > > > > I would say the above could be more expensive than 8 movs (16 bytes to > > write, read, a branch and a ret). You can also add the I-cache locality, > > having wrappers for each syscalls instead of a single place for zeroing > > the upper half (where no other wrapper is necessary). > > > > Can we trick the compiler into doing a tail call optimisation. This > > could have simply been: > > > > COMPAT_SYSCALL_WRAP2(creat, ...): > > mov w0, w0 > > b <sys_creat> > > What you talk about was in my initial version. But Heiko insisted on having all > wrappers together. > http://www.spinics.net/lists/linux-s390/msg11593.html > > Grep your email for discussion. I think Catalin's question was more about why there is even a stack frame generated. It looks like it is not necessary. I did ask this too a couple of months ago, when we discussed this. > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > do I know? > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > know something as well. So I'd like to listen their arguments here. If it comes to 64 bit arguments for compat system calls: s390 also has an x32-like ABI extension which allows user space to use full 64 bit registers. As far as I know hardly anybody ever made use of that. However even if that would be widely used, to me it wouldn't make sense to add new compat system calls which allow 64 bit arguments, simply because something like c = (u32)a | (u64)b << 32; can be done with a single 1-cycle instruction. It's just not worth the extra effort to maintain additional system call variants. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 6:03 ` Heiko Carstens 0 siblings, 0 replies; 207+ messages in thread From: Heiko Carstens @ 2016-05-27 6:03 UTC (permalink / raw) To: linux-arm-kernel > > > The cost is pretty trivial though. See kernel/compat_wrapper.o: > > > COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); > > > 0: a9bf7bfd stp x29, x30, [sp,#-16]! > > > 4: 910003fd mov x29, sp > > > 8: 2a0003e0 mov w0, w0 > > > c: 94000000 bl 0 <sys_creat> > > > 10: a8c17bfd ldp x29, x30, [sp],#16 > > > 14: d65f03c0 ret > > > > I would say the above could be more expensive than 8 movs (16 bytes to > > write, read, a branch and a ret). You can also add the I-cache locality, > > having wrappers for each syscalls instead of a single place for zeroing > > the upper half (where no other wrapper is necessary). > > > > Can we trick the compiler into doing a tail call optimisation. This > > could have simply been: > > > > COMPAT_SYSCALL_WRAP2(creat, ...): > > mov w0, w0 > > b <sys_creat> > > What you talk about was in my initial version. But Heiko insisted on having all > wrappers together. > http://www.spinics.net/lists/linux-s390/msg11593.html > > Grep your email for discussion. I think Catalin's question was more about why there is even a stack frame generated. It looks like it is not necessary. I did ask this too a couple of months ago, when we discussed this. > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > do I know? > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > know something as well. So I'd like to listen their arguments here. If it comes to 64 bit arguments for compat system calls: s390 also has an x32-like ABI extension which allows user space to use full 64 bit registers. As far as I know hardly anybody ever made use of that. However even if that would be widely used, to me it wouldn't make sense to add new compat system calls which allow 64 bit arguments, simply because something like c = (u32)a | (u64)b << 32; can be done with a single 1-cycle instruction. It's just not worth the extra effort to maintain additional system call variants. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-27 6:03 ` Heiko Carstens @ 2016-05-27 8:42 ` Arnd Bergmann -1 siblings, 0 replies; 207+ messages in thread From: Arnd Bergmann @ 2016-05-27 8:42 UTC (permalink / raw) To: Heiko Carstens Cc: Yury Norov, Catalin Marinas, David Miller, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Friday, May 27, 2016 8:03:57 AM CEST Heiko Carstens wrote: > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > do I know? > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > know something as well. So I'd like to listen their arguments here. > > If it comes to 64 bit arguments for compat system calls: s390 also has an > x32-like ABI extension which allows user space to use full 64 bit > registers. As far as I know hardly anybody ever made use of that. > > However even if that would be widely used, to me it wouldn't make sense to > add new compat system calls which allow 64 bit arguments, simply because > something like > > c = (u32)a | (u64)b << 32; > > can be done with a single 1-cycle instruction. It's just not worth the > extra effort to maintain additional system call variants. For reference, both tile and mips also have separate 32-bit ABIs that are only used on 64-bit kernels (aside from the normal 32-bit ABI). Tile does it like s390 and passes 64-bit arguments as pairs, while MIPS and x86 and pass them as single registers. Tile is very similar to arm64 because it also uses the generic system call table, which I think is a good argument to keep them in sync. Arnd ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 8:42 ` Arnd Bergmann 0 siblings, 0 replies; 207+ messages in thread From: Arnd Bergmann @ 2016-05-27 8:42 UTC (permalink / raw) To: linux-arm-kernel On Friday, May 27, 2016 8:03:57 AM CEST Heiko Carstens wrote: > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > do I know? > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > know something as well. So I'd like to listen their arguments here. > > If it comes to 64 bit arguments for compat system calls: s390 also has an > x32-like ABI extension which allows user space to use full 64 bit > registers. As far as I know hardly anybody ever made use of that. > > However even if that would be widely used, to me it wouldn't make sense to > add new compat system calls which allow 64 bit arguments, simply because > something like > > c = (u32)a | (u64)b << 32; > > can be done with a single 1-cycle instruction. It's just not worth the > extra effort to maintain additional system call variants. For reference, both tile and mips also have separate 32-bit ABIs that are only used on 64-bit kernels (aside from the normal 32-bit ABI). Tile does it like s390 and passes 64-bit arguments as pairs, while MIPS and x86 and pass them as single registers. Tile is very similar to arm64 because it also uses the generic system call table, which I think is a good argument to keep them in sync. Arnd ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-27 8:42 ` Arnd Bergmann @ 2016-05-27 9:30 ` Catalin Marinas -1 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-27 9:30 UTC (permalink / raw) To: Arnd Bergmann Cc: Heiko Carstens, Yury Norov, David Miller, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Fri, May 27, 2016 at 10:42:59AM +0200, Arnd Bergmann wrote: > On Friday, May 27, 2016 8:03:57 AM CEST Heiko Carstens wrote: > > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > > do I know? > > > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > > know something as well. So I'd like to listen their arguments here. > > > > If it comes to 64 bit arguments for compat system calls: s390 also has an > > x32-like ABI extension which allows user space to use full 64 bit > > registers. As far as I know hardly anybody ever made use of that. > > > > However even if that would be widely used, to me it wouldn't make sense to > > add new compat system calls which allow 64 bit arguments, simply because > > something like > > > > c = (u32)a | (u64)b << 32; > > > > can be done with a single 1-cycle instruction. It's just not worth the > > extra effort to maintain additional system call variants. > > For reference, both tile and mips also have separate 32-bit ABIs that are > only used on 64-bit kernels (aside from the normal 32-bit ABI). Tile > does it like s390 and passes 64-bit arguments as pairs, while MIPS > and x86 and pass them as single registers. AFAIK, x32 also requires that the upper half of a 64-bit reg is zeroed by the user when a 32-bit value is passed. We could require the same on AArch64/ILP32 but I'm a bit uneasy on trusting a multitude of C libraries on this. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 9:30 ` Catalin Marinas 0 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-27 9:30 UTC (permalink / raw) To: linux-arm-kernel On Fri, May 27, 2016 at 10:42:59AM +0200, Arnd Bergmann wrote: > On Friday, May 27, 2016 8:03:57 AM CEST Heiko Carstens wrote: > > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > > do I know? > > > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > > know something as well. So I'd like to listen their arguments here. > > > > If it comes to 64 bit arguments for compat system calls: s390 also has an > > x32-like ABI extension which allows user space to use full 64 bit > > registers. As far as I know hardly anybody ever made use of that. > > > > However even if that would be widely used, to me it wouldn't make sense to > > add new compat system calls which allow 64 bit arguments, simply because > > something like > > > > c = (u32)a | (u64)b << 32; > > > > can be done with a single 1-cycle instruction. It's just not worth the > > extra effort to maintain additional system call variants. > > For reference, both tile and mips also have separate 32-bit ABIs that are > only used on 64-bit kernels (aside from the normal 32-bit ABI). Tile > does it like s390 and passes 64-bit arguments as pairs, while MIPS > and x86 and pass them as single registers. AFAIK, x32 also requires that the upper half of a 64-bit reg is zeroed by the user when a 32-bit value is passed. We could require the same on AArch64/ILP32 but I'm a bit uneasy on trusting a multitude of C libraries on this. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-27 9:30 ` Catalin Marinas @ 2016-05-27 10:49 ` Arnd Bergmann -1 siblings, 0 replies; 207+ messages in thread From: Arnd Bergmann @ 2016-05-27 10:49 UTC (permalink / raw) To: Catalin Marinas Cc: Heiko Carstens, Yury Norov, David Miller, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Friday, May 27, 2016 10:30:52 AM CEST Catalin Marinas wrote: > On Fri, May 27, 2016 at 10:42:59AM +0200, Arnd Bergmann wrote: > > On Friday, May 27, 2016 8:03:57 AM CEST Heiko Carstens wrote: > > > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > > > do I know? > > > > > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > > > know something as well. So I'd like to listen their arguments here. > > > > > > If it comes to 64 bit arguments for compat system calls: s390 also has an > > > x32-like ABI extension which allows user space to use full 64 bit > > > registers. As far as I know hardly anybody ever made use of that. > > > > > > However even if that would be widely used, to me it wouldn't make sense to > > > add new compat system calls which allow 64 bit arguments, simply because > > > something like > > > > > > c = (u32)a | (u64)b << 32; > > > > > > can be done with a single 1-cycle instruction. It's just not worth the > > > extra effort to maintain additional system call variants. > > > > For reference, both tile and mips also have separate 32-bit ABIs that are > > only used on 64-bit kernels (aside from the normal 32-bit ABI). Tile > > does it like s390 and passes 64-bit arguments as pairs, while MIPS > > and x86 and pass them as single registers. > > AFAIK, x32 also requires that the upper half of a 64-bit reg is zeroed > by the user when a 32-bit value is passed. We could require the same on > AArch64/ILP32 but I'm a bit uneasy on trusting a multitude of C > libraries on this. It's not about trusting a C library, it's about ensuring malicious code cannot pass argumentst that the kernel code assumes will never happen. Arnd ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 10:49 ` Arnd Bergmann 0 siblings, 0 replies; 207+ messages in thread From: Arnd Bergmann @ 2016-05-27 10:49 UTC (permalink / raw) To: linux-arm-kernel On Friday, May 27, 2016 10:30:52 AM CEST Catalin Marinas wrote: > On Fri, May 27, 2016 at 10:42:59AM +0200, Arnd Bergmann wrote: > > On Friday, May 27, 2016 8:03:57 AM CEST Heiko Carstens wrote: > > > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > > > do I know? > > > > > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > > > know something as well. So I'd like to listen their arguments here. > > > > > > If it comes to 64 bit arguments for compat system calls: s390 also has an > > > x32-like ABI extension which allows user space to use full 64 bit > > > registers. As far as I know hardly anybody ever made use of that. > > > > > > However even if that would be widely used, to me it wouldn't make sense to > > > add new compat system calls which allow 64 bit arguments, simply because > > > something like > > > > > > c = (u32)a | (u64)b << 32; > > > > > > can be done with a single 1-cycle instruction. It's just not worth the > > > extra effort to maintain additional system call variants. > > > > For reference, both tile and mips also have separate 32-bit ABIs that are > > only used on 64-bit kernels (aside from the normal 32-bit ABI). Tile > > does it like s390 and passes 64-bit arguments as pairs, while MIPS > > and x86 and pass them as single registers. > > AFAIK, x32 also requires that the upper half of a 64-bit reg is zeroed > by the user when a 32-bit value is passed. We could require the same on > AArch64/ILP32 but I'm a bit uneasy on trusting a multitude of C > libraries on this. It's not about trusting a C library, it's about ensuring malicious code cannot pass argumentst that the kernel code assumes will never happen. Arnd ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-27 10:49 ` Arnd Bergmann @ 2016-05-27 13:04 ` Catalin Marinas -1 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-27 13:04 UTC (permalink / raw) To: Arnd Bergmann Cc: Heiko Carstens, Yury Norov, David Miller, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Fri, May 27, 2016 at 12:49:11PM +0200, Arnd Bergmann wrote: > On Friday, May 27, 2016 10:30:52 AM CEST Catalin Marinas wrote: > > On Fri, May 27, 2016 at 10:42:59AM +0200, Arnd Bergmann wrote: > > > On Friday, May 27, 2016 8:03:57 AM CEST Heiko Carstens wrote: > > > > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > > > > do I know? > > > > > > > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > > > > know something as well. So I'd like to listen their arguments here. > > > > > > > > If it comes to 64 bit arguments for compat system calls: s390 also has an > > > > x32-like ABI extension which allows user space to use full 64 bit > > > > registers. As far as I know hardly anybody ever made use of that. > > > > > > > > However even if that would be widely used, to me it wouldn't make sense to > > > > add new compat system calls which allow 64 bit arguments, simply because > > > > something like > > > > > > > > c = (u32)a | (u64)b << 32; > > > > > > > > can be done with a single 1-cycle instruction. It's just not worth the > > > > extra effort to maintain additional system call variants. > > > > > > For reference, both tile and mips also have separate 32-bit ABIs that are > > > only used on 64-bit kernels (aside from the normal 32-bit ABI). Tile > > > does it like s390 and passes 64-bit arguments as pairs, while MIPS > > > and x86 and pass them as single registers. > > > > AFAIK, x32 also requires that the upper half of a 64-bit reg is zeroed > > by the user when a 32-bit value is passed. We could require the same on > > AArch64/ILP32 but I'm a bit uneasy on trusting a multitude of C > > libraries on this. > > It's not about trusting a C library, it's about ensuring malicious code > cannot pass argumentst that the kernel code assumes will never happen. At least for pointers and sizes, we have additional checks in place already, like __access_ok(). Most of the syscalls should be safe since they either go through some compat functions taking 32-bit arguments or are routed to native functions which already need to cope with a full random 64-bit value. On arm64, I think the only risk comes from syscall handlers expecting 32-bit arguments but using 64-bit types. Apart from pointer types, I don't expect this to happen but we could enforce it via a BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)) in __SC_DELOUSE as per the s390 implementation. With ILP32 if we go for 64-bit off_t, those syscalls would be routed directly to the native layer. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 13:04 ` Catalin Marinas 0 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-27 13:04 UTC (permalink / raw) To: linux-arm-kernel On Fri, May 27, 2016 at 12:49:11PM +0200, Arnd Bergmann wrote: > On Friday, May 27, 2016 10:30:52 AM CEST Catalin Marinas wrote: > > On Fri, May 27, 2016 at 10:42:59AM +0200, Arnd Bergmann wrote: > > > On Friday, May 27, 2016 8:03:57 AM CEST Heiko Carstens wrote: > > > > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > > > > do I know? > > > > > > > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > > > > know something as well. So I'd like to listen their arguments here. > > > > > > > > If it comes to 64 bit arguments for compat system calls: s390 also has an > > > > x32-like ABI extension which allows user space to use full 64 bit > > > > registers. As far as I know hardly anybody ever made use of that. > > > > > > > > However even if that would be widely used, to me it wouldn't make sense to > > > > add new compat system calls which allow 64 bit arguments, simply because > > > > something like > > > > > > > > c = (u32)a | (u64)b << 32; > > > > > > > > can be done with a single 1-cycle instruction. It's just not worth the > > > > extra effort to maintain additional system call variants. > > > > > > For reference, both tile and mips also have separate 32-bit ABIs that are > > > only used on 64-bit kernels (aside from the normal 32-bit ABI). Tile > > > does it like s390 and passes 64-bit arguments as pairs, while MIPS > > > and x86 and pass them as single registers. > > > > AFAIK, x32 also requires that the upper half of a 64-bit reg is zeroed > > by the user when a 32-bit value is passed. We could require the same on > > AArch64/ILP32 but I'm a bit uneasy on trusting a multitude of C > > libraries on this. > > It's not about trusting a C library, it's about ensuring malicious code > cannot pass argumentst that the kernel code assumes will never happen. At least for pointers and sizes, we have additional checks in place already, like __access_ok(). Most of the syscalls should be safe since they either go through some compat functions taking 32-bit arguments or are routed to native functions which already need to cope with a full random 64-bit value. On arm64, I think the only risk comes from syscall handlers expecting 32-bit arguments but using 64-bit types. Apart from pointer types, I don't expect this to happen but we could enforce it via a BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)) in __SC_DELOUSE as per the s390 implementation. With ILP32 if we go for 64-bit off_t, those syscalls would be routed directly to the native layer. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-27 13:04 ` Catalin Marinas (?) @ 2016-05-27 16:58 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-27 16:58 UTC (permalink / raw) To: Catalin Marinas Cc: Arnd Bergmann, Heiko Carstens, David Miller, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Fri, May 27, 2016 at 02:04:47PM +0100, Catalin Marinas wrote: > On Fri, May 27, 2016 at 12:49:11PM +0200, Arnd Bergmann wrote: > > On Friday, May 27, 2016 10:30:52 AM CEST Catalin Marinas wrote: > > > On Fri, May 27, 2016 at 10:42:59AM +0200, Arnd Bergmann wrote: > > > > On Friday, May 27, 2016 8:03:57 AM CEST Heiko Carstens wrote: > > > > > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > > > > > do I know? > > > > > > > > > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > > > > > know something as well. So I'd like to listen their arguments here. > > > > > > > > > > If it comes to 64 bit arguments for compat system calls: s390 also has an > > > > > x32-like ABI extension which allows user space to use full 64 bit > > > > > registers. As far as I know hardly anybody ever made use of that. > > > > > > > > > > However even if that would be widely used, to me it wouldn't make sense to > > > > > add new compat system calls which allow 64 bit arguments, simply because > > > > > something like > > > > > > > > > > c = (u32)a | (u64)b << 32; > > > > > > > > > > can be done with a single 1-cycle instruction. It's just not worth the > > > > > extra effort to maintain additional system call variants. > > > > > > > > For reference, both tile and mips also have separate 32-bit ABIs that are > > > > only used on 64-bit kernels (aside from the normal 32-bit ABI). Tile > > > > does it like s390 and passes 64-bit arguments as pairs, while MIPS > > > > and x86 and pass them as single registers. > > > > > > AFAIK, x32 also requires that the upper half of a 64-bit reg is zeroed > > > by the user when a 32-bit value is passed. We could require the same on > > > AArch64/ILP32 but I'm a bit uneasy on trusting a multitude of C > > > libraries on this. > > > > It's not about trusting a C library, it's about ensuring malicious code > > cannot pass argumentst that the kernel code assumes will never happen. > > At least for pointers and sizes, we have additional checks in place > already, like __access_ok(). Most of the syscalls should be safe since > they either go through some compat functions taking 32-bit arguments or > are routed to native functions which already need to cope with a full > random 64-bit value. It's not a good idea to rely on current implementation. Implementation may be changed and it's impossible to check each and every patch against register top-halves correctness. > > On arm64, I think the only risk comes from syscall handlers expecting > 32-bit arguments but using 64-bit types. Apart from pointer types, I > don't expect this to happen but we could enforce it via a > BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)) in __SC_DELOUSE as per > the s390 implementation. With ILP32 if we go for 64-bit off_t, those > syscalls would be routed directly to the native layer. > 64-bit off_t doesn't imply we'd rout it directly. At first glance it's looking reasonable but there are other considerations like simplicity and unification with aarch32 that may become more important. That's what David pointed out. So, we have 3 options for now: 1. Clear top halves in entry.S which means we pass off_t as a pair. The cost is performance (didn't measure it yet and doubt about it makes serious impact). The advantage is simplicity and unification with aarch32, as I mentioned above. And David likes it. And it mininizes the amount of changes on glibc side. 2. Clear top halves in in separated file hosted wrappers. 3. Clear top halves in I-cache and tail optimization friendly in-site wrappers. 2 and 3 are the same from ABI point of view. 2 is the worst for me as it is the most complex in implementation and I-cache and tail optimization non-friendly. But Heiko likes it. 3 is what Catalin is talking about, and it was my initial approach. Though I didn't made compiler to do tail optimization, I think we can do it. But 2 is what we have now. And I'd choose it. We'll never get ilp32 done if will roll back previously agreed decisions again and again. Yury. > -- > Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 16:58 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-27 16:58 UTC (permalink / raw) To: linux-arm-kernel On Fri, May 27, 2016 at 02:04:47PM +0100, Catalin Marinas wrote: > On Fri, May 27, 2016 at 12:49:11PM +0200, Arnd Bergmann wrote: > > On Friday, May 27, 2016 10:30:52 AM CEST Catalin Marinas wrote: > > > On Fri, May 27, 2016 at 10:42:59AM +0200, Arnd Bergmann wrote: > > > > On Friday, May 27, 2016 8:03:57 AM CEST Heiko Carstens wrote: > > > > > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > > > > > do I know? > > > > > > > > > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > > > > > know something as well. So I'd like to listen their arguments here. > > > > > > > > > > If it comes to 64 bit arguments for compat system calls: s390 also has an > > > > > x32-like ABI extension which allows user space to use full 64 bit > > > > > registers. As far as I know hardly anybody ever made use of that. > > > > > > > > > > However even if that would be widely used, to me it wouldn't make sense to > > > > > add new compat system calls which allow 64 bit arguments, simply because > > > > > something like > > > > > > > > > > c = (u32)a | (u64)b << 32; > > > > > > > > > > can be done with a single 1-cycle instruction. It's just not worth the > > > > > extra effort to maintain additional system call variants. > > > > > > > > For reference, both tile and mips also have separate 32-bit ABIs that are > > > > only used on 64-bit kernels (aside from the normal 32-bit ABI). Tile > > > > does it like s390 and passes 64-bit arguments as pairs, while MIPS > > > > and x86 and pass them as single registers. > > > > > > AFAIK, x32 also requires that the upper half of a 64-bit reg is zeroed > > > by the user when a 32-bit value is passed. We could require the same on > > > AArch64/ILP32 but I'm a bit uneasy on trusting a multitude of C > > > libraries on this. > > > > It's not about trusting a C library, it's about ensuring malicious code > > cannot pass argumentst that the kernel code assumes will never happen. > > At least for pointers and sizes, we have additional checks in place > already, like __access_ok(). Most of the syscalls should be safe since > they either go through some compat functions taking 32-bit arguments or > are routed to native functions which already need to cope with a full > random 64-bit value. It's not a good idea to rely on current implementation. Implementation may be changed and it's impossible to check each and every patch against register top-halves correctness. > > On arm64, I think the only risk comes from syscall handlers expecting > 32-bit arguments but using 64-bit types. Apart from pointer types, I > don't expect this to happen but we could enforce it via a > BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)) in __SC_DELOUSE as per > the s390 implementation. With ILP32 if we go for 64-bit off_t, those > syscalls would be routed directly to the native layer. > 64-bit off_t doesn't imply we'd rout it directly. At first glance it's looking reasonable but there are other considerations like simplicity and unification with aarch32 that may become more important. That's what David pointed out. So, we have 3 options for now: 1. Clear top halves in entry.S which means we pass off_t as a pair. The cost is performance (didn't measure it yet and doubt about it makes serious impact). The advantage is simplicity and unification with aarch32, as I mentioned above. And David likes it. And it mininizes the amount of changes on glibc side. 2. Clear top halves in in separated file hosted wrappers. 3. Clear top halves in I-cache and tail optimization friendly in-site wrappers. 2 and 3 are the same from ABI point of view. 2 is the worst for me as it is the most complex in implementation and I-cache and tail optimization non-friendly. But Heiko likes it. 3 is what Catalin is talking about, and it was my initial approach. Though I didn't made compiler to do tail optimization, I think we can do it. But 2 is what we have now. And I'd choose it. We'll never get ilp32 done if will roll back previously agreed decisions again and again. Yury. > -- > Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 16:58 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-27 16:58 UTC (permalink / raw) To: Catalin Marinas Cc: Arnd Bergmann, Heiko Carstens, David Miller, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Fri, May 27, 2016 at 02:04:47PM +0100, Catalin Marinas wrote: > On Fri, May 27, 2016 at 12:49:11PM +0200, Arnd Bergmann wrote: > > On Friday, May 27, 2016 10:30:52 AM CEST Catalin Marinas wrote: > > > On Fri, May 27, 2016 at 10:42:59AM +0200, Arnd Bergmann wrote: > > > > On Friday, May 27, 2016 8:03:57 AM CEST Heiko Carstens wrote: > > > > > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > > > > > do I know? > > > > > > > > > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > > > > > know something as well. So I'd like to listen their arguments here. > > > > > > > > > > If it comes to 64 bit arguments for compat system calls: s390 also has an > > > > > x32-like ABI extension which allows user space to use full 64 bit > > > > > registers. As far as I know hardly anybody ever made use of that. > > > > > > > > > > However even if that would be widely used, to me it wouldn't make sense to > > > > > add new compat system calls which allow 64 bit arguments, simply because > > > > > something like > > > > > > > > > > c = (u32)a | (u64)b << 32; > > > > > > > > > > can be done with a single 1-cycle instruction. It's just not worth the > > > > > extra effort to maintain additional system call variants. > > > > > > > > For reference, both tile and mips also have separate 32-bit ABIs that are > > > > only used on 64-bit kernels (aside from the normal 32-bit ABI). Tile > > > > does it like s390 and passes 64-bit arguments as pairs, while MIPS > > > > and x86 and pass them as single registers. > > > > > > AFAIK, x32 also requires that the upper half of a 64-bit reg is zeroed > > > by the user when a 32-bit value is passed. We could require the same on > > > AArch64/ILP32 but I'm a bit uneasy on trusting a multitude of C > > > libraries on this. > > > > It's not about trusting a C library, it's about ensuring malicious code > > cannot pass argumentst that the kernel code assumes will never happen. > > At least for pointers and sizes, we have additional checks in place > already, like __access_ok(). Most of the syscalls should be safe since > they either go through some compat functions taking 32-bit arguments or > are routed to native functions which already need to cope with a full > random 64-bit value. It's not a good idea to rely on current implementation. Implementation may be changed and it's impossible to check each and every patch against register top-halves correctness. > > On arm64, I think the only risk comes from syscall handlers expecting > 32-bit arguments but using 64-bit types. Apart from pointer types, I > don't expect this to happen but we could enforce it via a > BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)) in __SC_DELOUSE as per > the s390 implementation. With ILP32 if we go for 64-bit off_t, those > syscalls would be routed directly to the native layer. > 64-bit off_t doesn't imply we'd rout it directly. At first glance it's looking reasonable but there are other considerations like simplicity and unification with aarch32 that may become more important. That's what David pointed out. So, we have 3 options for now: 1. Clear top halves in entry.S which means we pass off_t as a pair. The cost is performance (didn't measure it yet and doubt about it makes serious impact). The advantage is simplicity and unification with aarch32, as I mentioned above. And David likes it. And it mininizes the amount of changes on glibc side. 2. Clear top halves in in separated file hosted wrappers. 3. Clear top halves in I-cache and tail optimization friendly in-site wrappers. 2 and 3 are the same from ABI point of view. 2 is the worst for me as it is the most complex in implementation and I-cache and tail optimization non-friendly. But Heiko likes it. 3 is what Catalin is talking about, and it was my initial approach. Though I didn't made compiler to do tail optimization, I think we can do it. But 2 is what we have now. And I'd choose it. We'll never get ilp32 done if will roll back previously agreed decisions again and again. Yury. > -- > Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-27 16:58 ` Yury Norov @ 2016-05-27 17:36 ` Catalin Marinas -1 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-27 17:36 UTC (permalink / raw) To: Yury Norov Cc: Arnd Bergmann, Heiko Carstens, David Miller, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Fri, May 27, 2016 at 07:58:06PM +0300, Yury Norov wrote: > So, we have 3 options for now: > 1. Clear top halves in entry.S which means we pass off_t as a pair. > The cost is performance (didn't measure it yet and doubt about it > makes serious impact). The advantage is simplicity and unification with > aarch32, as I mentioned above. And David likes it. And it mininizes > the amount of changes on glibc side. > 2. Clear top halves in in separated file hosted wrappers. > 3. Clear top halves in I-cache and tail optimization friendly in-site wrappers. > > 2 and 3 are the same from ABI point of view. > > 2 is the worst for me as it is the most complex in implementation and > I-cache and tail optimization non-friendly. But Heiko likes it. > > 3 is what Catalin is talking about, and it was my initial approach. > Though I didn't made compiler to do tail optimization, I think we can > do it. I don't fully understand the difference between 2 and 3. My comment was more around annotating the wrappers in (2) with __naked to no longer generate function prologue/epilogue. They would still be in a separate kernel/compat_wrapper.c file. I can't figure out how you would have in-place wrappers for all syscalls. You can indeed handle the current COMPAT_SYSCALL_DEFINE via __SC_DELOUSE (and penalising the AArch32/compat support slightly) but there is no solution for native SYSCALL_DEFINE functions to do it in-place. > But 2 is what we have now. And I'd choose it. We'll never get ilp32 done > if will roll back previously agreed decisions again and again. I would rather roll back a decision than going ahead with a wrong one. Note that this is *ABI*, not a driver that you can fix upstream later. Since yesterday, I realised that (2) requires further annotations and wrapping for the native and compat syscalls used by ILP32 just to cope with pointers. Also given davem's comments, (1) starts to look a bit more appealing (I don't like reverting such decisions either, I'd have to review the code again and again). -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 17:36 ` Catalin Marinas 0 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-27 17:36 UTC (permalink / raw) To: linux-arm-kernel On Fri, May 27, 2016 at 07:58:06PM +0300, Yury Norov wrote: > So, we have 3 options for now: > 1. Clear top halves in entry.S which means we pass off_t as a pair. > The cost is performance (didn't measure it yet and doubt about it > makes serious impact). The advantage is simplicity and unification with > aarch32, as I mentioned above. And David likes it. And it mininizes > the amount of changes on glibc side. > 2. Clear top halves in in separated file hosted wrappers. > 3. Clear top halves in I-cache and tail optimization friendly in-site wrappers. > > 2 and 3 are the same from ABI point of view. > > 2 is the worst for me as it is the most complex in implementation and > I-cache and tail optimization non-friendly. But Heiko likes it. > > 3 is what Catalin is talking about, and it was my initial approach. > Though I didn't made compiler to do tail optimization, I think we can > do it. I don't fully understand the difference between 2 and 3. My comment was more around annotating the wrappers in (2) with __naked to no longer generate function prologue/epilogue. They would still be in a separate kernel/compat_wrapper.c file. I can't figure out how you would have in-place wrappers for all syscalls. You can indeed handle the current COMPAT_SYSCALL_DEFINE via __SC_DELOUSE (and penalising the AArch32/compat support slightly) but there is no solution for native SYSCALL_DEFINE functions to do it in-place. > But 2 is what we have now. And I'd choose it. We'll never get ilp32 done > if will roll back previously agreed decisions again and again. I would rather roll back a decision than going ahead with a wrong one. Note that this is *ABI*, not a driver that you can fix upstream later. Since yesterday, I realised that (2) requires further annotations and wrapping for the native and compat syscalls used by ILP32 just to cope with pointers. Also given davem's comments, (1) starts to look a bit more appealing (I don't like reverting such decisions either, I'd have to review the code again and again). -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-27 6:03 ` Heiko Carstens @ 2016-05-27 9:01 ` Catalin Marinas -1 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-27 9:01 UTC (permalink / raw) To: Heiko Carstens Cc: Yury Norov, David Miller, arnd, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Fri, May 27, 2016 at 08:03:57AM +0200, Heiko Carstens wrote: > > > > The cost is pretty trivial though. See kernel/compat_wrapper.o: > > > > COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); > > > > 0: a9bf7bfd stp x29, x30, [sp,#-16]! > > > > 4: 910003fd mov x29, sp > > > > 8: 2a0003e0 mov w0, w0 > > > > c: 94000000 bl 0 <sys_creat> > > > > 10: a8c17bfd ldp x29, x30, [sp],#16 > > > > 14: d65f03c0 ret > > > > > > I would say the above could be more expensive than 8 movs (16 bytes to > > > write, read, a branch and a ret). You can also add the I-cache locality, > > > having wrappers for each syscalls instead of a single place for zeroing > > > the upper half (where no other wrapper is necessary). > > > > > > Can we trick the compiler into doing a tail call optimisation. This > > > could have simply been: > > > > > > COMPAT_SYSCALL_WRAP2(creat, ...): > > > mov w0, w0 > > > b <sys_creat> > > > > What you talk about was in my initial version. But Heiko insisted on having all > > wrappers together. > > http://www.spinics.net/lists/linux-s390/msg11593.html > > > > Grep your email for discussion. > > I think Catalin's question was more about why there is even a stack frame > generated. It looks like it is not necessary. I did ask this too a couple > of months ago, when we discussed this. Indeed, I was questioning the need for prologue/epilogue, not the use of COMPAT_SYSCALL_WRAPx(). Maybe something like __naked would do. > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > do I know? > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > know something as well. So I'd like to listen their arguments here. > > If it comes to 64 bit arguments for compat system calls: s390 also has an > x32-like ABI extension which allows user space to use full 64 bit > registers. As far as I know hardly anybody ever made use of that. > > However even if that would be widely used, to me it wouldn't make sense to > add new compat system calls which allow 64 bit arguments, simply because > something like > > c = (u32)a | (u64)b << 32; > > can be done with a single 1-cycle instruction. It's just not worth the > extra effort to maintain additional system call variants. If we split 64-bit arguments in two, we can go a step further and avoid most of the COMPAT_SYSCALL_WRAPx annotations in favour of a common upper-half zeroing of the argument registers on ILP32 syscall entry. There would be a few exceptions where we need to re-build 64-bit arguments on sign-extend. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 9:01 ` Catalin Marinas 0 siblings, 0 replies; 207+ messages in thread From: Catalin Marinas @ 2016-05-27 9:01 UTC (permalink / raw) To: linux-arm-kernel On Fri, May 27, 2016 at 08:03:57AM +0200, Heiko Carstens wrote: > > > > The cost is pretty trivial though. See kernel/compat_wrapper.o: > > > > COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); > > > > 0: a9bf7bfd stp x29, x30, [sp,#-16]! > > > > 4: 910003fd mov x29, sp > > > > 8: 2a0003e0 mov w0, w0 > > > > c: 94000000 bl 0 <sys_creat> > > > > 10: a8c17bfd ldp x29, x30, [sp],#16 > > > > 14: d65f03c0 ret > > > > > > I would say the above could be more expensive than 8 movs (16 bytes to > > > write, read, a branch and a ret). You can also add the I-cache locality, > > > having wrappers for each syscalls instead of a single place for zeroing > > > the upper half (where no other wrapper is necessary). > > > > > > Can we trick the compiler into doing a tail call optimisation. This > > > could have simply been: > > > > > > COMPAT_SYSCALL_WRAP2(creat, ...): > > > mov w0, w0 > > > b <sys_creat> > > > > What you talk about was in my initial version. But Heiko insisted on having all > > wrappers together. > > http://www.spinics.net/lists/linux-s390/msg11593.html > > > > Grep your email for discussion. > > I think Catalin's question was more about why there is even a stack frame > generated. It looks like it is not necessary. I did ask this too a couple > of months ago, when we discussed this. Indeed, I was questioning the need for prologue/epilogue, not the use of COMPAT_SYSCALL_WRAPx(). Maybe something like __naked would do. > > > > > Cost wise, this seems like it all cancels out in the end, but what > > > > > do I know? > > > > > > > > I think you know something, and I also think Heiko and other s390 guys > > > > know something as well. So I'd like to listen their arguments here. > > If it comes to 64 bit arguments for compat system calls: s390 also has an > x32-like ABI extension which allows user space to use full 64 bit > registers. As far as I know hardly anybody ever made use of that. > > However even if that would be widely used, to me it wouldn't make sense to > add new compat system calls which allow 64 bit arguments, simply because > something like > > c = (u32)a | (u64)b << 32; > > can be done with a single 1-cycle instruction. It's just not worth the > extra effort to maintain additional system call variants. If we split 64-bit arguments in two, we can go a step further and avoid most of the COMPAT_SYSCALL_WRAPx annotations in favour of a common upper-half zeroing of the argument registers on ILP32 syscall entry. There would be a few exceptions where we need to re-build 64-bit arguments on sign-extend. -- Catalin ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-26 22:29 ` Catalin Marinas (?) @ 2016-06-14 23:08 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-14 23:08 UTC (permalink / raw) To: Catalin Marinas Cc: David Miller, arnd, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Hi Catalin, David, all > COMPAT_SYSCALL_WRAP2(creat, ...): > mov w0, w0 > b <sys_creat> > > > > Cost wise, this seems like it all cancels out in the end, but what > > > do I know? > > > > I think you know something, and I also think Heiko and other s390 guys > > know something as well. So I'd like to listen their arguments here. > > > > For me spark64 way is looking reasonable only because it's really simple > > and takes less coding. I'll try it on some branch and share here what happened. > > The kernel code will definitely look simpler ;). It would be good to see > if there actually is any performance impact. Even with 16 more cycles on > syscall entry, would they be lost in the noise? You don't need a full > implementation, just some dummy mov x0, x0 on the entry path. > > -- > Catalin I wrote a simple test: struct timeval start, end; unsigned long long ut; int main() { gettimeofday(&start, NULL); for (int i = 1000000; i; i--) syscall(__NR_getrusage, 100 /* EINVAL */, NULL); gettimeofday(&end, NULL); ut = (end.tv_sec - start.tv_sec) * 1000000ULL + end.tv_usec - start.tv_usec; printf("%lld\n", ut); exit(EXIT_SUCCESS); } In kernel there's minimal overhead: diff --git a/kernel/sys.c b/kernel/sys.c index 89d5be4..003d5ad 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1634,6 +1634,17 @@ COMPAT_SYSCALL_DEFINE2(getrusage, int, who, struct compat_rusage __user *, ru) { struct rusage r; + asm volatile ( + " mov w0, w0 \n" + " mov w1, w1 \n" + " mov w2, w2 \n" + " mov w3, w3 \n" + " mov w4, w4 \n" + " mov w5, w5 \n" + " mov w6, w6 \n" + " mov w7, w7 \n" + ); + if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN && who != RUSAGE_THREAD) return -EINVAL; On QEMU: With MOVs: W/O MOVs: 832015 814564 840639 803165 830482 813116 832895 802928 832083 832658 834461 802993 829405 812465 846677 822651 828409 803393 836845 821470 828716 801044 831620 821301 825423 800278 829946 821476 We have 83 mS vs 81 mS, ~2.6% of performance degradation. And I can show bigger numbers if I'll use asm svc instead of syscall() wrapper which increases time as well. It's definitely more than 0, but not so big anyway. For syscalls with heavy payload it will be non-measurable. So the choice is still there. Should we use wrappers and save 2.5% of syscall performance. Or clear top-halves unconditionally and win in simplicity? If QEMU is looking non-representative, I can run test on real hardware, but it takes a time, and I think will end up with similar results. Latest kernel with wrappers and library are here: https://github.com/norov/linux/commits/ilp32 https://github.com/norov/glibc/commits/ilp32-dev BTW, notice the change in ABI: syscalls that take stat and statfs structures now routed to (wrapped) native handlers, after switching userspace to use 64-bit off_t, ino_t, blkcnt_t, fsblkcnt_t and fsfilcnt_t types. Yury. ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-06-14 23:08 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-14 23:08 UTC (permalink / raw) To: linux-arm-kernel Hi Catalin, David, all > COMPAT_SYSCALL_WRAP2(creat, ...): > mov w0, w0 > b <sys_creat> > > > > Cost wise, this seems like it all cancels out in the end, but what > > > do I know? > > > > I think you know something, and I also think Heiko and other s390 guys > > know something as well. So I'd like to listen their arguments here. > > > > For me spark64 way is looking reasonable only because it's really simple > > and takes less coding. I'll try it on some branch and share here what happened. > > The kernel code will definitely look simpler ;). It would be good to see > if there actually is any performance impact. Even with 16 more cycles on > syscall entry, would they be lost in the noise? You don't need a full > implementation, just some dummy mov x0, x0 on the entry path. > > -- > Catalin I wrote a simple test: struct timeval start, end; unsigned long long ut; int main() { gettimeofday(&start, NULL); for (int i = 1000000; i; i--) syscall(__NR_getrusage, 100 /* EINVAL */, NULL); gettimeofday(&end, NULL); ut = (end.tv_sec - start.tv_sec) * 1000000ULL + end.tv_usec - start.tv_usec; printf("%lld\n", ut); exit(EXIT_SUCCESS); } In kernel there's minimal overhead: diff --git a/kernel/sys.c b/kernel/sys.c index 89d5be4..003d5ad 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1634,6 +1634,17 @@ COMPAT_SYSCALL_DEFINE2(getrusage, int, who, struct compat_rusage __user *, ru) { struct rusage r; + asm volatile ( + " mov w0, w0 \n" + " mov w1, w1 \n" + " mov w2, w2 \n" + " mov w3, w3 \n" + " mov w4, w4 \n" + " mov w5, w5 \n" + " mov w6, w6 \n" + " mov w7, w7 \n" + ); + if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN && who != RUSAGE_THREAD) return -EINVAL; On QEMU: With MOVs: W/O MOVs: 832015 814564 840639 803165 830482 813116 832895 802928 832083 832658 834461 802993 829405 812465 846677 822651 828409 803393 836845 821470 828716 801044 831620 821301 825423 800278 829946 821476 We have 83 mS vs 81 mS, ~2.6% of performance degradation. And I can show bigger numbers if I'll use asm svc instead of syscall() wrapper which increases time as well. It's definitely more than 0, but not so big anyway. For syscalls with heavy payload it will be non-measurable. So the choice is still there. Should we use wrappers and save 2.5% of syscall performance. Or clear top-halves unconditionally and win in simplicity? If QEMU is looking non-representative, I can run test on real hardware, but it takes a time, and I think will end up with similar results. Latest kernel with wrappers and library are here: https://github.com/norov/linux/commits/ilp32 https://github.com/norov/glibc/commits/ilp32-dev BTW, notice the change in ABI: syscalls that take stat and statfs structures now routed to (wrapped) native handlers, after switching userspace to use 64-bit off_t, ino_t, blkcnt_t, fsblkcnt_t and fsfilcnt_t types. Yury. ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-06-14 23:08 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-14 23:08 UTC (permalink / raw) To: Catalin Marinas Cc: David Miller, arnd, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Hi Catalin, David, all > COMPAT_SYSCALL_WRAP2(creat, ...): > mov w0, w0 > b <sys_creat> > > > > Cost wise, this seems like it all cancels out in the end, but what > > > do I know? > > > > I think you know something, and I also think Heiko and other s390 guys > > know something as well. So I'd like to listen their arguments here. > > > > For me spark64 way is looking reasonable only because it's really simple > > and takes less coding. I'll try it on some branch and share here what happened. > > The kernel code will definitely look simpler ;). It would be good to see > if there actually is any performance impact. Even with 16 more cycles on > syscall entry, would they be lost in the noise? You don't need a full > implementation, just some dummy mov x0, x0 on the entry path. > > -- > Catalin I wrote a simple test: struct timeval start, end; unsigned long long ut; int main() { gettimeofday(&start, NULL); for (int i = 1000000; i; i--) syscall(__NR_getrusage, 100 /* EINVAL */, NULL); gettimeofday(&end, NULL); ut = (end.tv_sec - start.tv_sec) * 1000000ULL + end.tv_usec - start.tv_usec; printf("%lld\n", ut); exit(EXIT_SUCCESS); } In kernel there's minimal overhead: diff --git a/kernel/sys.c b/kernel/sys.c index 89d5be4..003d5ad 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1634,6 +1634,17 @@ COMPAT_SYSCALL_DEFINE2(getrusage, int, who, struct compat_rusage __user *, ru) { struct rusage r; + asm volatile ( + " mov w0, w0 \n" + " mov w1, w1 \n" + " mov w2, w2 \n" + " mov w3, w3 \n" + " mov w4, w4 \n" + " mov w5, w5 \n" + " mov w6, w6 \n" + " mov w7, w7 \n" + ); + if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN && who != RUSAGE_THREAD) return -EINVAL; On QEMU: With MOVs: W/O MOVs: 832015 814564 840639 803165 830482 813116 832895 802928 832083 832658 834461 802993 829405 812465 846677 822651 828409 803393 836845 821470 828716 801044 831620 821301 825423 800278 829946 821476 We have 83 mS vs 81 mS, ~2.6% of performance degradation. And I can show bigger numbers if I'll use asm svc instead of syscall() wrapper which increases time as well. It's definitely more than 0, but not so big anyway. For syscalls with heavy payload it will be non-measurable. So the choice is still there. Should we use wrappers and save 2.5% of syscall performance. Or clear top-halves unconditionally and win in simplicity? If QEMU is looking non-representative, I can run test on real hardware, but it takes a time, and I think will end up with similar results. Latest kernel with wrappers and library are here: https://github.com/norov/linux/commits/ilp32 https://github.com/norov/glibc/commits/ilp32-dev BTW, notice the change in ABI: syscalls that take stat and statfs structures now routed to (wrapped) native handlers, after switching userspace to use 64-bit off_t, ino_t, blkcnt_t, fsblkcnt_t and fsfilcnt_t types. Yury. ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 01/23] all: syscall wrappers: add documentation 2016-05-25 19:30 ` David Miller @ 2016-05-27 5:52 ` Heiko Carstens -1 siblings, 0 replies; 207+ messages in thread From: Heiko Carstens @ 2016-05-27 5:52 UTC (permalink / raw) To: David Miller Cc: ynorov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Wed, May 25, 2016 at 12:30:17PM -0700, David Miller wrote: > From: Yury Norov <ynorov@caviumnetworks.com> > Date: Tue, 24 May 2016 03:04:30 +0300 > > > +To clear that top halves, automatic wrappers are introduced. They clear all > > +required registers before passing control to regular syscall handler. > > Why have one of these for every single compat system call, rather than > simply clearing the top half of all of these registers unconditionally > in the 32-bit system call trap before the system call is invoked? > > That's what we do on sparc64. > > And with that, you only need wrappers for the case where there needs > to be proper sign extention of a 32-bit signed argument. That would probably also work for arm. On s390 we still have these odd 31 bit pointers in compat mode which require us to clear 33 bits instead of 32 bits. That makes up for appr. one third of all system calls. The additional wrappers are only for zero/sign extension, where I count a total of 27 on s390. The reason for doing this in C was the constant copy-paste error rate, when adding new system calls plus I got a rid of a lot of unnecessary asm code. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 01/23] all: syscall wrappers: add documentation @ 2016-05-27 5:52 ` Heiko Carstens 0 siblings, 0 replies; 207+ messages in thread From: Heiko Carstens @ 2016-05-27 5:52 UTC (permalink / raw) To: linux-arm-kernel On Wed, May 25, 2016 at 12:30:17PM -0700, David Miller wrote: > From: Yury Norov <ynorov@caviumnetworks.com> > Date: Tue, 24 May 2016 03:04:30 +0300 > > > +To clear that top halves, automatic wrappers are introduced. They clear all > > +required registers before passing control to regular syscall handler. > > Why have one of these for every single compat system call, rather than > simply clearing the top half of all of these registers unconditionally > in the 32-bit system call trap before the system call is invoked? > > That's what we do on sparc64. > > And with that, you only need wrappers for the case where there needs > to be proper sign extention of a 32-bit signed argument. That would probably also work for arm. On s390 we still have these odd 31 bit pointers in compat mode which require us to clear 33 bits instead of 32 bits. That makes up for appr. one third of all system calls. The additional wrappers are only for zero/sign extension, where I count a total of 27 on s390. The reason for doing this in C was the constant copy-paste error rate, when adding new system calls plus I got a rid of a lot of unnecessary asm code. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 02/23] all: introduce COMPAT_WRAPPER option and enable it for s390 2016-05-24 0:04 ` Yury Norov (?) (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/Kconfig | 4 ++++ arch/s390/Kconfig | 1 + 2 files changed, 5 insertions(+) diff --git a/arch/Kconfig b/arch/Kconfig index 81869a5..92fcbd4 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -589,6 +589,10 @@ config HAVE_STACK_VALIDATION Architecture supports the 'objtool check' host tool command, which performs compile-time stack metadata validation. +config COMPAT_WRAPPER + bool + depends on COMPAT + # # ABI hall of shame # diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index bf24ab1..6d643b3 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -340,6 +340,7 @@ config COMPAT select COMPAT_BINFMT_ELF if BINFMT_ELF select ARCH_WANT_OLD_COMPAT_IPC select COMPAT_OLD_SIGACTION + select COMPAT_WRAPPER depends on MULTIUSER help Select this option if you want to enable your system kernel to -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 02/23] all: introduce COMPAT_WRAPPER option and enable it for s390 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/Kconfig | 4 ++++ arch/s390/Kconfig | 1 + 2 files changed, 5 insertions(+) diff --git a/arch/Kconfig b/arch/Kconfig index 81869a5..92fcbd4 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -589,6 +589,10 @@ config HAVE_STACK_VALIDATION Architecture supports the 'objtool check' host tool command, which performs compile-time stack metadata validation. +config COMPAT_WRAPPER + bool + depends on COMPAT + # # ABI hall of shame # diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index bf24ab1..6d643b3 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -340,6 +340,7 @@ config COMPAT select COMPAT_BINFMT_ELF if BINFMT_ELF select ARCH_WANT_OLD_COMPAT_IPC select COMPAT_OLD_SIGACTION + select COMPAT_WRAPPER depends on MULTIUSER help Select this option if you want to enable your system kernel to -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 02/23] all: introduce COMPAT_WRAPPER option and enable it for s390 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/Kconfig | 4 ++++ arch/s390/Kconfig | 1 + 2 files changed, 5 insertions(+) diff --git a/arch/Kconfig b/arch/Kconfig index 81869a5..92fcbd4 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -589,6 +589,10 @@ config HAVE_STACK_VALIDATION Architecture supports the 'objtool check' host tool command, which performs compile-time stack metadata validation. +config COMPAT_WRAPPER + bool + depends on COMPAT + # # ABI hall of shame # diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index bf24ab1..6d643b3 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -340,6 +340,7 @@ config COMPAT select COMPAT_BINFMT_ELF if BINFMT_ELF select ARCH_WANT_OLD_COMPAT_IPC select COMPAT_OLD_SIGACTION + select COMPAT_WRAPPER depends on MULTIUSER help Select this option if you want to enable your system kernel to -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 02/23] all: introduce COMPAT_WRAPPER option and enable it for s390 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, ynorov, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/Kconfig | 4 ++++ arch/s390/Kconfig | 1 + 2 files changed, 5 insertions(+) diff --git a/arch/Kconfig b/arch/Kconfig index 81869a5..92fcbd4 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -589,6 +589,10 @@ config HAVE_STACK_VALIDATION Architecture supports the 'objtool check' host tool command, which performs compile-time stack metadata validation. +config COMPAT_WRAPPER + bool + depends on COMPAT + # # ABI hall of shame # diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index bf24ab1..6d643b3 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -340,6 +340,7 @@ config COMPAT select COMPAT_BINFMT_ELF if BINFMT_ELF select ARCH_WANT_OLD_COMPAT_IPC select COMPAT_OLD_SIGACTION + select COMPAT_WRAPPER depends on MULTIUSER help Select this option if you want to enable your system kernel to -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 03/23] all: s390: move wrapper infrastructure to generic headers @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich This patch moves required calls to generic files to let other arches use it if needed. Here also, additional code is introduced, as s390 uses asm syscall tables, while in general case, wrappers may be used in C code. __SC_COMPAT_CAST for s390 is too specific due to 31-bit pointer length, so it's moved to arch/s390/include/asm/compat.h. Generic declaration assumes that long, unsigned long and pointer types are all 32-bit length. linux/syscalls_structs.h header is introduced, because from now (see next patch) structure types listed there are needed for both normal and compat mode. cond_syscall_wrapped now defined two symbols: sys_foo() and compat_sys_foo(), if compat wrappers are enabled. Here __SC_WRAP() macro is introduced as well. s390 doesn't need it as it uses asm-generated syscall table. But architectures that generate that tables with C code (ARM64/ILP32) should redefine it as '#define __SC_WRAP(name) compat_##name'. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/s390/include/asm/compat.h | 17 +++++++++-- arch/s390/kernel/compat_wrapper.c | 51 --------------------------------- include/linux/compat.h | 52 +++++++++++++++++++++++++++++++++ include/linux/syscalls.h | 57 +------------------------------------ include/linux/syscalls_structs.h | 60 +++++++++++++++++++++++++++++++++++++++ include/uapi/asm-generic/unistd.h | 4 +++ 6 files changed, 132 insertions(+), 109 deletions(-) create mode 100644 include/linux/syscalls_structs.h diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h index 352f7bd..f412723 100644 --- a/arch/s390/include/asm/compat.h +++ b/arch/s390/include/asm/compat.h @@ -7,13 +7,26 @@ #include <linux/sched.h> #include <linux/thread_info.h> -#define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p(typeof(0?(t)0:0ULL), u64)) - #define __SC_DELOUSE(t,v) ({ \ BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)); \ (t)(__TYPE_IS_PTR(t) ? ((v) & 0x7fffffff) : (v)); \ }) +#define __SC_COMPAT_CAST(t, a) \ +({ \ + long __ReS = a; \ + \ + BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \ + !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t)); \ + if (__TYPE_IS_L(t)) \ + __ReS = (s32)a; \ + if (__TYPE_IS_UL(t)) \ + __ReS = (u32)a; \ + if (__TYPE_IS_PTR(t)) \ + __ReS = a & 0x7fffffff; \ + (t)__ReS; \ +}) + #define PSW32_MASK_PER 0x40000000UL #define PSW32_MASK_DAT 0x04000000UL #define PSW32_MASK_IO 0x02000000UL diff --git a/arch/s390/kernel/compat_wrapper.c b/arch/s390/kernel/compat_wrapper.c index ae2cda5..1614e15 100644 --- a/arch/s390/kernel/compat_wrapper.c +++ b/arch/s390/kernel/compat_wrapper.c @@ -8,57 +8,6 @@ #include <linux/compat.h> #include "entry.h" -#define COMPAT_SYSCALL_WRAP1(name, ...) \ - COMPAT_SYSCALL_WRAPx(1, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP2(name, ...) \ - COMPAT_SYSCALL_WRAPx(2, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP3(name, ...) \ - COMPAT_SYSCALL_WRAPx(3, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP4(name, ...) \ - COMPAT_SYSCALL_WRAPx(4, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP5(name, ...) \ - COMPAT_SYSCALL_WRAPx(5, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP6(name, ...) \ - COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__) - -#define __SC_COMPAT_TYPE(t, a) \ - __typeof(__builtin_choose_expr(sizeof(t) > 4, 0L, (t)0)) a - -#define __SC_COMPAT_CAST(t, a) \ -({ \ - long __ReS = a; \ - \ - BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \ - !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t)); \ - if (__TYPE_IS_L(t)) \ - __ReS = (s32)a; \ - if (__TYPE_IS_UL(t)) \ - __ReS = (u32)a; \ - if (__TYPE_IS_PTR(t)) \ - __ReS = a & 0x7fffffff; \ - (t)__ReS; \ -}) - -/* - * The COMPAT_SYSCALL_WRAP macro generates system call wrappers to be used by - * compat tasks. These wrappers will only be used for system calls where only - * the system call arguments need sign or zero extension or zeroing of the upper - * 33 bits of pointers. - * Note: since the wrapper function will afterwards call a system call which - * again performs zero and sign extension for all system call arguments with - * a size of less than eight bytes, these compat wrappers only touch those - * system call arguments with a size of eight bytes ((unsigned) long and - * pointers). Zero and sign extension for e.g. int parameters will be done by - * the regular system call wrappers. - */ -#define COMPAT_SYSCALL_WRAPx(x, name, ...) \ -asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ -asmlinkage long notrace compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__));\ -asmlinkage long notrace compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) \ -{ \ - return sys##name(__MAP(x,__SC_COMPAT_CAST,__VA_ARGS__)); \ -} - COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); diff --git a/include/linux/compat.h b/include/linux/compat.h index f964ef7..4eba16e 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -30,6 +30,10 @@ #define __SC_DELOUSE(t,v) ((t)(unsigned long)(v)) #endif +#ifndef __TYPE_IS_PTR +#define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p(typeof(0?(t)0:0ULL), u64)) +#endif + #define COMPAT_SYSCALL_DEFINE0(name) \ asmlinkage long compat_sys_##name(void) @@ -739,4 +743,52 @@ static inline bool in_compat_syscall(void) { return false; } #endif /* CONFIG_COMPAT */ +#ifdef CONFIG_COMPAT_WRAPPER + +#define COMPAT_SYSCALL_WRAP1(name, ...) COMPAT_SYSCALL_WRAPx(1, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP2(name, ...) COMPAT_SYSCALL_WRAPx(2, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP3(name, ...) COMPAT_SYSCALL_WRAPx(3, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP4(name, ...) COMPAT_SYSCALL_WRAPx(4, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP5(name, ...) COMPAT_SYSCALL_WRAPx(5, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP6(name, ...) COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__) + +#ifndef __SC_COMPAT_TYPE +#define __SC_COMPAT_TYPE(t, a) \ + __typeof(__builtin_choose_expr(sizeof(t) > 4, 0L, (t)0)) a +#endif + +#ifndef __SC_COMPAT_CAST +#define __SC_COMPAT_CAST(t, a) ({ \ + BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \ + !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t)); \ + ((t) ((t)(-1) < 0 ? (s64)(s32)(a) : (u64)(u32)(a))); \ +}) +#endif + +#ifndef COMPAT_SYSCALL_WRAPx +/* + * The COMPAT_SYSCALL_WRAP macro generates system call wrappers to be used by + * compat tasks. These wrappers will only be used for system calls where only + * the system call arguments need sign or zero extension or zeroing of the upper + * parts of arguments passed in register. + * Note: since the wrapper function will afterwards call a system call which + * again performs zero and sign extension for all system call arguments with + * a size of less than eight bytes, these compat wrappers only touch those + * system call arguments with a size of eight bytes ((unsigned) long and + * pointers). Zero and sign extension for e.g. int parameters will be done by + * the regular system call wrappers. + */ +#define COMPAT_SYSCALL_WRAPx(x, name, ...) \ +asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ +asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) \ + __attribute__((alias(__stringify(compat_SyS##name)))); \ +asmlinkage long notrace compat_SyS##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)); \ +asmlinkage long notrace compat_SyS##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) \ +{ \ + return sys##name(__MAP(x,__SC_COMPAT_CAST,__VA_ARGS__)); \ +} +#endif + +#endif /* CONFIG_COMPAT_WRAPPER */ + #endif /* _LINUX_COMPAT_H */ diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index d795472..9d345eb 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -11,62 +11,7 @@ #ifndef _LINUX_SYSCALLS_H #define _LINUX_SYSCALLS_H -struct epoll_event; -struct iattr; -struct inode; -struct iocb; -struct io_event; -struct iovec; -struct itimerspec; -struct itimerval; -struct kexec_segment; -struct linux_dirent; -struct linux_dirent64; -struct list_head; -struct mmap_arg_struct; -struct msgbuf; -struct user_msghdr; -struct mmsghdr; -struct msqid_ds; -struct new_utsname; -struct nfsctl_arg; -struct __old_kernel_stat; -struct oldold_utsname; -struct old_utsname; -struct pollfd; -struct rlimit; -struct rlimit64; -struct rusage; -struct sched_param; -struct sched_attr; -struct sel_arg_struct; -struct semaphore; -struct sembuf; -struct shmid_ds; -struct sockaddr; -struct stat; -struct stat64; -struct statfs; -struct statfs64; -struct __sysctl_args; -struct sysinfo; -struct timespec; -struct timeval; -struct timex; -struct timezone; -struct tms; -struct utimbuf; -struct mq_attr; -struct compat_stat; -struct compat_timeval; -struct robust_list_head; -struct getcpu_cache; -struct old_linux_dirent; -struct perf_event_attr; -struct file_handle; -struct sigaltstack; -union bpf_attr; - +#include <linux/syscalls_structs.h> #include <linux/types.h> #include <linux/aio_abi.h> #include <linux/capability.h> diff --git a/include/linux/syscalls_structs.h b/include/linux/syscalls_structs.h new file mode 100644 index 0000000..a920cbc --- /dev/null +++ b/include/linux/syscalls_structs.h @@ -0,0 +1,60 @@ +#ifndef _LINUX_SYSCALL_STRUCTS_H +#define _LINUX_SYSCALL_STRUCTS_H + +struct epoll_event; +struct iattr; +struct inode; +struct iocb; +struct io_event; +struct iovec; +struct itimerspec; +struct itimerval; +struct kexec_segment; +struct linux_dirent; +struct linux_dirent64; +struct list_head; +struct mmap_arg_struct; +struct msgbuf; +struct user_msghdr; +struct mmsghdr; +struct msqid_ds; +struct new_utsname; +struct nfsctl_arg; +struct __old_kernel_stat; +struct oldold_utsname; +struct old_utsname; +struct pollfd; +struct rlimit; +struct rlimit64; +struct rusage; +struct sched_param; +struct sched_attr; +struct sel_arg_struct; +struct semaphore; +struct sembuf; +struct shmid_ds; +struct sockaddr; +struct stat; +struct stat64; +struct statfs; +struct statfs64; +struct __sysctl_args; +struct sysinfo; +struct timespec; +struct timeval; +struct timex; +struct timezone; +struct tms; +struct utimbuf; +struct mq_attr; +struct compat_stat; +struct compat_timeval; +struct robust_list_head; +struct getcpu_cache; +struct old_linux_dirent; +struct perf_event_attr; +struct file_handle; +struct sigaltstack; +union bpf_attr; + +#endif /* _LINUX_SYSCALL_STRUCTS_H */ diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index c51afb7..7e91d83 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -29,6 +29,10 @@ #define __SC_COMP_3264(_nr, _32, _64, _comp) __SC_3264(_nr, _32, _64) #endif +#ifndef __SC_WRAP +#define __SC_WRAP __SYSCALL +#endif + #define __NR_io_setup 0 __SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup) #define __NR_io_destroy 1 -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 03/23] all: s390: move wrapper infrastructure to generic headers @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel This patch moves required calls to generic files to let other arches use it if needed. Here also, additional code is introduced, as s390 uses asm syscall tables, while in general case, wrappers may be used in C code. __SC_COMPAT_CAST for s390 is too specific due to 31-bit pointer length, so it's moved to arch/s390/include/asm/compat.h. Generic declaration assumes that long, unsigned long and pointer types are all 32-bit length. linux/syscalls_structs.h header is introduced, because from now (see next patch) structure types listed there are needed for both normal and compat mode. cond_syscall_wrapped now defined two symbols: sys_foo() and compat_sys_foo(), if compat wrappers are enabled. Here __SC_WRAP() macro is introduced as well. s390 doesn't need it as it uses asm-generated syscall table. But architectures that generate that tables with C code (ARM64/ILP32) should redefine it as '#define __SC_WRAP(name) compat_##name'. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/s390/include/asm/compat.h | 17 +++++++++-- arch/s390/kernel/compat_wrapper.c | 51 --------------------------------- include/linux/compat.h | 52 +++++++++++++++++++++++++++++++++ include/linux/syscalls.h | 57 +------------------------------------ include/linux/syscalls_structs.h | 60 +++++++++++++++++++++++++++++++++++++++ include/uapi/asm-generic/unistd.h | 4 +++ 6 files changed, 132 insertions(+), 109 deletions(-) create mode 100644 include/linux/syscalls_structs.h diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h index 352f7bd..f412723 100644 --- a/arch/s390/include/asm/compat.h +++ b/arch/s390/include/asm/compat.h @@ -7,13 +7,26 @@ #include <linux/sched.h> #include <linux/thread_info.h> -#define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p(typeof(0?(t)0:0ULL), u64)) - #define __SC_DELOUSE(t,v) ({ \ BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)); \ (t)(__TYPE_IS_PTR(t) ? ((v) & 0x7fffffff) : (v)); \ }) +#define __SC_COMPAT_CAST(t, a) \ +({ \ + long __ReS = a; \ + \ + BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \ + !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t)); \ + if (__TYPE_IS_L(t)) \ + __ReS = (s32)a; \ + if (__TYPE_IS_UL(t)) \ + __ReS = (u32)a; \ + if (__TYPE_IS_PTR(t)) \ + __ReS = a & 0x7fffffff; \ + (t)__ReS; \ +}) + #define PSW32_MASK_PER 0x40000000UL #define PSW32_MASK_DAT 0x04000000UL #define PSW32_MASK_IO 0x02000000UL diff --git a/arch/s390/kernel/compat_wrapper.c b/arch/s390/kernel/compat_wrapper.c index ae2cda5..1614e15 100644 --- a/arch/s390/kernel/compat_wrapper.c +++ b/arch/s390/kernel/compat_wrapper.c @@ -8,57 +8,6 @@ #include <linux/compat.h> #include "entry.h" -#define COMPAT_SYSCALL_WRAP1(name, ...) \ - COMPAT_SYSCALL_WRAPx(1, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP2(name, ...) \ - COMPAT_SYSCALL_WRAPx(2, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP3(name, ...) \ - COMPAT_SYSCALL_WRAPx(3, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP4(name, ...) \ - COMPAT_SYSCALL_WRAPx(4, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP5(name, ...) \ - COMPAT_SYSCALL_WRAPx(5, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP6(name, ...) \ - COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__) - -#define __SC_COMPAT_TYPE(t, a) \ - __typeof(__builtin_choose_expr(sizeof(t) > 4, 0L, (t)0)) a - -#define __SC_COMPAT_CAST(t, a) \ -({ \ - long __ReS = a; \ - \ - BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \ - !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t)); \ - if (__TYPE_IS_L(t)) \ - __ReS = (s32)a; \ - if (__TYPE_IS_UL(t)) \ - __ReS = (u32)a; \ - if (__TYPE_IS_PTR(t)) \ - __ReS = a & 0x7fffffff; \ - (t)__ReS; \ -}) - -/* - * The COMPAT_SYSCALL_WRAP macro generates system call wrappers to be used by - * compat tasks. These wrappers will only be used for system calls where only - * the system call arguments need sign or zero extension or zeroing of the upper - * 33 bits of pointers. - * Note: since the wrapper function will afterwards call a system call which - * again performs zero and sign extension for all system call arguments with - * a size of less than eight bytes, these compat wrappers only touch those - * system call arguments with a size of eight bytes ((unsigned) long and - * pointers). Zero and sign extension for e.g. int parameters will be done by - * the regular system call wrappers. - */ -#define COMPAT_SYSCALL_WRAPx(x, name, ...) \ -asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ -asmlinkage long notrace compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__));\ -asmlinkage long notrace compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) \ -{ \ - return sys##name(__MAP(x,__SC_COMPAT_CAST,__VA_ARGS__)); \ -} - COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); diff --git a/include/linux/compat.h b/include/linux/compat.h index f964ef7..4eba16e 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -30,6 +30,10 @@ #define __SC_DELOUSE(t,v) ((t)(unsigned long)(v)) #endif +#ifndef __TYPE_IS_PTR +#define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p(typeof(0?(t)0:0ULL), u64)) +#endif + #define COMPAT_SYSCALL_DEFINE0(name) \ asmlinkage long compat_sys_##name(void) @@ -739,4 +743,52 @@ static inline bool in_compat_syscall(void) { return false; } #endif /* CONFIG_COMPAT */ +#ifdef CONFIG_COMPAT_WRAPPER + +#define COMPAT_SYSCALL_WRAP1(name, ...) COMPAT_SYSCALL_WRAPx(1, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP2(name, ...) COMPAT_SYSCALL_WRAPx(2, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP3(name, ...) COMPAT_SYSCALL_WRAPx(3, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP4(name, ...) COMPAT_SYSCALL_WRAPx(4, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP5(name, ...) COMPAT_SYSCALL_WRAPx(5, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP6(name, ...) COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__) + +#ifndef __SC_COMPAT_TYPE +#define __SC_COMPAT_TYPE(t, a) \ + __typeof(__builtin_choose_expr(sizeof(t) > 4, 0L, (t)0)) a +#endif + +#ifndef __SC_COMPAT_CAST +#define __SC_COMPAT_CAST(t, a) ({ \ + BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \ + !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t)); \ + ((t) ((t)(-1) < 0 ? (s64)(s32)(a) : (u64)(u32)(a))); \ +}) +#endif + +#ifndef COMPAT_SYSCALL_WRAPx +/* + * The COMPAT_SYSCALL_WRAP macro generates system call wrappers to be used by + * compat tasks. These wrappers will only be used for system calls where only + * the system call arguments need sign or zero extension or zeroing of the upper + * parts of arguments passed in register. + * Note: since the wrapper function will afterwards call a system call which + * again performs zero and sign extension for all system call arguments with + * a size of less than eight bytes, these compat wrappers only touch those + * system call arguments with a size of eight bytes ((unsigned) long and + * pointers). Zero and sign extension for e.g. int parameters will be done by + * the regular system call wrappers. + */ +#define COMPAT_SYSCALL_WRAPx(x, name, ...) \ +asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ +asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) \ + __attribute__((alias(__stringify(compat_SyS##name)))); \ +asmlinkage long notrace compat_SyS##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)); \ +asmlinkage long notrace compat_SyS##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) \ +{ \ + return sys##name(__MAP(x,__SC_COMPAT_CAST,__VA_ARGS__)); \ +} +#endif + +#endif /* CONFIG_COMPAT_WRAPPER */ + #endif /* _LINUX_COMPAT_H */ diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index d795472..9d345eb 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -11,62 +11,7 @@ #ifndef _LINUX_SYSCALLS_H #define _LINUX_SYSCALLS_H -struct epoll_event; -struct iattr; -struct inode; -struct iocb; -struct io_event; -struct iovec; -struct itimerspec; -struct itimerval; -struct kexec_segment; -struct linux_dirent; -struct linux_dirent64; -struct list_head; -struct mmap_arg_struct; -struct msgbuf; -struct user_msghdr; -struct mmsghdr; -struct msqid_ds; -struct new_utsname; -struct nfsctl_arg; -struct __old_kernel_stat; -struct oldold_utsname; -struct old_utsname; -struct pollfd; -struct rlimit; -struct rlimit64; -struct rusage; -struct sched_param; -struct sched_attr; -struct sel_arg_struct; -struct semaphore; -struct sembuf; -struct shmid_ds; -struct sockaddr; -struct stat; -struct stat64; -struct statfs; -struct statfs64; -struct __sysctl_args; -struct sysinfo; -struct timespec; -struct timeval; -struct timex; -struct timezone; -struct tms; -struct utimbuf; -struct mq_attr; -struct compat_stat; -struct compat_timeval; -struct robust_list_head; -struct getcpu_cache; -struct old_linux_dirent; -struct perf_event_attr; -struct file_handle; -struct sigaltstack; -union bpf_attr; - +#include <linux/syscalls_structs.h> #include <linux/types.h> #include <linux/aio_abi.h> #include <linux/capability.h> diff --git a/include/linux/syscalls_structs.h b/include/linux/syscalls_structs.h new file mode 100644 index 0000000..a920cbc --- /dev/null +++ b/include/linux/syscalls_structs.h @@ -0,0 +1,60 @@ +#ifndef _LINUX_SYSCALL_STRUCTS_H +#define _LINUX_SYSCALL_STRUCTS_H + +struct epoll_event; +struct iattr; +struct inode; +struct iocb; +struct io_event; +struct iovec; +struct itimerspec; +struct itimerval; +struct kexec_segment; +struct linux_dirent; +struct linux_dirent64; +struct list_head; +struct mmap_arg_struct; +struct msgbuf; +struct user_msghdr; +struct mmsghdr; +struct msqid_ds; +struct new_utsname; +struct nfsctl_arg; +struct __old_kernel_stat; +struct oldold_utsname; +struct old_utsname; +struct pollfd; +struct rlimit; +struct rlimit64; +struct rusage; +struct sched_param; +struct sched_attr; +struct sel_arg_struct; +struct semaphore; +struct sembuf; +struct shmid_ds; +struct sockaddr; +struct stat; +struct stat64; +struct statfs; +struct statfs64; +struct __sysctl_args; +struct sysinfo; +struct timespec; +struct timeval; +struct timex; +struct timezone; +struct tms; +struct utimbuf; +struct mq_attr; +struct compat_stat; +struct compat_timeval; +struct robust_list_head; +struct getcpu_cache; +struct old_linux_dirent; +struct perf_event_attr; +struct file_handle; +struct sigaltstack; +union bpf_attr; + +#endif /* _LINUX_SYSCALL_STRUCTS_H */ diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index c51afb7..7e91d83 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -29,6 +29,10 @@ #define __SC_COMP_3264(_nr, _32, _64, _comp) __SC_3264(_nr, _32, _64) #endif +#ifndef __SC_WRAP +#define __SC_WRAP __SYSCALL +#endif + #define __NR_io_setup 0 __SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup) #define __NR_io_destroy 1 -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 03/23] all: s390: move wrapper infrastructure to generic headers @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich This patch moves required calls to generic files to let other arches use it if needed. Here also, additional code is introduced, as s390 uses asm syscall tables, while in general case, wrappers may be used in C code. __SC_COMPAT_CAST for s390 is too specific due to 31-bit pointer length, so it's moved to arch/s390/include/asm/compat.h. Generic declaration assumes that long, unsigned long and pointer types are all 32-bit length. linux/syscalls_structs.h header is introduced, because from now (see next patch) structure types listed there are needed for both normal and compat mode. cond_syscall_wrapped now defined two symbols: sys_foo() and compat_sys_foo(), if compat wrappers are enabled. Here __SC_WRAP() macro is introduced as well. s390 doesn't need it as it uses asm-generated syscall table. But architectures that generate that tables with C code (ARM64/ILP32) should redefine it as '#define __SC_WRAP(name) compat_##name'. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/s390/include/asm/compat.h | 17 +++++++++-- arch/s390/kernel/compat_wrapper.c | 51 --------------------------------- include/linux/compat.h | 52 +++++++++++++++++++++++++++++++++ include/linux/syscalls.h | 57 +------------------------------------ include/linux/syscalls_structs.h | 60 +++++++++++++++++++++++++++++++++++++++ include/uapi/asm-generic/unistd.h | 4 +++ 6 files changed, 132 insertions(+), 109 deletions(-) create mode 100644 include/linux/syscalls_structs.h diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h index 352f7bd..f412723 100644 --- a/arch/s390/include/asm/compat.h +++ b/arch/s390/include/asm/compat.h @@ -7,13 +7,26 @@ #include <linux/sched.h> #include <linux/thread_info.h> -#define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p(typeof(0?(t)0:0ULL), u64)) - #define __SC_DELOUSE(t,v) ({ \ BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)); \ (t)(__TYPE_IS_PTR(t) ? ((v) & 0x7fffffff) : (v)); \ }) +#define __SC_COMPAT_CAST(t, a) \ +({ \ + long __ReS = a; \ + \ + BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \ + !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t)); \ + if (__TYPE_IS_L(t)) \ + __ReS = (s32)a; \ + if (__TYPE_IS_UL(t)) \ + __ReS = (u32)a; \ + if (__TYPE_IS_PTR(t)) \ + __ReS = a & 0x7fffffff; \ + (t)__ReS; \ +}) + #define PSW32_MASK_PER 0x40000000UL #define PSW32_MASK_DAT 0x04000000UL #define PSW32_MASK_IO 0x02000000UL diff --git a/arch/s390/kernel/compat_wrapper.c b/arch/s390/kernel/compat_wrapper.c index ae2cda5..1614e15 100644 --- a/arch/s390/kernel/compat_wrapper.c +++ b/arch/s390/kernel/compat_wrapper.c @@ -8,57 +8,6 @@ #include <linux/compat.h> #include "entry.h" -#define COMPAT_SYSCALL_WRAP1(name, ...) \ - COMPAT_SYSCALL_WRAPx(1, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP2(name, ...) \ - COMPAT_SYSCALL_WRAPx(2, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP3(name, ...) \ - COMPAT_SYSCALL_WRAPx(3, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP4(name, ...) \ - COMPAT_SYSCALL_WRAPx(4, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP5(name, ...) \ - COMPAT_SYSCALL_WRAPx(5, _##name, __VA_ARGS__) -#define COMPAT_SYSCALL_WRAP6(name, ...) \ - COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__) - -#define __SC_COMPAT_TYPE(t, a) \ - __typeof(__builtin_choose_expr(sizeof(t) > 4, 0L, (t)0)) a - -#define __SC_COMPAT_CAST(t, a) \ -({ \ - long __ReS = a; \ - \ - BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \ - !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t)); \ - if (__TYPE_IS_L(t)) \ - __ReS = (s32)a; \ - if (__TYPE_IS_UL(t)) \ - __ReS = (u32)a; \ - if (__TYPE_IS_PTR(t)) \ - __ReS = a & 0x7fffffff; \ - (t)__ReS; \ -}) - -/* - * The COMPAT_SYSCALL_WRAP macro generates system call wrappers to be used by - * compat tasks. These wrappers will only be used for system calls where only - * the system call arguments need sign or zero extension or zeroing of the upper - * 33 bits of pointers. - * Note: since the wrapper function will afterwards call a system call which - * again performs zero and sign extension for all system call arguments with - * a size of less than eight bytes, these compat wrappers only touch those - * system call arguments with a size of eight bytes ((unsigned) long and - * pointers). Zero and sign extension for e.g. int parameters will be done by - * the regular system call wrappers. - */ -#define COMPAT_SYSCALL_WRAPx(x, name, ...) \ -asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ -asmlinkage long notrace compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__));\ -asmlinkage long notrace compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) \ -{ \ - return sys##name(__MAP(x,__SC_COMPAT_CAST,__VA_ARGS__)); \ -} - COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); diff --git a/include/linux/compat.h b/include/linux/compat.h index f964ef7..4eba16e 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -30,6 +30,10 @@ #define __SC_DELOUSE(t,v) ((t)(unsigned long)(v)) #endif +#ifndef __TYPE_IS_PTR +#define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p(typeof(0?(t)0:0ULL), u64)) +#endif + #define COMPAT_SYSCALL_DEFINE0(name) \ asmlinkage long compat_sys_##name(void) @@ -739,4 +743,52 @@ static inline bool in_compat_syscall(void) { return false; } #endif /* CONFIG_COMPAT */ +#ifdef CONFIG_COMPAT_WRAPPER + +#define COMPAT_SYSCALL_WRAP1(name, ...) COMPAT_SYSCALL_WRAPx(1, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP2(name, ...) COMPAT_SYSCALL_WRAPx(2, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP3(name, ...) COMPAT_SYSCALL_WRAPx(3, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP4(name, ...) COMPAT_SYSCALL_WRAPx(4, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP5(name, ...) COMPAT_SYSCALL_WRAPx(5, _##name, __VA_ARGS__) +#define COMPAT_SYSCALL_WRAP6(name, ...) COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__) + +#ifndef __SC_COMPAT_TYPE +#define __SC_COMPAT_TYPE(t, a) \ + __typeof(__builtin_choose_expr(sizeof(t) > 4, 0L, (t)0)) a +#endif + +#ifndef __SC_COMPAT_CAST +#define __SC_COMPAT_CAST(t, a) ({ \ + BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \ + !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t)); \ + ((t) ((t)(-1) < 0 ? (s64)(s32)(a) : (u64)(u32)(a))); \ +}) +#endif + +#ifndef COMPAT_SYSCALL_WRAPx +/* + * The COMPAT_SYSCALL_WRAP macro generates system call wrappers to be used by + * compat tasks. These wrappers will only be used for system calls where only + * the system call arguments need sign or zero extension or zeroing of the upper + * parts of arguments passed in register. + * Note: since the wrapper function will afterwards call a system call which + * again performs zero and sign extension for all system call arguments with + * a size of less than eight bytes, these compat wrappers only touch those + * system call arguments with a size of eight bytes ((unsigned) long and + * pointers). Zero and sign extension for e.g. int parameters will be done by + * the regular system call wrappers. + */ +#define COMPAT_SYSCALL_WRAPx(x, name, ...) \ +asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ +asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) \ + __attribute__((alias(__stringify(compat_SyS##name)))); \ +asmlinkage long notrace compat_SyS##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)); \ +asmlinkage long notrace compat_SyS##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) \ +{ \ + return sys##name(__MAP(x,__SC_COMPAT_CAST,__VA_ARGS__)); \ +} +#endif + +#endif /* CONFIG_COMPAT_WRAPPER */ + #endif /* _LINUX_COMPAT_H */ diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index d795472..9d345eb 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -11,62 +11,7 @@ #ifndef _LINUX_SYSCALLS_H #define _LINUX_SYSCALLS_H -struct epoll_event; -struct iattr; -struct inode; -struct iocb; -struct io_event; -struct iovec; -struct itimerspec; -struct itimerval; -struct kexec_segment; -struct linux_dirent; -struct linux_dirent64; -struct list_head; -struct mmap_arg_struct; -struct msgbuf; -struct user_msghdr; -struct mmsghdr; -struct msqid_ds; -struct new_utsname; -struct nfsctl_arg; -struct __old_kernel_stat; -struct oldold_utsname; -struct old_utsname; -struct pollfd; -struct rlimit; -struct rlimit64; -struct rusage; -struct sched_param; -struct sched_attr; -struct sel_arg_struct; -struct semaphore; -struct sembuf; -struct shmid_ds; -struct sockaddr; -struct stat; -struct stat64; -struct statfs; -struct statfs64; -struct __sysctl_args; -struct sysinfo; -struct timespec; -struct timeval; -struct timex; -struct timezone; -struct tms; -struct utimbuf; -struct mq_attr; -struct compat_stat; -struct compat_timeval; -struct robust_list_head; -struct getcpu_cache; -struct old_linux_dirent; -struct perf_event_attr; -struct file_handle; -struct sigaltstack; -union bpf_attr; - +#include <linux/syscalls_structs.h> #include <linux/types.h> #include <linux/aio_abi.h> #include <linux/capability.h> diff --git a/include/linux/syscalls_structs.h b/include/linux/syscalls_structs.h new file mode 100644 index 0000000..a920cbc --- /dev/null +++ b/include/linux/syscalls_structs.h @@ -0,0 +1,60 @@ +#ifndef _LINUX_SYSCALL_STRUCTS_H +#define _LINUX_SYSCALL_STRUCTS_H + +struct epoll_event; +struct iattr; +struct inode; +struct iocb; +struct io_event; +struct iovec; +struct itimerspec; +struct itimerval; +struct kexec_segment; +struct linux_dirent; +struct linux_dirent64; +struct list_head; +struct mmap_arg_struct; +struct msgbuf; +struct user_msghdr; +struct mmsghdr; +struct msqid_ds; +struct new_utsname; +struct nfsctl_arg; +struct __old_kernel_stat; +struct oldold_utsname; +struct old_utsname; +struct pollfd; +struct rlimit; +struct rlimit64; +struct rusage; +struct sched_param; +struct sched_attr; +struct sel_arg_struct; +struct semaphore; +struct sembuf; +struct shmid_ds; +struct sockaddr; +struct stat; +struct stat64; +struct statfs; +struct statfs64; +struct __sysctl_args; +struct sysinfo; +struct timespec; +struct timeval; +struct timex; +struct timezone; +struct tms; +struct utimbuf; +struct mq_attr; +struct compat_stat; +struct compat_timeval; +struct robust_list_head; +struct getcpu_cache; +struct old_linux_dirent; +struct perf_event_attr; +struct file_handle; +struct sigaltstack; +union bpf_attr; + +#endif /* _LINUX_SYSCALL_STRUCTS_H */ diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index c51afb7..7e91d83 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -29,6 +29,10 @@ #define __SC_COMP_3264(_nr, _32, _64, _comp) __SC_3264(_nr, _32, _64) #endif +#ifndef __SC_WRAP +#define __SC_WRAP __SYSCALL +#endif + #define __NR_io_setup 0 __SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup) #define __NR_io_destroy 1 -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 04/23] all: s390: move compat_wrappers.c from arch/s390/kernel to kernel/ 2016-05-24 0:04 ` Yury Norov (?) (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Some syscalls are declared conditionally, so corresponding wrappers are conditional accordingly. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/s390/kernel/Makefile | 2 +- arch/s390/kernel/compat_linux.c | 4 + arch/s390/kernel/compat_wrapper.c | 129 ---------------------------- kernel/Makefile | 1 + kernel/compat_wrapper.c | 175 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 181 insertions(+), 130 deletions(-) delete mode 100644 arch/s390/kernel/compat_wrapper.c create mode 100644 kernel/compat_wrapper.c diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 2f5586a..145d3d8 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile @@ -57,7 +57,7 @@ obj-$(CONFIG_HIBERNATION) += suspend.o swsusp.o obj-$(CONFIG_AUDIT) += audit.o compat-obj-$(CONFIG_AUDIT) += compat_audit.o obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o -obj-$(CONFIG_COMPAT) += compat_wrapper.o $(compat-obj-y) +obj-$(CONFIG_COMPAT) += $(compat-obj-y) obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_KPROBES) += kprobes.o diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 437e611..783c208 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c @@ -86,6 +86,10 @@ #define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid) #define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid) +COMPAT_SYSCALL_WRAP3(s390_pci_mmio_write, const unsigned long, mmio_addr, const void __user *, user_buffer, const size_t, length); + +COMPAT_SYSCALL_WRAP3(s390_pci_mmio_read, const unsigned long, mmio_addr, void __user *, user_buffer, const size_t, length); + COMPAT_SYSCALL_DEFINE3(s390_chown16, const char __user *, filename, u16, user, u16, group) { diff --git a/arch/s390/kernel/compat_wrapper.c b/arch/s390/kernel/compat_wrapper.c deleted file mode 100644 index 1614e15..0000000 --- a/arch/s390/kernel/compat_wrapper.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Compat system call wrappers. - * - * Copyright IBM Corp. 2014 - */ - -#include <linux/syscalls.h> -#include <linux/compat.h> -#include "entry.h" - -COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); -COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); -COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename); -COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev); -COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode); -COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name); -COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode); -COMPAT_SYSCALL_WRAP2(rename, const char __user *, oldname, const char __user *, newname); -COMPAT_SYSCALL_WRAP2(mkdir, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP1(rmdir, const char __user *, pathname); -COMPAT_SYSCALL_WRAP1(pipe, int __user *, fildes); -COMPAT_SYSCALL_WRAP1(brk, unsigned long, brk); -COMPAT_SYSCALL_WRAP2(signal, int, sig, __sighandler_t, handler); -COMPAT_SYSCALL_WRAP1(acct, const char __user *, name); -COMPAT_SYSCALL_WRAP2(umount, char __user *, name, int, flags); -COMPAT_SYSCALL_WRAP1(chroot, const char __user *, filename); -COMPAT_SYSCALL_WRAP3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask); -COMPAT_SYSCALL_WRAP2(sethostname, char __user *, name, int, len); -COMPAT_SYSCALL_WRAP2(symlink, const char __user *, old, const char __user *, new); -COMPAT_SYSCALL_WRAP3(readlink, const char __user *, path, char __user *, buf, int, bufsiz); -COMPAT_SYSCALL_WRAP1(uselib, const char __user *, library); -COMPAT_SYSCALL_WRAP2(swapon, const char __user *, specialfile, int, swap_flags); -COMPAT_SYSCALL_WRAP4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg); -COMPAT_SYSCALL_WRAP2(munmap, unsigned long, addr, size_t, len); -COMPAT_SYSCALL_WRAP3(syslog, int, type, char __user *, buf, int, len); -COMPAT_SYSCALL_WRAP1(swapoff, const char __user *, specialfile); -COMPAT_SYSCALL_WRAP2(setdomainname, char __user *, name, int, len); -COMPAT_SYSCALL_WRAP1(newuname, struct new_utsname __user *, name); -COMPAT_SYSCALL_WRAP3(mprotect, unsigned long, start, size_t, len, unsigned long, prot); -COMPAT_SYSCALL_WRAP3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs); -COMPAT_SYSCALL_WRAP2(delete_module, const char __user *, name_user, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr); -COMPAT_SYSCALL_WRAP2(bdflush, int, func, long, data); -COMPAT_SYSCALL_WRAP3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2); -COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence); -COMPAT_SYSCALL_WRAP3(msync, unsigned long, start, size_t, len, int, flags); -COMPAT_SYSCALL_WRAP2(mlock, unsigned long, start, size_t, len); -COMPAT_SYSCALL_WRAP2(munlock, unsigned long, start, size_t, len); -COMPAT_SYSCALL_WRAP2(sched_setparam, pid_t, pid, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP2(sched_getparam, pid_t, pid, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP5(mremap, unsigned long, addr, unsigned long, old_len, unsigned long, new_len, unsigned long, flags, unsigned long, new_addr); -COMPAT_SYSCALL_WRAP3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout); -COMPAT_SYSCALL_WRAP5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5); -COMPAT_SYSCALL_WRAP2(getcwd, char __user *, buf, unsigned long, size); -COMPAT_SYSCALL_WRAP2(capget, cap_user_header_t, header, cap_user_data_t, dataptr); -COMPAT_SYSCALL_WRAP2(capset, cap_user_header_t, header, const cap_user_data_t, data); -COMPAT_SYSCALL_WRAP3(lchown, const char __user *, filename, uid_t, user, gid_t, group); -COMPAT_SYSCALL_WRAP2(getgroups, int, gidsetsize, gid_t __user *, grouplist); -COMPAT_SYSCALL_WRAP2(setgroups, int, gidsetsize, gid_t __user *, grouplist); -COMPAT_SYSCALL_WRAP3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid); -COMPAT_SYSCALL_WRAP3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid); -COMPAT_SYSCALL_WRAP3(chown, const char __user *, filename, uid_t, user, gid_t, group); -COMPAT_SYSCALL_WRAP2(pivot_root, const char __user *, new_root, const char __user *, put_old); -COMPAT_SYSCALL_WRAP3(mincore, unsigned long, start, size_t, len, unsigned char __user *, vec); -COMPAT_SYSCALL_WRAP3(madvise, unsigned long, start, size_t, len, int, behavior); -COMPAT_SYSCALL_WRAP5(setxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP5(lsetxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP5(fsetxattr, int, fd, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP3(getdents64, unsigned int, fd, struct linux_dirent64 __user *, dirent, unsigned int, count); -COMPAT_SYSCALL_WRAP4(getxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP4(lgetxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP4(fgetxattr, int, fd, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP3(listxattr, const char __user *, path, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP3(llistxattr, const char __user *, path, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP3(flistxattr, int, fd, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP2(removexattr, const char __user *, path, const char __user *, name); -COMPAT_SYSCALL_WRAP2(lremovexattr, const char __user *, path, const char __user *, name); -COMPAT_SYSCALL_WRAP2(fremovexattr, int, fd, const char __user *, name); -COMPAT_SYSCALL_WRAP1(set_tid_address, int __user *, tidptr); -COMPAT_SYSCALL_WRAP4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event); -COMPAT_SYSCALL_WRAP4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout); -COMPAT_SYSCALL_WRAP1(io_destroy, aio_context_t, ctx); -COMPAT_SYSCALL_WRAP3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, struct io_event __user *, result); -COMPAT_SYSCALL_WRAP1(mq_unlink, const char __user *, name); -COMPAT_SYSCALL_WRAP5(add_key, const char __user *, tp, const char __user *, dsc, const void __user *, pld, size_t, len, key_serial_t, id); -COMPAT_SYSCALL_WRAP4(request_key, const char __user *, tp, const char __user *, dsc, const char __user *, info, key_serial_t, id); -COMPAT_SYSCALL_WRAP5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long, prot, unsigned long, pgoff, unsigned long, flags); -COMPAT_SYSCALL_WRAP3(inotify_add_watch, int, fd, const char __user *, path, u32, mask); -COMPAT_SYSCALL_WRAP3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev); -COMPAT_SYSCALL_WRAP5(fchownat, int, dfd, const char __user *, filename, uid_t, user, gid_t, group, int, flag); -COMPAT_SYSCALL_WRAP3(unlinkat, int, dfd, const char __user *, pathname, int, flag); -COMPAT_SYSCALL_WRAP4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname); -COMPAT_SYSCALL_WRAP5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags); -COMPAT_SYSCALL_WRAP3(symlinkat, const char __user *, oldname, int, newdfd, const char __user *, newname); -COMPAT_SYSCALL_WRAP4(readlinkat, int, dfd, const char __user *, path, char __user *, buf, int, bufsiz); -COMPAT_SYSCALL_WRAP3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode); -COMPAT_SYSCALL_WRAP3(faccessat, int, dfd, const char __user *, filename, int, mode); -COMPAT_SYSCALL_WRAP1(unshare, unsigned long, unshare_flags); -COMPAT_SYSCALL_WRAP6(splice, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags); -COMPAT_SYSCALL_WRAP3(getcpu, unsigned __user *, cpu, unsigned __user *, node, struct getcpu_cache __user *, cache); -COMPAT_SYSCALL_WRAP2(pipe2, int __user *, fildes, int, flags); -COMPAT_SYSCALL_WRAP5(perf_event_open, struct perf_event_attr __user *, attr_uptr, pid_t, pid, int, cpu, int, group_fd, unsigned long, flags); -COMPAT_SYSCALL_WRAP5(clone, unsigned long, newsp, unsigned long, clone_flags, int __user *, parent_tidptr, int __user *, child_tidptr, unsigned long, tls); -COMPAT_SYSCALL_WRAP4(prlimit64, pid_t, pid, unsigned int, resource, const struct rlimit64 __user *, new_rlim, struct rlimit64 __user *, old_rlim); -COMPAT_SYSCALL_WRAP5(name_to_handle_at, int, dfd, const char __user *, name, struct file_handle __user *, handle, int __user *, mnt_id, int, flag); -COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2); -COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags); -COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags); -COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags); -COMPAT_SYSCALL_WRAP3(seccomp, unsigned int, op, unsigned int, flags, const char __user *, uargs) -COMPAT_SYSCALL_WRAP3(getrandom, char __user *, buf, size_t, count, unsigned int, flags) -COMPAT_SYSCALL_WRAP2(memfd_create, const char __user *, uname, unsigned int, flags) -COMPAT_SYSCALL_WRAP3(bpf, int, cmd, union bpf_attr *, attr, unsigned int, size); -COMPAT_SYSCALL_WRAP3(s390_pci_mmio_write, const unsigned long, mmio_addr, const void __user *, user_buffer, const size_t, length); -COMPAT_SYSCALL_WRAP3(s390_pci_mmio_read, const unsigned long, mmio_addr, void __user *, user_buffer, const size_t, length); -COMPAT_SYSCALL_WRAP4(socketpair, int, family, int, type, int, protocol, int __user *, usockvec); -COMPAT_SYSCALL_WRAP3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen); -COMPAT_SYSCALL_WRAP3(connect, int, fd, struct sockaddr __user *, uservaddr, int, addrlen); -COMPAT_SYSCALL_WRAP4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, int __user *, upeer_addrlen, int, flags); -COMPAT_SYSCALL_WRAP3(getsockname, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); -COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); -COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); -COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); -COMPAT_SYSCALL_WRAP6(copy_file_range, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); diff --git a/kernel/Makefile b/kernel/Makefile index f0c40bf..882eec03 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -64,6 +64,7 @@ obj-$(CONFIG_KEXEC) += kexec.o obj-$(CONFIG_KEXEC_FILE) += kexec_file.o obj-$(CONFIG_BACKTRACE_SELF_TEST) += backtracetest.o obj-$(CONFIG_COMPAT) += compat.o +obj-$(CONFIG_COMPAT_WRAPPER) += compat_wrapper.o obj-$(CONFIG_CGROUPS) += cgroup.o obj-$(CONFIG_CGROUP_FREEZER) += cgroup_freezer.o obj-$(CONFIG_CGROUP_PIDS) += cgroup_pids.o diff --git a/kernel/compat_wrapper.c b/kernel/compat_wrapper.c new file mode 100644 index 0000000..b6c050e --- /dev/null +++ b/kernel/compat_wrapper.c @@ -0,0 +1,175 @@ +/* + * Compat system call wrappers. + * + * Copyright IBM Corp. 2014 + */ + +#include <linux/syscalls.h> +#include <linux/compat.h> + +COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); +COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); +COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename); +COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev); +COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode); + +#ifdef __ARCH_WANT_SYS_OLDUMOUNT +COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name); +#endif + +COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode); +COMPAT_SYSCALL_WRAP2(rename, const char __user *, oldname, const char __user *, newname); +COMPAT_SYSCALL_WRAP2(mkdir, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP1(rmdir, const char __user *, pathname); +COMPAT_SYSCALL_WRAP1(pipe, int __user *, fildes); +COMPAT_SYSCALL_WRAP1(brk, unsigned long, brk); + +#ifdef __ARCH_WANT_SYS_SIGNAL +COMPAT_SYSCALL_WRAP2(signal, int, sig, __sighandler_t, handler); +#endif + +COMPAT_SYSCALL_WRAP1(acct, const char __user *, name); +COMPAT_SYSCALL_WRAP2(umount, char __user *, name, int, flags); +COMPAT_SYSCALL_WRAP1(chroot, const char __user *, filename); + +#ifdef CONFIG_OLD_SIGSUSPEND +SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask); +#endif + +#ifdef CONFIG_OLD_SIGSUSPEND3 +COMPAT_SYSCALL_WRAP3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask); +#endif + +COMPAT_SYSCALL_WRAP2(sethostname, char __user *, name, int, len); +COMPAT_SYSCALL_WRAP2(symlink, const char __user *, old, const char __user *, new); +COMPAT_SYSCALL_WRAP3(readlink, const char __user *, path, char __user *, buf, int, bufsiz); +COMPAT_SYSCALL_WRAP1(uselib, const char __user *, library); +COMPAT_SYSCALL_WRAP2(swapon, const char __user *, specialfile, int, swap_flags); +COMPAT_SYSCALL_WRAP4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg); +COMPAT_SYSCALL_WRAP2(munmap, unsigned long, addr, size_t, len); +COMPAT_SYSCALL_WRAP3(syslog, int, type, char __user *, buf, int, len); +COMPAT_SYSCALL_WRAP1(swapoff, const char __user *, specialfile); +COMPAT_SYSCALL_WRAP2(setdomainname, char __user *, name, int, len); +COMPAT_SYSCALL_WRAP1(newuname, struct new_utsname __user *, name); +COMPAT_SYSCALL_WRAP3(mprotect, unsigned long, start, size_t, len, unsigned long, prot); +COMPAT_SYSCALL_WRAP3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs); +COMPAT_SYSCALL_WRAP2(delete_module, const char __user *, name_user, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr); +COMPAT_SYSCALL_WRAP2(bdflush, int, func, long, data); +COMPAT_SYSCALL_WRAP3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2); + +#ifdef __ARCH_WANT_SYS_LLSEEK +COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence); +#endif + +COMPAT_SYSCALL_WRAP3(msync, unsigned long, start, size_t, len, int, flags); +COMPAT_SYSCALL_WRAP2(mlock, unsigned long, start, size_t, len); +COMPAT_SYSCALL_WRAP2(munlock, unsigned long, start, size_t, len); +COMPAT_SYSCALL_WRAP2(sched_setparam, pid_t, pid, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP2(sched_getparam, pid_t, pid, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP5(mremap, unsigned long, addr, unsigned long, old_len, unsigned long, new_len, unsigned long, flags, unsigned long, new_addr); +COMPAT_SYSCALL_WRAP3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout); +COMPAT_SYSCALL_WRAP5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5); +COMPAT_SYSCALL_WRAP2(getcwd, char __user *, buf, unsigned long, size); +COMPAT_SYSCALL_WRAP2(capget, cap_user_header_t, header, cap_user_data_t, dataptr); +COMPAT_SYSCALL_WRAP2(capset, cap_user_header_t, header, const cap_user_data_t, data); +COMPAT_SYSCALL_WRAP3(lchown, const char __user *, filename, uid_t, user, gid_t, group); +COMPAT_SYSCALL_WRAP2(getgroups, int, gidsetsize, gid_t __user *, grouplist); +COMPAT_SYSCALL_WRAP2(setgroups, int, gidsetsize, gid_t __user *, grouplist); +COMPAT_SYSCALL_WRAP3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid); +COMPAT_SYSCALL_WRAP3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid); +COMPAT_SYSCALL_WRAP3(chown, const char __user *, filename, uid_t, user, gid_t, group); +COMPAT_SYSCALL_WRAP2(pivot_root, const char __user *, new_root, const char __user *, put_old); +COMPAT_SYSCALL_WRAP3(mincore, unsigned long, start, size_t, len, unsigned char __user *, vec); +COMPAT_SYSCALL_WRAP3(madvise, unsigned long, start, size_t, len, int, behavior); +COMPAT_SYSCALL_WRAP5(setxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); +COMPAT_SYSCALL_WRAP5(lsetxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); +COMPAT_SYSCALL_WRAP5(fsetxattr, int, fd, const char __user *, name, const void __user *, value, size_t, size, int, flags); + +#ifndef __ARCH_WANT_COMPAT_SYS_GETDENTS64 +COMPAT_SYSCALL_WRAP3(getdents64, unsigned int, fd, struct linux_dirent64 __user *, dirent, unsigned int, count); +#endif + +COMPAT_SYSCALL_WRAP4(getxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP4(lgetxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP4(fgetxattr, int, fd, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP3(listxattr, const char __user *, path, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP3(llistxattr, const char __user *, path, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP3(flistxattr, int, fd, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP2(removexattr, const char __user *, path, const char __user *, name); +COMPAT_SYSCALL_WRAP2(lremovexattr, const char __user *, path, const char __user *, name); +COMPAT_SYSCALL_WRAP2(fremovexattr, int, fd, const char __user *, name); +COMPAT_SYSCALL_WRAP1(set_tid_address, int __user *, tidptr); +COMPAT_SYSCALL_WRAP4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event); +COMPAT_SYSCALL_WRAP4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout); +COMPAT_SYSCALL_WRAP1(io_destroy, aio_context_t, ctx); +COMPAT_SYSCALL_WRAP3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, struct io_event __user *, result); +COMPAT_SYSCALL_WRAP1(mq_unlink, const char __user *, name); +COMPAT_SYSCALL_WRAP5(add_key, const char __user *, tp, const char __user *, dsc, const void __user *, pld, size_t, len, key_serial_t, id); +COMPAT_SYSCALL_WRAP4(request_key, const char __user *, tp, const char __user *, dsc, const char __user *, info, key_serial_t, id); +COMPAT_SYSCALL_WRAP5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long, prot, unsigned long, pgoff, unsigned long, flags); +COMPAT_SYSCALL_WRAP3(inotify_add_watch, int, fd, const char __user *, path, u32, mask); +COMPAT_SYSCALL_WRAP3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev); +COMPAT_SYSCALL_WRAP5(fchownat, int, dfd, const char __user *, filename, uid_t, user, gid_t, group, int, flag); +COMPAT_SYSCALL_WRAP3(unlinkat, int, dfd, const char __user *, pathname, int, flag); +COMPAT_SYSCALL_WRAP4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname); +COMPAT_SYSCALL_WRAP5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags); +COMPAT_SYSCALL_WRAP3(symlinkat, const char __user *, oldname, int, newdfd, const char __user *, newname); +COMPAT_SYSCALL_WRAP4(readlinkat, int, dfd, const char __user *, path, char __user *, buf, int, bufsiz); +COMPAT_SYSCALL_WRAP3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode); +COMPAT_SYSCALL_WRAP3(faccessat, int, dfd, const char __user *, filename, int, mode); +COMPAT_SYSCALL_WRAP1(unshare, unsigned long, unshare_flags); +COMPAT_SYSCALL_WRAP6(splice, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags); +COMPAT_SYSCALL_WRAP3(getcpu, unsigned __user *, cpu, unsigned __user *, node, struct getcpu_cache __user *, cache); +COMPAT_SYSCALL_WRAP2(pipe2, int __user *, fildes, int, flags); +COMPAT_SYSCALL_WRAP5(perf_event_open, struct perf_event_attr __user *, attr_uptr, pid_t, pid, int, cpu, int, group_fd, unsigned long, flags); + +#ifdef __ARCH_WANT_SYS_CLONE +#ifdef CONFIG_CLONE_BACKWARDS +COMPAT_SYSCALL_WRAP5(clone, unsigned long, clone_flags, unsigned long, newsp, + int __user *, parent_tidptr, + unsigned long, tls, + int __user *, child_tidptr); +#elif defined(CONFIG_CLONE_BACKWARDS2) + COMPAT_SYSCALL_WRAP5(clone, unsigned long, newsp, unsigned long, clone_flags, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#elif defined(CONFIG_CLONE_BACKWARDS3) + COMPAT_SYSCALL_WRAP6(clone, unsigned long, clone_flags, unsigned long, newsp, + int, stack_size, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#else +COMPAT_SYSCALL_WRAP5(clone, unsigned long, clone_flags, unsigned long, newsp, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#endif +#endif + +COMPAT_SYSCALL_WRAP4(prlimit64, pid_t, pid, unsigned int, resource, const struct rlimit64 __user *, new_rlim, struct rlimit64 __user *, old_rlim); +COMPAT_SYSCALL_WRAP5(name_to_handle_at, int, dfd, const char __user *, name, struct file_handle __user *, handle, int __user *, mnt_id, int, flag); +COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2); +COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags); +COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags); +COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags); +COMPAT_SYSCALL_WRAP3(seccomp, unsigned int, op, unsigned int, flags, const char __user *, uargs) +COMPAT_SYSCALL_WRAP3(getrandom, char __user *, buf, size_t, count, unsigned int, flags) +COMPAT_SYSCALL_WRAP2(memfd_create, const char __user *, uname, unsigned int, flags) +COMPAT_SYSCALL_WRAP3(bpf, int, cmd, union bpf_attr *, attr, unsigned int, size); +COMPAT_SYSCALL_WRAP4(socketpair, int, family, int, type, int, protocol, int __user *, usockvec); +COMPAT_SYSCALL_WRAP3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen); +COMPAT_SYSCALL_WRAP3(connect, int, fd, struct sockaddr __user *, uservaddr, int, addrlen); +COMPAT_SYSCALL_WRAP4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, int __user *, upeer_addrlen, int, flags); +COMPAT_SYSCALL_WRAP3(getsockname, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); +COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); +COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); +COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); +COMPAT_SYSCALL_WRAP6(copy_file_range, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 04/23] all: s390: move compat_wrappers.c from arch/s390/kernel to kernel/ @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel Some syscalls are declared conditionally, so corresponding wrappers are conditional accordingly. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/s390/kernel/Makefile | 2 +- arch/s390/kernel/compat_linux.c | 4 + arch/s390/kernel/compat_wrapper.c | 129 ---------------------------- kernel/Makefile | 1 + kernel/compat_wrapper.c | 175 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 181 insertions(+), 130 deletions(-) delete mode 100644 arch/s390/kernel/compat_wrapper.c create mode 100644 kernel/compat_wrapper.c diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 2f5586a..145d3d8 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile @@ -57,7 +57,7 @@ obj-$(CONFIG_HIBERNATION) += suspend.o swsusp.o obj-$(CONFIG_AUDIT) += audit.o compat-obj-$(CONFIG_AUDIT) += compat_audit.o obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o -obj-$(CONFIG_COMPAT) += compat_wrapper.o $(compat-obj-y) +obj-$(CONFIG_COMPAT) += $(compat-obj-y) obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_KPROBES) += kprobes.o diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 437e611..783c208 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c @@ -86,6 +86,10 @@ #define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid) #define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid) +COMPAT_SYSCALL_WRAP3(s390_pci_mmio_write, const unsigned long, mmio_addr, const void __user *, user_buffer, const size_t, length); + +COMPAT_SYSCALL_WRAP3(s390_pci_mmio_read, const unsigned long, mmio_addr, void __user *, user_buffer, const size_t, length); + COMPAT_SYSCALL_DEFINE3(s390_chown16, const char __user *, filename, u16, user, u16, group) { diff --git a/arch/s390/kernel/compat_wrapper.c b/arch/s390/kernel/compat_wrapper.c deleted file mode 100644 index 1614e15..0000000 --- a/arch/s390/kernel/compat_wrapper.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Compat system call wrappers. - * - * Copyright IBM Corp. 2014 - */ - -#include <linux/syscalls.h> -#include <linux/compat.h> -#include "entry.h" - -COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); -COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); -COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename); -COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev); -COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode); -COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name); -COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode); -COMPAT_SYSCALL_WRAP2(rename, const char __user *, oldname, const char __user *, newname); -COMPAT_SYSCALL_WRAP2(mkdir, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP1(rmdir, const char __user *, pathname); -COMPAT_SYSCALL_WRAP1(pipe, int __user *, fildes); -COMPAT_SYSCALL_WRAP1(brk, unsigned long, brk); -COMPAT_SYSCALL_WRAP2(signal, int, sig, __sighandler_t, handler); -COMPAT_SYSCALL_WRAP1(acct, const char __user *, name); -COMPAT_SYSCALL_WRAP2(umount, char __user *, name, int, flags); -COMPAT_SYSCALL_WRAP1(chroot, const char __user *, filename); -COMPAT_SYSCALL_WRAP3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask); -COMPAT_SYSCALL_WRAP2(sethostname, char __user *, name, int, len); -COMPAT_SYSCALL_WRAP2(symlink, const char __user *, old, const char __user *, new); -COMPAT_SYSCALL_WRAP3(readlink, const char __user *, path, char __user *, buf, int, bufsiz); -COMPAT_SYSCALL_WRAP1(uselib, const char __user *, library); -COMPAT_SYSCALL_WRAP2(swapon, const char __user *, specialfile, int, swap_flags); -COMPAT_SYSCALL_WRAP4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg); -COMPAT_SYSCALL_WRAP2(munmap, unsigned long, addr, size_t, len); -COMPAT_SYSCALL_WRAP3(syslog, int, type, char __user *, buf, int, len); -COMPAT_SYSCALL_WRAP1(swapoff, const char __user *, specialfile); -COMPAT_SYSCALL_WRAP2(setdomainname, char __user *, name, int, len); -COMPAT_SYSCALL_WRAP1(newuname, struct new_utsname __user *, name); -COMPAT_SYSCALL_WRAP3(mprotect, unsigned long, start, size_t, len, unsigned long, prot); -COMPAT_SYSCALL_WRAP3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs); -COMPAT_SYSCALL_WRAP2(delete_module, const char __user *, name_user, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr); -COMPAT_SYSCALL_WRAP2(bdflush, int, func, long, data); -COMPAT_SYSCALL_WRAP3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2); -COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence); -COMPAT_SYSCALL_WRAP3(msync, unsigned long, start, size_t, len, int, flags); -COMPAT_SYSCALL_WRAP2(mlock, unsigned long, start, size_t, len); -COMPAT_SYSCALL_WRAP2(munlock, unsigned long, start, size_t, len); -COMPAT_SYSCALL_WRAP2(sched_setparam, pid_t, pid, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP2(sched_getparam, pid_t, pid, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP5(mremap, unsigned long, addr, unsigned long, old_len, unsigned long, new_len, unsigned long, flags, unsigned long, new_addr); -COMPAT_SYSCALL_WRAP3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout); -COMPAT_SYSCALL_WRAP5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5); -COMPAT_SYSCALL_WRAP2(getcwd, char __user *, buf, unsigned long, size); -COMPAT_SYSCALL_WRAP2(capget, cap_user_header_t, header, cap_user_data_t, dataptr); -COMPAT_SYSCALL_WRAP2(capset, cap_user_header_t, header, const cap_user_data_t, data); -COMPAT_SYSCALL_WRAP3(lchown, const char __user *, filename, uid_t, user, gid_t, group); -COMPAT_SYSCALL_WRAP2(getgroups, int, gidsetsize, gid_t __user *, grouplist); -COMPAT_SYSCALL_WRAP2(setgroups, int, gidsetsize, gid_t __user *, grouplist); -COMPAT_SYSCALL_WRAP3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid); -COMPAT_SYSCALL_WRAP3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid); -COMPAT_SYSCALL_WRAP3(chown, const char __user *, filename, uid_t, user, gid_t, group); -COMPAT_SYSCALL_WRAP2(pivot_root, const char __user *, new_root, const char __user *, put_old); -COMPAT_SYSCALL_WRAP3(mincore, unsigned long, start, size_t, len, unsigned char __user *, vec); -COMPAT_SYSCALL_WRAP3(madvise, unsigned long, start, size_t, len, int, behavior); -COMPAT_SYSCALL_WRAP5(setxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP5(lsetxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP5(fsetxattr, int, fd, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP3(getdents64, unsigned int, fd, struct linux_dirent64 __user *, dirent, unsigned int, count); -COMPAT_SYSCALL_WRAP4(getxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP4(lgetxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP4(fgetxattr, int, fd, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP3(listxattr, const char __user *, path, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP3(llistxattr, const char __user *, path, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP3(flistxattr, int, fd, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP2(removexattr, const char __user *, path, const char __user *, name); -COMPAT_SYSCALL_WRAP2(lremovexattr, const char __user *, path, const char __user *, name); -COMPAT_SYSCALL_WRAP2(fremovexattr, int, fd, const char __user *, name); -COMPAT_SYSCALL_WRAP1(set_tid_address, int __user *, tidptr); -COMPAT_SYSCALL_WRAP4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event); -COMPAT_SYSCALL_WRAP4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout); -COMPAT_SYSCALL_WRAP1(io_destroy, aio_context_t, ctx); -COMPAT_SYSCALL_WRAP3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, struct io_event __user *, result); -COMPAT_SYSCALL_WRAP1(mq_unlink, const char __user *, name); -COMPAT_SYSCALL_WRAP5(add_key, const char __user *, tp, const char __user *, dsc, const void __user *, pld, size_t, len, key_serial_t, id); -COMPAT_SYSCALL_WRAP4(request_key, const char __user *, tp, const char __user *, dsc, const char __user *, info, key_serial_t, id); -COMPAT_SYSCALL_WRAP5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long, prot, unsigned long, pgoff, unsigned long, flags); -COMPAT_SYSCALL_WRAP3(inotify_add_watch, int, fd, const char __user *, path, u32, mask); -COMPAT_SYSCALL_WRAP3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev); -COMPAT_SYSCALL_WRAP5(fchownat, int, dfd, const char __user *, filename, uid_t, user, gid_t, group, int, flag); -COMPAT_SYSCALL_WRAP3(unlinkat, int, dfd, const char __user *, pathname, int, flag); -COMPAT_SYSCALL_WRAP4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname); -COMPAT_SYSCALL_WRAP5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags); -COMPAT_SYSCALL_WRAP3(symlinkat, const char __user *, oldname, int, newdfd, const char __user *, newname); -COMPAT_SYSCALL_WRAP4(readlinkat, int, dfd, const char __user *, path, char __user *, buf, int, bufsiz); -COMPAT_SYSCALL_WRAP3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode); -COMPAT_SYSCALL_WRAP3(faccessat, int, dfd, const char __user *, filename, int, mode); -COMPAT_SYSCALL_WRAP1(unshare, unsigned long, unshare_flags); -COMPAT_SYSCALL_WRAP6(splice, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags); -COMPAT_SYSCALL_WRAP3(getcpu, unsigned __user *, cpu, unsigned __user *, node, struct getcpu_cache __user *, cache); -COMPAT_SYSCALL_WRAP2(pipe2, int __user *, fildes, int, flags); -COMPAT_SYSCALL_WRAP5(perf_event_open, struct perf_event_attr __user *, attr_uptr, pid_t, pid, int, cpu, int, group_fd, unsigned long, flags); -COMPAT_SYSCALL_WRAP5(clone, unsigned long, newsp, unsigned long, clone_flags, int __user *, parent_tidptr, int __user *, child_tidptr, unsigned long, tls); -COMPAT_SYSCALL_WRAP4(prlimit64, pid_t, pid, unsigned int, resource, const struct rlimit64 __user *, new_rlim, struct rlimit64 __user *, old_rlim); -COMPAT_SYSCALL_WRAP5(name_to_handle_at, int, dfd, const char __user *, name, struct file_handle __user *, handle, int __user *, mnt_id, int, flag); -COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2); -COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags); -COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags); -COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags); -COMPAT_SYSCALL_WRAP3(seccomp, unsigned int, op, unsigned int, flags, const char __user *, uargs) -COMPAT_SYSCALL_WRAP3(getrandom, char __user *, buf, size_t, count, unsigned int, flags) -COMPAT_SYSCALL_WRAP2(memfd_create, const char __user *, uname, unsigned int, flags) -COMPAT_SYSCALL_WRAP3(bpf, int, cmd, union bpf_attr *, attr, unsigned int, size); -COMPAT_SYSCALL_WRAP3(s390_pci_mmio_write, const unsigned long, mmio_addr, const void __user *, user_buffer, const size_t, length); -COMPAT_SYSCALL_WRAP3(s390_pci_mmio_read, const unsigned long, mmio_addr, void __user *, user_buffer, const size_t, length); -COMPAT_SYSCALL_WRAP4(socketpair, int, family, int, type, int, protocol, int __user *, usockvec); -COMPAT_SYSCALL_WRAP3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen); -COMPAT_SYSCALL_WRAP3(connect, int, fd, struct sockaddr __user *, uservaddr, int, addrlen); -COMPAT_SYSCALL_WRAP4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, int __user *, upeer_addrlen, int, flags); -COMPAT_SYSCALL_WRAP3(getsockname, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); -COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); -COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); -COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); -COMPAT_SYSCALL_WRAP6(copy_file_range, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); diff --git a/kernel/Makefile b/kernel/Makefile index f0c40bf..882eec03 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -64,6 +64,7 @@ obj-$(CONFIG_KEXEC) += kexec.o obj-$(CONFIG_KEXEC_FILE) += kexec_file.o obj-$(CONFIG_BACKTRACE_SELF_TEST) += backtracetest.o obj-$(CONFIG_COMPAT) += compat.o +obj-$(CONFIG_COMPAT_WRAPPER) += compat_wrapper.o obj-$(CONFIG_CGROUPS) += cgroup.o obj-$(CONFIG_CGROUP_FREEZER) += cgroup_freezer.o obj-$(CONFIG_CGROUP_PIDS) += cgroup_pids.o diff --git a/kernel/compat_wrapper.c b/kernel/compat_wrapper.c new file mode 100644 index 0000000..b6c050e --- /dev/null +++ b/kernel/compat_wrapper.c @@ -0,0 +1,175 @@ +/* + * Compat system call wrappers. + * + * Copyright IBM Corp. 2014 + */ + +#include <linux/syscalls.h> +#include <linux/compat.h> + +COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); +COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); +COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename); +COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev); +COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode); + +#ifdef __ARCH_WANT_SYS_OLDUMOUNT +COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name); +#endif + +COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode); +COMPAT_SYSCALL_WRAP2(rename, const char __user *, oldname, const char __user *, newname); +COMPAT_SYSCALL_WRAP2(mkdir, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP1(rmdir, const char __user *, pathname); +COMPAT_SYSCALL_WRAP1(pipe, int __user *, fildes); +COMPAT_SYSCALL_WRAP1(brk, unsigned long, brk); + +#ifdef __ARCH_WANT_SYS_SIGNAL +COMPAT_SYSCALL_WRAP2(signal, int, sig, __sighandler_t, handler); +#endif + +COMPAT_SYSCALL_WRAP1(acct, const char __user *, name); +COMPAT_SYSCALL_WRAP2(umount, char __user *, name, int, flags); +COMPAT_SYSCALL_WRAP1(chroot, const char __user *, filename); + +#ifdef CONFIG_OLD_SIGSUSPEND +SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask); +#endif + +#ifdef CONFIG_OLD_SIGSUSPEND3 +COMPAT_SYSCALL_WRAP3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask); +#endif + +COMPAT_SYSCALL_WRAP2(sethostname, char __user *, name, int, len); +COMPAT_SYSCALL_WRAP2(symlink, const char __user *, old, const char __user *, new); +COMPAT_SYSCALL_WRAP3(readlink, const char __user *, path, char __user *, buf, int, bufsiz); +COMPAT_SYSCALL_WRAP1(uselib, const char __user *, library); +COMPAT_SYSCALL_WRAP2(swapon, const char __user *, specialfile, int, swap_flags); +COMPAT_SYSCALL_WRAP4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg); +COMPAT_SYSCALL_WRAP2(munmap, unsigned long, addr, size_t, len); +COMPAT_SYSCALL_WRAP3(syslog, int, type, char __user *, buf, int, len); +COMPAT_SYSCALL_WRAP1(swapoff, const char __user *, specialfile); +COMPAT_SYSCALL_WRAP2(setdomainname, char __user *, name, int, len); +COMPAT_SYSCALL_WRAP1(newuname, struct new_utsname __user *, name); +COMPAT_SYSCALL_WRAP3(mprotect, unsigned long, start, size_t, len, unsigned long, prot); +COMPAT_SYSCALL_WRAP3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs); +COMPAT_SYSCALL_WRAP2(delete_module, const char __user *, name_user, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr); +COMPAT_SYSCALL_WRAP2(bdflush, int, func, long, data); +COMPAT_SYSCALL_WRAP3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2); + +#ifdef __ARCH_WANT_SYS_LLSEEK +COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence); +#endif + +COMPAT_SYSCALL_WRAP3(msync, unsigned long, start, size_t, len, int, flags); +COMPAT_SYSCALL_WRAP2(mlock, unsigned long, start, size_t, len); +COMPAT_SYSCALL_WRAP2(munlock, unsigned long, start, size_t, len); +COMPAT_SYSCALL_WRAP2(sched_setparam, pid_t, pid, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP2(sched_getparam, pid_t, pid, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP5(mremap, unsigned long, addr, unsigned long, old_len, unsigned long, new_len, unsigned long, flags, unsigned long, new_addr); +COMPAT_SYSCALL_WRAP3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout); +COMPAT_SYSCALL_WRAP5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5); +COMPAT_SYSCALL_WRAP2(getcwd, char __user *, buf, unsigned long, size); +COMPAT_SYSCALL_WRAP2(capget, cap_user_header_t, header, cap_user_data_t, dataptr); +COMPAT_SYSCALL_WRAP2(capset, cap_user_header_t, header, const cap_user_data_t, data); +COMPAT_SYSCALL_WRAP3(lchown, const char __user *, filename, uid_t, user, gid_t, group); +COMPAT_SYSCALL_WRAP2(getgroups, int, gidsetsize, gid_t __user *, grouplist); +COMPAT_SYSCALL_WRAP2(setgroups, int, gidsetsize, gid_t __user *, grouplist); +COMPAT_SYSCALL_WRAP3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid); +COMPAT_SYSCALL_WRAP3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid); +COMPAT_SYSCALL_WRAP3(chown, const char __user *, filename, uid_t, user, gid_t, group); +COMPAT_SYSCALL_WRAP2(pivot_root, const char __user *, new_root, const char __user *, put_old); +COMPAT_SYSCALL_WRAP3(mincore, unsigned long, start, size_t, len, unsigned char __user *, vec); +COMPAT_SYSCALL_WRAP3(madvise, unsigned long, start, size_t, len, int, behavior); +COMPAT_SYSCALL_WRAP5(setxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); +COMPAT_SYSCALL_WRAP5(lsetxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); +COMPAT_SYSCALL_WRAP5(fsetxattr, int, fd, const char __user *, name, const void __user *, value, size_t, size, int, flags); + +#ifndef __ARCH_WANT_COMPAT_SYS_GETDENTS64 +COMPAT_SYSCALL_WRAP3(getdents64, unsigned int, fd, struct linux_dirent64 __user *, dirent, unsigned int, count); +#endif + +COMPAT_SYSCALL_WRAP4(getxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP4(lgetxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP4(fgetxattr, int, fd, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP3(listxattr, const char __user *, path, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP3(llistxattr, const char __user *, path, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP3(flistxattr, int, fd, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP2(removexattr, const char __user *, path, const char __user *, name); +COMPAT_SYSCALL_WRAP2(lremovexattr, const char __user *, path, const char __user *, name); +COMPAT_SYSCALL_WRAP2(fremovexattr, int, fd, const char __user *, name); +COMPAT_SYSCALL_WRAP1(set_tid_address, int __user *, tidptr); +COMPAT_SYSCALL_WRAP4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event); +COMPAT_SYSCALL_WRAP4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout); +COMPAT_SYSCALL_WRAP1(io_destroy, aio_context_t, ctx); +COMPAT_SYSCALL_WRAP3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, struct io_event __user *, result); +COMPAT_SYSCALL_WRAP1(mq_unlink, const char __user *, name); +COMPAT_SYSCALL_WRAP5(add_key, const char __user *, tp, const char __user *, dsc, const void __user *, pld, size_t, len, key_serial_t, id); +COMPAT_SYSCALL_WRAP4(request_key, const char __user *, tp, const char __user *, dsc, const char __user *, info, key_serial_t, id); +COMPAT_SYSCALL_WRAP5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long, prot, unsigned long, pgoff, unsigned long, flags); +COMPAT_SYSCALL_WRAP3(inotify_add_watch, int, fd, const char __user *, path, u32, mask); +COMPAT_SYSCALL_WRAP3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev); +COMPAT_SYSCALL_WRAP5(fchownat, int, dfd, const char __user *, filename, uid_t, user, gid_t, group, int, flag); +COMPAT_SYSCALL_WRAP3(unlinkat, int, dfd, const char __user *, pathname, int, flag); +COMPAT_SYSCALL_WRAP4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname); +COMPAT_SYSCALL_WRAP5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags); +COMPAT_SYSCALL_WRAP3(symlinkat, const char __user *, oldname, int, newdfd, const char __user *, newname); +COMPAT_SYSCALL_WRAP4(readlinkat, int, dfd, const char __user *, path, char __user *, buf, int, bufsiz); +COMPAT_SYSCALL_WRAP3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode); +COMPAT_SYSCALL_WRAP3(faccessat, int, dfd, const char __user *, filename, int, mode); +COMPAT_SYSCALL_WRAP1(unshare, unsigned long, unshare_flags); +COMPAT_SYSCALL_WRAP6(splice, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags); +COMPAT_SYSCALL_WRAP3(getcpu, unsigned __user *, cpu, unsigned __user *, node, struct getcpu_cache __user *, cache); +COMPAT_SYSCALL_WRAP2(pipe2, int __user *, fildes, int, flags); +COMPAT_SYSCALL_WRAP5(perf_event_open, struct perf_event_attr __user *, attr_uptr, pid_t, pid, int, cpu, int, group_fd, unsigned long, flags); + +#ifdef __ARCH_WANT_SYS_CLONE +#ifdef CONFIG_CLONE_BACKWARDS +COMPAT_SYSCALL_WRAP5(clone, unsigned long, clone_flags, unsigned long, newsp, + int __user *, parent_tidptr, + unsigned long, tls, + int __user *, child_tidptr); +#elif defined(CONFIG_CLONE_BACKWARDS2) + COMPAT_SYSCALL_WRAP5(clone, unsigned long, newsp, unsigned long, clone_flags, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#elif defined(CONFIG_CLONE_BACKWARDS3) + COMPAT_SYSCALL_WRAP6(clone, unsigned long, clone_flags, unsigned long, newsp, + int, stack_size, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#else +COMPAT_SYSCALL_WRAP5(clone, unsigned long, clone_flags, unsigned long, newsp, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#endif +#endif + +COMPAT_SYSCALL_WRAP4(prlimit64, pid_t, pid, unsigned int, resource, const struct rlimit64 __user *, new_rlim, struct rlimit64 __user *, old_rlim); +COMPAT_SYSCALL_WRAP5(name_to_handle_at, int, dfd, const char __user *, name, struct file_handle __user *, handle, int __user *, mnt_id, int, flag); +COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2); +COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags); +COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags); +COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags); +COMPAT_SYSCALL_WRAP3(seccomp, unsigned int, op, unsigned int, flags, const char __user *, uargs) +COMPAT_SYSCALL_WRAP3(getrandom, char __user *, buf, size_t, count, unsigned int, flags) +COMPAT_SYSCALL_WRAP2(memfd_create, const char __user *, uname, unsigned int, flags) +COMPAT_SYSCALL_WRAP3(bpf, int, cmd, union bpf_attr *, attr, unsigned int, size); +COMPAT_SYSCALL_WRAP4(socketpair, int, family, int, type, int, protocol, int __user *, usockvec); +COMPAT_SYSCALL_WRAP3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen); +COMPAT_SYSCALL_WRAP3(connect, int, fd, struct sockaddr __user *, uservaddr, int, addrlen); +COMPAT_SYSCALL_WRAP4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, int __user *, upeer_addrlen, int, flags); +COMPAT_SYSCALL_WRAP3(getsockname, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); +COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); +COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); +COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); +COMPAT_SYSCALL_WRAP6(copy_file_range, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 04/23] all: s390: move compat_wrappers.c from arch/s390/kernel to kernel/ @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Some syscalls are declared conditionally, so corresponding wrappers are conditional accordingly. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/s390/kernel/Makefile | 2 +- arch/s390/kernel/compat_linux.c | 4 + arch/s390/kernel/compat_wrapper.c | 129 ---------------------------- kernel/Makefile | 1 + kernel/compat_wrapper.c | 175 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 181 insertions(+), 130 deletions(-) delete mode 100644 arch/s390/kernel/compat_wrapper.c create mode 100644 kernel/compat_wrapper.c diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 2f5586a..145d3d8 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile @@ -57,7 +57,7 @@ obj-$(CONFIG_HIBERNATION) += suspend.o swsusp.o obj-$(CONFIG_AUDIT) += audit.o compat-obj-$(CONFIG_AUDIT) += compat_audit.o obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o -obj-$(CONFIG_COMPAT) += compat_wrapper.o $(compat-obj-y) +obj-$(CONFIG_COMPAT) += $(compat-obj-y) obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_KPROBES) += kprobes.o diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 437e611..783c208 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c @@ -86,6 +86,10 @@ #define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid) #define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid) +COMPAT_SYSCALL_WRAP3(s390_pci_mmio_write, const unsigned long, mmio_addr, const void __user *, user_buffer, const size_t, length); + +COMPAT_SYSCALL_WRAP3(s390_pci_mmio_read, const unsigned long, mmio_addr, void __user *, user_buffer, const size_t, length); + COMPAT_SYSCALL_DEFINE3(s390_chown16, const char __user *, filename, u16, user, u16, group) { diff --git a/arch/s390/kernel/compat_wrapper.c b/arch/s390/kernel/compat_wrapper.c deleted file mode 100644 index 1614e15..0000000 --- a/arch/s390/kernel/compat_wrapper.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Compat system call wrappers. - * - * Copyright IBM Corp. 2014 - */ - -#include <linux/syscalls.h> -#include <linux/compat.h> -#include "entry.h" - -COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); -COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); -COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename); -COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev); -COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode); -COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name); -COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode); -COMPAT_SYSCALL_WRAP2(rename, const char __user *, oldname, const char __user *, newname); -COMPAT_SYSCALL_WRAP2(mkdir, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP1(rmdir, const char __user *, pathname); -COMPAT_SYSCALL_WRAP1(pipe, int __user *, fildes); -COMPAT_SYSCALL_WRAP1(brk, unsigned long, brk); -COMPAT_SYSCALL_WRAP2(signal, int, sig, __sighandler_t, handler); -COMPAT_SYSCALL_WRAP1(acct, const char __user *, name); -COMPAT_SYSCALL_WRAP2(umount, char __user *, name, int, flags); -COMPAT_SYSCALL_WRAP1(chroot, const char __user *, filename); -COMPAT_SYSCALL_WRAP3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask); -COMPAT_SYSCALL_WRAP2(sethostname, char __user *, name, int, len); -COMPAT_SYSCALL_WRAP2(symlink, const char __user *, old, const char __user *, new); -COMPAT_SYSCALL_WRAP3(readlink, const char __user *, path, char __user *, buf, int, bufsiz); -COMPAT_SYSCALL_WRAP1(uselib, const char __user *, library); -COMPAT_SYSCALL_WRAP2(swapon, const char __user *, specialfile, int, swap_flags); -COMPAT_SYSCALL_WRAP4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg); -COMPAT_SYSCALL_WRAP2(munmap, unsigned long, addr, size_t, len); -COMPAT_SYSCALL_WRAP3(syslog, int, type, char __user *, buf, int, len); -COMPAT_SYSCALL_WRAP1(swapoff, const char __user *, specialfile); -COMPAT_SYSCALL_WRAP2(setdomainname, char __user *, name, int, len); -COMPAT_SYSCALL_WRAP1(newuname, struct new_utsname __user *, name); -COMPAT_SYSCALL_WRAP3(mprotect, unsigned long, start, size_t, len, unsigned long, prot); -COMPAT_SYSCALL_WRAP3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs); -COMPAT_SYSCALL_WRAP2(delete_module, const char __user *, name_user, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr); -COMPAT_SYSCALL_WRAP2(bdflush, int, func, long, data); -COMPAT_SYSCALL_WRAP3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2); -COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence); -COMPAT_SYSCALL_WRAP3(msync, unsigned long, start, size_t, len, int, flags); -COMPAT_SYSCALL_WRAP2(mlock, unsigned long, start, size_t, len); -COMPAT_SYSCALL_WRAP2(munlock, unsigned long, start, size_t, len); -COMPAT_SYSCALL_WRAP2(sched_setparam, pid_t, pid, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP2(sched_getparam, pid_t, pid, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP5(mremap, unsigned long, addr, unsigned long, old_len, unsigned long, new_len, unsigned long, flags, unsigned long, new_addr); -COMPAT_SYSCALL_WRAP3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout); -COMPAT_SYSCALL_WRAP5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5); -COMPAT_SYSCALL_WRAP2(getcwd, char __user *, buf, unsigned long, size); -COMPAT_SYSCALL_WRAP2(capget, cap_user_header_t, header, cap_user_data_t, dataptr); -COMPAT_SYSCALL_WRAP2(capset, cap_user_header_t, header, const cap_user_data_t, data); -COMPAT_SYSCALL_WRAP3(lchown, const char __user *, filename, uid_t, user, gid_t, group); -COMPAT_SYSCALL_WRAP2(getgroups, int, gidsetsize, gid_t __user *, grouplist); -COMPAT_SYSCALL_WRAP2(setgroups, int, gidsetsize, gid_t __user *, grouplist); -COMPAT_SYSCALL_WRAP3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid); -COMPAT_SYSCALL_WRAP3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid); -COMPAT_SYSCALL_WRAP3(chown, const char __user *, filename, uid_t, user, gid_t, group); -COMPAT_SYSCALL_WRAP2(pivot_root, const char __user *, new_root, const char __user *, put_old); -COMPAT_SYSCALL_WRAP3(mincore, unsigned long, start, size_t, len, unsigned char __user *, vec); -COMPAT_SYSCALL_WRAP3(madvise, unsigned long, start, size_t, len, int, behavior); -COMPAT_SYSCALL_WRAP5(setxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP5(lsetxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP5(fsetxattr, int, fd, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP3(getdents64, unsigned int, fd, struct linux_dirent64 __user *, dirent, unsigned int, count); -COMPAT_SYSCALL_WRAP4(getxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP4(lgetxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP4(fgetxattr, int, fd, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP3(listxattr, const char __user *, path, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP3(llistxattr, const char __user *, path, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP3(flistxattr, int, fd, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP2(removexattr, const char __user *, path, const char __user *, name); -COMPAT_SYSCALL_WRAP2(lremovexattr, const char __user *, path, const char __user *, name); -COMPAT_SYSCALL_WRAP2(fremovexattr, int, fd, const char __user *, name); -COMPAT_SYSCALL_WRAP1(set_tid_address, int __user *, tidptr); -COMPAT_SYSCALL_WRAP4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event); -COMPAT_SYSCALL_WRAP4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout); -COMPAT_SYSCALL_WRAP1(io_destroy, aio_context_t, ctx); -COMPAT_SYSCALL_WRAP3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, struct io_event __user *, result); -COMPAT_SYSCALL_WRAP1(mq_unlink, const char __user *, name); -COMPAT_SYSCALL_WRAP5(add_key, const char __user *, tp, const char __user *, dsc, const void __user *, pld, size_t, len, key_serial_t, id); -COMPAT_SYSCALL_WRAP4(request_key, const char __user *, tp, const char __user *, dsc, const char __user *, info, key_serial_t, id); -COMPAT_SYSCALL_WRAP5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long, prot, unsigned long, pgoff, unsigned long, flags); -COMPAT_SYSCALL_WRAP3(inotify_add_watch, int, fd, const char __user *, path, u32, mask); -COMPAT_SYSCALL_WRAP3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev); -COMPAT_SYSCALL_WRAP5(fchownat, int, dfd, const char __user *, filename, uid_t, user, gid_t, group, int, flag); -COMPAT_SYSCALL_WRAP3(unlinkat, int, dfd, const char __user *, pathname, int, flag); -COMPAT_SYSCALL_WRAP4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname); -COMPAT_SYSCALL_WRAP5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags); -COMPAT_SYSCALL_WRAP3(symlinkat, const char __user *, oldname, int, newdfd, const char __user *, newname); -COMPAT_SYSCALL_WRAP4(readlinkat, int, dfd, const char __user *, path, char __user *, buf, int, bufsiz); -COMPAT_SYSCALL_WRAP3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode); -COMPAT_SYSCALL_WRAP3(faccessat, int, dfd, const char __user *, filename, int, mode); -COMPAT_SYSCALL_WRAP1(unshare, unsigned long, unshare_flags); -COMPAT_SYSCALL_WRAP6(splice, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags); -COMPAT_SYSCALL_WRAP3(getcpu, unsigned __user *, cpu, unsigned __user *, node, struct getcpu_cache __user *, cache); -COMPAT_SYSCALL_WRAP2(pipe2, int __user *, fildes, int, flags); -COMPAT_SYSCALL_WRAP5(perf_event_open, struct perf_event_attr __user *, attr_uptr, pid_t, pid, int, cpu, int, group_fd, unsigned long, flags); -COMPAT_SYSCALL_WRAP5(clone, unsigned long, newsp, unsigned long, clone_flags, int __user *, parent_tidptr, int __user *, child_tidptr, unsigned long, tls); -COMPAT_SYSCALL_WRAP4(prlimit64, pid_t, pid, unsigned int, resource, const struct rlimit64 __user *, new_rlim, struct rlimit64 __user *, old_rlim); -COMPAT_SYSCALL_WRAP5(name_to_handle_at, int, dfd, const char __user *, name, struct file_handle __user *, handle, int __user *, mnt_id, int, flag); -COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2); -COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags); -COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags); -COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags); -COMPAT_SYSCALL_WRAP3(seccomp, unsigned int, op, unsigned int, flags, const char __user *, uargs) -COMPAT_SYSCALL_WRAP3(getrandom, char __user *, buf, size_t, count, unsigned int, flags) -COMPAT_SYSCALL_WRAP2(memfd_create, const char __user *, uname, unsigned int, flags) -COMPAT_SYSCALL_WRAP3(bpf, int, cmd, union bpf_attr *, attr, unsigned int, size); -COMPAT_SYSCALL_WRAP3(s390_pci_mmio_write, const unsigned long, mmio_addr, const void __user *, user_buffer, const size_t, length); -COMPAT_SYSCALL_WRAP3(s390_pci_mmio_read, const unsigned long, mmio_addr, void __user *, user_buffer, const size_t, length); -COMPAT_SYSCALL_WRAP4(socketpair, int, family, int, type, int, protocol, int __user *, usockvec); -COMPAT_SYSCALL_WRAP3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen); -COMPAT_SYSCALL_WRAP3(connect, int, fd, struct sockaddr __user *, uservaddr, int, addrlen); -COMPAT_SYSCALL_WRAP4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, int __user *, upeer_addrlen, int, flags); -COMPAT_SYSCALL_WRAP3(getsockname, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); -COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); -COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); -COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); -COMPAT_SYSCALL_WRAP6(copy_file_range, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); diff --git a/kernel/Makefile b/kernel/Makefile index f0c40bf..882eec03 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -64,6 +64,7 @@ obj-$(CONFIG_KEXEC) += kexec.o obj-$(CONFIG_KEXEC_FILE) += kexec_file.o obj-$(CONFIG_BACKTRACE_SELF_TEST) += backtracetest.o obj-$(CONFIG_COMPAT) += compat.o +obj-$(CONFIG_COMPAT_WRAPPER) += compat_wrapper.o obj-$(CONFIG_CGROUPS) += cgroup.o obj-$(CONFIG_CGROUP_FREEZER) += cgroup_freezer.o obj-$(CONFIG_CGROUP_PIDS) += cgroup_pids.o diff --git a/kernel/compat_wrapper.c b/kernel/compat_wrapper.c new file mode 100644 index 0000000..b6c050e --- /dev/null +++ b/kernel/compat_wrapper.c @@ -0,0 +1,175 @@ +/* + * Compat system call wrappers. + * + * Copyright IBM Corp. 2014 + */ + +#include <linux/syscalls.h> +#include <linux/compat.h> + +COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); +COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); +COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename); +COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev); +COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode); + +#ifdef __ARCH_WANT_SYS_OLDUMOUNT +COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name); +#endif + +COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode); +COMPAT_SYSCALL_WRAP2(rename, const char __user *, oldname, const char __user *, newname); +COMPAT_SYSCALL_WRAP2(mkdir, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP1(rmdir, const char __user *, pathname); +COMPAT_SYSCALL_WRAP1(pipe, int __user *, fildes); +COMPAT_SYSCALL_WRAP1(brk, unsigned long, brk); + +#ifdef __ARCH_WANT_SYS_SIGNAL +COMPAT_SYSCALL_WRAP2(signal, int, sig, __sighandler_t, handler); +#endif + +COMPAT_SYSCALL_WRAP1(acct, const char __user *, name); +COMPAT_SYSCALL_WRAP2(umount, char __user *, name, int, flags); +COMPAT_SYSCALL_WRAP1(chroot, const char __user *, filename); + +#ifdef CONFIG_OLD_SIGSUSPEND +SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask); +#endif + +#ifdef CONFIG_OLD_SIGSUSPEND3 +COMPAT_SYSCALL_WRAP3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask); +#endif + +COMPAT_SYSCALL_WRAP2(sethostname, char __user *, name, int, len); +COMPAT_SYSCALL_WRAP2(symlink, const char __user *, old, const char __user *, new); +COMPAT_SYSCALL_WRAP3(readlink, const char __user *, path, char __user *, buf, int, bufsiz); +COMPAT_SYSCALL_WRAP1(uselib, const char __user *, library); +COMPAT_SYSCALL_WRAP2(swapon, const char __user *, specialfile, int, swap_flags); +COMPAT_SYSCALL_WRAP4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg); +COMPAT_SYSCALL_WRAP2(munmap, unsigned long, addr, size_t, len); +COMPAT_SYSCALL_WRAP3(syslog, int, type, char __user *, buf, int, len); +COMPAT_SYSCALL_WRAP1(swapoff, const char __user *, specialfile); +COMPAT_SYSCALL_WRAP2(setdomainname, char __user *, name, int, len); +COMPAT_SYSCALL_WRAP1(newuname, struct new_utsname __user *, name); +COMPAT_SYSCALL_WRAP3(mprotect, unsigned long, start, size_t, len, unsigned long, prot); +COMPAT_SYSCALL_WRAP3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs); +COMPAT_SYSCALL_WRAP2(delete_module, const char __user *, name_user, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr); +COMPAT_SYSCALL_WRAP2(bdflush, int, func, long, data); +COMPAT_SYSCALL_WRAP3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2); + +#ifdef __ARCH_WANT_SYS_LLSEEK +COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence); +#endif + +COMPAT_SYSCALL_WRAP3(msync, unsigned long, start, size_t, len, int, flags); +COMPAT_SYSCALL_WRAP2(mlock, unsigned long, start, size_t, len); +COMPAT_SYSCALL_WRAP2(munlock, unsigned long, start, size_t, len); +COMPAT_SYSCALL_WRAP2(sched_setparam, pid_t, pid, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP2(sched_getparam, pid_t, pid, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP5(mremap, unsigned long, addr, unsigned long, old_len, unsigned long, new_len, unsigned long, flags, unsigned long, new_addr); +COMPAT_SYSCALL_WRAP3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout); +COMPAT_SYSCALL_WRAP5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5); +COMPAT_SYSCALL_WRAP2(getcwd, char __user *, buf, unsigned long, size); +COMPAT_SYSCALL_WRAP2(capget, cap_user_header_t, header, cap_user_data_t, dataptr); +COMPAT_SYSCALL_WRAP2(capset, cap_user_header_t, header, const cap_user_data_t, data); +COMPAT_SYSCALL_WRAP3(lchown, const char __user *, filename, uid_t, user, gid_t, group); +COMPAT_SYSCALL_WRAP2(getgroups, int, gidsetsize, gid_t __user *, grouplist); +COMPAT_SYSCALL_WRAP2(setgroups, int, gidsetsize, gid_t __user *, grouplist); +COMPAT_SYSCALL_WRAP3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid); +COMPAT_SYSCALL_WRAP3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid); +COMPAT_SYSCALL_WRAP3(chown, const char __user *, filename, uid_t, user, gid_t, group); +COMPAT_SYSCALL_WRAP2(pivot_root, const char __user *, new_root, const char __user *, put_old); +COMPAT_SYSCALL_WRAP3(mincore, unsigned long, start, size_t, len, unsigned char __user *, vec); +COMPAT_SYSCALL_WRAP3(madvise, unsigned long, start, size_t, len, int, behavior); +COMPAT_SYSCALL_WRAP5(setxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); +COMPAT_SYSCALL_WRAP5(lsetxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); +COMPAT_SYSCALL_WRAP5(fsetxattr, int, fd, const char __user *, name, const void __user *, value, size_t, size, int, flags); + +#ifndef __ARCH_WANT_COMPAT_SYS_GETDENTS64 +COMPAT_SYSCALL_WRAP3(getdents64, unsigned int, fd, struct linux_dirent64 __user *, dirent, unsigned int, count); +#endif + +COMPAT_SYSCALL_WRAP4(getxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP4(lgetxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP4(fgetxattr, int, fd, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP3(listxattr, const char __user *, path, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP3(llistxattr, const char __user *, path, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP3(flistxattr, int, fd, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP2(removexattr, const char __user *, path, const char __user *, name); +COMPAT_SYSCALL_WRAP2(lremovexattr, const char __user *, path, const char __user *, name); +COMPAT_SYSCALL_WRAP2(fremovexattr, int, fd, const char __user *, name); +COMPAT_SYSCALL_WRAP1(set_tid_address, int __user *, tidptr); +COMPAT_SYSCALL_WRAP4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event); +COMPAT_SYSCALL_WRAP4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout); +COMPAT_SYSCALL_WRAP1(io_destroy, aio_context_t, ctx); +COMPAT_SYSCALL_WRAP3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, struct io_event __user *, result); +COMPAT_SYSCALL_WRAP1(mq_unlink, const char __user *, name); +COMPAT_SYSCALL_WRAP5(add_key, const char __user *, tp, const char __user *, dsc, const void __user *, pld, size_t, len, key_serial_t, id); +COMPAT_SYSCALL_WRAP4(request_key, const char __user *, tp, const char __user *, dsc, const char __user *, info, key_serial_t, id); +COMPAT_SYSCALL_WRAP5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long, prot, unsigned long, pgoff, unsigned long, flags); +COMPAT_SYSCALL_WRAP3(inotify_add_watch, int, fd, const char __user *, path, u32, mask); +COMPAT_SYSCALL_WRAP3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev); +COMPAT_SYSCALL_WRAP5(fchownat, int, dfd, const char __user *, filename, uid_t, user, gid_t, group, int, flag); +COMPAT_SYSCALL_WRAP3(unlinkat, int, dfd, const char __user *, pathname, int, flag); +COMPAT_SYSCALL_WRAP4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname); +COMPAT_SYSCALL_WRAP5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags); +COMPAT_SYSCALL_WRAP3(symlinkat, const char __user *, oldname, int, newdfd, const char __user *, newname); +COMPAT_SYSCALL_WRAP4(readlinkat, int, dfd, const char __user *, path, char __user *, buf, int, bufsiz); +COMPAT_SYSCALL_WRAP3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode); +COMPAT_SYSCALL_WRAP3(faccessat, int, dfd, const char __user *, filename, int, mode); +COMPAT_SYSCALL_WRAP1(unshare, unsigned long, unshare_flags); +COMPAT_SYSCALL_WRAP6(splice, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags); +COMPAT_SYSCALL_WRAP3(getcpu, unsigned __user *, cpu, unsigned __user *, node, struct getcpu_cache __user *, cache); +COMPAT_SYSCALL_WRAP2(pipe2, int __user *, fildes, int, flags); +COMPAT_SYSCALL_WRAP5(perf_event_open, struct perf_event_attr __user *, attr_uptr, pid_t, pid, int, cpu, int, group_fd, unsigned long, flags); + +#ifdef __ARCH_WANT_SYS_CLONE +#ifdef CONFIG_CLONE_BACKWARDS +COMPAT_SYSCALL_WRAP5(clone, unsigned long, clone_flags, unsigned long, newsp, + int __user *, parent_tidptr, + unsigned long, tls, + int __user *, child_tidptr); +#elif defined(CONFIG_CLONE_BACKWARDS2) + COMPAT_SYSCALL_WRAP5(clone, unsigned long, newsp, unsigned long, clone_flags, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#elif defined(CONFIG_CLONE_BACKWARDS3) + COMPAT_SYSCALL_WRAP6(clone, unsigned long, clone_flags, unsigned long, newsp, + int, stack_size, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#else +COMPAT_SYSCALL_WRAP5(clone, unsigned long, clone_flags, unsigned long, newsp, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#endif +#endif + +COMPAT_SYSCALL_WRAP4(prlimit64, pid_t, pid, unsigned int, resource, const struct rlimit64 __user *, new_rlim, struct rlimit64 __user *, old_rlim); +COMPAT_SYSCALL_WRAP5(name_to_handle_at, int, dfd, const char __user *, name, struct file_handle __user *, handle, int __user *, mnt_id, int, flag); +COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2); +COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags); +COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags); +COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags); +COMPAT_SYSCALL_WRAP3(seccomp, unsigned int, op, unsigned int, flags, const char __user *, uargs) +COMPAT_SYSCALL_WRAP3(getrandom, char __user *, buf, size_t, count, unsigned int, flags) +COMPAT_SYSCALL_WRAP2(memfd_create, const char __user *, uname, unsigned int, flags) +COMPAT_SYSCALL_WRAP3(bpf, int, cmd, union bpf_attr *, attr, unsigned int, size); +COMPAT_SYSCALL_WRAP4(socketpair, int, family, int, type, int, protocol, int __user *, usockvec); +COMPAT_SYSCALL_WRAP3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen); +COMPAT_SYSCALL_WRAP3(connect, int, fd, struct sockaddr __user *, uservaddr, int, addrlen); +COMPAT_SYSCALL_WRAP4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, int __user *, upeer_addrlen, int, flags); +COMPAT_SYSCALL_WRAP3(getsockname, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); +COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); +COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); +COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); +COMPAT_SYSCALL_WRAP6(copy_file_range, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 04/23] all: s390: move compat_wrappers.c from arch/s390/kernel to kernel/ @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, ynorov, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner Some syscalls are declared conditionally, so corresponding wrappers are conditional accordingly. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/s390/kernel/Makefile | 2 +- arch/s390/kernel/compat_linux.c | 4 + arch/s390/kernel/compat_wrapper.c | 129 ---------------------------- kernel/Makefile | 1 + kernel/compat_wrapper.c | 175 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 181 insertions(+), 130 deletions(-) delete mode 100644 arch/s390/kernel/compat_wrapper.c create mode 100644 kernel/compat_wrapper.c diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 2f5586a..145d3d8 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile @@ -57,7 +57,7 @@ obj-$(CONFIG_HIBERNATION) += suspend.o swsusp.o obj-$(CONFIG_AUDIT) += audit.o compat-obj-$(CONFIG_AUDIT) += compat_audit.o obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o -obj-$(CONFIG_COMPAT) += compat_wrapper.o $(compat-obj-y) +obj-$(CONFIG_COMPAT) += $(compat-obj-y) obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_KPROBES) += kprobes.o diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 437e611..783c208 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c @@ -86,6 +86,10 @@ #define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid) #define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid) +COMPAT_SYSCALL_WRAP3(s390_pci_mmio_write, const unsigned long, mmio_addr, const void __user *, user_buffer, const size_t, length); + +COMPAT_SYSCALL_WRAP3(s390_pci_mmio_read, const unsigned long, mmio_addr, void __user *, user_buffer, const size_t, length); + COMPAT_SYSCALL_DEFINE3(s390_chown16, const char __user *, filename, u16, user, u16, group) { diff --git a/arch/s390/kernel/compat_wrapper.c b/arch/s390/kernel/compat_wrapper.c deleted file mode 100644 index 1614e15..0000000 --- a/arch/s390/kernel/compat_wrapper.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Compat system call wrappers. - * - * Copyright IBM Corp. 2014 - */ - -#include <linux/syscalls.h> -#include <linux/compat.h> -#include "entry.h" - -COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); -COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); -COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename); -COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev); -COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode); -COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name); -COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode); -COMPAT_SYSCALL_WRAP2(rename, const char __user *, oldname, const char __user *, newname); -COMPAT_SYSCALL_WRAP2(mkdir, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP1(rmdir, const char __user *, pathname); -COMPAT_SYSCALL_WRAP1(pipe, int __user *, fildes); -COMPAT_SYSCALL_WRAP1(brk, unsigned long, brk); -COMPAT_SYSCALL_WRAP2(signal, int, sig, __sighandler_t, handler); -COMPAT_SYSCALL_WRAP1(acct, const char __user *, name); -COMPAT_SYSCALL_WRAP2(umount, char __user *, name, int, flags); -COMPAT_SYSCALL_WRAP1(chroot, const char __user *, filename); -COMPAT_SYSCALL_WRAP3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask); -COMPAT_SYSCALL_WRAP2(sethostname, char __user *, name, int, len); -COMPAT_SYSCALL_WRAP2(symlink, const char __user *, old, const char __user *, new); -COMPAT_SYSCALL_WRAP3(readlink, const char __user *, path, char __user *, buf, int, bufsiz); -COMPAT_SYSCALL_WRAP1(uselib, const char __user *, library); -COMPAT_SYSCALL_WRAP2(swapon, const char __user *, specialfile, int, swap_flags); -COMPAT_SYSCALL_WRAP4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg); -COMPAT_SYSCALL_WRAP2(munmap, unsigned long, addr, size_t, len); -COMPAT_SYSCALL_WRAP3(syslog, int, type, char __user *, buf, int, len); -COMPAT_SYSCALL_WRAP1(swapoff, const char __user *, specialfile); -COMPAT_SYSCALL_WRAP2(setdomainname, char __user *, name, int, len); -COMPAT_SYSCALL_WRAP1(newuname, struct new_utsname __user *, name); -COMPAT_SYSCALL_WRAP3(mprotect, unsigned long, start, size_t, len, unsigned long, prot); -COMPAT_SYSCALL_WRAP3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs); -COMPAT_SYSCALL_WRAP2(delete_module, const char __user *, name_user, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr); -COMPAT_SYSCALL_WRAP2(bdflush, int, func, long, data); -COMPAT_SYSCALL_WRAP3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2); -COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence); -COMPAT_SYSCALL_WRAP3(msync, unsigned long, start, size_t, len, int, flags); -COMPAT_SYSCALL_WRAP2(mlock, unsigned long, start, size_t, len); -COMPAT_SYSCALL_WRAP2(munlock, unsigned long, start, size_t, len); -COMPAT_SYSCALL_WRAP2(sched_setparam, pid_t, pid, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP2(sched_getparam, pid_t, pid, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param); -COMPAT_SYSCALL_WRAP5(mremap, unsigned long, addr, unsigned long, old_len, unsigned long, new_len, unsigned long, flags, unsigned long, new_addr); -COMPAT_SYSCALL_WRAP3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout); -COMPAT_SYSCALL_WRAP5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5); -COMPAT_SYSCALL_WRAP2(getcwd, char __user *, buf, unsigned long, size); -COMPAT_SYSCALL_WRAP2(capget, cap_user_header_t, header, cap_user_data_t, dataptr); -COMPAT_SYSCALL_WRAP2(capset, cap_user_header_t, header, const cap_user_data_t, data); -COMPAT_SYSCALL_WRAP3(lchown, const char __user *, filename, uid_t, user, gid_t, group); -COMPAT_SYSCALL_WRAP2(getgroups, int, gidsetsize, gid_t __user *, grouplist); -COMPAT_SYSCALL_WRAP2(setgroups, int, gidsetsize, gid_t __user *, grouplist); -COMPAT_SYSCALL_WRAP3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid); -COMPAT_SYSCALL_WRAP3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid); -COMPAT_SYSCALL_WRAP3(chown, const char __user *, filename, uid_t, user, gid_t, group); -COMPAT_SYSCALL_WRAP2(pivot_root, const char __user *, new_root, const char __user *, put_old); -COMPAT_SYSCALL_WRAP3(mincore, unsigned long, start, size_t, len, unsigned char __user *, vec); -COMPAT_SYSCALL_WRAP3(madvise, unsigned long, start, size_t, len, int, behavior); -COMPAT_SYSCALL_WRAP5(setxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP5(lsetxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP5(fsetxattr, int, fd, const char __user *, name, const void __user *, value, size_t, size, int, flags); -COMPAT_SYSCALL_WRAP3(getdents64, unsigned int, fd, struct linux_dirent64 __user *, dirent, unsigned int, count); -COMPAT_SYSCALL_WRAP4(getxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP4(lgetxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP4(fgetxattr, int, fd, const char __user *, name, void __user *, value, size_t, size); -COMPAT_SYSCALL_WRAP3(listxattr, const char __user *, path, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP3(llistxattr, const char __user *, path, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP3(flistxattr, int, fd, char __user *, list, size_t, size); -COMPAT_SYSCALL_WRAP2(removexattr, const char __user *, path, const char __user *, name); -COMPAT_SYSCALL_WRAP2(lremovexattr, const char __user *, path, const char __user *, name); -COMPAT_SYSCALL_WRAP2(fremovexattr, int, fd, const char __user *, name); -COMPAT_SYSCALL_WRAP1(set_tid_address, int __user *, tidptr); -COMPAT_SYSCALL_WRAP4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event); -COMPAT_SYSCALL_WRAP4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout); -COMPAT_SYSCALL_WRAP1(io_destroy, aio_context_t, ctx); -COMPAT_SYSCALL_WRAP3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, struct io_event __user *, result); -COMPAT_SYSCALL_WRAP1(mq_unlink, const char __user *, name); -COMPAT_SYSCALL_WRAP5(add_key, const char __user *, tp, const char __user *, dsc, const void __user *, pld, size_t, len, key_serial_t, id); -COMPAT_SYSCALL_WRAP4(request_key, const char __user *, tp, const char __user *, dsc, const char __user *, info, key_serial_t, id); -COMPAT_SYSCALL_WRAP5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long, prot, unsigned long, pgoff, unsigned long, flags); -COMPAT_SYSCALL_WRAP3(inotify_add_watch, int, fd, const char __user *, path, u32, mask); -COMPAT_SYSCALL_WRAP3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode); -COMPAT_SYSCALL_WRAP4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev); -COMPAT_SYSCALL_WRAP5(fchownat, int, dfd, const char __user *, filename, uid_t, user, gid_t, group, int, flag); -COMPAT_SYSCALL_WRAP3(unlinkat, int, dfd, const char __user *, pathname, int, flag); -COMPAT_SYSCALL_WRAP4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname); -COMPAT_SYSCALL_WRAP5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags); -COMPAT_SYSCALL_WRAP3(symlinkat, const char __user *, oldname, int, newdfd, const char __user *, newname); -COMPAT_SYSCALL_WRAP4(readlinkat, int, dfd, const char __user *, path, char __user *, buf, int, bufsiz); -COMPAT_SYSCALL_WRAP3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode); -COMPAT_SYSCALL_WRAP3(faccessat, int, dfd, const char __user *, filename, int, mode); -COMPAT_SYSCALL_WRAP1(unshare, unsigned long, unshare_flags); -COMPAT_SYSCALL_WRAP6(splice, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags); -COMPAT_SYSCALL_WRAP3(getcpu, unsigned __user *, cpu, unsigned __user *, node, struct getcpu_cache __user *, cache); -COMPAT_SYSCALL_WRAP2(pipe2, int __user *, fildes, int, flags); -COMPAT_SYSCALL_WRAP5(perf_event_open, struct perf_event_attr __user *, attr_uptr, pid_t, pid, int, cpu, int, group_fd, unsigned long, flags); -COMPAT_SYSCALL_WRAP5(clone, unsigned long, newsp, unsigned long, clone_flags, int __user *, parent_tidptr, int __user *, child_tidptr, unsigned long, tls); -COMPAT_SYSCALL_WRAP4(prlimit64, pid_t, pid, unsigned int, resource, const struct rlimit64 __user *, new_rlim, struct rlimit64 __user *, old_rlim); -COMPAT_SYSCALL_WRAP5(name_to_handle_at, int, dfd, const char __user *, name, struct file_handle __user *, handle, int __user *, mnt_id, int, flag); -COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2); -COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags); -COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags); -COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags); -COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags); -COMPAT_SYSCALL_WRAP3(seccomp, unsigned int, op, unsigned int, flags, const char __user *, uargs) -COMPAT_SYSCALL_WRAP3(getrandom, char __user *, buf, size_t, count, unsigned int, flags) -COMPAT_SYSCALL_WRAP2(memfd_create, const char __user *, uname, unsigned int, flags) -COMPAT_SYSCALL_WRAP3(bpf, int, cmd, union bpf_attr *, attr, unsigned int, size); -COMPAT_SYSCALL_WRAP3(s390_pci_mmio_write, const unsigned long, mmio_addr, const void __user *, user_buffer, const size_t, length); -COMPAT_SYSCALL_WRAP3(s390_pci_mmio_read, const unsigned long, mmio_addr, void __user *, user_buffer, const size_t, length); -COMPAT_SYSCALL_WRAP4(socketpair, int, family, int, type, int, protocol, int __user *, usockvec); -COMPAT_SYSCALL_WRAP3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen); -COMPAT_SYSCALL_WRAP3(connect, int, fd, struct sockaddr __user *, uservaddr, int, addrlen); -COMPAT_SYSCALL_WRAP4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, int __user *, upeer_addrlen, int, flags); -COMPAT_SYSCALL_WRAP3(getsockname, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); -COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); -COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); -COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); -COMPAT_SYSCALL_WRAP6(copy_file_range, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); diff --git a/kernel/Makefile b/kernel/Makefile index f0c40bf..882eec03 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -64,6 +64,7 @@ obj-$(CONFIG_KEXEC) += kexec.o obj-$(CONFIG_KEXEC_FILE) += kexec_file.o obj-$(CONFIG_BACKTRACE_SELF_TEST) += backtracetest.o obj-$(CONFIG_COMPAT) += compat.o +obj-$(CONFIG_COMPAT_WRAPPER) += compat_wrapper.o obj-$(CONFIG_CGROUPS) += cgroup.o obj-$(CONFIG_CGROUP_FREEZER) += cgroup_freezer.o obj-$(CONFIG_CGROUP_PIDS) += cgroup_pids.o diff --git a/kernel/compat_wrapper.c b/kernel/compat_wrapper.c new file mode 100644 index 0000000..b6c050e --- /dev/null +++ b/kernel/compat_wrapper.c @@ -0,0 +1,175 @@ +/* + * Compat system call wrappers. + * + * Copyright IBM Corp. 2014 + */ + +#include <linux/syscalls.h> +#include <linux/compat.h> + +COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); +COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); +COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename); +COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev); +COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode); + +#ifdef __ARCH_WANT_SYS_OLDUMOUNT +COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name); +#endif + +COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode); +COMPAT_SYSCALL_WRAP2(rename, const char __user *, oldname, const char __user *, newname); +COMPAT_SYSCALL_WRAP2(mkdir, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP1(rmdir, const char __user *, pathname); +COMPAT_SYSCALL_WRAP1(pipe, int __user *, fildes); +COMPAT_SYSCALL_WRAP1(brk, unsigned long, brk); + +#ifdef __ARCH_WANT_SYS_SIGNAL +COMPAT_SYSCALL_WRAP2(signal, int, sig, __sighandler_t, handler); +#endif + +COMPAT_SYSCALL_WRAP1(acct, const char __user *, name); +COMPAT_SYSCALL_WRAP2(umount, char __user *, name, int, flags); +COMPAT_SYSCALL_WRAP1(chroot, const char __user *, filename); + +#ifdef CONFIG_OLD_SIGSUSPEND +SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask); +#endif + +#ifdef CONFIG_OLD_SIGSUSPEND3 +COMPAT_SYSCALL_WRAP3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask); +#endif + +COMPAT_SYSCALL_WRAP2(sethostname, char __user *, name, int, len); +COMPAT_SYSCALL_WRAP2(symlink, const char __user *, old, const char __user *, new); +COMPAT_SYSCALL_WRAP3(readlink, const char __user *, path, char __user *, buf, int, bufsiz); +COMPAT_SYSCALL_WRAP1(uselib, const char __user *, library); +COMPAT_SYSCALL_WRAP2(swapon, const char __user *, specialfile, int, swap_flags); +COMPAT_SYSCALL_WRAP4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg); +COMPAT_SYSCALL_WRAP2(munmap, unsigned long, addr, size_t, len); +COMPAT_SYSCALL_WRAP3(syslog, int, type, char __user *, buf, int, len); +COMPAT_SYSCALL_WRAP1(swapoff, const char __user *, specialfile); +COMPAT_SYSCALL_WRAP2(setdomainname, char __user *, name, int, len); +COMPAT_SYSCALL_WRAP1(newuname, struct new_utsname __user *, name); +COMPAT_SYSCALL_WRAP3(mprotect, unsigned long, start, size_t, len, unsigned long, prot); +COMPAT_SYSCALL_WRAP3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs); +COMPAT_SYSCALL_WRAP2(delete_module, const char __user *, name_user, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr); +COMPAT_SYSCALL_WRAP2(bdflush, int, func, long, data); +COMPAT_SYSCALL_WRAP3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2); + +#ifdef __ARCH_WANT_SYS_LLSEEK +COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence); +#endif + +COMPAT_SYSCALL_WRAP3(msync, unsigned long, start, size_t, len, int, flags); +COMPAT_SYSCALL_WRAP2(mlock, unsigned long, start, size_t, len); +COMPAT_SYSCALL_WRAP2(munlock, unsigned long, start, size_t, len); +COMPAT_SYSCALL_WRAP2(sched_setparam, pid_t, pid, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP2(sched_getparam, pid_t, pid, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param); +COMPAT_SYSCALL_WRAP5(mremap, unsigned long, addr, unsigned long, old_len, unsigned long, new_len, unsigned long, flags, unsigned long, new_addr); +COMPAT_SYSCALL_WRAP3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout); +COMPAT_SYSCALL_WRAP5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5); +COMPAT_SYSCALL_WRAP2(getcwd, char __user *, buf, unsigned long, size); +COMPAT_SYSCALL_WRAP2(capget, cap_user_header_t, header, cap_user_data_t, dataptr); +COMPAT_SYSCALL_WRAP2(capset, cap_user_header_t, header, const cap_user_data_t, data); +COMPAT_SYSCALL_WRAP3(lchown, const char __user *, filename, uid_t, user, gid_t, group); +COMPAT_SYSCALL_WRAP2(getgroups, int, gidsetsize, gid_t __user *, grouplist); +COMPAT_SYSCALL_WRAP2(setgroups, int, gidsetsize, gid_t __user *, grouplist); +COMPAT_SYSCALL_WRAP3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid); +COMPAT_SYSCALL_WRAP3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid); +COMPAT_SYSCALL_WRAP3(chown, const char __user *, filename, uid_t, user, gid_t, group); +COMPAT_SYSCALL_WRAP2(pivot_root, const char __user *, new_root, const char __user *, put_old); +COMPAT_SYSCALL_WRAP3(mincore, unsigned long, start, size_t, len, unsigned char __user *, vec); +COMPAT_SYSCALL_WRAP3(madvise, unsigned long, start, size_t, len, int, behavior); +COMPAT_SYSCALL_WRAP5(setxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); +COMPAT_SYSCALL_WRAP5(lsetxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); +COMPAT_SYSCALL_WRAP5(fsetxattr, int, fd, const char __user *, name, const void __user *, value, size_t, size, int, flags); + +#ifndef __ARCH_WANT_COMPAT_SYS_GETDENTS64 +COMPAT_SYSCALL_WRAP3(getdents64, unsigned int, fd, struct linux_dirent64 __user *, dirent, unsigned int, count); +#endif + +COMPAT_SYSCALL_WRAP4(getxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP4(lgetxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP4(fgetxattr, int, fd, const char __user *, name, void __user *, value, size_t, size); +COMPAT_SYSCALL_WRAP3(listxattr, const char __user *, path, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP3(llistxattr, const char __user *, path, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP3(flistxattr, int, fd, char __user *, list, size_t, size); +COMPAT_SYSCALL_WRAP2(removexattr, const char __user *, path, const char __user *, name); +COMPAT_SYSCALL_WRAP2(lremovexattr, const char __user *, path, const char __user *, name); +COMPAT_SYSCALL_WRAP2(fremovexattr, int, fd, const char __user *, name); +COMPAT_SYSCALL_WRAP1(set_tid_address, int __user *, tidptr); +COMPAT_SYSCALL_WRAP4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event); +COMPAT_SYSCALL_WRAP4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout); +COMPAT_SYSCALL_WRAP1(io_destroy, aio_context_t, ctx); +COMPAT_SYSCALL_WRAP3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, struct io_event __user *, result); +COMPAT_SYSCALL_WRAP1(mq_unlink, const char __user *, name); +COMPAT_SYSCALL_WRAP5(add_key, const char __user *, tp, const char __user *, dsc, const void __user *, pld, size_t, len, key_serial_t, id); +COMPAT_SYSCALL_WRAP4(request_key, const char __user *, tp, const char __user *, dsc, const char __user *, info, key_serial_t, id); +COMPAT_SYSCALL_WRAP5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long, prot, unsigned long, pgoff, unsigned long, flags); +COMPAT_SYSCALL_WRAP3(inotify_add_watch, int, fd, const char __user *, path, u32, mask); +COMPAT_SYSCALL_WRAP3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode); +COMPAT_SYSCALL_WRAP4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev); +COMPAT_SYSCALL_WRAP5(fchownat, int, dfd, const char __user *, filename, uid_t, user, gid_t, group, int, flag); +COMPAT_SYSCALL_WRAP3(unlinkat, int, dfd, const char __user *, pathname, int, flag); +COMPAT_SYSCALL_WRAP4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname); +COMPAT_SYSCALL_WRAP5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags); +COMPAT_SYSCALL_WRAP3(symlinkat, const char __user *, oldname, int, newdfd, const char __user *, newname); +COMPAT_SYSCALL_WRAP4(readlinkat, int, dfd, const char __user *, path, char __user *, buf, int, bufsiz); +COMPAT_SYSCALL_WRAP3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode); +COMPAT_SYSCALL_WRAP3(faccessat, int, dfd, const char __user *, filename, int, mode); +COMPAT_SYSCALL_WRAP1(unshare, unsigned long, unshare_flags); +COMPAT_SYSCALL_WRAP6(splice, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags); +COMPAT_SYSCALL_WRAP3(getcpu, unsigned __user *, cpu, unsigned __user *, node, struct getcpu_cache __user *, cache); +COMPAT_SYSCALL_WRAP2(pipe2, int __user *, fildes, int, flags); +COMPAT_SYSCALL_WRAP5(perf_event_open, struct perf_event_attr __user *, attr_uptr, pid_t, pid, int, cpu, int, group_fd, unsigned long, flags); + +#ifdef __ARCH_WANT_SYS_CLONE +#ifdef CONFIG_CLONE_BACKWARDS +COMPAT_SYSCALL_WRAP5(clone, unsigned long, clone_flags, unsigned long, newsp, + int __user *, parent_tidptr, + unsigned long, tls, + int __user *, child_tidptr); +#elif defined(CONFIG_CLONE_BACKWARDS2) + COMPAT_SYSCALL_WRAP5(clone, unsigned long, newsp, unsigned long, clone_flags, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#elif defined(CONFIG_CLONE_BACKWARDS3) + COMPAT_SYSCALL_WRAP6(clone, unsigned long, clone_flags, unsigned long, newsp, + int, stack_size, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#else +COMPAT_SYSCALL_WRAP5(clone, unsigned long, clone_flags, unsigned long, newsp, + int __user *, parent_tidptr, + int __user *, child_tidptr, + unsigned long, tls); +#endif +#endif + +COMPAT_SYSCALL_WRAP4(prlimit64, pid_t, pid, unsigned int, resource, const struct rlimit64 __user *, new_rlim, struct rlimit64 __user *, old_rlim); +COMPAT_SYSCALL_WRAP5(name_to_handle_at, int, dfd, const char __user *, name, struct file_handle __user *, handle, int __user *, mnt_id, int, flag); +COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2); +COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags); +COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags); +COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags); +COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags); +COMPAT_SYSCALL_WRAP3(seccomp, unsigned int, op, unsigned int, flags, const char __user *, uargs) +COMPAT_SYSCALL_WRAP3(getrandom, char __user *, buf, size_t, count, unsigned int, flags) +COMPAT_SYSCALL_WRAP2(memfd_create, const char __user *, uname, unsigned int, flags) +COMPAT_SYSCALL_WRAP3(bpf, int, cmd, union bpf_attr *, attr, unsigned int, size); +COMPAT_SYSCALL_WRAP4(socketpair, int, family, int, type, int, protocol, int __user *, usockvec); +COMPAT_SYSCALL_WRAP3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen); +COMPAT_SYSCALL_WRAP3(connect, int, fd, struct sockaddr __user *, uservaddr, int, addrlen); +COMPAT_SYSCALL_WRAP4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, int __user *, upeer_addrlen, int, flags); +COMPAT_SYSCALL_WRAP3(getsockname, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); +COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); +COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); +COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); +COMPAT_SYSCALL_WRAP6(copy_file_range, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags); -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 05/23] all: wrap needed syscalls in generic unistd 2016-05-24 0:04 ` Yury Norov (?) (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich As generic unistd syscall table is written in C, syscall prototypes declaration is needed. It's added to compat header. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- include/linux/compat.h | 225 +++++++++++++++++++++++++++++++++++++ include/uapi/asm-generic/unistd.h | 227 +++++++++++++++++++------------------- 2 files changed, 338 insertions(+), 114 deletions(-) diff --git a/include/linux/compat.h b/include/linux/compat.h index 4eba16e..248e015 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -789,6 +789,231 @@ asmlinkage long notrace compat_SyS##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) } #endif +/* Compat wrappers */ +#include <linux/syscalls_structs.h> +asmlinkage long compat_sys_creat(const char __user *pathname, umode_t mode); +asmlinkage long compat_sys_link(const char __user *oldname, + const char __user *newname); +asmlinkage long compat_sys_chdir(const char __user *filename); +asmlinkage long compat_sys_mknod(const char __user *filename, umode_t mode, + unsigned dev); +asmlinkage long compat_sys_chmod(const char __user *filename, umode_t mode); +asmlinkage long compat_sys_oldumount(char __user *name); +asmlinkage long compat_sys_access(const char __user *filename, int mode); +asmlinkage long compat_sys_rename(const char __user *oldname, + const char __user *newname); +asmlinkage long compat_sys_mkdir(const char __user *pathname, umode_t mode); +asmlinkage long compat_sys_rmdir(const char __user *pathname); +asmlinkage long compat_sys_pipe(int __user *fildes); +asmlinkage long compat_sys_brk(unsigned long brk); +asmlinkage long compat_sys_signal(int sig, __sighandler_t handler); +asmlinkage long compat_sys_acct(const char __user *name); +asmlinkage long compat_sys_umount(char __user *name, int flags); +asmlinkage long compat_sys_chroot(const char __user *filename); + +#ifdef CONFIG_OLD_SIGSUSPEND +asmlinkage long compat_sys_sigsuspend(old_sigset_t mask); +#endif + +#ifdef CONFIG_OLD_SIGSUSPEND3 +asmlinkage long compat_sys_sigsuspend(int unused1, int unused2, old_sigset_t mask); +#endif + +asmlinkage long compat_sys_sethostname(char __user *name, int len); +asmlinkage long compat_sys_symlink(const char __user *old, const char __user *new); +asmlinkage long compat_sys_readlink(const char __user *path, + char __user *buf, int bufsiz); +asmlinkage long compat_sys_uselib(const char __user *library); +asmlinkage long compat_sys_swapon(const char __user *specialfile, int swap_flags); +asmlinkage long compat_sys_reboot(int magic1, int magic2, unsigned int cmd, + void __user *arg); +asmlinkage long compat_sys_munmap(unsigned long addr, size_t len); +asmlinkage long compat_sys_munmap(unsigned long addr, size_t len); +asmlinkage long compat_sys_syslog(int type, char __user *buf, int len); +asmlinkage long compat_sys_swapoff(const char __user *specialfile); +asmlinkage long compat_sys_setdomainname(char __user *name, int len); +asmlinkage long compat_sys_newuname(struct new_utsname __user *name); +asmlinkage long compat_sys_mprotect(unsigned long start, size_t len, + unsigned long prot); +asmlinkage long compat_sys_init_module(void __user *umod, unsigned long len, + const char __user *uargs); +asmlinkage long compat_sys_delete_module(const char __user *name_user, + unsigned int flags); +asmlinkage long compat_sys_quotactl(unsigned int cmd, const char __user *special, + qid_t id, void __user *addr); +asmlinkage long compat_sys_bdflush(int func, long data); +asmlinkage long compat_sys_sysfs(int option, + unsigned long arg1, unsigned long arg2); +asmlinkage long compat_sys_llseek(unsigned int fd, unsigned long offset_high, + unsigned long offset_low, loff_t __user *result, + unsigned int whence); +asmlinkage long compat_sys_msync(unsigned long start, size_t len, int flags); +asmlinkage long compat_sys_mlock(unsigned long start, size_t len); +asmlinkage long compat_sys_munlock(unsigned long start, size_t len); +asmlinkage long compat_sys_sched_setparam(pid_t pid, + struct sched_param __user *param); +asmlinkage long compat_sys_sched_getparam(pid_t pid, + struct sched_param __user *param); +asmlinkage long compat_sys_sched_setscheduler(pid_t pid, int policy, + struct sched_param __user *param); +asmlinkage long compat_sys_mremap(unsigned long addr, + unsigned long old_len, unsigned long new_len, + unsigned long flags, unsigned long new_addr); +asmlinkage long compat_sys_poll(struct pollfd __user *ufds, unsigned int nfds, + int timeout); +asmlinkage long compat_sys_prctl(int option, unsigned long arg2, unsigned long arg3, + unsigned long arg4, unsigned long arg5); +asmlinkage long compat_sys_getcwd(char __user *buf, unsigned long size); +asmlinkage long compat_sys_capget(cap_user_header_t header, + cap_user_data_t dataptr); +asmlinkage long compat_sys_capset(cap_user_header_t header, + const cap_user_data_t data); +asmlinkage long compat_sys_lchown(const char __user *filename, + uid_t user, gid_t group); +asmlinkage long compat_sys_getgroups(int gidsetsize, gid_t __user *grouplist); +asmlinkage long compat_sys_setgroups(int gidsetsize, gid_t __user *grouplist); +asmlinkage long compat_sys_getresuid(uid_t __user *ruid, uid_t __user *euid, uid_t __user *suid); +asmlinkage long compat_sys_getresgid(gid_t __user *rgid, gid_t __user *egid, gid_t __user *sgid); +asmlinkage long compat_sys_chown(const char __user *filename, + uid_t user, gid_t group); +asmlinkage long compat_sys_pivot_root(const char __user *new_root, + const char __user *put_old); +asmlinkage long compat_sys_mincore(unsigned long start, size_t len, + unsigned char __user * vec); +asmlinkage long compat_sys_madvise(unsigned long start, size_t len, int behavior); +asmlinkage long compat_sys_setxattr(const char __user *path, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_lsetxattr(const char __user *path, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_fsetxattr(int fd, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_getdents64(unsigned int fd, + struct linux_dirent64 __user *dirent, + unsigned int count); +asmlinkage long compat_sys_getxattr(const char __user *path, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_lgetxattr(const char __user *path, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_fgetxattr(int fd, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_listxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_llistxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_flistxattr(int fd, char __user *list, size_t size); +asmlinkage long compat_sys_listxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_llistxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_flistxattr(int fd, char __user *list, size_t size); +asmlinkage long compat_sys_removexattr(const char __user *path, + const char __user *name); +asmlinkage long compat_sys_lremovexattr(const char __user *path, + const char __user *name); +asmlinkage long compat_sys_fremovexattr(int fd, const char __user *name); +asmlinkage long compat_sys_set_tid_address(int __user *tidptr); +asmlinkage long compat_sys_epoll_ctl(int epfd, int op, int fd, + struct epoll_event __user *event); +asmlinkage long compat_sys_epoll_wait(int epfd, struct epoll_event __user *events, + int maxevents, int timeout); +asmlinkage long compat_sys_io_destroy(aio_context_t ctx); +asmlinkage long compat_sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb, + struct io_event __user *result); +asmlinkage long compat_sys_mq_unlink(const char __user *name); +asmlinkage long compat_sys_add_key(const char __user *_type, + const char __user *_description, + const void __user *_payload, + size_t plen, + key_serial_t destringid); +asmlinkage long compat_sys_request_key(const char __user *_type, + const char __user *_description, + const char __user *_callout_info, + key_serial_t destringid); +asmlinkage long compat_sys_remap_file_pages(unsigned long start, unsigned long size, + unsigned long prot, unsigned long pgoff, + unsigned long flags); +asmlinkage long compat_sys_inotify_add_watch(int fd, const char __user *path, + u32 mask); +asmlinkage long compat_sys_mknodat(int dfd, const char __user * filename, umode_t mode, + unsigned dev); +asmlinkage long compat_sys_mkdirat(int dfd, const char __user * pathname, umode_t mode); +asmlinkage long compat_sys_fchownat(int dfd, const char __user *filename, uid_t user, + gid_t group, int flag); +asmlinkage long compat_sys_unlinkat(int dfd, const char __user * pathname, int flag); +asmlinkage long compat_sys_renameat(int olddfd, const char __user * oldname, + int newdfd, const char __user * newname); +asmlinkage long compat_sys_symlinkat(const char __user * oldname, + int newdfd, const char __user * newname); +asmlinkage long compat_sys_linkat(int olddfd, const char __user *oldname, + int newdfd, const char __user *newname, int flags); +asmlinkage long compat_sys_readlinkat(int dfd, const char __user *path, char __user *buf, + int bufsiz); +asmlinkage long compat_sys_fchmodat(int dfd, const char __user * filename, + umode_t mode); +asmlinkage long compat_sys_faccessat(int dfd, const char __user *filename, int mode); +asmlinkage long compat_sys_unshare(unsigned long unshare_flags); +asmlinkage long compat_sys_splice(int fd_in, loff_t __user *off_in, + int fd_out, loff_t __user *off_out, + size_t len, unsigned int flags); +asmlinkage long compat_sys_tee(int fdin, int fdout, size_t len, unsigned int flags); +asmlinkage long compat_sys_getcpu(unsigned __user *cpu, unsigned __user *node, struct getcpu_cache __user *cache); +asmlinkage long compat_sys_pipe2(int __user *fildes, int flags); +asmlinkage long compat_sys_perf_event_open( + struct perf_event_attr __user *attr_uptr, + pid_t pid, int cpu, int group_fd, unsigned long flags); + +#ifdef CONFIG_CLONE_BACKWARDS +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int __user *, unsigned long, + int __user *); +#else +#ifdef CONFIG_CLONE_BACKWARDS3 +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int, int __user *, + int __user *, unsigned long); +#else +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int __user *, + int __user *, unsigned long); +#endif +#endif + +asmlinkage long compat_sys_prlimit64(pid_t pid, unsigned int resource, + const struct rlimit64 __user *new_rlim, + struct rlimit64 __user *old_rlim); +asmlinkage long compat_sys_name_to_handle_at(int dfd, const char __user *name, + struct file_handle __user *handle, + int __user *mnt_id, int flag); +asmlinkage long compat_sys_kcmp(pid_t pid1, pid_t pid2, int type, + unsigned long idx1, unsigned long idx2); +asmlinkage long compat_sys_finit_module(int fd, const char __user *uargs, int flags); +asmlinkage long compat_sys_sched_setattr(pid_t pid, + struct sched_attr __user *attr, + unsigned int flags); +asmlinkage long compat_sys_sched_getattr(pid_t pid, + struct sched_attr __user *attr, + unsigned int size, + unsigned int flags); +asmlinkage long compat_sys_renameat2(int olddfd, const char __user *oldname, + int newdfd, const char __user *newname, + unsigned int flags); +asmlinkage long compat_sys_seccomp(unsigned int op, unsigned int flags, + const char __user *uargs); +asmlinkage long compat_sys_getrandom(char __user *buf, size_t count, + unsigned int flags); +asmlinkage long compat_sys_memfd_create(const char __user *uname_ptr, unsigned int flags); +asmlinkage long compat_sys_bpf(int cmd, union bpf_attr *attr, unsigned int size); +asmlinkage long compat_sys_socketpair(int, int, int, int __user *); +asmlinkage long compat_sys_bind(int, struct sockaddr __user *, int); +asmlinkage long compat_sys_connect(int, struct sockaddr __user *, int); +asmlinkage long compat_sys_accept4(int, struct sockaddr __user *, int __user *, int); +asmlinkage long compat_sys_getsockname(int, struct sockaddr __user *, int __user *); +asmlinkage long compat_sys_getpeername(int, struct sockaddr __user *, int __user *); +asmlinkage long compat_sys_sendto(int, void __user *, size_t, unsigned, + struct sockaddr __user *, int); +asmlinkage long compat_sys_mlock2(unsigned long start, size_t len, int flags); + +asmlinkage long compat_sys_copy_file_range(int fd_in, loff_t __user *off_in, + int fd_out, loff_t __user *off_out, + size_t len, unsigned int flags); + #endif /* CONFIG_COMPAT_WRAPPER */ #endif /* _LINUX_COMPAT_H */ diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 7e91d83..6ed4613 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -36,43 +36,43 @@ #define __NR_io_setup 0 __SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup) #define __NR_io_destroy 1 -__SYSCALL(__NR_io_destroy, sys_io_destroy) +__SC_WRAP(__NR_io_destroy, sys_io_destroy) #define __NR_io_submit 2 __SC_COMP(__NR_io_submit, sys_io_submit, compat_sys_io_submit) #define __NR_io_cancel 3 -__SYSCALL(__NR_io_cancel, sys_io_cancel) +__SC_WRAP(__NR_io_cancel, sys_io_cancel) #define __NR_io_getevents 4 __SC_COMP(__NR_io_getevents, sys_io_getevents, compat_sys_io_getevents) /* fs/xattr.c */ #define __NR_setxattr 5 -__SYSCALL(__NR_setxattr, sys_setxattr) +__SC_WRAP(__NR_setxattr, sys_setxattr) #define __NR_lsetxattr 6 -__SYSCALL(__NR_lsetxattr, sys_lsetxattr) +__SC_WRAP(__NR_lsetxattr, sys_lsetxattr) #define __NR_fsetxattr 7 -__SYSCALL(__NR_fsetxattr, sys_fsetxattr) +__SC_WRAP(__NR_fsetxattr, sys_fsetxattr) #define __NR_getxattr 8 -__SYSCALL(__NR_getxattr, sys_getxattr) +__SC_WRAP(__NR_getxattr, sys_getxattr) #define __NR_lgetxattr 9 -__SYSCALL(__NR_lgetxattr, sys_lgetxattr) +__SC_WRAP(__NR_lgetxattr, sys_lgetxattr) #define __NR_fgetxattr 10 -__SYSCALL(__NR_fgetxattr, sys_fgetxattr) +__SC_WRAP(__NR_fgetxattr, sys_fgetxattr) #define __NR_listxattr 11 -__SYSCALL(__NR_listxattr, sys_listxattr) +__SC_WRAP(__NR_listxattr, sys_listxattr) #define __NR_llistxattr 12 -__SYSCALL(__NR_llistxattr, sys_llistxattr) +__SC_WRAP(__NR_llistxattr, sys_llistxattr) #define __NR_flistxattr 13 -__SYSCALL(__NR_flistxattr, sys_flistxattr) +__SC_WRAP(__NR_flistxattr, sys_flistxattr) #define __NR_removexattr 14 -__SYSCALL(__NR_removexattr, sys_removexattr) +__SC_WRAP(__NR_removexattr, sys_removexattr) #define __NR_lremovexattr 15 -__SYSCALL(__NR_lremovexattr, sys_lremovexattr) +__SC_WRAP(__NR_lremovexattr, sys_lremovexattr) #define __NR_fremovexattr 16 -__SYSCALL(__NR_fremovexattr, sys_fremovexattr) +__SC_WRAP(__NR_fremovexattr, sys_fremovexattr) /* fs/dcache.c */ #define __NR_getcwd 17 -__SYSCALL(__NR_getcwd, sys_getcwd) +__SC_WRAP(__NR_getcwd, sys_getcwd) /* fs/cookies.c */ #define __NR_lookup_dcookie 18 @@ -86,7 +86,7 @@ __SYSCALL(__NR_eventfd2, sys_eventfd2) #define __NR_epoll_create1 20 __SYSCALL(__NR_epoll_create1, sys_epoll_create1) #define __NR_epoll_ctl 21 -__SYSCALL(__NR_epoll_ctl, sys_epoll_ctl) +__SC_WRAP(__NR_epoll_ctl, sys_epoll_ctl) #define __NR_epoll_pwait 22 __SC_COMP(__NR_epoll_pwait, sys_epoll_pwait, compat_sys_epoll_pwait) @@ -102,7 +102,7 @@ __SC_COMP_3264(__NR3264_fcntl, sys_fcntl64, sys_fcntl, compat_sys_fcntl64) #define __NR_inotify_init1 26 __SYSCALL(__NR_inotify_init1, sys_inotify_init1) #define __NR_inotify_add_watch 27 -__SYSCALL(__NR_inotify_add_watch, sys_inotify_add_watch) +__SC_WRAP(__NR_inotify_add_watch, sys_inotify_add_watch) #define __NR_inotify_rm_watch 28 __SYSCALL(__NR_inotify_rm_watch, sys_inotify_rm_watch) @@ -122,17 +122,17 @@ __SYSCALL(__NR_flock, sys_flock) /* fs/namei.c */ #define __NR_mknodat 33 -__SYSCALL(__NR_mknodat, sys_mknodat) +__SC_WRAP(__NR_mknodat, sys_mknodat) #define __NR_mkdirat 34 -__SYSCALL(__NR_mkdirat, sys_mkdirat) +__SC_WRAP(__NR_mkdirat, sys_mkdirat) #define __NR_unlinkat 35 -__SYSCALL(__NR_unlinkat, sys_unlinkat) +__SC_WRAP(__NR_unlinkat, sys_unlinkat) #define __NR_symlinkat 36 -__SYSCALL(__NR_symlinkat, sys_symlinkat) +__SC_WRAP(__NR_symlinkat, sys_symlinkat) #define __NR_linkat 37 -__SYSCALL(__NR_linkat, sys_linkat) +__SC_WRAP(__NR_linkat, sys_linkat) #define __NR_renameat 38 -__SYSCALL(__NR_renameat, sys_renameat) +__SC_WRAP(__NR_renameat, sys_renameat) /* fs/namespace.c */ #define __NR_umount2 39 @@ -140,7 +140,7 @@ __SYSCALL(__NR_umount2, sys_umount) #define __NR_mount 40 __SC_COMP(__NR_mount, sys_mount, compat_sys_mount) #define __NR_pivot_root 41 -__SYSCALL(__NR_pivot_root, sys_pivot_root) +__SC_WRAP(__NR_pivot_root, sys_pivot_root) /* fs/nfsctl.c */ #define __NR_nfsservctl 42 @@ -163,23 +163,23 @@ __SC_COMP_3264(__NR3264_ftruncate, sys_ftruncate64, sys_ftruncate, \ #define __NR_fallocate 47 __SC_COMP(__NR_fallocate, sys_fallocate, compat_sys_fallocate) #define __NR_faccessat 48 -__SYSCALL(__NR_faccessat, sys_faccessat) +__SC_WRAP(__NR_faccessat, sys_faccessat) #define __NR_chdir 49 -__SYSCALL(__NR_chdir, sys_chdir) +__SC_WRAP(__NR_chdir, sys_chdir) #define __NR_fchdir 50 __SYSCALL(__NR_fchdir, sys_fchdir) #define __NR_chroot 51 -__SYSCALL(__NR_chroot, sys_chroot) +__SC_WRAP(__NR_chroot, sys_chroot) #define __NR_fchmod 52 __SYSCALL(__NR_fchmod, sys_fchmod) #define __NR_fchmodat 53 -__SYSCALL(__NR_fchmodat, sys_fchmodat) +__SC_WRAP(__NR_fchmodat, sys_fchmodat) #define __NR_fchownat 54 -__SYSCALL(__NR_fchownat, sys_fchownat) +__SC_WRAP(__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 @@ -187,11 +187,11 @@ __SYSCALL(__NR_vhangup, sys_vhangup) /* fs/pipe.c */ #define __NR_pipe2 59 -__SYSCALL(__NR_pipe2, sys_pipe2) +__SC_WRAP(__NR_pipe2, sys_pipe2) /* fs/quota.c */ #define __NR_quotactl 60 -__SYSCALL(__NR_quotactl, sys_quotactl) +__SC_WRAP(__NR_quotactl, sys_quotactl) /* fs/readdir.c */ #define __NR_getdents64 61 @@ -236,13 +236,13 @@ __SC_COMP(__NR_signalfd4, sys_signalfd4, compat_sys_signalfd4) #define __NR_vmsplice 75 __SC_COMP(__NR_vmsplice, sys_vmsplice, compat_sys_vmsplice) #define __NR_splice 76 -__SYSCALL(__NR_splice, sys_splice) +__SC_WRAP(__NR_splice, sys_splice) #define __NR_tee 77 -__SYSCALL(__NR_tee, sys_tee) +__SC_WRAP(__NR_tee, sys_tee) /* fs/stat.c */ #define __NR_readlinkat 78 -__SYSCALL(__NR_readlinkat, sys_readlinkat) +__SC_WRAP(__NR_readlinkat, sys_readlinkat) #define __NR3264_fstatat 79 __SC_3264(__NR3264_fstatat, sys_fstatat64, sys_newfstatat) #define __NR3264_fstat 80 @@ -281,13 +281,13 @@ __SC_COMP(__NR_utimensat, sys_utimensat, compat_sys_utimensat) /* kernel/acct.c */ #define __NR_acct 89 -__SYSCALL(__NR_acct, sys_acct) +__SC_WRAP(__NR_acct, sys_acct) /* kernel/capability.c */ #define __NR_capget 90 -__SYSCALL(__NR_capget, sys_capget) +__SC_WRAP(__NR_capget, sys_capget) #define __NR_capset 91 -__SYSCALL(__NR_capset, sys_capset) +__SC_WRAP(__NR_capset, sys_capset) /* kernel/exec_domain.c */ #define __NR_personality 92 @@ -303,9 +303,9 @@ __SC_COMP(__NR_waitid, sys_waitid, compat_sys_waitid) /* kernel/fork.c */ #define __NR_set_tid_address 96 -__SYSCALL(__NR_set_tid_address, sys_set_tid_address) +__SC_WRAP(__NR_set_tid_address, sys_set_tid_address) #define __NR_unshare 97 -__SYSCALL(__NR_unshare, sys_unshare) +__SC_WRAP(__NR_unshare, sys_unshare) /* kernel/futex.c */ #define __NR_futex 98 @@ -333,9 +333,9 @@ __SC_COMP(__NR_kexec_load, sys_kexec_load, compat_sys_kexec_load) /* kernel/module.c */ #define __NR_init_module 105 -__SYSCALL(__NR_init_module, sys_init_module) +__SC_WRAP(__NR_init_module, sys_init_module) #define __NR_delete_module 106 -__SYSCALL(__NR_delete_module, sys_delete_module) +__SC_WRAP(__NR_delete_module, sys_delete_module) /* kernel/posix-timers.c */ #define __NR_timer_create 107 @@ -360,7 +360,7 @@ __SC_COMP(__NR_clock_nanosleep, sys_clock_nanosleep, \ /* kernel/printk.c */ #define __NR_syslog 116 -__SYSCALL(__NR_syslog, sys_syslog) +__SC_WRAP(__NR_syslog, sys_syslog) /* kernel/ptrace.c */ #define __NR_ptrace 117 @@ -368,13 +368,13 @@ __SYSCALL(__NR_ptrace, sys_ptrace) /* kernel/sched/core.c */ #define __NR_sched_setparam 118 -__SYSCALL(__NR_sched_setparam, sys_sched_setparam) +__SC_WRAP(__NR_sched_setparam, sys_sched_setparam) #define __NR_sched_setscheduler 119 -__SYSCALL(__NR_sched_setscheduler, sys_sched_setscheduler) +__SC_WRAP(__NR_sched_setscheduler, sys_sched_setscheduler) #define __NR_sched_getscheduler 120 __SYSCALL(__NR_sched_getscheduler, sys_sched_getscheduler) #define __NR_sched_getparam 121 -__SYSCALL(__NR_sched_getparam, sys_sched_getparam) +__SC_WRAP(__NR_sched_getparam, sys_sched_getparam) #define __NR_sched_setaffinity 122 __SC_COMP(__NR_sched_setaffinity, sys_sched_setaffinity, \ compat_sys_sched_setaffinity) @@ -425,7 +425,7 @@ __SYSCALL(__NR_setpriority, sys_setpriority) #define __NR_getpriority 141 __SYSCALL(__NR_getpriority, sys_getpriority) #define __NR_reboot 142 -__SYSCALL(__NR_reboot, sys_reboot) +__SC_WRAP(__NR_reboot, sys_reboot) #define __NR_setregid 143 __SYSCALL(__NR_setregid, sys_setregid) #define __NR_setgid 144 @@ -437,11 +437,11 @@ __SYSCALL(__NR_setuid, sys_setuid) #define __NR_setresuid 147 __SYSCALL(__NR_setresuid, sys_setresuid) #define __NR_getresuid 148 -__SYSCALL(__NR_getresuid, sys_getresuid) +__SC_WRAP(__NR_getresuid, sys_getresuid) #define __NR_setresgid 149 __SYSCALL(__NR_setresgid, sys_setresgid) #define __NR_getresgid 150 -__SYSCALL(__NR_getresgid, sys_getresgid) +__SC_WRAP(__NR_getresgid, sys_getresgid) #define __NR_setfsuid 151 __SYSCALL(__NR_setfsuid, sys_setfsuid) #define __NR_setfsgid 152 @@ -457,15 +457,15 @@ __SYSCALL(__NR_getsid, sys_getsid) #define __NR_setsid 157 __SYSCALL(__NR_setsid, sys_setsid) #define __NR_getgroups 158 -__SYSCALL(__NR_getgroups, sys_getgroups) +__SC_WRAP(__NR_getgroups, sys_getgroups) #define __NR_setgroups 159 -__SYSCALL(__NR_setgroups, sys_setgroups) +__SC_WRAP(__NR_setgroups, sys_setgroups) #define __NR_uname 160 -__SYSCALL(__NR_uname, sys_newuname) +__SC_WRAP(__NR_uname, sys_newuname) #define __NR_sethostname 161 -__SYSCALL(__NR_sethostname, sys_sethostname) +__SC_WRAP(__NR_sethostname, sys_sethostname) #define __NR_setdomainname 162 -__SYSCALL(__NR_setdomainname, sys_setdomainname) +__SC_WRAP(__NR_setdomainname, sys_setdomainname) #define __NR_getrlimit 163 __SC_COMP(__NR_getrlimit, sys_getrlimit, compat_sys_getrlimit) #define __NR_setrlimit 164 @@ -475,9 +475,9 @@ __SC_COMP(__NR_getrusage, sys_getrusage, compat_sys_getrusage) #define __NR_umask 166 __SYSCALL(__NR_umask, sys_umask) #define __NR_prctl 167 -__SYSCALL(__NR_prctl, sys_prctl) +__SC_WRAP(__NR_prctl, sys_prctl) #define __NR_getcpu 168 -__SYSCALL(__NR_getcpu, sys_getcpu) +__SC_WRAP(__NR_getcpu, sys_getcpu) /* kernel/time.c */ #define __NR_gettimeofday 169 @@ -509,7 +509,7 @@ __SC_COMP(__NR_sysinfo, sys_sysinfo, compat_sys_sysinfo) #define __NR_mq_open 180 __SC_COMP(__NR_mq_open, sys_mq_open, compat_sys_mq_open) #define __NR_mq_unlink 181 -__SYSCALL(__NR_mq_unlink, sys_mq_unlink) +__SC_WRAP(__NR_mq_unlink, sys_mq_unlink) #define __NR_mq_timedsend 182 __SC_COMP(__NR_mq_timedsend, sys_mq_timedsend, compat_sys_mq_timedsend) #define __NR_mq_timedreceive 183 @@ -554,21 +554,21 @@ __SYSCALL(__NR_shmdt, sys_shmdt) #define __NR_socket 198 __SYSCALL(__NR_socket, sys_socket) #define __NR_socketpair 199 -__SYSCALL(__NR_socketpair, sys_socketpair) +__SC_WRAP(__NR_socketpair, sys_socketpair) #define __NR_bind 200 -__SYSCALL(__NR_bind, sys_bind) +__SC_WRAP(__NR_bind, sys_bind) #define __NR_listen 201 __SYSCALL(__NR_listen, sys_listen) #define __NR_accept 202 __SYSCALL(__NR_accept, sys_accept) #define __NR_connect 203 -__SYSCALL(__NR_connect, sys_connect) +__SC_WRAP(__NR_connect, sys_connect) #define __NR_getsockname 204 -__SYSCALL(__NR_getsockname, sys_getsockname) +__SC_WRAP(__NR_getsockname, sys_getsockname) #define __NR_getpeername 205 -__SYSCALL(__NR_getpeername, sys_getpeername) +__SC_WRAP(__NR_getpeername, sys_getpeername) #define __NR_sendto 206 -__SYSCALL(__NR_sendto, sys_sendto) +__SC_WRAP(__NR_sendto, sys_sendto) #define __NR_recvfrom 207 __SC_COMP(__NR_recvfrom, sys_recvfrom, compat_sys_recvfrom) #define __NR_setsockopt 208 @@ -588,23 +588,23 @@ __SC_COMP(__NR_readahead, sys_readahead, compat_sys_readahead) /* mm/nommu.c, also with MMU */ #define __NR_brk 214 -__SYSCALL(__NR_brk, sys_brk) +__SC_WRAP(__NR_brk, sys_brk) #define __NR_munmap 215 -__SYSCALL(__NR_munmap, sys_munmap) +__SC_WRAP(__NR_munmap, sys_munmap) #define __NR_mremap 216 -__SYSCALL(__NR_mremap, sys_mremap) +__SC_WRAP(__NR_mremap, sys_mremap) /* security/keys/keyctl.c */ #define __NR_add_key 217 -__SYSCALL(__NR_add_key, sys_add_key) +__SC_WRAP(__NR_add_key, sys_add_key) #define __NR_request_key 218 -__SYSCALL(__NR_request_key, sys_request_key) +__SC_WRAP(__NR_request_key, sys_request_key) #define __NR_keyctl 219 __SC_COMP(__NR_keyctl, sys_keyctl, compat_sys_keyctl) /* arch/example/kernel/sys_example.c */ #define __NR_clone 220 -__SYSCALL(__NR_clone, sys_clone) +__SC_WRAP(__NR_clone, sys_clone) #define __NR_execve 221 __SC_COMP(__NR_execve, sys_execve, compat_sys_execve) @@ -617,27 +617,27 @@ __SC_COMP(__NR3264_fadvise64, sys_fadvise64_64, compat_sys_fadvise64_64) /* mm/, CONFIG_MMU only */ #ifndef __ARCH_NOMMU #define __NR_swapon 224 -__SYSCALL(__NR_swapon, sys_swapon) +__SC_WRAP(__NR_swapon, sys_swapon) #define __NR_swapoff 225 -__SYSCALL(__NR_swapoff, sys_swapoff) +__SC_WRAP(__NR_swapoff, sys_swapoff) #define __NR_mprotect 226 -__SYSCALL(__NR_mprotect, sys_mprotect) +__SC_WRAP(__NR_mprotect, sys_mprotect) #define __NR_msync 227 -__SYSCALL(__NR_msync, sys_msync) +__SC_WRAP(__NR_msync, sys_msync) #define __NR_mlock 228 -__SYSCALL(__NR_mlock, sys_mlock) +__SC_WRAP(__NR_mlock, sys_mlock) #define __NR_munlock 229 -__SYSCALL(__NR_munlock, sys_munlock) +__SC_WRAP(__NR_munlock, sys_munlock) #define __NR_mlockall 230 __SYSCALL(__NR_mlockall, sys_mlockall) #define __NR_munlockall 231 __SYSCALL(__NR_munlockall, sys_munlockall) #define __NR_mincore 232 -__SYSCALL(__NR_mincore, sys_mincore) +__SC_WRAP(__NR_mincore, sys_mincore) #define __NR_madvise 233 -__SYSCALL(__NR_madvise, sys_madvise) +__SC_WRAP(__NR_madvise, sys_madvise) #define __NR_remap_file_pages 234 -__SYSCALL(__NR_remap_file_pages, sys_remap_file_pages) +__SC_WRAP(__NR_remap_file_pages, sys_remap_file_pages) #define __NR_mbind 235 __SC_COMP(__NR_mbind, sys_mbind, compat_sys_mbind) #define __NR_get_mempolicy 236 @@ -654,9 +654,9 @@ __SC_COMP(__NR_move_pages, sys_move_pages, compat_sys_move_pages) __SC_COMP(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo, \ compat_sys_rt_tgsigqueueinfo) #define __NR_perf_event_open 241 -__SYSCALL(__NR_perf_event_open, sys_perf_event_open) +__SC_WRAP(__NR_perf_event_open, sys_perf_event_open) #define __NR_accept4 242 -__SYSCALL(__NR_accept4, sys_accept4) +__SC_WRAP(__NR_accept4, sys_accept4) #define __NR_recvmmsg 243 __SC_COMP(__NR_recvmmsg, sys_recvmmsg, compat_sys_recvmmsg) @@ -669,16 +669,15 @@ __SC_COMP(__NR_recvmmsg, sys_recvmmsg, compat_sys_recvmmsg) #define __NR_wait4 260 __SC_COMP(__NR_wait4, sys_wait4, compat_sys_wait4) #define __NR_prlimit64 261 -__SYSCALL(__NR_prlimit64, sys_prlimit64) +__SC_WRAP(__NR_prlimit64, sys_prlimit64) #define __NR_fanotify_init 262 __SYSCALL(__NR_fanotify_init, sys_fanotify_init) #define __NR_fanotify_mark 263 __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) +__SC_WRAP(__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 @@ -694,23 +693,23 @@ __SC_COMP(__NR_process_vm_readv, sys_process_vm_readv, \ __SC_COMP(__NR_process_vm_writev, sys_process_vm_writev, \ compat_sys_process_vm_writev) #define __NR_kcmp 272 -__SYSCALL(__NR_kcmp, sys_kcmp) +__SC_WRAP(__NR_kcmp, sys_kcmp) #define __NR_finit_module 273 -__SYSCALL(__NR_finit_module, sys_finit_module) +__SC_WRAP(__NR_finit_module, sys_finit_module) #define __NR_sched_setattr 274 -__SYSCALL(__NR_sched_setattr, sys_sched_setattr) +__SC_WRAP(__NR_sched_setattr, sys_sched_setattr) #define __NR_sched_getattr 275 -__SYSCALL(__NR_sched_getattr, sys_sched_getattr) +__SC_WRAP(__NR_sched_getattr, sys_sched_getattr) #define __NR_renameat2 276 -__SYSCALL(__NR_renameat2, sys_renameat2) +__SC_WRAP(__NR_renameat2, sys_renameat2) #define __NR_seccomp 277 -__SYSCALL(__NR_seccomp, sys_seccomp) +__SC_WRAP(__NR_seccomp, sys_seccomp) #define __NR_getrandom 278 -__SYSCALL(__NR_getrandom, sys_getrandom) +__SC_WRAP(__NR_getrandom, sys_getrandom) #define __NR_memfd_create 279 -__SYSCALL(__NR_memfd_create, sys_memfd_create) +__SC_WRAP(__NR_memfd_create, sys_memfd_create) #define __NR_bpf 280 -__SYSCALL(__NR_bpf, sys_bpf) +__SC_WRAP(__NR_bpf, sys_bpf) #define __NR_execveat 281 __SC_COMP(__NR_execveat, sys_execveat, compat_sys_execveat) #define __NR_userfaultfd 282 @@ -718,9 +717,9 @@ __SYSCALL(__NR_userfaultfd, sys_userfaultfd) #define __NR_membarrier 283 __SYSCALL(__NR_membarrier, sys_membarrier) #define __NR_mlock2 284 -__SYSCALL(__NR_mlock2, sys_mlock2) +__SC_WRAP(__NR_mlock2, sys_mlock2) #define __NR_copy_file_range 285 -__SYSCALL(__NR_copy_file_range, sys_copy_file_range) +__SC_WRAP(__NR_copy_file_range, sys_copy_file_range) #define __NR_preadv2 286 __SC_COMP(__NR_preadv2, sys_preadv2, compat_sys_preadv2) #define __NR_pwritev2 287 @@ -741,29 +740,29 @@ __SC_COMP(__NR_pwritev2, sys_pwritev2, compat_sys_pwritev2) #define __NR_open 1024 __SYSCALL(__NR_open, sys_open) #define __NR_link 1025 -__SYSCALL(__NR_link, sys_link) +__SC_WRAP(__NR_link, sys_link) #define __NR_unlink 1026 -__SYSCALL(__NR_unlink, sys_unlink) +__SC_WRAP(__NR_unlink, sys_unlink) #define __NR_mknod 1027 -__SYSCALL(__NR_mknod, sys_mknod) +__SC_WRAP(__NR_mknod, sys_mknod) #define __NR_chmod 1028 -__SYSCALL(__NR_chmod, sys_chmod) +__SC_WRAP(__NR_chmod, sys_chmod) #define __NR_chown 1029 -__SYSCALL(__NR_chown, sys_chown) +__SC_WRAP(__NR_chown, sys_chown) #define __NR_mkdir 1030 -__SYSCALL(__NR_mkdir, sys_mkdir) +__SC_WRAP(__NR_mkdir, sys_mkdir) #define __NR_rmdir 1031 -__SYSCALL(__NR_rmdir, sys_rmdir) +__SC_WRAP(__NR_rmdir, sys_rmdir) #define __NR_lchown 1032 -__SYSCALL(__NR_lchown, sys_lchown) +__SC_WRAP(__NR_lchown, sys_lchown) #define __NR_access 1033 -__SYSCALL(__NR_access, sys_access) +__SC_WRAP(__NR_access, sys_access) #define __NR_rename 1034 -__SYSCALL(__NR_rename, sys_rename) +__SC_WRAP(__NR_rename, sys_rename) #define __NR_readlink 1035 -__SYSCALL(__NR_readlink, sys_readlink) +__SC_WRAP(__NR_readlink, sys_readlink) #define __NR_symlink 1036 -__SYSCALL(__NR_symlink, sys_symlink) +__SC_WRAP(__NR_symlink, sys_symlink) #define __NR_utimes 1037 __SYSCALL(__NR_utimes, sys_utimes) #define __NR3264_stat 1038 @@ -777,7 +776,7 @@ __SC_3264(__NR3264_lstat, sys_lstat64, sys_newlstat) #ifdef __ARCH_WANT_SYSCALL_NO_FLAGS #define __NR_pipe 1040 -__SYSCALL(__NR_pipe, sys_pipe) +__SC_WRAP(__NR_pipe, sys_pipe) #define __NR_dup2 1041 __SYSCALL(__NR_dup2, sys_dup2) #define __NR_epoll_create 1042 @@ -847,7 +846,7 @@ __SYSCALL(__NR_time, sys_time) __SYSCALL(__NR_utime, sys_utime) #define __NR_creat 1064 -__SYSCALL(__NR_creat, sys_creat) +__SC_WRAP(__NR_creat, sys_creat) #define __NR_getdents 1065 #define __ARCH_WANT_SYS_GETDENTS __SYSCALL(__NR_getdents, sys_getdents) @@ -857,9 +856,9 @@ __SYSCALL(__NR_futimesat, sys_futimesat) #define __ARCH_WANT_SYS_SELECT __SYSCALL(__NR_select, sys_select) #define __NR_poll 1068 -__SYSCALL(__NR_poll, sys_poll) +__SC_WRAP(__NR_poll, sys_poll) #define __NR_epoll_wait 1069 -__SYSCALL(__NR_epoll_wait, sys_epoll_wait) +__SC_WRAP(__NR_epoll_wait, sys_epoll_wait) #define __NR_ustat 1070 __SYSCALL(__NR_ustat, sys_ustat) #define __NR_vfork 1071 @@ -871,12 +870,12 @@ __SYSCALL(__NR_recv, sys_recv) #define __NR_send 1074 __SYSCALL(__NR_send, sys_send) #define __NR_bdflush 1075 -__SYSCALL(__NR_bdflush, sys_bdflush) +__SC_WRAP(__NR_bdflush, sys_bdflush) #define __NR_umount 1076 -__SYSCALL(__NR_umount, sys_oldumount) +__SC_WRAP(__NR_umount, sys_oldumount) #define __ARCH_WANT_SYS_OLDUMOUNT #define __NR_uselib 1077 -__SYSCALL(__NR_uselib, sys_uselib) +__SC_WRAP(__NR_uselib, sys_uselib) #define __NR__sysctl 1078 __SYSCALL(__NR__sysctl, sys_sysctl) -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 05/23] all: wrap needed syscalls in generic unistd @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel As generic unistd syscall table is written in C, syscall prototypes declaration is needed. It's added to compat header. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- include/linux/compat.h | 225 +++++++++++++++++++++++++++++++++++++ include/uapi/asm-generic/unistd.h | 227 +++++++++++++++++++------------------- 2 files changed, 338 insertions(+), 114 deletions(-) diff --git a/include/linux/compat.h b/include/linux/compat.h index 4eba16e..248e015 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -789,6 +789,231 @@ asmlinkage long notrace compat_SyS##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) } #endif +/* Compat wrappers */ +#include <linux/syscalls_structs.h> +asmlinkage long compat_sys_creat(const char __user *pathname, umode_t mode); +asmlinkage long compat_sys_link(const char __user *oldname, + const char __user *newname); +asmlinkage long compat_sys_chdir(const char __user *filename); +asmlinkage long compat_sys_mknod(const char __user *filename, umode_t mode, + unsigned dev); +asmlinkage long compat_sys_chmod(const char __user *filename, umode_t mode); +asmlinkage long compat_sys_oldumount(char __user *name); +asmlinkage long compat_sys_access(const char __user *filename, int mode); +asmlinkage long compat_sys_rename(const char __user *oldname, + const char __user *newname); +asmlinkage long compat_sys_mkdir(const char __user *pathname, umode_t mode); +asmlinkage long compat_sys_rmdir(const char __user *pathname); +asmlinkage long compat_sys_pipe(int __user *fildes); +asmlinkage long compat_sys_brk(unsigned long brk); +asmlinkage long compat_sys_signal(int sig, __sighandler_t handler); +asmlinkage long compat_sys_acct(const char __user *name); +asmlinkage long compat_sys_umount(char __user *name, int flags); +asmlinkage long compat_sys_chroot(const char __user *filename); + +#ifdef CONFIG_OLD_SIGSUSPEND +asmlinkage long compat_sys_sigsuspend(old_sigset_t mask); +#endif + +#ifdef CONFIG_OLD_SIGSUSPEND3 +asmlinkage long compat_sys_sigsuspend(int unused1, int unused2, old_sigset_t mask); +#endif + +asmlinkage long compat_sys_sethostname(char __user *name, int len); +asmlinkage long compat_sys_symlink(const char __user *old, const char __user *new); +asmlinkage long compat_sys_readlink(const char __user *path, + char __user *buf, int bufsiz); +asmlinkage long compat_sys_uselib(const char __user *library); +asmlinkage long compat_sys_swapon(const char __user *specialfile, int swap_flags); +asmlinkage long compat_sys_reboot(int magic1, int magic2, unsigned int cmd, + void __user *arg); +asmlinkage long compat_sys_munmap(unsigned long addr, size_t len); +asmlinkage long compat_sys_munmap(unsigned long addr, size_t len); +asmlinkage long compat_sys_syslog(int type, char __user *buf, int len); +asmlinkage long compat_sys_swapoff(const char __user *specialfile); +asmlinkage long compat_sys_setdomainname(char __user *name, int len); +asmlinkage long compat_sys_newuname(struct new_utsname __user *name); +asmlinkage long compat_sys_mprotect(unsigned long start, size_t len, + unsigned long prot); +asmlinkage long compat_sys_init_module(void __user *umod, unsigned long len, + const char __user *uargs); +asmlinkage long compat_sys_delete_module(const char __user *name_user, + unsigned int flags); +asmlinkage long compat_sys_quotactl(unsigned int cmd, const char __user *special, + qid_t id, void __user *addr); +asmlinkage long compat_sys_bdflush(int func, long data); +asmlinkage long compat_sys_sysfs(int option, + unsigned long arg1, unsigned long arg2); +asmlinkage long compat_sys_llseek(unsigned int fd, unsigned long offset_high, + unsigned long offset_low, loff_t __user *result, + unsigned int whence); +asmlinkage long compat_sys_msync(unsigned long start, size_t len, int flags); +asmlinkage long compat_sys_mlock(unsigned long start, size_t len); +asmlinkage long compat_sys_munlock(unsigned long start, size_t len); +asmlinkage long compat_sys_sched_setparam(pid_t pid, + struct sched_param __user *param); +asmlinkage long compat_sys_sched_getparam(pid_t pid, + struct sched_param __user *param); +asmlinkage long compat_sys_sched_setscheduler(pid_t pid, int policy, + struct sched_param __user *param); +asmlinkage long compat_sys_mremap(unsigned long addr, + unsigned long old_len, unsigned long new_len, + unsigned long flags, unsigned long new_addr); +asmlinkage long compat_sys_poll(struct pollfd __user *ufds, unsigned int nfds, + int timeout); +asmlinkage long compat_sys_prctl(int option, unsigned long arg2, unsigned long arg3, + unsigned long arg4, unsigned long arg5); +asmlinkage long compat_sys_getcwd(char __user *buf, unsigned long size); +asmlinkage long compat_sys_capget(cap_user_header_t header, + cap_user_data_t dataptr); +asmlinkage long compat_sys_capset(cap_user_header_t header, + const cap_user_data_t data); +asmlinkage long compat_sys_lchown(const char __user *filename, + uid_t user, gid_t group); +asmlinkage long compat_sys_getgroups(int gidsetsize, gid_t __user *grouplist); +asmlinkage long compat_sys_setgroups(int gidsetsize, gid_t __user *grouplist); +asmlinkage long compat_sys_getresuid(uid_t __user *ruid, uid_t __user *euid, uid_t __user *suid); +asmlinkage long compat_sys_getresgid(gid_t __user *rgid, gid_t __user *egid, gid_t __user *sgid); +asmlinkage long compat_sys_chown(const char __user *filename, + uid_t user, gid_t group); +asmlinkage long compat_sys_pivot_root(const char __user *new_root, + const char __user *put_old); +asmlinkage long compat_sys_mincore(unsigned long start, size_t len, + unsigned char __user * vec); +asmlinkage long compat_sys_madvise(unsigned long start, size_t len, int behavior); +asmlinkage long compat_sys_setxattr(const char __user *path, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_lsetxattr(const char __user *path, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_fsetxattr(int fd, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_getdents64(unsigned int fd, + struct linux_dirent64 __user *dirent, + unsigned int count); +asmlinkage long compat_sys_getxattr(const char __user *path, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_lgetxattr(const char __user *path, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_fgetxattr(int fd, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_listxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_llistxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_flistxattr(int fd, char __user *list, size_t size); +asmlinkage long compat_sys_listxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_llistxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_flistxattr(int fd, char __user *list, size_t size); +asmlinkage long compat_sys_removexattr(const char __user *path, + const char __user *name); +asmlinkage long compat_sys_lremovexattr(const char __user *path, + const char __user *name); +asmlinkage long compat_sys_fremovexattr(int fd, const char __user *name); +asmlinkage long compat_sys_set_tid_address(int __user *tidptr); +asmlinkage long compat_sys_epoll_ctl(int epfd, int op, int fd, + struct epoll_event __user *event); +asmlinkage long compat_sys_epoll_wait(int epfd, struct epoll_event __user *events, + int maxevents, int timeout); +asmlinkage long compat_sys_io_destroy(aio_context_t ctx); +asmlinkage long compat_sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb, + struct io_event __user *result); +asmlinkage long compat_sys_mq_unlink(const char __user *name); +asmlinkage long compat_sys_add_key(const char __user *_type, + const char __user *_description, + const void __user *_payload, + size_t plen, + key_serial_t destringid); +asmlinkage long compat_sys_request_key(const char __user *_type, + const char __user *_description, + const char __user *_callout_info, + key_serial_t destringid); +asmlinkage long compat_sys_remap_file_pages(unsigned long start, unsigned long size, + unsigned long prot, unsigned long pgoff, + unsigned long flags); +asmlinkage long compat_sys_inotify_add_watch(int fd, const char __user *path, + u32 mask); +asmlinkage long compat_sys_mknodat(int dfd, const char __user * filename, umode_t mode, + unsigned dev); +asmlinkage long compat_sys_mkdirat(int dfd, const char __user * pathname, umode_t mode); +asmlinkage long compat_sys_fchownat(int dfd, const char __user *filename, uid_t user, + gid_t group, int flag); +asmlinkage long compat_sys_unlinkat(int dfd, const char __user * pathname, int flag); +asmlinkage long compat_sys_renameat(int olddfd, const char __user * oldname, + int newdfd, const char __user * newname); +asmlinkage long compat_sys_symlinkat(const char __user * oldname, + int newdfd, const char __user * newname); +asmlinkage long compat_sys_linkat(int olddfd, const char __user *oldname, + int newdfd, const char __user *newname, int flags); +asmlinkage long compat_sys_readlinkat(int dfd, const char __user *path, char __user *buf, + int bufsiz); +asmlinkage long compat_sys_fchmodat(int dfd, const char __user * filename, + umode_t mode); +asmlinkage long compat_sys_faccessat(int dfd, const char __user *filename, int mode); +asmlinkage long compat_sys_unshare(unsigned long unshare_flags); +asmlinkage long compat_sys_splice(int fd_in, loff_t __user *off_in, + int fd_out, loff_t __user *off_out, + size_t len, unsigned int flags); +asmlinkage long compat_sys_tee(int fdin, int fdout, size_t len, unsigned int flags); +asmlinkage long compat_sys_getcpu(unsigned __user *cpu, unsigned __user *node, struct getcpu_cache __user *cache); +asmlinkage long compat_sys_pipe2(int __user *fildes, int flags); +asmlinkage long compat_sys_perf_event_open( + struct perf_event_attr __user *attr_uptr, + pid_t pid, int cpu, int group_fd, unsigned long flags); + +#ifdef CONFIG_CLONE_BACKWARDS +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int __user *, unsigned long, + int __user *); +#else +#ifdef CONFIG_CLONE_BACKWARDS3 +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int, int __user *, + int __user *, unsigned long); +#else +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int __user *, + int __user *, unsigned long); +#endif +#endif + +asmlinkage long compat_sys_prlimit64(pid_t pid, unsigned int resource, + const struct rlimit64 __user *new_rlim, + struct rlimit64 __user *old_rlim); +asmlinkage long compat_sys_name_to_handle_at(int dfd, const char __user *name, + struct file_handle __user *handle, + int __user *mnt_id, int flag); +asmlinkage long compat_sys_kcmp(pid_t pid1, pid_t pid2, int type, + unsigned long idx1, unsigned long idx2); +asmlinkage long compat_sys_finit_module(int fd, const char __user *uargs, int flags); +asmlinkage long compat_sys_sched_setattr(pid_t pid, + struct sched_attr __user *attr, + unsigned int flags); +asmlinkage long compat_sys_sched_getattr(pid_t pid, + struct sched_attr __user *attr, + unsigned int size, + unsigned int flags); +asmlinkage long compat_sys_renameat2(int olddfd, const char __user *oldname, + int newdfd, const char __user *newname, + unsigned int flags); +asmlinkage long compat_sys_seccomp(unsigned int op, unsigned int flags, + const char __user *uargs); +asmlinkage long compat_sys_getrandom(char __user *buf, size_t count, + unsigned int flags); +asmlinkage long compat_sys_memfd_create(const char __user *uname_ptr, unsigned int flags); +asmlinkage long compat_sys_bpf(int cmd, union bpf_attr *attr, unsigned int size); +asmlinkage long compat_sys_socketpair(int, int, int, int __user *); +asmlinkage long compat_sys_bind(int, struct sockaddr __user *, int); +asmlinkage long compat_sys_connect(int, struct sockaddr __user *, int); +asmlinkage long compat_sys_accept4(int, struct sockaddr __user *, int __user *, int); +asmlinkage long compat_sys_getsockname(int, struct sockaddr __user *, int __user *); +asmlinkage long compat_sys_getpeername(int, struct sockaddr __user *, int __user *); +asmlinkage long compat_sys_sendto(int, void __user *, size_t, unsigned, + struct sockaddr __user *, int); +asmlinkage long compat_sys_mlock2(unsigned long start, size_t len, int flags); + +asmlinkage long compat_sys_copy_file_range(int fd_in, loff_t __user *off_in, + int fd_out, loff_t __user *off_out, + size_t len, unsigned int flags); + #endif /* CONFIG_COMPAT_WRAPPER */ #endif /* _LINUX_COMPAT_H */ diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 7e91d83..6ed4613 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -36,43 +36,43 @@ #define __NR_io_setup 0 __SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup) #define __NR_io_destroy 1 -__SYSCALL(__NR_io_destroy, sys_io_destroy) +__SC_WRAP(__NR_io_destroy, sys_io_destroy) #define __NR_io_submit 2 __SC_COMP(__NR_io_submit, sys_io_submit, compat_sys_io_submit) #define __NR_io_cancel 3 -__SYSCALL(__NR_io_cancel, sys_io_cancel) +__SC_WRAP(__NR_io_cancel, sys_io_cancel) #define __NR_io_getevents 4 __SC_COMP(__NR_io_getevents, sys_io_getevents, compat_sys_io_getevents) /* fs/xattr.c */ #define __NR_setxattr 5 -__SYSCALL(__NR_setxattr, sys_setxattr) +__SC_WRAP(__NR_setxattr, sys_setxattr) #define __NR_lsetxattr 6 -__SYSCALL(__NR_lsetxattr, sys_lsetxattr) +__SC_WRAP(__NR_lsetxattr, sys_lsetxattr) #define __NR_fsetxattr 7 -__SYSCALL(__NR_fsetxattr, sys_fsetxattr) +__SC_WRAP(__NR_fsetxattr, sys_fsetxattr) #define __NR_getxattr 8 -__SYSCALL(__NR_getxattr, sys_getxattr) +__SC_WRAP(__NR_getxattr, sys_getxattr) #define __NR_lgetxattr 9 -__SYSCALL(__NR_lgetxattr, sys_lgetxattr) +__SC_WRAP(__NR_lgetxattr, sys_lgetxattr) #define __NR_fgetxattr 10 -__SYSCALL(__NR_fgetxattr, sys_fgetxattr) +__SC_WRAP(__NR_fgetxattr, sys_fgetxattr) #define __NR_listxattr 11 -__SYSCALL(__NR_listxattr, sys_listxattr) +__SC_WRAP(__NR_listxattr, sys_listxattr) #define __NR_llistxattr 12 -__SYSCALL(__NR_llistxattr, sys_llistxattr) +__SC_WRAP(__NR_llistxattr, sys_llistxattr) #define __NR_flistxattr 13 -__SYSCALL(__NR_flistxattr, sys_flistxattr) +__SC_WRAP(__NR_flistxattr, sys_flistxattr) #define __NR_removexattr 14 -__SYSCALL(__NR_removexattr, sys_removexattr) +__SC_WRAP(__NR_removexattr, sys_removexattr) #define __NR_lremovexattr 15 -__SYSCALL(__NR_lremovexattr, sys_lremovexattr) +__SC_WRAP(__NR_lremovexattr, sys_lremovexattr) #define __NR_fremovexattr 16 -__SYSCALL(__NR_fremovexattr, sys_fremovexattr) +__SC_WRAP(__NR_fremovexattr, sys_fremovexattr) /* fs/dcache.c */ #define __NR_getcwd 17 -__SYSCALL(__NR_getcwd, sys_getcwd) +__SC_WRAP(__NR_getcwd, sys_getcwd) /* fs/cookies.c */ #define __NR_lookup_dcookie 18 @@ -86,7 +86,7 @@ __SYSCALL(__NR_eventfd2, sys_eventfd2) #define __NR_epoll_create1 20 __SYSCALL(__NR_epoll_create1, sys_epoll_create1) #define __NR_epoll_ctl 21 -__SYSCALL(__NR_epoll_ctl, sys_epoll_ctl) +__SC_WRAP(__NR_epoll_ctl, sys_epoll_ctl) #define __NR_epoll_pwait 22 __SC_COMP(__NR_epoll_pwait, sys_epoll_pwait, compat_sys_epoll_pwait) @@ -102,7 +102,7 @@ __SC_COMP_3264(__NR3264_fcntl, sys_fcntl64, sys_fcntl, compat_sys_fcntl64) #define __NR_inotify_init1 26 __SYSCALL(__NR_inotify_init1, sys_inotify_init1) #define __NR_inotify_add_watch 27 -__SYSCALL(__NR_inotify_add_watch, sys_inotify_add_watch) +__SC_WRAP(__NR_inotify_add_watch, sys_inotify_add_watch) #define __NR_inotify_rm_watch 28 __SYSCALL(__NR_inotify_rm_watch, sys_inotify_rm_watch) @@ -122,17 +122,17 @@ __SYSCALL(__NR_flock, sys_flock) /* fs/namei.c */ #define __NR_mknodat 33 -__SYSCALL(__NR_mknodat, sys_mknodat) +__SC_WRAP(__NR_mknodat, sys_mknodat) #define __NR_mkdirat 34 -__SYSCALL(__NR_mkdirat, sys_mkdirat) +__SC_WRAP(__NR_mkdirat, sys_mkdirat) #define __NR_unlinkat 35 -__SYSCALL(__NR_unlinkat, sys_unlinkat) +__SC_WRAP(__NR_unlinkat, sys_unlinkat) #define __NR_symlinkat 36 -__SYSCALL(__NR_symlinkat, sys_symlinkat) +__SC_WRAP(__NR_symlinkat, sys_symlinkat) #define __NR_linkat 37 -__SYSCALL(__NR_linkat, sys_linkat) +__SC_WRAP(__NR_linkat, sys_linkat) #define __NR_renameat 38 -__SYSCALL(__NR_renameat, sys_renameat) +__SC_WRAP(__NR_renameat, sys_renameat) /* fs/namespace.c */ #define __NR_umount2 39 @@ -140,7 +140,7 @@ __SYSCALL(__NR_umount2, sys_umount) #define __NR_mount 40 __SC_COMP(__NR_mount, sys_mount, compat_sys_mount) #define __NR_pivot_root 41 -__SYSCALL(__NR_pivot_root, sys_pivot_root) +__SC_WRAP(__NR_pivot_root, sys_pivot_root) /* fs/nfsctl.c */ #define __NR_nfsservctl 42 @@ -163,23 +163,23 @@ __SC_COMP_3264(__NR3264_ftruncate, sys_ftruncate64, sys_ftruncate, \ #define __NR_fallocate 47 __SC_COMP(__NR_fallocate, sys_fallocate, compat_sys_fallocate) #define __NR_faccessat 48 -__SYSCALL(__NR_faccessat, sys_faccessat) +__SC_WRAP(__NR_faccessat, sys_faccessat) #define __NR_chdir 49 -__SYSCALL(__NR_chdir, sys_chdir) +__SC_WRAP(__NR_chdir, sys_chdir) #define __NR_fchdir 50 __SYSCALL(__NR_fchdir, sys_fchdir) #define __NR_chroot 51 -__SYSCALL(__NR_chroot, sys_chroot) +__SC_WRAP(__NR_chroot, sys_chroot) #define __NR_fchmod 52 __SYSCALL(__NR_fchmod, sys_fchmod) #define __NR_fchmodat 53 -__SYSCALL(__NR_fchmodat, sys_fchmodat) +__SC_WRAP(__NR_fchmodat, sys_fchmodat) #define __NR_fchownat 54 -__SYSCALL(__NR_fchownat, sys_fchownat) +__SC_WRAP(__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 @@ -187,11 +187,11 @@ __SYSCALL(__NR_vhangup, sys_vhangup) /* fs/pipe.c */ #define __NR_pipe2 59 -__SYSCALL(__NR_pipe2, sys_pipe2) +__SC_WRAP(__NR_pipe2, sys_pipe2) /* fs/quota.c */ #define __NR_quotactl 60 -__SYSCALL(__NR_quotactl, sys_quotactl) +__SC_WRAP(__NR_quotactl, sys_quotactl) /* fs/readdir.c */ #define __NR_getdents64 61 @@ -236,13 +236,13 @@ __SC_COMP(__NR_signalfd4, sys_signalfd4, compat_sys_signalfd4) #define __NR_vmsplice 75 __SC_COMP(__NR_vmsplice, sys_vmsplice, compat_sys_vmsplice) #define __NR_splice 76 -__SYSCALL(__NR_splice, sys_splice) +__SC_WRAP(__NR_splice, sys_splice) #define __NR_tee 77 -__SYSCALL(__NR_tee, sys_tee) +__SC_WRAP(__NR_tee, sys_tee) /* fs/stat.c */ #define __NR_readlinkat 78 -__SYSCALL(__NR_readlinkat, sys_readlinkat) +__SC_WRAP(__NR_readlinkat, sys_readlinkat) #define __NR3264_fstatat 79 __SC_3264(__NR3264_fstatat, sys_fstatat64, sys_newfstatat) #define __NR3264_fstat 80 @@ -281,13 +281,13 @@ __SC_COMP(__NR_utimensat, sys_utimensat, compat_sys_utimensat) /* kernel/acct.c */ #define __NR_acct 89 -__SYSCALL(__NR_acct, sys_acct) +__SC_WRAP(__NR_acct, sys_acct) /* kernel/capability.c */ #define __NR_capget 90 -__SYSCALL(__NR_capget, sys_capget) +__SC_WRAP(__NR_capget, sys_capget) #define __NR_capset 91 -__SYSCALL(__NR_capset, sys_capset) +__SC_WRAP(__NR_capset, sys_capset) /* kernel/exec_domain.c */ #define __NR_personality 92 @@ -303,9 +303,9 @@ __SC_COMP(__NR_waitid, sys_waitid, compat_sys_waitid) /* kernel/fork.c */ #define __NR_set_tid_address 96 -__SYSCALL(__NR_set_tid_address, sys_set_tid_address) +__SC_WRAP(__NR_set_tid_address, sys_set_tid_address) #define __NR_unshare 97 -__SYSCALL(__NR_unshare, sys_unshare) +__SC_WRAP(__NR_unshare, sys_unshare) /* kernel/futex.c */ #define __NR_futex 98 @@ -333,9 +333,9 @@ __SC_COMP(__NR_kexec_load, sys_kexec_load, compat_sys_kexec_load) /* kernel/module.c */ #define __NR_init_module 105 -__SYSCALL(__NR_init_module, sys_init_module) +__SC_WRAP(__NR_init_module, sys_init_module) #define __NR_delete_module 106 -__SYSCALL(__NR_delete_module, sys_delete_module) +__SC_WRAP(__NR_delete_module, sys_delete_module) /* kernel/posix-timers.c */ #define __NR_timer_create 107 @@ -360,7 +360,7 @@ __SC_COMP(__NR_clock_nanosleep, sys_clock_nanosleep, \ /* kernel/printk.c */ #define __NR_syslog 116 -__SYSCALL(__NR_syslog, sys_syslog) +__SC_WRAP(__NR_syslog, sys_syslog) /* kernel/ptrace.c */ #define __NR_ptrace 117 @@ -368,13 +368,13 @@ __SYSCALL(__NR_ptrace, sys_ptrace) /* kernel/sched/core.c */ #define __NR_sched_setparam 118 -__SYSCALL(__NR_sched_setparam, sys_sched_setparam) +__SC_WRAP(__NR_sched_setparam, sys_sched_setparam) #define __NR_sched_setscheduler 119 -__SYSCALL(__NR_sched_setscheduler, sys_sched_setscheduler) +__SC_WRAP(__NR_sched_setscheduler, sys_sched_setscheduler) #define __NR_sched_getscheduler 120 __SYSCALL(__NR_sched_getscheduler, sys_sched_getscheduler) #define __NR_sched_getparam 121 -__SYSCALL(__NR_sched_getparam, sys_sched_getparam) +__SC_WRAP(__NR_sched_getparam, sys_sched_getparam) #define __NR_sched_setaffinity 122 __SC_COMP(__NR_sched_setaffinity, sys_sched_setaffinity, \ compat_sys_sched_setaffinity) @@ -425,7 +425,7 @@ __SYSCALL(__NR_setpriority, sys_setpriority) #define __NR_getpriority 141 __SYSCALL(__NR_getpriority, sys_getpriority) #define __NR_reboot 142 -__SYSCALL(__NR_reboot, sys_reboot) +__SC_WRAP(__NR_reboot, sys_reboot) #define __NR_setregid 143 __SYSCALL(__NR_setregid, sys_setregid) #define __NR_setgid 144 @@ -437,11 +437,11 @@ __SYSCALL(__NR_setuid, sys_setuid) #define __NR_setresuid 147 __SYSCALL(__NR_setresuid, sys_setresuid) #define __NR_getresuid 148 -__SYSCALL(__NR_getresuid, sys_getresuid) +__SC_WRAP(__NR_getresuid, sys_getresuid) #define __NR_setresgid 149 __SYSCALL(__NR_setresgid, sys_setresgid) #define __NR_getresgid 150 -__SYSCALL(__NR_getresgid, sys_getresgid) +__SC_WRAP(__NR_getresgid, sys_getresgid) #define __NR_setfsuid 151 __SYSCALL(__NR_setfsuid, sys_setfsuid) #define __NR_setfsgid 152 @@ -457,15 +457,15 @@ __SYSCALL(__NR_getsid, sys_getsid) #define __NR_setsid 157 __SYSCALL(__NR_setsid, sys_setsid) #define __NR_getgroups 158 -__SYSCALL(__NR_getgroups, sys_getgroups) +__SC_WRAP(__NR_getgroups, sys_getgroups) #define __NR_setgroups 159 -__SYSCALL(__NR_setgroups, sys_setgroups) +__SC_WRAP(__NR_setgroups, sys_setgroups) #define __NR_uname 160 -__SYSCALL(__NR_uname, sys_newuname) +__SC_WRAP(__NR_uname, sys_newuname) #define __NR_sethostname 161 -__SYSCALL(__NR_sethostname, sys_sethostname) +__SC_WRAP(__NR_sethostname, sys_sethostname) #define __NR_setdomainname 162 -__SYSCALL(__NR_setdomainname, sys_setdomainname) +__SC_WRAP(__NR_setdomainname, sys_setdomainname) #define __NR_getrlimit 163 __SC_COMP(__NR_getrlimit, sys_getrlimit, compat_sys_getrlimit) #define __NR_setrlimit 164 @@ -475,9 +475,9 @@ __SC_COMP(__NR_getrusage, sys_getrusage, compat_sys_getrusage) #define __NR_umask 166 __SYSCALL(__NR_umask, sys_umask) #define __NR_prctl 167 -__SYSCALL(__NR_prctl, sys_prctl) +__SC_WRAP(__NR_prctl, sys_prctl) #define __NR_getcpu 168 -__SYSCALL(__NR_getcpu, sys_getcpu) +__SC_WRAP(__NR_getcpu, sys_getcpu) /* kernel/time.c */ #define __NR_gettimeofday 169 @@ -509,7 +509,7 @@ __SC_COMP(__NR_sysinfo, sys_sysinfo, compat_sys_sysinfo) #define __NR_mq_open 180 __SC_COMP(__NR_mq_open, sys_mq_open, compat_sys_mq_open) #define __NR_mq_unlink 181 -__SYSCALL(__NR_mq_unlink, sys_mq_unlink) +__SC_WRAP(__NR_mq_unlink, sys_mq_unlink) #define __NR_mq_timedsend 182 __SC_COMP(__NR_mq_timedsend, sys_mq_timedsend, compat_sys_mq_timedsend) #define __NR_mq_timedreceive 183 @@ -554,21 +554,21 @@ __SYSCALL(__NR_shmdt, sys_shmdt) #define __NR_socket 198 __SYSCALL(__NR_socket, sys_socket) #define __NR_socketpair 199 -__SYSCALL(__NR_socketpair, sys_socketpair) +__SC_WRAP(__NR_socketpair, sys_socketpair) #define __NR_bind 200 -__SYSCALL(__NR_bind, sys_bind) +__SC_WRAP(__NR_bind, sys_bind) #define __NR_listen 201 __SYSCALL(__NR_listen, sys_listen) #define __NR_accept 202 __SYSCALL(__NR_accept, sys_accept) #define __NR_connect 203 -__SYSCALL(__NR_connect, sys_connect) +__SC_WRAP(__NR_connect, sys_connect) #define __NR_getsockname 204 -__SYSCALL(__NR_getsockname, sys_getsockname) +__SC_WRAP(__NR_getsockname, sys_getsockname) #define __NR_getpeername 205 -__SYSCALL(__NR_getpeername, sys_getpeername) +__SC_WRAP(__NR_getpeername, sys_getpeername) #define __NR_sendto 206 -__SYSCALL(__NR_sendto, sys_sendto) +__SC_WRAP(__NR_sendto, sys_sendto) #define __NR_recvfrom 207 __SC_COMP(__NR_recvfrom, sys_recvfrom, compat_sys_recvfrom) #define __NR_setsockopt 208 @@ -588,23 +588,23 @@ __SC_COMP(__NR_readahead, sys_readahead, compat_sys_readahead) /* mm/nommu.c, also with MMU */ #define __NR_brk 214 -__SYSCALL(__NR_brk, sys_brk) +__SC_WRAP(__NR_brk, sys_brk) #define __NR_munmap 215 -__SYSCALL(__NR_munmap, sys_munmap) +__SC_WRAP(__NR_munmap, sys_munmap) #define __NR_mremap 216 -__SYSCALL(__NR_mremap, sys_mremap) +__SC_WRAP(__NR_mremap, sys_mremap) /* security/keys/keyctl.c */ #define __NR_add_key 217 -__SYSCALL(__NR_add_key, sys_add_key) +__SC_WRAP(__NR_add_key, sys_add_key) #define __NR_request_key 218 -__SYSCALL(__NR_request_key, sys_request_key) +__SC_WRAP(__NR_request_key, sys_request_key) #define __NR_keyctl 219 __SC_COMP(__NR_keyctl, sys_keyctl, compat_sys_keyctl) /* arch/example/kernel/sys_example.c */ #define __NR_clone 220 -__SYSCALL(__NR_clone, sys_clone) +__SC_WRAP(__NR_clone, sys_clone) #define __NR_execve 221 __SC_COMP(__NR_execve, sys_execve, compat_sys_execve) @@ -617,27 +617,27 @@ __SC_COMP(__NR3264_fadvise64, sys_fadvise64_64, compat_sys_fadvise64_64) /* mm/, CONFIG_MMU only */ #ifndef __ARCH_NOMMU #define __NR_swapon 224 -__SYSCALL(__NR_swapon, sys_swapon) +__SC_WRAP(__NR_swapon, sys_swapon) #define __NR_swapoff 225 -__SYSCALL(__NR_swapoff, sys_swapoff) +__SC_WRAP(__NR_swapoff, sys_swapoff) #define __NR_mprotect 226 -__SYSCALL(__NR_mprotect, sys_mprotect) +__SC_WRAP(__NR_mprotect, sys_mprotect) #define __NR_msync 227 -__SYSCALL(__NR_msync, sys_msync) +__SC_WRAP(__NR_msync, sys_msync) #define __NR_mlock 228 -__SYSCALL(__NR_mlock, sys_mlock) +__SC_WRAP(__NR_mlock, sys_mlock) #define __NR_munlock 229 -__SYSCALL(__NR_munlock, sys_munlock) +__SC_WRAP(__NR_munlock, sys_munlock) #define __NR_mlockall 230 __SYSCALL(__NR_mlockall, sys_mlockall) #define __NR_munlockall 231 __SYSCALL(__NR_munlockall, sys_munlockall) #define __NR_mincore 232 -__SYSCALL(__NR_mincore, sys_mincore) +__SC_WRAP(__NR_mincore, sys_mincore) #define __NR_madvise 233 -__SYSCALL(__NR_madvise, sys_madvise) +__SC_WRAP(__NR_madvise, sys_madvise) #define __NR_remap_file_pages 234 -__SYSCALL(__NR_remap_file_pages, sys_remap_file_pages) +__SC_WRAP(__NR_remap_file_pages, sys_remap_file_pages) #define __NR_mbind 235 __SC_COMP(__NR_mbind, sys_mbind, compat_sys_mbind) #define __NR_get_mempolicy 236 @@ -654,9 +654,9 @@ __SC_COMP(__NR_move_pages, sys_move_pages, compat_sys_move_pages) __SC_COMP(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo, \ compat_sys_rt_tgsigqueueinfo) #define __NR_perf_event_open 241 -__SYSCALL(__NR_perf_event_open, sys_perf_event_open) +__SC_WRAP(__NR_perf_event_open, sys_perf_event_open) #define __NR_accept4 242 -__SYSCALL(__NR_accept4, sys_accept4) +__SC_WRAP(__NR_accept4, sys_accept4) #define __NR_recvmmsg 243 __SC_COMP(__NR_recvmmsg, sys_recvmmsg, compat_sys_recvmmsg) @@ -669,16 +669,15 @@ __SC_COMP(__NR_recvmmsg, sys_recvmmsg, compat_sys_recvmmsg) #define __NR_wait4 260 __SC_COMP(__NR_wait4, sys_wait4, compat_sys_wait4) #define __NR_prlimit64 261 -__SYSCALL(__NR_prlimit64, sys_prlimit64) +__SC_WRAP(__NR_prlimit64, sys_prlimit64) #define __NR_fanotify_init 262 __SYSCALL(__NR_fanotify_init, sys_fanotify_init) #define __NR_fanotify_mark 263 __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) +__SC_WRAP(__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 @@ -694,23 +693,23 @@ __SC_COMP(__NR_process_vm_readv, sys_process_vm_readv, \ __SC_COMP(__NR_process_vm_writev, sys_process_vm_writev, \ compat_sys_process_vm_writev) #define __NR_kcmp 272 -__SYSCALL(__NR_kcmp, sys_kcmp) +__SC_WRAP(__NR_kcmp, sys_kcmp) #define __NR_finit_module 273 -__SYSCALL(__NR_finit_module, sys_finit_module) +__SC_WRAP(__NR_finit_module, sys_finit_module) #define __NR_sched_setattr 274 -__SYSCALL(__NR_sched_setattr, sys_sched_setattr) +__SC_WRAP(__NR_sched_setattr, sys_sched_setattr) #define __NR_sched_getattr 275 -__SYSCALL(__NR_sched_getattr, sys_sched_getattr) +__SC_WRAP(__NR_sched_getattr, sys_sched_getattr) #define __NR_renameat2 276 -__SYSCALL(__NR_renameat2, sys_renameat2) +__SC_WRAP(__NR_renameat2, sys_renameat2) #define __NR_seccomp 277 -__SYSCALL(__NR_seccomp, sys_seccomp) +__SC_WRAP(__NR_seccomp, sys_seccomp) #define __NR_getrandom 278 -__SYSCALL(__NR_getrandom, sys_getrandom) +__SC_WRAP(__NR_getrandom, sys_getrandom) #define __NR_memfd_create 279 -__SYSCALL(__NR_memfd_create, sys_memfd_create) +__SC_WRAP(__NR_memfd_create, sys_memfd_create) #define __NR_bpf 280 -__SYSCALL(__NR_bpf, sys_bpf) +__SC_WRAP(__NR_bpf, sys_bpf) #define __NR_execveat 281 __SC_COMP(__NR_execveat, sys_execveat, compat_sys_execveat) #define __NR_userfaultfd 282 @@ -718,9 +717,9 @@ __SYSCALL(__NR_userfaultfd, sys_userfaultfd) #define __NR_membarrier 283 __SYSCALL(__NR_membarrier, sys_membarrier) #define __NR_mlock2 284 -__SYSCALL(__NR_mlock2, sys_mlock2) +__SC_WRAP(__NR_mlock2, sys_mlock2) #define __NR_copy_file_range 285 -__SYSCALL(__NR_copy_file_range, sys_copy_file_range) +__SC_WRAP(__NR_copy_file_range, sys_copy_file_range) #define __NR_preadv2 286 __SC_COMP(__NR_preadv2, sys_preadv2, compat_sys_preadv2) #define __NR_pwritev2 287 @@ -741,29 +740,29 @@ __SC_COMP(__NR_pwritev2, sys_pwritev2, compat_sys_pwritev2) #define __NR_open 1024 __SYSCALL(__NR_open, sys_open) #define __NR_link 1025 -__SYSCALL(__NR_link, sys_link) +__SC_WRAP(__NR_link, sys_link) #define __NR_unlink 1026 -__SYSCALL(__NR_unlink, sys_unlink) +__SC_WRAP(__NR_unlink, sys_unlink) #define __NR_mknod 1027 -__SYSCALL(__NR_mknod, sys_mknod) +__SC_WRAP(__NR_mknod, sys_mknod) #define __NR_chmod 1028 -__SYSCALL(__NR_chmod, sys_chmod) +__SC_WRAP(__NR_chmod, sys_chmod) #define __NR_chown 1029 -__SYSCALL(__NR_chown, sys_chown) +__SC_WRAP(__NR_chown, sys_chown) #define __NR_mkdir 1030 -__SYSCALL(__NR_mkdir, sys_mkdir) +__SC_WRAP(__NR_mkdir, sys_mkdir) #define __NR_rmdir 1031 -__SYSCALL(__NR_rmdir, sys_rmdir) +__SC_WRAP(__NR_rmdir, sys_rmdir) #define __NR_lchown 1032 -__SYSCALL(__NR_lchown, sys_lchown) +__SC_WRAP(__NR_lchown, sys_lchown) #define __NR_access 1033 -__SYSCALL(__NR_access, sys_access) +__SC_WRAP(__NR_access, sys_access) #define __NR_rename 1034 -__SYSCALL(__NR_rename, sys_rename) +__SC_WRAP(__NR_rename, sys_rename) #define __NR_readlink 1035 -__SYSCALL(__NR_readlink, sys_readlink) +__SC_WRAP(__NR_readlink, sys_readlink) #define __NR_symlink 1036 -__SYSCALL(__NR_symlink, sys_symlink) +__SC_WRAP(__NR_symlink, sys_symlink) #define __NR_utimes 1037 __SYSCALL(__NR_utimes, sys_utimes) #define __NR3264_stat 1038 @@ -777,7 +776,7 @@ __SC_3264(__NR3264_lstat, sys_lstat64, sys_newlstat) #ifdef __ARCH_WANT_SYSCALL_NO_FLAGS #define __NR_pipe 1040 -__SYSCALL(__NR_pipe, sys_pipe) +__SC_WRAP(__NR_pipe, sys_pipe) #define __NR_dup2 1041 __SYSCALL(__NR_dup2, sys_dup2) #define __NR_epoll_create 1042 @@ -847,7 +846,7 @@ __SYSCALL(__NR_time, sys_time) __SYSCALL(__NR_utime, sys_utime) #define __NR_creat 1064 -__SYSCALL(__NR_creat, sys_creat) +__SC_WRAP(__NR_creat, sys_creat) #define __NR_getdents 1065 #define __ARCH_WANT_SYS_GETDENTS __SYSCALL(__NR_getdents, sys_getdents) @@ -857,9 +856,9 @@ __SYSCALL(__NR_futimesat, sys_futimesat) #define __ARCH_WANT_SYS_SELECT __SYSCALL(__NR_select, sys_select) #define __NR_poll 1068 -__SYSCALL(__NR_poll, sys_poll) +__SC_WRAP(__NR_poll, sys_poll) #define __NR_epoll_wait 1069 -__SYSCALL(__NR_epoll_wait, sys_epoll_wait) +__SC_WRAP(__NR_epoll_wait, sys_epoll_wait) #define __NR_ustat 1070 __SYSCALL(__NR_ustat, sys_ustat) #define __NR_vfork 1071 @@ -871,12 +870,12 @@ __SYSCALL(__NR_recv, sys_recv) #define __NR_send 1074 __SYSCALL(__NR_send, sys_send) #define __NR_bdflush 1075 -__SYSCALL(__NR_bdflush, sys_bdflush) +__SC_WRAP(__NR_bdflush, sys_bdflush) #define __NR_umount 1076 -__SYSCALL(__NR_umount, sys_oldumount) +__SC_WRAP(__NR_umount, sys_oldumount) #define __ARCH_WANT_SYS_OLDUMOUNT #define __NR_uselib 1077 -__SYSCALL(__NR_uselib, sys_uselib) +__SC_WRAP(__NR_uselib, sys_uselib) #define __NR__sysctl 1078 __SYSCALL(__NR__sysctl, sys_sysctl) -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 05/23] all: wrap needed syscalls in generic unistd @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich As generic unistd syscall table is written in C, syscall prototypes declaration is needed. It's added to compat header. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- include/linux/compat.h | 225 +++++++++++++++++++++++++++++++++++++ include/uapi/asm-generic/unistd.h | 227 +++++++++++++++++++------------------- 2 files changed, 338 insertions(+), 114 deletions(-) diff --git a/include/linux/compat.h b/include/linux/compat.h index 4eba16e..248e015 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -789,6 +789,231 @@ asmlinkage long notrace compat_SyS##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) } #endif +/* Compat wrappers */ +#include <linux/syscalls_structs.h> +asmlinkage long compat_sys_creat(const char __user *pathname, umode_t mode); +asmlinkage long compat_sys_link(const char __user *oldname, + const char __user *newname); +asmlinkage long compat_sys_chdir(const char __user *filename); +asmlinkage long compat_sys_mknod(const char __user *filename, umode_t mode, + unsigned dev); +asmlinkage long compat_sys_chmod(const char __user *filename, umode_t mode); +asmlinkage long compat_sys_oldumount(char __user *name); +asmlinkage long compat_sys_access(const char __user *filename, int mode); +asmlinkage long compat_sys_rename(const char __user *oldname, + const char __user *newname); +asmlinkage long compat_sys_mkdir(const char __user *pathname, umode_t mode); +asmlinkage long compat_sys_rmdir(const char __user *pathname); +asmlinkage long compat_sys_pipe(int __user *fildes); +asmlinkage long compat_sys_brk(unsigned long brk); +asmlinkage long compat_sys_signal(int sig, __sighandler_t handler); +asmlinkage long compat_sys_acct(const char __user *name); +asmlinkage long compat_sys_umount(char __user *name, int flags); +asmlinkage long compat_sys_chroot(const char __user *filename); + +#ifdef CONFIG_OLD_SIGSUSPEND +asmlinkage long compat_sys_sigsuspend(old_sigset_t mask); +#endif + +#ifdef CONFIG_OLD_SIGSUSPEND3 +asmlinkage long compat_sys_sigsuspend(int unused1, int unused2, old_sigset_t mask); +#endif + +asmlinkage long compat_sys_sethostname(char __user *name, int len); +asmlinkage long compat_sys_symlink(const char __user *old, const char __user *new); +asmlinkage long compat_sys_readlink(const char __user *path, + char __user *buf, int bufsiz); +asmlinkage long compat_sys_uselib(const char __user *library); +asmlinkage long compat_sys_swapon(const char __user *specialfile, int swap_flags); +asmlinkage long compat_sys_reboot(int magic1, int magic2, unsigned int cmd, + void __user *arg); +asmlinkage long compat_sys_munmap(unsigned long addr, size_t len); +asmlinkage long compat_sys_munmap(unsigned long addr, size_t len); +asmlinkage long compat_sys_syslog(int type, char __user *buf, int len); +asmlinkage long compat_sys_swapoff(const char __user *specialfile); +asmlinkage long compat_sys_setdomainname(char __user *name, int len); +asmlinkage long compat_sys_newuname(struct new_utsname __user *name); +asmlinkage long compat_sys_mprotect(unsigned long start, size_t len, + unsigned long prot); +asmlinkage long compat_sys_init_module(void __user *umod, unsigned long len, + const char __user *uargs); +asmlinkage long compat_sys_delete_module(const char __user *name_user, + unsigned int flags); +asmlinkage long compat_sys_quotactl(unsigned int cmd, const char __user *special, + qid_t id, void __user *addr); +asmlinkage long compat_sys_bdflush(int func, long data); +asmlinkage long compat_sys_sysfs(int option, + unsigned long arg1, unsigned long arg2); +asmlinkage long compat_sys_llseek(unsigned int fd, unsigned long offset_high, + unsigned long offset_low, loff_t __user *result, + unsigned int whence); +asmlinkage long compat_sys_msync(unsigned long start, size_t len, int flags); +asmlinkage long compat_sys_mlock(unsigned long start, size_t len); +asmlinkage long compat_sys_munlock(unsigned long start, size_t len); +asmlinkage long compat_sys_sched_setparam(pid_t pid, + struct sched_param __user *param); +asmlinkage long compat_sys_sched_getparam(pid_t pid, + struct sched_param __user *param); +asmlinkage long compat_sys_sched_setscheduler(pid_t pid, int policy, + struct sched_param __user *param); +asmlinkage long compat_sys_mremap(unsigned long addr, + unsigned long old_len, unsigned long new_len, + unsigned long flags, unsigned long new_addr); +asmlinkage long compat_sys_poll(struct pollfd __user *ufds, unsigned int nfds, + int timeout); +asmlinkage long compat_sys_prctl(int option, unsigned long arg2, unsigned long arg3, + unsigned long arg4, unsigned long arg5); +asmlinkage long compat_sys_getcwd(char __user *buf, unsigned long size); +asmlinkage long compat_sys_capget(cap_user_header_t header, + cap_user_data_t dataptr); +asmlinkage long compat_sys_capset(cap_user_header_t header, + const cap_user_data_t data); +asmlinkage long compat_sys_lchown(const char __user *filename, + uid_t user, gid_t group); +asmlinkage long compat_sys_getgroups(int gidsetsize, gid_t __user *grouplist); +asmlinkage long compat_sys_setgroups(int gidsetsize, gid_t __user *grouplist); +asmlinkage long compat_sys_getresuid(uid_t __user *ruid, uid_t __user *euid, uid_t __user *suid); +asmlinkage long compat_sys_getresgid(gid_t __user *rgid, gid_t __user *egid, gid_t __user *sgid); +asmlinkage long compat_sys_chown(const char __user *filename, + uid_t user, gid_t group); +asmlinkage long compat_sys_pivot_root(const char __user *new_root, + const char __user *put_old); +asmlinkage long compat_sys_mincore(unsigned long start, size_t len, + unsigned char __user * vec); +asmlinkage long compat_sys_madvise(unsigned long start, size_t len, int behavior); +asmlinkage long compat_sys_setxattr(const char __user *path, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_lsetxattr(const char __user *path, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_fsetxattr(int fd, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_getdents64(unsigned int fd, + struct linux_dirent64 __user *dirent, + unsigned int count); +asmlinkage long compat_sys_getxattr(const char __user *path, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_lgetxattr(const char __user *path, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_fgetxattr(int fd, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_listxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_llistxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_flistxattr(int fd, char __user *list, size_t size); +asmlinkage long compat_sys_listxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_llistxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_flistxattr(int fd, char __user *list, size_t size); +asmlinkage long compat_sys_removexattr(const char __user *path, + const char __user *name); +asmlinkage long compat_sys_lremovexattr(const char __user *path, + const char __user *name); +asmlinkage long compat_sys_fremovexattr(int fd, const char __user *name); +asmlinkage long compat_sys_set_tid_address(int __user *tidptr); +asmlinkage long compat_sys_epoll_ctl(int epfd, int op, int fd, + struct epoll_event __user *event); +asmlinkage long compat_sys_epoll_wait(int epfd, struct epoll_event __user *events, + int maxevents, int timeout); +asmlinkage long compat_sys_io_destroy(aio_context_t ctx); +asmlinkage long compat_sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb, + struct io_event __user *result); +asmlinkage long compat_sys_mq_unlink(const char __user *name); +asmlinkage long compat_sys_add_key(const char __user *_type, + const char __user *_description, + const void __user *_payload, + size_t plen, + key_serial_t destringid); +asmlinkage long compat_sys_request_key(const char __user *_type, + const char __user *_description, + const char __user *_callout_info, + key_serial_t destringid); +asmlinkage long compat_sys_remap_file_pages(unsigned long start, unsigned long size, + unsigned long prot, unsigned long pgoff, + unsigned long flags); +asmlinkage long compat_sys_inotify_add_watch(int fd, const char __user *path, + u32 mask); +asmlinkage long compat_sys_mknodat(int dfd, const char __user * filename, umode_t mode, + unsigned dev); +asmlinkage long compat_sys_mkdirat(int dfd, const char __user * pathname, umode_t mode); +asmlinkage long compat_sys_fchownat(int dfd, const char __user *filename, uid_t user, + gid_t group, int flag); +asmlinkage long compat_sys_unlinkat(int dfd, const char __user * pathname, int flag); +asmlinkage long compat_sys_renameat(int olddfd, const char __user * oldname, + int newdfd, const char __user * newname); +asmlinkage long compat_sys_symlinkat(const char __user * oldname, + int newdfd, const char __user * newname); +asmlinkage long compat_sys_linkat(int olddfd, const char __user *oldname, + int newdfd, const char __user *newname, int flags); +asmlinkage long compat_sys_readlinkat(int dfd, const char __user *path, char __user *buf, + int bufsiz); +asmlinkage long compat_sys_fchmodat(int dfd, const char __user * filename, + umode_t mode); +asmlinkage long compat_sys_faccessat(int dfd, const char __user *filename, int mode); +asmlinkage long compat_sys_unshare(unsigned long unshare_flags); +asmlinkage long compat_sys_splice(int fd_in, loff_t __user *off_in, + int fd_out, loff_t __user *off_out, + size_t len, unsigned int flags); +asmlinkage long compat_sys_tee(int fdin, int fdout, size_t len, unsigned int flags); +asmlinkage long compat_sys_getcpu(unsigned __user *cpu, unsigned __user *node, struct getcpu_cache __user *cache); +asmlinkage long compat_sys_pipe2(int __user *fildes, int flags); +asmlinkage long compat_sys_perf_event_open( + struct perf_event_attr __user *attr_uptr, + pid_t pid, int cpu, int group_fd, unsigned long flags); + +#ifdef CONFIG_CLONE_BACKWARDS +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int __user *, unsigned long, + int __user *); +#else +#ifdef CONFIG_CLONE_BACKWARDS3 +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int, int __user *, + int __user *, unsigned long); +#else +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int __user *, + int __user *, unsigned long); +#endif +#endif + +asmlinkage long compat_sys_prlimit64(pid_t pid, unsigned int resource, + const struct rlimit64 __user *new_rlim, + struct rlimit64 __user *old_rlim); +asmlinkage long compat_sys_name_to_handle_at(int dfd, const char __user *name, + struct file_handle __user *handle, + int __user *mnt_id, int flag); +asmlinkage long compat_sys_kcmp(pid_t pid1, pid_t pid2, int type, + unsigned long idx1, unsigned long idx2); +asmlinkage long compat_sys_finit_module(int fd, const char __user *uargs, int flags); +asmlinkage long compat_sys_sched_setattr(pid_t pid, + struct sched_attr __user *attr, + unsigned int flags); +asmlinkage long compat_sys_sched_getattr(pid_t pid, + struct sched_attr __user *attr, + unsigned int size, + unsigned int flags); +asmlinkage long compat_sys_renameat2(int olddfd, const char __user *oldname, + int newdfd, const char __user *newname, + unsigned int flags); +asmlinkage long compat_sys_seccomp(unsigned int op, unsigned int flags, + const char __user *uargs); +asmlinkage long compat_sys_getrandom(char __user *buf, size_t count, + unsigned int flags); +asmlinkage long compat_sys_memfd_create(const char __user *uname_ptr, unsigned int flags); +asmlinkage long compat_sys_bpf(int cmd, union bpf_attr *attr, unsigned int size); +asmlinkage long compat_sys_socketpair(int, int, int, int __user *); +asmlinkage long compat_sys_bind(int, struct sockaddr __user *, int); +asmlinkage long compat_sys_connect(int, struct sockaddr __user *, int); +asmlinkage long compat_sys_accept4(int, struct sockaddr __user *, int __user *, int); +asmlinkage long compat_sys_getsockname(int, struct sockaddr __user *, int __user *); +asmlinkage long compat_sys_getpeername(int, struct sockaddr __user *, int __user *); +asmlinkage long compat_sys_sendto(int, void __user *, size_t, unsigned, + struct sockaddr __user *, int); +asmlinkage long compat_sys_mlock2(unsigned long start, size_t len, int flags); + +asmlinkage long compat_sys_copy_file_range(int fd_in, loff_t __user *off_in, + int fd_out, loff_t __user *off_out, + size_t len, unsigned int flags); + #endif /* CONFIG_COMPAT_WRAPPER */ #endif /* _LINUX_COMPAT_H */ diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 7e91d83..6ed4613 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -36,43 +36,43 @@ #define __NR_io_setup 0 __SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup) #define __NR_io_destroy 1 -__SYSCALL(__NR_io_destroy, sys_io_destroy) +__SC_WRAP(__NR_io_destroy, sys_io_destroy) #define __NR_io_submit 2 __SC_COMP(__NR_io_submit, sys_io_submit, compat_sys_io_submit) #define __NR_io_cancel 3 -__SYSCALL(__NR_io_cancel, sys_io_cancel) +__SC_WRAP(__NR_io_cancel, sys_io_cancel) #define __NR_io_getevents 4 __SC_COMP(__NR_io_getevents, sys_io_getevents, compat_sys_io_getevents) /* fs/xattr.c */ #define __NR_setxattr 5 -__SYSCALL(__NR_setxattr, sys_setxattr) +__SC_WRAP(__NR_setxattr, sys_setxattr) #define __NR_lsetxattr 6 -__SYSCALL(__NR_lsetxattr, sys_lsetxattr) +__SC_WRAP(__NR_lsetxattr, sys_lsetxattr) #define __NR_fsetxattr 7 -__SYSCALL(__NR_fsetxattr, sys_fsetxattr) +__SC_WRAP(__NR_fsetxattr, sys_fsetxattr) #define __NR_getxattr 8 -__SYSCALL(__NR_getxattr, sys_getxattr) +__SC_WRAP(__NR_getxattr, sys_getxattr) #define __NR_lgetxattr 9 -__SYSCALL(__NR_lgetxattr, sys_lgetxattr) +__SC_WRAP(__NR_lgetxattr, sys_lgetxattr) #define __NR_fgetxattr 10 -__SYSCALL(__NR_fgetxattr, sys_fgetxattr) +__SC_WRAP(__NR_fgetxattr, sys_fgetxattr) #define __NR_listxattr 11 -__SYSCALL(__NR_listxattr, sys_listxattr) +__SC_WRAP(__NR_listxattr, sys_listxattr) #define __NR_llistxattr 12 -__SYSCALL(__NR_llistxattr, sys_llistxattr) +__SC_WRAP(__NR_llistxattr, sys_llistxattr) #define __NR_flistxattr 13 -__SYSCALL(__NR_flistxattr, sys_flistxattr) +__SC_WRAP(__NR_flistxattr, sys_flistxattr) #define __NR_removexattr 14 -__SYSCALL(__NR_removexattr, sys_removexattr) +__SC_WRAP(__NR_removexattr, sys_removexattr) #define __NR_lremovexattr 15 -__SYSCALL(__NR_lremovexattr, sys_lremovexattr) +__SC_WRAP(__NR_lremovexattr, sys_lremovexattr) #define __NR_fremovexattr 16 -__SYSCALL(__NR_fremovexattr, sys_fremovexattr) +__SC_WRAP(__NR_fremovexattr, sys_fremovexattr) /* fs/dcache.c */ #define __NR_getcwd 17 -__SYSCALL(__NR_getcwd, sys_getcwd) +__SC_WRAP(__NR_getcwd, sys_getcwd) /* fs/cookies.c */ #define __NR_lookup_dcookie 18 @@ -86,7 +86,7 @@ __SYSCALL(__NR_eventfd2, sys_eventfd2) #define __NR_epoll_create1 20 __SYSCALL(__NR_epoll_create1, sys_epoll_create1) #define __NR_epoll_ctl 21 -__SYSCALL(__NR_epoll_ctl, sys_epoll_ctl) +__SC_WRAP(__NR_epoll_ctl, sys_epoll_ctl) #define __NR_epoll_pwait 22 __SC_COMP(__NR_epoll_pwait, sys_epoll_pwait, compat_sys_epoll_pwait) @@ -102,7 +102,7 @@ __SC_COMP_3264(__NR3264_fcntl, sys_fcntl64, sys_fcntl, compat_sys_fcntl64) #define __NR_inotify_init1 26 __SYSCALL(__NR_inotify_init1, sys_inotify_init1) #define __NR_inotify_add_watch 27 -__SYSCALL(__NR_inotify_add_watch, sys_inotify_add_watch) +__SC_WRAP(__NR_inotify_add_watch, sys_inotify_add_watch) #define __NR_inotify_rm_watch 28 __SYSCALL(__NR_inotify_rm_watch, sys_inotify_rm_watch) @@ -122,17 +122,17 @@ __SYSCALL(__NR_flock, sys_flock) /* fs/namei.c */ #define __NR_mknodat 33 -__SYSCALL(__NR_mknodat, sys_mknodat) +__SC_WRAP(__NR_mknodat, sys_mknodat) #define __NR_mkdirat 34 -__SYSCALL(__NR_mkdirat, sys_mkdirat) +__SC_WRAP(__NR_mkdirat, sys_mkdirat) #define __NR_unlinkat 35 -__SYSCALL(__NR_unlinkat, sys_unlinkat) +__SC_WRAP(__NR_unlinkat, sys_unlinkat) #define __NR_symlinkat 36 -__SYSCALL(__NR_symlinkat, sys_symlinkat) +__SC_WRAP(__NR_symlinkat, sys_symlinkat) #define __NR_linkat 37 -__SYSCALL(__NR_linkat, sys_linkat) +__SC_WRAP(__NR_linkat, sys_linkat) #define __NR_renameat 38 -__SYSCALL(__NR_renameat, sys_renameat) +__SC_WRAP(__NR_renameat, sys_renameat) /* fs/namespace.c */ #define __NR_umount2 39 @@ -140,7 +140,7 @@ __SYSCALL(__NR_umount2, sys_umount) #define __NR_mount 40 __SC_COMP(__NR_mount, sys_mount, compat_sys_mount) #define __NR_pivot_root 41 -__SYSCALL(__NR_pivot_root, sys_pivot_root) +__SC_WRAP(__NR_pivot_root, sys_pivot_root) /* fs/nfsctl.c */ #define __NR_nfsservctl 42 @@ -163,23 +163,23 @@ __SC_COMP_3264(__NR3264_ftruncate, sys_ftruncate64, sys_ftruncate, \ #define __NR_fallocate 47 __SC_COMP(__NR_fallocate, sys_fallocate, compat_sys_fallocate) #define __NR_faccessat 48 -__SYSCALL(__NR_faccessat, sys_faccessat) +__SC_WRAP(__NR_faccessat, sys_faccessat) #define __NR_chdir 49 -__SYSCALL(__NR_chdir, sys_chdir) +__SC_WRAP(__NR_chdir, sys_chdir) #define __NR_fchdir 50 __SYSCALL(__NR_fchdir, sys_fchdir) #define __NR_chroot 51 -__SYSCALL(__NR_chroot, sys_chroot) +__SC_WRAP(__NR_chroot, sys_chroot) #define __NR_fchmod 52 __SYSCALL(__NR_fchmod, sys_fchmod) #define __NR_fchmodat 53 -__SYSCALL(__NR_fchmodat, sys_fchmodat) +__SC_WRAP(__NR_fchmodat, sys_fchmodat) #define __NR_fchownat 54 -__SYSCALL(__NR_fchownat, sys_fchownat) +__SC_WRAP(__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 @@ -187,11 +187,11 @@ __SYSCALL(__NR_vhangup, sys_vhangup) /* fs/pipe.c */ #define __NR_pipe2 59 -__SYSCALL(__NR_pipe2, sys_pipe2) +__SC_WRAP(__NR_pipe2, sys_pipe2) /* fs/quota.c */ #define __NR_quotactl 60 -__SYSCALL(__NR_quotactl, sys_quotactl) +__SC_WRAP(__NR_quotactl, sys_quotactl) /* fs/readdir.c */ #define __NR_getdents64 61 @@ -236,13 +236,13 @@ __SC_COMP(__NR_signalfd4, sys_signalfd4, compat_sys_signalfd4) #define __NR_vmsplice 75 __SC_COMP(__NR_vmsplice, sys_vmsplice, compat_sys_vmsplice) #define __NR_splice 76 -__SYSCALL(__NR_splice, sys_splice) +__SC_WRAP(__NR_splice, sys_splice) #define __NR_tee 77 -__SYSCALL(__NR_tee, sys_tee) +__SC_WRAP(__NR_tee, sys_tee) /* fs/stat.c */ #define __NR_readlinkat 78 -__SYSCALL(__NR_readlinkat, sys_readlinkat) +__SC_WRAP(__NR_readlinkat, sys_readlinkat) #define __NR3264_fstatat 79 __SC_3264(__NR3264_fstatat, sys_fstatat64, sys_newfstatat) #define __NR3264_fstat 80 @@ -281,13 +281,13 @@ __SC_COMP(__NR_utimensat, sys_utimensat, compat_sys_utimensat) /* kernel/acct.c */ #define __NR_acct 89 -__SYSCALL(__NR_acct, sys_acct) +__SC_WRAP(__NR_acct, sys_acct) /* kernel/capability.c */ #define __NR_capget 90 -__SYSCALL(__NR_capget, sys_capget) +__SC_WRAP(__NR_capget, sys_capget) #define __NR_capset 91 -__SYSCALL(__NR_capset, sys_capset) +__SC_WRAP(__NR_capset, sys_capset) /* kernel/exec_domain.c */ #define __NR_personality 92 @@ -303,9 +303,9 @@ __SC_COMP(__NR_waitid, sys_waitid, compat_sys_waitid) /* kernel/fork.c */ #define __NR_set_tid_address 96 -__SYSCALL(__NR_set_tid_address, sys_set_tid_address) +__SC_WRAP(__NR_set_tid_address, sys_set_tid_address) #define __NR_unshare 97 -__SYSCALL(__NR_unshare, sys_unshare) +__SC_WRAP(__NR_unshare, sys_unshare) /* kernel/futex.c */ #define __NR_futex 98 @@ -333,9 +333,9 @@ __SC_COMP(__NR_kexec_load, sys_kexec_load, compat_sys_kexec_load) /* kernel/module.c */ #define __NR_init_module 105 -__SYSCALL(__NR_init_module, sys_init_module) +__SC_WRAP(__NR_init_module, sys_init_module) #define __NR_delete_module 106 -__SYSCALL(__NR_delete_module, sys_delete_module) +__SC_WRAP(__NR_delete_module, sys_delete_module) /* kernel/posix-timers.c */ #define __NR_timer_create 107 @@ -360,7 +360,7 @@ __SC_COMP(__NR_clock_nanosleep, sys_clock_nanosleep, \ /* kernel/printk.c */ #define __NR_syslog 116 -__SYSCALL(__NR_syslog, sys_syslog) +__SC_WRAP(__NR_syslog, sys_syslog) /* kernel/ptrace.c */ #define __NR_ptrace 117 @@ -368,13 +368,13 @@ __SYSCALL(__NR_ptrace, sys_ptrace) /* kernel/sched/core.c */ #define __NR_sched_setparam 118 -__SYSCALL(__NR_sched_setparam, sys_sched_setparam) +__SC_WRAP(__NR_sched_setparam, sys_sched_setparam) #define __NR_sched_setscheduler 119 -__SYSCALL(__NR_sched_setscheduler, sys_sched_setscheduler) +__SC_WRAP(__NR_sched_setscheduler, sys_sched_setscheduler) #define __NR_sched_getscheduler 120 __SYSCALL(__NR_sched_getscheduler, sys_sched_getscheduler) #define __NR_sched_getparam 121 -__SYSCALL(__NR_sched_getparam, sys_sched_getparam) +__SC_WRAP(__NR_sched_getparam, sys_sched_getparam) #define __NR_sched_setaffinity 122 __SC_COMP(__NR_sched_setaffinity, sys_sched_setaffinity, \ compat_sys_sched_setaffinity) @@ -425,7 +425,7 @@ __SYSCALL(__NR_setpriority, sys_setpriority) #define __NR_getpriority 141 __SYSCALL(__NR_getpriority, sys_getpriority) #define __NR_reboot 142 -__SYSCALL(__NR_reboot, sys_reboot) +__SC_WRAP(__NR_reboot, sys_reboot) #define __NR_setregid 143 __SYSCALL(__NR_setregid, sys_setregid) #define __NR_setgid 144 @@ -437,11 +437,11 @@ __SYSCALL(__NR_setuid, sys_setuid) #define __NR_setresuid 147 __SYSCALL(__NR_setresuid, sys_setresuid) #define __NR_getresuid 148 -__SYSCALL(__NR_getresuid, sys_getresuid) +__SC_WRAP(__NR_getresuid, sys_getresuid) #define __NR_setresgid 149 __SYSCALL(__NR_setresgid, sys_setresgid) #define __NR_getresgid 150 -__SYSCALL(__NR_getresgid, sys_getresgid) +__SC_WRAP(__NR_getresgid, sys_getresgid) #define __NR_setfsuid 151 __SYSCALL(__NR_setfsuid, sys_setfsuid) #define __NR_setfsgid 152 @@ -457,15 +457,15 @@ __SYSCALL(__NR_getsid, sys_getsid) #define __NR_setsid 157 __SYSCALL(__NR_setsid, sys_setsid) #define __NR_getgroups 158 -__SYSCALL(__NR_getgroups, sys_getgroups) +__SC_WRAP(__NR_getgroups, sys_getgroups) #define __NR_setgroups 159 -__SYSCALL(__NR_setgroups, sys_setgroups) +__SC_WRAP(__NR_setgroups, sys_setgroups) #define __NR_uname 160 -__SYSCALL(__NR_uname, sys_newuname) +__SC_WRAP(__NR_uname, sys_newuname) #define __NR_sethostname 161 -__SYSCALL(__NR_sethostname, sys_sethostname) +__SC_WRAP(__NR_sethostname, sys_sethostname) #define __NR_setdomainname 162 -__SYSCALL(__NR_setdomainname, sys_setdomainname) +__SC_WRAP(__NR_setdomainname, sys_setdomainname) #define __NR_getrlimit 163 __SC_COMP(__NR_getrlimit, sys_getrlimit, compat_sys_getrlimit) #define __NR_setrlimit 164 @@ -475,9 +475,9 @@ __SC_COMP(__NR_getrusage, sys_getrusage, compat_sys_getrusage) #define __NR_umask 166 __SYSCALL(__NR_umask, sys_umask) #define __NR_prctl 167 -__SYSCALL(__NR_prctl, sys_prctl) +__SC_WRAP(__NR_prctl, sys_prctl) #define __NR_getcpu 168 -__SYSCALL(__NR_getcpu, sys_getcpu) +__SC_WRAP(__NR_getcpu, sys_getcpu) /* kernel/time.c */ #define __NR_gettimeofday 169 @@ -509,7 +509,7 @@ __SC_COMP(__NR_sysinfo, sys_sysinfo, compat_sys_sysinfo) #define __NR_mq_open 180 __SC_COMP(__NR_mq_open, sys_mq_open, compat_sys_mq_open) #define __NR_mq_unlink 181 -__SYSCALL(__NR_mq_unlink, sys_mq_unlink) +__SC_WRAP(__NR_mq_unlink, sys_mq_unlink) #define __NR_mq_timedsend 182 __SC_COMP(__NR_mq_timedsend, sys_mq_timedsend, compat_sys_mq_timedsend) #define __NR_mq_timedreceive 183 @@ -554,21 +554,21 @@ __SYSCALL(__NR_shmdt, sys_shmdt) #define __NR_socket 198 __SYSCALL(__NR_socket, sys_socket) #define __NR_socketpair 199 -__SYSCALL(__NR_socketpair, sys_socketpair) +__SC_WRAP(__NR_socketpair, sys_socketpair) #define __NR_bind 200 -__SYSCALL(__NR_bind, sys_bind) +__SC_WRAP(__NR_bind, sys_bind) #define __NR_listen 201 __SYSCALL(__NR_listen, sys_listen) #define __NR_accept 202 __SYSCALL(__NR_accept, sys_accept) #define __NR_connect 203 -__SYSCALL(__NR_connect, sys_connect) +__SC_WRAP(__NR_connect, sys_connect) #define __NR_getsockname 204 -__SYSCALL(__NR_getsockname, sys_getsockname) +__SC_WRAP(__NR_getsockname, sys_getsockname) #define __NR_getpeername 205 -__SYSCALL(__NR_getpeername, sys_getpeername) +__SC_WRAP(__NR_getpeername, sys_getpeername) #define __NR_sendto 206 -__SYSCALL(__NR_sendto, sys_sendto) +__SC_WRAP(__NR_sendto, sys_sendto) #define __NR_recvfrom 207 __SC_COMP(__NR_recvfrom, sys_recvfrom, compat_sys_recvfrom) #define __NR_setsockopt 208 @@ -588,23 +588,23 @@ __SC_COMP(__NR_readahead, sys_readahead, compat_sys_readahead) /* mm/nommu.c, also with MMU */ #define __NR_brk 214 -__SYSCALL(__NR_brk, sys_brk) +__SC_WRAP(__NR_brk, sys_brk) #define __NR_munmap 215 -__SYSCALL(__NR_munmap, sys_munmap) +__SC_WRAP(__NR_munmap, sys_munmap) #define __NR_mremap 216 -__SYSCALL(__NR_mremap, sys_mremap) +__SC_WRAP(__NR_mremap, sys_mremap) /* security/keys/keyctl.c */ #define __NR_add_key 217 -__SYSCALL(__NR_add_key, sys_add_key) +__SC_WRAP(__NR_add_key, sys_add_key) #define __NR_request_key 218 -__SYSCALL(__NR_request_key, sys_request_key) +__SC_WRAP(__NR_request_key, sys_request_key) #define __NR_keyctl 219 __SC_COMP(__NR_keyctl, sys_keyctl, compat_sys_keyctl) /* arch/example/kernel/sys_example.c */ #define __NR_clone 220 -__SYSCALL(__NR_clone, sys_clone) +__SC_WRAP(__NR_clone, sys_clone) #define __NR_execve 221 __SC_COMP(__NR_execve, sys_execve, compat_sys_execve) @@ -617,27 +617,27 @@ __SC_COMP(__NR3264_fadvise64, sys_fadvise64_64, compat_sys_fadvise64_64) /* mm/, CONFIG_MMU only */ #ifndef __ARCH_NOMMU #define __NR_swapon 224 -__SYSCALL(__NR_swapon, sys_swapon) +__SC_WRAP(__NR_swapon, sys_swapon) #define __NR_swapoff 225 -__SYSCALL(__NR_swapoff, sys_swapoff) +__SC_WRAP(__NR_swapoff, sys_swapoff) #define __NR_mprotect 226 -__SYSCALL(__NR_mprotect, sys_mprotect) +__SC_WRAP(__NR_mprotect, sys_mprotect) #define __NR_msync 227 -__SYSCALL(__NR_msync, sys_msync) +__SC_WRAP(__NR_msync, sys_msync) #define __NR_mlock 228 -__SYSCALL(__NR_mlock, sys_mlock) +__SC_WRAP(__NR_mlock, sys_mlock) #define __NR_munlock 229 -__SYSCALL(__NR_munlock, sys_munlock) +__SC_WRAP(__NR_munlock, sys_munlock) #define __NR_mlockall 230 __SYSCALL(__NR_mlockall, sys_mlockall) #define __NR_munlockall 231 __SYSCALL(__NR_munlockall, sys_munlockall) #define __NR_mincore 232 -__SYSCALL(__NR_mincore, sys_mincore) +__SC_WRAP(__NR_mincore, sys_mincore) #define __NR_madvise 233 -__SYSCALL(__NR_madvise, sys_madvise) +__SC_WRAP(__NR_madvise, sys_madvise) #define __NR_remap_file_pages 234 -__SYSCALL(__NR_remap_file_pages, sys_remap_file_pages) +__SC_WRAP(__NR_remap_file_pages, sys_remap_file_pages) #define __NR_mbind 235 __SC_COMP(__NR_mbind, sys_mbind, compat_sys_mbind) #define __NR_get_mempolicy 236 @@ -654,9 +654,9 @@ __SC_COMP(__NR_move_pages, sys_move_pages, compat_sys_move_pages) __SC_COMP(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo, \ compat_sys_rt_tgsigqueueinfo) #define __NR_perf_event_open 241 -__SYSCALL(__NR_perf_event_open, sys_perf_event_open) +__SC_WRAP(__NR_perf_event_open, sys_perf_event_open) #define __NR_accept4 242 -__SYSCALL(__NR_accept4, sys_accept4) +__SC_WRAP(__NR_accept4, sys_accept4) #define __NR_recvmmsg 243 __SC_COMP(__NR_recvmmsg, sys_recvmmsg, compat_sys_recvmmsg) @@ -669,16 +669,15 @@ __SC_COMP(__NR_recvmmsg, sys_recvmmsg, compat_sys_recvmmsg) #define __NR_wait4 260 __SC_COMP(__NR_wait4, sys_wait4, compat_sys_wait4) #define __NR_prlimit64 261 -__SYSCALL(__NR_prlimit64, sys_prlimit64) +__SC_WRAP(__NR_prlimit64, sys_prlimit64) #define __NR_fanotify_init 262 __SYSCALL(__NR_fanotify_init, sys_fanotify_init) #define __NR_fanotify_mark 263 __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) +__SC_WRAP(__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 @@ -694,23 +693,23 @@ __SC_COMP(__NR_process_vm_readv, sys_process_vm_readv, \ __SC_COMP(__NR_process_vm_writev, sys_process_vm_writev, \ compat_sys_process_vm_writev) #define __NR_kcmp 272 -__SYSCALL(__NR_kcmp, sys_kcmp) +__SC_WRAP(__NR_kcmp, sys_kcmp) #define __NR_finit_module 273 -__SYSCALL(__NR_finit_module, sys_finit_module) +__SC_WRAP(__NR_finit_module, sys_finit_module) #define __NR_sched_setattr 274 -__SYSCALL(__NR_sched_setattr, sys_sched_setattr) +__SC_WRAP(__NR_sched_setattr, sys_sched_setattr) #define __NR_sched_getattr 275 -__SYSCALL(__NR_sched_getattr, sys_sched_getattr) +__SC_WRAP(__NR_sched_getattr, sys_sched_getattr) #define __NR_renameat2 276 -__SYSCALL(__NR_renameat2, sys_renameat2) +__SC_WRAP(__NR_renameat2, sys_renameat2) #define __NR_seccomp 277 -__SYSCALL(__NR_seccomp, sys_seccomp) +__SC_WRAP(__NR_seccomp, sys_seccomp) #define __NR_getrandom 278 -__SYSCALL(__NR_getrandom, sys_getrandom) +__SC_WRAP(__NR_getrandom, sys_getrandom) #define __NR_memfd_create 279 -__SYSCALL(__NR_memfd_create, sys_memfd_create) +__SC_WRAP(__NR_memfd_create, sys_memfd_create) #define __NR_bpf 280 -__SYSCALL(__NR_bpf, sys_bpf) +__SC_WRAP(__NR_bpf, sys_bpf) #define __NR_execveat 281 __SC_COMP(__NR_execveat, sys_execveat, compat_sys_execveat) #define __NR_userfaultfd 282 @@ -718,9 +717,9 @@ __SYSCALL(__NR_userfaultfd, sys_userfaultfd) #define __NR_membarrier 283 __SYSCALL(__NR_membarrier, sys_membarrier) #define __NR_mlock2 284 -__SYSCALL(__NR_mlock2, sys_mlock2) +__SC_WRAP(__NR_mlock2, sys_mlock2) #define __NR_copy_file_range 285 -__SYSCALL(__NR_copy_file_range, sys_copy_file_range) +__SC_WRAP(__NR_copy_file_range, sys_copy_file_range) #define __NR_preadv2 286 __SC_COMP(__NR_preadv2, sys_preadv2, compat_sys_preadv2) #define __NR_pwritev2 287 @@ -741,29 +740,29 @@ __SC_COMP(__NR_pwritev2, sys_pwritev2, compat_sys_pwritev2) #define __NR_open 1024 __SYSCALL(__NR_open, sys_open) #define __NR_link 1025 -__SYSCALL(__NR_link, sys_link) +__SC_WRAP(__NR_link, sys_link) #define __NR_unlink 1026 -__SYSCALL(__NR_unlink, sys_unlink) +__SC_WRAP(__NR_unlink, sys_unlink) #define __NR_mknod 1027 -__SYSCALL(__NR_mknod, sys_mknod) +__SC_WRAP(__NR_mknod, sys_mknod) #define __NR_chmod 1028 -__SYSCALL(__NR_chmod, sys_chmod) +__SC_WRAP(__NR_chmod, sys_chmod) #define __NR_chown 1029 -__SYSCALL(__NR_chown, sys_chown) +__SC_WRAP(__NR_chown, sys_chown) #define __NR_mkdir 1030 -__SYSCALL(__NR_mkdir, sys_mkdir) +__SC_WRAP(__NR_mkdir, sys_mkdir) #define __NR_rmdir 1031 -__SYSCALL(__NR_rmdir, sys_rmdir) +__SC_WRAP(__NR_rmdir, sys_rmdir) #define __NR_lchown 1032 -__SYSCALL(__NR_lchown, sys_lchown) +__SC_WRAP(__NR_lchown, sys_lchown) #define __NR_access 1033 -__SYSCALL(__NR_access, sys_access) +__SC_WRAP(__NR_access, sys_access) #define __NR_rename 1034 -__SYSCALL(__NR_rename, sys_rename) +__SC_WRAP(__NR_rename, sys_rename) #define __NR_readlink 1035 -__SYSCALL(__NR_readlink, sys_readlink) +__SC_WRAP(__NR_readlink, sys_readlink) #define __NR_symlink 1036 -__SYSCALL(__NR_symlink, sys_symlink) +__SC_WRAP(__NR_symlink, sys_symlink) #define __NR_utimes 1037 __SYSCALL(__NR_utimes, sys_utimes) #define __NR3264_stat 1038 @@ -777,7 +776,7 @@ __SC_3264(__NR3264_lstat, sys_lstat64, sys_newlstat) #ifdef __ARCH_WANT_SYSCALL_NO_FLAGS #define __NR_pipe 1040 -__SYSCALL(__NR_pipe, sys_pipe) +__SC_WRAP(__NR_pipe, sys_pipe) #define __NR_dup2 1041 __SYSCALL(__NR_dup2, sys_dup2) #define __NR_epoll_create 1042 @@ -847,7 +846,7 @@ __SYSCALL(__NR_time, sys_time) __SYSCALL(__NR_utime, sys_utime) #define __NR_creat 1064 -__SYSCALL(__NR_creat, sys_creat) +__SC_WRAP(__NR_creat, sys_creat) #define __NR_getdents 1065 #define __ARCH_WANT_SYS_GETDENTS __SYSCALL(__NR_getdents, sys_getdents) @@ -857,9 +856,9 @@ __SYSCALL(__NR_futimesat, sys_futimesat) #define __ARCH_WANT_SYS_SELECT __SYSCALL(__NR_select, sys_select) #define __NR_poll 1068 -__SYSCALL(__NR_poll, sys_poll) +__SC_WRAP(__NR_poll, sys_poll) #define __NR_epoll_wait 1069 -__SYSCALL(__NR_epoll_wait, sys_epoll_wait) +__SC_WRAP(__NR_epoll_wait, sys_epoll_wait) #define __NR_ustat 1070 __SYSCALL(__NR_ustat, sys_ustat) #define __NR_vfork 1071 @@ -871,12 +870,12 @@ __SYSCALL(__NR_recv, sys_recv) #define __NR_send 1074 __SYSCALL(__NR_send, sys_send) #define __NR_bdflush 1075 -__SYSCALL(__NR_bdflush, sys_bdflush) +__SC_WRAP(__NR_bdflush, sys_bdflush) #define __NR_umount 1076 -__SYSCALL(__NR_umount, sys_oldumount) +__SC_WRAP(__NR_umount, sys_oldumount) #define __ARCH_WANT_SYS_OLDUMOUNT #define __NR_uselib 1077 -__SYSCALL(__NR_uselib, sys_uselib) +__SC_WRAP(__NR_uselib, sys_uselib) #define __NR__sysctl 1078 __SYSCALL(__NR__sysctl, sys_sysctl) -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 05/23] all: wrap needed syscalls in generic unistd @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, ynorov, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner As generic unistd syscall table is written in C, syscall prototypes declaration is needed. It's added to compat header. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- include/linux/compat.h | 225 +++++++++++++++++++++++++++++++++++++ include/uapi/asm-generic/unistd.h | 227 +++++++++++++++++++------------------- 2 files changed, 338 insertions(+), 114 deletions(-) diff --git a/include/linux/compat.h b/include/linux/compat.h index 4eba16e..248e015 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -789,6 +789,231 @@ asmlinkage long notrace compat_SyS##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) } #endif +/* Compat wrappers */ +#include <linux/syscalls_structs.h> +asmlinkage long compat_sys_creat(const char __user *pathname, umode_t mode); +asmlinkage long compat_sys_link(const char __user *oldname, + const char __user *newname); +asmlinkage long compat_sys_chdir(const char __user *filename); +asmlinkage long compat_sys_mknod(const char __user *filename, umode_t mode, + unsigned dev); +asmlinkage long compat_sys_chmod(const char __user *filename, umode_t mode); +asmlinkage long compat_sys_oldumount(char __user *name); +asmlinkage long compat_sys_access(const char __user *filename, int mode); +asmlinkage long compat_sys_rename(const char __user *oldname, + const char __user *newname); +asmlinkage long compat_sys_mkdir(const char __user *pathname, umode_t mode); +asmlinkage long compat_sys_rmdir(const char __user *pathname); +asmlinkage long compat_sys_pipe(int __user *fildes); +asmlinkage long compat_sys_brk(unsigned long brk); +asmlinkage long compat_sys_signal(int sig, __sighandler_t handler); +asmlinkage long compat_sys_acct(const char __user *name); +asmlinkage long compat_sys_umount(char __user *name, int flags); +asmlinkage long compat_sys_chroot(const char __user *filename); + +#ifdef CONFIG_OLD_SIGSUSPEND +asmlinkage long compat_sys_sigsuspend(old_sigset_t mask); +#endif + +#ifdef CONFIG_OLD_SIGSUSPEND3 +asmlinkage long compat_sys_sigsuspend(int unused1, int unused2, old_sigset_t mask); +#endif + +asmlinkage long compat_sys_sethostname(char __user *name, int len); +asmlinkage long compat_sys_symlink(const char __user *old, const char __user *new); +asmlinkage long compat_sys_readlink(const char __user *path, + char __user *buf, int bufsiz); +asmlinkage long compat_sys_uselib(const char __user *library); +asmlinkage long compat_sys_swapon(const char __user *specialfile, int swap_flags); +asmlinkage long compat_sys_reboot(int magic1, int magic2, unsigned int cmd, + void __user *arg); +asmlinkage long compat_sys_munmap(unsigned long addr, size_t len); +asmlinkage long compat_sys_munmap(unsigned long addr, size_t len); +asmlinkage long compat_sys_syslog(int type, char __user *buf, int len); +asmlinkage long compat_sys_swapoff(const char __user *specialfile); +asmlinkage long compat_sys_setdomainname(char __user *name, int len); +asmlinkage long compat_sys_newuname(struct new_utsname __user *name); +asmlinkage long compat_sys_mprotect(unsigned long start, size_t len, + unsigned long prot); +asmlinkage long compat_sys_init_module(void __user *umod, unsigned long len, + const char __user *uargs); +asmlinkage long compat_sys_delete_module(const char __user *name_user, + unsigned int flags); +asmlinkage long compat_sys_quotactl(unsigned int cmd, const char __user *special, + qid_t id, void __user *addr); +asmlinkage long compat_sys_bdflush(int func, long data); +asmlinkage long compat_sys_sysfs(int option, + unsigned long arg1, unsigned long arg2); +asmlinkage long compat_sys_llseek(unsigned int fd, unsigned long offset_high, + unsigned long offset_low, loff_t __user *result, + unsigned int whence); +asmlinkage long compat_sys_msync(unsigned long start, size_t len, int flags); +asmlinkage long compat_sys_mlock(unsigned long start, size_t len); +asmlinkage long compat_sys_munlock(unsigned long start, size_t len); +asmlinkage long compat_sys_sched_setparam(pid_t pid, + struct sched_param __user *param); +asmlinkage long compat_sys_sched_getparam(pid_t pid, + struct sched_param __user *param); +asmlinkage long compat_sys_sched_setscheduler(pid_t pid, int policy, + struct sched_param __user *param); +asmlinkage long compat_sys_mremap(unsigned long addr, + unsigned long old_len, unsigned long new_len, + unsigned long flags, unsigned long new_addr); +asmlinkage long compat_sys_poll(struct pollfd __user *ufds, unsigned int nfds, + int timeout); +asmlinkage long compat_sys_prctl(int option, unsigned long arg2, unsigned long arg3, + unsigned long arg4, unsigned long arg5); +asmlinkage long compat_sys_getcwd(char __user *buf, unsigned long size); +asmlinkage long compat_sys_capget(cap_user_header_t header, + cap_user_data_t dataptr); +asmlinkage long compat_sys_capset(cap_user_header_t header, + const cap_user_data_t data); +asmlinkage long compat_sys_lchown(const char __user *filename, + uid_t user, gid_t group); +asmlinkage long compat_sys_getgroups(int gidsetsize, gid_t __user *grouplist); +asmlinkage long compat_sys_setgroups(int gidsetsize, gid_t __user *grouplist); +asmlinkage long compat_sys_getresuid(uid_t __user *ruid, uid_t __user *euid, uid_t __user *suid); +asmlinkage long compat_sys_getresgid(gid_t __user *rgid, gid_t __user *egid, gid_t __user *sgid); +asmlinkage long compat_sys_chown(const char __user *filename, + uid_t user, gid_t group); +asmlinkage long compat_sys_pivot_root(const char __user *new_root, + const char __user *put_old); +asmlinkage long compat_sys_mincore(unsigned long start, size_t len, + unsigned char __user * vec); +asmlinkage long compat_sys_madvise(unsigned long start, size_t len, int behavior); +asmlinkage long compat_sys_setxattr(const char __user *path, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_lsetxattr(const char __user *path, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_fsetxattr(int fd, const char __user *name, + const void __user *value, size_t size, int flags); +asmlinkage long compat_sys_getdents64(unsigned int fd, + struct linux_dirent64 __user *dirent, + unsigned int count); +asmlinkage long compat_sys_getxattr(const char __user *path, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_lgetxattr(const char __user *path, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_fgetxattr(int fd, const char __user *name, + void __user *value, size_t size); +asmlinkage long compat_sys_listxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_llistxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_flistxattr(int fd, char __user *list, size_t size); +asmlinkage long compat_sys_listxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_llistxattr(const char __user *path, char __user *list, + size_t size); +asmlinkage long compat_sys_flistxattr(int fd, char __user *list, size_t size); +asmlinkage long compat_sys_removexattr(const char __user *path, + const char __user *name); +asmlinkage long compat_sys_lremovexattr(const char __user *path, + const char __user *name); +asmlinkage long compat_sys_fremovexattr(int fd, const char __user *name); +asmlinkage long compat_sys_set_tid_address(int __user *tidptr); +asmlinkage long compat_sys_epoll_ctl(int epfd, int op, int fd, + struct epoll_event __user *event); +asmlinkage long compat_sys_epoll_wait(int epfd, struct epoll_event __user *events, + int maxevents, int timeout); +asmlinkage long compat_sys_io_destroy(aio_context_t ctx); +asmlinkage long compat_sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb, + struct io_event __user *result); +asmlinkage long compat_sys_mq_unlink(const char __user *name); +asmlinkage long compat_sys_add_key(const char __user *_type, + const char __user *_description, + const void __user *_payload, + size_t plen, + key_serial_t destringid); +asmlinkage long compat_sys_request_key(const char __user *_type, + const char __user *_description, + const char __user *_callout_info, + key_serial_t destringid); +asmlinkage long compat_sys_remap_file_pages(unsigned long start, unsigned long size, + unsigned long prot, unsigned long pgoff, + unsigned long flags); +asmlinkage long compat_sys_inotify_add_watch(int fd, const char __user *path, + u32 mask); +asmlinkage long compat_sys_mknodat(int dfd, const char __user * filename, umode_t mode, + unsigned dev); +asmlinkage long compat_sys_mkdirat(int dfd, const char __user * pathname, umode_t mode); +asmlinkage long compat_sys_fchownat(int dfd, const char __user *filename, uid_t user, + gid_t group, int flag); +asmlinkage long compat_sys_unlinkat(int dfd, const char __user * pathname, int flag); +asmlinkage long compat_sys_renameat(int olddfd, const char __user * oldname, + int newdfd, const char __user * newname); +asmlinkage long compat_sys_symlinkat(const char __user * oldname, + int newdfd, const char __user * newname); +asmlinkage long compat_sys_linkat(int olddfd, const char __user *oldname, + int newdfd, const char __user *newname, int flags); +asmlinkage long compat_sys_readlinkat(int dfd, const char __user *path, char __user *buf, + int bufsiz); +asmlinkage long compat_sys_fchmodat(int dfd, const char __user * filename, + umode_t mode); +asmlinkage long compat_sys_faccessat(int dfd, const char __user *filename, int mode); +asmlinkage long compat_sys_unshare(unsigned long unshare_flags); +asmlinkage long compat_sys_splice(int fd_in, loff_t __user *off_in, + int fd_out, loff_t __user *off_out, + size_t len, unsigned int flags); +asmlinkage long compat_sys_tee(int fdin, int fdout, size_t len, unsigned int flags); +asmlinkage long compat_sys_getcpu(unsigned __user *cpu, unsigned __user *node, struct getcpu_cache __user *cache); +asmlinkage long compat_sys_pipe2(int __user *fildes, int flags); +asmlinkage long compat_sys_perf_event_open( + struct perf_event_attr __user *attr_uptr, + pid_t pid, int cpu, int group_fd, unsigned long flags); + +#ifdef CONFIG_CLONE_BACKWARDS +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int __user *, unsigned long, + int __user *); +#else +#ifdef CONFIG_CLONE_BACKWARDS3 +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int, int __user *, + int __user *, unsigned long); +#else +asmlinkage long compat_sys_clone(unsigned long, unsigned long, int __user *, + int __user *, unsigned long); +#endif +#endif + +asmlinkage long compat_sys_prlimit64(pid_t pid, unsigned int resource, + const struct rlimit64 __user *new_rlim, + struct rlimit64 __user *old_rlim); +asmlinkage long compat_sys_name_to_handle_at(int dfd, const char __user *name, + struct file_handle __user *handle, + int __user *mnt_id, int flag); +asmlinkage long compat_sys_kcmp(pid_t pid1, pid_t pid2, int type, + unsigned long idx1, unsigned long idx2); +asmlinkage long compat_sys_finit_module(int fd, const char __user *uargs, int flags); +asmlinkage long compat_sys_sched_setattr(pid_t pid, + struct sched_attr __user *attr, + unsigned int flags); +asmlinkage long compat_sys_sched_getattr(pid_t pid, + struct sched_attr __user *attr, + unsigned int size, + unsigned int flags); +asmlinkage long compat_sys_renameat2(int olddfd, const char __user *oldname, + int newdfd, const char __user *newname, + unsigned int flags); +asmlinkage long compat_sys_seccomp(unsigned int op, unsigned int flags, + const char __user *uargs); +asmlinkage long compat_sys_getrandom(char __user *buf, size_t count, + unsigned int flags); +asmlinkage long compat_sys_memfd_create(const char __user *uname_ptr, unsigned int flags); +asmlinkage long compat_sys_bpf(int cmd, union bpf_attr *attr, unsigned int size); +asmlinkage long compat_sys_socketpair(int, int, int, int __user *); +asmlinkage long compat_sys_bind(int, struct sockaddr __user *, int); +asmlinkage long compat_sys_connect(int, struct sockaddr __user *, int); +asmlinkage long compat_sys_accept4(int, struct sockaddr __user *, int __user *, int); +asmlinkage long compat_sys_getsockname(int, struct sockaddr __user *, int __user *); +asmlinkage long compat_sys_getpeername(int, struct sockaddr __user *, int __user *); +asmlinkage long compat_sys_sendto(int, void __user *, size_t, unsigned, + struct sockaddr __user *, int); +asmlinkage long compat_sys_mlock2(unsigned long start, size_t len, int flags); + +asmlinkage long compat_sys_copy_file_range(int fd_in, loff_t __user *off_in, + int fd_out, loff_t __user *off_out, + size_t len, unsigned int flags); + #endif /* CONFIG_COMPAT_WRAPPER */ #endif /* _LINUX_COMPAT_H */ diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 7e91d83..6ed4613 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -36,43 +36,43 @@ #define __NR_io_setup 0 __SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup) #define __NR_io_destroy 1 -__SYSCALL(__NR_io_destroy, sys_io_destroy) +__SC_WRAP(__NR_io_destroy, sys_io_destroy) #define __NR_io_submit 2 __SC_COMP(__NR_io_submit, sys_io_submit, compat_sys_io_submit) #define __NR_io_cancel 3 -__SYSCALL(__NR_io_cancel, sys_io_cancel) +__SC_WRAP(__NR_io_cancel, sys_io_cancel) #define __NR_io_getevents 4 __SC_COMP(__NR_io_getevents, sys_io_getevents, compat_sys_io_getevents) /* fs/xattr.c */ #define __NR_setxattr 5 -__SYSCALL(__NR_setxattr, sys_setxattr) +__SC_WRAP(__NR_setxattr, sys_setxattr) #define __NR_lsetxattr 6 -__SYSCALL(__NR_lsetxattr, sys_lsetxattr) +__SC_WRAP(__NR_lsetxattr, sys_lsetxattr) #define __NR_fsetxattr 7 -__SYSCALL(__NR_fsetxattr, sys_fsetxattr) +__SC_WRAP(__NR_fsetxattr, sys_fsetxattr) #define __NR_getxattr 8 -__SYSCALL(__NR_getxattr, sys_getxattr) +__SC_WRAP(__NR_getxattr, sys_getxattr) #define __NR_lgetxattr 9 -__SYSCALL(__NR_lgetxattr, sys_lgetxattr) +__SC_WRAP(__NR_lgetxattr, sys_lgetxattr) #define __NR_fgetxattr 10 -__SYSCALL(__NR_fgetxattr, sys_fgetxattr) +__SC_WRAP(__NR_fgetxattr, sys_fgetxattr) #define __NR_listxattr 11 -__SYSCALL(__NR_listxattr, sys_listxattr) +__SC_WRAP(__NR_listxattr, sys_listxattr) #define __NR_llistxattr 12 -__SYSCALL(__NR_llistxattr, sys_llistxattr) +__SC_WRAP(__NR_llistxattr, sys_llistxattr) #define __NR_flistxattr 13 -__SYSCALL(__NR_flistxattr, sys_flistxattr) +__SC_WRAP(__NR_flistxattr, sys_flistxattr) #define __NR_removexattr 14 -__SYSCALL(__NR_removexattr, sys_removexattr) +__SC_WRAP(__NR_removexattr, sys_removexattr) #define __NR_lremovexattr 15 -__SYSCALL(__NR_lremovexattr, sys_lremovexattr) +__SC_WRAP(__NR_lremovexattr, sys_lremovexattr) #define __NR_fremovexattr 16 -__SYSCALL(__NR_fremovexattr, sys_fremovexattr) +__SC_WRAP(__NR_fremovexattr, sys_fremovexattr) /* fs/dcache.c */ #define __NR_getcwd 17 -__SYSCALL(__NR_getcwd, sys_getcwd) +__SC_WRAP(__NR_getcwd, sys_getcwd) /* fs/cookies.c */ #define __NR_lookup_dcookie 18 @@ -86,7 +86,7 @@ __SYSCALL(__NR_eventfd2, sys_eventfd2) #define __NR_epoll_create1 20 __SYSCALL(__NR_epoll_create1, sys_epoll_create1) #define __NR_epoll_ctl 21 -__SYSCALL(__NR_epoll_ctl, sys_epoll_ctl) +__SC_WRAP(__NR_epoll_ctl, sys_epoll_ctl) #define __NR_epoll_pwait 22 __SC_COMP(__NR_epoll_pwait, sys_epoll_pwait, compat_sys_epoll_pwait) @@ -102,7 +102,7 @@ __SC_COMP_3264(__NR3264_fcntl, sys_fcntl64, sys_fcntl, compat_sys_fcntl64) #define __NR_inotify_init1 26 __SYSCALL(__NR_inotify_init1, sys_inotify_init1) #define __NR_inotify_add_watch 27 -__SYSCALL(__NR_inotify_add_watch, sys_inotify_add_watch) +__SC_WRAP(__NR_inotify_add_watch, sys_inotify_add_watch) #define __NR_inotify_rm_watch 28 __SYSCALL(__NR_inotify_rm_watch, sys_inotify_rm_watch) @@ -122,17 +122,17 @@ __SYSCALL(__NR_flock, sys_flock) /* fs/namei.c */ #define __NR_mknodat 33 -__SYSCALL(__NR_mknodat, sys_mknodat) +__SC_WRAP(__NR_mknodat, sys_mknodat) #define __NR_mkdirat 34 -__SYSCALL(__NR_mkdirat, sys_mkdirat) +__SC_WRAP(__NR_mkdirat, sys_mkdirat) #define __NR_unlinkat 35 -__SYSCALL(__NR_unlinkat, sys_unlinkat) +__SC_WRAP(__NR_unlinkat, sys_unlinkat) #define __NR_symlinkat 36 -__SYSCALL(__NR_symlinkat, sys_symlinkat) +__SC_WRAP(__NR_symlinkat, sys_symlinkat) #define __NR_linkat 37 -__SYSCALL(__NR_linkat, sys_linkat) +__SC_WRAP(__NR_linkat, sys_linkat) #define __NR_renameat 38 -__SYSCALL(__NR_renameat, sys_renameat) +__SC_WRAP(__NR_renameat, sys_renameat) /* fs/namespace.c */ #define __NR_umount2 39 @@ -140,7 +140,7 @@ __SYSCALL(__NR_umount2, sys_umount) #define __NR_mount 40 __SC_COMP(__NR_mount, sys_mount, compat_sys_mount) #define __NR_pivot_root 41 -__SYSCALL(__NR_pivot_root, sys_pivot_root) +__SC_WRAP(__NR_pivot_root, sys_pivot_root) /* fs/nfsctl.c */ #define __NR_nfsservctl 42 @@ -163,23 +163,23 @@ __SC_COMP_3264(__NR3264_ftruncate, sys_ftruncate64, sys_ftruncate, \ #define __NR_fallocate 47 __SC_COMP(__NR_fallocate, sys_fallocate, compat_sys_fallocate) #define __NR_faccessat 48 -__SYSCALL(__NR_faccessat, sys_faccessat) +__SC_WRAP(__NR_faccessat, sys_faccessat) #define __NR_chdir 49 -__SYSCALL(__NR_chdir, sys_chdir) +__SC_WRAP(__NR_chdir, sys_chdir) #define __NR_fchdir 50 __SYSCALL(__NR_fchdir, sys_fchdir) #define __NR_chroot 51 -__SYSCALL(__NR_chroot, sys_chroot) +__SC_WRAP(__NR_chroot, sys_chroot) #define __NR_fchmod 52 __SYSCALL(__NR_fchmod, sys_fchmod) #define __NR_fchmodat 53 -__SYSCALL(__NR_fchmodat, sys_fchmodat) +__SC_WRAP(__NR_fchmodat, sys_fchmodat) #define __NR_fchownat 54 -__SYSCALL(__NR_fchownat, sys_fchownat) +__SC_WRAP(__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 @@ -187,11 +187,11 @@ __SYSCALL(__NR_vhangup, sys_vhangup) /* fs/pipe.c */ #define __NR_pipe2 59 -__SYSCALL(__NR_pipe2, sys_pipe2) +__SC_WRAP(__NR_pipe2, sys_pipe2) /* fs/quota.c */ #define __NR_quotactl 60 -__SYSCALL(__NR_quotactl, sys_quotactl) +__SC_WRAP(__NR_quotactl, sys_quotactl) /* fs/readdir.c */ #define __NR_getdents64 61 @@ -236,13 +236,13 @@ __SC_COMP(__NR_signalfd4, sys_signalfd4, compat_sys_signalfd4) #define __NR_vmsplice 75 __SC_COMP(__NR_vmsplice, sys_vmsplice, compat_sys_vmsplice) #define __NR_splice 76 -__SYSCALL(__NR_splice, sys_splice) +__SC_WRAP(__NR_splice, sys_splice) #define __NR_tee 77 -__SYSCALL(__NR_tee, sys_tee) +__SC_WRAP(__NR_tee, sys_tee) /* fs/stat.c */ #define __NR_readlinkat 78 -__SYSCALL(__NR_readlinkat, sys_readlinkat) +__SC_WRAP(__NR_readlinkat, sys_readlinkat) #define __NR3264_fstatat 79 __SC_3264(__NR3264_fstatat, sys_fstatat64, sys_newfstatat) #define __NR3264_fstat 80 @@ -281,13 +281,13 @@ __SC_COMP(__NR_utimensat, sys_utimensat, compat_sys_utimensat) /* kernel/acct.c */ #define __NR_acct 89 -__SYSCALL(__NR_acct, sys_acct) +__SC_WRAP(__NR_acct, sys_acct) /* kernel/capability.c */ #define __NR_capget 90 -__SYSCALL(__NR_capget, sys_capget) +__SC_WRAP(__NR_capget, sys_capget) #define __NR_capset 91 -__SYSCALL(__NR_capset, sys_capset) +__SC_WRAP(__NR_capset, sys_capset) /* kernel/exec_domain.c */ #define __NR_personality 92 @@ -303,9 +303,9 @@ __SC_COMP(__NR_waitid, sys_waitid, compat_sys_waitid) /* kernel/fork.c */ #define __NR_set_tid_address 96 -__SYSCALL(__NR_set_tid_address, sys_set_tid_address) +__SC_WRAP(__NR_set_tid_address, sys_set_tid_address) #define __NR_unshare 97 -__SYSCALL(__NR_unshare, sys_unshare) +__SC_WRAP(__NR_unshare, sys_unshare) /* kernel/futex.c */ #define __NR_futex 98 @@ -333,9 +333,9 @@ __SC_COMP(__NR_kexec_load, sys_kexec_load, compat_sys_kexec_load) /* kernel/module.c */ #define __NR_init_module 105 -__SYSCALL(__NR_init_module, sys_init_module) +__SC_WRAP(__NR_init_module, sys_init_module) #define __NR_delete_module 106 -__SYSCALL(__NR_delete_module, sys_delete_module) +__SC_WRAP(__NR_delete_module, sys_delete_module) /* kernel/posix-timers.c */ #define __NR_timer_create 107 @@ -360,7 +360,7 @@ __SC_COMP(__NR_clock_nanosleep, sys_clock_nanosleep, \ /* kernel/printk.c */ #define __NR_syslog 116 -__SYSCALL(__NR_syslog, sys_syslog) +__SC_WRAP(__NR_syslog, sys_syslog) /* kernel/ptrace.c */ #define __NR_ptrace 117 @@ -368,13 +368,13 @@ __SYSCALL(__NR_ptrace, sys_ptrace) /* kernel/sched/core.c */ #define __NR_sched_setparam 118 -__SYSCALL(__NR_sched_setparam, sys_sched_setparam) +__SC_WRAP(__NR_sched_setparam, sys_sched_setparam) #define __NR_sched_setscheduler 119 -__SYSCALL(__NR_sched_setscheduler, sys_sched_setscheduler) +__SC_WRAP(__NR_sched_setscheduler, sys_sched_setscheduler) #define __NR_sched_getscheduler 120 __SYSCALL(__NR_sched_getscheduler, sys_sched_getscheduler) #define __NR_sched_getparam 121 -__SYSCALL(__NR_sched_getparam, sys_sched_getparam) +__SC_WRAP(__NR_sched_getparam, sys_sched_getparam) #define __NR_sched_setaffinity 122 __SC_COMP(__NR_sched_setaffinity, sys_sched_setaffinity, \ compat_sys_sched_setaffinity) @@ -425,7 +425,7 @@ __SYSCALL(__NR_setpriority, sys_setpriority) #define __NR_getpriority 141 __SYSCALL(__NR_getpriority, sys_getpriority) #define __NR_reboot 142 -__SYSCALL(__NR_reboot, sys_reboot) +__SC_WRAP(__NR_reboot, sys_reboot) #define __NR_setregid 143 __SYSCALL(__NR_setregid, sys_setregid) #define __NR_setgid 144 @@ -437,11 +437,11 @@ __SYSCALL(__NR_setuid, sys_setuid) #define __NR_setresuid 147 __SYSCALL(__NR_setresuid, sys_setresuid) #define __NR_getresuid 148 -__SYSCALL(__NR_getresuid, sys_getresuid) +__SC_WRAP(__NR_getresuid, sys_getresuid) #define __NR_setresgid 149 __SYSCALL(__NR_setresgid, sys_setresgid) #define __NR_getresgid 150 -__SYSCALL(__NR_getresgid, sys_getresgid) +__SC_WRAP(__NR_getresgid, sys_getresgid) #define __NR_setfsuid 151 __SYSCALL(__NR_setfsuid, sys_setfsuid) #define __NR_setfsgid 152 @@ -457,15 +457,15 @@ __SYSCALL(__NR_getsid, sys_getsid) #define __NR_setsid 157 __SYSCALL(__NR_setsid, sys_setsid) #define __NR_getgroups 158 -__SYSCALL(__NR_getgroups, sys_getgroups) +__SC_WRAP(__NR_getgroups, sys_getgroups) #define __NR_setgroups 159 -__SYSCALL(__NR_setgroups, sys_setgroups) +__SC_WRAP(__NR_setgroups, sys_setgroups) #define __NR_uname 160 -__SYSCALL(__NR_uname, sys_newuname) +__SC_WRAP(__NR_uname, sys_newuname) #define __NR_sethostname 161 -__SYSCALL(__NR_sethostname, sys_sethostname) +__SC_WRAP(__NR_sethostname, sys_sethostname) #define __NR_setdomainname 162 -__SYSCALL(__NR_setdomainname, sys_setdomainname) +__SC_WRAP(__NR_setdomainname, sys_setdomainname) #define __NR_getrlimit 163 __SC_COMP(__NR_getrlimit, sys_getrlimit, compat_sys_getrlimit) #define __NR_setrlimit 164 @@ -475,9 +475,9 @@ __SC_COMP(__NR_getrusage, sys_getrusage, compat_sys_getrusage) #define __NR_umask 166 __SYSCALL(__NR_umask, sys_umask) #define __NR_prctl 167 -__SYSCALL(__NR_prctl, sys_prctl) +__SC_WRAP(__NR_prctl, sys_prctl) #define __NR_getcpu 168 -__SYSCALL(__NR_getcpu, sys_getcpu) +__SC_WRAP(__NR_getcpu, sys_getcpu) /* kernel/time.c */ #define __NR_gettimeofday 169 @@ -509,7 +509,7 @@ __SC_COMP(__NR_sysinfo, sys_sysinfo, compat_sys_sysinfo) #define __NR_mq_open 180 __SC_COMP(__NR_mq_open, sys_mq_open, compat_sys_mq_open) #define __NR_mq_unlink 181 -__SYSCALL(__NR_mq_unlink, sys_mq_unlink) +__SC_WRAP(__NR_mq_unlink, sys_mq_unlink) #define __NR_mq_timedsend 182 __SC_COMP(__NR_mq_timedsend, sys_mq_timedsend, compat_sys_mq_timedsend) #define __NR_mq_timedreceive 183 @@ -554,21 +554,21 @@ __SYSCALL(__NR_shmdt, sys_shmdt) #define __NR_socket 198 __SYSCALL(__NR_socket, sys_socket) #define __NR_socketpair 199 -__SYSCALL(__NR_socketpair, sys_socketpair) +__SC_WRAP(__NR_socketpair, sys_socketpair) #define __NR_bind 200 -__SYSCALL(__NR_bind, sys_bind) +__SC_WRAP(__NR_bind, sys_bind) #define __NR_listen 201 __SYSCALL(__NR_listen, sys_listen) #define __NR_accept 202 __SYSCALL(__NR_accept, sys_accept) #define __NR_connect 203 -__SYSCALL(__NR_connect, sys_connect) +__SC_WRAP(__NR_connect, sys_connect) #define __NR_getsockname 204 -__SYSCALL(__NR_getsockname, sys_getsockname) +__SC_WRAP(__NR_getsockname, sys_getsockname) #define __NR_getpeername 205 -__SYSCALL(__NR_getpeername, sys_getpeername) +__SC_WRAP(__NR_getpeername, sys_getpeername) #define __NR_sendto 206 -__SYSCALL(__NR_sendto, sys_sendto) +__SC_WRAP(__NR_sendto, sys_sendto) #define __NR_recvfrom 207 __SC_COMP(__NR_recvfrom, sys_recvfrom, compat_sys_recvfrom) #define __NR_setsockopt 208 @@ -588,23 +588,23 @@ __SC_COMP(__NR_readahead, sys_readahead, compat_sys_readahead) /* mm/nommu.c, also with MMU */ #define __NR_brk 214 -__SYSCALL(__NR_brk, sys_brk) +__SC_WRAP(__NR_brk, sys_brk) #define __NR_munmap 215 -__SYSCALL(__NR_munmap, sys_munmap) +__SC_WRAP(__NR_munmap, sys_munmap) #define __NR_mremap 216 -__SYSCALL(__NR_mremap, sys_mremap) +__SC_WRAP(__NR_mremap, sys_mremap) /* security/keys/keyctl.c */ #define __NR_add_key 217 -__SYSCALL(__NR_add_key, sys_add_key) +__SC_WRAP(__NR_add_key, sys_add_key) #define __NR_request_key 218 -__SYSCALL(__NR_request_key, sys_request_key) +__SC_WRAP(__NR_request_key, sys_request_key) #define __NR_keyctl 219 __SC_COMP(__NR_keyctl, sys_keyctl, compat_sys_keyctl) /* arch/example/kernel/sys_example.c */ #define __NR_clone 220 -__SYSCALL(__NR_clone, sys_clone) +__SC_WRAP(__NR_clone, sys_clone) #define __NR_execve 221 __SC_COMP(__NR_execve, sys_execve, compat_sys_execve) @@ -617,27 +617,27 @@ __SC_COMP(__NR3264_fadvise64, sys_fadvise64_64, compat_sys_fadvise64_64) /* mm/, CONFIG_MMU only */ #ifndef __ARCH_NOMMU #define __NR_swapon 224 -__SYSCALL(__NR_swapon, sys_swapon) +__SC_WRAP(__NR_swapon, sys_swapon) #define __NR_swapoff 225 -__SYSCALL(__NR_swapoff, sys_swapoff) +__SC_WRAP(__NR_swapoff, sys_swapoff) #define __NR_mprotect 226 -__SYSCALL(__NR_mprotect, sys_mprotect) +__SC_WRAP(__NR_mprotect, sys_mprotect) #define __NR_msync 227 -__SYSCALL(__NR_msync, sys_msync) +__SC_WRAP(__NR_msync, sys_msync) #define __NR_mlock 228 -__SYSCALL(__NR_mlock, sys_mlock) +__SC_WRAP(__NR_mlock, sys_mlock) #define __NR_munlock 229 -__SYSCALL(__NR_munlock, sys_munlock) +__SC_WRAP(__NR_munlock, sys_munlock) #define __NR_mlockall 230 __SYSCALL(__NR_mlockall, sys_mlockall) #define __NR_munlockall 231 __SYSCALL(__NR_munlockall, sys_munlockall) #define __NR_mincore 232 -__SYSCALL(__NR_mincore, sys_mincore) +__SC_WRAP(__NR_mincore, sys_mincore) #define __NR_madvise 233 -__SYSCALL(__NR_madvise, sys_madvise) +__SC_WRAP(__NR_madvise, sys_madvise) #define __NR_remap_file_pages 234 -__SYSCALL(__NR_remap_file_pages, sys_remap_file_pages) +__SC_WRAP(__NR_remap_file_pages, sys_remap_file_pages) #define __NR_mbind 235 __SC_COMP(__NR_mbind, sys_mbind, compat_sys_mbind) #define __NR_get_mempolicy 236 @@ -654,9 +654,9 @@ __SC_COMP(__NR_move_pages, sys_move_pages, compat_sys_move_pages) __SC_COMP(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo, \ compat_sys_rt_tgsigqueueinfo) #define __NR_perf_event_open 241 -__SYSCALL(__NR_perf_event_open, sys_perf_event_open) +__SC_WRAP(__NR_perf_event_open, sys_perf_event_open) #define __NR_accept4 242 -__SYSCALL(__NR_accept4, sys_accept4) +__SC_WRAP(__NR_accept4, sys_accept4) #define __NR_recvmmsg 243 __SC_COMP(__NR_recvmmsg, sys_recvmmsg, compat_sys_recvmmsg) @@ -669,16 +669,15 @@ __SC_COMP(__NR_recvmmsg, sys_recvmmsg, compat_sys_recvmmsg) #define __NR_wait4 260 __SC_COMP(__NR_wait4, sys_wait4, compat_sys_wait4) #define __NR_prlimit64 261 -__SYSCALL(__NR_prlimit64, sys_prlimit64) +__SC_WRAP(__NR_prlimit64, sys_prlimit64) #define __NR_fanotify_init 262 __SYSCALL(__NR_fanotify_init, sys_fanotify_init) #define __NR_fanotify_mark 263 __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) +__SC_WRAP(__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 @@ -694,23 +693,23 @@ __SC_COMP(__NR_process_vm_readv, sys_process_vm_readv, \ __SC_COMP(__NR_process_vm_writev, sys_process_vm_writev, \ compat_sys_process_vm_writev) #define __NR_kcmp 272 -__SYSCALL(__NR_kcmp, sys_kcmp) +__SC_WRAP(__NR_kcmp, sys_kcmp) #define __NR_finit_module 273 -__SYSCALL(__NR_finit_module, sys_finit_module) +__SC_WRAP(__NR_finit_module, sys_finit_module) #define __NR_sched_setattr 274 -__SYSCALL(__NR_sched_setattr, sys_sched_setattr) +__SC_WRAP(__NR_sched_setattr, sys_sched_setattr) #define __NR_sched_getattr 275 -__SYSCALL(__NR_sched_getattr, sys_sched_getattr) +__SC_WRAP(__NR_sched_getattr, sys_sched_getattr) #define __NR_renameat2 276 -__SYSCALL(__NR_renameat2, sys_renameat2) +__SC_WRAP(__NR_renameat2, sys_renameat2) #define __NR_seccomp 277 -__SYSCALL(__NR_seccomp, sys_seccomp) +__SC_WRAP(__NR_seccomp, sys_seccomp) #define __NR_getrandom 278 -__SYSCALL(__NR_getrandom, sys_getrandom) +__SC_WRAP(__NR_getrandom, sys_getrandom) #define __NR_memfd_create 279 -__SYSCALL(__NR_memfd_create, sys_memfd_create) +__SC_WRAP(__NR_memfd_create, sys_memfd_create) #define __NR_bpf 280 -__SYSCALL(__NR_bpf, sys_bpf) +__SC_WRAP(__NR_bpf, sys_bpf) #define __NR_execveat 281 __SC_COMP(__NR_execveat, sys_execveat, compat_sys_execveat) #define __NR_userfaultfd 282 @@ -718,9 +717,9 @@ __SYSCALL(__NR_userfaultfd, sys_userfaultfd) #define __NR_membarrier 283 __SYSCALL(__NR_membarrier, sys_membarrier) #define __NR_mlock2 284 -__SYSCALL(__NR_mlock2, sys_mlock2) +__SC_WRAP(__NR_mlock2, sys_mlock2) #define __NR_copy_file_range 285 -__SYSCALL(__NR_copy_file_range, sys_copy_file_range) +__SC_WRAP(__NR_copy_file_range, sys_copy_file_range) #define __NR_preadv2 286 __SC_COMP(__NR_preadv2, sys_preadv2, compat_sys_preadv2) #define __NR_pwritev2 287 @@ -741,29 +740,29 @@ __SC_COMP(__NR_pwritev2, sys_pwritev2, compat_sys_pwritev2) #define __NR_open 1024 __SYSCALL(__NR_open, sys_open) #define __NR_link 1025 -__SYSCALL(__NR_link, sys_link) +__SC_WRAP(__NR_link, sys_link) #define __NR_unlink 1026 -__SYSCALL(__NR_unlink, sys_unlink) +__SC_WRAP(__NR_unlink, sys_unlink) #define __NR_mknod 1027 -__SYSCALL(__NR_mknod, sys_mknod) +__SC_WRAP(__NR_mknod, sys_mknod) #define __NR_chmod 1028 -__SYSCALL(__NR_chmod, sys_chmod) +__SC_WRAP(__NR_chmod, sys_chmod) #define __NR_chown 1029 -__SYSCALL(__NR_chown, sys_chown) +__SC_WRAP(__NR_chown, sys_chown) #define __NR_mkdir 1030 -__SYSCALL(__NR_mkdir, sys_mkdir) +__SC_WRAP(__NR_mkdir, sys_mkdir) #define __NR_rmdir 1031 -__SYSCALL(__NR_rmdir, sys_rmdir) +__SC_WRAP(__NR_rmdir, sys_rmdir) #define __NR_lchown 1032 -__SYSCALL(__NR_lchown, sys_lchown) +__SC_WRAP(__NR_lchown, sys_lchown) #define __NR_access 1033 -__SYSCALL(__NR_access, sys_access) +__SC_WRAP(__NR_access, sys_access) #define __NR_rename 1034 -__SYSCALL(__NR_rename, sys_rename) +__SC_WRAP(__NR_rename, sys_rename) #define __NR_readlink 1035 -__SYSCALL(__NR_readlink, sys_readlink) +__SC_WRAP(__NR_readlink, sys_readlink) #define __NR_symlink 1036 -__SYSCALL(__NR_symlink, sys_symlink) +__SC_WRAP(__NR_symlink, sys_symlink) #define __NR_utimes 1037 __SYSCALL(__NR_utimes, sys_utimes) #define __NR3264_stat 1038 @@ -777,7 +776,7 @@ __SC_3264(__NR3264_lstat, sys_lstat64, sys_newlstat) #ifdef __ARCH_WANT_SYSCALL_NO_FLAGS #define __NR_pipe 1040 -__SYSCALL(__NR_pipe, sys_pipe) +__SC_WRAP(__NR_pipe, sys_pipe) #define __NR_dup2 1041 __SYSCALL(__NR_dup2, sys_dup2) #define __NR_epoll_create 1042 @@ -847,7 +846,7 @@ __SYSCALL(__NR_time, sys_time) __SYSCALL(__NR_utime, sys_utime) #define __NR_creat 1064 -__SYSCALL(__NR_creat, sys_creat) +__SC_WRAP(__NR_creat, sys_creat) #define __NR_getdents 1065 #define __ARCH_WANT_SYS_GETDENTS __SYSCALL(__NR_getdents, sys_getdents) @@ -857,9 +856,9 @@ __SYSCALL(__NR_futimesat, sys_futimesat) #define __ARCH_WANT_SYS_SELECT __SYSCALL(__NR_select, sys_select) #define __NR_poll 1068 -__SYSCALL(__NR_poll, sys_poll) +__SC_WRAP(__NR_poll, sys_poll) #define __NR_epoll_wait 1069 -__SYSCALL(__NR_epoll_wait, sys_epoll_wait) +__SC_WRAP(__NR_epoll_wait, sys_epoll_wait) #define __NR_ustat 1070 __SYSCALL(__NR_ustat, sys_ustat) #define __NR_vfork 1071 @@ -871,12 +870,12 @@ __SYSCALL(__NR_recv, sys_recv) #define __NR_send 1074 __SYSCALL(__NR_send, sys_send) #define __NR_bdflush 1075 -__SYSCALL(__NR_bdflush, sys_bdflush) +__SC_WRAP(__NR_bdflush, sys_bdflush) #define __NR_umount 1076 -__SYSCALL(__NR_umount, sys_oldumount) +__SC_WRAP(__NR_umount, sys_oldumount) #define __ARCH_WANT_SYS_OLDUMOUNT #define __NR_uselib 1077 -__SYSCALL(__NR_uselib, sys_uselib) +__SC_WRAP(__NR_uselib, sys_uselib) #define __NR__sysctl 1078 __SYSCALL(__NR__sysctl, sys_sysctl) -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 06/23] compat ABI: use non-compat openat and open_by_handle_at variants @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich 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 <ynorov@caviumnetworks.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Chris Metcalf <cmetcalf@ezchip.com> [for tile] --- arch/tile/kernel/compat.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/tile/kernel/compat.c b/arch/tile/kernel/compat.c index 4912084..489ae19 100644 --- a/arch/tile/kernel/compat.c +++ b/arch/tile/kernel/compat.c @@ -94,6 +94,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 -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 06/23] compat ABI: use non-compat openat and open_by_handle_at variants @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel 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 <ynorov@caviumnetworks.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Chris Metcalf <cmetcalf@ezchip.com> [for tile] --- arch/tile/kernel/compat.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/tile/kernel/compat.c b/arch/tile/kernel/compat.c index 4912084..489ae19 100644 --- a/arch/tile/kernel/compat.c +++ b/arch/tile/kernel/compat.c @@ -94,6 +94,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 -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 06/23] compat ABI: use non-compat openat and open_by_handle_at variants @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich 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 <ynorov@caviumnetworks.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Chris Metcalf <cmetcalf@ezchip.com> [for tile] --- arch/tile/kernel/compat.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/tile/kernel/compat.c b/arch/tile/kernel/compat.c index 4912084..489ae19 100644 --- a/arch/tile/kernel/compat.c +++ b/arch/tile/kernel/compat.c @@ -94,6 +94,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 -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 07/23] 32-bit ABI: introduce ARCH_32BIT_OFF_T config option 2016-05-24 0:04 ` Yury Norov (?) (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich 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 <ynorov@caviumnetworks.com> --- arch/Kconfig | 4 ++++ 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, 30 insertions(+), 1 deletion(-) diff --git a/arch/Kconfig b/arch/Kconfig index 92fcbd4..a2b7cf3 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -230,6 +230,10 @@ config ARCH_THREAD_INFO_ALLOCATOR config ARCH_WANTS_DYNAMIC_TASK_STRUCT bool +config ARCH_32BIT_OFF_T + bool + depends on !64BIT + config HAVE_REGS_AND_STACK_ACCESS_API bool help diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index a876743..13f66cc 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig @@ -9,6 +9,7 @@ config ARC def_bool y select ARCH_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC + select ARCH_32BIT_OFF_T select BUILDTIME_EXTABLE_SORT select COMMON_CLK select CLONE_BACKWARDS diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index cdfa6c2..efe3ca2 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_HAS_ATOMIC64_DEC_IF_POSITIVE select ARCH_HAS_DEVMEM_IS_ALLOWED select ARCH_HAS_ELF_RANDOMIZE diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index a63c122..ef4368e 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 e086f9e..5bc9203 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 eefd9a4..2f14904 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 986ea84..8c221f1 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/Kconfig index 57298e7..df84602 100644 --- a/arch/hexagon/Kconfig +++ b/arch/hexagon/Kconfig @@ -3,6 +3,7 @@ comment "Linux Kernel Configuration for Hexagon" config HEXAGON def_bool y + select ARCH_32BIT_OFF_T select HAVE_OPROFILE # Other pending projects/to-do items. # select HAVE_REGS_AND_STACK_ACCESS_API diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig index c82b292..7866bca 100644 --- a/arch/m32r/Kconfig +++ b/arch/m32r/Kconfig @@ -1,6 +1,7 @@ config M32R bool default y + select ARCH_32BIT_OFF_T select HAVE_IDE select HAVE_OPROFILE select INIT_ALL_POSSIBLE diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index 498b567..e9897e4 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -1,6 +1,7 @@ config M68K bool default y + select ARCH_32BIT_OFF_T select ARCH_MIGHT_HAVE_PC_PARPORT if ISA select HAVE_IDE select HAVE_AOUT if MMU diff --git a/arch/metag/Kconfig b/arch/metag/Kconfig index a0fa88d..5b7620a 100644 --- a/arch/metag/Kconfig +++ b/arch/metag/Kconfig @@ -1,5 +1,6 @@ config METAG def_bool y + select ARCH_32BIT_OFF_T select EMBEDDED select GENERIC_ATOMIC64 select GENERIC_CLOCKEVENTS diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 3d793b5..bdb0f83 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -1,5 +1,6 @@ config MICROBLAZE def_bool y + select ARCH_32BIT_OFF_T select ARCH_HAS_GCOV_PROFILE_ALL select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_WANT_IPC_PARSE_VERSION diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 2018c2b..079a6d2 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -1,6 +1,7 @@ config MIPS bool default y + select ARCH_32BIT_OFF_T if !64BIT select ARCH_SUPPORTS_UPROBES select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index 06ddb55..bc1aae5 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig @@ -1,5 +1,6 @@ config MN10300 def_bool y + select ARCH_32BIT_OFF_T select HAVE_OPROFILE select HAVE_UID16 select GENERIC_IRQ_SHOW diff --git a/arch/nios2/Kconfig b/arch/nios2/Kconfig index 4375554..a38fc38 100644 --- a/arch/nios2/Kconfig +++ b/arch/nios2/Kconfig @@ -1,5 +1,6 @@ config NIOS2 def_bool y + select ARCH_32BIT_OFF_T select ARCH_WANT_OPTIONAL_GPIOLIB select CLKSRC_OF select GENERIC_ATOMIC64 diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig index e118c02..0271714 100644 --- a/arch/openrisc/Kconfig +++ b/arch/openrisc/Kconfig @@ -5,6 +5,7 @@ config OPENRISC def_bool y + select ARCH_32BIT_OFF_T select OF select OF_EARLY_FLATTREE select IRQ_DOMAIN diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 88cfaa8..affad75 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -1,5 +1,6 @@ config PARISC def_bool y + select ARCH_32BIT_OFF_T if !64BIT select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS select ARCH_MIGHT_HAVE_PC_PARPORT select HAVE_IDE diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 7cd32c0..2c7a795 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -85,6 +85,7 @@ config ARCH_HAS_DMA_SET_COHERENT_MASK config PPC bool default y + select ARCH_32BIT_OFF_T if PPC32 select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO select BINFMT_ELF diff --git a/arch/score/Kconfig b/arch/score/Kconfig index 366e1b5..bc7bc7a 100644 --- a/arch/score/Kconfig +++ b/arch/score/Kconfig @@ -2,6 +2,7 @@ menu "Machine selection" config SCORE def_bool y + select ARCH_32BIT_OFF_T select GENERIC_IRQ_SHOW select GENERIC_IOMAP select GENERIC_ATOMIC64 diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 7ed20fc..2438390 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -52,6 +52,7 @@ config SUPERH config SUPERH32 def_bool ARCH = "sh" + select ARCH_32BIT_OFF_T select HAVE_KPROBES select HAVE_KRETPROBES select HAVE_IOREMAP_PROT if MMU && !X2TLB diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 57ffaf2..c88b82d 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -45,6 +45,7 @@ config SPARC config SPARC32 def_bool !64BIT + select ARCH_32BIT_OFF_T select GENERIC_ATOMIC64 select CLZ_TAB select HAVE_UID16 diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 8171930..f9d61e7 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig @@ -3,6 +3,7 @@ config TILE def_bool y + select ARCH_32BIT_OFF_T if !64BIT select HAVE_PERF_EVENTS select USE_PMC if PERF_EVENTS select HAVE_DMA_API_DEBUG diff --git a/arch/unicore32/Kconfig b/arch/unicore32/Kconfig index e5602ee..b995104 100644 --- a/arch/unicore32/Kconfig +++ b/arch/unicore32/Kconfig @@ -1,6 +1,7 @@ config UNICORE32 def_bool y select ARCH_HAS_DEVMEM_IS_ALLOWED + select ARCH_32BIT_OFF_T select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO select HAVE_MEMBLOCK diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2dc18605..3628b14 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -20,6 +20,7 @@ config X86 select ACPI_LEGACY_TABLES_LOOKUP if ACPI select ACPI_SYSTEM_POWER_STATES_SUPPORT if ACPI select ANON_INODES + select ARCH_32BIT_OFF_T if X86_32 select ARCH_CLOCKSOURCE_DATA select ARCH_DISCARD_MEMBLOCK select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE diff --git a/arch/x86/um/Kconfig b/arch/x86/um/Kconfig index ed56a1c..8436bcd 100644 --- a/arch/x86/um/Kconfig +++ b/arch/x86/um/Kconfig @@ -21,6 +21,7 @@ config 64BIT config X86_32 def_bool !64BIT select HAVE_AOUT + select ARCH_32BIT_OFF_T select ARCH_WANT_IPC_PARSE_VERSION select MODULES_USE_ELF_REL select CLONE_BACKWARDS diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index e832d3e..b68de31 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -3,6 +3,7 @@ config ZONE_DMA config XTENSA def_bool y + select ARCH_32BIT_OFF_T select ARCH_WANT_FRAME_POINTERS select ARCH_WANT_IPC_PARSE_VERSION select ARCH_WANT_OPTIONAL_GPIOLIB diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h index 76ce329..46960a1 100644 --- a/include/linux/fcntl.h +++ b/include/linux/fcntl.h @@ -5,7 +5,7 @@ #ifndef force_o_largefile -#define force_o_largefile() (BITS_PER_LONG != 32) +#define force_o_largefile() (!IS_ENABLED(CONFIG_ARCH_32BIT_OFF_T)) #endif #if BITS_PER_LONG == 32 -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 07/23] 32-bit ABI: introduce ARCH_32BIT_OFF_T config option @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel 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 <ynorov@caviumnetworks.com> --- arch/Kconfig | 4 ++++ 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, 30 insertions(+), 1 deletion(-) diff --git a/arch/Kconfig b/arch/Kconfig index 92fcbd4..a2b7cf3 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -230,6 +230,10 @@ config ARCH_THREAD_INFO_ALLOCATOR config ARCH_WANTS_DYNAMIC_TASK_STRUCT bool +config ARCH_32BIT_OFF_T + bool + depends on !64BIT + config HAVE_REGS_AND_STACK_ACCESS_API bool help diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index a876743..13f66cc 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig @@ -9,6 +9,7 @@ config ARC def_bool y select ARCH_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC + select ARCH_32BIT_OFF_T select BUILDTIME_EXTABLE_SORT select COMMON_CLK select CLONE_BACKWARDS diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index cdfa6c2..efe3ca2 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_HAS_ATOMIC64_DEC_IF_POSITIVE select ARCH_HAS_DEVMEM_IS_ALLOWED select ARCH_HAS_ELF_RANDOMIZE diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index a63c122..ef4368e 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 e086f9e..5bc9203 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 eefd9a4..2f14904 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 986ea84..8c221f1 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/Kconfig index 57298e7..df84602 100644 --- a/arch/hexagon/Kconfig +++ b/arch/hexagon/Kconfig @@ -3,6 +3,7 @@ comment "Linux Kernel Configuration for Hexagon" config HEXAGON def_bool y + select ARCH_32BIT_OFF_T select HAVE_OPROFILE # Other pending projects/to-do items. # select HAVE_REGS_AND_STACK_ACCESS_API diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig index c82b292..7866bca 100644 --- a/arch/m32r/Kconfig +++ b/arch/m32r/Kconfig @@ -1,6 +1,7 @@ config M32R bool default y + select ARCH_32BIT_OFF_T select HAVE_IDE select HAVE_OPROFILE select INIT_ALL_POSSIBLE diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index 498b567..e9897e4 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -1,6 +1,7 @@ config M68K bool default y + select ARCH_32BIT_OFF_T select ARCH_MIGHT_HAVE_PC_PARPORT if ISA select HAVE_IDE select HAVE_AOUT if MMU diff --git a/arch/metag/Kconfig b/arch/metag/Kconfig index a0fa88d..5b7620a 100644 --- a/arch/metag/Kconfig +++ b/arch/metag/Kconfig @@ -1,5 +1,6 @@ config METAG def_bool y + select ARCH_32BIT_OFF_T select EMBEDDED select GENERIC_ATOMIC64 select GENERIC_CLOCKEVENTS diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 3d793b5..bdb0f83 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -1,5 +1,6 @@ config MICROBLAZE def_bool y + select ARCH_32BIT_OFF_T select ARCH_HAS_GCOV_PROFILE_ALL select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_WANT_IPC_PARSE_VERSION diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 2018c2b..079a6d2 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -1,6 +1,7 @@ config MIPS bool default y + select ARCH_32BIT_OFF_T if !64BIT select ARCH_SUPPORTS_UPROBES select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index 06ddb55..bc1aae5 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig @@ -1,5 +1,6 @@ config MN10300 def_bool y + select ARCH_32BIT_OFF_T select HAVE_OPROFILE select HAVE_UID16 select GENERIC_IRQ_SHOW diff --git a/arch/nios2/Kconfig b/arch/nios2/Kconfig index 4375554..a38fc38 100644 --- a/arch/nios2/Kconfig +++ b/arch/nios2/Kconfig @@ -1,5 +1,6 @@ config NIOS2 def_bool y + select ARCH_32BIT_OFF_T select ARCH_WANT_OPTIONAL_GPIOLIB select CLKSRC_OF select GENERIC_ATOMIC64 diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig index e118c02..0271714 100644 --- a/arch/openrisc/Kconfig +++ b/arch/openrisc/Kconfig @@ -5,6 +5,7 @@ config OPENRISC def_bool y + select ARCH_32BIT_OFF_T select OF select OF_EARLY_FLATTREE select IRQ_DOMAIN diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 88cfaa8..affad75 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -1,5 +1,6 @@ config PARISC def_bool y + select ARCH_32BIT_OFF_T if !64BIT select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS select ARCH_MIGHT_HAVE_PC_PARPORT select HAVE_IDE diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 7cd32c0..2c7a795 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -85,6 +85,7 @@ config ARCH_HAS_DMA_SET_COHERENT_MASK config PPC bool default y + select ARCH_32BIT_OFF_T if PPC32 select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO select BINFMT_ELF diff --git a/arch/score/Kconfig b/arch/score/Kconfig index 366e1b5..bc7bc7a 100644 --- a/arch/score/Kconfig +++ b/arch/score/Kconfig @@ -2,6 +2,7 @@ menu "Machine selection" config SCORE def_bool y + select ARCH_32BIT_OFF_T select GENERIC_IRQ_SHOW select GENERIC_IOMAP select GENERIC_ATOMIC64 diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 7ed20fc..2438390 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -52,6 +52,7 @@ config SUPERH config SUPERH32 def_bool ARCH = "sh" + select ARCH_32BIT_OFF_T select HAVE_KPROBES select HAVE_KRETPROBES select HAVE_IOREMAP_PROT if MMU && !X2TLB diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 57ffaf2..c88b82d 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -45,6 +45,7 @@ config SPARC config SPARC32 def_bool !64BIT + select ARCH_32BIT_OFF_T select GENERIC_ATOMIC64 select CLZ_TAB select HAVE_UID16 diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 8171930..f9d61e7 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig @@ -3,6 +3,7 @@ config TILE def_bool y + select ARCH_32BIT_OFF_T if !64BIT select HAVE_PERF_EVENTS select USE_PMC if PERF_EVENTS select HAVE_DMA_API_DEBUG diff --git a/arch/unicore32/Kconfig b/arch/unicore32/Kconfig index e5602ee..b995104 100644 --- a/arch/unicore32/Kconfig +++ b/arch/unicore32/Kconfig @@ -1,6 +1,7 @@ config UNICORE32 def_bool y select ARCH_HAS_DEVMEM_IS_ALLOWED + select ARCH_32BIT_OFF_T select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO select HAVE_MEMBLOCK diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2dc18605..3628b14 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -20,6 +20,7 @@ config X86 select ACPI_LEGACY_TABLES_LOOKUP if ACPI select ACPI_SYSTEM_POWER_STATES_SUPPORT if ACPI select ANON_INODES + select ARCH_32BIT_OFF_T if X86_32 select ARCH_CLOCKSOURCE_DATA select ARCH_DISCARD_MEMBLOCK select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE diff --git a/arch/x86/um/Kconfig b/arch/x86/um/Kconfig index ed56a1c..8436bcd 100644 --- a/arch/x86/um/Kconfig +++ b/arch/x86/um/Kconfig @@ -21,6 +21,7 @@ config 64BIT config X86_32 def_bool !64BIT select HAVE_AOUT + select ARCH_32BIT_OFF_T select ARCH_WANT_IPC_PARSE_VERSION select MODULES_USE_ELF_REL select CLONE_BACKWARDS diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index e832d3e..b68de31 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -3,6 +3,7 @@ config ZONE_DMA config XTENSA def_bool y + select ARCH_32BIT_OFF_T select ARCH_WANT_FRAME_POINTERS select ARCH_WANT_IPC_PARSE_VERSION select ARCH_WANT_OPTIONAL_GPIOLIB diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h index 76ce329..46960a1 100644 --- a/include/linux/fcntl.h +++ b/include/linux/fcntl.h @@ -5,7 +5,7 @@ #ifndef force_o_largefile -#define force_o_largefile() (BITS_PER_LONG != 32) +#define force_o_largefile() (!IS_ENABLED(CONFIG_ARCH_32BIT_OFF_T)) #endif #if BITS_PER_LONG == 32 -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 07/23] 32-bit ABI: introduce ARCH_32BIT_OFF_T config option @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich 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 <ynorov@caviumnetworks.com> --- arch/Kconfig | 4 ++++ 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, 30 insertions(+), 1 deletion(-) diff --git a/arch/Kconfig b/arch/Kconfig index 92fcbd4..a2b7cf3 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -230,6 +230,10 @@ config ARCH_THREAD_INFO_ALLOCATOR config ARCH_WANTS_DYNAMIC_TASK_STRUCT bool +config ARCH_32BIT_OFF_T + bool + depends on !64BIT + config HAVE_REGS_AND_STACK_ACCESS_API bool help diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index a876743..13f66cc 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig @@ -9,6 +9,7 @@ config ARC def_bool y select ARCH_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC + select ARCH_32BIT_OFF_T select BUILDTIME_EXTABLE_SORT select COMMON_CLK select CLONE_BACKWARDS diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index cdfa6c2..efe3ca2 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_HAS_ATOMIC64_DEC_IF_POSITIVE select ARCH_HAS_DEVMEM_IS_ALLOWED select ARCH_HAS_ELF_RANDOMIZE diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index a63c122..ef4368e 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 e086f9e..5bc9203 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 eefd9a4..2f14904 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 986ea84..8c221f1 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/Kconfig index 57298e7..df84602 100644 --- a/arch/hexagon/Kconfig +++ b/arch/hexagon/Kconfig @@ -3,6 +3,7 @@ comment "Linux Kernel Configuration for Hexagon" config HEXAGON def_bool y + select ARCH_32BIT_OFF_T select HAVE_OPROFILE # Other pending projects/to-do items. # select HAVE_REGS_AND_STACK_ACCESS_API diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig index c82b292..7866bca 100644 --- a/arch/m32r/Kconfig +++ b/arch/m32r/Kconfig @@ -1,6 +1,7 @@ config M32R bool default y + select ARCH_32BIT_OFF_T select HAVE_IDE select HAVE_OPROFILE select INIT_ALL_POSSIBLE diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index 498b567..e9897e4 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -1,6 +1,7 @@ config M68K bool default y + select ARCH_32BIT_OFF_T select ARCH_MIGHT_HAVE_PC_PARPORT if ISA select HAVE_IDE select HAVE_AOUT if MMU diff --git a/arch/metag/Kconfig b/arch/metag/Kconfig index a0fa88d..5b7620a 100644 --- a/arch/metag/Kconfig +++ b/arch/metag/Kconfig @@ -1,5 +1,6 @@ config METAG def_bool y + select ARCH_32BIT_OFF_T select EMBEDDED select GENERIC_ATOMIC64 select GENERIC_CLOCKEVENTS diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 3d793b5..bdb0f83 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -1,5 +1,6 @@ config MICROBLAZE def_bool y + select ARCH_32BIT_OFF_T select ARCH_HAS_GCOV_PROFILE_ALL select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_WANT_IPC_PARSE_VERSION diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 2018c2b..079a6d2 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -1,6 +1,7 @@ config MIPS bool default y + select ARCH_32BIT_OFF_T if !64BIT select ARCH_SUPPORTS_UPROBES select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index 06ddb55..bc1aae5 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig @@ -1,5 +1,6 @@ config MN10300 def_bool y + select ARCH_32BIT_OFF_T select HAVE_OPROFILE select HAVE_UID16 select GENERIC_IRQ_SHOW diff --git a/arch/nios2/Kconfig b/arch/nios2/Kconfig index 4375554..a38fc38 100644 --- a/arch/nios2/Kconfig +++ b/arch/nios2/Kconfig @@ -1,5 +1,6 @@ config NIOS2 def_bool y + select ARCH_32BIT_OFF_T select ARCH_WANT_OPTIONAL_GPIOLIB select CLKSRC_OF select GENERIC_ATOMIC64 diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig index e118c02..0271714 100644 --- a/arch/openrisc/Kconfig +++ b/arch/openrisc/Kconfig @@ -5,6 +5,7 @@ config OPENRISC def_bool y + select ARCH_32BIT_OFF_T select OF select OF_EARLY_FLATTREE select IRQ_DOMAIN diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 88cfaa8..affad75 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -1,5 +1,6 @@ config PARISC def_bool y + select ARCH_32BIT_OFF_T if !64BIT select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS select ARCH_MIGHT_HAVE_PC_PARPORT select HAVE_IDE diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 7cd32c0..2c7a795 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -85,6 +85,7 @@ config ARCH_HAS_DMA_SET_COHERENT_MASK config PPC bool default y + select ARCH_32BIT_OFF_T if PPC32 select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO select BINFMT_ELF diff --git a/arch/score/Kconfig b/arch/score/Kconfig index 366e1b5..bc7bc7a 100644 --- a/arch/score/Kconfig +++ b/arch/score/Kconfig @@ -2,6 +2,7 @@ menu "Machine selection" config SCORE def_bool y + select ARCH_32BIT_OFF_T select GENERIC_IRQ_SHOW select GENERIC_IOMAP select GENERIC_ATOMIC64 diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 7ed20fc..2438390 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -52,6 +52,7 @@ config SUPERH config SUPERH32 def_bool ARCH = "sh" + select ARCH_32BIT_OFF_T select HAVE_KPROBES select HAVE_KRETPROBES select HAVE_IOREMAP_PROT if MMU && !X2TLB diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 57ffaf2..c88b82d 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -45,6 +45,7 @@ config SPARC config SPARC32 def_bool !64BIT + select ARCH_32BIT_OFF_T select GENERIC_ATOMIC64 select CLZ_TAB select HAVE_UID16 diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 8171930..f9d61e7 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig @@ -3,6 +3,7 @@ config TILE def_bool y + select ARCH_32BIT_OFF_T if !64BIT select HAVE_PERF_EVENTS select USE_PMC if PERF_EVENTS select HAVE_DMA_API_DEBUG diff --git a/arch/unicore32/Kconfig b/arch/unicore32/Kconfig index e5602ee..b995104 100644 --- a/arch/unicore32/Kconfig +++ b/arch/unicore32/Kconfig @@ -1,6 +1,7 @@ config UNICORE32 def_bool y select ARCH_HAS_DEVMEM_IS_ALLOWED + select ARCH_32BIT_OFF_T select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO select HAVE_MEMBLOCK diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2dc18605..3628b14 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -20,6 +20,7 @@ config X86 select ACPI_LEGACY_TABLES_LOOKUP if ACPI select ACPI_SYSTEM_POWER_STATES_SUPPORT if ACPI select ANON_INODES + select ARCH_32BIT_OFF_T if X86_32 select ARCH_CLOCKSOURCE_DATA select ARCH_DISCARD_MEMBLOCK select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE diff --git a/arch/x86/um/Kconfig b/arch/x86/um/Kconfig index ed56a1c..8436bcd 100644 --- a/arch/x86/um/Kconfig +++ b/arch/x86/um/Kconfig @@ -21,6 +21,7 @@ config 64BIT config X86_32 def_bool !64BIT select HAVE_AOUT + select ARCH_32BIT_OFF_T select ARCH_WANT_IPC_PARSE_VERSION select MODULES_USE_ELF_REL select CLONE_BACKWARDS diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index e832d3e..b68de31 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -3,6 +3,7 @@ config ZONE_DMA config XTENSA def_bool y + select ARCH_32BIT_OFF_T select ARCH_WANT_FRAME_POINTERS select ARCH_WANT_IPC_PARSE_VERSION select ARCH_WANT_OPTIONAL_GPIOLIB diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h index 76ce329..46960a1 100644 --- a/include/linux/fcntl.h +++ b/include/linux/fcntl.h @@ -5,7 +5,7 @@ #ifndef force_o_largefile -#define force_o_largefile() (BITS_PER_LONG != 32) +#define force_o_largefile() (!IS_ENABLED(CONFIG_ARCH_32BIT_OFF_T)) #endif #if BITS_PER_LONG == 32 -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 07/23] 32-bit ABI: introduce ARCH_32BIT_OFF_T config option @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, ynorov, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner 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 <ynorov@caviumnetworks.com> --- arch/Kconfig | 4 ++++ 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, 30 insertions(+), 1 deletion(-) diff --git a/arch/Kconfig b/arch/Kconfig index 92fcbd4..a2b7cf3 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -230,6 +230,10 @@ config ARCH_THREAD_INFO_ALLOCATOR config ARCH_WANTS_DYNAMIC_TASK_STRUCT bool +config ARCH_32BIT_OFF_T + bool + depends on !64BIT + config HAVE_REGS_AND_STACK_ACCESS_API bool help diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index a876743..13f66cc 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig @@ -9,6 +9,7 @@ config ARC def_bool y select ARCH_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC + select ARCH_32BIT_OFF_T select BUILDTIME_EXTABLE_SORT select COMMON_CLK select CLONE_BACKWARDS diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index cdfa6c2..efe3ca2 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_HAS_ATOMIC64_DEC_IF_POSITIVE select ARCH_HAS_DEVMEM_IS_ALLOWED select ARCH_HAS_ELF_RANDOMIZE diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index a63c122..ef4368e 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 e086f9e..5bc9203 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 eefd9a4..2f14904 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 986ea84..8c221f1 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/Kconfig index 57298e7..df84602 100644 --- a/arch/hexagon/Kconfig +++ b/arch/hexagon/Kconfig @@ -3,6 +3,7 @@ comment "Linux Kernel Configuration for Hexagon" config HEXAGON def_bool y + select ARCH_32BIT_OFF_T select HAVE_OPROFILE # Other pending projects/to-do items. # select HAVE_REGS_AND_STACK_ACCESS_API diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig index c82b292..7866bca 100644 --- a/arch/m32r/Kconfig +++ b/arch/m32r/Kconfig @@ -1,6 +1,7 @@ config M32R bool default y + select ARCH_32BIT_OFF_T select HAVE_IDE select HAVE_OPROFILE select INIT_ALL_POSSIBLE diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index 498b567..e9897e4 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -1,6 +1,7 @@ config M68K bool default y + select ARCH_32BIT_OFF_T select ARCH_MIGHT_HAVE_PC_PARPORT if ISA select HAVE_IDE select HAVE_AOUT if MMU diff --git a/arch/metag/Kconfig b/arch/metag/Kconfig index a0fa88d..5b7620a 100644 --- a/arch/metag/Kconfig +++ b/arch/metag/Kconfig @@ -1,5 +1,6 @@ config METAG def_bool y + select ARCH_32BIT_OFF_T select EMBEDDED select GENERIC_ATOMIC64 select GENERIC_CLOCKEVENTS diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 3d793b5..bdb0f83 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -1,5 +1,6 @@ config MICROBLAZE def_bool y + select ARCH_32BIT_OFF_T select ARCH_HAS_GCOV_PROFILE_ALL select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_WANT_IPC_PARSE_VERSION diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 2018c2b..079a6d2 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -1,6 +1,7 @@ config MIPS bool default y + select ARCH_32BIT_OFF_T if !64BIT select ARCH_SUPPORTS_UPROBES select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index 06ddb55..bc1aae5 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig @@ -1,5 +1,6 @@ config MN10300 def_bool y + select ARCH_32BIT_OFF_T select HAVE_OPROFILE select HAVE_UID16 select GENERIC_IRQ_SHOW diff --git a/arch/nios2/Kconfig b/arch/nios2/Kconfig index 4375554..a38fc38 100644 --- a/arch/nios2/Kconfig +++ b/arch/nios2/Kconfig @@ -1,5 +1,6 @@ config NIOS2 def_bool y + select ARCH_32BIT_OFF_T select ARCH_WANT_OPTIONAL_GPIOLIB select CLKSRC_OF select GENERIC_ATOMIC64 diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig index e118c02..0271714 100644 --- a/arch/openrisc/Kconfig +++ b/arch/openrisc/Kconfig @@ -5,6 +5,7 @@ config OPENRISC def_bool y + select ARCH_32BIT_OFF_T select OF select OF_EARLY_FLATTREE select IRQ_DOMAIN diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 88cfaa8..affad75 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -1,5 +1,6 @@ config PARISC def_bool y + select ARCH_32BIT_OFF_T if !64BIT select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS select ARCH_MIGHT_HAVE_PC_PARPORT select HAVE_IDE diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 7cd32c0..2c7a795 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -85,6 +85,7 @@ config ARCH_HAS_DMA_SET_COHERENT_MASK config PPC bool default y + select ARCH_32BIT_OFF_T if PPC32 select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO select BINFMT_ELF diff --git a/arch/score/Kconfig b/arch/score/Kconfig index 366e1b5..bc7bc7a 100644 --- a/arch/score/Kconfig +++ b/arch/score/Kconfig @@ -2,6 +2,7 @@ menu "Machine selection" config SCORE def_bool y + select ARCH_32BIT_OFF_T select GENERIC_IRQ_SHOW select GENERIC_IOMAP select GENERIC_ATOMIC64 diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 7ed20fc..2438390 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -52,6 +52,7 @@ config SUPERH config SUPERH32 def_bool ARCH = "sh" + select ARCH_32BIT_OFF_T select HAVE_KPROBES select HAVE_KRETPROBES select HAVE_IOREMAP_PROT if MMU && !X2TLB diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 57ffaf2..c88b82d 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -45,6 +45,7 @@ config SPARC config SPARC32 def_bool !64BIT + select ARCH_32BIT_OFF_T select GENERIC_ATOMIC64 select CLZ_TAB select HAVE_UID16 diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 8171930..f9d61e7 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig @@ -3,6 +3,7 @@ config TILE def_bool y + select ARCH_32BIT_OFF_T if !64BIT select HAVE_PERF_EVENTS select USE_PMC if PERF_EVENTS select HAVE_DMA_API_DEBUG diff --git a/arch/unicore32/Kconfig b/arch/unicore32/Kconfig index e5602ee..b995104 100644 --- a/arch/unicore32/Kconfig +++ b/arch/unicore32/Kconfig @@ -1,6 +1,7 @@ config UNICORE32 def_bool y select ARCH_HAS_DEVMEM_IS_ALLOWED + select ARCH_32BIT_OFF_T select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO select HAVE_MEMBLOCK diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2dc18605..3628b14 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -20,6 +20,7 @@ config X86 select ACPI_LEGACY_TABLES_LOOKUP if ACPI select ACPI_SYSTEM_POWER_STATES_SUPPORT if ACPI select ANON_INODES + select ARCH_32BIT_OFF_T if X86_32 select ARCH_CLOCKSOURCE_DATA select ARCH_DISCARD_MEMBLOCK select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE diff --git a/arch/x86/um/Kconfig b/arch/x86/um/Kconfig index ed56a1c..8436bcd 100644 --- a/arch/x86/um/Kconfig +++ b/arch/x86/um/Kconfig @@ -21,6 +21,7 @@ config 64BIT config X86_32 def_bool !64BIT select HAVE_AOUT + select ARCH_32BIT_OFF_T select ARCH_WANT_IPC_PARSE_VERSION select MODULES_USE_ELF_REL select CLONE_BACKWARDS diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index e832d3e..b68de31 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -3,6 +3,7 @@ config ZONE_DMA config XTENSA def_bool y + select ARCH_32BIT_OFF_T select ARCH_WANT_FRAME_POINTERS select ARCH_WANT_IPC_PARSE_VERSION select ARCH_WANT_OPTIONAL_GPIOLIB diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h index 76ce329..46960a1 100644 --- a/include/linux/fcntl.h +++ b/include/linux/fcntl.h @@ -5,7 +5,7 @@ #ifndef force_o_largefile -#define force_o_largefile() (BITS_PER_LONG != 32) +#define force_o_largefile() (!IS_ENABLED(CONFIG_ARCH_32BIT_OFF_T)) #endif #if BITS_PER_LONG == 32 -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 08/23] arm64: ilp32: add documentation on the ILP32 ABI for ARM64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Based on Andrew Pinski's patch-series. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- Documentation/arm64/ilp32.txt | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Documentation/arm64/ilp32.txt diff --git a/Documentation/arm64/ilp32.txt b/Documentation/arm64/ilp32.txt new file mode 100644 index 0000000..8e74d67 --- /dev/null +++ b/Documentation/arm64/ilp32.txt @@ -0,0 +1,25 @@ +ILP32 AARCH64 SYSCALL ABI +========================= + +This document describes the ILP32 syscall ABI and where it differs +from the generic compat linux syscall interface. + +Syscalls which normally would pass 64bit values as two arguments; +now pass the 64bit value as one argument. Next syscalls are affected: +fadvise64_64, +fallocate, +ftruncate, +lookup_dcookie, +pread64, +pwrite64, +readahead, +shmat, +sync_file_range, +truncate, +lseek, +mmap + +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. + -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 08/23] arm64: ilp32: add documentation on the ILP32 ABI for ARM64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel Based on Andrew Pinski's patch-series. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- Documentation/arm64/ilp32.txt | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Documentation/arm64/ilp32.txt diff --git a/Documentation/arm64/ilp32.txt b/Documentation/arm64/ilp32.txt new file mode 100644 index 0000000..8e74d67 --- /dev/null +++ b/Documentation/arm64/ilp32.txt @@ -0,0 +1,25 @@ +ILP32 AARCH64 SYSCALL ABI +========================= + +This document describes the ILP32 syscall ABI and where it differs +from the generic compat linux syscall interface. + +Syscalls which normally would pass 64bit values as two arguments; +now pass the 64bit value as one argument. Next syscalls are affected: +fadvise64_64, +fallocate, +ftruncate, +lookup_dcookie, +pread64, +pwrite64, +readahead, +shmat, +sync_file_range, +truncate, +lseek, +mmap + +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. + -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 08/23] arm64: ilp32: add documentation on the ILP32 ABI for ARM64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Based on Andrew Pinski's patch-series. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- Documentation/arm64/ilp32.txt | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Documentation/arm64/ilp32.txt diff --git a/Documentation/arm64/ilp32.txt b/Documentation/arm64/ilp32.txt new file mode 100644 index 0000000..8e74d67 --- /dev/null +++ b/Documentation/arm64/ilp32.txt @@ -0,0 +1,25 @@ +ILP32 AARCH64 SYSCALL ABI +========================= + +This document describes the ILP32 syscall ABI and where it differs +from the generic compat linux syscall interface. + +Syscalls which normally would pass 64bit values as two arguments; +now pass the 64bit value as one argument. Next syscalls are affected: +fadvise64_64, +fallocate, +ftruncate, +lookup_dcookie, +pread64, +pwrite64, +readahead, +shmat, +sync_file_range, +truncate, +lseek, +mmap + +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. + -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 09/23] arm64: ensure the kernel is compiled for LP64 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski From: Andrew Pinski <apinski@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.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.com> --- arch/arm64/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 354d754..29ebf23 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -35,14 +35,19 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads) KBUILD_AFLAGS += $(lseinstr) +KBUILD_CFLAGS += $(call cc-option,-mabi=lp64) +KBUILD_AFLAGS += $(call cc-option,-mabi=lp64) + ifeq ($(CONFIG_CPU_BIG_ENDIAN), y) KBUILD_CPPFLAGS += -mbig-endian AS += -EB LD += -EB +LDFLAGS += -maarch64linuxb else KBUILD_CPPFLAGS += -mlittle-endian AS += -EL LD += -EL +LDFLAGS += -maarch64linux endif CHECKFLAGS += -D__aarch64__ -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 09/23] arm64: ensure the kernel is compiled for LP64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel From: Andrew Pinski <apinski@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.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.com> --- arch/arm64/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 354d754..29ebf23 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -35,14 +35,19 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads) KBUILD_AFLAGS += $(lseinstr) +KBUILD_CFLAGS += $(call cc-option,-mabi=lp64) +KBUILD_AFLAGS += $(call cc-option,-mabi=lp64) + ifeq ($(CONFIG_CPU_BIG_ENDIAN), y) KBUILD_CPPFLAGS += -mbig-endian AS += -EB LD += -EB +LDFLAGS += -maarch64linuxb else KBUILD_CPPFLAGS += -mlittle-endian AS += -EL LD += -EL +LDFLAGS += -maarch64linux endif CHECKFLAGS += -D__aarch64__ -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 09/23] arm64: ensure the kernel is compiled for LP64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski From: Andrew Pinski <apinski@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.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.com> --- arch/arm64/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 354d754..29ebf23 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -35,14 +35,19 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads) KBUILD_AFLAGS += $(lseinstr) +KBUILD_CFLAGS += $(call cc-option,-mabi=lp64) +KBUILD_AFLAGS += $(call cc-option,-mabi=lp64) + ifeq ($(CONFIG_CPU_BIG_ENDIAN), y) KBUILD_CPPFLAGS += -mbig-endian AS += -EB LD += -EB +LDFLAGS += -maarch64linuxb else KBUILD_CPPFLAGS += -mlittle-endian AS += -EL LD += -EL +LDFLAGS += -maarch64linux endif CHECKFLAGS += -D__aarch64__ -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 10/23] arm64: rename COMPAT to AARCH32_EL0 in Kconfig 2016-05-24 0:04 ` Yury Norov (?) (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Bamvor Jian Zhang From: Andrew Pinski <apinski@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 <ddaney@caviumnetworks.com> Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@linaro.org> Signed-off-by: Yury Norov <ynorov@caviumnetworks.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/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 | 4 ++-- 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 +- 17 files changed, 39 insertions(+), 32 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 4f43622..ede9b2e 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -370,7 +370,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 @@ -655,7 +655,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. @@ -925,7 +925,12 @@ 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 select HAVE_UID16 diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h index 50f559f..63b19f1 100644 --- a/arch/arm64/include/asm/fpsimd.h +++ b/arch/arm64/include/asm/fpsimd.h @@ -52,7 +52,7 @@ struct fpsimd_partial_state { }; -#if defined(__KERNEL__) && defined(CONFIG_COMPAT) +#if defined(__KERNEL__) && defined(CONFIG_AARCH32_EL0) /* Masks for extracting the FPSR and FPCR from the FPSCR */ #define VFP_FPSCR_STAT_MASK 0xf800009f #define VFP_FPSCR_CTRL_MASK 0x07f79f00 diff --git a/arch/arm64/include/asm/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 cef1cf3..5bbdbb4 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) \ ({ \ unsigned long *__tls; \ @@ -121,7 +121,7 @@ static inline void start_thread(struct pt_regs *regs, unsigned long pc, regs->sp = sp; } -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 static inline void compat_start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp) { diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h index a307eb6..4c730c3 100644 --- a/arch/arm64/include/asm/ptrace.h +++ b/arch/arm64/include/asm/ptrace.h @@ -121,7 +121,7 @@ struct pt_regs { #define arch_has_single_step() (1) -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define compat_thumb_mode(regs) \ (((regs)->pstate & COMPAT_PSR_T_BIT)) #else diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h index eeaa975..e68fcce 100644 --- a/arch/arm64/include/asm/signal32.h +++ b/arch/arm64/include/asm/signal32.h @@ -17,7 +17,9 @@ #define __ASM_SIGNAL32_H #ifdef __KERNEL__ -#ifdef CONFIG_COMPAT + +#ifdef CONFIG_AARCH32_EL0 + #include <linux/compat.h> #define AARCH32_KERN_SIGRET_CODE_OFFSET 0x500 @@ -47,6 +49,6 @@ static inline int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t static inline void compat_setup_restart_syscall(struct pt_regs *regs) { } -#endif /* CONFIG_COMPAT */ +#endif /* CONFIG_AARCH32_EL0 */ #endif /* __KERNEL__ */ #endif /* __ASM_SIGNAL32_H */ diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index 41e58fe..2971dea 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define __ARCH_WANT_COMPAT_SYS_GETDENTS64 #define __ARCH_WANT_COMPAT_STAT64 #define __ARCH_WANT_SYS_GETHOSTNAME diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 3793003..75dd250 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -25,7 +25,7 @@ OBJCOPYFLAGS := --prefix-symbols=__efistub_ $(obj)/%.stub.o: $(obj)/%.o FORCE $(call if_changed,objcopy) -arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ +arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o \ ../../arm/kernel/opcodes.o arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index 3ae6b31..e229525 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -52,7 +52,7 @@ int main(void) DEFINE(S_X7, offsetof(struct pt_regs, regs[7])); DEFINE(S_LR, offsetof(struct pt_regs, regs[30])); DEFINE(S_SP, offsetof(struct pt_regs, sp)); -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 DEFINE(S_COMPAT_SP, offsetof(struct pt_regs, compat_sp)); #endif DEFINE(S_PSTATE, offsetof(struct pt_regs, pstate)); diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index 943f514..6f77412 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -32,7 +32,7 @@ unsigned long elf_hwcap __read_mostly; EXPORT_SYMBOL_GPL(elf_hwcap); -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define COMPAT_ELF_HWCAP_DEFAULT \ (COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\ COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\ @@ -751,7 +751,7 @@ static const struct arm64_cpu_capabilities arm64_hwcaps[] = { HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_FP_SHIFT, FTR_SIGNED, 1, CAP_HWCAP, HWCAP_FPHP), HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_ASIMD_SHIFT, FTR_SIGNED, 0, CAP_HWCAP, HWCAP_ASIMD), HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_ASIMD_SHIFT, FTR_SIGNED, 1, CAP_HWCAP, HWCAP_ASIMDHP), -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_PMULL), HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_AES), HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_SHA1_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_SHA1), @@ -767,7 +767,7 @@ static void __init cap_set_hwcap(const struct arm64_cpu_capabilities *cap) case CAP_HWCAP: elf_hwcap |= cap->hwcap; break; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 case CAP_COMPAT_HWCAP: compat_elf_hwcap |= (u32)cap->hwcap; break; @@ -790,7 +790,7 @@ static bool __maybe_unused cpus_have_hwcap(const struct arm64_cpu_capabilities * case CAP_HWCAP: rc = (elf_hwcap & cap->hwcap) != 0; break; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 case CAP_COMPAT_HWCAP: rc = (compat_elf_hwcap & (u32)cap->hwcap) != 0; break; diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c index 84c8684..32fb4f3 100644 --- a/arch/arm64/kernel/cpuinfo.c +++ b/arch/arm64/kernel/cpuinfo.c @@ -127,7 +127,7 @@ static int c_show(struct seq_file *m, void *v) */ seq_puts(m, "Features\t:"); if (personality(current->personality) == PER_LINUX32) { -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 for (j = 0; compat_hwcap_str[j]; j++) if (compat_elf_hwcap & (1 << j)) seq_printf(m, " %s", compat_hwcap_str[j]); @@ -135,7 +135,7 @@ static int c_show(struct seq_file *m, void *v) 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 */ +#endif /* CONFIG_AARCH32_EL0 */ } else { for (j = 0; hwcap_str[j]; j++) if (elf_hwcap & (1 << j)) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index ec8bb48..21a0624 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -260,7 +260,7 @@ ENTRY(vectors) ventry el0_fiq_invalid // FIQ 64-bit EL0 ventry el0_error_invalid // Error 64-bit EL0 -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 ventry el0_sync_compat // Synchronous 32-bit EL0 ventry el0_irq_compat // IRQ 32-bit EL0 ventry el0_fiq_invalid_compat // FIQ 32-bit EL0 @@ -300,7 +300,7 @@ el0_error_invalid: inv_entry 0, BAD_ERROR ENDPROC(el0_error_invalid) -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 el0_fiq_invalid_compat: inv_entry 0, BAD_FIQ, 32 ENDPROC(el0_fiq_invalid_compat) @@ -463,7 +463,7 @@ el0_sync: b.ge el0_dbg b el0_inv -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 .align 6 el0_sync_compat: kernel_entry 0, 32 diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index 85da0f5..35e70d8 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S @@ -608,7 +608,7 @@ CPU_LE( movk x0, #0x30d0, lsl #16 ) // Clear EE and E0E on LE systems msr cptr_el2, x0 // Disable copro. traps to EL2 1: -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 msr hstr_el2, xzr // Disable CP15 traps to EL2 #endif diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 3f6cd5c..aa79e81 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -82,7 +82,7 @@ static void ptrace_hbptriggered(struct perf_event *bp, .si_addr = (void __user *)(bkpt->trigger), }; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 int i; if (!is_compat_task()) @@ -657,7 +657,7 @@ static const struct user_regset_view user_aarch64_view = { .regsets = aarch64_regsets, .n = ARRAY_SIZE(aarch64_regsets) }; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #include <linux/compat.h> enum compat_regset { @@ -1192,11 +1192,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, return ret; } -#endif /* CONFIG_COMPAT */ +#endif /* CONFIG_AARCH32_EL0 */ const struct user_regset_view *task_user_regset_view(struct task_struct *task) { -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 /* * Core dumping of 32-bit tasks or compat ptrace requests must use the * user_aarch32_view compatible with arm32. Native ptrace requests on diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index e16ae22..85461e8 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -409,7 +409,7 @@ long compat_arm_syscall(struct pt_regs *regs); asmlinkage long do_ni_syscall(struct pt_regs *regs) { -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 long ret; if (is_compat_task()) { ret = compat_arm_syscall(regs); diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 97bc68f..26352a6 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -49,7 +49,7 @@ static union { } vdso_data_store __page_aligned_data; struct vdso_data *vdso_data = &vdso_data_store.data; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 /* * Create and map the vectors page for AArch32 tasks. */ @@ -107,7 +107,7 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) return PTR_ERR_OR_ZERO(ret); } -#endif /* CONFIG_COMPAT */ +#endif /* CONFIG_AARCH32_EL0 */ static struct vm_special_mapping vdso_spec[2]; diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index 5152b38..d5e699d 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -321,7 +321,7 @@ static void arch_timer_evtstrm_enable(int divider) | ARCH_TIMER_VIRT_EVT_EN; arch_timer_set_cntkctl(cntkctl); elf_hwcap |= HWCAP_EVTSTRM; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 compat_elf_hwcap |= COMPAT_HWCAP_EVTSTRM; #endif } -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 10/23] arm64: rename COMPAT to AARCH32_EL0 in Kconfig @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel From: Andrew Pinski <apinski@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 <ddaney@caviumnetworks.com> Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@linaro.org> Signed-off-by: Yury Norov <ynorov@caviumnetworks.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/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 | 4 ++-- 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 +- 17 files changed, 39 insertions(+), 32 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 4f43622..ede9b2e 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -370,7 +370,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 @@ -655,7 +655,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. @@ -925,7 +925,12 @@ 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 select HAVE_UID16 diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h index 50f559f..63b19f1 100644 --- a/arch/arm64/include/asm/fpsimd.h +++ b/arch/arm64/include/asm/fpsimd.h @@ -52,7 +52,7 @@ struct fpsimd_partial_state { }; -#if defined(__KERNEL__) && defined(CONFIG_COMPAT) +#if defined(__KERNEL__) && defined(CONFIG_AARCH32_EL0) /* Masks for extracting the FPSR and FPCR from the FPSCR */ #define VFP_FPSCR_STAT_MASK 0xf800009f #define VFP_FPSCR_CTRL_MASK 0x07f79f00 diff --git a/arch/arm64/include/asm/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 cef1cf3..5bbdbb4 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) \ ({ \ unsigned long *__tls; \ @@ -121,7 +121,7 @@ static inline void start_thread(struct pt_regs *regs, unsigned long pc, regs->sp = sp; } -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 static inline void compat_start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp) { diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h index a307eb6..4c730c3 100644 --- a/arch/arm64/include/asm/ptrace.h +++ b/arch/arm64/include/asm/ptrace.h @@ -121,7 +121,7 @@ struct pt_regs { #define arch_has_single_step() (1) -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define compat_thumb_mode(regs) \ (((regs)->pstate & COMPAT_PSR_T_BIT)) #else diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h index eeaa975..e68fcce 100644 --- a/arch/arm64/include/asm/signal32.h +++ b/arch/arm64/include/asm/signal32.h @@ -17,7 +17,9 @@ #define __ASM_SIGNAL32_H #ifdef __KERNEL__ -#ifdef CONFIG_COMPAT + +#ifdef CONFIG_AARCH32_EL0 + #include <linux/compat.h> #define AARCH32_KERN_SIGRET_CODE_OFFSET 0x500 @@ -47,6 +49,6 @@ static inline int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t static inline void compat_setup_restart_syscall(struct pt_regs *regs) { } -#endif /* CONFIG_COMPAT */ +#endif /* CONFIG_AARCH32_EL0 */ #endif /* __KERNEL__ */ #endif /* __ASM_SIGNAL32_H */ diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index 41e58fe..2971dea 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define __ARCH_WANT_COMPAT_SYS_GETDENTS64 #define __ARCH_WANT_COMPAT_STAT64 #define __ARCH_WANT_SYS_GETHOSTNAME diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 3793003..75dd250 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -25,7 +25,7 @@ OBJCOPYFLAGS := --prefix-symbols=__efistub_ $(obj)/%.stub.o: $(obj)/%.o FORCE $(call if_changed,objcopy) -arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ +arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o \ ../../arm/kernel/opcodes.o arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index 3ae6b31..e229525 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -52,7 +52,7 @@ int main(void) DEFINE(S_X7, offsetof(struct pt_regs, regs[7])); DEFINE(S_LR, offsetof(struct pt_regs, regs[30])); DEFINE(S_SP, offsetof(struct pt_regs, sp)); -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 DEFINE(S_COMPAT_SP, offsetof(struct pt_regs, compat_sp)); #endif DEFINE(S_PSTATE, offsetof(struct pt_regs, pstate)); diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index 943f514..6f77412 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -32,7 +32,7 @@ unsigned long elf_hwcap __read_mostly; EXPORT_SYMBOL_GPL(elf_hwcap); -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define COMPAT_ELF_HWCAP_DEFAULT \ (COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\ COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\ @@ -751,7 +751,7 @@ static const struct arm64_cpu_capabilities arm64_hwcaps[] = { HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_FP_SHIFT, FTR_SIGNED, 1, CAP_HWCAP, HWCAP_FPHP), HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_ASIMD_SHIFT, FTR_SIGNED, 0, CAP_HWCAP, HWCAP_ASIMD), HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_ASIMD_SHIFT, FTR_SIGNED, 1, CAP_HWCAP, HWCAP_ASIMDHP), -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_PMULL), HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_AES), HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_SHA1_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_SHA1), @@ -767,7 +767,7 @@ static void __init cap_set_hwcap(const struct arm64_cpu_capabilities *cap) case CAP_HWCAP: elf_hwcap |= cap->hwcap; break; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 case CAP_COMPAT_HWCAP: compat_elf_hwcap |= (u32)cap->hwcap; break; @@ -790,7 +790,7 @@ static bool __maybe_unused cpus_have_hwcap(const struct arm64_cpu_capabilities * case CAP_HWCAP: rc = (elf_hwcap & cap->hwcap) != 0; break; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 case CAP_COMPAT_HWCAP: rc = (compat_elf_hwcap & (u32)cap->hwcap) != 0; break; diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c index 84c8684..32fb4f3 100644 --- a/arch/arm64/kernel/cpuinfo.c +++ b/arch/arm64/kernel/cpuinfo.c @@ -127,7 +127,7 @@ static int c_show(struct seq_file *m, void *v) */ seq_puts(m, "Features\t:"); if (personality(current->personality) == PER_LINUX32) { -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 for (j = 0; compat_hwcap_str[j]; j++) if (compat_elf_hwcap & (1 << j)) seq_printf(m, " %s", compat_hwcap_str[j]); @@ -135,7 +135,7 @@ static int c_show(struct seq_file *m, void *v) 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 */ +#endif /* CONFIG_AARCH32_EL0 */ } else { for (j = 0; hwcap_str[j]; j++) if (elf_hwcap & (1 << j)) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index ec8bb48..21a0624 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -260,7 +260,7 @@ ENTRY(vectors) ventry el0_fiq_invalid // FIQ 64-bit EL0 ventry el0_error_invalid // Error 64-bit EL0 -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 ventry el0_sync_compat // Synchronous 32-bit EL0 ventry el0_irq_compat // IRQ 32-bit EL0 ventry el0_fiq_invalid_compat // FIQ 32-bit EL0 @@ -300,7 +300,7 @@ el0_error_invalid: inv_entry 0, BAD_ERROR ENDPROC(el0_error_invalid) -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 el0_fiq_invalid_compat: inv_entry 0, BAD_FIQ, 32 ENDPROC(el0_fiq_invalid_compat) @@ -463,7 +463,7 @@ el0_sync: b.ge el0_dbg b el0_inv -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 .align 6 el0_sync_compat: kernel_entry 0, 32 diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index 85da0f5..35e70d8 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S @@ -608,7 +608,7 @@ CPU_LE( movk x0, #0x30d0, lsl #16 ) // Clear EE and E0E on LE systems msr cptr_el2, x0 // Disable copro. traps to EL2 1: -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 msr hstr_el2, xzr // Disable CP15 traps to EL2 #endif diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 3f6cd5c..aa79e81 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -82,7 +82,7 @@ static void ptrace_hbptriggered(struct perf_event *bp, .si_addr = (void __user *)(bkpt->trigger), }; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 int i; if (!is_compat_task()) @@ -657,7 +657,7 @@ static const struct user_regset_view user_aarch64_view = { .regsets = aarch64_regsets, .n = ARRAY_SIZE(aarch64_regsets) }; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #include <linux/compat.h> enum compat_regset { @@ -1192,11 +1192,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, return ret; } -#endif /* CONFIG_COMPAT */ +#endif /* CONFIG_AARCH32_EL0 */ const struct user_regset_view *task_user_regset_view(struct task_struct *task) { -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 /* * Core dumping of 32-bit tasks or compat ptrace requests must use the * user_aarch32_view compatible with arm32. Native ptrace requests on diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index e16ae22..85461e8 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -409,7 +409,7 @@ long compat_arm_syscall(struct pt_regs *regs); asmlinkage long do_ni_syscall(struct pt_regs *regs) { -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 long ret; if (is_compat_task()) { ret = compat_arm_syscall(regs); diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 97bc68f..26352a6 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -49,7 +49,7 @@ static union { } vdso_data_store __page_aligned_data; struct vdso_data *vdso_data = &vdso_data_store.data; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 /* * Create and map the vectors page for AArch32 tasks. */ @@ -107,7 +107,7 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) return PTR_ERR_OR_ZERO(ret); } -#endif /* CONFIG_COMPAT */ +#endif /* CONFIG_AARCH32_EL0 */ static struct vm_special_mapping vdso_spec[2]; diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index 5152b38..d5e699d 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -321,7 +321,7 @@ static void arch_timer_evtstrm_enable(int divider) | ARCH_TIMER_VIRT_EVT_EN; arch_timer_set_cntkctl(cntkctl); elf_hwcap |= HWCAP_EVTSTRM; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 compat_elf_hwcap |= COMPAT_HWCAP_EVTSTRM; #endif } -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 10/23] arm64: rename COMPAT to AARCH32_EL0 in Kconfig @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Bamvor Jian Zhang From: Andrew Pinski <apinski@cavium.com> In this patchset ILP32 ABI support is added. Additionally to AARCH32, which is binary-compatible with ARM, ILP32 is (mostly) ABI-compatible. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 10/23] arm64: rename COMPAT to AARCH32_EL0 in Kconfig @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, Andrew Pinski, broonie, ynorov, Andrew Pinski, schwidefsky, bamvor.zhangjian, philipp.tomsich, Bamvor Jian Zhang, joseph, christoph.muellner From: Andrew Pinski <apinski@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 <ddaney@caviumnetworks.com> Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@linaro.org> Signed-off-by: Yury Norov <ynorov@caviumnetworks.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/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 | 4 ++-- 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 +- 17 files changed, 39 insertions(+), 32 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 4f43622..ede9b2e 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -370,7 +370,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 @@ -655,7 +655,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. @@ -925,7 +925,12 @@ 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 select HAVE_UID16 diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h index 50f559f..63b19f1 100644 --- a/arch/arm64/include/asm/fpsimd.h +++ b/arch/arm64/include/asm/fpsimd.h @@ -52,7 +52,7 @@ struct fpsimd_partial_state { }; -#if defined(__KERNEL__) && defined(CONFIG_COMPAT) +#if defined(__KERNEL__) && defined(CONFIG_AARCH32_EL0) /* Masks for extracting the FPSR and FPCR from the FPSCR */ #define VFP_FPSCR_STAT_MASK 0xf800009f #define VFP_FPSCR_CTRL_MASK 0x07f79f00 diff --git a/arch/arm64/include/asm/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 cef1cf3..5bbdbb4 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) \ ({ \ unsigned long *__tls; \ @@ -121,7 +121,7 @@ static inline void start_thread(struct pt_regs *regs, unsigned long pc, regs->sp = sp; } -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 static inline void compat_start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp) { diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h index a307eb6..4c730c3 100644 --- a/arch/arm64/include/asm/ptrace.h +++ b/arch/arm64/include/asm/ptrace.h @@ -121,7 +121,7 @@ struct pt_regs { #define arch_has_single_step() (1) -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define compat_thumb_mode(regs) \ (((regs)->pstate & COMPAT_PSR_T_BIT)) #else diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h index eeaa975..e68fcce 100644 --- a/arch/arm64/include/asm/signal32.h +++ b/arch/arm64/include/asm/signal32.h @@ -17,7 +17,9 @@ #define __ASM_SIGNAL32_H #ifdef __KERNEL__ -#ifdef CONFIG_COMPAT + +#ifdef CONFIG_AARCH32_EL0 + #include <linux/compat.h> #define AARCH32_KERN_SIGRET_CODE_OFFSET 0x500 @@ -47,6 +49,6 @@ static inline int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t static inline void compat_setup_restart_syscall(struct pt_regs *regs) { } -#endif /* CONFIG_COMPAT */ +#endif /* CONFIG_AARCH32_EL0 */ #endif /* __KERNEL__ */ #endif /* __ASM_SIGNAL32_H */ diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index 41e58fe..2971dea 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define __ARCH_WANT_COMPAT_SYS_GETDENTS64 #define __ARCH_WANT_COMPAT_STAT64 #define __ARCH_WANT_SYS_GETHOSTNAME diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 3793003..75dd250 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -25,7 +25,7 @@ OBJCOPYFLAGS := --prefix-symbols=__efistub_ $(obj)/%.stub.o: $(obj)/%.o FORCE $(call if_changed,objcopy) -arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ +arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o \ ../../arm/kernel/opcodes.o arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index 3ae6b31..e229525 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -52,7 +52,7 @@ int main(void) DEFINE(S_X7, offsetof(struct pt_regs, regs[7])); DEFINE(S_LR, offsetof(struct pt_regs, regs[30])); DEFINE(S_SP, offsetof(struct pt_regs, sp)); -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 DEFINE(S_COMPAT_SP, offsetof(struct pt_regs, compat_sp)); #endif DEFINE(S_PSTATE, offsetof(struct pt_regs, pstate)); diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index 943f514..6f77412 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -32,7 +32,7 @@ unsigned long elf_hwcap __read_mostly; EXPORT_SYMBOL_GPL(elf_hwcap); -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #define COMPAT_ELF_HWCAP_DEFAULT \ (COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\ COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\ @@ -751,7 +751,7 @@ static const struct arm64_cpu_capabilities arm64_hwcaps[] = { HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_FP_SHIFT, FTR_SIGNED, 1, CAP_HWCAP, HWCAP_FPHP), HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_ASIMD_SHIFT, FTR_SIGNED, 0, CAP_HWCAP, HWCAP_ASIMD), HWCAP_CAP(SYS_ID_AA64PFR0_EL1, ID_AA64PFR0_ASIMD_SHIFT, FTR_SIGNED, 1, CAP_HWCAP, HWCAP_ASIMDHP), -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_PMULL), HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_AES), HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_SHA1_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_SHA1), @@ -767,7 +767,7 @@ static void __init cap_set_hwcap(const struct arm64_cpu_capabilities *cap) case CAP_HWCAP: elf_hwcap |= cap->hwcap; break; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 case CAP_COMPAT_HWCAP: compat_elf_hwcap |= (u32)cap->hwcap; break; @@ -790,7 +790,7 @@ static bool __maybe_unused cpus_have_hwcap(const struct arm64_cpu_capabilities * case CAP_HWCAP: rc = (elf_hwcap & cap->hwcap) != 0; break; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 case CAP_COMPAT_HWCAP: rc = (compat_elf_hwcap & (u32)cap->hwcap) != 0; break; diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c index 84c8684..32fb4f3 100644 --- a/arch/arm64/kernel/cpuinfo.c +++ b/arch/arm64/kernel/cpuinfo.c @@ -127,7 +127,7 @@ static int c_show(struct seq_file *m, void *v) */ seq_puts(m, "Features\t:"); if (personality(current->personality) == PER_LINUX32) { -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 for (j = 0; compat_hwcap_str[j]; j++) if (compat_elf_hwcap & (1 << j)) seq_printf(m, " %s", compat_hwcap_str[j]); @@ -135,7 +135,7 @@ static int c_show(struct seq_file *m, void *v) 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 */ +#endif /* CONFIG_AARCH32_EL0 */ } else { for (j = 0; hwcap_str[j]; j++) if (elf_hwcap & (1 << j)) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index ec8bb48..21a0624 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -260,7 +260,7 @@ ENTRY(vectors) ventry el0_fiq_invalid // FIQ 64-bit EL0 ventry el0_error_invalid // Error 64-bit EL0 -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 ventry el0_sync_compat // Synchronous 32-bit EL0 ventry el0_irq_compat // IRQ 32-bit EL0 ventry el0_fiq_invalid_compat // FIQ 32-bit EL0 @@ -300,7 +300,7 @@ el0_error_invalid: inv_entry 0, BAD_ERROR ENDPROC(el0_error_invalid) -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 el0_fiq_invalid_compat: inv_entry 0, BAD_FIQ, 32 ENDPROC(el0_fiq_invalid_compat) @@ -463,7 +463,7 @@ el0_sync: b.ge el0_dbg b el0_inv -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 .align 6 el0_sync_compat: kernel_entry 0, 32 diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index 85da0f5..35e70d8 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S @@ -608,7 +608,7 @@ CPU_LE( movk x0, #0x30d0, lsl #16 ) // Clear EE and E0E on LE systems msr cptr_el2, x0 // Disable copro. traps to EL2 1: -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 msr hstr_el2, xzr // Disable CP15 traps to EL2 #endif diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 3f6cd5c..aa79e81 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -82,7 +82,7 @@ static void ptrace_hbptriggered(struct perf_event *bp, .si_addr = (void __user *)(bkpt->trigger), }; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 int i; if (!is_compat_task()) @@ -657,7 +657,7 @@ static const struct user_regset_view user_aarch64_view = { .regsets = aarch64_regsets, .n = ARRAY_SIZE(aarch64_regsets) }; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 #include <linux/compat.h> enum compat_regset { @@ -1192,11 +1192,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, return ret; } -#endif /* CONFIG_COMPAT */ +#endif /* CONFIG_AARCH32_EL0 */ const struct user_regset_view *task_user_regset_view(struct task_struct *task) { -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 /* * Core dumping of 32-bit tasks or compat ptrace requests must use the * user_aarch32_view compatible with arm32. Native ptrace requests on diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index e16ae22..85461e8 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -409,7 +409,7 @@ long compat_arm_syscall(struct pt_regs *regs); asmlinkage long do_ni_syscall(struct pt_regs *regs) { -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 long ret; if (is_compat_task()) { ret = compat_arm_syscall(regs); diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 97bc68f..26352a6 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -49,7 +49,7 @@ static union { } vdso_data_store __page_aligned_data; struct vdso_data *vdso_data = &vdso_data_store.data; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 /* * Create and map the vectors page for AArch32 tasks. */ @@ -107,7 +107,7 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) return PTR_ERR_OR_ZERO(ret); } -#endif /* CONFIG_COMPAT */ +#endif /* CONFIG_AARCH32_EL0 */ static struct vm_special_mapping vdso_spec[2]; diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index 5152b38..d5e699d 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -321,7 +321,7 @@ static void arch_timer_evtstrm_enable(int divider) | ARCH_TIMER_VIRT_EVT_EN; arch_timer_set_cntkctl(cntkctl); elf_hwcap |= HWCAP_EVTSTRM; -#ifdef CONFIG_COMPAT +#ifdef CONFIG_AARCH32_EL0 compat_elf_hwcap |= COMPAT_HWCAP_EVTSTRM; #endif } -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 11/23] arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski From: Andrew Pinski <apinski@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 <apinski@cavium.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@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 <asm-generic/bitsperlong.h> -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 11/23] arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel From: Andrew Pinski <apinski@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 <apinski@cavium.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@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 <asm-generic/bitsperlong.h> -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 11/23] arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski From: Andrew Pinski <apinski@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 <apinski@cavium.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@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 <asm-generic/bitsperlong.h> -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 12/23] thread: move thread bits accessors to separated file 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich 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 by Al Viro in patch [edd63a27] "set_restore_sigmask() is never called without SIGPENDING (and never should be)" Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- include/linux/thread_bits.h | 55 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/thread_info.h | 44 +----------------------------------- 2 files changed, 56 insertions(+), 43 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 0000000..0d05d16 --- /dev/null +++ b/include/linux/thread_bits.h @@ -0,0 +1,55 @@ + +/* thread_bits.h: common low-level thread bits accessors */ + +#ifndef _LINUX_THREAD_BITS_H +#define _LINUX_THREAD_BITS_H + +#ifndef __ASSEMBLY__ + +#include <linux/bitops.h> +#include <asm/thread_info.h> + +/* + * flag set/clear/test wrappers + * - pass TIF_xxxx constants to these functions + */ + +static inline void set_ti_thread_flag(struct thread_info *ti, int flag) +{ + set_bit(flag, (unsigned long *)&ti->flags); +} + +static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) +{ + clear_bit(flag, (unsigned long *)&ti->flags); +} + +static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_and_set_bit(flag, (unsigned long *)&ti->flags); +} + +static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_and_clear_bit(flag, (unsigned long *)&ti->flags); +} + +static inline int test_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_bit(flag, (unsigned long *)&ti->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 b4c2a48..b094aed 100644 --- a/include/linux/thread_info.h +++ b/include/linux/thread_info.h @@ -50,8 +50,7 @@ struct restart_block { extern long do_no_restart_syscall(struct restart_block *parm); -#include <linux/bitops.h> -#include <asm/thread_info.h> +#include <linux/thread_bits.h> #ifdef __KERNEL__ @@ -62,47 +61,6 @@ extern long do_no_restart_syscall(struct restart_block *parm); # define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK) #endif -/* - * flag set/clear/test wrappers - * - pass TIF_xxxx constants to these functions - */ - -static inline void set_ti_thread_flag(struct thread_info *ti, int flag) -{ - set_bit(flag, (unsigned long *)&ti->flags); -} - -static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) -{ - clear_bit(flag, (unsigned long *)&ti->flags); -} - -static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_and_set_bit(flag, (unsigned long *)&ti->flags); -} - -static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_and_clear_bit(flag, (unsigned long *)&ti->flags); -} - -static inline int test_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_bit(flag, (unsigned long *)&ti->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) - #define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 12/23] thread: move thread bits accessors to separated file @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel 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 by Al Viro in patch [edd63a27] "set_restore_sigmask() is never called without SIGPENDING (and never should be)" Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- include/linux/thread_bits.h | 55 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/thread_info.h | 44 +----------------------------------- 2 files changed, 56 insertions(+), 43 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 0000000..0d05d16 --- /dev/null +++ b/include/linux/thread_bits.h @@ -0,0 +1,55 @@ + +/* thread_bits.h: common low-level thread bits accessors */ + +#ifndef _LINUX_THREAD_BITS_H +#define _LINUX_THREAD_BITS_H + +#ifndef __ASSEMBLY__ + +#include <linux/bitops.h> +#include <asm/thread_info.h> + +/* + * flag set/clear/test wrappers + * - pass TIF_xxxx constants to these functions + */ + +static inline void set_ti_thread_flag(struct thread_info *ti, int flag) +{ + set_bit(flag, (unsigned long *)&ti->flags); +} + +static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) +{ + clear_bit(flag, (unsigned long *)&ti->flags); +} + +static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_and_set_bit(flag, (unsigned long *)&ti->flags); +} + +static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_and_clear_bit(flag, (unsigned long *)&ti->flags); +} + +static inline int test_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_bit(flag, (unsigned long *)&ti->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 b4c2a48..b094aed 100644 --- a/include/linux/thread_info.h +++ b/include/linux/thread_info.h @@ -50,8 +50,7 @@ struct restart_block { extern long do_no_restart_syscall(struct restart_block *parm); -#include <linux/bitops.h> -#include <asm/thread_info.h> +#include <linux/thread_bits.h> #ifdef __KERNEL__ @@ -62,47 +61,6 @@ extern long do_no_restart_syscall(struct restart_block *parm); # define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK) #endif -/* - * flag set/clear/test wrappers - * - pass TIF_xxxx constants to these functions - */ - -static inline void set_ti_thread_flag(struct thread_info *ti, int flag) -{ - set_bit(flag, (unsigned long *)&ti->flags); -} - -static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) -{ - clear_bit(flag, (unsigned long *)&ti->flags); -} - -static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_and_set_bit(flag, (unsigned long *)&ti->flags); -} - -static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_and_clear_bit(flag, (unsigned long *)&ti->flags); -} - -static inline int test_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_bit(flag, (unsigned long *)&ti->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) - #define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 12/23] thread: move thread bits accessors to separated file @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich 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 by Al Viro in patch [edd63a27] "set_restore_sigmask() is never called without SIGPENDING (and never should be)" Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- include/linux/thread_bits.h | 55 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/thread_info.h | 44 +----------------------------------- 2 files changed, 56 insertions(+), 43 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 0000000..0d05d16 --- /dev/null +++ b/include/linux/thread_bits.h @@ -0,0 +1,55 @@ + +/* thread_bits.h: common low-level thread bits accessors */ + +#ifndef _LINUX_THREAD_BITS_H +#define _LINUX_THREAD_BITS_H + +#ifndef __ASSEMBLY__ + +#include <linux/bitops.h> +#include <asm/thread_info.h> + +/* + * flag set/clear/test wrappers + * - pass TIF_xxxx constants to these functions + */ + +static inline void set_ti_thread_flag(struct thread_info *ti, int flag) +{ + set_bit(flag, (unsigned long *)&ti->flags); +} + +static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) +{ + clear_bit(flag, (unsigned long *)&ti->flags); +} + +static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_and_set_bit(flag, (unsigned long *)&ti->flags); +} + +static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_and_clear_bit(flag, (unsigned long *)&ti->flags); +} + +static inline int test_ti_thread_flag(struct thread_info *ti, int flag) +{ + return test_bit(flag, (unsigned long *)&ti->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 b4c2a48..b094aed 100644 --- a/include/linux/thread_info.h +++ b/include/linux/thread_info.h @@ -50,8 +50,7 @@ struct restart_block { extern long do_no_restart_syscall(struct restart_block *parm); -#include <linux/bitops.h> -#include <asm/thread_info.h> +#include <linux/thread_bits.h> #ifdef __KERNEL__ @@ -62,47 +61,6 @@ extern long do_no_restart_syscall(struct restart_block *parm); # define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK) #endif -/* - * flag set/clear/test wrappers - * - pass TIF_xxxx constants to these functions - */ - -static inline void set_ti_thread_flag(struct thread_info *ti, int flag) -{ - set_bit(flag, (unsigned long *)&ti->flags); -} - -static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) -{ - clear_bit(flag, (unsigned long *)&ti->flags); -} - -static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_and_set_bit(flag, (unsigned long *)&ti->flags); -} - -static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_and_clear_bit(flag, (unsigned long *)&ti->flags); -} - -static inline int test_ti_thread_flag(struct thread_info *ti, int flag) -{ - return test_bit(flag, (unsigned long *)&ti->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) - #define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) 2016-05-24 0:04 ` Yury Norov (?) (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski 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 <asm/is_compat.h> to avoid mess in headers. Some files include both <linux/compat.h> and <asm/compat.h>, and this is wrong because <linux/compat.h> has <asm/compat.h> already included. It was fixed too. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.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 | 58 ++++++++++++++++++++++++++++++++++++ arch/arm64/include/asm/memory.h | 3 +- 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 | 10 +++---- 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, 91 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 eb8432b..df2f72d 100644 --- a/arch/arm64/include/asm/compat.h +++ b/arch/arm64/include/asm/compat.h @@ -24,6 +24,8 @@ #include <linux/types.h> #include <linux/sched.h> +#include <asm/is_compat.h> + #define COMPAT_USER_HZ 100 #ifdef __AARCH64EB__ #define COMPAT_UTS_MACHINE "armv8b\0\0" @@ -298,23 +300,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 24ed037..b5437c5 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 <linux/compat.h> +#endif + #include <asm/hwcap.h> /* @@ -152,13 +156,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) : \ 0x3ffff >> (PAGE_SHIFT - 12)) -#else -#define STACK_RND_MASK (0x3ffff >> (PAGE_SHIFT - 12)) -#endif #ifdef CONFIG_COMPAT diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h index caa955f..0feb28a 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 0000000..6139b5a --- /dev/null +++ b/arch/arm64/include/asm/is_compat.h @@ -0,0 +1,58 @@ +/* + * 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 <linux/thread_bits.h> + +#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 */ + +#endif /* !__ASSEMBLY__ */ +#endif /* __ASM_IS_COMPAT_H */ diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h index 12f8a00..a66a0f7 100644 --- a/arch/arm64/include/asm/memory.h +++ b/arch/arm64/include/asm/memory.h @@ -26,6 +26,7 @@ #include <linux/types.h> #include <asm/bug.h> #include <asm/sizes.h> +#include <asm/is_compat.h> /* * Allow for constants defined here to be used from assembly code @@ -61,7 +62,7 @@ #ifdef CONFIG_COMPAT #define TASK_SIZE_32 UL(0x100000000) -#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ +#define TASK_SIZE (is_compat_task() ? \ TASK_SIZE_32 : TASK_SIZE_64) #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ TASK_SIZE_32 : TASK_SIZE_64) diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 5bbdbb4..1eccf47 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -30,6 +30,7 @@ #include <linux/string.h> #include <asm/alternative.h> +#include <asm/is_compat.h> #include <asm/fpsimd.h> #include <asm/hw_breakpoint.h> #include <asm/lse.h> @@ -41,7 +42,7 @@ #define STACK_TOP_MAX TASK_SIZE_64 #ifdef CONFIG_COMPAT #define AARCH32_VECTORS_BASE 0xffff0000 -#define STACK_TOP (test_thread_flag(TIF_32BIT) ? \ +#define STACK_TOP (is_compat_task() ? \ AARCH32_VECTORS_BASE : STACK_TOP_MAX) #else #define STACK_TOP STACK_TOP_MAX @@ -94,7 +95,7 @@ struct thread_struct { #define task_user_tls(t) \ ({ \ unsigned long *__tls; \ - if (is_compat_thread(task_thread_info(t))) \ + if (is_a32_compat_thread(task_thread_info(t))) \ __tls = &(t)->thread.tp2_value; \ else \ __tls = &(t)->thread.tp_value; \ diff --git a/arch/arm64/include/asm/syscall.h b/arch/arm64/include/asm/syscall.h index 709a574..ce09641 100644 --- a/arch/arm64/include/asm/syscall.h +++ b/arch/arm64/include/asm/syscall.h @@ -113,7 +113,7 @@ static inline void syscall_set_arguments(struct task_struct *task, */ static inline int syscall_get_arch(void) { - if (is_compat_task()) + if (is_a32_compat_task()) return AUDIT_ARCH_ARM; return AUDIT_ARCH_AARCH64; diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index abd64bd..4daa559 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h @@ -118,7 +118,7 @@ static inline struct thread_info *current_thread_info(void) #define TIF_FREEZE 19 #define TIF_RESTORE_SIGMASK 20 #define TIF_SINGLESTEP 21 -#define TIF_32BIT 22 /* 32bit process */ +#define TIF_32BIT 22 /* AARCH32 process */ #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c index b45c95d..baa1eba 100644 --- a/arch/arm64/kernel/hw_breakpoint.c +++ b/arch/arm64/kernel/hw_breakpoint.c @@ -164,7 +164,7 @@ enum hw_breakpoint_ops { HW_BREAKPOINT_RESTORE }; -static int is_compat_bp(struct perf_event *bp) +static int is_a32_compat_bp(struct perf_event *bp) { struct task_struct *tsk = bp->hw.target; @@ -175,7 +175,7 @@ static int is_compat_bp(struct perf_event *bp) * deprecated behaviour if we use unaligned watchpoints in * AArch64 state. */ - return tsk && is_compat_thread(task_thread_info(tsk)); + return tsk && is_a32_compat_thread(task_thread_info(tsk)); } /** @@ -435,7 +435,7 @@ static int arch_build_bp_info(struct perf_event *bp) * Watchpoints can be of length 1, 2, 4 or 8 bytes. */ if (info->ctrl.type == ARM_BREAKPOINT_EXECUTE) { - if (is_compat_bp(bp)) { + if (is_a32_compat_bp(bp)) { if (info->ctrl.len != ARM_BREAKPOINT_LEN_2 && info->ctrl.len != ARM_BREAKPOINT_LEN_4) return -EINVAL; @@ -492,7 +492,7 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) * AArch32 tasks expect some simple alignment fixups, so emulate * that here. */ - if (is_compat_bp(bp)) { + if (is_a32_compat_bp(bp)) { if (info->ctrl.len == ARM_BREAKPOINT_LEN_8) alignment_mask = 0x7; else @@ -679,7 +679,7 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr, info = counter_arch_bp(wp); /* AArch32 watchpoints are either 4 or 8 bytes aligned. */ - if (is_compat_task()) { + if (is_a32_compat_task()) { if (info->ctrl.len == ARM_BREAKPOINT_LEN_8) alignment_mask = 0x7; else diff --git a/arch/arm64/kernel/perf_regs.c b/arch/arm64/kernel/perf_regs.c index 3f62b35..a79058f 100644 --- a/arch/arm64/kernel/perf_regs.c +++ b/arch/arm64/kernel/perf_regs.c @@ -45,7 +45,7 @@ int perf_reg_validate(u64 mask) u64 perf_reg_abi(struct task_struct *task) { - if (is_compat_thread(task_thread_info(task))) + if (is_a32_compat_thread(task_thread_info(task))) return PERF_SAMPLE_REGS_ABI_32; else return PERF_SAMPLE_REGS_ABI_64; diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 8062482..746f2d3 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -47,7 +47,6 @@ #include <trace/events/power.h> #include <asm/alternative.h> -#include <asm/compat.h> #include <asm/cacheflush.h> #include <asm/fpsimd.h> #include <asm/mmu_context.h> @@ -211,7 +210,7 @@ static void tls_thread_flush(void) { asm ("msr tpidr_el0, xzr"); - if (is_compat_task()) { + if (is_a32_compat_task()) { current->thread.tp_value = 0; /* @@ -263,7 +262,7 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start, asm("mrs %0, tpidr_el0" : "=r" (*task_user_tls(p))); if (stack_start) { - if (is_compat_thread(task_thread_info(p))) + if (is_a32_compat_thread(task_thread_info(p))) childregs->compat_sp = stack_start; /* 16-byte aligned stack mandatory on AArch64 */ else if (stack_start & 15) @@ -303,7 +302,7 @@ static void tls_thread_switch(struct task_struct *next) *task_user_tls(current) = tpidr; tpidr = *task_user_tls(next); - tpidrro = is_compat_thread(task_thread_info(next)) ? + tpidrro = is_a32_compat_thread(task_thread_info(next)) ? next->thread.tp_value : 0; asm( diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index aa79e81..38a09338 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -38,7 +38,6 @@ #include <linux/tracehook.h> #include <linux/elf.h> -#include <asm/compat.h> #include <asm/debug-monitors.h> #include <asm/pgtable.h> #include <asm/syscall.h> @@ -85,7 +84,7 @@ static void ptrace_hbptriggered(struct perf_event *bp, #ifdef CONFIG_AARCH32_EL0 int i; - if (!is_compat_task()) + if (!is_a32_compat_task()) goto send_sig; for (i = 0; i < ARM_MAX_BRP; ++i) { @@ -1203,9 +1202,9 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task) * 32-bit children use an extended user_aarch32_ptrace_view to allow * access to the TLS register. */ - if (is_compat_task()) + if (is_a32_compat_task()) return &user_aarch32_view; - else if (is_compat_thread(task_thread_info(task))) + else if (is_a32_compat_thread(task_thread_info(task))) return &user_aarch32_ptrace_view; #endif return &user_aarch64_view; @@ -1232,7 +1231,7 @@ static void tracehook_report_syscall(struct pt_regs *regs, * A scratch register (ip(r12) on AArch32, x7 on AArch64) is * used to denote syscall entry/exit: */ - regno = (is_compat_task() ? 12 : 7); + regno = (is_a32_compat_task() ? 12 : 7); saved_reg = regs->regs[regno]; regs->regs[regno] = dir; @@ -1343,7 +1342,7 @@ int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task) if (!test_tsk_thread_flag(task, TIF_SINGLESTEP)) regs->pstate &= ~DBG_SPSR_SS; - if (is_compat_thread(task_thread_info(task))) + if (is_a32_compat_thread(task_thread_info(task))) return valid_compat_regs(regs); else return valid_native_regs(regs); diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index a8eafdb..be02f65 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -276,7 +276,7 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, static void setup_restart_syscall(struct pt_regs *regs) { - if (is_compat_task()) + if (is_a32_compat_task()) compat_setup_restart_syscall(regs); else regs->regs[8] = __NR_restart_syscall; @@ -295,7 +295,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) /* * Set up the stack frame */ - if (is_compat_task()) { + if (is_a32_compat_task()) { if (ksig->ka.sa.sa_flags & SA_SIGINFO) ret = compat_setup_rt_frame(usig, ksig, oldset, regs); else diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index 85461e8..515444a 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -18,6 +18,7 @@ */ #include <linux/bug.h> +#include <linux/compat.h> #include <linux/signal.h> #include <linux/personality.h> #include <linux/kallsyms.h> @@ -411,7 +412,7 @@ asmlinkage long do_ni_syscall(struct pt_regs *regs) { #ifdef CONFIG_AARCH32_EL0 long ret; - if (is_compat_task()) { + if (is_a32_compat_task()) { ret = compat_arm_syscall(regs); if (ret != -ENOSYS) return ret; -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel 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 <asm/is_compat.h> to avoid mess in headers. Some files include both <linux/compat.h> and <asm/compat.h>, and this is wrong because <linux/compat.h> has <asm/compat.h> already included. It was fixed too. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.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 | 58 ++++++++++++++++++++++++++++++++++++ arch/arm64/include/asm/memory.h | 3 +- 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 | 10 +++---- 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, 91 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 eb8432b..df2f72d 100644 --- a/arch/arm64/include/asm/compat.h +++ b/arch/arm64/include/asm/compat.h @@ -24,6 +24,8 @@ #include <linux/types.h> #include <linux/sched.h> +#include <asm/is_compat.h> + #define COMPAT_USER_HZ 100 #ifdef __AARCH64EB__ #define COMPAT_UTS_MACHINE "armv8b\0\0" @@ -298,23 +300,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 24ed037..b5437c5 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 <linux/compat.h> +#endif + #include <asm/hwcap.h> /* @@ -152,13 +156,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) : \ 0x3ffff >> (PAGE_SHIFT - 12)) -#else -#define STACK_RND_MASK (0x3ffff >> (PAGE_SHIFT - 12)) -#endif #ifdef CONFIG_COMPAT diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h index caa955f..0feb28a 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 0000000..6139b5a --- /dev/null +++ b/arch/arm64/include/asm/is_compat.h @@ -0,0 +1,58 @@ +/* + * 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 <linux/thread_bits.h> + +#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 */ + +#endif /* !__ASSEMBLY__ */ +#endif /* __ASM_IS_COMPAT_H */ diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h index 12f8a00..a66a0f7 100644 --- a/arch/arm64/include/asm/memory.h +++ b/arch/arm64/include/asm/memory.h @@ -26,6 +26,7 @@ #include <linux/types.h> #include <asm/bug.h> #include <asm/sizes.h> +#include <asm/is_compat.h> /* * Allow for constants defined here to be used from assembly code @@ -61,7 +62,7 @@ #ifdef CONFIG_COMPAT #define TASK_SIZE_32 UL(0x100000000) -#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ +#define TASK_SIZE (is_compat_task() ? \ TASK_SIZE_32 : TASK_SIZE_64) #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ TASK_SIZE_32 : TASK_SIZE_64) diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 5bbdbb4..1eccf47 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -30,6 +30,7 @@ #include <linux/string.h> #include <asm/alternative.h> +#include <asm/is_compat.h> #include <asm/fpsimd.h> #include <asm/hw_breakpoint.h> #include <asm/lse.h> @@ -41,7 +42,7 @@ #define STACK_TOP_MAX TASK_SIZE_64 #ifdef CONFIG_COMPAT #define AARCH32_VECTORS_BASE 0xffff0000 -#define STACK_TOP (test_thread_flag(TIF_32BIT) ? \ +#define STACK_TOP (is_compat_task() ? \ AARCH32_VECTORS_BASE : STACK_TOP_MAX) #else #define STACK_TOP STACK_TOP_MAX @@ -94,7 +95,7 @@ struct thread_struct { #define task_user_tls(t) \ ({ \ unsigned long *__tls; \ - if (is_compat_thread(task_thread_info(t))) \ + if (is_a32_compat_thread(task_thread_info(t))) \ __tls = &(t)->thread.tp2_value; \ else \ __tls = &(t)->thread.tp_value; \ diff --git a/arch/arm64/include/asm/syscall.h b/arch/arm64/include/asm/syscall.h index 709a574..ce09641 100644 --- a/arch/arm64/include/asm/syscall.h +++ b/arch/arm64/include/asm/syscall.h @@ -113,7 +113,7 @@ static inline void syscall_set_arguments(struct task_struct *task, */ static inline int syscall_get_arch(void) { - if (is_compat_task()) + if (is_a32_compat_task()) return AUDIT_ARCH_ARM; return AUDIT_ARCH_AARCH64; diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index abd64bd..4daa559 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h @@ -118,7 +118,7 @@ static inline struct thread_info *current_thread_info(void) #define TIF_FREEZE 19 #define TIF_RESTORE_SIGMASK 20 #define TIF_SINGLESTEP 21 -#define TIF_32BIT 22 /* 32bit process */ +#define TIF_32BIT 22 /* AARCH32 process */ #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c index b45c95d..baa1eba 100644 --- a/arch/arm64/kernel/hw_breakpoint.c +++ b/arch/arm64/kernel/hw_breakpoint.c @@ -164,7 +164,7 @@ enum hw_breakpoint_ops { HW_BREAKPOINT_RESTORE }; -static int is_compat_bp(struct perf_event *bp) +static int is_a32_compat_bp(struct perf_event *bp) { struct task_struct *tsk = bp->hw.target; @@ -175,7 +175,7 @@ static int is_compat_bp(struct perf_event *bp) * deprecated behaviour if we use unaligned watchpoints in * AArch64 state. */ - return tsk && is_compat_thread(task_thread_info(tsk)); + return tsk && is_a32_compat_thread(task_thread_info(tsk)); } /** @@ -435,7 +435,7 @@ static int arch_build_bp_info(struct perf_event *bp) * Watchpoints can be of length 1, 2, 4 or 8 bytes. */ if (info->ctrl.type == ARM_BREAKPOINT_EXECUTE) { - if (is_compat_bp(bp)) { + if (is_a32_compat_bp(bp)) { if (info->ctrl.len != ARM_BREAKPOINT_LEN_2 && info->ctrl.len != ARM_BREAKPOINT_LEN_4) return -EINVAL; @@ -492,7 +492,7 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) * AArch32 tasks expect some simple alignment fixups, so emulate * that here. */ - if (is_compat_bp(bp)) { + if (is_a32_compat_bp(bp)) { if (info->ctrl.len == ARM_BREAKPOINT_LEN_8) alignment_mask = 0x7; else @@ -679,7 +679,7 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr, info = counter_arch_bp(wp); /* AArch32 watchpoints are either 4 or 8 bytes aligned. */ - if (is_compat_task()) { + if (is_a32_compat_task()) { if (info->ctrl.len == ARM_BREAKPOINT_LEN_8) alignment_mask = 0x7; else diff --git a/arch/arm64/kernel/perf_regs.c b/arch/arm64/kernel/perf_regs.c index 3f62b35..a79058f 100644 --- a/arch/arm64/kernel/perf_regs.c +++ b/arch/arm64/kernel/perf_regs.c @@ -45,7 +45,7 @@ int perf_reg_validate(u64 mask) u64 perf_reg_abi(struct task_struct *task) { - if (is_compat_thread(task_thread_info(task))) + if (is_a32_compat_thread(task_thread_info(task))) return PERF_SAMPLE_REGS_ABI_32; else return PERF_SAMPLE_REGS_ABI_64; diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 8062482..746f2d3 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -47,7 +47,6 @@ #include <trace/events/power.h> #include <asm/alternative.h> -#include <asm/compat.h> #include <asm/cacheflush.h> #include <asm/fpsimd.h> #include <asm/mmu_context.h> @@ -211,7 +210,7 @@ static void tls_thread_flush(void) { asm ("msr tpidr_el0, xzr"); - if (is_compat_task()) { + if (is_a32_compat_task()) { current->thread.tp_value = 0; /* @@ -263,7 +262,7 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start, asm("mrs %0, tpidr_el0" : "=r" (*task_user_tls(p))); if (stack_start) { - if (is_compat_thread(task_thread_info(p))) + if (is_a32_compat_thread(task_thread_info(p))) childregs->compat_sp = stack_start; /* 16-byte aligned stack mandatory on AArch64 */ else if (stack_start & 15) @@ -303,7 +302,7 @@ static void tls_thread_switch(struct task_struct *next) *task_user_tls(current) = tpidr; tpidr = *task_user_tls(next); - tpidrro = is_compat_thread(task_thread_info(next)) ? + tpidrro = is_a32_compat_thread(task_thread_info(next)) ? next->thread.tp_value : 0; asm( diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index aa79e81..38a09338 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -38,7 +38,6 @@ #include <linux/tracehook.h> #include <linux/elf.h> -#include <asm/compat.h> #include <asm/debug-monitors.h> #include <asm/pgtable.h> #include <asm/syscall.h> @@ -85,7 +84,7 @@ static void ptrace_hbptriggered(struct perf_event *bp, #ifdef CONFIG_AARCH32_EL0 int i; - if (!is_compat_task()) + if (!is_a32_compat_task()) goto send_sig; for (i = 0; i < ARM_MAX_BRP; ++i) { @@ -1203,9 +1202,9 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task) * 32-bit children use an extended user_aarch32_ptrace_view to allow * access to the TLS register. */ - if (is_compat_task()) + if (is_a32_compat_task()) return &user_aarch32_view; - else if (is_compat_thread(task_thread_info(task))) + else if (is_a32_compat_thread(task_thread_info(task))) return &user_aarch32_ptrace_view; #endif return &user_aarch64_view; @@ -1232,7 +1231,7 @@ static void tracehook_report_syscall(struct pt_regs *regs, * A scratch register (ip(r12) on AArch32, x7 on AArch64) is * used to denote syscall entry/exit: */ - regno = (is_compat_task() ? 12 : 7); + regno = (is_a32_compat_task() ? 12 : 7); saved_reg = regs->regs[regno]; regs->regs[regno] = dir; @@ -1343,7 +1342,7 @@ int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task) if (!test_tsk_thread_flag(task, TIF_SINGLESTEP)) regs->pstate &= ~DBG_SPSR_SS; - if (is_compat_thread(task_thread_info(task))) + if (is_a32_compat_thread(task_thread_info(task))) return valid_compat_regs(regs); else return valid_native_regs(regs); diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index a8eafdb..be02f65 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -276,7 +276,7 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, static void setup_restart_syscall(struct pt_regs *regs) { - if (is_compat_task()) + if (is_a32_compat_task()) compat_setup_restart_syscall(regs); else regs->regs[8] = __NR_restart_syscall; @@ -295,7 +295,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) /* * Set up the stack frame */ - if (is_compat_task()) { + if (is_a32_compat_task()) { if (ksig->ka.sa.sa_flags & SA_SIGINFO) ret = compat_setup_rt_frame(usig, ksig, oldset, regs); else diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index 85461e8..515444a 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -18,6 +18,7 @@ */ #include <linux/bug.h> +#include <linux/compat.h> #include <linux/signal.h> #include <linux/personality.h> #include <linux/kallsyms.h> @@ -411,7 +412,7 @@ asmlinkage long do_ni_syscall(struct pt_regs *regs) { #ifdef CONFIG_AARCH32_EL0 long ret; - if (is_compat_task()) { + if (is_a32_compat_task()) { ret = compat_arm_syscall(regs); if (ret != -ENOSYS) return ret; -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski 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 <asm/is_compat.h> to avoid mess in headers. Some files include both <linux/compat.h> and <asm/compat.h>, and this is wrong because <linux/compat.h> has <asm/compat.h> already included. It was fixed too. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.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 | 58 ++++++++++++++++++++++++++++++++++++ arch/arm64/include/asm/memory.h | 3 +- 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 | 10 +++---- 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, 91 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 eb8432b..df2f72d 100644 --- a/arch/arm64/include/asm/compat.h +++ b/arch/arm64/include/asm/compat.h @@ -24,6 +24,8 @@ #include <linux/types.h> #include <linux/sched.h> +#include <asm/is_compat.h> + #define COMPAT_USER_HZ 100 #ifdef __AARCH64EB__ #define COMPAT_UTS_MACHINE "armv8b\0\0" @@ -298,23 +300,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 24ed037..b5437c5 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 <linux/compat.h> +#endif + #include <asm/hwcap.h> /* @@ -152,13 +156,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) : \ 0x3ffff >> (PAGE_SHIFT - 12)) -#else -#define STACK_RND_MASK (0x3ffff >> (PAGE_SHIFT - 12)) -#endif #ifdef CONFIG_COMPAT diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h index caa955f..0feb28a 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 0000000..6139b5a --- /dev/null +++ b/arch/arm64/include/asm/is_compat.h @@ -0,0 +1,58 @@ +/* + * 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 <linux/thread_bits.h> + +#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 */ + +#endif /* !__ASSEMBLY__ */ +#endif /* __ASM_IS_COMPAT_H */ diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h index 12f8a00..a66a0f7 100644 --- a/arch/arm64/include/asm/memory.h +++ b/arch/arm64/include/asm/memory.h @@ -26,6 +26,7 @@ #include <linux/types.h> #include <asm/bug.h> #include <asm/sizes.h> +#include <asm/is_compat.h> /* * Allow for constants defined here to be used from assembly code @@ -61,7 +62,7 @@ #ifdef CONFIG_COMPAT #define TASK_SIZE_32 UL(0x100000000) -#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ +#define TASK_SIZE (is_compat_task() ? \ TASK_SIZE_32 : TASK_SIZE_64) #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ TASK_SIZE_32 : TASK_SIZE_64) diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 5bbdbb4..1eccf47 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -30,6 +30,7 @@ #include <linux/string.h> #include <asm/alternative.h> +#include <asm/is_compat.h> #include <asm/fpsimd.h> #include <asm/hw_breakpoint.h> #include <asm/lse.h> @@ -41,7 +42,7 @@ #define STACK_TOP_MAX TASK_SIZE_64 #ifdef CONFIG_COMPAT #define AARCH32_VECTORS_BASE 0xffff0000 -#define STACK_TOP (test_thread_flag(TIF_32BIT) ? \ +#define STACK_TOP (is_compat_task() ? \ AARCH32_VECTORS_BASE : STACK_TOP_MAX) #else #define STACK_TOP STACK_TOP_MAX @@ -94,7 +95,7 @@ struct thread_struct { #define task_user_tls(t) \ ({ \ unsigned long *__tls; \ - if (is_compat_thread(task_thread_info(t))) \ + if (is_a32_compat_thread(task_thread_info(t))) \ __tls = &(t)->thread.tp2_value; \ else \ __tls = &(t)->thread.tp_value; \ diff --git a/arch/arm64/include/asm/syscall.h b/arch/arm64/include/asm/syscall.h index 709a574..ce09641 100644 --- a/arch/arm64/include/asm/syscall.h +++ b/arch/arm64/include/asm/syscall.h @@ -113,7 +113,7 @@ static inline void syscall_set_arguments(struct task_struct *task, */ static inline int syscall_get_arch(void) { - if (is_compat_task()) + if (is_a32_compat_task()) return AUDIT_ARCH_ARM; return AUDIT_ARCH_AARCH64; diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index abd64bd..4daa559 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h @@ -118,7 +118,7 @@ static inline struct thread_info *current_thread_info(void) #define TIF_FREEZE 19 #define TIF_RESTORE_SIGMASK 20 #define TIF_SINGLESTEP 21 -#define TIF_32BIT 22 /* 32bit process */ +#define TIF_32BIT 22 /* AARCH32 process */ #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c index b45c95d..baa1eba 100644 --- a/arch/arm64/kernel/hw_breakpoint.c +++ b/arch/arm64/kernel/hw_breakpoint.c @@ -164,7 +164,7 @@ enum hw_breakpoint_ops { HW_BREAKPOINT_RESTORE }; -static int is_compat_bp(struct perf_event *bp) +static int is_a32_compat_bp(struct perf_event *bp) { struct task_struct *tsk = bp->hw.target; @@ -175,7 +175,7 @@ static int is_compat_bp(struct perf_event *bp) * deprecated behaviour if we use unaligned watchpoints in * AArch64 state. */ - return tsk && is_compat_thread(task_thread_info(tsk)); + return tsk && is_a32_compat_thread(task_thread_info(tsk)); } /** @@ -435,7 +435,7 @@ static int arch_build_bp_info(struct perf_event *bp) * Watchpoints can be of length 1, 2, 4 or 8 bytes. */ if (info->ctrl.type == ARM_BREAKPOINT_EXECUTE) { - if (is_compat_bp(bp)) { + if (is_a32_compat_bp(bp)) { if (info->ctrl.len != ARM_BREAKPOINT_LEN_2 && info->ctrl.len != ARM_BREAKPOINT_LEN_4) return -EINVAL; @@ -492,7 +492,7 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) * AArch32 tasks expect some simple alignment fixups, so emulate * that here. */ - if (is_compat_bp(bp)) { + if (is_a32_compat_bp(bp)) { if (info->ctrl.len == ARM_BREAKPOINT_LEN_8) alignment_mask = 0x7; else @@ -679,7 +679,7 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr, info = counter_arch_bp(wp); /* AArch32 watchpoints are either 4 or 8 bytes aligned. */ - if (is_compat_task()) { + if (is_a32_compat_task()) { if (info->ctrl.len == ARM_BREAKPOINT_LEN_8) alignment_mask = 0x7; else diff --git a/arch/arm64/kernel/perf_regs.c b/arch/arm64/kernel/perf_regs.c index 3f62b35..a79058f 100644 --- a/arch/arm64/kernel/perf_regs.c +++ b/arch/arm64/kernel/perf_regs.c @@ -45,7 +45,7 @@ int perf_reg_validate(u64 mask) u64 perf_reg_abi(struct task_struct *task) { - if (is_compat_thread(task_thread_info(task))) + if (is_a32_compat_thread(task_thread_info(task))) return PERF_SAMPLE_REGS_ABI_32; else return PERF_SAMPLE_REGS_ABI_64; diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 8062482..746f2d3 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -47,7 +47,6 @@ #include <trace/events/power.h> #include <asm/alternative.h> -#include <asm/compat.h> #include <asm/cacheflush.h> #include <asm/fpsimd.h> #include <asm/mmu_context.h> @@ -211,7 +210,7 @@ static void tls_thread_flush(void) { asm ("msr tpidr_el0, xzr"); - if (is_compat_task()) { + if (is_a32_compat_task()) { current->thread.tp_value = 0; /* @@ -263,7 +262,7 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start, asm("mrs %0, tpidr_el0" : "=r" (*task_user_tls(p))); if (stack_start) { - if (is_compat_thread(task_thread_info(p))) + if (is_a32_compat_thread(task_thread_info(p))) childregs->compat_sp = stack_start; /* 16-byte aligned stack mandatory on AArch64 */ else if (stack_start & 15) @@ -303,7 +302,7 @@ static void tls_thread_switch(struct task_struct *next) *task_user_tls(current) = tpidr; tpidr = *task_user_tls(next); - tpidrro = is_compat_thread(task_thread_info(next)) ? + tpidrro = is_a32_compat_thread(task_thread_info(next)) ? next->thread.tp_value : 0; asm( diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index aa79e81..38a09338 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -38,7 +38,6 @@ #include <linux/tracehook.h> #include <linux/elf.h> -#include <asm/compat.h> #include <asm/debug-monitors.h> #include <asm/pgtable.h> #include <asm/syscall.h> @@ -85,7 +84,7 @@ static void ptrace_hbptriggered(struct perf_event *bp, #ifdef CONFIG_AARCH32_EL0 int i; - if (!is_compat_task()) + if (!is_a32_compat_task()) goto send_sig; for (i = 0; i < ARM_MAX_BRP; ++i) { @@ -1203,9 +1202,9 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task) * 32-bit children use an extended user_aarch32_ptrace_view to allow * access to the TLS register. */ - if (is_compat_task()) + if (is_a32_compat_task()) return &user_aarch32_view; - else if (is_compat_thread(task_thread_info(task))) + else if (is_a32_compat_thread(task_thread_info(task))) return &user_aarch32_ptrace_view; #endif return &user_aarch64_view; @@ -1232,7 +1231,7 @@ static void tracehook_report_syscall(struct pt_regs *regs, * A scratch register (ip(r12) on AArch32, x7 on AArch64) is * used to denote syscall entry/exit: */ - regno = (is_compat_task() ? 12 : 7); + regno = (is_a32_compat_task() ? 12 : 7); saved_reg = regs->regs[regno]; regs->regs[regno] = dir; @@ -1343,7 +1342,7 @@ int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task) if (!test_tsk_thread_flag(task, TIF_SINGLESTEP)) regs->pstate &= ~DBG_SPSR_SS; - if (is_compat_thread(task_thread_info(task))) + if (is_a32_compat_thread(task_thread_info(task))) return valid_compat_regs(regs); else return valid_native_regs(regs); diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index a8eafdb..be02f65 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -276,7 +276,7 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, static void setup_restart_syscall(struct pt_regs *regs) { - if (is_compat_task()) + if (is_a32_compat_task()) compat_setup_restart_syscall(regs); else regs->regs[8] = __NR_restart_syscall; @@ -295,7 +295,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) /* * Set up the stack frame */ - if (is_compat_task()) { + if (is_a32_compat_task()) { if (ksig->ka.sa.sa_flags & SA_SIGINFO) ret = compat_setup_rt_frame(usig, ksig, oldset, regs); else diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index 85461e8..515444a 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -18,6 +18,7 @@ */ #include <linux/bug.h> +#include <linux/compat.h> #include <linux/signal.h> #include <linux/personality.h> #include <linux/kallsyms.h> @@ -411,7 +412,7 @@ asmlinkage long do_ni_syscall(struct pt_regs *regs) { #ifdef CONFIG_AARCH32_EL0 long ret; - if (is_compat_task()) { + if (is_a32_compat_task()) { ret = compat_arm_syscall(regs); if (ret != -ENOSYS) return ret; -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, Andrew Pinski, broonie, ynorov, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner 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 <asm/is_compat.h> to avoid mess in headers. Some files include both <linux/compat.h> and <asm/compat.h>, and this is wrong because <linux/compat.h> has <asm/compat.h> already included. It was fixed too. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.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 | 58 ++++++++++++++++++++++++++++++++++++ arch/arm64/include/asm/memory.h | 3 +- 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 | 10 +++---- 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, 91 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 eb8432b..df2f72d 100644 --- a/arch/arm64/include/asm/compat.h +++ b/arch/arm64/include/asm/compat.h @@ -24,6 +24,8 @@ #include <linux/types.h> #include <linux/sched.h> +#include <asm/is_compat.h> + #define COMPAT_USER_HZ 100 #ifdef __AARCH64EB__ #define COMPAT_UTS_MACHINE "armv8b\0\0" @@ -298,23 +300,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 24ed037..b5437c5 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 <linux/compat.h> +#endif + #include <asm/hwcap.h> /* @@ -152,13 +156,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) : \ 0x3ffff >> (PAGE_SHIFT - 12)) -#else -#define STACK_RND_MASK (0x3ffff >> (PAGE_SHIFT - 12)) -#endif #ifdef CONFIG_COMPAT diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h index caa955f..0feb28a 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 0000000..6139b5a --- /dev/null +++ b/arch/arm64/include/asm/is_compat.h @@ -0,0 +1,58 @@ +/* + * 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 <linux/thread_bits.h> + +#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 */ + +#endif /* !__ASSEMBLY__ */ +#endif /* __ASM_IS_COMPAT_H */ diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h index 12f8a00..a66a0f7 100644 --- a/arch/arm64/include/asm/memory.h +++ b/arch/arm64/include/asm/memory.h @@ -26,6 +26,7 @@ #include <linux/types.h> #include <asm/bug.h> #include <asm/sizes.h> +#include <asm/is_compat.h> /* * Allow for constants defined here to be used from assembly code @@ -61,7 +62,7 @@ #ifdef CONFIG_COMPAT #define TASK_SIZE_32 UL(0x100000000) -#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ +#define TASK_SIZE (is_compat_task() ? \ TASK_SIZE_32 : TASK_SIZE_64) #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ TASK_SIZE_32 : TASK_SIZE_64) diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 5bbdbb4..1eccf47 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -30,6 +30,7 @@ #include <linux/string.h> #include <asm/alternative.h> +#include <asm/is_compat.h> #include <asm/fpsimd.h> #include <asm/hw_breakpoint.h> #include <asm/lse.h> @@ -41,7 +42,7 @@ #define STACK_TOP_MAX TASK_SIZE_64 #ifdef CONFIG_COMPAT #define AARCH32_VECTORS_BASE 0xffff0000 -#define STACK_TOP (test_thread_flag(TIF_32BIT) ? \ +#define STACK_TOP (is_compat_task() ? \ AARCH32_VECTORS_BASE : STACK_TOP_MAX) #else #define STACK_TOP STACK_TOP_MAX @@ -94,7 +95,7 @@ struct thread_struct { #define task_user_tls(t) \ ({ \ unsigned long *__tls; \ - if (is_compat_thread(task_thread_info(t))) \ + if (is_a32_compat_thread(task_thread_info(t))) \ __tls = &(t)->thread.tp2_value; \ else \ __tls = &(t)->thread.tp_value; \ diff --git a/arch/arm64/include/asm/syscall.h b/arch/arm64/include/asm/syscall.h index 709a574..ce09641 100644 --- a/arch/arm64/include/asm/syscall.h +++ b/arch/arm64/include/asm/syscall.h @@ -113,7 +113,7 @@ static inline void syscall_set_arguments(struct task_struct *task, */ static inline int syscall_get_arch(void) { - if (is_compat_task()) + if (is_a32_compat_task()) return AUDIT_ARCH_ARM; return AUDIT_ARCH_AARCH64; diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index abd64bd..4daa559 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h @@ -118,7 +118,7 @@ static inline struct thread_info *current_thread_info(void) #define TIF_FREEZE 19 #define TIF_RESTORE_SIGMASK 20 #define TIF_SINGLESTEP 21 -#define TIF_32BIT 22 /* 32bit process */ +#define TIF_32BIT 22 /* AARCH32 process */ #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c index b45c95d..baa1eba 100644 --- a/arch/arm64/kernel/hw_breakpoint.c +++ b/arch/arm64/kernel/hw_breakpoint.c @@ -164,7 +164,7 @@ enum hw_breakpoint_ops { HW_BREAKPOINT_RESTORE }; -static int is_compat_bp(struct perf_event *bp) +static int is_a32_compat_bp(struct perf_event *bp) { struct task_struct *tsk = bp->hw.target; @@ -175,7 +175,7 @@ static int is_compat_bp(struct perf_event *bp) * deprecated behaviour if we use unaligned watchpoints in * AArch64 state. */ - return tsk && is_compat_thread(task_thread_info(tsk)); + return tsk && is_a32_compat_thread(task_thread_info(tsk)); } /** @@ -435,7 +435,7 @@ static int arch_build_bp_info(struct perf_event *bp) * Watchpoints can be of length 1, 2, 4 or 8 bytes. */ if (info->ctrl.type == ARM_BREAKPOINT_EXECUTE) { - if (is_compat_bp(bp)) { + if (is_a32_compat_bp(bp)) { if (info->ctrl.len != ARM_BREAKPOINT_LEN_2 && info->ctrl.len != ARM_BREAKPOINT_LEN_4) return -EINVAL; @@ -492,7 +492,7 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) * AArch32 tasks expect some simple alignment fixups, so emulate * that here. */ - if (is_compat_bp(bp)) { + if (is_a32_compat_bp(bp)) { if (info->ctrl.len == ARM_BREAKPOINT_LEN_8) alignment_mask = 0x7; else @@ -679,7 +679,7 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr, info = counter_arch_bp(wp); /* AArch32 watchpoints are either 4 or 8 bytes aligned. */ - if (is_compat_task()) { + if (is_a32_compat_task()) { if (info->ctrl.len == ARM_BREAKPOINT_LEN_8) alignment_mask = 0x7; else diff --git a/arch/arm64/kernel/perf_regs.c b/arch/arm64/kernel/perf_regs.c index 3f62b35..a79058f 100644 --- a/arch/arm64/kernel/perf_regs.c +++ b/arch/arm64/kernel/perf_regs.c @@ -45,7 +45,7 @@ int perf_reg_validate(u64 mask) u64 perf_reg_abi(struct task_struct *task) { - if (is_compat_thread(task_thread_info(task))) + if (is_a32_compat_thread(task_thread_info(task))) return PERF_SAMPLE_REGS_ABI_32; else return PERF_SAMPLE_REGS_ABI_64; diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 8062482..746f2d3 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -47,7 +47,6 @@ #include <trace/events/power.h> #include <asm/alternative.h> -#include <asm/compat.h> #include <asm/cacheflush.h> #include <asm/fpsimd.h> #include <asm/mmu_context.h> @@ -211,7 +210,7 @@ static void tls_thread_flush(void) { asm ("msr tpidr_el0, xzr"); - if (is_compat_task()) { + if (is_a32_compat_task()) { current->thread.tp_value = 0; /* @@ -263,7 +262,7 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start, asm("mrs %0, tpidr_el0" : "=r" (*task_user_tls(p))); if (stack_start) { - if (is_compat_thread(task_thread_info(p))) + if (is_a32_compat_thread(task_thread_info(p))) childregs->compat_sp = stack_start; /* 16-byte aligned stack mandatory on AArch64 */ else if (stack_start & 15) @@ -303,7 +302,7 @@ static void tls_thread_switch(struct task_struct *next) *task_user_tls(current) = tpidr; tpidr = *task_user_tls(next); - tpidrro = is_compat_thread(task_thread_info(next)) ? + tpidrro = is_a32_compat_thread(task_thread_info(next)) ? next->thread.tp_value : 0; asm( diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index aa79e81..38a09338 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -38,7 +38,6 @@ #include <linux/tracehook.h> #include <linux/elf.h> -#include <asm/compat.h> #include <asm/debug-monitors.h> #include <asm/pgtable.h> #include <asm/syscall.h> @@ -85,7 +84,7 @@ static void ptrace_hbptriggered(struct perf_event *bp, #ifdef CONFIG_AARCH32_EL0 int i; - if (!is_compat_task()) + if (!is_a32_compat_task()) goto send_sig; for (i = 0; i < ARM_MAX_BRP; ++i) { @@ -1203,9 +1202,9 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task) * 32-bit children use an extended user_aarch32_ptrace_view to allow * access to the TLS register. */ - if (is_compat_task()) + if (is_a32_compat_task()) return &user_aarch32_view; - else if (is_compat_thread(task_thread_info(task))) + else if (is_a32_compat_thread(task_thread_info(task))) return &user_aarch32_ptrace_view; #endif return &user_aarch64_view; @@ -1232,7 +1231,7 @@ static void tracehook_report_syscall(struct pt_regs *regs, * A scratch register (ip(r12) on AArch32, x7 on AArch64) is * used to denote syscall entry/exit: */ - regno = (is_compat_task() ? 12 : 7); + regno = (is_a32_compat_task() ? 12 : 7); saved_reg = regs->regs[regno]; regs->regs[regno] = dir; @@ -1343,7 +1342,7 @@ int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task) if (!test_tsk_thread_flag(task, TIF_SINGLESTEP)) regs->pstate &= ~DBG_SPSR_SS; - if (is_compat_thread(task_thread_info(task))) + if (is_a32_compat_thread(task_thread_info(task))) return valid_compat_regs(regs); else return valid_native_regs(regs); diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index a8eafdb..be02f65 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -276,7 +276,7 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, static void setup_restart_syscall(struct pt_regs *regs) { - if (is_compat_task()) + if (is_a32_compat_task()) compat_setup_restart_syscall(regs); else regs->regs[8] = __NR_restart_syscall; @@ -295,7 +295,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) /* * Set up the stack frame */ - if (is_compat_task()) { + if (is_a32_compat_task()) { if (ksig->ka.sa.sa_flags & SA_SIGINFO) ret = compat_setup_rt_frame(usig, ksig, oldset, regs); else diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index 85461e8..515444a 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -18,6 +18,7 @@ */ #include <linux/bug.h> +#include <linux/compat.h> #include <linux/signal.h> #include <linux/personality.h> #include <linux/kallsyms.h> @@ -411,7 +412,7 @@ asmlinkage long do_ni_syscall(struct pt_regs *regs) { #ifdef CONFIG_AARCH32_EL0 long ret; - if (is_compat_task()) { + if (is_a32_compat_task()) { ret = compat_arm_syscall(regs); if (ret != -ENOSYS) return ret; -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) 2016-05-24 0:04 ` Yury Norov (?) @ 2016-06-12 12:21 ` Zhangjian (Bamvor) -1 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 12:21 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) Hi, Yury On 2016/5/24 8:04, Yury Norov wrote: > 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 <asm/is_compat.h> to avoid mess in > headers. > > Some files include both <linux/compat.h> and <asm/compat.h>, > and this is wrong because <linux/compat.h> has <asm/compat.h> already > included. It was fixed too. > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> > Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> > Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> > Reviewed-by: David Daney <ddaney@caviumnetworks.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 | 58 ++++++++++++++++++++++++++++++++++++ > arch/arm64/include/asm/memory.h | 3 +- > 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 | 10 +++---- > 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, 91 insertions(+), 47 deletions(-) > create mode 100644 arch/arm64/include/asm/is_compat.h > [...] > diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h > index 12f8a00..a66a0f7 100644 > --- a/arch/arm64/include/asm/memory.h > +++ b/arch/arm64/include/asm/memory.h > @@ -26,6 +26,7 @@ > #include <linux/types.h> > #include <asm/bug.h> > #include <asm/sizes.h> > +#include <asm/is_compat.h> > > /* > * Allow for constants defined here to be used from assembly code > @@ -61,7 +62,7 @@ > > #ifdef CONFIG_COMPAT > #define TASK_SIZE_32 UL(0x100000000) > -#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ > +#define TASK_SIZE (is_compat_task() ? \ > TASK_SIZE_32 : TASK_SIZE_64) > #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ > TASK_SIZE_32 : TASK_SIZE_64) Should we update or delete this macro? #define TASK_SIZE_OF(tsk) (is_compat_task() ? \ TASK_SIZE_32 : TASK_SIZE_64) x86, sparc, mips, ppc, parisc, s390 define its own version. But "include/linux/sched.h" will define it if TASK_SIZE_OF does not exist: #ifndef TASK_SIZE_OF #define TASK_SIZE_OF(tsk) TASK_SIZE #endif Regards Bamvor ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) @ 2016-06-12 12:21 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 12:21 UTC (permalink / raw) To: linux-arm-kernel Hi, Yury On 2016/5/24 8:04, Yury Norov wrote: > 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 <asm/is_compat.h> to avoid mess in > headers. > > Some files include both <linux/compat.h> and <asm/compat.h>, > and this is wrong because <linux/compat.h> has <asm/compat.h> already > included. It was fixed too. > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> > Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> > Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> > Reviewed-by: David Daney <ddaney@caviumnetworks.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 | 58 ++++++++++++++++++++++++++++++++++++ > arch/arm64/include/asm/memory.h | 3 +- > 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 | 10 +++---- > 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, 91 insertions(+), 47 deletions(-) > create mode 100644 arch/arm64/include/asm/is_compat.h > [...] > diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h > index 12f8a00..a66a0f7 100644 > --- a/arch/arm64/include/asm/memory.h > +++ b/arch/arm64/include/asm/memory.h > @@ -26,6 +26,7 @@ > #include <linux/types.h> > #include <asm/bug.h> > #include <asm/sizes.h> > +#include <asm/is_compat.h> > > /* > * Allow for constants defined here to be used from assembly code > @@ -61,7 +62,7 @@ > > #ifdef CONFIG_COMPAT > #define TASK_SIZE_32 UL(0x100000000) > -#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ > +#define TASK_SIZE (is_compat_task() ? \ > TASK_SIZE_32 : TASK_SIZE_64) > #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ > TASK_SIZE_32 : TASK_SIZE_64) Should we update or delete this macro? #define TASK_SIZE_OF(tsk) (is_compat_task() ? \ TASK_SIZE_32 : TASK_SIZE_64) x86, sparc, mips, ppc, parisc, s390 define its own version. But "include/linux/sched.h" will define it if TASK_SIZE_OF does not exist: #ifndef TASK_SIZE_OF #define TASK_SIZE_OF(tsk) TASK_SIZE #endif Regards Bamvor ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) @ 2016-06-12 12:21 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 12:21 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) Hi, Yury On 2016/5/24 8:04, Yury Norov wrote: > 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 <asm/is_compat.h> to avoid mess in > headers. > > Some files include both <linux/compat.h> and <asm/compat.h>, > and this is wrong because <linux/compat.h> has <asm/compat.h> already > included. It was fixed too. > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> > Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> > Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> > Reviewed-by: David Daney <ddaney@caviumnetworks.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 | 58 ++++++++++++++++++++++++++++++++++++ > arch/arm64/include/asm/memory.h | 3 +- > 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 | 10 +++---- > 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, 91 insertions(+), 47 deletions(-) > create mode 100644 arch/arm64/include/asm/is_compat.h > [...] > diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h > index 12f8a00..a66a0f7 100644 > --- a/arch/arm64/include/asm/memory.h > +++ b/arch/arm64/include/asm/memory.h > @@ -26,6 +26,7 @@ > #include <linux/types.h> > #include <asm/bug.h> > #include <asm/sizes.h> > +#include <asm/is_compat.h> > > /* > * Allow for constants defined here to be used from assembly code > @@ -61,7 +62,7 @@ > > #ifdef CONFIG_COMPAT > #define TASK_SIZE_32 UL(0x100000000) > -#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ > +#define TASK_SIZE (is_compat_task() ? \ > TASK_SIZE_32 : TASK_SIZE_64) > #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ > TASK_SIZE_32 : TASK_SIZE_64) Should we update or delete this macro? #define TASK_SIZE_OF(tsk) (is_compat_task() ? \ TASK_SIZE_32 : TASK_SIZE_64) x86, sparc, mips, ppc, parisc, s390 define its own version. But "include/linux/sched.h" will define it if TASK_SIZE_OF does not exist: #ifndef TASK_SIZE_OF #define TASK_SIZE_OF(tsk) TASK_SIZE #endif Regards Bamvor ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) 2016-06-12 12:21 ` Zhangjian (Bamvor) (?) @ 2016-06-12 13:08 ` Zhangjian (Bamvor) -1 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 13:08 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) On 2016/6/12 20:21, Zhangjian (Bamvor) wrote: > Hi, Yury > > On 2016/5/24 8:04, Yury Norov wrote: >> 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 <asm/is_compat.h> to avoid mess in >> headers. >> >> Some files include both <linux/compat.h> and <asm/compat.h>, >> and this is wrong because <linux/compat.h> has <asm/compat.h> already >> included. It was fixed too. >> >> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> >> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> >> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> >> Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> >> Reviewed-by: David Daney <ddaney@caviumnetworks.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 | 58 ++++++++++++++++++++++++++++++++++++ >> arch/arm64/include/asm/memory.h | 3 +- >> 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 | 10 +++---- >> 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, 91 insertions(+), 47 deletions(-) >> create mode 100644 arch/arm64/include/asm/is_compat.h >> > [...] >> diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h >> index 12f8a00..a66a0f7 100644 >> --- a/arch/arm64/include/asm/memory.h >> +++ b/arch/arm64/include/asm/memory.h >> @@ -26,6 +26,7 @@ >> #include <linux/types.h> >> #include <asm/bug.h> >> #include <asm/sizes.h> >> +#include <asm/is_compat.h> >> >> /* >> * Allow for constants defined here to be used from assembly code >> @@ -61,7 +62,7 @@ >> >> #ifdef CONFIG_COMPAT >> #define TASK_SIZE_32 UL(0x100000000) >> -#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ >> +#define TASK_SIZE (is_compat_task() ? \ >> TASK_SIZE_32 : TASK_SIZE_64) >> #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ >> TASK_SIZE_32 : TASK_SIZE_64) > Should we update or delete this macro? > #define TASK_SIZE_OF(tsk) (is_compat_task() ? \ > TASK_SIZE_32 : TASK_SIZE_64) Sorry it should be: #define TASK_SIZE_OF(tsk) ((is_a32_compat_thread(task_thread_info(tsk)) \ || is_ilp32_compat_thread(task_thread_info(tsk))) ? \ TASK_SIZE_32 : TASK_SIZE_64) > x86, sparc, mips, ppc, parisc, s390 define its own version. But > "include/linux/sched.h" will define it if > TASK_SIZE_OF does not exist: > #ifndef TASK_SIZE_OF > #define TASK_SIZE_OF(tsk) TASK_SIZE > #endif > > > Regards > > Bamvor > ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) @ 2016-06-12 13:08 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 13:08 UTC (permalink / raw) To: linux-arm-kernel On 2016/6/12 20:21, Zhangjian (Bamvor) wrote: > Hi, Yury > > On 2016/5/24 8:04, Yury Norov wrote: >> 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 <asm/is_compat.h> to avoid mess in >> headers. >> >> Some files include both <linux/compat.h> and <asm/compat.h>, >> and this is wrong because <linux/compat.h> has <asm/compat.h> already >> included. It was fixed too. >> >> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> >> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> >> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> >> Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> >> Reviewed-by: David Daney <ddaney@caviumnetworks.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 | 58 ++++++++++++++++++++++++++++++++++++ >> arch/arm64/include/asm/memory.h | 3 +- >> 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 | 10 +++---- >> 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, 91 insertions(+), 47 deletions(-) >> create mode 100644 arch/arm64/include/asm/is_compat.h >> > [...] >> diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h >> index 12f8a00..a66a0f7 100644 >> --- a/arch/arm64/include/asm/memory.h >> +++ b/arch/arm64/include/asm/memory.h >> @@ -26,6 +26,7 @@ >> #include <linux/types.h> >> #include <asm/bug.h> >> #include <asm/sizes.h> >> +#include <asm/is_compat.h> >> >> /* >> * Allow for constants defined here to be used from assembly code >> @@ -61,7 +62,7 @@ >> >> #ifdef CONFIG_COMPAT >> #define TASK_SIZE_32 UL(0x100000000) >> -#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ >> +#define TASK_SIZE (is_compat_task() ? \ >> TASK_SIZE_32 : TASK_SIZE_64) >> #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ >> TASK_SIZE_32 : TASK_SIZE_64) > Should we update or delete this macro? > #define TASK_SIZE_OF(tsk) (is_compat_task() ? \ > TASK_SIZE_32 : TASK_SIZE_64) Sorry it should be: #define TASK_SIZE_OF(tsk) ((is_a32_compat_thread(task_thread_info(tsk)) \ || is_ilp32_compat_thread(task_thread_info(tsk))) ? \ TASK_SIZE_32 : TASK_SIZE_64) > x86, sparc, mips, ppc, parisc, s390 define its own version. But > "include/linux/sched.h" will define it if > TASK_SIZE_OF does not exist: > #ifndef TASK_SIZE_OF > #define TASK_SIZE_OF(tsk) TASK_SIZE > #endif > > > Regards > > Bamvor > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) @ 2016-06-12 13:08 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 13:08 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) On 2016/6/12 20:21, Zhangjian (Bamvor) wrote: > Hi, Yury > > On 2016/5/24 8:04, Yury Norov wrote: >> 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 <asm/is_compat.h> to avoid mess in >> headers. >> >> Some files include both <linux/compat.h> and <asm/compat.h>, >> and this is wrong because <linux/compat.h> has <asm/compat.h> already >> included. It was fixed too. >> >> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> >> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> >> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> >> Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> >> Reviewed-by: David Daney <ddaney@caviumnetworks.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 | 58 ++++++++++++++++++++++++++++++++++++ >> arch/arm64/include/asm/memory.h | 3 +- >> 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 | 10 +++---- >> 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, 91 insertions(+), 47 deletions(-) >> create mode 100644 arch/arm64/include/asm/is_compat.h >> > [...] >> diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h >> index 12f8a00..a66a0f7 100644 >> --- a/arch/arm64/include/asm/memory.h >> +++ b/arch/arm64/include/asm/memory.h >> @@ -26,6 +26,7 @@ >> #include <linux/types.h> >> #include <asm/bug.h> >> #include <asm/sizes.h> >> +#include <asm/is_compat.h> >> >> /* >> * Allow for constants defined here to be used from assembly code >> @@ -61,7 +62,7 @@ >> >> #ifdef CONFIG_COMPAT >> #define TASK_SIZE_32 UL(0x100000000) >> -#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ >> +#define TASK_SIZE (is_compat_task() ? \ >> TASK_SIZE_32 : TASK_SIZE_64) >> #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ >> TASK_SIZE_32 : TASK_SIZE_64) > Should we update or delete this macro? > #define TASK_SIZE_OF(tsk) (is_compat_task() ? \ > TASK_SIZE_32 : TASK_SIZE_64) Sorry it should be: #define TASK_SIZE_OF(tsk) ((is_a32_compat_thread(task_thread_info(tsk)) \ || is_ilp32_compat_thread(task_thread_info(tsk))) ? \ TASK_SIZE_32 : TASK_SIZE_64) > x86, sparc, mips, ppc, parisc, s390 define its own version. But > "include/linux/sched.h" will define it if > TASK_SIZE_OF does not exist: > #ifndef TASK_SIZE_OF > #define TASK_SIZE_OF(tsk) TASK_SIZE > #endif > > > Regards > > Bamvor > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) 2016-06-12 13:08 ` Zhangjian (Bamvor) (?) @ 2016-06-12 17:56 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-12 17:56 UTC (permalink / raw) To: Zhangjian (Bamvor) Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Hanjun Guo On Sun, Jun 12, 2016 at 09:08:28PM +0800, Zhangjian (Bamvor) wrote: > >> #ifdef CONFIG_COMPAT > >> #define TASK_SIZE_32 UL(0x100000000) > >>-#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ > >>+#define TASK_SIZE (is_compat_task() ? \ > >> TASK_SIZE_32 : TASK_SIZE_64) > >> #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ > >> TASK_SIZE_32 : TASK_SIZE_64) > >Should we update or delete this macro? > > #define TASK_SIZE_OF(tsk) (is_compat_task() ? \ > >TASK_SIZE_32 : TASK_SIZE_64) > Sorry it should be: > #define TASK_SIZE_OF(tsk) ((is_a32_compat_thread(task_thread_info(tsk)) \ > || is_ilp32_compat_thread(task_thread_info(tsk))) ? \ > TASK_SIZE_32 : TASK_SIZE_64) Thank you. I know about this, but always forget to fix. ) I think we'd introduce is_compat_thread() as well. > >x86, sparc, mips, ppc, parisc, s390 define its own version. But > >"include/linux/sched.h" will define it if > >TASK_SIZE_OF does not exist: > >#ifndef TASK_SIZE_OF > >#define TASK_SIZE_OF(tsk) TASK_SIZE > >#endif > > > > > >Regards > > > >Bamvor > > ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) @ 2016-06-12 17:56 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-12 17:56 UTC (permalink / raw) To: linux-arm-kernel On Sun, Jun 12, 2016 at 09:08:28PM +0800, Zhangjian (Bamvor) wrote: > >> #ifdef CONFIG_COMPAT > >> #define TASK_SIZE_32 UL(0x100000000) > >>-#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ > >>+#define TASK_SIZE (is_compat_task() ? \ > >> TASK_SIZE_32 : TASK_SIZE_64) > >> #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ > >> TASK_SIZE_32 : TASK_SIZE_64) > >Should we update or delete this macro? > > #define TASK_SIZE_OF(tsk) (is_compat_task() ? \ > >TASK_SIZE_32 : TASK_SIZE_64) > Sorry it should be: > #define TASK_SIZE_OF(tsk) ((is_a32_compat_thread(task_thread_info(tsk)) \ > || is_ilp32_compat_thread(task_thread_info(tsk))) ? \ > TASK_SIZE_32 : TASK_SIZE_64) Thank you. I know about this, but always forget to fix. ) I think we'd introduce is_compat_thread() as well. > >x86, sparc, mips, ppc, parisc, s390 define its own version. But > >"include/linux/sched.h" will define it if > >TASK_SIZE_OF does not exist: > >#ifndef TASK_SIZE_OF > >#define TASK_SIZE_OF(tsk) TASK_SIZE > >#endif > > > > > >Regards > > > >Bamvor > > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) @ 2016-06-12 17:56 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-12 17:56 UTC (permalink / raw) To: Zhangjian (Bamvor) Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Hanjun Guo On Sun, Jun 12, 2016 at 09:08:28PM +0800, Zhangjian (Bamvor) wrote: > >> #ifdef CONFIG_COMPAT > >> #define TASK_SIZE_32 UL(0x100000000) > >>-#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ > >>+#define TASK_SIZE (is_compat_task() ? \ > >> TASK_SIZE_32 : TASK_SIZE_64) > >> #define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ > >> TASK_SIZE_32 : TASK_SIZE_64) > >Should we update or delete this macro? > > #define TASK_SIZE_OF(tsk) (is_compat_task() ? \ > >TASK_SIZE_32 : TASK_SIZE_64) > Sorry it should be: > #define TASK_SIZE_OF(tsk) ((is_a32_compat_thread(task_thread_info(tsk)) \ > || is_ilp32_compat_thread(task_thread_info(tsk))) ? \ > TASK_SIZE_32 : TASK_SIZE_64) Thank you. I know about this, but always forget to fix. ) I think we'd introduce is_compat_thread() as well. > >x86, sparc, mips, ppc, parisc, s390 define its own version. But > >"include/linux/sched.h" will define it if > >TASK_SIZE_OF does not exist: > >#ifndef TASK_SIZE_OF > >#define TASK_SIZE_OF(tsk) TASK_SIZE > >#endif > > > > > >Regards > > > >Bamvor > > ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 14/23] arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski 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.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.com> --- arch/arm64/include/asm/elf.h | 13 +++++++++++-- arch/arm64/include/asm/is_compat.h | 28 +++++++++++++++++++++++++++- arch/arm64/include/asm/thread_info.h | 2 ++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index b5437c5..e18bb8a 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -142,7 +142,11 @@ typedef struct user_fpsimd_state elf_fpregset_t; */ #define ELF_PLAT_INIT(_r, load_addr) (_r)->regs[0] = 0 -#define SET_PERSONALITY(ex) clear_thread_flag(TIF_32BIT); +#define SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + clear_thread_flag(TIF_32BIT); \ +} while (0) #define ARCH_DLINFO \ do { \ @@ -181,7 +185,12 @@ typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; ((x)->e_flags & EF_ARM_EABI_MASK)) #define compat_start_thread compat_start_thread -#define COMPAT_SET_PERSONALITY(ex) set_thread_flag(TIF_32BIT); +#define COMPAT_SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + set_thread_flag(TIF_32BIT); \ +} while (0) + #define COMPAT_ARCH_DLINFO extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp); diff --git a/arch/arm64/include/asm/is_compat.h b/arch/arm64/include/asm/is_compat.h index 6139b5a..55134cf 100644 --- a/arch/arm64/include/asm/is_compat.h +++ b/arch/arm64/include/asm/is_compat.h @@ -45,11 +45,37 @@ 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 */ diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index 4daa559..8802645 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h @@ -119,6 +119,7 @@ static inline struct thread_info *current_thread_info(void) #define TIF_RESTORE_SIGMASK 20 #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) @@ -130,6 +131,7 @@ static inline struct thread_info *current_thread_info(void) #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) #define _TIF_SECCOMP (1 << TIF_SECCOMP) #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.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 14/23] arm64: ilp32: add is_ilp32_compat_{task, thread} and TIF_32BIT_AARCH64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel 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.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.com> --- arch/arm64/include/asm/elf.h | 13 +++++++++++-- arch/arm64/include/asm/is_compat.h | 28 +++++++++++++++++++++++++++- arch/arm64/include/asm/thread_info.h | 2 ++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index b5437c5..e18bb8a 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -142,7 +142,11 @@ typedef struct user_fpsimd_state elf_fpregset_t; */ #define ELF_PLAT_INIT(_r, load_addr) (_r)->regs[0] = 0 -#define SET_PERSONALITY(ex) clear_thread_flag(TIF_32BIT); +#define SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + clear_thread_flag(TIF_32BIT); \ +} while (0) #define ARCH_DLINFO \ do { \ @@ -181,7 +185,12 @@ typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; ((x)->e_flags & EF_ARM_EABI_MASK)) #define compat_start_thread compat_start_thread -#define COMPAT_SET_PERSONALITY(ex) set_thread_flag(TIF_32BIT); +#define COMPAT_SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + set_thread_flag(TIF_32BIT); \ +} while (0) + #define COMPAT_ARCH_DLINFO extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp); diff --git a/arch/arm64/include/asm/is_compat.h b/arch/arm64/include/asm/is_compat.h index 6139b5a..55134cf 100644 --- a/arch/arm64/include/asm/is_compat.h +++ b/arch/arm64/include/asm/is_compat.h @@ -45,11 +45,37 @@ 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 */ diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index 4daa559..8802645 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h @@ -119,6 +119,7 @@ static inline struct thread_info *current_thread_info(void) #define TIF_RESTORE_SIGMASK 20 #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) @@ -130,6 +131,7 @@ static inline struct thread_info *current_thread_info(void) #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) #define _TIF_SECCOMP (1 << TIF_SECCOMP) #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.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 14/23] arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski 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.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.com> --- arch/arm64/include/asm/elf.h | 13 +++++++++++-- arch/arm64/include/asm/is_compat.h | 28 +++++++++++++++++++++++++++- arch/arm64/include/asm/thread_info.h | 2 ++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index b5437c5..e18bb8a 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -142,7 +142,11 @@ typedef struct user_fpsimd_state elf_fpregset_t; */ #define ELF_PLAT_INIT(_r, load_addr) (_r)->regs[0] = 0 -#define SET_PERSONALITY(ex) clear_thread_flag(TIF_32BIT); +#define SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + clear_thread_flag(TIF_32BIT); \ +} while (0) #define ARCH_DLINFO \ do { \ @@ -181,7 +185,12 @@ typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; ((x)->e_flags & EF_ARM_EABI_MASK)) #define compat_start_thread compat_start_thread -#define COMPAT_SET_PERSONALITY(ex) set_thread_flag(TIF_32BIT); +#define COMPAT_SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + set_thread_flag(TIF_32BIT); \ +} while (0) + #define COMPAT_ARCH_DLINFO extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp); diff --git a/arch/arm64/include/asm/is_compat.h b/arch/arm64/include/asm/is_compat.h index 6139b5a..55134cf 100644 --- a/arch/arm64/include/asm/is_compat.h +++ b/arch/arm64/include/asm/is_compat.h @@ -45,11 +45,37 @@ 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 */ diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index 4daa559..8802645 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h @@ -119,6 +119,7 @@ static inline struct thread_info *current_thread_info(void) #define TIF_RESTORE_SIGMASK 20 #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) @@ -130,6 +131,7 @@ static inline struct thread_info *current_thread_info(void) #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) #define _TIF_SECCOMP (1 << TIF_SECCOMP) #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.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 15/23] arm64: introduce binfmt_elf32.c 2016-05-24 0:04 ` Yury Norov (?) (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich 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 <ynorov@caviumnetworks.com> --- arch/arm64/Kconfig | 1 - arch/arm64/include/asm/elf.h | 24 ------------------------ arch/arm64/include/asm/hwcap.h | 2 -- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/binfmt_elf32.c | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 34 insertions(+), 28 deletions(-) create mode 100644 arch/arm64/kernel/binfmt_elf32.c diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index ede9b2e..0bb7adc 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -932,7 +932,6 @@ config AARCH32_EL0 bool "Kernel support for 32-bit EL0" def_bool y depends on ARM64_4K_PAGES || EXPERT - select COMPAT_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 e18bb8a..7a39683 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -166,12 +166,6 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, #ifdef CONFIG_COMPAT -#ifdef __AARCH64EB__ -#define COMPAT_ELF_PLATFORM ("v8b") -#else -#define COMPAT_ELF_PLATFORM ("v8l") -#endif - #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) /* AArch32 registers. */ @@ -179,24 +173,6 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, 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 0xff000000 -#define compat_elf_check_arch(x) (((x)->e_machine == EM_ARM) && \ - ((x)->e_flags & EF_ARM_EABI_MASK)) - -#define compat_start_thread compat_start_thread -#define COMPAT_SET_PERSONALITY(ex) \ -do { \ - clear_thread_flag(TIF_32BIT_AARCH64); \ - set_thread_flag(TIF_32BIT); \ -} while (0) - -#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 /* !__ASSEMBLY__ */ diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 2c7fc5d..99dfd92 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 75dd250..6bc9738 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -27,7 +27,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o \ - ../../arm/kernel/opcodes.o + ../../arm/kernel/opcodes.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 0000000..5487872 --- /dev/null +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -0,0 +1,33 @@ +/* + * Support for AArch32 Linux ELF binaries. + */ + +/* AArch32 EABI. */ +#define EF_ARM_EABI_MASK 0xff000000 +#define compat_elf_check_arch(x) (((x)->e_machine == EM_ARM) && \ + ((x)->e_flags & EF_ARM_EABI_MASK)) + +#define compat_start_thread compat_start_thread +#define COMPAT_SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + set_thread_flag(TIF_32BIT); \ +} while (0) + +#define COMPAT_ARCH_DLINFO +#define COMPAT_ELF_HWCAP (compat_elf_hwcap) +#define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) + +#ifdef __AARCH64EB__ +#define COMPAT_ELF_PLATFORM ("v8b") +#else +#define COMPAT_ELF_PLATFORM ("v8l") +#endif + +#define compat_arch_setup_additional_pages \ + aarch32_setup_vectors_page +struct linux_binprm; +extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, + int uses_interp); + +#include "../../../fs/compat_binfmt_elf.c" -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 15/23] arm64: introduce binfmt_elf32.c @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel 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 <ynorov@caviumnetworks.com> --- arch/arm64/Kconfig | 1 - arch/arm64/include/asm/elf.h | 24 ------------------------ arch/arm64/include/asm/hwcap.h | 2 -- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/binfmt_elf32.c | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 34 insertions(+), 28 deletions(-) create mode 100644 arch/arm64/kernel/binfmt_elf32.c diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index ede9b2e..0bb7adc 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -932,7 +932,6 @@ config AARCH32_EL0 bool "Kernel support for 32-bit EL0" def_bool y depends on ARM64_4K_PAGES || EXPERT - select COMPAT_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 e18bb8a..7a39683 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -166,12 +166,6 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, #ifdef CONFIG_COMPAT -#ifdef __AARCH64EB__ -#define COMPAT_ELF_PLATFORM ("v8b") -#else -#define COMPAT_ELF_PLATFORM ("v8l") -#endif - #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) /* AArch32 registers. */ @@ -179,24 +173,6 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, 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 0xff000000 -#define compat_elf_check_arch(x) (((x)->e_machine == EM_ARM) && \ - ((x)->e_flags & EF_ARM_EABI_MASK)) - -#define compat_start_thread compat_start_thread -#define COMPAT_SET_PERSONALITY(ex) \ -do { \ - clear_thread_flag(TIF_32BIT_AARCH64); \ - set_thread_flag(TIF_32BIT); \ -} while (0) - -#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 /* !__ASSEMBLY__ */ diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 2c7fc5d..99dfd92 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 75dd250..6bc9738 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -27,7 +27,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o \ - ../../arm/kernel/opcodes.o + ../../arm/kernel/opcodes.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 0000000..5487872 --- /dev/null +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -0,0 +1,33 @@ +/* + * Support for AArch32 Linux ELF binaries. + */ + +/* AArch32 EABI. */ +#define EF_ARM_EABI_MASK 0xff000000 +#define compat_elf_check_arch(x) (((x)->e_machine == EM_ARM) && \ + ((x)->e_flags & EF_ARM_EABI_MASK)) + +#define compat_start_thread compat_start_thread +#define COMPAT_SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + set_thread_flag(TIF_32BIT); \ +} while (0) + +#define COMPAT_ARCH_DLINFO +#define COMPAT_ELF_HWCAP (compat_elf_hwcap) +#define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) + +#ifdef __AARCH64EB__ +#define COMPAT_ELF_PLATFORM ("v8b") +#else +#define COMPAT_ELF_PLATFORM ("v8l") +#endif + +#define compat_arch_setup_additional_pages \ + aarch32_setup_vectors_page +struct linux_binprm; +extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, + int uses_interp); + +#include "../../../fs/compat_binfmt_elf.c" -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 15/23] arm64: introduce binfmt_elf32.c @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich 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 <ynorov@caviumnetworks.com> --- arch/arm64/Kconfig | 1 - arch/arm64/include/asm/elf.h | 24 ------------------------ arch/arm64/include/asm/hwcap.h | 2 -- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/binfmt_elf32.c | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 34 insertions(+), 28 deletions(-) create mode 100644 arch/arm64/kernel/binfmt_elf32.c diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index ede9b2e..0bb7adc 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -932,7 +932,6 @@ config AARCH32_EL0 bool "Kernel support for 32-bit EL0" def_bool y depends on ARM64_4K_PAGES || EXPERT - select COMPAT_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 e18bb8a..7a39683 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -166,12 +166,6 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, #ifdef CONFIG_COMPAT -#ifdef __AARCH64EB__ -#define COMPAT_ELF_PLATFORM ("v8b") -#else -#define COMPAT_ELF_PLATFORM ("v8l") -#endif - #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) /* AArch32 registers. */ @@ -179,24 +173,6 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, 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 0xff000000 -#define compat_elf_check_arch(x) (((x)->e_machine == EM_ARM) && \ - ((x)->e_flags & EF_ARM_EABI_MASK)) - -#define compat_start_thread compat_start_thread -#define COMPAT_SET_PERSONALITY(ex) \ -do { \ - clear_thread_flag(TIF_32BIT_AARCH64); \ - set_thread_flag(TIF_32BIT); \ -} while (0) - -#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 /* !__ASSEMBLY__ */ diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 2c7fc5d..99dfd92 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 75dd250..6bc9738 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -27,7 +27,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o \ - ../../arm/kernel/opcodes.o + ../../arm/kernel/opcodes.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 0000000..5487872 --- /dev/null +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -0,0 +1,33 @@ +/* + * Support for AArch32 Linux ELF binaries. + */ + +/* AArch32 EABI. */ +#define EF_ARM_EABI_MASK 0xff000000 +#define compat_elf_check_arch(x) (((x)->e_machine == EM_ARM) && \ + ((x)->e_flags & EF_ARM_EABI_MASK)) + +#define compat_start_thread compat_start_thread +#define COMPAT_SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + set_thread_flag(TIF_32BIT); \ +} while (0) + +#define COMPAT_ARCH_DLINFO +#define COMPAT_ELF_HWCAP (compat_elf_hwcap) +#define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) + +#ifdef __AARCH64EB__ +#define COMPAT_ELF_PLATFORM ("v8b") +#else +#define COMPAT_ELF_PLATFORM ("v8l") +#endif + +#define compat_arch_setup_additional_pages \ + aarch32_setup_vectors_page +struct linux_binprm; +extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, + int uses_interp); + +#include "../../../fs/compat_binfmt_elf.c" -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 15/23] arm64: introduce binfmt_elf32.c @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, ynorov, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner 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 <ynorov@caviumnetworks.com> --- arch/arm64/Kconfig | 1 - arch/arm64/include/asm/elf.h | 24 ------------------------ arch/arm64/include/asm/hwcap.h | 2 -- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/binfmt_elf32.c | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 34 insertions(+), 28 deletions(-) create mode 100644 arch/arm64/kernel/binfmt_elf32.c diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index ede9b2e..0bb7adc 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -932,7 +932,6 @@ config AARCH32_EL0 bool "Kernel support for 32-bit EL0" def_bool y depends on ARM64_4K_PAGES || EXPERT - select COMPAT_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 e18bb8a..7a39683 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -166,12 +166,6 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, #ifdef CONFIG_COMPAT -#ifdef __AARCH64EB__ -#define COMPAT_ELF_PLATFORM ("v8b") -#else -#define COMPAT_ELF_PLATFORM ("v8l") -#endif - #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) /* AArch32 registers. */ @@ -179,24 +173,6 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, 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 0xff000000 -#define compat_elf_check_arch(x) (((x)->e_machine == EM_ARM) && \ - ((x)->e_flags & EF_ARM_EABI_MASK)) - -#define compat_start_thread compat_start_thread -#define COMPAT_SET_PERSONALITY(ex) \ -do { \ - clear_thread_flag(TIF_32BIT_AARCH64); \ - set_thread_flag(TIF_32BIT); \ -} while (0) - -#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 /* !__ASSEMBLY__ */ diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 2c7fc5d..99dfd92 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 75dd250..6bc9738 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -27,7 +27,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o \ - ../../arm/kernel/opcodes.o + ../../arm/kernel/opcodes.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 0000000..5487872 --- /dev/null +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -0,0 +1,33 @@ +/* + * Support for AArch32 Linux ELF binaries. + */ + +/* AArch32 EABI. */ +#define EF_ARM_EABI_MASK 0xff000000 +#define compat_elf_check_arch(x) (((x)->e_machine == EM_ARM) && \ + ((x)->e_flags & EF_ARM_EABI_MASK)) + +#define compat_start_thread compat_start_thread +#define COMPAT_SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + set_thread_flag(TIF_32BIT); \ +} while (0) + +#define COMPAT_ARCH_DLINFO +#define COMPAT_ELF_HWCAP (compat_elf_hwcap) +#define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) + +#ifdef __AARCH64EB__ +#define COMPAT_ELF_PLATFORM ("v8b") +#else +#define COMPAT_ELF_PLATFORM ("v8l") +#endif + +#define compat_arch_setup_additional_pages \ + aarch32_setup_vectors_page +struct linux_binprm; +extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, + int uses_interp); + +#include "../../../fs/compat_binfmt_elf.c" -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich to handle ILP32 binaries Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 arch/arm64/kernel/binfmt_ilp32.c diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 6bc9738..9dfdf86 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 \ ../../arm/kernel/opcodes.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 0000000..a934fd4 --- /dev/null +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -0,0 +1,91 @@ +/* + * Support for ILP32 Linux/aarch64 ELF binaries. + */ + +#include <linux/elfcore-compat.h> +#include <linux/time.h> + +#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_t compat_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 + +/* + * Compat version of cputime_to_compat_timeval, perhaps this + * should be an inline in <linux/compat.h>. + */ +static void cputime_to_compat_timeval(const cputime_t cputime, + struct compat_timeval *value) +{ + struct timeval tv; + cputime_to_timeval(cputime, &tv); + value->tv_sec = tv.tv_sec; + value->tv_usec = tv.tv_usec; +} + +#undef cputime_to_timeval +#define cputime_to_timeval cputime_to_compat_timeval + +/* 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_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) + +#ifdef __AARCH64EB__ +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") +#else +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") +#endif + +#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_binfmt init_compat_elf_binfmt +#define exit_elf_binfmt exit_compat_elf_binfmt + +#include "../../../fs/binfmt_elf.c" -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel to handle ILP32 binaries Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 arch/arm64/kernel/binfmt_ilp32.c diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 6bc9738..9dfdf86 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 \ ../../arm/kernel/opcodes.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 0000000..a934fd4 --- /dev/null +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -0,0 +1,91 @@ +/* + * Support for ILP32 Linux/aarch64 ELF binaries. + */ + +#include <linux/elfcore-compat.h> +#include <linux/time.h> + +#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_t compat_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 + +/* + * Compat version of cputime_to_compat_timeval, perhaps this + * should be an inline in <linux/compat.h>. + */ +static void cputime_to_compat_timeval(const cputime_t cputime, + struct compat_timeval *value) +{ + struct timeval tv; + cputime_to_timeval(cputime, &tv); + value->tv_sec = tv.tv_sec; + value->tv_usec = tv.tv_usec; +} + +#undef cputime_to_timeval +#define cputime_to_timeval cputime_to_compat_timeval + +/* 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_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) + +#ifdef __AARCH64EB__ +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") +#else +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") +#endif + +#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_binfmt init_compat_elf_binfmt +#define exit_elf_binfmt exit_compat_elf_binfmt + +#include "../../../fs/binfmt_elf.c" -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich to handle ILP32 binaries Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 arch/arm64/kernel/binfmt_ilp32.c diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 6bc9738..9dfdf86 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 \ ../../arm/kernel/opcodes.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 0000000..a934fd4 --- /dev/null +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -0,0 +1,91 @@ +/* + * Support for ILP32 Linux/aarch64 ELF binaries. + */ + +#include <linux/elfcore-compat.h> +#include <linux/time.h> + +#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_t compat_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 + +/* + * Compat version of cputime_to_compat_timeval, perhaps this + * should be an inline in <linux/compat.h>. + */ +static void cputime_to_compat_timeval(const cputime_t cputime, + struct compat_timeval *value) +{ + struct timeval tv; + cputime_to_timeval(cputime, &tv); + value->tv_sec = tv.tv_sec; + value->tv_usec = tv.tv_usec; +} + +#undef cputime_to_timeval +#define cputime_to_timeval cputime_to_compat_timeval + +/* 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_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) + +#ifdef __AARCH64EB__ +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") +#else +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") +#endif + +#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_binfmt init_compat_elf_binfmt +#define exit_elf_binfmt exit_compat_elf_binfmt + +#include "../../../fs/binfmt_elf.c" -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-26 13:49 ` Zhangjian (Bamvor) -1 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-05-26 13:49 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Hanjun Guo, Zhangjian (Bamvor) Hi, yury The coredump is usable in our platform. It miss the following definition: +#define compat_elf_greg_t elf_greg_t +#define compat_elf_gregset_t elf_gregset_t And it leads to the wrong register save in core dump. After apply this patch, gdb could debug core dump files. Here is the full patch: From 102624840aa5dacdd1bbfe3b390290f52f530ea2 Mon Sep 17 00:00:00 2001 From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> Date: Thu, 26 May 2016 21:00:16 +0800 Subject: [PATCH hulk-4.1-next] arm64: ilp32: fix coredump issue ILP32 use aarch64 register and 32bit signal struct which means it could not make use of the existing compat_elf_prstatus/elf_prstatus and compat_elf_prpsinfo/elf_prpsinfo. This patch fix this issue by introducing the different compat_elf_greg_t, compat_elf_gregset_t for aarch64 ilp32 and aarch32 el0. Tested pass on huawei's hardware in bigendian. Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> --- arch/arm64/include/asm/elf.h | 14 +++++++------- arch/arm64/kernel/binfmt_elf32.c | 3 +++ arch/arm64/kernel/binfmt_ilp32.c | 8 +++++++- arch/arm64/kernel/ptrace.c | 20 ++++++++++---------- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 0106d18..9019441 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -154,18 +154,18 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp); /* 1GB of VA */ -#define STACK_RND_MASK (is_compat_task() ? \ - 0x7ff >> (PAGE_SHIFT - 12) : \ - 0x3ffff >> (PAGE_SHIFT - 12)) +#define STACK_RND_MASK (is_compat_task() ? \ + 0x7ff >> (PAGE_SHIFT - 12) : \ + 0x3ffff >> (PAGE_SHIFT - 12)) #ifdef CONFIG_COMPAT -#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) +#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) /* 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]; +#define COMPAT_ELF_NGREG 18 +typedef unsigned int compat_a32_elf_greg_t; +typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_ELF_NGREG]; #endif /* CONFIG_COMPAT */ diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c index 7b9b445..f75253c 100644 --- a/arch/arm64/kernel/binfmt_elf32.c +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -31,4 +31,7 @@ struct linux_binprm; extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp); +#define compat_elf_greg_t compat_a32_elf_greg_t +#define compat_elf_gregset_t compat_a32_elf_gregset_t + #include "../../../fs/compat_binfmt_elf.c" diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c index b827a9a..01baf83 100644 --- a/arch/arm64/kernel/binfmt_ilp32.c +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -2,7 +2,9 @@ * Support for ILP32 Linux/aarch64 ELF binaries. */ -#include <linux/elfcore-compat.h> +#include <linux/elf.h> +#include <linux/elfcore.h> +#include <linux/compat.h> #include <linux/time.h> #undef ELF_CLASS @@ -30,9 +32,13 @@ * 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 compat_elf_greg_t elf_greg_t +#define compat_elf_gregset_t elf_gregset_t #define elf_prstatus compat_elf_prstatus #define elf_prpsinfo compat_elf_prpsinfo +#include <linux/elfcore-compat.h> + /* * Compat version of cputime_to_compat_timeval, perhaps this * should be an inline in <linux/compat.h>. diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 5c86135..9784c77 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -913,8 +913,8 @@ static const struct user_regset aarch32_regsets[] = { [REGSET_COMPAT_GPR] = { .core_note_type = NT_PRSTATUS, .n = COMPAT_ELF_NGREG, - .size = sizeof(compat_elf_greg_t), - .align = sizeof(compat_elf_greg_t), + .size = sizeof(compat_a32_elf_greg_t), + .align = sizeof(compat_a32_elf_greg_t), .get = compat_gpr_get, .set = compat_gpr_set }, @@ -947,7 +947,7 @@ static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off, tmp = tsk->mm->start_data; else if (off == COMPAT_PT_TEXT_END_ADDR) tmp = tsk->mm->end_code; - else if (off < sizeof(compat_elf_gregset_t)) + else if (off < sizeof(compat_a32_elf_gregset_t)) return copy_regset_to_user(tsk, &user_aarch32_view, REGSET_COMPAT_GPR, off, sizeof(compat_ulong_t), ret); @@ -968,7 +968,7 @@ static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off, if (off & 3 || off >= COMPAT_USER_SZ) return -EIO; - if (off >= sizeof(compat_elf_gregset_t)) + if (off >= sizeof(compat_a32_elf_gregset_t)) return 0; set_fs(KERNEL_DS); @@ -1116,9 +1116,11 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, unsigned long addr = caddr; unsigned long data = cdata; void __user *datap = compat_ptr(data); + unsigned int pr_reg_size = sizeof(compat_a32_elf_gregset_t); int ret; switch (request) { + case PTRACE_PEEKUSR: ret = compat_ptrace_read_user(child, addr, datap); break; @@ -1130,17 +1132,15 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, case COMPAT_PTRACE_GETREGS: ret = copy_regset_to_user(child, &user_aarch32_view, - REGSET_COMPAT_GPR, - 0, sizeof(compat_elf_gregset_t), - datap); + REGSET_COMPAT_GPR, 0, + pr_reg_size, datap); break; case COMPAT_PTRACE_SETREGS: ret = copy_regset_from_user(child, &user_aarch32_view, - REGSET_COMPAT_GPR, - 0, sizeof(compat_elf_gregset_t), - datap); + REGSET_COMPAT_GPR, 0, + pr_reg_size, datap); break; case COMPAT_PTRACE_GET_THREAD_AREA: -- 1.8.4.5 On 2016/5/24 8:04, Yury Norov wrote: > to handle ILP32 binaries > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > --- > arch/arm64/kernel/Makefile | 1 + > arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 92 insertions(+) > create mode 100644 arch/arm64/kernel/binfmt_ilp32.c > > diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile > index 6bc9738..9dfdf86 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 \ > ../../arm/kernel/opcodes.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 0000000..a934fd4 > --- /dev/null > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -0,0 +1,91 @@ > +/* > + * Support for ILP32 Linux/aarch64 ELF binaries. > + */ > + > +#include <linux/elfcore-compat.h> > +#include <linux/time.h> > + > +#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_t compat_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 > + > +/* > + * Compat version of cputime_to_compat_timeval, perhaps this > + * should be an inline in <linux/compat.h>. > + */ > +static void cputime_to_compat_timeval(const cputime_t cputime, > + struct compat_timeval *value) > +{ > + struct timeval tv; > + cputime_to_timeval(cputime, &tv); > + value->tv_sec = tv.tv_sec; > + value->tv_usec = tv.tv_usec; > +} > + > +#undef cputime_to_timeval > +#define cputime_to_timeval cputime_to_compat_timeval > + > +/* 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_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) > + > +#ifdef __AARCH64EB__ > +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") > +#else > +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") > +#endif > + > +#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_binfmt init_compat_elf_binfmt > +#define exit_elf_binfmt exit_compat_elf_binfmt > + > +#include "../../../fs/binfmt_elf.c" > ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-05-26 13:49 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-05-26 13:49 UTC (permalink / raw) To: linux-arm-kernel Hi, yury The coredump is usable in our platform. It miss the following definition: +#define compat_elf_greg_t elf_greg_t +#define compat_elf_gregset_t elf_gregset_t And it leads to the wrong register save in core dump. After apply this patch, gdb could debug core dump files. Here is the full patch: From 102624840aa5dacdd1bbfe3b390290f52f530ea2 Mon Sep 17 00:00:00 2001 From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> Date: Thu, 26 May 2016 21:00:16 +0800 Subject: [PATCH hulk-4.1-next] arm64: ilp32: fix coredump issue ILP32 use aarch64 register and 32bit signal struct which means it could not make use of the existing compat_elf_prstatus/elf_prstatus and compat_elf_prpsinfo/elf_prpsinfo. This patch fix this issue by introducing the different compat_elf_greg_t, compat_elf_gregset_t for aarch64 ilp32 and aarch32 el0. Tested pass on huawei's hardware in bigendian. Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> --- arch/arm64/include/asm/elf.h | 14 +++++++------- arch/arm64/kernel/binfmt_elf32.c | 3 +++ arch/arm64/kernel/binfmt_ilp32.c | 8 +++++++- arch/arm64/kernel/ptrace.c | 20 ++++++++++---------- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 0106d18..9019441 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -154,18 +154,18 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp); /* 1GB of VA */ -#define STACK_RND_MASK (is_compat_task() ? \ - 0x7ff >> (PAGE_SHIFT - 12) : \ - 0x3ffff >> (PAGE_SHIFT - 12)) +#define STACK_RND_MASK (is_compat_task() ? \ + 0x7ff >> (PAGE_SHIFT - 12) : \ + 0x3ffff >> (PAGE_SHIFT - 12)) #ifdef CONFIG_COMPAT -#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) +#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) /* 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]; +#define COMPAT_ELF_NGREG 18 +typedef unsigned int compat_a32_elf_greg_t; +typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_ELF_NGREG]; #endif /* CONFIG_COMPAT */ diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c index 7b9b445..f75253c 100644 --- a/arch/arm64/kernel/binfmt_elf32.c +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -31,4 +31,7 @@ struct linux_binprm; extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp); +#define compat_elf_greg_t compat_a32_elf_greg_t +#define compat_elf_gregset_t compat_a32_elf_gregset_t + #include "../../../fs/compat_binfmt_elf.c" diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c index b827a9a..01baf83 100644 --- a/arch/arm64/kernel/binfmt_ilp32.c +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -2,7 +2,9 @@ * Support for ILP32 Linux/aarch64 ELF binaries. */ -#include <linux/elfcore-compat.h> +#include <linux/elf.h> +#include <linux/elfcore.h> +#include <linux/compat.h> #include <linux/time.h> #undef ELF_CLASS @@ -30,9 +32,13 @@ * 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 compat_elf_greg_t elf_greg_t +#define compat_elf_gregset_t elf_gregset_t #define elf_prstatus compat_elf_prstatus #define elf_prpsinfo compat_elf_prpsinfo +#include <linux/elfcore-compat.h> + /* * Compat version of cputime_to_compat_timeval, perhaps this * should be an inline in <linux/compat.h>. diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 5c86135..9784c77 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -913,8 +913,8 @@ static const struct user_regset aarch32_regsets[] = { [REGSET_COMPAT_GPR] = { .core_note_type = NT_PRSTATUS, .n = COMPAT_ELF_NGREG, - .size = sizeof(compat_elf_greg_t), - .align = sizeof(compat_elf_greg_t), + .size = sizeof(compat_a32_elf_greg_t), + .align = sizeof(compat_a32_elf_greg_t), .get = compat_gpr_get, .set = compat_gpr_set }, @@ -947,7 +947,7 @@ static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off, tmp = tsk->mm->start_data; else if (off == COMPAT_PT_TEXT_END_ADDR) tmp = tsk->mm->end_code; - else if (off < sizeof(compat_elf_gregset_t)) + else if (off < sizeof(compat_a32_elf_gregset_t)) return copy_regset_to_user(tsk, &user_aarch32_view, REGSET_COMPAT_GPR, off, sizeof(compat_ulong_t), ret); @@ -968,7 +968,7 @@ static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off, if (off & 3 || off >= COMPAT_USER_SZ) return -EIO; - if (off >= sizeof(compat_elf_gregset_t)) + if (off >= sizeof(compat_a32_elf_gregset_t)) return 0; set_fs(KERNEL_DS); @@ -1116,9 +1116,11 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, unsigned long addr = caddr; unsigned long data = cdata; void __user *datap = compat_ptr(data); + unsigned int pr_reg_size = sizeof(compat_a32_elf_gregset_t); int ret; switch (request) { + case PTRACE_PEEKUSR: ret = compat_ptrace_read_user(child, addr, datap); break; @@ -1130,17 +1132,15 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, case COMPAT_PTRACE_GETREGS: ret = copy_regset_to_user(child, &user_aarch32_view, - REGSET_COMPAT_GPR, - 0, sizeof(compat_elf_gregset_t), - datap); + REGSET_COMPAT_GPR, 0, + pr_reg_size, datap); break; case COMPAT_PTRACE_SETREGS: ret = copy_regset_from_user(child, &user_aarch32_view, - REGSET_COMPAT_GPR, - 0, sizeof(compat_elf_gregset_t), - datap); + REGSET_COMPAT_GPR, 0, + pr_reg_size, datap); break; case COMPAT_PTRACE_GET_THREAD_AREA: -- 1.8.4.5 On 2016/5/24 8:04, Yury Norov wrote: > to handle ILP32 binaries > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > --- > arch/arm64/kernel/Makefile | 1 + > arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 92 insertions(+) > create mode 100644 arch/arm64/kernel/binfmt_ilp32.c > > diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile > index 6bc9738..9dfdf86 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 \ > ../../arm/kernel/opcodes.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 0000000..a934fd4 > --- /dev/null > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -0,0 +1,91 @@ > +/* > + * Support for ILP32 Linux/aarch64 ELF binaries. > + */ > + > +#include <linux/elfcore-compat.h> > +#include <linux/time.h> > + > +#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_t compat_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 > + > +/* > + * Compat version of cputime_to_compat_timeval, perhaps this > + * should be an inline in <linux/compat.h>. > + */ > +static void cputime_to_compat_timeval(const cputime_t cputime, > + struct compat_timeval *value) > +{ > + struct timeval tv; > + cputime_to_timeval(cputime, &tv); > + value->tv_sec = tv.tv_sec; > + value->tv_usec = tv.tv_usec; > +} > + > +#undef cputime_to_timeval > +#define cputime_to_timeval cputime_to_compat_timeval > + > +/* 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_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) > + > +#ifdef __AARCH64EB__ > +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") > +#else > +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") > +#endif > + > +#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_binfmt init_compat_elf_binfmt > +#define exit_elf_binfmt exit_compat_elf_binfmt > + > +#include "../../../fs/binfmt_elf.c" > ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-05-26 13:49 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-05-26 13:49 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Hanjun Guo, Zhangjian (Bamvor) Hi, yury The coredump is usable in our platform. It miss the following definition: +#define compat_elf_greg_t elf_greg_t +#define compat_elf_gregset_t elf_gregset_t And it leads to the wrong register save in core dump. After apply this patch, gdb could debug core dump files. Here is the full patch: From 102624840aa5dacdd1bbfe3b390290f52f530ea2 Mon Sep 17 00:00:00 2001 From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> Date: Thu, 26 May 2016 21:00:16 +0800 Subject: [PATCH hulk-4.1-next] arm64: ilp32: fix coredump issue ILP32 use aarch64 register and 32bit signal struct which means it could not make use of the existing compat_elf_prstatus/elf_prstatus and compat_elf_prpsinfo/elf_prpsinfo. This patch fix this issue by introducing the different compat_elf_greg_t, compat_elf_gregset_t for aarch64 ilp32 and aarch32 el0. Tested pass on huawei's hardware in bigendian. Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> --- arch/arm64/include/asm/elf.h | 14 +++++++------- arch/arm64/kernel/binfmt_elf32.c | 3 +++ arch/arm64/kernel/binfmt_ilp32.c | 8 +++++++- arch/arm64/kernel/ptrace.c | 20 ++++++++++---------- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 0106d18..9019441 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -154,18 +154,18 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp); /* 1GB of VA */ -#define STACK_RND_MASK (is_compat_task() ? \ - 0x7ff >> (PAGE_SHIFT - 12) : \ - 0x3ffff >> (PAGE_SHIFT - 12)) +#define STACK_RND_MASK (is_compat_task() ? \ + 0x7ff >> (PAGE_SHIFT - 12) : \ + 0x3ffff >> (PAGE_SHIFT - 12)) #ifdef CONFIG_COMPAT -#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) +#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) /* 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]; +#define COMPAT_ELF_NGREG 18 +typedef unsigned int compat_a32_elf_greg_t; +typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_ELF_NGREG]; #endif /* CONFIG_COMPAT */ diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c index 7b9b445..f75253c 100644 --- a/arch/arm64/kernel/binfmt_elf32.c +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -31,4 +31,7 @@ struct linux_binprm; extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp); +#define compat_elf_greg_t compat_a32_elf_greg_t +#define compat_elf_gregset_t compat_a32_elf_gregset_t + #include "../../../fs/compat_binfmt_elf.c" diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c index b827a9a..01baf83 100644 --- a/arch/arm64/kernel/binfmt_ilp32.c +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -2,7 +2,9 @@ * Support for ILP32 Linux/aarch64 ELF binaries. */ -#include <linux/elfcore-compat.h> +#include <linux/elf.h> +#include <linux/elfcore.h> +#include <linux/compat.h> #include <linux/time.h> #undef ELF_CLASS @@ -30,9 +32,13 @@ * 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 compat_elf_greg_t elf_greg_t +#define compat_elf_gregset_t elf_gregset_t #define elf_prstatus compat_elf_prstatus #define elf_prpsinfo compat_elf_prpsinfo +#include <linux/elfcore-compat.h> + /* * Compat version of cputime_to_compat_timeval, perhaps this * should be an inline in <linux/compat.h>. diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 5c86135..9784c77 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -913,8 +913,8 @@ static const struct user_regset aarch32_regsets[] = { [REGSET_COMPAT_GPR] = { .core_note_type = NT_PRSTATUS, .n = COMPAT_ELF_NGREG, - .size = sizeof(compat_elf_greg_t), - .align = sizeof(compat_elf_greg_t), + .size = sizeof(compat_a32_elf_greg_t), + .align = sizeof(compat_a32_elf_greg_t), .get = compat_gpr_get, .set = compat_gpr_set }, @@ -947,7 +947,7 @@ static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off, tmp = tsk->mm->start_data; else if (off == COMPAT_PT_TEXT_END_ADDR) tmp = tsk->mm->end_code; - else if (off < sizeof(compat_elf_gregset_t)) + else if (off < sizeof(compat_a32_elf_gregset_t)) return copy_regset_to_user(tsk, &user_aarch32_view, REGSET_COMPAT_GPR, off, sizeof(compat_ulong_t), ret); @@ -968,7 +968,7 @@ static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off, if (off & 3 || off >= COMPAT_USER_SZ) return -EIO; - if (off >= sizeof(compat_elf_gregset_t)) + if (off >= sizeof(compat_a32_elf_gregset_t)) return 0; set_fs(KERNEL_DS); @@ -1116,9 +1116,11 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, unsigned long addr = caddr; unsigned long data = cdata; void __user *datap = compat_ptr(data); + unsigned int pr_reg_size = sizeof(compat_a32_elf_gregset_t); int ret; switch (request) { + case PTRACE_PEEKUSR: ret = compat_ptrace_read_user(child, addr, datap); break; @@ -1130,17 +1132,15 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, case COMPAT_PTRACE_GETREGS: ret = copy_regset_to_user(child, &user_aarch32_view, - REGSET_COMPAT_GPR, - 0, sizeof(compat_elf_gregset_t), - datap); + REGSET_COMPAT_GPR, 0, + pr_reg_size, datap); break; case COMPAT_PTRACE_SETREGS: ret = copy_regset_from_user(child, &user_aarch32_view, - REGSET_COMPAT_GPR, - 0, sizeof(compat_elf_gregset_t), - datap); + REGSET_COMPAT_GPR, 0, + pr_reg_size, datap); break; case COMPAT_PTRACE_GET_THREAD_AREA: -- 1.8.4.5 On 2016/5/24 8:04, Yury Norov wrote: > to handle ILP32 binaries > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > --- > arch/arm64/kernel/Makefile | 1 + > arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 92 insertions(+) > create mode 100644 arch/arm64/kernel/binfmt_ilp32.c > > diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile > index 6bc9738..9dfdf86 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 \ > ../../arm/kernel/opcodes.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 0000000..a934fd4 > --- /dev/null > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -0,0 +1,91 @@ > +/* > + * Support for ILP32 Linux/aarch64 ELF binaries. > + */ > + > +#include <linux/elfcore-compat.h> > +#include <linux/time.h> > + > +#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_t compat_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 > + > +/* > + * Compat version of cputime_to_compat_timeval, perhaps this > + * should be an inline in <linux/compat.h>. > + */ > +static void cputime_to_compat_timeval(const cputime_t cputime, > + struct compat_timeval *value) > +{ > + struct timeval tv; > + cputime_to_timeval(cputime, &tv); > + value->tv_sec = tv.tv_sec; > + value->tv_usec = tv.tv_usec; > +} > + > +#undef cputime_to_timeval > +#define cputime_to_timeval cputime_to_compat_timeval > + > +/* 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_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) > + > +#ifdef __AARCH64EB__ > +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") > +#else > +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") > +#endif > + > +#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_binfmt init_compat_elf_binfmt > +#define exit_elf_binfmt exit_compat_elf_binfmt > + > +#include "../../../fs/binfmt_elf.c" > ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c 2016-05-26 13:49 ` Zhangjian (Bamvor) (?) @ 2016-05-26 21:08 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-26 21:08 UTC (permalink / raw) To: Zhangjian (Bamvor) Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Hanjun Guo On Thu, May 26, 2016 at 09:49:42PM +0800, Zhangjian (Bamvor) wrote: > Hi, yury > > The coredump is usable in our platform. It miss the following definition: > +#define compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > > And it leads to the wrong register save in core dump. After apply this patch, > gdb could debug core dump files. > > Here is the full patch: > From 102624840aa5dacdd1bbfe3b390290f52f530ea2 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Thu, 26 May 2016 21:00:16 +0800 > Subject: [PATCH hulk-4.1-next] arm64: ilp32: fix coredump issue > > ILP32 use aarch64 register and 32bit signal struct which means it > could not make use of the existing compat_elf_prstatus/elf_prstatus > and compat_elf_prpsinfo/elf_prpsinfo. > > This patch fix this issue by introducing the different > compat_elf_greg_t, compat_elf_gregset_t for aarch64 ilp32 and aarch32 > el0. > > Tested pass on huawei's hardware in bigendian. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/elf.h | 14 +++++++------- > arch/arm64/kernel/binfmt_elf32.c | 3 +++ > arch/arm64/kernel/binfmt_ilp32.c | 8 +++++++- > arch/arm64/kernel/ptrace.c | 20 ++++++++++---------- > 4 files changed, 27 insertions(+), 18 deletions(-) > > diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h > index 0106d18..9019441 100644 > --- a/arch/arm64/include/asm/elf.h > +++ b/arch/arm64/include/asm/elf.h > @@ -154,18 +154,18 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, > int uses_interp); > > /* 1GB of VA */ > -#define STACK_RND_MASK (is_compat_task() ? \ > - 0x7ff >> (PAGE_SHIFT - 12) : \ > - 0x3ffff >> (PAGE_SHIFT - 12)) > +#define STACK_RND_MASK (is_compat_task() ? \ > + 0x7ff >> (PAGE_SHIFT - 12) : \ > + 0x3ffff >> (PAGE_SHIFT - 12)) > > #ifdef CONFIG_COMPAT > > -#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > +#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > > /* 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]; > +#define COMPAT_ELF_NGREG 18 > +typedef unsigned int compat_a32_elf_greg_t; > +typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_ELF_NGREG]; > > #endif /* CONFIG_COMPAT */ > > diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c > index 7b9b445..f75253c 100644 > --- a/arch/arm64/kernel/binfmt_elf32.c > +++ b/arch/arm64/kernel/binfmt_elf32.c > @@ -31,4 +31,7 @@ struct linux_binprm; > extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, > int uses_interp); > > +#define compat_elf_greg_t compat_a32_elf_greg_t > +#define compat_elf_gregset_t compat_a32_elf_gregset_t > + > #include "../../../fs/compat_binfmt_elf.c" > diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c > index b827a9a..01baf83 100644 > --- a/arch/arm64/kernel/binfmt_ilp32.c > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -2,7 +2,9 @@ > * Support for ILP32 Linux/aarch64 ELF binaries. > */ > > -#include <linux/elfcore-compat.h> > +#include <linux/elf.h> > +#include <linux/elfcore.h> > +#include <linux/compat.h> > #include <linux/time.h> > > #undef ELF_CLASS > @@ -30,9 +32,13 @@ > * 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 compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > #define elf_prstatus compat_elf_prstatus > #define elf_prpsinfo compat_elf_prpsinfo > > +#include <linux/elfcore-compat.h> > + > /* > * Compat version of cputime_to_compat_timeval, perhaps this > * should be an inline in <linux/compat.h>. > diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c > index 5c86135..9784c77 100644 > --- a/arch/arm64/kernel/ptrace.c > +++ b/arch/arm64/kernel/ptrace.c > @@ -913,8 +913,8 @@ static const struct user_regset aarch32_regsets[] = { > [REGSET_COMPAT_GPR] = { > .core_note_type = NT_PRSTATUS, > .n = COMPAT_ELF_NGREG, > - .size = sizeof(compat_elf_greg_t), > - .align = sizeof(compat_elf_greg_t), > + .size = sizeof(compat_a32_elf_greg_t), > + .align = sizeof(compat_a32_elf_greg_t), > .get = compat_gpr_get, > .set = compat_gpr_set > }, > @@ -947,7 +947,7 @@ static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off, > tmp = tsk->mm->start_data; > else if (off == COMPAT_PT_TEXT_END_ADDR) > tmp = tsk->mm->end_code; > - else if (off < sizeof(compat_elf_gregset_t)) > + else if (off < sizeof(compat_a32_elf_gregset_t)) > return copy_regset_to_user(tsk, &user_aarch32_view, > REGSET_COMPAT_GPR, off, > sizeof(compat_ulong_t), ret); > @@ -968,7 +968,7 @@ static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off, > if (off & 3 || off >= COMPAT_USER_SZ) > return -EIO; > > - if (off >= sizeof(compat_elf_gregset_t)) > + if (off >= sizeof(compat_a32_elf_gregset_t)) > return 0; > > set_fs(KERNEL_DS); > @@ -1116,9 +1116,11 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > unsigned long addr = caddr; > unsigned long data = cdata; > void __user *datap = compat_ptr(data); > + unsigned int pr_reg_size = sizeof(compat_a32_elf_gregset_t); > int ret; > > switch (request) { > + > case PTRACE_PEEKUSR: > ret = compat_ptrace_read_user(child, addr, datap); > break; > @@ -1130,17 +1132,15 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > case COMPAT_PTRACE_GETREGS: > ret = copy_regset_to_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_SETREGS: > ret = copy_regset_from_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_GET_THREAD_AREA: > -- > 1.8.4.5 > > > On 2016/5/24 8:04, Yury Norov wrote: > >to handle ILP32 binaries > > > >Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > >--- > > arch/arm64/kernel/Makefile | 1 + > > arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 92 insertions(+) > > create mode 100644 arch/arm64/kernel/binfmt_ilp32.c > > > >diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile > >index 6bc9738..9dfdf86 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 \ > > ../../arm/kernel/opcodes.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 0000000..a934fd4 > >--- /dev/null > >+++ b/arch/arm64/kernel/binfmt_ilp32.c > >@@ -0,0 +1,91 @@ > >+/* > >+ * Support for ILP32 Linux/aarch64 ELF binaries. > >+ */ > >+ > >+#include <linux/elfcore-compat.h> > >+#include <linux/time.h> > >+ > >+#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_t compat_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 > >+ > >+/* > >+ * Compat version of cputime_to_compat_timeval, perhaps this > >+ * should be an inline in <linux/compat.h>. > >+ */ > >+static void cputime_to_compat_timeval(const cputime_t cputime, > >+ struct compat_timeval *value) > >+{ > >+ struct timeval tv; > >+ cputime_to_timeval(cputime, &tv); > >+ value->tv_sec = tv.tv_sec; > >+ value->tv_usec = tv.tv_usec; > >+} > >+ > >+#undef cputime_to_timeval > >+#define cputime_to_timeval cputime_to_compat_timeval > >+ > >+/* 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_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) > >+ > >+#ifdef __AARCH64EB__ > >+#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") > >+#else > >+#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") > >+#endif > >+ > >+#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_binfmt init_compat_elf_binfmt > >+#define exit_elf_binfmt exit_compat_elf_binfmt > >+ > >+#include "../../../fs/binfmt_elf.c" > > Thank you, I'll apply it ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-05-26 21:08 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-26 21:08 UTC (permalink / raw) To: linux-arm-kernel On Thu, May 26, 2016 at 09:49:42PM +0800, Zhangjian (Bamvor) wrote: > Hi, yury > > The coredump is usable in our platform. It miss the following definition: > +#define compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > > And it leads to the wrong register save in core dump. After apply this patch, > gdb could debug core dump files. > > Here is the full patch: > From 102624840aa5dacdd1bbfe3b390290f52f530ea2 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Thu, 26 May 2016 21:00:16 +0800 > Subject: [PATCH hulk-4.1-next] arm64: ilp32: fix coredump issue > > ILP32 use aarch64 register and 32bit signal struct which means it > could not make use of the existing compat_elf_prstatus/elf_prstatus > and compat_elf_prpsinfo/elf_prpsinfo. > > This patch fix this issue by introducing the different > compat_elf_greg_t, compat_elf_gregset_t for aarch64 ilp32 and aarch32 > el0. > > Tested pass on huawei's hardware in bigendian. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/elf.h | 14 +++++++------- > arch/arm64/kernel/binfmt_elf32.c | 3 +++ > arch/arm64/kernel/binfmt_ilp32.c | 8 +++++++- > arch/arm64/kernel/ptrace.c | 20 ++++++++++---------- > 4 files changed, 27 insertions(+), 18 deletions(-) > > diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h > index 0106d18..9019441 100644 > --- a/arch/arm64/include/asm/elf.h > +++ b/arch/arm64/include/asm/elf.h > @@ -154,18 +154,18 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, > int uses_interp); > > /* 1GB of VA */ > -#define STACK_RND_MASK (is_compat_task() ? \ > - 0x7ff >> (PAGE_SHIFT - 12) : \ > - 0x3ffff >> (PAGE_SHIFT - 12)) > +#define STACK_RND_MASK (is_compat_task() ? \ > + 0x7ff >> (PAGE_SHIFT - 12) : \ > + 0x3ffff >> (PAGE_SHIFT - 12)) > > #ifdef CONFIG_COMPAT > > -#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > +#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > > /* 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]; > +#define COMPAT_ELF_NGREG 18 > +typedef unsigned int compat_a32_elf_greg_t; > +typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_ELF_NGREG]; > > #endif /* CONFIG_COMPAT */ > > diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c > index 7b9b445..f75253c 100644 > --- a/arch/arm64/kernel/binfmt_elf32.c > +++ b/arch/arm64/kernel/binfmt_elf32.c > @@ -31,4 +31,7 @@ struct linux_binprm; > extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, > int uses_interp); > > +#define compat_elf_greg_t compat_a32_elf_greg_t > +#define compat_elf_gregset_t compat_a32_elf_gregset_t > + > #include "../../../fs/compat_binfmt_elf.c" > diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c > index b827a9a..01baf83 100644 > --- a/arch/arm64/kernel/binfmt_ilp32.c > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -2,7 +2,9 @@ > * Support for ILP32 Linux/aarch64 ELF binaries. > */ > > -#include <linux/elfcore-compat.h> > +#include <linux/elf.h> > +#include <linux/elfcore.h> > +#include <linux/compat.h> > #include <linux/time.h> > > #undef ELF_CLASS > @@ -30,9 +32,13 @@ > * 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 compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > #define elf_prstatus compat_elf_prstatus > #define elf_prpsinfo compat_elf_prpsinfo > > +#include <linux/elfcore-compat.h> > + > /* > * Compat version of cputime_to_compat_timeval, perhaps this > * should be an inline in <linux/compat.h>. > diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c > index 5c86135..9784c77 100644 > --- a/arch/arm64/kernel/ptrace.c > +++ b/arch/arm64/kernel/ptrace.c > @@ -913,8 +913,8 @@ static const struct user_regset aarch32_regsets[] = { > [REGSET_COMPAT_GPR] = { > .core_note_type = NT_PRSTATUS, > .n = COMPAT_ELF_NGREG, > - .size = sizeof(compat_elf_greg_t), > - .align = sizeof(compat_elf_greg_t), > + .size = sizeof(compat_a32_elf_greg_t), > + .align = sizeof(compat_a32_elf_greg_t), > .get = compat_gpr_get, > .set = compat_gpr_set > }, > @@ -947,7 +947,7 @@ static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off, > tmp = tsk->mm->start_data; > else if (off == COMPAT_PT_TEXT_END_ADDR) > tmp = tsk->mm->end_code; > - else if (off < sizeof(compat_elf_gregset_t)) > + else if (off < sizeof(compat_a32_elf_gregset_t)) > return copy_regset_to_user(tsk, &user_aarch32_view, > REGSET_COMPAT_GPR, off, > sizeof(compat_ulong_t), ret); > @@ -968,7 +968,7 @@ static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off, > if (off & 3 || off >= COMPAT_USER_SZ) > return -EIO; > > - if (off >= sizeof(compat_elf_gregset_t)) > + if (off >= sizeof(compat_a32_elf_gregset_t)) > return 0; > > set_fs(KERNEL_DS); > @@ -1116,9 +1116,11 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > unsigned long addr = caddr; > unsigned long data = cdata; > void __user *datap = compat_ptr(data); > + unsigned int pr_reg_size = sizeof(compat_a32_elf_gregset_t); > int ret; > > switch (request) { > + > case PTRACE_PEEKUSR: > ret = compat_ptrace_read_user(child, addr, datap); > break; > @@ -1130,17 +1132,15 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > case COMPAT_PTRACE_GETREGS: > ret = copy_regset_to_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_SETREGS: > ret = copy_regset_from_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_GET_THREAD_AREA: > -- > 1.8.4.5 > > > On 2016/5/24 8:04, Yury Norov wrote: > >to handle ILP32 binaries > > > >Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > >--- > > arch/arm64/kernel/Makefile | 1 + > > arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 92 insertions(+) > > create mode 100644 arch/arm64/kernel/binfmt_ilp32.c > > > >diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile > >index 6bc9738..9dfdf86 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 \ > > ../../arm/kernel/opcodes.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 0000000..a934fd4 > >--- /dev/null > >+++ b/arch/arm64/kernel/binfmt_ilp32.c > >@@ -0,0 +1,91 @@ > >+/* > >+ * Support for ILP32 Linux/aarch64 ELF binaries. > >+ */ > >+ > >+#include <linux/elfcore-compat.h> > >+#include <linux/time.h> > >+ > >+#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_t compat_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 > >+ > >+/* > >+ * Compat version of cputime_to_compat_timeval, perhaps this > >+ * should be an inline in <linux/compat.h>. > >+ */ > >+static void cputime_to_compat_timeval(const cputime_t cputime, > >+ struct compat_timeval *value) > >+{ > >+ struct timeval tv; > >+ cputime_to_timeval(cputime, &tv); > >+ value->tv_sec = tv.tv_sec; > >+ value->tv_usec = tv.tv_usec; > >+} > >+ > >+#undef cputime_to_timeval > >+#define cputime_to_timeval cputime_to_compat_timeval > >+ > >+/* 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_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) > >+ > >+#ifdef __AARCH64EB__ > >+#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") > >+#else > >+#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") > >+#endif > >+ > >+#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_binfmt init_compat_elf_binfmt > >+#define exit_elf_binfmt exit_compat_elf_binfmt > >+ > >+#include "../../../fs/binfmt_elf.c" > > Thank you, I'll apply it ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-05-26 21:08 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-26 21:08 UTC (permalink / raw) To: Zhangjian (Bamvor) Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Hanjun Guo On Thu, May 26, 2016 at 09:49:42PM +0800, Zhangjian (Bamvor) wrote: > Hi, yury > > The coredump is usable in our platform. It miss the following definition: > +#define compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > > And it leads to the wrong register save in core dump. After apply this patch, > gdb could debug core dump files. > > Here is the full patch: > From 102624840aa5dacdd1bbfe3b390290f52f530ea2 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Thu, 26 May 2016 21:00:16 +0800 > Subject: [PATCH hulk-4.1-next] arm64: ilp32: fix coredump issue > > ILP32 use aarch64 register and 32bit signal struct which means it > could not make use of the existing compat_elf_prstatus/elf_prstatus > and compat_elf_prpsinfo/elf_prpsinfo. > > This patch fix this issue by introducing the different > compat_elf_greg_t, compat_elf_gregset_t for aarch64 ilp32 and aarch32 > el0. > > Tested pass on huawei's hardware in bigendian. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/elf.h | 14 +++++++------- > arch/arm64/kernel/binfmt_elf32.c | 3 +++ > arch/arm64/kernel/binfmt_ilp32.c | 8 +++++++- > arch/arm64/kernel/ptrace.c | 20 ++++++++++---------- > 4 files changed, 27 insertions(+), 18 deletions(-) > > diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h > index 0106d18..9019441 100644 > --- a/arch/arm64/include/asm/elf.h > +++ b/arch/arm64/include/asm/elf.h > @@ -154,18 +154,18 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, > int uses_interp); > > /* 1GB of VA */ > -#define STACK_RND_MASK (is_compat_task() ? \ > - 0x7ff >> (PAGE_SHIFT - 12) : \ > - 0x3ffff >> (PAGE_SHIFT - 12)) > +#define STACK_RND_MASK (is_compat_task() ? \ > + 0x7ff >> (PAGE_SHIFT - 12) : \ > + 0x3ffff >> (PAGE_SHIFT - 12)) > > #ifdef CONFIG_COMPAT > > -#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > +#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > > /* 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]; > +#define COMPAT_ELF_NGREG 18 > +typedef unsigned int compat_a32_elf_greg_t; > +typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_ELF_NGREG]; > > #endif /* CONFIG_COMPAT */ > > diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c > index 7b9b445..f75253c 100644 > --- a/arch/arm64/kernel/binfmt_elf32.c > +++ b/arch/arm64/kernel/binfmt_elf32.c > @@ -31,4 +31,7 @@ struct linux_binprm; > extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, > int uses_interp); > > +#define compat_elf_greg_t compat_a32_elf_greg_t > +#define compat_elf_gregset_t compat_a32_elf_gregset_t > + > #include "../../../fs/compat_binfmt_elf.c" > diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c > index b827a9a..01baf83 100644 > --- a/arch/arm64/kernel/binfmt_ilp32.c > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -2,7 +2,9 @@ > * Support for ILP32 Linux/aarch64 ELF binaries. > */ > > -#include <linux/elfcore-compat.h> > +#include <linux/elf.h> > +#include <linux/elfcore.h> > +#include <linux/compat.h> > #include <linux/time.h> > > #undef ELF_CLASS > @@ -30,9 +32,13 @@ > * 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 compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > #define elf_prstatus compat_elf_prstatus > #define elf_prpsinfo compat_elf_prpsinfo > > +#include <linux/elfcore-compat.h> > + > /* > * Compat version of cputime_to_compat_timeval, perhaps this > * should be an inline in <linux/compat.h>. > diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c > index 5c86135..9784c77 100644 > --- a/arch/arm64/kernel/ptrace.c > +++ b/arch/arm64/kernel/ptrace.c > @@ -913,8 +913,8 @@ static const struct user_regset aarch32_regsets[] = { > [REGSET_COMPAT_GPR] = { > .core_note_type = NT_PRSTATUS, > .n = COMPAT_ELF_NGREG, > - .size = sizeof(compat_elf_greg_t), > - .align = sizeof(compat_elf_greg_t), > + .size = sizeof(compat_a32_elf_greg_t), > + .align = sizeof(compat_a32_elf_greg_t), > .get = compat_gpr_get, > .set = compat_gpr_set > }, > @@ -947,7 +947,7 @@ static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off, > tmp = tsk->mm->start_data; > else if (off == COMPAT_PT_TEXT_END_ADDR) > tmp = tsk->mm->end_code; > - else if (off < sizeof(compat_elf_gregset_t)) > + else if (off < sizeof(compat_a32_elf_gregset_t)) > return copy_regset_to_user(tsk, &user_aarch32_view, > REGSET_COMPAT_GPR, off, > sizeof(compat_ulong_t), ret); > @@ -968,7 +968,7 @@ static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off, > if (off & 3 || off >= COMPAT_USER_SZ) > return -EIO; > > - if (off >= sizeof(compat_elf_gregset_t)) > + if (off >= sizeof(compat_a32_elf_gregset_t)) > return 0; > > set_fs(KERNEL_DS); > @@ -1116,9 +1116,11 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > unsigned long addr = caddr; > unsigned long data = cdata; > void __user *datap = compat_ptr(data); > + unsigned int pr_reg_size = sizeof(compat_a32_elf_gregset_t); > int ret; > > switch (request) { > + > case PTRACE_PEEKUSR: > ret = compat_ptrace_read_user(child, addr, datap); > break; > @@ -1130,17 +1132,15 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > case COMPAT_PTRACE_GETREGS: > ret = copy_regset_to_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_SETREGS: > ret = copy_regset_from_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_GET_THREAD_AREA: > -- > 1.8.4.5 > > > On 2016/5/24 8:04, Yury Norov wrote: > >to handle ILP32 binaries > > > >Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > >--- > > arch/arm64/kernel/Makefile | 1 + > > arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 92 insertions(+) > > create mode 100644 arch/arm64/kernel/binfmt_ilp32.c > > > >diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile > >index 6bc9738..9dfdf86 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 \ > > ../../arm/kernel/opcodes.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 0000000..a934fd4 > >--- /dev/null > >+++ b/arch/arm64/kernel/binfmt_ilp32.c > >@@ -0,0 +1,91 @@ > >+/* > >+ * Support for ILP32 Linux/aarch64 ELF binaries. > >+ */ > >+ > >+#include <linux/elfcore-compat.h> > >+#include <linux/time.h> > >+ > >+#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_t compat_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 > >+ > >+/* > >+ * Compat version of cputime_to_compat_timeval, perhaps this > >+ * should be an inline in <linux/compat.h>. > >+ */ > >+static void cputime_to_compat_timeval(const cputime_t cputime, > >+ struct compat_timeval *value) > >+{ > >+ struct timeval tv; > >+ cputime_to_timeval(cputime, &tv); > >+ value->tv_sec = tv.tv_sec; > >+ value->tv_usec = tv.tv_usec; > >+} > >+ > >+#undef cputime_to_timeval > >+#define cputime_to_timeval cputime_to_compat_timeval > >+ > >+/* 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_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) > >+ > >+#ifdef __AARCH64EB__ > >+#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") > >+#else > >+#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") > >+#endif > >+ > >+#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_binfmt init_compat_elf_binfmt > >+#define exit_elf_binfmt exit_compat_elf_binfmt > >+ > >+#include "../../../fs/binfmt_elf.c" > > Thank you, I'll apply it ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c 2016-05-26 13:49 ` Zhangjian (Bamvor) (?) @ 2016-06-15 0:40 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-15 0:40 UTC (permalink / raw) To: Zhangjian (Bamvor) Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Hanjun Guo On Thu, May 26, 2016 at 09:49:42PM +0800, Zhangjian (Bamvor) wrote: > Hi, yury > > The coredump is usable in our platform. It miss the following definition: > +#define compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > > And it leads to the wrong register save in core dump. After apply this patch, > gdb could debug core dump files. > > Here is the full patch: > From 102624840aa5dacdd1bbfe3b390290f52f530ea2 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Thu, 26 May 2016 21:00:16 +0800 > Subject: [PATCH hulk-4.1-next] arm64: ilp32: fix coredump issue > > ILP32 use aarch64 register and 32bit signal struct which means it > could not make use of the existing compat_elf_prstatus/elf_prstatus > and compat_elf_prpsinfo/elf_prpsinfo. > > This patch fix this issue by introducing the different > compat_elf_greg_t, compat_elf_gregset_t for aarch64 ilp32 and aarch32 > el0. > > Tested pass on huawei's hardware in bigendian. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/elf.h | 14 +++++++------- > arch/arm64/kernel/binfmt_elf32.c | 3 +++ > arch/arm64/kernel/binfmt_ilp32.c | 8 +++++++- > arch/arm64/kernel/ptrace.c | 20 ++++++++++---------- > 4 files changed, 27 insertions(+), 18 deletions(-) > > diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h > index 0106d18..9019441 100644 > --- a/arch/arm64/include/asm/elf.h > +++ b/arch/arm64/include/asm/elf.h > @@ -154,18 +154,18 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, > int uses_interp); > > /* 1GB of VA */ > -#define STACK_RND_MASK (is_compat_task() ? \ > - 0x7ff >> (PAGE_SHIFT - 12) : \ > - 0x3ffff >> (PAGE_SHIFT - 12)) > +#define STACK_RND_MASK (is_compat_task() ? \ > + 0x7ff >> (PAGE_SHIFT - 12) : \ > + 0x3ffff >> (PAGE_SHIFT - 12)) > > #ifdef CONFIG_COMPAT > > -#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > +#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > > /* 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]; > +#define COMPAT_ELF_NGREG 18 > +typedef unsigned int compat_a32_elf_greg_t; > +typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_ELF_NGREG]; > > #endif /* CONFIG_COMPAT */ > > diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c > index 7b9b445..f75253c 100644 > --- a/arch/arm64/kernel/binfmt_elf32.c > +++ b/arch/arm64/kernel/binfmt_elf32.c > @@ -31,4 +31,7 @@ struct linux_binprm; > extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, > int uses_interp); > > +#define compat_elf_greg_t compat_a32_elf_greg_t > +#define compat_elf_gregset_t compat_a32_elf_gregset_t > + > #include "../../../fs/compat_binfmt_elf.c" > diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c > index b827a9a..01baf83 100644 > --- a/arch/arm64/kernel/binfmt_ilp32.c > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -2,7 +2,9 @@ > * Support for ILP32 Linux/aarch64 ELF binaries. > */ > > -#include <linux/elfcore-compat.h> > +#include <linux/elf.h> > +#include <linux/elfcore.h> > +#include <linux/compat.h> > #include <linux/time.h> > > #undef ELF_CLASS > @@ -30,9 +32,13 @@ > * 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 compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > #define elf_prstatus compat_elf_prstatus > #define elf_prpsinfo compat_elf_prpsinfo > > +#include <linux/elfcore-compat.h> > + > /* > * Compat version of cputime_to_compat_timeval, perhaps this > * should be an inline in <linux/compat.h>. > diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c > index 5c86135..9784c77 100644 > --- a/arch/arm64/kernel/ptrace.c > +++ b/arch/arm64/kernel/ptrace.c > @@ -913,8 +913,8 @@ static const struct user_regset aarch32_regsets[] = { > [REGSET_COMPAT_GPR] = { > .core_note_type = NT_PRSTATUS, > .n = COMPAT_ELF_NGREG, > - .size = sizeof(compat_elf_greg_t), > - .align = sizeof(compat_elf_greg_t), > + .size = sizeof(compat_a32_elf_greg_t), > + .align = sizeof(compat_a32_elf_greg_t), > .get = compat_gpr_get, > .set = compat_gpr_set > }, > @@ -947,7 +947,7 @@ static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off, > tmp = tsk->mm->start_data; > else if (off == COMPAT_PT_TEXT_END_ADDR) > tmp = tsk->mm->end_code; > - else if (off < sizeof(compat_elf_gregset_t)) > + else if (off < sizeof(compat_a32_elf_gregset_t)) > return copy_regset_to_user(tsk, &user_aarch32_view, > REGSET_COMPAT_GPR, off, > sizeof(compat_ulong_t), ret); > @@ -968,7 +968,7 @@ static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off, > if (off & 3 || off >= COMPAT_USER_SZ) > return -EIO; > > - if (off >= sizeof(compat_elf_gregset_t)) > + if (off >= sizeof(compat_a32_elf_gregset_t)) > return 0; > > set_fs(KERNEL_DS); > @@ -1116,9 +1116,11 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > unsigned long addr = caddr; > unsigned long data = cdata; > void __user *datap = compat_ptr(data); > + unsigned int pr_reg_size = sizeof(compat_a32_elf_gregset_t); > int ret; > > switch (request) { > + > case PTRACE_PEEKUSR: > ret = compat_ptrace_read_user(child, addr, datap); > break; > @@ -1130,17 +1132,15 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > case COMPAT_PTRACE_GETREGS: > ret = copy_regset_to_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_SETREGS: > ret = copy_regset_from_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_GET_THREAD_AREA: Hi Bamvor, I didn't work much with ilp32 debugging and coredumps yet, but what I see in your patch is an attempt to use elf_gregset_t in compat_elf_prstatus for ilp32 instead of compat_elf_gregset_t. I think we can do it simpler. That's what pahole shows for binfmt_ilp32.o after applying the attached patch: struct compat_elf_prstatus { struct compat_elf_siginfo pr_info; /* 0 12 */ short int pr_cursig; /* 12 2 */ /* XXX 2 bytes hole, try to pack */ compat_ulong_t pr_sigpend; /* 16 4 */ compat_ulong_t pr_sighold; /* 20 4 */ compat_pid_t pr_pid; /* 24 4 */ compat_pid_t pr_ppid; /* 28 4 */ compat_pid_t pr_pgrp; /* 32 4 */ compat_pid_t pr_sid; /* 36 4 */ struct compat_timeval pr_utime; /* 40 8 */ struct compat_timeval pr_stime; /* 48 8 */ struct compat_timeval pr_cutime; /* 56 8 */ /* --- cacheline 1 boundary (64 bytes) --- */ struct compat_timeval pr_cstime; /* 64 8 */ elf_gregset_t pr_reg; /* 72 272 */ /* --- cacheline 5 boundary (320 bytes) was 24 bytes ago --- */ compat_int_t pr_fpvalid; /* 344 4 */ /* size: 352, cachelines: 6, members: 14 */ /* sum members: 346, holes: 1, sum holes: 2 */ /* padding: 4 */ /* last cacheline: 32 bytes */ }; Did I miss something? --- arch/arm64/include/asm/elf.h | 6 ++++++ arch/arm64/kernel/binfmt_ilp32.c | 1 + 2 files changed, 7 insertions(+) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index a967726..4dcbcec 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -174,10 +174,16 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) +#ifndef USE_AARCH64_GREG /* 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]; +#else /* AArch64 registers for AARCH64/ILP32 */ +#define COMPAT_ELF_NGREG ELF_NGREG +#define compat_elf_greg_t elf_greg_t +#define compat_elf_gregset_t elf_gregset_t +#endif /* AArch32 EABI. */ #define EF_ARM_EABI_MASK 0xff000000 diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c index b2bd590..416b3f5 100644 --- a/arch/arm64/kernel/binfmt_ilp32.c +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -1,6 +1,7 @@ /* * Support for ILP32 Linux/aarch64 ELF binaries. */ +#define USE_AARCH64_GREG #include <linux/elfcore-compat.h> #include <linux/time.h> -- 2.7.4 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-06-15 0:40 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-15 0:40 UTC (permalink / raw) To: linux-arm-kernel On Thu, May 26, 2016 at 09:49:42PM +0800, Zhangjian (Bamvor) wrote: > Hi, yury > > The coredump is usable in our platform. It miss the following definition: > +#define compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > > And it leads to the wrong register save in core dump. After apply this patch, > gdb could debug core dump files. > > Here is the full patch: > From 102624840aa5dacdd1bbfe3b390290f52f530ea2 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Thu, 26 May 2016 21:00:16 +0800 > Subject: [PATCH hulk-4.1-next] arm64: ilp32: fix coredump issue > > ILP32 use aarch64 register and 32bit signal struct which means it > could not make use of the existing compat_elf_prstatus/elf_prstatus > and compat_elf_prpsinfo/elf_prpsinfo. > > This patch fix this issue by introducing the different > compat_elf_greg_t, compat_elf_gregset_t for aarch64 ilp32 and aarch32 > el0. > > Tested pass on huawei's hardware in bigendian. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/elf.h | 14 +++++++------- > arch/arm64/kernel/binfmt_elf32.c | 3 +++ > arch/arm64/kernel/binfmt_ilp32.c | 8 +++++++- > arch/arm64/kernel/ptrace.c | 20 ++++++++++---------- > 4 files changed, 27 insertions(+), 18 deletions(-) > > diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h > index 0106d18..9019441 100644 > --- a/arch/arm64/include/asm/elf.h > +++ b/arch/arm64/include/asm/elf.h > @@ -154,18 +154,18 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, > int uses_interp); > > /* 1GB of VA */ > -#define STACK_RND_MASK (is_compat_task() ? \ > - 0x7ff >> (PAGE_SHIFT - 12) : \ > - 0x3ffff >> (PAGE_SHIFT - 12)) > +#define STACK_RND_MASK (is_compat_task() ? \ > + 0x7ff >> (PAGE_SHIFT - 12) : \ > + 0x3ffff >> (PAGE_SHIFT - 12)) > > #ifdef CONFIG_COMPAT > > -#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > +#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > > /* 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]; > +#define COMPAT_ELF_NGREG 18 > +typedef unsigned int compat_a32_elf_greg_t; > +typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_ELF_NGREG]; > > #endif /* CONFIG_COMPAT */ > > diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c > index 7b9b445..f75253c 100644 > --- a/arch/arm64/kernel/binfmt_elf32.c > +++ b/arch/arm64/kernel/binfmt_elf32.c > @@ -31,4 +31,7 @@ struct linux_binprm; > extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, > int uses_interp); > > +#define compat_elf_greg_t compat_a32_elf_greg_t > +#define compat_elf_gregset_t compat_a32_elf_gregset_t > + > #include "../../../fs/compat_binfmt_elf.c" > diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c > index b827a9a..01baf83 100644 > --- a/arch/arm64/kernel/binfmt_ilp32.c > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -2,7 +2,9 @@ > * Support for ILP32 Linux/aarch64 ELF binaries. > */ > > -#include <linux/elfcore-compat.h> > +#include <linux/elf.h> > +#include <linux/elfcore.h> > +#include <linux/compat.h> > #include <linux/time.h> > > #undef ELF_CLASS > @@ -30,9 +32,13 @@ > * 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 compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > #define elf_prstatus compat_elf_prstatus > #define elf_prpsinfo compat_elf_prpsinfo > > +#include <linux/elfcore-compat.h> > + > /* > * Compat version of cputime_to_compat_timeval, perhaps this > * should be an inline in <linux/compat.h>. > diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c > index 5c86135..9784c77 100644 > --- a/arch/arm64/kernel/ptrace.c > +++ b/arch/arm64/kernel/ptrace.c > @@ -913,8 +913,8 @@ static const struct user_regset aarch32_regsets[] = { > [REGSET_COMPAT_GPR] = { > .core_note_type = NT_PRSTATUS, > .n = COMPAT_ELF_NGREG, > - .size = sizeof(compat_elf_greg_t), > - .align = sizeof(compat_elf_greg_t), > + .size = sizeof(compat_a32_elf_greg_t), > + .align = sizeof(compat_a32_elf_greg_t), > .get = compat_gpr_get, > .set = compat_gpr_set > }, > @@ -947,7 +947,7 @@ static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off, > tmp = tsk->mm->start_data; > else if (off == COMPAT_PT_TEXT_END_ADDR) > tmp = tsk->mm->end_code; > - else if (off < sizeof(compat_elf_gregset_t)) > + else if (off < sizeof(compat_a32_elf_gregset_t)) > return copy_regset_to_user(tsk, &user_aarch32_view, > REGSET_COMPAT_GPR, off, > sizeof(compat_ulong_t), ret); > @@ -968,7 +968,7 @@ static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off, > if (off & 3 || off >= COMPAT_USER_SZ) > return -EIO; > > - if (off >= sizeof(compat_elf_gregset_t)) > + if (off >= sizeof(compat_a32_elf_gregset_t)) > return 0; > > set_fs(KERNEL_DS); > @@ -1116,9 +1116,11 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > unsigned long addr = caddr; > unsigned long data = cdata; > void __user *datap = compat_ptr(data); > + unsigned int pr_reg_size = sizeof(compat_a32_elf_gregset_t); > int ret; > > switch (request) { > + > case PTRACE_PEEKUSR: > ret = compat_ptrace_read_user(child, addr, datap); > break; > @@ -1130,17 +1132,15 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > case COMPAT_PTRACE_GETREGS: > ret = copy_regset_to_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_SETREGS: > ret = copy_regset_from_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_GET_THREAD_AREA: Hi Bamvor, I didn't work much with ilp32 debugging and coredumps yet, but what I see in your patch is an attempt to use elf_gregset_t in compat_elf_prstatus for ilp32 instead of compat_elf_gregset_t. I think we can do it simpler. That's what pahole shows for binfmt_ilp32.o after applying the attached patch: struct compat_elf_prstatus { struct compat_elf_siginfo pr_info; /* 0 12 */ short int pr_cursig; /* 12 2 */ /* XXX 2 bytes hole, try to pack */ compat_ulong_t pr_sigpend; /* 16 4 */ compat_ulong_t pr_sighold; /* 20 4 */ compat_pid_t pr_pid; /* 24 4 */ compat_pid_t pr_ppid; /* 28 4 */ compat_pid_t pr_pgrp; /* 32 4 */ compat_pid_t pr_sid; /* 36 4 */ struct compat_timeval pr_utime; /* 40 8 */ struct compat_timeval pr_stime; /* 48 8 */ struct compat_timeval pr_cutime; /* 56 8 */ /* --- cacheline 1 boundary (64 bytes) --- */ struct compat_timeval pr_cstime; /* 64 8 */ elf_gregset_t pr_reg; /* 72 272 */ /* --- cacheline 5 boundary (320 bytes) was 24 bytes ago --- */ compat_int_t pr_fpvalid; /* 344 4 */ /* size: 352, cachelines: 6, members: 14 */ /* sum members: 346, holes: 1, sum holes: 2 */ /* padding: 4 */ /* last cacheline: 32 bytes */ }; Did I miss something? --- arch/arm64/include/asm/elf.h | 6 ++++++ arch/arm64/kernel/binfmt_ilp32.c | 1 + 2 files changed, 7 insertions(+) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index a967726..4dcbcec 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -174,10 +174,16 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) +#ifndef USE_AARCH64_GREG /* 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]; +#else /* AArch64 registers for AARCH64/ILP32 */ +#define COMPAT_ELF_NGREG ELF_NGREG +#define compat_elf_greg_t elf_greg_t +#define compat_elf_gregset_t elf_gregset_t +#endif /* AArch32 EABI. */ #define EF_ARM_EABI_MASK 0xff000000 diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c index b2bd590..416b3f5 100644 --- a/arch/arm64/kernel/binfmt_ilp32.c +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -1,6 +1,7 @@ /* * Support for ILP32 Linux/aarch64 ELF binaries. */ +#define USE_AARCH64_GREG #include <linux/elfcore-compat.h> #include <linux/time.h> -- 2.7.4 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-06-15 0:40 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-15 0:40 UTC (permalink / raw) To: Zhangjian (Bamvor) Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Hanjun Guo On Thu, May 26, 2016 at 09:49:42PM +0800, Zhangjian (Bamvor) wrote: > Hi, yury > > The coredump is usable in our platform. It miss the following definition: > +#define compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > > And it leads to the wrong register save in core dump. After apply this patch, > gdb could debug core dump files. > > Here is the full patch: > From 102624840aa5dacdd1bbfe3b390290f52f530ea2 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Thu, 26 May 2016 21:00:16 +0800 > Subject: [PATCH hulk-4.1-next] arm64: ilp32: fix coredump issue > > ILP32 use aarch64 register and 32bit signal struct which means it > could not make use of the existing compat_elf_prstatus/elf_prstatus > and compat_elf_prpsinfo/elf_prpsinfo. > > This patch fix this issue by introducing the different > compat_elf_greg_t, compat_elf_gregset_t for aarch64 ilp32 and aarch32 > el0. > > Tested pass on huawei's hardware in bigendian. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/elf.h | 14 +++++++------- > arch/arm64/kernel/binfmt_elf32.c | 3 +++ > arch/arm64/kernel/binfmt_ilp32.c | 8 +++++++- > arch/arm64/kernel/ptrace.c | 20 ++++++++++---------- > 4 files changed, 27 insertions(+), 18 deletions(-) > > diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h > index 0106d18..9019441 100644 > --- a/arch/arm64/include/asm/elf.h > +++ b/arch/arm64/include/asm/elf.h > @@ -154,18 +154,18 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, > int uses_interp); > > /* 1GB of VA */ > -#define STACK_RND_MASK (is_compat_task() ? \ > - 0x7ff >> (PAGE_SHIFT - 12) : \ > - 0x3ffff >> (PAGE_SHIFT - 12)) > +#define STACK_RND_MASK (is_compat_task() ? \ > + 0x7ff >> (PAGE_SHIFT - 12) : \ > + 0x3ffff >> (PAGE_SHIFT - 12)) > > #ifdef CONFIG_COMPAT > > -#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > +#define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) > > /* 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]; > +#define COMPAT_ELF_NGREG 18 > +typedef unsigned int compat_a32_elf_greg_t; > +typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_ELF_NGREG]; > > #endif /* CONFIG_COMPAT */ > > diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c > index 7b9b445..f75253c 100644 > --- a/arch/arm64/kernel/binfmt_elf32.c > +++ b/arch/arm64/kernel/binfmt_elf32.c > @@ -31,4 +31,7 @@ struct linux_binprm; > extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, > int uses_interp); > > +#define compat_elf_greg_t compat_a32_elf_greg_t > +#define compat_elf_gregset_t compat_a32_elf_gregset_t > + > #include "../../../fs/compat_binfmt_elf.c" > diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c > index b827a9a..01baf83 100644 > --- a/arch/arm64/kernel/binfmt_ilp32.c > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -2,7 +2,9 @@ > * Support for ILP32 Linux/aarch64 ELF binaries. > */ > > -#include <linux/elfcore-compat.h> > +#include <linux/elf.h> > +#include <linux/elfcore.h> > +#include <linux/compat.h> > #include <linux/time.h> > > #undef ELF_CLASS > @@ -30,9 +32,13 @@ > * 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 compat_elf_greg_t elf_greg_t > +#define compat_elf_gregset_t elf_gregset_t > #define elf_prstatus compat_elf_prstatus > #define elf_prpsinfo compat_elf_prpsinfo > > +#include <linux/elfcore-compat.h> > + > /* > * Compat version of cputime_to_compat_timeval, perhaps this > * should be an inline in <linux/compat.h>. > diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c > index 5c86135..9784c77 100644 > --- a/arch/arm64/kernel/ptrace.c > +++ b/arch/arm64/kernel/ptrace.c > @@ -913,8 +913,8 @@ static const struct user_regset aarch32_regsets[] = { > [REGSET_COMPAT_GPR] = { > .core_note_type = NT_PRSTATUS, > .n = COMPAT_ELF_NGREG, > - .size = sizeof(compat_elf_greg_t), > - .align = sizeof(compat_elf_greg_t), > + .size = sizeof(compat_a32_elf_greg_t), > + .align = sizeof(compat_a32_elf_greg_t), > .get = compat_gpr_get, > .set = compat_gpr_set > }, > @@ -947,7 +947,7 @@ static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off, > tmp = tsk->mm->start_data; > else if (off == COMPAT_PT_TEXT_END_ADDR) > tmp = tsk->mm->end_code; > - else if (off < sizeof(compat_elf_gregset_t)) > + else if (off < sizeof(compat_a32_elf_gregset_t)) > return copy_regset_to_user(tsk, &user_aarch32_view, > REGSET_COMPAT_GPR, off, > sizeof(compat_ulong_t), ret); > @@ -968,7 +968,7 @@ static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off, > if (off & 3 || off >= COMPAT_USER_SZ) > return -EIO; > > - if (off >= sizeof(compat_elf_gregset_t)) > + if (off >= sizeof(compat_a32_elf_gregset_t)) > return 0; > > set_fs(KERNEL_DS); > @@ -1116,9 +1116,11 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > unsigned long addr = caddr; > unsigned long data = cdata; > void __user *datap = compat_ptr(data); > + unsigned int pr_reg_size = sizeof(compat_a32_elf_gregset_t); > int ret; > > switch (request) { > + > case PTRACE_PEEKUSR: > ret = compat_ptrace_read_user(child, addr, datap); > break; > @@ -1130,17 +1132,15 @@ static long compat_a32_ptrace(struct task_struct *child, compat_long_t request, > case COMPAT_PTRACE_GETREGS: > ret = copy_regset_to_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_SETREGS: > ret = copy_regset_from_user(child, > &user_aarch32_view, > - REGSET_COMPAT_GPR, > - 0, sizeof(compat_elf_gregset_t), > - datap); > + REGSET_COMPAT_GPR, 0, > + pr_reg_size, datap); > break; > > case COMPAT_PTRACE_GET_THREAD_AREA: Hi Bamvor, I didn't work much with ilp32 debugging and coredumps yet, but what I see in your patch is an attempt to use elf_gregset_t in compat_elf_prstatus for ilp32 instead of compat_elf_gregset_t. I think we can do it simpler. That's what pahole shows for binfmt_ilp32.o after applying the attached patch: struct compat_elf_prstatus { struct compat_elf_siginfo pr_info; /* 0 12 */ short int pr_cursig; /* 12 2 */ /* XXX 2 bytes hole, try to pack */ compat_ulong_t pr_sigpend; /* 16 4 */ compat_ulong_t pr_sighold; /* 20 4 */ compat_pid_t pr_pid; /* 24 4 */ compat_pid_t pr_ppid; /* 28 4 */ compat_pid_t pr_pgrp; /* 32 4 */ compat_pid_t pr_sid; /* 36 4 */ struct compat_timeval pr_utime; /* 40 8 */ struct compat_timeval pr_stime; /* 48 8 */ struct compat_timeval pr_cutime; /* 56 8 */ /* --- cacheline 1 boundary (64 bytes) --- */ struct compat_timeval pr_cstime; /* 64 8 */ elf_gregset_t pr_reg; /* 72 272 */ /* --- cacheline 5 boundary (320 bytes) was 24 bytes ago --- */ compat_int_t pr_fpvalid; /* 344 4 */ /* size: 352, cachelines: 6, members: 14 */ /* sum members: 346, holes: 1, sum holes: 2 */ /* padding: 4 */ /* last cacheline: 32 bytes */ }; Did I miss something? --- arch/arm64/include/asm/elf.h | 6 ++++++ arch/arm64/kernel/binfmt_ilp32.c | 1 + 2 files changed, 7 insertions(+) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index a967726..4dcbcec 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -174,10 +174,16 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) +#ifndef USE_AARCH64_GREG /* 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]; +#else /* AArch64 registers for AARCH64/ILP32 */ +#define COMPAT_ELF_NGREG ELF_NGREG +#define compat_elf_greg_t elf_greg_t +#define compat_elf_gregset_t elf_gregset_t +#endif /* AArch32 EABI. */ #define EF_ARM_EABI_MASK 0xff000000 diff --git a/arch/arm64/kernel/binfmt_ilp32.c b/arch/arm64/kernel/binfmt_ilp32.c index b2bd590..416b3f5 100644 --- a/arch/arm64/kernel/binfmt_ilp32.c +++ b/arch/arm64/kernel/binfmt_ilp32.c @@ -1,6 +1,7 @@ /* * Support for ILP32 Linux/aarch64 ELF binaries. */ +#define USE_AARCH64_GREG #include <linux/elfcore-compat.h> #include <linux/time.h> -- 2.7.4 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c 2016-05-24 0:04 ` Yury Norov (?) @ 2016-06-13 3:05 ` Zhangjian (Bamvor) -1 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-13 3:05 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Hanjun Guo, Zhangjian (Bamvor) Hi, Yury On 2016/5/24 8:04, Yury Norov wrote: > to handle ILP32 binaries > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > --- > arch/arm64/kernel/Makefile | 1 + > arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 92 insertions(+) > create mode 100644 arch/arm64/kernel/binfmt_ilp32.c > > diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile > index 6bc9738..9dfdf86 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 \ > ../../arm/kernel/opcodes.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 0000000..a934fd4 > --- /dev/null > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -0,0 +1,91 @@ > +/* > + * Support for ILP32 Linux/aarch64 ELF binaries. > + */ > + > +#include <linux/elfcore-compat.h> > +#include <linux/time.h> > + > +#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_t compat_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 > + > +/* > + * Compat version of cputime_to_compat_timeval, perhaps this > + * should be an inline in <linux/compat.h>. > + */ > +static void cputime_to_compat_timeval(const cputime_t cputime, > + struct compat_timeval *value) > +{ > + struct timeval tv; > + cputime_to_timeval(cputime, &tv); > + value->tv_sec = tv.tv_sec; > + value->tv_usec = tv.tv_usec; > +} > + > +#undef cputime_to_timeval > +#define cputime_to_timeval cputime_to_compat_timeval > + > +/* 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_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) > + > +#ifdef __AARCH64EB__ > +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") > +#else > +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") > +#endif fs/binfmt_elf.c use ELF_PLATFORM instead of the COMPAT one. Should we define ELF_PLATFORM directly? #undef ELF_PLATFORM #ifdef __AARCH64EB__ #define ELF_PLATFORM ("aarch64_be:ilp32") #else #define ELF_PLATFORM ("aarch64:ilp32") #endif Regards Bamvor > + > +#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_binfmt init_compat_elf_binfmt > +#define exit_elf_binfmt exit_compat_elf_binfmt > + > +#include "../../../fs/binfmt_elf.c" > ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-06-13 3:05 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-13 3:05 UTC (permalink / raw) To: linux-arm-kernel Hi, Yury On 2016/5/24 8:04, Yury Norov wrote: > to handle ILP32 binaries > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > --- > arch/arm64/kernel/Makefile | 1 + > arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 92 insertions(+) > create mode 100644 arch/arm64/kernel/binfmt_ilp32.c > > diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile > index 6bc9738..9dfdf86 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 \ > ../../arm/kernel/opcodes.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 0000000..a934fd4 > --- /dev/null > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -0,0 +1,91 @@ > +/* > + * Support for ILP32 Linux/aarch64 ELF binaries. > + */ > + > +#include <linux/elfcore-compat.h> > +#include <linux/time.h> > + > +#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_t compat_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 > + > +/* > + * Compat version of cputime_to_compat_timeval, perhaps this > + * should be an inline in <linux/compat.h>. > + */ > +static void cputime_to_compat_timeval(const cputime_t cputime, > + struct compat_timeval *value) > +{ > + struct timeval tv; > + cputime_to_timeval(cputime, &tv); > + value->tv_sec = tv.tv_sec; > + value->tv_usec = tv.tv_usec; > +} > + > +#undef cputime_to_timeval > +#define cputime_to_timeval cputime_to_compat_timeval > + > +/* 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_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) > + > +#ifdef __AARCH64EB__ > +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") > +#else > +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") > +#endif fs/binfmt_elf.c use ELF_PLATFORM instead of the COMPAT one. Should we define ELF_PLATFORM directly? #undef ELF_PLATFORM #ifdef __AARCH64EB__ #define ELF_PLATFORM ("aarch64_be:ilp32") #else #define ELF_PLATFORM ("aarch64:ilp32") #endif Regards Bamvor > + > +#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_binfmt init_compat_elf_binfmt > +#define exit_elf_binfmt exit_compat_elf_binfmt > + > +#include "../../../fs/binfmt_elf.c" > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-06-13 3:05 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-13 3:05 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Hanjun Guo, Zhangjian (Bamvor) Hi, Yury On 2016/5/24 8:04, Yury Norov wrote: > to handle ILP32 binaries > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > --- > arch/arm64/kernel/Makefile | 1 + > arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 92 insertions(+) > create mode 100644 arch/arm64/kernel/binfmt_ilp32.c > > diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile > index 6bc9738..9dfdf86 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 \ > ../../arm/kernel/opcodes.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 0000000..a934fd4 > --- /dev/null > +++ b/arch/arm64/kernel/binfmt_ilp32.c > @@ -0,0 +1,91 @@ > +/* > + * Support for ILP32 Linux/aarch64 ELF binaries. > + */ > + > +#include <linux/elfcore-compat.h> > +#include <linux/time.h> > + > +#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_t compat_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 > + > +/* > + * Compat version of cputime_to_compat_timeval, perhaps this > + * should be an inline in <linux/compat.h>. > + */ > +static void cputime_to_compat_timeval(const cputime_t cputime, > + struct compat_timeval *value) > +{ > + struct timeval tv; > + cputime_to_timeval(cputime, &tv); > + value->tv_sec = tv.tv_sec; > + value->tv_usec = tv.tv_usec; > +} > + > +#undef cputime_to_timeval > +#define cputime_to_timeval cputime_to_compat_timeval > + > +/* 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_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) > + > +#ifdef __AARCH64EB__ > +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") > +#else > +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") > +#endif fs/binfmt_elf.c use ELF_PLATFORM instead of the COMPAT one. Should we define ELF_PLATFORM directly? #undef ELF_PLATFORM #ifdef __AARCH64EB__ #define ELF_PLATFORM ("aarch64_be:ilp32") #else #define ELF_PLATFORM ("aarch64:ilp32") #endif Regards Bamvor > + > +#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_binfmt init_compat_elf_binfmt > +#define exit_elf_binfmt exit_compat_elf_binfmt > + > +#include "../../../fs/binfmt_elf.c" > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c 2016-06-13 3:05 ` Zhangjian (Bamvor) (?) @ 2016-06-13 13:22 ` Zhangjian (Bamvor) -1 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-13 13:22 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Hanjun Guo, Zhangjian (Bamvor) Hi, again I found another issue in binfmt_ilp32.c. We are using the ELF_ET_DYN_BASE for ilp32 application. The default ELF_ET_DYN_BASE is calculated by TASK_SIZE_64. IIUC, we should define the following things in binfmt_ilp32.c which is the same value as aarch32: +#undef ELF_ET_DYN_BASE +#define ELF_ET_DYN_BASE COMPAT_ELF_ET_DYN_BASE Note that the ilp32 library works without this patch. After read code and debug, the address is corrected in get_unmapped_area. I suspect find_vma fix this wrong address. Ideas? Regards Bamvor On 2016/6/13 11:05, Zhangjian (Bamvor) wrote: > Hi, Yury > > On 2016/5/24 8:04, Yury Norov wrote: >> to handle ILP32 binaries >> >> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> >> --- >> arch/arm64/kernel/Makefile | 1 + >> arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 92 insertions(+) >> create mode 100644 arch/arm64/kernel/binfmt_ilp32.c >> >> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile >> index 6bc9738..9dfdf86 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 \ >> ../../arm/kernel/opcodes.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 0000000..a934fd4 >> --- /dev/null >> +++ b/arch/arm64/kernel/binfmt_ilp32.c >> @@ -0,0 +1,91 @@ >> +/* >> + * Support for ILP32 Linux/aarch64 ELF binaries. >> + */ >> + >> +#include <linux/elfcore-compat.h> >> +#include <linux/time.h> >> + >> +#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_t compat_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 >> + >> +/* >> + * Compat version of cputime_to_compat_timeval, perhaps this >> + * should be an inline in <linux/compat.h>. >> + */ >> +static void cputime_to_compat_timeval(const cputime_t cputime, >> + struct compat_timeval *value) >> +{ >> + struct timeval tv; >> + cputime_to_timeval(cputime, &tv); >> + value->tv_sec = tv.tv_sec; >> + value->tv_usec = tv.tv_usec; >> +} >> + >> +#undef cputime_to_timeval >> +#define cputime_to_timeval cputime_to_compat_timeval >> + >> +/* 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_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) >> + >> +#ifdef __AARCH64EB__ >> +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") >> +#else >> +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") >> +#endif > fs/binfmt_elf.c use ELF_PLATFORM instead of the COMPAT one. Should we define > ELF_PLATFORM directly? > #undef ELF_PLATFORM > #ifdef __AARCH64EB__ > #define ELF_PLATFORM ("aarch64_be:ilp32") > #else > #define ELF_PLATFORM ("aarch64:ilp32") > #endif > > Regards > > Bamvor >> + >> +#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_binfmt init_compat_elf_binfmt >> +#define exit_elf_binfmt exit_compat_elf_binfmt >> + >> +#include "../../../fs/binfmt_elf.c" >> > ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-06-13 13:22 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-13 13:22 UTC (permalink / raw) To: linux-arm-kernel Hi, again I found another issue in binfmt_ilp32.c. We are using the ELF_ET_DYN_BASE for ilp32 application. The default ELF_ET_DYN_BASE is calculated by TASK_SIZE_64. IIUC, we should define the following things in binfmt_ilp32.c which is the same value as aarch32: +#undef ELF_ET_DYN_BASE +#define ELF_ET_DYN_BASE COMPAT_ELF_ET_DYN_BASE Note that the ilp32 library works without this patch. After read code and debug, the address is corrected in get_unmapped_area. I suspect find_vma fix this wrong address. Ideas? Regards Bamvor On 2016/6/13 11:05, Zhangjian (Bamvor) wrote: > Hi, Yury > > On 2016/5/24 8:04, Yury Norov wrote: >> to handle ILP32 binaries >> >> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> >> --- >> arch/arm64/kernel/Makefile | 1 + >> arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 92 insertions(+) >> create mode 100644 arch/arm64/kernel/binfmt_ilp32.c >> >> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile >> index 6bc9738..9dfdf86 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 \ >> ../../arm/kernel/opcodes.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 0000000..a934fd4 >> --- /dev/null >> +++ b/arch/arm64/kernel/binfmt_ilp32.c >> @@ -0,0 +1,91 @@ >> +/* >> + * Support for ILP32 Linux/aarch64 ELF binaries. >> + */ >> + >> +#include <linux/elfcore-compat.h> >> +#include <linux/time.h> >> + >> +#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_t compat_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 >> + >> +/* >> + * Compat version of cputime_to_compat_timeval, perhaps this >> + * should be an inline in <linux/compat.h>. >> + */ >> +static void cputime_to_compat_timeval(const cputime_t cputime, >> + struct compat_timeval *value) >> +{ >> + struct timeval tv; >> + cputime_to_timeval(cputime, &tv); >> + value->tv_sec = tv.tv_sec; >> + value->tv_usec = tv.tv_usec; >> +} >> + >> +#undef cputime_to_timeval >> +#define cputime_to_timeval cputime_to_compat_timeval >> + >> +/* 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_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) >> + >> +#ifdef __AARCH64EB__ >> +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") >> +#else >> +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") >> +#endif > fs/binfmt_elf.c use ELF_PLATFORM instead of the COMPAT one. Should we define > ELF_PLATFORM directly? > #undef ELF_PLATFORM > #ifdef __AARCH64EB__ > #define ELF_PLATFORM ("aarch64_be:ilp32") > #else > #define ELF_PLATFORM ("aarch64:ilp32") > #endif > > Regards > > Bamvor >> + >> +#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_binfmt init_compat_elf_binfmt >> +#define exit_elf_binfmt exit_compat_elf_binfmt >> + >> +#include "../../../fs/binfmt_elf.c" >> > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c @ 2016-06-13 13:22 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-13 13:22 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Hanjun Guo, Zhangjian (Bamvor) Hi, again I found another issue in binfmt_ilp32.c. We are using the ELF_ET_DYN_BASE for ilp32 application. The default ELF_ET_DYN_BASE is calculated by TASK_SIZE_64. IIUC, we should define the following things in binfmt_ilp32.c which is the same value as aarch32: +#undef ELF_ET_DYN_BASE +#define ELF_ET_DYN_BASE COMPAT_ELF_ET_DYN_BASE Note that the ilp32 library works without this patch. After read code and debug, the address is corrected in get_unmapped_area. I suspect find_vma fix this wrong address. Ideas? Regards Bamvor On 2016/6/13 11:05, Zhangjian (Bamvor) wrote: > Hi, Yury > > On 2016/5/24 8:04, Yury Norov wrote: >> to handle ILP32 binaries >> >> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> >> --- >> arch/arm64/kernel/Makefile | 1 + >> arch/arm64/kernel/binfmt_ilp32.c | 91 ++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 92 insertions(+) >> create mode 100644 arch/arm64/kernel/binfmt_ilp32.c >> >> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile >> index 6bc9738..9dfdf86 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 \ >> ../../arm/kernel/opcodes.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 0000000..a934fd4 >> --- /dev/null >> +++ b/arch/arm64/kernel/binfmt_ilp32.c >> @@ -0,0 +1,91 @@ >> +/* >> + * Support for ILP32 Linux/aarch64 ELF binaries. >> + */ >> + >> +#include <linux/elfcore-compat.h> >> +#include <linux/time.h> >> + >> +#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_t compat_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 >> + >> +/* >> + * Compat version of cputime_to_compat_timeval, perhaps this >> + * should be an inline in <linux/compat.h>. >> + */ >> +static void cputime_to_compat_timeval(const cputime_t cputime, >> + struct compat_timeval *value) >> +{ >> + struct timeval tv; >> + cputime_to_timeval(cputime, &tv); >> + value->tv_sec = tv.tv_sec; >> + value->tv_usec = tv.tv_usec; >> +} >> + >> +#undef cputime_to_timeval >> +#define cputime_to_timeval cputime_to_compat_timeval >> + >> +/* 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_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) >> + >> +#ifdef __AARCH64EB__ >> +#define COMPAT_ELF_PLATFORM ("aarch64_be:ilp32") >> +#else >> +#define COMPAT_ELF_PLATFORM ("aarch64:ilp32") >> +#endif > fs/binfmt_elf.c use ELF_PLATFORM instead of the COMPAT one. Should we define > ELF_PLATFORM directly? > #undef ELF_PLATFORM > #ifdef __AARCH64EB__ > #define ELF_PLATFORM ("aarch64_be:ilp32") > #else > #define ELF_PLATFORM ("aarch64:ilp32") > #endif > > Regards > > Bamvor >> + >> +#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_binfmt init_compat_elf_binfmt >> +#define exit_elf_binfmt exit_compat_elf_binfmt >> + >> +#include "../../../fs/binfmt_elf.c" >> > ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 2016-05-24 0:04 ` Yury Norov (?) (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Here new aarch32 ptrace syscall handler is introsuced to avoid run-time detection of the task type. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/unistd32.h | 2 +- arch/arm64/kernel/ptrace.c | 50 ++++++++++++++++++++++++++++++++++++++- arch/arm64/kernel/sys32.c | 1 + include/linux/ptrace.h | 6 +++++ kernel/ptrace.c | 10 ++++---- 5 files changed, 62 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 5b925b7..f57bbe3 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h @@ -74,7 +74,7 @@ __SYSCALL(__NR_getuid, sys_getuid16) /* 25 was sys_stime */ __SYSCALL(25, sys_ni_syscall) #define __NR_ptrace 26 -__SYSCALL(__NR_ptrace, compat_sys_ptrace) +__SYSCALL(__NR_ptrace, compat_sys_aarch32_ptrace) /* 27 was sys_alarm */ __SYSCALL(27, sys_ni_syscall) /* 28 was sys_fstat */ diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 38a09338..a861105 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -29,6 +29,7 @@ #include <linux/user.h> #include <linux/seccomp.h> #include <linux/security.h> +#include <linux/syscalls.h> #include <linux/init.h> #include <linux/signal.h> #include <linux/uaccess.h> @@ -1114,7 +1115,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; @@ -1191,8 +1192,55 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, return ret; } + +COMPAT_SYSCALL_DEFINE4(aarch32_ptrace, compat_long_t, request, compat_long_t, pid, + compat_long_t, addr, compat_long_t, data) +{ + struct task_struct *child; + long ret; + + if (request == PTRACE_TRACEME) { + ret = ptrace_traceme(); + goto out; + } + + child = ptrace_get_task_struct(pid); + if (IS_ERR(child)) { + ret = PTR_ERR(child); + goto out; + } + + if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) { + ret = ptrace_attach(child, request, addr, data); + goto out_put_task_struct; + } + + ret = ptrace_check_attach(child, request == PTRACE_KILL || + request == PTRACE_INTERRUPT); + if (!ret) { + ret = compat_a32_ptrace(child, request, addr, data); + if (ret || request != PTRACE_DETACH) + ptrace_unfreeze_traced(child); + } + + out_put_task_struct: + put_task_struct(child); + out: + return ret; +} + #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) +{ + return compat_ptrace_request(child, request, caddr, cdata); +} + +#endif /* CONFIG_COMPAT */ + const struct user_regset_view *task_user_regset_view(struct task_struct *task) { #ifdef CONFIG_AARCH32_EL0 diff --git a/arch/arm64/kernel/sys32.c b/arch/arm64/kernel/sys32.c index a40b134..3752443 100644 --- a/arch/arm64/kernel/sys32.c +++ b/arch/arm64/kernel/sys32.c @@ -38,6 +38,7 @@ asmlinkage long compat_sys_fadvise64_64_wrapper(void); asmlinkage long compat_sys_sync_file_range2_wrapper(void); asmlinkage long compat_sys_fallocate_wrapper(void); asmlinkage long compat_sys_mmap2_wrapper(void); +asmlinkage long compat_sys_aarch32_ptrace(void); #undef __SYSCALL #define __SYSCALL(nr, sym) [nr] = sym, diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 504c98a..75887a0 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h @@ -97,6 +97,12 @@ int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, unsigned long data); int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, unsigned long data); +int ptrace_traceme(void); +struct task_struct *ptrace_get_task_struct(pid_t pid); +int ptrace_attach(struct task_struct *task, long request, + unsigned long addr, unsigned long flags); +int ptrace_check_attach(struct task_struct *child, bool ignore_state); +void ptrace_unfreeze_traced(struct task_struct *task); /** * ptrace_parent - return the task that is tracing the given task diff --git a/kernel/ptrace.c b/kernel/ptrace.c index d49bfa1..cadf24c 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -136,7 +136,7 @@ static bool ptrace_freeze_traced(struct task_struct *task) return ret; } -static void ptrace_unfreeze_traced(struct task_struct *task) +void ptrace_unfreeze_traced(struct task_struct *task) { if (task->state != __TASK_TRACED) return; @@ -168,7 +168,7 @@ static void ptrace_unfreeze_traced(struct task_struct *task) * RETURNS: * 0 on success, -ESRCH if %child is not ready. */ -static int ptrace_check_attach(struct task_struct *child, bool ignore_state) +int ptrace_check_attach(struct task_struct *child, bool ignore_state) { int ret = -ESRCH; @@ -292,7 +292,7 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode) return !err; } -static int ptrace_attach(struct task_struct *task, long request, +int ptrace_attach(struct task_struct *task, long request, unsigned long addr, unsigned long flags) { @@ -406,7 +406,7 @@ out: * Performs checks and sets PT_PTRACED. * Should be used by all ptrace implementations for PTRACE_TRACEME. */ -static int ptrace_traceme(void) + int ptrace_traceme(void) { int ret = -EPERM; @@ -1056,7 +1056,7 @@ int ptrace_request(struct task_struct *child, long request, return ret; } -static struct task_struct *ptrace_get_task_struct(pid_t pid) +struct task_struct *ptrace_get_task_struct(pid_t pid) { struct task_struct *child; -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel Here new aarch32 ptrace syscall handler is introsuced to avoid run-time detection of the task type. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/unistd32.h | 2 +- arch/arm64/kernel/ptrace.c | 50 ++++++++++++++++++++++++++++++++++++++- arch/arm64/kernel/sys32.c | 1 + include/linux/ptrace.h | 6 +++++ kernel/ptrace.c | 10 ++++---- 5 files changed, 62 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 5b925b7..f57bbe3 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h @@ -74,7 +74,7 @@ __SYSCALL(__NR_getuid, sys_getuid16) /* 25 was sys_stime */ __SYSCALL(25, sys_ni_syscall) #define __NR_ptrace 26 -__SYSCALL(__NR_ptrace, compat_sys_ptrace) +__SYSCALL(__NR_ptrace, compat_sys_aarch32_ptrace) /* 27 was sys_alarm */ __SYSCALL(27, sys_ni_syscall) /* 28 was sys_fstat */ diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 38a09338..a861105 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -29,6 +29,7 @@ #include <linux/user.h> #include <linux/seccomp.h> #include <linux/security.h> +#include <linux/syscalls.h> #include <linux/init.h> #include <linux/signal.h> #include <linux/uaccess.h> @@ -1114,7 +1115,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; @@ -1191,8 +1192,55 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, return ret; } + +COMPAT_SYSCALL_DEFINE4(aarch32_ptrace, compat_long_t, request, compat_long_t, pid, + compat_long_t, addr, compat_long_t, data) +{ + struct task_struct *child; + long ret; + + if (request == PTRACE_TRACEME) { + ret = ptrace_traceme(); + goto out; + } + + child = ptrace_get_task_struct(pid); + if (IS_ERR(child)) { + ret = PTR_ERR(child); + goto out; + } + + if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) { + ret = ptrace_attach(child, request, addr, data); + goto out_put_task_struct; + } + + ret = ptrace_check_attach(child, request == PTRACE_KILL || + request == PTRACE_INTERRUPT); + if (!ret) { + ret = compat_a32_ptrace(child, request, addr, data); + if (ret || request != PTRACE_DETACH) + ptrace_unfreeze_traced(child); + } + + out_put_task_struct: + put_task_struct(child); + out: + return ret; +} + #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) +{ + return compat_ptrace_request(child, request, caddr, cdata); +} + +#endif /* CONFIG_COMPAT */ + const struct user_regset_view *task_user_regset_view(struct task_struct *task) { #ifdef CONFIG_AARCH32_EL0 diff --git a/arch/arm64/kernel/sys32.c b/arch/arm64/kernel/sys32.c index a40b134..3752443 100644 --- a/arch/arm64/kernel/sys32.c +++ b/arch/arm64/kernel/sys32.c @@ -38,6 +38,7 @@ asmlinkage long compat_sys_fadvise64_64_wrapper(void); asmlinkage long compat_sys_sync_file_range2_wrapper(void); asmlinkage long compat_sys_fallocate_wrapper(void); asmlinkage long compat_sys_mmap2_wrapper(void); +asmlinkage long compat_sys_aarch32_ptrace(void); #undef __SYSCALL #define __SYSCALL(nr, sym) [nr] = sym, diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 504c98a..75887a0 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h @@ -97,6 +97,12 @@ int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, unsigned long data); int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, unsigned long data); +int ptrace_traceme(void); +struct task_struct *ptrace_get_task_struct(pid_t pid); +int ptrace_attach(struct task_struct *task, long request, + unsigned long addr, unsigned long flags); +int ptrace_check_attach(struct task_struct *child, bool ignore_state); +void ptrace_unfreeze_traced(struct task_struct *task); /** * ptrace_parent - return the task that is tracing the given task diff --git a/kernel/ptrace.c b/kernel/ptrace.c index d49bfa1..cadf24c 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -136,7 +136,7 @@ static bool ptrace_freeze_traced(struct task_struct *task) return ret; } -static void ptrace_unfreeze_traced(struct task_struct *task) +void ptrace_unfreeze_traced(struct task_struct *task) { if (task->state != __TASK_TRACED) return; @@ -168,7 +168,7 @@ static void ptrace_unfreeze_traced(struct task_struct *task) * RETURNS: * 0 on success, -ESRCH if %child is not ready. */ -static int ptrace_check_attach(struct task_struct *child, bool ignore_state) +int ptrace_check_attach(struct task_struct *child, bool ignore_state) { int ret = -ESRCH; @@ -292,7 +292,7 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode) return !err; } -static int ptrace_attach(struct task_struct *task, long request, +int ptrace_attach(struct task_struct *task, long request, unsigned long addr, unsigned long flags) { @@ -406,7 +406,7 @@ out: * Performs checks and sets PT_PTRACED. * Should be used by all ptrace implementations for PTRACE_TRACEME. */ -static int ptrace_traceme(void) + int ptrace_traceme(void) { int ret = -EPERM; @@ -1056,7 +1056,7 @@ int ptrace_request(struct task_struct *child, long request, return ret; } -static struct task_struct *ptrace_get_task_struct(pid_t pid) +struct task_struct *ptrace_get_task_struct(pid_t pid) { struct task_struct *child; -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Here new aarch32 ptrace syscall handler is introsuced to avoid run-time detection of the task type. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/unistd32.h | 2 +- arch/arm64/kernel/ptrace.c | 50 ++++++++++++++++++++++++++++++++++++++- arch/arm64/kernel/sys32.c | 1 + include/linux/ptrace.h | 6 +++++ kernel/ptrace.c | 10 ++++---- 5 files changed, 62 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 5b925b7..f57bbe3 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h @@ -74,7 +74,7 @@ __SYSCALL(__NR_getuid, sys_getuid16) /* 25 was sys_stime */ __SYSCALL(25, sys_ni_syscall) #define __NR_ptrace 26 -__SYSCALL(__NR_ptrace, compat_sys_ptrace) +__SYSCALL(__NR_ptrace, compat_sys_aarch32_ptrace) /* 27 was sys_alarm */ __SYSCALL(27, sys_ni_syscall) /* 28 was sys_fstat */ diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 38a09338..a861105 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -29,6 +29,7 @@ #include <linux/user.h> #include <linux/seccomp.h> #include <linux/security.h> +#include <linux/syscalls.h> #include <linux/init.h> #include <linux/signal.h> #include <linux/uaccess.h> @@ -1114,7 +1115,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; @@ -1191,8 +1192,55 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, return ret; } + +COMPAT_SYSCALL_DEFINE4(aarch32_ptrace, compat_long_t, request, compat_long_t, pid, + compat_long_t, addr, compat_long_t, data) +{ + struct task_struct *child; + long ret; + + if (request == PTRACE_TRACEME) { + ret = ptrace_traceme(); + goto out; + } + + child = ptrace_get_task_struct(pid); + if (IS_ERR(child)) { + ret = PTR_ERR(child); + goto out; + } + + if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) { + ret = ptrace_attach(child, request, addr, data); + goto out_put_task_struct; + } + + ret = ptrace_check_attach(child, request == PTRACE_KILL || + request == PTRACE_INTERRUPT); + if (!ret) { + ret = compat_a32_ptrace(child, request, addr, data); + if (ret || request != PTRACE_DETACH) + ptrace_unfreeze_traced(child); + } + + out_put_task_struct: + put_task_struct(child); + out: + return ret; +} + #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) +{ + return compat_ptrace_request(child, request, caddr, cdata); +} + +#endif /* CONFIG_COMPAT */ + const struct user_regset_view *task_user_regset_view(struct task_struct *task) { #ifdef CONFIG_AARCH32_EL0 diff --git a/arch/arm64/kernel/sys32.c b/arch/arm64/kernel/sys32.c index a40b134..3752443 100644 --- a/arch/arm64/kernel/sys32.c +++ b/arch/arm64/kernel/sys32.c @@ -38,6 +38,7 @@ asmlinkage long compat_sys_fadvise64_64_wrapper(void); asmlinkage long compat_sys_sync_file_range2_wrapper(void); asmlinkage long compat_sys_fallocate_wrapper(void); asmlinkage long compat_sys_mmap2_wrapper(void); +asmlinkage long compat_sys_aarch32_ptrace(void); #undef __SYSCALL #define __SYSCALL(nr, sym) [nr] = sym, diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 504c98a..75887a0 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h @@ -97,6 +97,12 @@ int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, unsigned long data); int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, unsigned long data); +int ptrace_traceme(void); +struct task_struct *ptrace_get_task_struct(pid_t pid); +int ptrace_attach(struct task_struct *task, long request, + unsigned long addr, unsigned long flags); +int ptrace_check_attach(struct task_struct *child, bool ignore_state); +void ptrace_unfreeze_traced(struct task_struct *task); /** * ptrace_parent - return the task that is tracing the given task diff --git a/kernel/ptrace.c b/kernel/ptrace.c index d49bfa1..cadf24c 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -136,7 +136,7 @@ static bool ptrace_freeze_traced(struct task_struct *task) return ret; } -static void ptrace_unfreeze_traced(struct task_struct *task) +void ptrace_unfreeze_traced(struct task_struct *task) { if (task->state != __TASK_TRACED) return; @@ -168,7 +168,7 @@ static void ptrace_unfreeze_traced(struct task_struct *task) * RETURNS: * 0 on success, -ESRCH if %child is not ready. */ -static int ptrace_check_attach(struct task_struct *child, bool ignore_state) +int ptrace_check_attach(struct task_struct *child, bool ignore_state) { int ret = -ESRCH; @@ -292,7 +292,7 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode) return !err; } -static int ptrace_attach(struct task_struct *task, long request, +int ptrace_attach(struct task_struct *task, long request, unsigned long addr, unsigned long flags) { @@ -406,7 +406,7 @@ out: * Performs checks and sets PT_PTRACED. * Should be used by all ptrace implementations for PTRACE_TRACEME. */ -static int ptrace_traceme(void) + int ptrace_traceme(void) { int ret = -EPERM; @@ -1056,7 +1056,7 @@ int ptrace_request(struct task_struct *child, long request, return ret; } -static struct task_struct *ptrace_get_task_struct(pid_t pid) +struct task_struct *ptrace_get_task_struct(pid_t pid) { struct task_struct *child; -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, ynorov, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner Here new aarch32 ptrace syscall handler is introsuced to avoid run-time detection of the task type. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/unistd32.h | 2 +- arch/arm64/kernel/ptrace.c | 50 ++++++++++++++++++++++++++++++++++++++- arch/arm64/kernel/sys32.c | 1 + include/linux/ptrace.h | 6 +++++ kernel/ptrace.c | 10 ++++---- 5 files changed, 62 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 5b925b7..f57bbe3 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h @@ -74,7 +74,7 @@ __SYSCALL(__NR_getuid, sys_getuid16) /* 25 was sys_stime */ __SYSCALL(25, sys_ni_syscall) #define __NR_ptrace 26 -__SYSCALL(__NR_ptrace, compat_sys_ptrace) +__SYSCALL(__NR_ptrace, compat_sys_aarch32_ptrace) /* 27 was sys_alarm */ __SYSCALL(27, sys_ni_syscall) /* 28 was sys_fstat */ diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 38a09338..a861105 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -29,6 +29,7 @@ #include <linux/user.h> #include <linux/seccomp.h> #include <linux/security.h> +#include <linux/syscalls.h> #include <linux/init.h> #include <linux/signal.h> #include <linux/uaccess.h> @@ -1114,7 +1115,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; @@ -1191,8 +1192,55 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, return ret; } + +COMPAT_SYSCALL_DEFINE4(aarch32_ptrace, compat_long_t, request, compat_long_t, pid, + compat_long_t, addr, compat_long_t, data) +{ + struct task_struct *child; + long ret; + + if (request == PTRACE_TRACEME) { + ret = ptrace_traceme(); + goto out; + } + + child = ptrace_get_task_struct(pid); + if (IS_ERR(child)) { + ret = PTR_ERR(child); + goto out; + } + + if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) { + ret = ptrace_attach(child, request, addr, data); + goto out_put_task_struct; + } + + ret = ptrace_check_attach(child, request == PTRACE_KILL || + request == PTRACE_INTERRUPT); + if (!ret) { + ret = compat_a32_ptrace(child, request, addr, data); + if (ret || request != PTRACE_DETACH) + ptrace_unfreeze_traced(child); + } + + out_put_task_struct: + put_task_struct(child); + out: + return ret; +} + #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) +{ + return compat_ptrace_request(child, request, caddr, cdata); +} + +#endif /* CONFIG_COMPAT */ + const struct user_regset_view *task_user_regset_view(struct task_struct *task) { #ifdef CONFIG_AARCH32_EL0 diff --git a/arch/arm64/kernel/sys32.c b/arch/arm64/kernel/sys32.c index a40b134..3752443 100644 --- a/arch/arm64/kernel/sys32.c +++ b/arch/arm64/kernel/sys32.c @@ -38,6 +38,7 @@ asmlinkage long compat_sys_fadvise64_64_wrapper(void); asmlinkage long compat_sys_sync_file_range2_wrapper(void); asmlinkage long compat_sys_fallocate_wrapper(void); asmlinkage long compat_sys_mmap2_wrapper(void); +asmlinkage long compat_sys_aarch32_ptrace(void); #undef __SYSCALL #define __SYSCALL(nr, sym) [nr] = sym, diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 504c98a..75887a0 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h @@ -97,6 +97,12 @@ int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, unsigned long data); int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, unsigned long data); +int ptrace_traceme(void); +struct task_struct *ptrace_get_task_struct(pid_t pid); +int ptrace_attach(struct task_struct *task, long request, + unsigned long addr, unsigned long flags); +int ptrace_check_attach(struct task_struct *child, bool ignore_state); +void ptrace_unfreeze_traced(struct task_struct *task); /** * ptrace_parent - return the task that is tracing the given task diff --git a/kernel/ptrace.c b/kernel/ptrace.c index d49bfa1..cadf24c 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -136,7 +136,7 @@ static bool ptrace_freeze_traced(struct task_struct *task) return ret; } -static void ptrace_unfreeze_traced(struct task_struct *task) +void ptrace_unfreeze_traced(struct task_struct *task) { if (task->state != __TASK_TRACED) return; @@ -168,7 +168,7 @@ static void ptrace_unfreeze_traced(struct task_struct *task) * RETURNS: * 0 on success, -ESRCH if %child is not ready. */ -static int ptrace_check_attach(struct task_struct *child, bool ignore_state) +int ptrace_check_attach(struct task_struct *child, bool ignore_state) { int ret = -ESRCH; @@ -292,7 +292,7 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode) return !err; } -static int ptrace_attach(struct task_struct *task, long request, +int ptrace_attach(struct task_struct *task, long request, unsigned long addr, unsigned long flags) { @@ -406,7 +406,7 @@ out: * Performs checks and sets PT_PTRACED. * Should be used by all ptrace implementations for PTRACE_TRACEME. */ -static int ptrace_traceme(void) + int ptrace_traceme(void) { int ret = -EPERM; @@ -1056,7 +1056,7 @@ int ptrace_request(struct task_struct *child, long request, return ret; } -static struct task_struct *ptrace_get_task_struct(pid_t pid) +struct task_struct *ptrace_get_task_struct(pid_t pid) { struct task_struct *child; -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 2016-05-24 0:04 ` Yury Norov (?) @ 2016-06-08 1:34 ` zhouchengming -1 siblings, 0 replies; 207+ messages in thread From: zhouchengming @ 2016-06-08 1:34 UTC (permalink / raw) To: Yury Norov Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner On 2016/5/24 8:04, Yury Norov wrote: > Here new aarch32 ptrace syscall handler is introsuced to avoid run-time > detection of the task type. > > Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> > --- > arch/arm64/include/asm/unistd32.h | 2 +- > arch/arm64/kernel/ptrace.c | 50 ++++++++++++++++++++++++++++++++++++++- > arch/arm64/kernel/sys32.c | 1 + > include/linux/ptrace.h | 6 +++++ > kernel/ptrace.c | 10 ++++---- > 5 files changed, 62 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h > index 5b925b7..f57bbe3 100644 > --- a/arch/arm64/include/asm/unistd32.h > +++ b/arch/arm64/include/asm/unistd32.h > @@ -74,7 +74,7 @@ __SYSCALL(__NR_getuid, sys_getuid16) > /* 25 was sys_stime */ > __SYSCALL(25, sys_ni_syscall) > #define __NR_ptrace 26 > -__SYSCALL(__NR_ptrace, compat_sys_ptrace) > +__SYSCALL(__NR_ptrace, compat_sys_aarch32_ptrace) > /* 27 was sys_alarm */ > __SYSCALL(27, sys_ni_syscall) > /* 28 was sys_fstat */ > diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c > index 38a09338..a861105 100644 > --- a/arch/arm64/kernel/ptrace.c > +++ b/arch/arm64/kernel/ptrace.c > @@ -29,6 +29,7 @@ > #include<linux/user.h> > #include<linux/seccomp.h> > #include<linux/security.h> > +#include<linux/syscalls.h> > #include<linux/init.h> > #include<linux/signal.h> > #include<linux/uaccess.h> > @@ -1114,7 +1115,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; > @@ -1191,8 +1192,55 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, > > return ret; > } > + > +COMPAT_SYSCALL_DEFINE4(aarch32_ptrace, compat_long_t, request, compat_long_t, pid, > + compat_long_t, addr, compat_long_t, data) > +{ > + struct task_struct *child; > + long ret; > + > + if (request == PTRACE_TRACEME) { > + ret = ptrace_traceme(); > + goto out; > + } > + > + child = ptrace_get_task_struct(pid); > + if (IS_ERR(child)) { > + ret = PTR_ERR(child); > + goto out; > + } > + > + if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) { > + ret = ptrace_attach(child, request, addr, data); > + goto out_put_task_struct; > + } > + > + ret = ptrace_check_attach(child, request == PTRACE_KILL || > + request == PTRACE_INTERRUPT); > + if (!ret) { > + ret = compat_a32_ptrace(child, request, addr, data); > + if (ret || request != PTRACE_DETACH) > + ptrace_unfreeze_traced(child); > + } > + > + out_put_task_struct: > + put_task_struct(child); > + out: > + return ret; > +} > + > #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) > +{ > + return compat_ptrace_request(child, request, caddr, cdata); > +} > + > +#endif /* CONFIG_COMPAT */ > + > const struct user_regset_view *task_user_regset_view(struct task_struct *task) > { > #ifdef CONFIG_AARCH32_EL0 > diff --git a/arch/arm64/kernel/sys32.c b/arch/arm64/kernel/sys32.c > index a40b134..3752443 100644 > --- a/arch/arm64/kernel/sys32.c > +++ b/arch/arm64/kernel/sys32.c > @@ -38,6 +38,7 @@ asmlinkage long compat_sys_fadvise64_64_wrapper(void); > asmlinkage long compat_sys_sync_file_range2_wrapper(void); > asmlinkage long compat_sys_fallocate_wrapper(void); > asmlinkage long compat_sys_mmap2_wrapper(void); > +asmlinkage long compat_sys_aarch32_ptrace(void); > > #undef __SYSCALL > #define __SYSCALL(nr, sym) [nr] = sym, > diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h > index 504c98a..75887a0 100644 > --- a/include/linux/ptrace.h > +++ b/include/linux/ptrace.h > @@ -97,6 +97,12 @@ int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, > unsigned long data); > int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, > unsigned long data); > +int ptrace_traceme(void); > +struct task_struct *ptrace_get_task_struct(pid_t pid); > +int ptrace_attach(struct task_struct *task, long request, > + unsigned long addr, unsigned long flags); > +int ptrace_check_attach(struct task_struct *child, bool ignore_state); > +void ptrace_unfreeze_traced(struct task_struct *task); > > /** > * ptrace_parent - return the task that is tracing the given task > diff --git a/kernel/ptrace.c b/kernel/ptrace.c > index d49bfa1..cadf24c 100644 > --- a/kernel/ptrace.c > +++ b/kernel/ptrace.c > @@ -136,7 +136,7 @@ static bool ptrace_freeze_traced(struct task_struct *task) > return ret; > } > > -static void ptrace_unfreeze_traced(struct task_struct *task) > +void ptrace_unfreeze_traced(struct task_struct *task) > { > if (task->state != __TASK_TRACED) > return; > @@ -168,7 +168,7 @@ static void ptrace_unfreeze_traced(struct task_struct *task) > * RETURNS: > * 0 on success, -ESRCH if %child is not ready. > */ > -static int ptrace_check_attach(struct task_struct *child, bool ignore_state) > +int ptrace_check_attach(struct task_struct *child, bool ignore_state) > { > int ret = -ESRCH; > > @@ -292,7 +292,7 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode) > return !err; > } > > -static int ptrace_attach(struct task_struct *task, long request, > +int ptrace_attach(struct task_struct *task, long request, > unsigned long addr, > unsigned long flags) > { > @@ -406,7 +406,7 @@ out: > * Performs checks and sets PT_PTRACED. > * Should be used by all ptrace implementations for PTRACE_TRACEME. > */ > -static int ptrace_traceme(void) > + int ptrace_traceme(void) > { > int ret = -EPERM; > > @@ -1056,7 +1056,7 @@ int ptrace_request(struct task_struct *child, long request, > return ret; > } > > -static struct task_struct *ptrace_get_task_struct(pid_t pid) > +struct task_struct *ptrace_get_task_struct(pid_t pid) > { > struct task_struct *child; > Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I write a little patch to see if can solve the problem correctly. Thanks. From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 From: Zhou Chengming <zhouchengming1@huawei.com> Date: Wed, 8 Jun 2016 09:46:23 +0800 Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace When we analyze a testcase of ptrace that failed on ilp32, we found the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. Because in include/uapi/asm-generic/unistd.h it's defined like: __SYSCALL(__NR_ptrace, sys_ptrace) So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), let compat tasks use the compat_sys_ptrace. Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> --- include/uapi/asm-generic/unistd.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 2862d2e..50ee770 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) /* kernel/ptrace.c */ #define __NR_ptrace 117 -__SYSCALL(__NR_ptrace, sys_ptrace) +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) /* kernel/sched/core.c */ #define __NR_sched_setparam 118 -- 1.7.7 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-06-08 1:34 ` zhouchengming 0 siblings, 0 replies; 207+ messages in thread From: zhouchengming @ 2016-06-08 1:34 UTC (permalink / raw) To: linux-arm-kernel On 2016/5/24 8:04, Yury Norov wrote: > Here new aarch32 ptrace syscall handler is introsuced to avoid run-time > detection of the task type. > > Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> > --- > arch/arm64/include/asm/unistd32.h | 2 +- > arch/arm64/kernel/ptrace.c | 50 ++++++++++++++++++++++++++++++++++++++- > arch/arm64/kernel/sys32.c | 1 + > include/linux/ptrace.h | 6 +++++ > kernel/ptrace.c | 10 ++++---- > 5 files changed, 62 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h > index 5b925b7..f57bbe3 100644 > --- a/arch/arm64/include/asm/unistd32.h > +++ b/arch/arm64/include/asm/unistd32.h > @@ -74,7 +74,7 @@ __SYSCALL(__NR_getuid, sys_getuid16) > /* 25 was sys_stime */ > __SYSCALL(25, sys_ni_syscall) > #define __NR_ptrace 26 > -__SYSCALL(__NR_ptrace, compat_sys_ptrace) > +__SYSCALL(__NR_ptrace, compat_sys_aarch32_ptrace) > /* 27 was sys_alarm */ > __SYSCALL(27, sys_ni_syscall) > /* 28 was sys_fstat */ > diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c > index 38a09338..a861105 100644 > --- a/arch/arm64/kernel/ptrace.c > +++ b/arch/arm64/kernel/ptrace.c > @@ -29,6 +29,7 @@ > #include<linux/user.h> > #include<linux/seccomp.h> > #include<linux/security.h> > +#include<linux/syscalls.h> > #include<linux/init.h> > #include<linux/signal.h> > #include<linux/uaccess.h> > @@ -1114,7 +1115,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; > @@ -1191,8 +1192,55 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, > > return ret; > } > + > +COMPAT_SYSCALL_DEFINE4(aarch32_ptrace, compat_long_t, request, compat_long_t, pid, > + compat_long_t, addr, compat_long_t, data) > +{ > + struct task_struct *child; > + long ret; > + > + if (request == PTRACE_TRACEME) { > + ret = ptrace_traceme(); > + goto out; > + } > + > + child = ptrace_get_task_struct(pid); > + if (IS_ERR(child)) { > + ret = PTR_ERR(child); > + goto out; > + } > + > + if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) { > + ret = ptrace_attach(child, request, addr, data); > + goto out_put_task_struct; > + } > + > + ret = ptrace_check_attach(child, request == PTRACE_KILL || > + request == PTRACE_INTERRUPT); > + if (!ret) { > + ret = compat_a32_ptrace(child, request, addr, data); > + if (ret || request != PTRACE_DETACH) > + ptrace_unfreeze_traced(child); > + } > + > + out_put_task_struct: > + put_task_struct(child); > + out: > + return ret; > +} > + > #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) > +{ > + return compat_ptrace_request(child, request, caddr, cdata); > +} > + > +#endif /* CONFIG_COMPAT */ > + > const struct user_regset_view *task_user_regset_view(struct task_struct *task) > { > #ifdef CONFIG_AARCH32_EL0 > diff --git a/arch/arm64/kernel/sys32.c b/arch/arm64/kernel/sys32.c > index a40b134..3752443 100644 > --- a/arch/arm64/kernel/sys32.c > +++ b/arch/arm64/kernel/sys32.c > @@ -38,6 +38,7 @@ asmlinkage long compat_sys_fadvise64_64_wrapper(void); > asmlinkage long compat_sys_sync_file_range2_wrapper(void); > asmlinkage long compat_sys_fallocate_wrapper(void); > asmlinkage long compat_sys_mmap2_wrapper(void); > +asmlinkage long compat_sys_aarch32_ptrace(void); > > #undef __SYSCALL > #define __SYSCALL(nr, sym) [nr] = sym, > diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h > index 504c98a..75887a0 100644 > --- a/include/linux/ptrace.h > +++ b/include/linux/ptrace.h > @@ -97,6 +97,12 @@ int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, > unsigned long data); > int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, > unsigned long data); > +int ptrace_traceme(void); > +struct task_struct *ptrace_get_task_struct(pid_t pid); > +int ptrace_attach(struct task_struct *task, long request, > + unsigned long addr, unsigned long flags); > +int ptrace_check_attach(struct task_struct *child, bool ignore_state); > +void ptrace_unfreeze_traced(struct task_struct *task); > > /** > * ptrace_parent - return the task that is tracing the given task > diff --git a/kernel/ptrace.c b/kernel/ptrace.c > index d49bfa1..cadf24c 100644 > --- a/kernel/ptrace.c > +++ b/kernel/ptrace.c > @@ -136,7 +136,7 @@ static bool ptrace_freeze_traced(struct task_struct *task) > return ret; > } > > -static void ptrace_unfreeze_traced(struct task_struct *task) > +void ptrace_unfreeze_traced(struct task_struct *task) > { > if (task->state != __TASK_TRACED) > return; > @@ -168,7 +168,7 @@ static void ptrace_unfreeze_traced(struct task_struct *task) > * RETURNS: > * 0 on success, -ESRCH if %child is not ready. > */ > -static int ptrace_check_attach(struct task_struct *child, bool ignore_state) > +int ptrace_check_attach(struct task_struct *child, bool ignore_state) > { > int ret = -ESRCH; > > @@ -292,7 +292,7 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode) > return !err; > } > > -static int ptrace_attach(struct task_struct *task, long request, > +int ptrace_attach(struct task_struct *task, long request, > unsigned long addr, > unsigned long flags) > { > @@ -406,7 +406,7 @@ out: > * Performs checks and sets PT_PTRACED. > * Should be used by all ptrace implementations for PTRACE_TRACEME. > */ > -static int ptrace_traceme(void) > + int ptrace_traceme(void) > { > int ret = -EPERM; > > @@ -1056,7 +1056,7 @@ int ptrace_request(struct task_struct *child, long request, > return ret; > } > > -static struct task_struct *ptrace_get_task_struct(pid_t pid) > +struct task_struct *ptrace_get_task_struct(pid_t pid) > { > struct task_struct *child; > Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I write a little patch to see if can solve the problem correctly. Thanks. From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 From: Zhou Chengming <zhouchengming1@huawei.com> Date: Wed, 8 Jun 2016 09:46:23 +0800 Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace When we analyze a testcase of ptrace that failed on ilp32, we found the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. Because in include/uapi/asm-generic/unistd.h it's defined like: __SYSCALL(__NR_ptrace, sys_ptrace) So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), let compat tasks use the compat_sys_ptrace. Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> --- include/uapi/asm-generic/unistd.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 2862d2e..50ee770 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) /* kernel/ptrace.c */ #define __NR_ptrace 117 -__SYSCALL(__NR_ptrace, sys_ptrace) +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) /* kernel/sched/core.c */ #define __NR_sched_setparam 118 -- 1.7.7 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-06-08 1:34 ` zhouchengming 0 siblings, 0 replies; 207+ messages in thread From: zhouchengming @ 2016-06-08 1:34 UTC (permalink / raw) To: Yury Norov Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner On 2016/5/24 8:04, Yury Norov wrote: > Here new aarch32 ptrace syscall handler is introsuced to avoid run-time > detection of the task type. > > Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> > --- > arch/arm64/include/asm/unistd32.h | 2 +- > arch/arm64/kernel/ptrace.c | 50 ++++++++++++++++++++++++++++++++++++++- > arch/arm64/kernel/sys32.c | 1 + > include/linux/ptrace.h | 6 +++++ > kernel/ptrace.c | 10 ++++---- > 5 files changed, 62 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h > index 5b925b7..f57bbe3 100644 > --- a/arch/arm64/include/asm/unistd32.h > +++ b/arch/arm64/include/asm/unistd32.h > @@ -74,7 +74,7 @@ __SYSCALL(__NR_getuid, sys_getuid16) > /* 25 was sys_stime */ > __SYSCALL(25, sys_ni_syscall) > #define __NR_ptrace 26 > -__SYSCALL(__NR_ptrace, compat_sys_ptrace) > +__SYSCALL(__NR_ptrace, compat_sys_aarch32_ptrace) > /* 27 was sys_alarm */ > __SYSCALL(27, sys_ni_syscall) > /* 28 was sys_fstat */ > diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c > index 38a09338..a861105 100644 > --- a/arch/arm64/kernel/ptrace.c > +++ b/arch/arm64/kernel/ptrace.c > @@ -29,6 +29,7 @@ > #include<linux/user.h> > #include<linux/seccomp.h> > #include<linux/security.h> > +#include<linux/syscalls.h> > #include<linux/init.h> > #include<linux/signal.h> > #include<linux/uaccess.h> > @@ -1114,7 +1115,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; > @@ -1191,8 +1192,55 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, > > return ret; > } > + > +COMPAT_SYSCALL_DEFINE4(aarch32_ptrace, compat_long_t, request, compat_long_t, pid, > + compat_long_t, addr, compat_long_t, data) > +{ > + struct task_struct *child; > + long ret; > + > + if (request == PTRACE_TRACEME) { > + ret = ptrace_traceme(); > + goto out; > + } > + > + child = ptrace_get_task_struct(pid); > + if (IS_ERR(child)) { > + ret = PTR_ERR(child); > + goto out; > + } > + > + if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) { > + ret = ptrace_attach(child, request, addr, data); > + goto out_put_task_struct; > + } > + > + ret = ptrace_check_attach(child, request == PTRACE_KILL || > + request == PTRACE_INTERRUPT); > + if (!ret) { > + ret = compat_a32_ptrace(child, request, addr, data); > + if (ret || request != PTRACE_DETACH) > + ptrace_unfreeze_traced(child); > + } > + > + out_put_task_struct: > + put_task_struct(child); > + out: > + return ret; > +} > + > #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) > +{ > + return compat_ptrace_request(child, request, caddr, cdata); > +} > + > +#endif /* CONFIG_COMPAT */ > + > const struct user_regset_view *task_user_regset_view(struct task_struct *task) > { > #ifdef CONFIG_AARCH32_EL0 > diff --git a/arch/arm64/kernel/sys32.c b/arch/arm64/kernel/sys32.c > index a40b134..3752443 100644 > --- a/arch/arm64/kernel/sys32.c > +++ b/arch/arm64/kernel/sys32.c > @@ -38,6 +38,7 @@ asmlinkage long compat_sys_fadvise64_64_wrapper(void); > asmlinkage long compat_sys_sync_file_range2_wrapper(void); > asmlinkage long compat_sys_fallocate_wrapper(void); > asmlinkage long compat_sys_mmap2_wrapper(void); > +asmlinkage long compat_sys_aarch32_ptrace(void); > > #undef __SYSCALL > #define __SYSCALL(nr, sym) [nr] = sym, > diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h > index 504c98a..75887a0 100644 > --- a/include/linux/ptrace.h > +++ b/include/linux/ptrace.h > @@ -97,6 +97,12 @@ int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, > unsigned long data); > int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, > unsigned long data); > +int ptrace_traceme(void); > +struct task_struct *ptrace_get_task_struct(pid_t pid); > +int ptrace_attach(struct task_struct *task, long request, > + unsigned long addr, unsigned long flags); > +int ptrace_check_attach(struct task_struct *child, bool ignore_state); > +void ptrace_unfreeze_traced(struct task_struct *task); > > /** > * ptrace_parent - return the task that is tracing the given task > diff --git a/kernel/ptrace.c b/kernel/ptrace.c > index d49bfa1..cadf24c 100644 > --- a/kernel/ptrace.c > +++ b/kernel/ptrace.c > @@ -136,7 +136,7 @@ static bool ptrace_freeze_traced(struct task_struct *task) > return ret; > } > > -static void ptrace_unfreeze_traced(struct task_struct *task) > +void ptrace_unfreeze_traced(struct task_struct *task) > { > if (task->state != __TASK_TRACED) > return; > @@ -168,7 +168,7 @@ static void ptrace_unfreeze_traced(struct task_struct *task) > * RETURNS: > * 0 on success, -ESRCH if %child is not ready. > */ > -static int ptrace_check_attach(struct task_struct *child, bool ignore_state) > +int ptrace_check_attach(struct task_struct *child, bool ignore_state) > { > int ret = -ESRCH; > > @@ -292,7 +292,7 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode) > return !err; > } > > -static int ptrace_attach(struct task_struct *task, long request, > +int ptrace_attach(struct task_struct *task, long request, > unsigned long addr, > unsigned long flags) > { > @@ -406,7 +406,7 @@ out: > * Performs checks and sets PT_PTRACED. > * Should be used by all ptrace implementations for PTRACE_TRACEME. > */ > -static int ptrace_traceme(void) > + int ptrace_traceme(void) > { > int ret = -EPERM; > > @@ -1056,7 +1056,7 @@ int ptrace_request(struct task_struct *child, long request, > return ret; > } > > -static struct task_struct *ptrace_get_task_struct(pid_t pid) > +struct task_struct *ptrace_get_task_struct(pid_t pid) > { > struct task_struct *child; > Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I write a little patch to see if can solve the problem correctly. Thanks. From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 From: Zhou Chengming <zhouchengming1@huawei.com> Date: Wed, 8 Jun 2016 09:46:23 +0800 Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace When we analyze a testcase of ptrace that failed on ilp32, we found the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. Because in include/uapi/asm-generic/unistd.h it's defined like: __SYSCALL(__NR_ptrace, sys_ptrace) So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), let compat tasks use the compat_sys_ptrace. Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> --- include/uapi/asm-generic/unistd.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 2862d2e..50ee770 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) /* kernel/ptrace.c */ #define __NR_ptrace 117 -__SYSCALL(__NR_ptrace, sys_ptrace) +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) /* kernel/sched/core.c */ #define __NR_sched_setparam 118 -- 1.7.7 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 2016-06-08 1:34 ` zhouchengming (?) @ 2016-06-08 17:00 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-08 17:00 UTC (permalink / raw) To: zhouchengming Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner On Wed, Jun 08, 2016 at 09:34:09AM +0800, zhouchengming wrote: > On 2016/5/24 8:04, Yury Norov wrote: > >Here new aarch32 ptrace syscall handler is introsuced to avoid run-time > >detection of the task type. > > > >Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> [...] > Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I write > a little patch to see if can solve the problem correctly. > > Thanks. > > From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 > From: Zhou Chengming <zhouchengming1@huawei.com> > Date: Wed, 8 Jun 2016 09:46:23 +0800 > Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace > > When we analyze a testcase of ptrace that failed on ilp32, we found > the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. > Because in include/uapi/asm-generic/unistd.h it's defined like: > __SYSCALL(__NR_ptrace, sys_ptrace) > So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), > let compat tasks use the compat_sys_ptrace. > > Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> > --- > include/uapi/asm-generic/unistd.h | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/include/uapi/asm-generic/unistd.h > b/include/uapi/asm-generic/unistd.h > index 2862d2e..50ee770 100644 > --- a/include/uapi/asm-generic/unistd.h > +++ b/include/uapi/asm-generic/unistd.h > @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) > > /* kernel/ptrace.c */ > #define __NR_ptrace 117 > -__SYSCALL(__NR_ptrace, sys_ptrace) > +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) > > /* kernel/sched/core.c */ > #define __NR_sched_setparam 118 > -- > 1.7.7 > Hi Zhou, Thank you for the catch. Could you also show the test that is failed for you. It should probably be sent to LTP maillist. I'm not sure your fix correct as it affects other architectures that use standard unistd.h. I think it's better to redirect the syscall in arch/arm64/kernel/sys_ilp32.c with corresponding definition. Yury ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-06-08 17:00 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-08 17:00 UTC (permalink / raw) To: linux-arm-kernel On Wed, Jun 08, 2016 at 09:34:09AM +0800, zhouchengming wrote: > On 2016/5/24 8:04, Yury Norov wrote: > >Here new aarch32 ptrace syscall handler is introsuced to avoid run-time > >detection of the task type. > > > >Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> [...] > Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I write > a little patch to see if can solve the problem correctly. > > Thanks. > > From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 > From: Zhou Chengming <zhouchengming1@huawei.com> > Date: Wed, 8 Jun 2016 09:46:23 +0800 > Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace > > When we analyze a testcase of ptrace that failed on ilp32, we found > the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. > Because in include/uapi/asm-generic/unistd.h it's defined like: > __SYSCALL(__NR_ptrace, sys_ptrace) > So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), > let compat tasks use the compat_sys_ptrace. > > Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> > --- > include/uapi/asm-generic/unistd.h | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/include/uapi/asm-generic/unistd.h > b/include/uapi/asm-generic/unistd.h > index 2862d2e..50ee770 100644 > --- a/include/uapi/asm-generic/unistd.h > +++ b/include/uapi/asm-generic/unistd.h > @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) > > /* kernel/ptrace.c */ > #define __NR_ptrace 117 > -__SYSCALL(__NR_ptrace, sys_ptrace) > +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) > > /* kernel/sched/core.c */ > #define __NR_sched_setparam 118 > -- > 1.7.7 > Hi Zhou, Thank you for the catch. Could you also show the test that is failed for you. It should probably be sent to LTP maillist. I'm not sure your fix correct as it affects other architectures that use standard unistd.h. I think it's better to redirect the syscall in arch/arm64/kernel/sys_ilp32.c with corresponding definition. Yury ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-06-08 17:00 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-08 17:00 UTC (permalink / raw) To: zhouchengming Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner On Wed, Jun 08, 2016 at 09:34:09AM +0800, zhouchengming wrote: > On 2016/5/24 8:04, Yury Norov wrote: > >Here new aarch32 ptrace syscall handler is introsuced to avoid run-time > >detection of the task type. > > > >Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> [...] > Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I write > a little patch to see if can solve the problem correctly. > > Thanks. > > From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 > From: Zhou Chengming <zhouchengming1@huawei.com> > Date: Wed, 8 Jun 2016 09:46:23 +0800 > Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace > > When we analyze a testcase of ptrace that failed on ilp32, we found > the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. > Because in include/uapi/asm-generic/unistd.h it's defined like: > __SYSCALL(__NR_ptrace, sys_ptrace) > So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), > let compat tasks use the compat_sys_ptrace. > > Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> > --- > include/uapi/asm-generic/unistd.h | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/include/uapi/asm-generic/unistd.h > b/include/uapi/asm-generic/unistd.h > index 2862d2e..50ee770 100644 > --- a/include/uapi/asm-generic/unistd.h > +++ b/include/uapi/asm-generic/unistd.h > @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) > > /* kernel/ptrace.c */ > #define __NR_ptrace 117 > -__SYSCALL(__NR_ptrace, sys_ptrace) > +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) > > /* kernel/sched/core.c */ > #define __NR_sched_setparam 118 > -- > 1.7.7 > Hi Zhou, Thank you for the catch. Could you also show the test that is failed for you. It should probably be sent to LTP maillist. I'm not sure your fix correct as it affects other architectures that use standard unistd.h. I think it's better to redirect the syscall in arch/arm64/kernel/sys_ilp32.c with corresponding definition. Yury ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 2016-06-08 17:00 ` Yury Norov (?) @ 2016-06-25 9:36 ` zhouchengming -1 siblings, 0 replies; 207+ messages in thread From: zhouchengming @ 2016-06-25 9:36 UTC (permalink / raw) To: Yury Norov Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner [-- Attachment #1: Type: text/plain, Size: 3429 bytes --] On 2016/6/9 1:00, Yury Norov wrote: > On Wed, Jun 08, 2016 at 09:34:09AM +0800, zhouchengming wrote: >> On 2016/5/24 8:04, Yury Norov wrote: >>> Here new aarch32 ptrace syscall handler is introsuced to avoid run-time >>> detection of the task type. >>> >>> Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> > > [...] > >> Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I write >> a little patch to see if can solve the problem correctly. >> >> Thanks. >> >> From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 >> From: Zhou Chengming<zhouchengming1@huawei.com> >> Date: Wed, 8 Jun 2016 09:46:23 +0800 >> Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace >> >> When we analyze a testcase of ptrace that failed on ilp32, we found >> the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. >> Because in include/uapi/asm-generic/unistd.h it's defined like: >> __SYSCALL(__NR_ptrace, sys_ptrace) >> So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), >> let compat tasks use the compat_sys_ptrace. >> >> Signed-off-by: Zhou Chengming<zhouchengming1@huawei.com> >> --- >> include/uapi/asm-generic/unistd.h | 2 +- >> 1 files changed, 1 insertions(+), 1 deletions(-) >> >> diff --git a/include/uapi/asm-generic/unistd.h >> b/include/uapi/asm-generic/unistd.h >> index 2862d2e..50ee770 100644 >> --- a/include/uapi/asm-generic/unistd.h >> +++ b/include/uapi/asm-generic/unistd.h >> @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) >> >> /* kernel/ptrace.c */ >> #define __NR_ptrace 117 >> -__SYSCALL(__NR_ptrace, sys_ptrace) >> +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) >> >> /* kernel/sched/core.c */ >> #define __NR_sched_setparam 118 >> -- >> 1.7.7 >> > > Hi Zhou, > > Thank you for the catch. > > Could you also show the test that is failed for you. It should > probably be sent to LTP maillist. > > I'm not sure your fix correct as it affects other architectures that > use standard unistd.h. I think it's better to redirect the syscall in > arch/arm64/kernel/sys_ilp32.c with corresponding definition. > > Yury > > . > Sorry, I missed this mail. Thanks for your reply. :) I attach the testcase file of ptrace that failed on ilp32. I also think it's better to redirect the syscall in ilp32, so I changed the patch. From 7e692ba1adf02c2a2f125836f5222f455c9ffe56 Mon Sep 17 00:00:00 2001 From: Zhou Chengming <zhouchengming1@huawei.com> Date: Sat, 25 Jun 2016 18:02:51 +0800 Subject: [PATCH] ilp32 should use compat_sys_ptrace The file include/uapi/asm-generic/unistd.h defines this: __SYSCALL(__NR_ptrace, sys_ptrace) It may cause some ptrace tests failed on ilp32. So we redirect the ptrace syscall in arch/arm64/kernel/sys_ilp32.c with corresponding definition. Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> --- arch/arm64/kernel/sys_ilp32.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c index d85fe94..06d5e1b 100644 --- a/arch/arm64/kernel/sys_ilp32.c +++ b/arch/arm64/kernel/sys_ilp32.c @@ -46,6 +46,9 @@ asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); #define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper +/* ilp32 should use compat_sys_ptrace */ +#define sys_ptrace compat_sys_ptrace + #include <asm/syscall.h> #undef __SYSCALL -- 1.7.7 [-- Attachment #2: tc_ptrace_setoptions_09.c --] [-- Type: text/plain, Size: 2878 bytes --] #include <stdio.h> #include <stdlib.h> #include <sys/ptrace.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/user.h> #include <signal.h> int main() { pid_t child; unsigned long exit_status; int status; int is_get_event = 0; long ptrace_ret; int result = SIGTRAP | (PTRACE_EVENT_EXIT<<8); child = fork(); if(child < 0) { printf("fork error\n"); exit(1); } else if(child == 0) { sleep(1); exit(127); } else { ptrace_ret = ptrace(PTRACE_ATTACH, child, NULL, NULL); if(ptrace_ret != 0) { printf("ptrace PTRACE_ATTACH error %d \n", errno); exit(1); } printf("ATTACH SUCCESS\n"); sleep(1); ptrace_ret = ptrace(PTRACE_SETOPTIONS, child, NULL, PTRACE_O_TRACEEXIT); if(ptrace_ret != 0) { printf("ptrace PTRACE_SETOPTIONS PTRACE_O_TRACEFORK error %d \n", errno); ptrace(PTRACE_DETACH, child, NULL, NULL); exit(1); } printf("SETOPTIONS SUCCESS!\n"); while(1) { usleep(1); pid_t pid; if ((pid = wait(&status)) == -1) { perror("wait"); exit(1); }; printf("pid : %d\n", pid); printf("the child process stops. status: %d, signal? %d, exit? %d, continue? %d, stop? %d\n" , WEXITSTATUS(status) , WIFSIGNALED(status) , WIFEXITED(status) , WIFCONTINUED(status) ,WIFSTOPPED(status)); if (WSTOPSIG(status) == SIGTRAP) { printf("status : %d\n", status>>8); if (status>>8 == result) { if (ptrace(PTRACE_GETEVENTMSG, child, NULL, &exit_status)) { perror("error geteventmsg"); exit(1); } printf("exit_status %d\n", WEXITSTATUS((int)exit_status)); exit_status = WEXITSTATUS(exit_status); if (exit_status != 127) { printf("exit status is not equal with 127!\n"); exit(1); } is_get_event = 1; } } if (WIFEXITED(status)) { printf("child exit!\n"); break; } if(ptrace(PTRACE_CONT, pid, NULL, (void *) SIGCONT)) { printf("ptrace cont %d error %d\n", pid, errno); exit(1); } } if (is_get_event) exit(0); else exit(1); } } ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-06-25 9:36 ` zhouchengming 0 siblings, 0 replies; 207+ messages in thread From: zhouchengming @ 2016-06-25 9:36 UTC (permalink / raw) To: linux-arm-kernel On 2016/6/9 1:00, Yury Norov wrote: > On Wed, Jun 08, 2016 at 09:34:09AM +0800, zhouchengming wrote: >> On 2016/5/24 8:04, Yury Norov wrote: >>> Here new aarch32 ptrace syscall handler is introsuced to avoid run-time >>> detection of the task type. >>> >>> Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> > > [...] > >> Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I write >> a little patch to see if can solve the problem correctly. >> >> Thanks. >> >> From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 >> From: Zhou Chengming<zhouchengming1@huawei.com> >> Date: Wed, 8 Jun 2016 09:46:23 +0800 >> Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace >> >> When we analyze a testcase of ptrace that failed on ilp32, we found >> the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. >> Because in include/uapi/asm-generic/unistd.h it's defined like: >> __SYSCALL(__NR_ptrace, sys_ptrace) >> So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), >> let compat tasks use the compat_sys_ptrace. >> >> Signed-off-by: Zhou Chengming<zhouchengming1@huawei.com> >> --- >> include/uapi/asm-generic/unistd.h | 2 +- >> 1 files changed, 1 insertions(+), 1 deletions(-) >> >> diff --git a/include/uapi/asm-generic/unistd.h >> b/include/uapi/asm-generic/unistd.h >> index 2862d2e..50ee770 100644 >> --- a/include/uapi/asm-generic/unistd.h >> +++ b/include/uapi/asm-generic/unistd.h >> @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) >> >> /* kernel/ptrace.c */ >> #define __NR_ptrace 117 >> -__SYSCALL(__NR_ptrace, sys_ptrace) >> +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) >> >> /* kernel/sched/core.c */ >> #define __NR_sched_setparam 118 >> -- >> 1.7.7 >> > > Hi Zhou, > > Thank you for the catch. > > Could you also show the test that is failed for you. It should > probably be sent to LTP maillist. > > I'm not sure your fix correct as it affects other architectures that > use standard unistd.h. I think it's better to redirect the syscall in > arch/arm64/kernel/sys_ilp32.c with corresponding definition. > > Yury > > . > Sorry, I missed this mail. Thanks for your reply. :) I attach the testcase file of ptrace that failed on ilp32. I also think it's better to redirect the syscall in ilp32, so I changed the patch. From 7e692ba1adf02c2a2f125836f5222f455c9ffe56 Mon Sep 17 00:00:00 2001 From: Zhou Chengming <zhouchengming1@huawei.com> Date: Sat, 25 Jun 2016 18:02:51 +0800 Subject: [PATCH] ilp32 should use compat_sys_ptrace The file include/uapi/asm-generic/unistd.h defines this: __SYSCALL(__NR_ptrace, sys_ptrace) It may cause some ptrace tests failed on ilp32. So we redirect the ptrace syscall in arch/arm64/kernel/sys_ilp32.c with corresponding definition. Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> --- arch/arm64/kernel/sys_ilp32.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c index d85fe94..06d5e1b 100644 --- a/arch/arm64/kernel/sys_ilp32.c +++ b/arch/arm64/kernel/sys_ilp32.c @@ -46,6 +46,9 @@ asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); #define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper +/* ilp32 should use compat_sys_ptrace */ +#define sys_ptrace compat_sys_ptrace + #include <asm/syscall.h> #undef __SYSCALL -- 1.7.7 -------------- next part -------------- #include <stdio.h> #include <stdlib.h> #include <sys/ptrace.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/user.h> #include <signal.h> int main() { pid_t child; unsigned long exit_status; int status; int is_get_event = 0; long ptrace_ret; int result = SIGTRAP | (PTRACE_EVENT_EXIT<<8); child = fork(); if(child < 0) { printf("fork error\n"); exit(1); } else if(child == 0) { sleep(1); exit(127); } else { ptrace_ret = ptrace(PTRACE_ATTACH, child, NULL, NULL); if(ptrace_ret != 0) { printf("ptrace PTRACE_ATTACH error %d \n", errno); exit(1); } printf("ATTACH SUCCESS\n"); sleep(1); ptrace_ret = ptrace(PTRACE_SETOPTIONS, child, NULL, PTRACE_O_TRACEEXIT); if(ptrace_ret != 0) { printf("ptrace PTRACE_SETOPTIONS PTRACE_O_TRACEFORK error %d \n", errno); ptrace(PTRACE_DETACH, child, NULL, NULL); exit(1); } printf("SETOPTIONS SUCCESS!\n"); while(1) { usleep(1); pid_t pid; if ((pid = wait(&status)) == -1) { perror("wait"); exit(1); }; printf("pid : %d\n", pid); printf("the child process stops. status: %d, signal? %d, exit? %d, continue? %d, stop? %d\n" , WEXITSTATUS(status) , WIFSIGNALED(status) , WIFEXITED(status) , WIFCONTINUED(status) ,WIFSTOPPED(status)); if (WSTOPSIG(status) == SIGTRAP) { printf("status : %d\n", status>>8); if (status>>8 == result) { if (ptrace(PTRACE_GETEVENTMSG, child, NULL, &exit_status)) { perror("error geteventmsg"); exit(1); } printf("exit_status %d\n", WEXITSTATUS((int)exit_status)); exit_status = WEXITSTATUS(exit_status); if (exit_status != 127) { printf("exit status is not equal with 127!\n"); exit(1); } is_get_event = 1; } } if (WIFEXITED(status)) { printf("child exit!\n"); break; } if(ptrace(PTRACE_CONT, pid, NULL, (void *) SIGCONT)) { printf("ptrace cont %d error %d\n", pid, errno); exit(1); } } if (is_get_event) exit(0); else exit(1); } } ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-06-25 9:36 ` zhouchengming 0 siblings, 0 replies; 207+ messages in thread From: zhouchengming @ 2016-06-25 9:36 UTC (permalink / raw) To: Yury Norov Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, geert, Prasun.Kapoor, klimov.linux, broonie, schwidefsky, bamvor.zhangjian, philipp.tomsich, joseph, christoph.muellner [-- Attachment #1: Type: text/plain, Size: 3429 bytes --] On 2016/6/9 1:00, Yury Norov wrote: > On Wed, Jun 08, 2016 at 09:34:09AM +0800, zhouchengming wrote: >> On 2016/5/24 8:04, Yury Norov wrote: >>> Here new aarch32 ptrace syscall handler is introsuced to avoid run-time >>> detection of the task type. >>> >>> Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> > > [...] > >> Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I write >> a little patch to see if can solve the problem correctly. >> >> Thanks. >> >> From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 >> From: Zhou Chengming<zhouchengming1@huawei.com> >> Date: Wed, 8 Jun 2016 09:46:23 +0800 >> Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace >> >> When we analyze a testcase of ptrace that failed on ilp32, we found >> the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. >> Because in include/uapi/asm-generic/unistd.h it's defined like: >> __SYSCALL(__NR_ptrace, sys_ptrace) >> So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), >> let compat tasks use the compat_sys_ptrace. >> >> Signed-off-by: Zhou Chengming<zhouchengming1@huawei.com> >> --- >> include/uapi/asm-generic/unistd.h | 2 +- >> 1 files changed, 1 insertions(+), 1 deletions(-) >> >> diff --git a/include/uapi/asm-generic/unistd.h >> b/include/uapi/asm-generic/unistd.h >> index 2862d2e..50ee770 100644 >> --- a/include/uapi/asm-generic/unistd.h >> +++ b/include/uapi/asm-generic/unistd.h >> @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) >> >> /* kernel/ptrace.c */ >> #define __NR_ptrace 117 >> -__SYSCALL(__NR_ptrace, sys_ptrace) >> +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) >> >> /* kernel/sched/core.c */ >> #define __NR_sched_setparam 118 >> -- >> 1.7.7 >> > > Hi Zhou, > > Thank you for the catch. > > Could you also show the test that is failed for you. It should > probably be sent to LTP maillist. > > I'm not sure your fix correct as it affects other architectures that > use standard unistd.h. I think it's better to redirect the syscall in > arch/arm64/kernel/sys_ilp32.c with corresponding definition. > > Yury > > . > Sorry, I missed this mail. Thanks for your reply. :) I attach the testcase file of ptrace that failed on ilp32. I also think it's better to redirect the syscall in ilp32, so I changed the patch. From 7e692ba1adf02c2a2f125836f5222f455c9ffe56 Mon Sep 17 00:00:00 2001 From: Zhou Chengming <zhouchengming1@huawei.com> Date: Sat, 25 Jun 2016 18:02:51 +0800 Subject: [PATCH] ilp32 should use compat_sys_ptrace The file include/uapi/asm-generic/unistd.h defines this: __SYSCALL(__NR_ptrace, sys_ptrace) It may cause some ptrace tests failed on ilp32. So we redirect the ptrace syscall in arch/arm64/kernel/sys_ilp32.c with corresponding definition. Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> --- arch/arm64/kernel/sys_ilp32.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c index d85fe94..06d5e1b 100644 --- a/arch/arm64/kernel/sys_ilp32.c +++ b/arch/arm64/kernel/sys_ilp32.c @@ -46,6 +46,9 @@ asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); #define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper +/* ilp32 should use compat_sys_ptrace */ +#define sys_ptrace compat_sys_ptrace + #include <asm/syscall.h> #undef __SYSCALL -- 1.7.7 [-- Attachment #2: tc_ptrace_setoptions_09.c --] [-- Type: text/plain, Size: 2878 bytes --] #include <stdio.h> #include <stdlib.h> #include <sys/ptrace.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/user.h> #include <signal.h> int main() { pid_t child; unsigned long exit_status; int status; int is_get_event = 0; long ptrace_ret; int result = SIGTRAP | (PTRACE_EVENT_EXIT<<8); child = fork(); if(child < 0) { printf("fork error\n"); exit(1); } else if(child == 0) { sleep(1); exit(127); } else { ptrace_ret = ptrace(PTRACE_ATTACH, child, NULL, NULL); if(ptrace_ret != 0) { printf("ptrace PTRACE_ATTACH error %d \n", errno); exit(1); } printf("ATTACH SUCCESS\n"); sleep(1); ptrace_ret = ptrace(PTRACE_SETOPTIONS, child, NULL, PTRACE_O_TRACEEXIT); if(ptrace_ret != 0) { printf("ptrace PTRACE_SETOPTIONS PTRACE_O_TRACEFORK error %d \n", errno); ptrace(PTRACE_DETACH, child, NULL, NULL); exit(1); } printf("SETOPTIONS SUCCESS!\n"); while(1) { usleep(1); pid_t pid; if ((pid = wait(&status)) == -1) { perror("wait"); exit(1); }; printf("pid : %d\n", pid); printf("the child process stops. status: %d, signal? %d, exit? %d, continue? %d, stop? %d\n" , WEXITSTATUS(status) , WIFSIGNALED(status) , WIFEXITED(status) , WIFCONTINUED(status) ,WIFSTOPPED(status)); if (WSTOPSIG(status) == SIGTRAP) { printf("status : %d\n", status>>8); if (status>>8 == result) { if (ptrace(PTRACE_GETEVENTMSG, child, NULL, &exit_status)) { perror("error geteventmsg"); exit(1); } printf("exit_status %d\n", WEXITSTATUS((int)exit_status)); exit_status = WEXITSTATUS(exit_status); if (exit_status != 127) { printf("exit status is not equal with 127!\n"); exit(1); } is_get_event = 1; } } if (WIFEXITED(status)) { printf("child exit!\n"); break; } if(ptrace(PTRACE_CONT, pid, NULL, (void *) SIGCONT)) { printf("ptrace cont %d error %d\n", pid, errno); exit(1); } } if (is_get_event) exit(0); else exit(1); } } ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 2016-06-25 9:36 ` zhouchengming @ 2016-06-25 14:15 ` Bamvor Zhang -1 siblings, 0 replies; 207+ messages in thread From: Bamvor Zhang @ 2016-06-25 14:15 UTC (permalink / raw) To: zhouchengming Cc: Yury Norov, Arnd Bergmann, Catalin Marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, Alexander Graf, geert, Prasun.Kapoor, klimov.linux, broonie, schwidefsky, Bamvor Jian Zhang, philipp.tomsich, joseph, christoph.muellner, guohanjun Hi, Chengming On Sat, Jun 25, 2016 at 5:36 PM, zhouchengming <zhouchengming1@huawei.com> wrote: > On 2016/6/9 1:00, Yury Norov wrote: >> >> On Wed, Jun 08, 2016 at 09:34:09AM +0800, zhouchengming wrote: >>> >>> On 2016/5/24 8:04, Yury Norov wrote: >>>> >>>> Here new aarch32 ptrace syscall handler is introsuced to avoid run-time >>>> detection of the task type. >>>> >>>> Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> >> >> >> [...] >> >>> Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I >>> write >>> a little patch to see if can solve the problem correctly. >>> >>> Thanks. >>> >>> From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 >>> From: Zhou Chengming<zhouchengming1@huawei.com> >>> Date: Wed, 8 Jun 2016 09:46:23 +0800 >>> Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace >>> >>> When we analyze a testcase of ptrace that failed on ilp32, we found >>> the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. >>> Because in include/uapi/asm-generic/unistd.h it's defined like: >>> __SYSCALL(__NR_ptrace, sys_ptrace) >>> So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), >>> let compat tasks use the compat_sys_ptrace. >>> >>> Signed-off-by: Zhou Chengming<zhouchengming1@huawei.com> >>> --- >>> include/uapi/asm-generic/unistd.h | 2 +- >>> 1 files changed, 1 insertions(+), 1 deletions(-) >>> >>> diff --git a/include/uapi/asm-generic/unistd.h >>> b/include/uapi/asm-generic/unistd.h >>> index 2862d2e..50ee770 100644 >>> --- a/include/uapi/asm-generic/unistd.h >>> +++ b/include/uapi/asm-generic/unistd.h >>> @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) >>> >>> /* kernel/ptrace.c */ >>> #define __NR_ptrace 117 >>> -__SYSCALL(__NR_ptrace, sys_ptrace) >>> +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) >>> >>> /* kernel/sched/core.c */ >>> #define __NR_sched_setparam 118 >>> -- >>> 1.7.7 >>> >> >> Hi Zhou, >> >> Thank you for the catch. >> >> Could you also show the test that is failed for you. It should >> probably be sent to LTP maillist. >> >> I'm not sure your fix correct as it affects other architectures that >> use standard unistd.h. I think it's better to redirect the syscall in >> arch/arm64/kernel/sys_ilp32.c with corresponding definition. >> >> Yury >> >> . >> > > Sorry, I missed this mail. Thanks for your reply. :) > I attach the testcase file of ptrace that failed on ilp32. > I also think it's better to redirect the syscall in ilp32, so I changed > the patch. Thanks for your patch. But Yury has already sent an new series this week which define ptrace to compat one. It seems that Yury do not take GET/SETSIGMASK into account. You could share your test case and patches at this point. Best wishes Bamvor [1] https://www.mail-archive.com/linux-doc@vger.kernel.org/msg03811.html > > > From 7e692ba1adf02c2a2f125836f5222f455c9ffe56 Mon Sep 17 00:00:00 2001 > From: Zhou Chengming <zhouchengming1@huawei.com> > Date: Sat, 25 Jun 2016 18:02:51 +0800 > Subject: [PATCH] ilp32 should use compat_sys_ptrace > > The file include/uapi/asm-generic/unistd.h defines this: > __SYSCALL(__NR_ptrace, sys_ptrace) > It may cause some ptrace tests failed on ilp32. So we redirect the ptrace > syscall in arch/arm64/kernel/sys_ilp32.c with corresponding definition. > > Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> > --- > arch/arm64/kernel/sys_ilp32.c | 3 +++ > 1 files changed, 3 insertions(+), 0 deletions(-) > > diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c > index d85fe94..06d5e1b 100644 > --- a/arch/arm64/kernel/sys_ilp32.c > +++ b/arch/arm64/kernel/sys_ilp32.c > @@ -46,6 +46,9 @@ > asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); > #define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper > > +/* ilp32 should use compat_sys_ptrace */ > +#define sys_ptrace compat_sys_ptrace > + > #include <asm/syscall.h> > > #undef __SYSCALL > -- > 1.7.7 > > > -- ----------------------------------------- arm64, kernel. opensuse blog: http://aarch64.me ----------------------------------------- ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-06-25 14:15 ` Bamvor Zhang 0 siblings, 0 replies; 207+ messages in thread From: Bamvor Zhang @ 2016-06-25 14:15 UTC (permalink / raw) To: linux-arm-kernel Hi, Chengming On Sat, Jun 25, 2016 at 5:36 PM, zhouchengming <zhouchengming1@huawei.com> wrote: > On 2016/6/9 1:00, Yury Norov wrote: >> >> On Wed, Jun 08, 2016 at 09:34:09AM +0800, zhouchengming wrote: >>> >>> On 2016/5/24 8:04, Yury Norov wrote: >>>> >>>> Here new aarch32 ptrace syscall handler is introsuced to avoid run-time >>>> detection of the task type. >>>> >>>> Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> >> >> >> [...] >> >>> Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I >>> write >>> a little patch to see if can solve the problem correctly. >>> >>> Thanks. >>> >>> From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 >>> From: Zhou Chengming<zhouchengming1@huawei.com> >>> Date: Wed, 8 Jun 2016 09:46:23 +0800 >>> Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace >>> >>> When we analyze a testcase of ptrace that failed on ilp32, we found >>> the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. >>> Because in include/uapi/asm-generic/unistd.h it's defined like: >>> __SYSCALL(__NR_ptrace, sys_ptrace) >>> So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), >>> let compat tasks use the compat_sys_ptrace. >>> >>> Signed-off-by: Zhou Chengming<zhouchengming1@huawei.com> >>> --- >>> include/uapi/asm-generic/unistd.h | 2 +- >>> 1 files changed, 1 insertions(+), 1 deletions(-) >>> >>> diff --git a/include/uapi/asm-generic/unistd.h >>> b/include/uapi/asm-generic/unistd.h >>> index 2862d2e..50ee770 100644 >>> --- a/include/uapi/asm-generic/unistd.h >>> +++ b/include/uapi/asm-generic/unistd.h >>> @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) >>> >>> /* kernel/ptrace.c */ >>> #define __NR_ptrace 117 >>> -__SYSCALL(__NR_ptrace, sys_ptrace) >>> +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) >>> >>> /* kernel/sched/core.c */ >>> #define __NR_sched_setparam 118 >>> -- >>> 1.7.7 >>> >> >> Hi Zhou, >> >> Thank you for the catch. >> >> Could you also show the test that is failed for you. It should >> probably be sent to LTP maillist. >> >> I'm not sure your fix correct as it affects other architectures that >> use standard unistd.h. I think it's better to redirect the syscall in >> arch/arm64/kernel/sys_ilp32.c with corresponding definition. >> >> Yury >> >> . >> > > Sorry, I missed this mail. Thanks for your reply. :) > I attach the testcase file of ptrace that failed on ilp32. > I also think it's better to redirect the syscall in ilp32, so I changed > the patch. Thanks for your patch. But Yury has already sent an new series this week which define ptrace to compat one. It seems that Yury do not take GET/SETSIGMASK into account. You could share your test case and patches at this point. Best wishes Bamvor [1] https://www.mail-archive.com/linux-doc at vger.kernel.org/msg03811.html > > > From 7e692ba1adf02c2a2f125836f5222f455c9ffe56 Mon Sep 17 00:00:00 2001 > From: Zhou Chengming <zhouchengming1@huawei.com> > Date: Sat, 25 Jun 2016 18:02:51 +0800 > Subject: [PATCH] ilp32 should use compat_sys_ptrace > > The file include/uapi/asm-generic/unistd.h defines this: > __SYSCALL(__NR_ptrace, sys_ptrace) > It may cause some ptrace tests failed on ilp32. So we redirect the ptrace > syscall in arch/arm64/kernel/sys_ilp32.c with corresponding definition. > > Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com> > --- > arch/arm64/kernel/sys_ilp32.c | 3 +++ > 1 files changed, 3 insertions(+), 0 deletions(-) > > diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c > index d85fe94..06d5e1b 100644 > --- a/arch/arm64/kernel/sys_ilp32.c > +++ b/arch/arm64/kernel/sys_ilp32.c > @@ -46,6 +46,9 @@ > asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); > #define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper > > +/* ilp32 should use compat_sys_ptrace */ > +#define sys_ptrace compat_sys_ptrace > + > #include <asm/syscall.h> > > #undef __SYSCALL > -- > 1.7.7 > > > -- ----------------------------------------- arm64, kernel. opensuse blog: http://aarch64.me ----------------------------------------- ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 2016-06-25 14:15 ` Bamvor Zhang (?) @ 2016-06-27 2:09 ` zhouchengming -1 siblings, 0 replies; 207+ messages in thread From: zhouchengming @ 2016-06-27 2:09 UTC (permalink / raw) To: Bamvor Zhang Cc: Yury Norov, Arnd Bergmann, Catalin Marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, Alexander Graf, geert, Prasun.Kapoor, klimov.linux, broonie, schwidefsky, Bamvor Jian Zhang, philipp.tomsich, joseph, christoph.muellner, guohanjun On 2016/6/25 22:15, Bamvor Zhang wrote: > Hi, Chengming > > On Sat, Jun 25, 2016 at 5:36 PM, zhouchengming > <zhouchengming1@huawei.com> wrote: >> On 2016/6/9 1:00, Yury Norov wrote: >>> >>> On Wed, Jun 08, 2016 at 09:34:09AM +0800, zhouchengming wrote: >>>> >>>> On 2016/5/24 8:04, Yury Norov wrote: >>>>> >>>>> Here new aarch32 ptrace syscall handler is introsuced to avoid run-time >>>>> detection of the task type. >>>>> >>>>> Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> >>> >>> >>> [...] >>> >>>> Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I >>>> write >>>> a little patch to see if can solve the problem correctly. >>>> >>>> Thanks. >>>> >>>> From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 >>>> From: Zhou Chengming<zhouchengming1@huawei.com> >>>> Date: Wed, 8 Jun 2016 09:46:23 +0800 >>>> Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace >>>> >>>> When we analyze a testcase of ptrace that failed on ilp32, we found >>>> the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. >>>> Because in include/uapi/asm-generic/unistd.h it's defined like: >>>> __SYSCALL(__NR_ptrace, sys_ptrace) >>>> So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), >>>> let compat tasks use the compat_sys_ptrace. >>>> >>>> Signed-off-by: Zhou Chengming<zhouchengming1@huawei.com> >>>> --- >>>> include/uapi/asm-generic/unistd.h | 2 +- >>>> 1 files changed, 1 insertions(+), 1 deletions(-) >>>> >>>> diff --git a/include/uapi/asm-generic/unistd.h >>>> b/include/uapi/asm-generic/unistd.h >>>> index 2862d2e..50ee770 100644 >>>> --- a/include/uapi/asm-generic/unistd.h >>>> +++ b/include/uapi/asm-generic/unistd.h >>>> @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) >>>> >>>> /* kernel/ptrace.c */ >>>> #define __NR_ptrace 117 >>>> -__SYSCALL(__NR_ptrace, sys_ptrace) >>>> +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) >>>> >>>> /* kernel/sched/core.c */ >>>> #define __NR_sched_setparam 118 >>>> -- >>>> 1.7.7 >>>> >>> >>> Hi Zhou, >>> >>> Thank you for the catch. >>> >>> Could you also show the test that is failed for you. It should >>> probably be sent to LTP maillist. >>> >>> I'm not sure your fix correct as it affects other architectures that >>> use standard unistd.h. I think it's better to redirect the syscall in >>> arch/arm64/kernel/sys_ilp32.c with corresponding definition. >>> >>> Yury >>> >>> . >>> >> >> Sorry, I missed this mail. Thanks for your reply. :) >> I attach the testcase file of ptrace that failed on ilp32. >> I also think it's better to redirect the syscall in ilp32, so I changed >> the patch. > > Thanks for your patch. But Yury has already sent an new series this week > which define ptrace to compat one. > > It seems that Yury do not take GET/SETSIGMASK into account. You > could share your test case and patches at this point. > > Best wishes > > Bamvor Ok, I get it. So the new series can handle ptrace correctly. :) But as for the GET/SETSIGMASK request, both ilp32 and aarch32 are wrong, because they are handled in ptrace_request(like aarch64). But I don't have a good way to correct it in all architectures. The architectures that use compat_ptrace_request are: arch/arm64, arch/mips, arch/parisc, arch/powerpc, arch/s390, arch/sparc, arch/tile, arch/x86. We have to use two architecture dependent functions in compat_ptrace_request to fix the GET/SETSIGMASK request. (as for arch/arm64, the two functions are: put_sigset_t and get_sigset_t) So we maybe have to prepare these functions for all these architectures. But I don't have much time to work on it. So I just fix it for ilp32 of arch/arm64 (Ah, easier way for me). I will put my patch of this fix under Yury's new series. Thanks! > > [1] https://www.mail-archive.com/linux-doc@vger.kernel.org/msg03811.html >> >> >> From 7e692ba1adf02c2a2f125836f5222f455c9ffe56 Mon Sep 17 00:00:00 2001 >> From: Zhou Chengming<zhouchengming1@huawei.com> >> Date: Sat, 25 Jun 2016 18:02:51 +0800 >> Subject: [PATCH] ilp32 should use compat_sys_ptrace >> >> The file include/uapi/asm-generic/unistd.h defines this: >> __SYSCALL(__NR_ptrace, sys_ptrace) >> It may cause some ptrace tests failed on ilp32. So we redirect the ptrace >> syscall in arch/arm64/kernel/sys_ilp32.c with corresponding definition. >> >> Signed-off-by: Zhou Chengming<zhouchengming1@huawei.com> >> --- >> arch/arm64/kernel/sys_ilp32.c | 3 +++ >> 1 files changed, 3 insertions(+), 0 deletions(-) >> >> diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c >> index d85fe94..06d5e1b 100644 >> --- a/arch/arm64/kernel/sys_ilp32.c >> +++ b/arch/arm64/kernel/sys_ilp32.c >> @@ -46,6 +46,9 @@ >> asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); >> #define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper >> >> +/* ilp32 should use compat_sys_ptrace */ >> +#define sys_ptrace compat_sys_ptrace >> + >> #include<asm/syscall.h> >> >> #undef __SYSCALL >> -- >> 1.7.7 >> >> >> > > > ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-06-27 2:09 ` zhouchengming 0 siblings, 0 replies; 207+ messages in thread From: zhouchengming @ 2016-06-27 2:09 UTC (permalink / raw) To: linux-arm-kernel On 2016/6/25 22:15, Bamvor Zhang wrote: > Hi, Chengming > > On Sat, Jun 25, 2016 at 5:36 PM, zhouchengming > <zhouchengming1@huawei.com> wrote: >> On 2016/6/9 1:00, Yury Norov wrote: >>> >>> On Wed, Jun 08, 2016 at 09:34:09AM +0800, zhouchengming wrote: >>>> >>>> On 2016/5/24 8:04, Yury Norov wrote: >>>>> >>>>> Here new aarch32 ptrace syscall handler is introsuced to avoid run-time >>>>> detection of the task type. >>>>> >>>>> Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> >>> >>> >>> [...] >>> >>>> Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I >>>> write >>>> a little patch to see if can solve the problem correctly. >>>> >>>> Thanks. >>>> >>>> From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 >>>> From: Zhou Chengming<zhouchengming1@huawei.com> >>>> Date: Wed, 8 Jun 2016 09:46:23 +0800 >>>> Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace >>>> >>>> When we analyze a testcase of ptrace that failed on ilp32, we found >>>> the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. >>>> Because in include/uapi/asm-generic/unistd.h it's defined like: >>>> __SYSCALL(__NR_ptrace, sys_ptrace) >>>> So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), >>>> let compat tasks use the compat_sys_ptrace. >>>> >>>> Signed-off-by: Zhou Chengming<zhouchengming1@huawei.com> >>>> --- >>>> include/uapi/asm-generic/unistd.h | 2 +- >>>> 1 files changed, 1 insertions(+), 1 deletions(-) >>>> >>>> diff --git a/include/uapi/asm-generic/unistd.h >>>> b/include/uapi/asm-generic/unistd.h >>>> index 2862d2e..50ee770 100644 >>>> --- a/include/uapi/asm-generic/unistd.h >>>> +++ b/include/uapi/asm-generic/unistd.h >>>> @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) >>>> >>>> /* kernel/ptrace.c */ >>>> #define __NR_ptrace 117 >>>> -__SYSCALL(__NR_ptrace, sys_ptrace) >>>> +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) >>>> >>>> /* kernel/sched/core.c */ >>>> #define __NR_sched_setparam 118 >>>> -- >>>> 1.7.7 >>>> >>> >>> Hi Zhou, >>> >>> Thank you for the catch. >>> >>> Could you also show the test that is failed for you. It should >>> probably be sent to LTP maillist. >>> >>> I'm not sure your fix correct as it affects other architectures that >>> use standard unistd.h. I think it's better to redirect the syscall in >>> arch/arm64/kernel/sys_ilp32.c with corresponding definition. >>> >>> Yury >>> >>> . >>> >> >> Sorry, I missed this mail. Thanks for your reply. :) >> I attach the testcase file of ptrace that failed on ilp32. >> I also think it's better to redirect the syscall in ilp32, so I changed >> the patch. > > Thanks for your patch. But Yury has already sent an new series this week > which define ptrace to compat one. > > It seems that Yury do not take GET/SETSIGMASK into account. You > could share your test case and patches at this point. > > Best wishes > > Bamvor Ok, I get it. So the new series can handle ptrace correctly. :) But as for the GET/SETSIGMASK request, both ilp32 and aarch32 are wrong, because they are handled in ptrace_request(like aarch64). But I don't have a good way to correct it in all architectures. The architectures that use compat_ptrace_request are: arch/arm64, arch/mips, arch/parisc, arch/powerpc, arch/s390, arch/sparc, arch/tile, arch/x86. We have to use two architecture dependent functions in compat_ptrace_request to fix the GET/SETSIGMASK request. (as for arch/arm64, the two functions are: put_sigset_t and get_sigset_t) So we maybe have to prepare these functions for all these architectures. But I don't have much time to work on it. So I just fix it for ilp32 of arch/arm64 (Ah, easier way for me). I will put my patch of this fix under Yury's new series. Thanks! > > [1] https://www.mail-archive.com/linux-doc at vger.kernel.org/msg03811.html >> >> >> From 7e692ba1adf02c2a2f125836f5222f455c9ffe56 Mon Sep 17 00:00:00 2001 >> From: Zhou Chengming<zhouchengming1@huawei.com> >> Date: Sat, 25 Jun 2016 18:02:51 +0800 >> Subject: [PATCH] ilp32 should use compat_sys_ptrace >> >> The file include/uapi/asm-generic/unistd.h defines this: >> __SYSCALL(__NR_ptrace, sys_ptrace) >> It may cause some ptrace tests failed on ilp32. So we redirect the ptrace >> syscall in arch/arm64/kernel/sys_ilp32.c with corresponding definition. >> >> Signed-off-by: Zhou Chengming<zhouchengming1@huawei.com> >> --- >> arch/arm64/kernel/sys_ilp32.c | 3 +++ >> 1 files changed, 3 insertions(+), 0 deletions(-) >> >> diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c >> index d85fe94..06d5e1b 100644 >> --- a/arch/arm64/kernel/sys_ilp32.c >> +++ b/arch/arm64/kernel/sys_ilp32.c >> @@ -46,6 +46,9 @@ >> asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); >> #define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper >> >> +/* ilp32 should use compat_sys_ptrace */ >> +#define sys_ptrace compat_sys_ptrace >> + >> #include<asm/syscall.h> >> >> #undef __SYSCALL >> -- >> 1.7.7 >> >> >> > > > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 @ 2016-06-27 2:09 ` zhouchengming 0 siblings, 0 replies; 207+ messages in thread From: zhouchengming @ 2016-06-27 2:09 UTC (permalink / raw) To: Bamvor Zhang Cc: Yury Norov, Arnd Bergmann, Catalin Marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, Alexander Graf, geert, Prasun.Kapoor, klimov.linux, broonie, schwidefsky, Bamvor Jian Zhang, philipp.tomsich, joseph, christoph.muellner, guohanjun On 2016/6/25 22:15, Bamvor Zhang wrote: > Hi, Chengming > > On Sat, Jun 25, 2016 at 5:36 PM, zhouchengming > <zhouchengming1@huawei.com> wrote: >> On 2016/6/9 1:00, Yury Norov wrote: >>> >>> On Wed, Jun 08, 2016 at 09:34:09AM +0800, zhouchengming wrote: >>>> >>>> On 2016/5/24 8:04, Yury Norov wrote: >>>>> >>>>> Here new aarch32 ptrace syscall handler is introsuced to avoid run-time >>>>> detection of the task type. >>>>> >>>>> Signed-off-by: Yury Norov<ynorov@caviumnetworks.com> >>> >>> >>> [...] >>> >>>> Hello, I found ilp32 will use sys_ptrace, not compat_sys_ptrace. So I >>>> write >>>> a little patch to see if can solve the problem correctly. >>>> >>>> Thanks. >>>> >>>> From f6156236df578bb05c4a17e7f9776ceaf8f7afe6 Mon Sep 17 00:00:00 2001 >>>> From: Zhou Chengming<zhouchengming1@huawei.com> >>>> Date: Wed, 8 Jun 2016 09:46:23 +0800 >>>> Subject: [PATCH] ilp32: use compat_sys_ptrace instead of sys_ptrace >>>> >>>> When we analyze a testcase of ptrace that failed on ilp32, we found >>>> the syscall that the ilp32 uses is sys_ptrace, not compat_sys_ptrace. >>>> Because in include/uapi/asm-generic/unistd.h it's defined like: >>>> __SYSCALL(__NR_ptrace, sys_ptrace) >>>> So we change it to __SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace), >>>> let compat tasks use the compat_sys_ptrace. >>>> >>>> Signed-off-by: Zhou Chengming<zhouchengming1@huawei.com> >>>> --- >>>> include/uapi/asm-generic/unistd.h | 2 +- >>>> 1 files changed, 1 insertions(+), 1 deletions(-) >>>> >>>> diff --git a/include/uapi/asm-generic/unistd.h >>>> b/include/uapi/asm-generic/unistd.h >>>> index 2862d2e..50ee770 100644 >>>> --- a/include/uapi/asm-generic/unistd.h >>>> +++ b/include/uapi/asm-generic/unistd.h >>>> @@ -364,7 +364,7 @@ __SC_WRAP(__NR_syslog, sys_syslog) >>>> >>>> /* kernel/ptrace.c */ >>>> #define __NR_ptrace 117 >>>> -__SYSCALL(__NR_ptrace, sys_ptrace) >>>> +__SC_COMP(__NR_ptrace, sys_ptrace, compat_sys_ptrace) >>>> >>>> /* kernel/sched/core.c */ >>>> #define __NR_sched_setparam 118 >>>> -- >>>> 1.7.7 >>>> >>> >>> Hi Zhou, >>> >>> Thank you for the catch. >>> >>> Could you also show the test that is failed for you. It should >>> probably be sent to LTP maillist. >>> >>> I'm not sure your fix correct as it affects other architectures that >>> use standard unistd.h. I think it's better to redirect the syscall in >>> arch/arm64/kernel/sys_ilp32.c with corresponding definition. >>> >>> Yury >>> >>> . >>> >> >> Sorry, I missed this mail. Thanks for your reply. :) >> I attach the testcase file of ptrace that failed on ilp32. >> I also think it's better to redirect the syscall in ilp32, so I changed >> the patch. > > Thanks for your patch. But Yury has already sent an new series this week > which define ptrace to compat one. > > It seems that Yury do not take GET/SETSIGMASK into account. You > could share your test case and patches at this point. > > Best wishes > > Bamvor Ok, I get it. So the new series can handle ptrace correctly. :) But as for the GET/SETSIGMASK request, both ilp32 and aarch32 are wrong, because they are handled in ptrace_request(like aarch64). But I don't have a good way to correct it in all architectures. The architectures that use compat_ptrace_request are: arch/arm64, arch/mips, arch/parisc, arch/powerpc, arch/s390, arch/sparc, arch/tile, arch/x86. We have to use two architecture dependent functions in compat_ptrace_request to fix the GET/SETSIGMASK request. (as for arch/arm64, the two functions are: put_sigset_t and get_sigset_t) So we maybe have to prepare these functions for all these architectures. But I don't have much time to work on it. So I just fix it for ilp32 of arch/arm64 (Ah, easier way for me). I will put my patch of this fix under Yury's new series. Thanks! > > [1] https://www.mail-archive.com/linux-doc@vger.kernel.org/msg03811.html >> >> >> From 7e692ba1adf02c2a2f125836f5222f455c9ffe56 Mon Sep 17 00:00:00 2001 >> From: Zhou Chengming<zhouchengming1@huawei.com> >> Date: Sat, 25 Jun 2016 18:02:51 +0800 >> Subject: [PATCH] ilp32 should use compat_sys_ptrace >> >> The file include/uapi/asm-generic/unistd.h defines this: >> __SYSCALL(__NR_ptrace, sys_ptrace) >> It may cause some ptrace tests failed on ilp32. So we redirect the ptrace >> syscall in arch/arm64/kernel/sys_ilp32.c with corresponding definition. >> >> Signed-off-by: Zhou Chengming<zhouchengming1@huawei.com> >> --- >> arch/arm64/kernel/sys_ilp32.c | 3 +++ >> 1 files changed, 3 insertions(+), 0 deletions(-) >> >> diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c >> index d85fe94..06d5e1b 100644 >> --- a/arch/arm64/kernel/sys_ilp32.c >> +++ b/arch/arm64/kernel/sys_ilp32.c >> @@ -46,6 +46,9 @@ >> asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); >> #define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper >> >> +/* ilp32 should use compat_sys_ptrace */ >> +#define sys_ptrace compat_sys_ptrace >> + >> #include<asm/syscall.h> >> >> #undef __SYSCALL >> -- >> 1.7.7 >> >> >> > > > ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 18/23] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski From: Andrew Pinski <apinski@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.Pinski@caviumnetworks.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/unistd.h | 11 +++++- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/entry.S | 10 ++++- arch/arm64/kernel/sys_ilp32.c | 83 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 4 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 2971dea..5ea18ef 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -13,9 +13,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifdef CONFIG_COMPAT +#define __ARCH_WANT_COMPAT_STAT64 +#endif + +#ifdef CONFIG_ARM64_ILP32 +#define __ARCH_WANT_COMPAT_SYS_PREADV64 +#define __ARCH_WANT_COMPAT_SYS_PWRITEV64 +#endif + #ifdef CONFIG_AARCH32_EL0 #define __ARCH_WANT_COMPAT_SYS_GETDENTS64 -#define __ARCH_WANT_COMPAT_STAT64 #define __ARCH_WANT_SYS_GETHOSTNAME #define __ARCH_WANT_SYS_PAUSE #define __ARCH_WANT_SYS_GETPGRP diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 9dfdf86..7aa65ea 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 \ ../../arm/kernel/opcodes.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_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/entry.S b/arch/arm64/kernel/entry.S index 21a0624..acea2cb 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -501,6 +501,7 @@ el0_svc_compat: * AArch32 syscall handling */ adrp stbl, compat_sys_call_table // load compat syscall table pointer + ldr x16, [tsk, #TI_FLAGS] uxtw scno, w7 // syscall number in w7 (r7) mov sc_nr, #__NR_compat_syscalls b el0_svc_naked @@ -717,15 +718,20 @@ ENDPROC(ret_from_fork) .align 6 el0_svc: adrp stbl, sys_call_table // load syscall table pointer + ldr x16, [tsk, #TI_FLAGS] uxtw scno, w8 // syscall number in w8 mov sc_nr, #__NR_syscalls +#ifdef CONFIG_ARM64_ILP32 + adrp x17, sys_call_ilp32_table // load ilp32 syscall table pointer + tst x16, #_TIF_32BIT_AARCH64 + csel stbl, stbl, x17, eq // We are using ILP32 +#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, #TI_FLAGS] // check for syscall hooks - 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.hs ni_sys diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c new file mode 100644 index 0000000..d4cd2a9 --- /dev/null +++ b/arch/arm64/kernel/sys_ilp32.c @@ -0,0 +1,83 @@ +/* + * AArch64- ILP32 specific system calls implementation + * + * Copyright (C) 2016 Cavium Inc. + * Author: Andrew Pinski <apinski@cavium.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#define __SYSCALL_COMPAT + +#include <linux/compiler.h> +#include <linux/errno.h> +#include <linux/fs.h> +#include <linux/mm.h> +#include <linux/msg.h> +#include <linux/export.h> +#include <linux/sched.h> +#include <linux/slab.h> +#include <linux/syscalls.h> +#include <linux/compat.h> +#include <asm-generic/syscalls.h> + +/* Using non-compat syscalls where necessary */ +#define compat_sys_fadvise64_64 sys_fadvise64_64 +#define compat_sys_fallocate sys_fallocate +#define compat_sys_ftruncate64 sys_ftruncate +#define compat_sys_lookup_dcookie sys_lookup_dcookie +#define compat_sys_readahead sys_readahead +#define compat_sys_shmat sys_shmat +#define compat_sys_sync_file_range sys_sync_file_range +#define compat_sys_truncate64 sys_truncate +#define sys_llseek sys_lseek +#define sys_mmap2 compat_sys_mmap2 + +static unsigned long compat_sys_mmap2(compat_uptr_t addr, compat_size_t len, + int prot, int flags, int fd, off_t pgoff) +{ + if (pgoff & (~PAGE_MASK >> 12)) + return -EINVAL; + + return sys_mmap_pgoff(addr, len, prot, flags, fd, + pgoff >> (PAGE_SHIFT - 12)); +} + +static unsigned long compat_sys_pread64(unsigned int fd, + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) +{ + return sys_pread64(fd, (char *) ubuf, count, offset); +} + +static unsigned long compat_sys_pwrite64(unsigned int fd, + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) +{ + return sys_pwrite64(fd, (char *) ubuf, count, offset); +} + +#include <asm/syscall.h> + +#undef __SYSCALL +#undef __SC_WRAP + +#define __SYSCALL(nr, sym) [nr] = sym, +#define __SC_WRAP(nr, sym) [nr] = compat_##sym, + +/* + * The sys_call_ilp32_table array must be 4K aligned to be accessible from + * kernel/entry.S. + */ +void *sys_call_ilp32_table[__NR_syscalls] __aligned(4096) = { + [0 ... __NR_syscalls - 1] = sys_ni_syscall, +#include <asm/unistd.h> +}; -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 18/23] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel From: Andrew Pinski <apinski@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.Pinski@caviumnetworks.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/unistd.h | 11 +++++- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/entry.S | 10 ++++- arch/arm64/kernel/sys_ilp32.c | 83 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 4 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 2971dea..5ea18ef 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -13,9 +13,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifdef CONFIG_COMPAT +#define __ARCH_WANT_COMPAT_STAT64 +#endif + +#ifdef CONFIG_ARM64_ILP32 +#define __ARCH_WANT_COMPAT_SYS_PREADV64 +#define __ARCH_WANT_COMPAT_SYS_PWRITEV64 +#endif + #ifdef CONFIG_AARCH32_EL0 #define __ARCH_WANT_COMPAT_SYS_GETDENTS64 -#define __ARCH_WANT_COMPAT_STAT64 #define __ARCH_WANT_SYS_GETHOSTNAME #define __ARCH_WANT_SYS_PAUSE #define __ARCH_WANT_SYS_GETPGRP diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 9dfdf86..7aa65ea 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 \ ../../arm/kernel/opcodes.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_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/entry.S b/arch/arm64/kernel/entry.S index 21a0624..acea2cb 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -501,6 +501,7 @@ el0_svc_compat: * AArch32 syscall handling */ adrp stbl, compat_sys_call_table // load compat syscall table pointer + ldr x16, [tsk, #TI_FLAGS] uxtw scno, w7 // syscall number in w7 (r7) mov sc_nr, #__NR_compat_syscalls b el0_svc_naked @@ -717,15 +718,20 @@ ENDPROC(ret_from_fork) .align 6 el0_svc: adrp stbl, sys_call_table // load syscall table pointer + ldr x16, [tsk, #TI_FLAGS] uxtw scno, w8 // syscall number in w8 mov sc_nr, #__NR_syscalls +#ifdef CONFIG_ARM64_ILP32 + adrp x17, sys_call_ilp32_table // load ilp32 syscall table pointer + tst x16, #_TIF_32BIT_AARCH64 + csel stbl, stbl, x17, eq // We are using ILP32 +#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, #TI_FLAGS] // check for syscall hooks - 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.hs ni_sys diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c new file mode 100644 index 0000000..d4cd2a9 --- /dev/null +++ b/arch/arm64/kernel/sys_ilp32.c @@ -0,0 +1,83 @@ +/* + * AArch64- ILP32 specific system calls implementation + * + * Copyright (C) 2016 Cavium Inc. + * Author: Andrew Pinski <apinski@cavium.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#define __SYSCALL_COMPAT + +#include <linux/compiler.h> +#include <linux/errno.h> +#include <linux/fs.h> +#include <linux/mm.h> +#include <linux/msg.h> +#include <linux/export.h> +#include <linux/sched.h> +#include <linux/slab.h> +#include <linux/syscalls.h> +#include <linux/compat.h> +#include <asm-generic/syscalls.h> + +/* Using non-compat syscalls where necessary */ +#define compat_sys_fadvise64_64 sys_fadvise64_64 +#define compat_sys_fallocate sys_fallocate +#define compat_sys_ftruncate64 sys_ftruncate +#define compat_sys_lookup_dcookie sys_lookup_dcookie +#define compat_sys_readahead sys_readahead +#define compat_sys_shmat sys_shmat +#define compat_sys_sync_file_range sys_sync_file_range +#define compat_sys_truncate64 sys_truncate +#define sys_llseek sys_lseek +#define sys_mmap2 compat_sys_mmap2 + +static unsigned long compat_sys_mmap2(compat_uptr_t addr, compat_size_t len, + int prot, int flags, int fd, off_t pgoff) +{ + if (pgoff & (~PAGE_MASK >> 12)) + return -EINVAL; + + return sys_mmap_pgoff(addr, len, prot, flags, fd, + pgoff >> (PAGE_SHIFT - 12)); +} + +static unsigned long compat_sys_pread64(unsigned int fd, + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) +{ + return sys_pread64(fd, (char *) ubuf, count, offset); +} + +static unsigned long compat_sys_pwrite64(unsigned int fd, + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) +{ + return sys_pwrite64(fd, (char *) ubuf, count, offset); +} + +#include <asm/syscall.h> + +#undef __SYSCALL +#undef __SC_WRAP + +#define __SYSCALL(nr, sym) [nr] = sym, +#define __SC_WRAP(nr, sym) [nr] = compat_##sym, + +/* + * The sys_call_ilp32_table array must be 4K aligned to be accessible from + * kernel/entry.S. + */ +void *sys_call_ilp32_table[__NR_syscalls] __aligned(4096) = { + [0 ... __NR_syscalls - 1] = sys_ni_syscall, +#include <asm/unistd.h> +}; -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 18/23] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski From: Andrew Pinski <apinski@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.Pinski@caviumnetworks.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/unistd.h | 11 +++++- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/entry.S | 10 ++++- arch/arm64/kernel/sys_ilp32.c | 83 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 4 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 2971dea..5ea18ef 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -13,9 +13,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifdef CONFIG_COMPAT +#define __ARCH_WANT_COMPAT_STAT64 +#endif + +#ifdef CONFIG_ARM64_ILP32 +#define __ARCH_WANT_COMPAT_SYS_PREADV64 +#define __ARCH_WANT_COMPAT_SYS_PWRITEV64 +#endif + #ifdef CONFIG_AARCH32_EL0 #define __ARCH_WANT_COMPAT_SYS_GETDENTS64 -#define __ARCH_WANT_COMPAT_STAT64 #define __ARCH_WANT_SYS_GETHOSTNAME #define __ARCH_WANT_SYS_PAUSE #define __ARCH_WANT_SYS_GETPGRP diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 9dfdf86..7aa65ea 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 \ ../../arm/kernel/opcodes.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_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/entry.S b/arch/arm64/kernel/entry.S index 21a0624..acea2cb 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -501,6 +501,7 @@ el0_svc_compat: * AArch32 syscall handling */ adrp stbl, compat_sys_call_table // load compat syscall table pointer + ldr x16, [tsk, #TI_FLAGS] uxtw scno, w7 // syscall number in w7 (r7) mov sc_nr, #__NR_compat_syscalls b el0_svc_naked @@ -717,15 +718,20 @@ ENDPROC(ret_from_fork) .align 6 el0_svc: adrp stbl, sys_call_table // load syscall table pointer + ldr x16, [tsk, #TI_FLAGS] uxtw scno, w8 // syscall number in w8 mov sc_nr, #__NR_syscalls +#ifdef CONFIG_ARM64_ILP32 + adrp x17, sys_call_ilp32_table // load ilp32 syscall table pointer + tst x16, #_TIF_32BIT_AARCH64 + csel stbl, stbl, x17, eq // We are using ILP32 +#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, #TI_FLAGS] // check for syscall hooks - 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.hs ni_sys diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c new file mode 100644 index 0000000..d4cd2a9 --- /dev/null +++ b/arch/arm64/kernel/sys_ilp32.c @@ -0,0 +1,83 @@ +/* + * AArch64- ILP32 specific system calls implementation + * + * Copyright (C) 2016 Cavium Inc. + * Author: Andrew Pinski <apinski@cavium.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#define __SYSCALL_COMPAT + +#include <linux/compiler.h> +#include <linux/errno.h> +#include <linux/fs.h> +#include <linux/mm.h> +#include <linux/msg.h> +#include <linux/export.h> +#include <linux/sched.h> +#include <linux/slab.h> +#include <linux/syscalls.h> +#include <linux/compat.h> +#include <asm-generic/syscalls.h> + +/* Using non-compat syscalls where necessary */ +#define compat_sys_fadvise64_64 sys_fadvise64_64 +#define compat_sys_fallocate sys_fallocate +#define compat_sys_ftruncate64 sys_ftruncate +#define compat_sys_lookup_dcookie sys_lookup_dcookie +#define compat_sys_readahead sys_readahead +#define compat_sys_shmat sys_shmat +#define compat_sys_sync_file_range sys_sync_file_range +#define compat_sys_truncate64 sys_truncate +#define sys_llseek sys_lseek +#define sys_mmap2 compat_sys_mmap2 + +static unsigned long compat_sys_mmap2(compat_uptr_t addr, compat_size_t len, + int prot, int flags, int fd, off_t pgoff) +{ + if (pgoff & (~PAGE_MASK >> 12)) + return -EINVAL; + + return sys_mmap_pgoff(addr, len, prot, flags, fd, + pgoff >> (PAGE_SHIFT - 12)); +} + +static unsigned long compat_sys_pread64(unsigned int fd, + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) +{ + return sys_pread64(fd, (char *) ubuf, count, offset); +} + +static unsigned long compat_sys_pwrite64(unsigned int fd, + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) +{ + return sys_pwrite64(fd, (char *) ubuf, count, offset); +} + +#include <asm/syscall.h> + +#undef __SYSCALL +#undef __SC_WRAP + +#define __SYSCALL(nr, sym) [nr] = sym, +#define __SC_WRAP(nr, sym) [nr] = compat_##sym, + +/* + * The sys_call_ilp32_table array must be 4K aligned to be accessible from + * kernel/entry.S. + */ +void *sys_call_ilp32_table[__NR_syscalls] __aligned(4096) = { + [0 ... __NR_syscalls - 1] = sys_ni_syscall, +#include <asm/unistd.h> +}; -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 18/23] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it 2016-05-24 0:04 ` Yury Norov @ 2016-05-25 20:26 ` Arnd Bergmann -1 siblings, 0 replies; 207+ messages in thread From: Arnd Bergmann @ 2016-05-25 20:26 UTC (permalink / raw) To: Yury Norov Cc: catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski On Tuesday, May 24, 2016 3:04:47 AM CEST Yury Norov wrote: > +static unsigned long compat_sys_mmap2(compat_uptr_t addr, compat_size_t len, > + int prot, int flags, int fd, off_t pgoff) > +{ > + if (pgoff & (~PAGE_MASK >> 12)) > + return -EINVAL; > + > + return sys_mmap_pgoff(addr, len, prot, flags, fd, > + pgoff >> (PAGE_SHIFT - 12)); > +} > + > +static unsigned long compat_sys_pread64(unsigned int fd, > + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) > +{ > + return sys_pread64(fd, (char *) ubuf, count, offset); > +} > + > +static unsigned long compat_sys_pwrite64(unsigned int fd, > + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) > +{ > + return sys_pwrite64(fd, (char *) ubuf, count, offset); > +} > The use of compat_uptr_t seems inconsistent here, and neither of the two ways of doing it is what we do elsewhere. compat_uptr_t is meant to be a scalar 32-bit type that gets converted into a pointer using the compat_ptr() macro, so compat_sys_mmap2 should not use compat_ptr_t (we don't access it as a pointer in mmap_pgoff) but compat_ulong_t, and compat_sys_pread64() should have a compat_uptr_t argument, not pointer to compat_uptr_t. Arnd ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 18/23] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it @ 2016-05-25 20:26 ` Arnd Bergmann 0 siblings, 0 replies; 207+ messages in thread From: Arnd Bergmann @ 2016-05-25 20:26 UTC (permalink / raw) To: linux-arm-kernel On Tuesday, May 24, 2016 3:04:47 AM CEST Yury Norov wrote: > +static unsigned long compat_sys_mmap2(compat_uptr_t addr, compat_size_t len, > + int prot, int flags, int fd, off_t pgoff) > +{ > + if (pgoff & (~PAGE_MASK >> 12)) > + return -EINVAL; > + > + return sys_mmap_pgoff(addr, len, prot, flags, fd, > + pgoff >> (PAGE_SHIFT - 12)); > +} > + > +static unsigned long compat_sys_pread64(unsigned int fd, > + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) > +{ > + return sys_pread64(fd, (char *) ubuf, count, offset); > +} > + > +static unsigned long compat_sys_pwrite64(unsigned int fd, > + compat_uptr_t __user *ubuf, compat_size_t count, off_t offset) > +{ > + return sys_pwrite64(fd, (char *) ubuf, count, offset); > +} > The use of compat_uptr_t seems inconsistent here, and neither of the two ways of doing it is what we do elsewhere. compat_uptr_t is meant to be a scalar 32-bit type that gets converted into a pointer using the compat_ptr() macro, so compat_sys_mmap2 should not use compat_ptr_t (we don't access it as a pointer in mmap_pgoff) but compat_ulong_t, and compat_sys_pread64() should have a compat_uptr_t argument, not pointer to compat_uptr_t. Arnd ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 19/23] arm64: signal: share lp64 signal routines to ilp32 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich After that, it will be possible to reuse it in ilp32. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/signal_common.h | 33 ++++++++++++ arch/arm64/kernel/signal.c | 91 +++++++++++++++++++++------------- 2 files changed, 90 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 0000000..756ed2c --- /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) 2016 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 <linux/uaccess.h> +#include <asm/ucontext.h> +#include <asm/fpsimd.h> + +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 be02f65..f9fbf8a 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -34,18 +34,23 @@ #include <asm/fpsimd.h> #include <asm/signal32.h> #include <asm/vdso.h> +#include <asm/signal_common.h> + +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 = ¤t->thread.fpsimd_state; int err; @@ -65,7 +70,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 +98,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(&set, &sf->uc.uc_sigmask, sizeof(set)); if (err == 0) set_current_blocked(&set); + err |= restore_sigcontext(regs, &sf->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], &sf->uc.uc_mcontext.regs[i], + __get_user_error(regs->regs[i], &uc_mcontext->regs[i], err); - __get_user_error(regs->sp, &sf->uc.uc_mcontext.sp, err); - __get_user_error(regs->pc, &sf->uc.uc_mcontext.pc, err); - __get_user_error(regs->pstate, &sf->uc.uc_mcontext.pstate, err); + __get_user_error(regs->sp, &uc_mcontext->sp, err); + __get_user_error(regs->pc, &uc_mcontext->pc, err); + __get_user_error(regs->pstate, &uc_mcontext->pstate, err); /* * Avoid sys_rt_sigreturn() restarting. @@ -145,10 +158,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, &frame->sig)) goto badframe; - if (restore_altstack(&frame->uc.uc_stack)) + if (restore_altstack(&frame->sig.uc.uc_stack)) goto badframe; return regs->regs[0]; @@ -162,27 +175,36 @@ badframe: return 0; } -static int setup_sigframe(struct rt_sigframe __user *sf, +static int setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set) { - int i, err = 0; - void *aux = sf->uc.uc_mcontext.__reserved; - struct _aarch64_ctx *end; + int err = 0; /* set up the stack frame for unwinding */ __put_user_error(regs->regs[29], &sf->fp, err); __put_user_error(regs->regs[30], &sf->lr, err); + err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); + err |= setup_sigcontext(&sf->uc.uc_mcontext, regs); + + return err; +} + +int setup_sigcontext(struct sigcontext __user *uc_mcontext, + struct pt_regs *regs) +{ + void *aux = uc_mcontext->__reserved; + struct _aarch64_ctx *end; + int i, err = 0; for (i = 0; i < 31; i++) - __put_user_error(regs->regs[i], &sf->uc.uc_mcontext.regs[i], + __put_user_error(regs->regs[i], &uc_mcontext->regs[i], err); - __put_user_error(regs->sp, &sf->uc.uc_mcontext.sp, err); - __put_user_error(regs->pc, &sf->uc.uc_mcontext.pc, err); - __put_user_error(regs->pstate, &sf->uc.uc_mcontext.pstate, err); - __put_user_error(current->thread.fault_address, &sf->uc.uc_mcontext.fault_address, err); + __put_user_error(regs->sp, &uc_mcontext->sp, err); + __put_user_error(regs->pc, &uc_mcontext->pc, err); + __put_user_error(regs->pstate, &uc_mcontext->pstate, err); - err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); + __put_user_error(current->thread.fault_address, &uc_mcontext->fault_address, err); if (err == 0) { struct fpsimd_context *fpsimd_ctx = @@ -229,14 +251,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, return frame; } -static void setup_return(struct pt_regs *regs, struct k_sigaction *ka, - void __user *frame, int usig) +void setup_return(struct pt_regs *regs, struct k_sigaction *ka, + void __user *frame, off_t sigframe_off, int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; - regs->regs[29] = regs->sp + offsetof(struct rt_sigframe, fp); + regs->regs[29] = regs->sp + sigframe_off + offsetof(struct sigframe, fp); regs->pc = (unsigned long)ka->sa.sa_handler; if (ka->sa.sa_flags & SA_RESTORER) @@ -257,17 +279,18 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, if (!frame) return 1; - __put_user_error(0, &frame->uc.uc_flags, err); - __put_user_error(NULL, &frame->uc.uc_link, err); + __put_user_error(0, &frame->sig.uc.uc_flags, err); + __put_user_error(NULL, &frame->sig.uc.uc_link, err); - err |= __save_altstack(&frame->uc.uc_stack, regs->sp); - err |= setup_sigframe(frame, regs, set); + err |= __save_altstack(&frame->sig.uc.uc_stack, regs->sp); + err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) { - setup_return(regs, &ksig->ka, frame, usig); + setup_return(regs, &ksig->ka, frame, + offsetof(struct rt_sigframe, sig), usig); if (ksig->ka.sa.sa_flags & SA_SIGINFO) { err |= copy_siginfo_to_user(&frame->info, &ksig->info); regs->regs[1] = (unsigned long)&frame->info; - regs->regs[2] = (unsigned long)&frame->uc; + regs->regs[2] = (unsigned long)&frame->sig.uc; } } -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 19/23] arm64: signal: share lp64 signal routines to ilp32 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel After that, it will be possible to reuse it in ilp32. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/signal_common.h | 33 ++++++++++++ arch/arm64/kernel/signal.c | 91 +++++++++++++++++++++------------- 2 files changed, 90 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 0000000..756ed2c --- /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) 2016 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 <linux/uaccess.h> +#include <asm/ucontext.h> +#include <asm/fpsimd.h> + +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 be02f65..f9fbf8a 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -34,18 +34,23 @@ #include <asm/fpsimd.h> #include <asm/signal32.h> #include <asm/vdso.h> +#include <asm/signal_common.h> + +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 = ¤t->thread.fpsimd_state; int err; @@ -65,7 +70,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 +98,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(&set, &sf->uc.uc_sigmask, sizeof(set)); if (err == 0) set_current_blocked(&set); + err |= restore_sigcontext(regs, &sf->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], &sf->uc.uc_mcontext.regs[i], + __get_user_error(regs->regs[i], &uc_mcontext->regs[i], err); - __get_user_error(regs->sp, &sf->uc.uc_mcontext.sp, err); - __get_user_error(regs->pc, &sf->uc.uc_mcontext.pc, err); - __get_user_error(regs->pstate, &sf->uc.uc_mcontext.pstate, err); + __get_user_error(regs->sp, &uc_mcontext->sp, err); + __get_user_error(regs->pc, &uc_mcontext->pc, err); + __get_user_error(regs->pstate, &uc_mcontext->pstate, err); /* * Avoid sys_rt_sigreturn() restarting. @@ -145,10 +158,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, &frame->sig)) goto badframe; - if (restore_altstack(&frame->uc.uc_stack)) + if (restore_altstack(&frame->sig.uc.uc_stack)) goto badframe; return regs->regs[0]; @@ -162,27 +175,36 @@ badframe: return 0; } -static int setup_sigframe(struct rt_sigframe __user *sf, +static int setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set) { - int i, err = 0; - void *aux = sf->uc.uc_mcontext.__reserved; - struct _aarch64_ctx *end; + int err = 0; /* set up the stack frame for unwinding */ __put_user_error(regs->regs[29], &sf->fp, err); __put_user_error(regs->regs[30], &sf->lr, err); + err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); + err |= setup_sigcontext(&sf->uc.uc_mcontext, regs); + + return err; +} + +int setup_sigcontext(struct sigcontext __user *uc_mcontext, + struct pt_regs *regs) +{ + void *aux = uc_mcontext->__reserved; + struct _aarch64_ctx *end; + int i, err = 0; for (i = 0; i < 31; i++) - __put_user_error(regs->regs[i], &sf->uc.uc_mcontext.regs[i], + __put_user_error(regs->regs[i], &uc_mcontext->regs[i], err); - __put_user_error(regs->sp, &sf->uc.uc_mcontext.sp, err); - __put_user_error(regs->pc, &sf->uc.uc_mcontext.pc, err); - __put_user_error(regs->pstate, &sf->uc.uc_mcontext.pstate, err); - __put_user_error(current->thread.fault_address, &sf->uc.uc_mcontext.fault_address, err); + __put_user_error(regs->sp, &uc_mcontext->sp, err); + __put_user_error(regs->pc, &uc_mcontext->pc, err); + __put_user_error(regs->pstate, &uc_mcontext->pstate, err); - err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); + __put_user_error(current->thread.fault_address, &uc_mcontext->fault_address, err); if (err == 0) { struct fpsimd_context *fpsimd_ctx = @@ -229,14 +251,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, return frame; } -static void setup_return(struct pt_regs *regs, struct k_sigaction *ka, - void __user *frame, int usig) +void setup_return(struct pt_regs *regs, struct k_sigaction *ka, + void __user *frame, off_t sigframe_off, int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; - regs->regs[29] = regs->sp + offsetof(struct rt_sigframe, fp); + regs->regs[29] = regs->sp + sigframe_off + offsetof(struct sigframe, fp); regs->pc = (unsigned long)ka->sa.sa_handler; if (ka->sa.sa_flags & SA_RESTORER) @@ -257,17 +279,18 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, if (!frame) return 1; - __put_user_error(0, &frame->uc.uc_flags, err); - __put_user_error(NULL, &frame->uc.uc_link, err); + __put_user_error(0, &frame->sig.uc.uc_flags, err); + __put_user_error(NULL, &frame->sig.uc.uc_link, err); - err |= __save_altstack(&frame->uc.uc_stack, regs->sp); - err |= setup_sigframe(frame, regs, set); + err |= __save_altstack(&frame->sig.uc.uc_stack, regs->sp); + err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) { - setup_return(regs, &ksig->ka, frame, usig); + setup_return(regs, &ksig->ka, frame, + offsetof(struct rt_sigframe, sig), usig); if (ksig->ka.sa.sa_flags & SA_SIGINFO) { err |= copy_siginfo_to_user(&frame->info, &ksig->info); regs->regs[1] = (unsigned long)&frame->info; - regs->regs[2] = (unsigned long)&frame->uc; + regs->regs[2] = (unsigned long)&frame->sig.uc; } } -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 19/23] arm64: signal: share lp64 signal routines to ilp32 @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich After that, it will be possible to reuse it in ilp32. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/signal_common.h | 33 ++++++++++++ arch/arm64/kernel/signal.c | 91 +++++++++++++++++++++------------- 2 files changed, 90 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 0000000..756ed2c --- /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) 2016 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 <linux/uaccess.h> +#include <asm/ucontext.h> +#include <asm/fpsimd.h> + +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 be02f65..f9fbf8a 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -34,18 +34,23 @@ #include <asm/fpsimd.h> #include <asm/signal32.h> #include <asm/vdso.h> +#include <asm/signal_common.h> + +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 = ¤t->thread.fpsimd_state; int err; @@ -65,7 +70,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 +98,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(&set, &sf->uc.uc_sigmask, sizeof(set)); if (err == 0) set_current_blocked(&set); + err |= restore_sigcontext(regs, &sf->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], &sf->uc.uc_mcontext.regs[i], + __get_user_error(regs->regs[i], &uc_mcontext->regs[i], err); - __get_user_error(regs->sp, &sf->uc.uc_mcontext.sp, err); - __get_user_error(regs->pc, &sf->uc.uc_mcontext.pc, err); - __get_user_error(regs->pstate, &sf->uc.uc_mcontext.pstate, err); + __get_user_error(regs->sp, &uc_mcontext->sp, err); + __get_user_error(regs->pc, &uc_mcontext->pc, err); + __get_user_error(regs->pstate, &uc_mcontext->pstate, err); /* * Avoid sys_rt_sigreturn() restarting. @@ -145,10 +158,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, &frame->sig)) goto badframe; - if (restore_altstack(&frame->uc.uc_stack)) + if (restore_altstack(&frame->sig.uc.uc_stack)) goto badframe; return regs->regs[0]; @@ -162,27 +175,36 @@ badframe: return 0; } -static int setup_sigframe(struct rt_sigframe __user *sf, +static int setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set) { - int i, err = 0; - void *aux = sf->uc.uc_mcontext.__reserved; - struct _aarch64_ctx *end; + int err = 0; /* set up the stack frame for unwinding */ __put_user_error(regs->regs[29], &sf->fp, err); __put_user_error(regs->regs[30], &sf->lr, err); + err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); + err |= setup_sigcontext(&sf->uc.uc_mcontext, regs); + + return err; +} + +int setup_sigcontext(struct sigcontext __user *uc_mcontext, + struct pt_regs *regs) +{ + void *aux = uc_mcontext->__reserved; + struct _aarch64_ctx *end; + int i, err = 0; for (i = 0; i < 31; i++) - __put_user_error(regs->regs[i], &sf->uc.uc_mcontext.regs[i], + __put_user_error(regs->regs[i], &uc_mcontext->regs[i], err); - __put_user_error(regs->sp, &sf->uc.uc_mcontext.sp, err); - __put_user_error(regs->pc, &sf->uc.uc_mcontext.pc, err); - __put_user_error(regs->pstate, &sf->uc.uc_mcontext.pstate, err); - __put_user_error(current->thread.fault_address, &sf->uc.uc_mcontext.fault_address, err); + __put_user_error(regs->sp, &uc_mcontext->sp, err); + __put_user_error(regs->pc, &uc_mcontext->pc, err); + __put_user_error(regs->pstate, &uc_mcontext->pstate, err); - err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); + __put_user_error(current->thread.fault_address, &uc_mcontext->fault_address, err); if (err == 0) { struct fpsimd_context *fpsimd_ctx = @@ -229,14 +251,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, return frame; } -static void setup_return(struct pt_regs *regs, struct k_sigaction *ka, - void __user *frame, int usig) +void setup_return(struct pt_regs *regs, struct k_sigaction *ka, + void __user *frame, off_t sigframe_off, int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; - regs->regs[29] = regs->sp + offsetof(struct rt_sigframe, fp); + regs->regs[29] = regs->sp + sigframe_off + offsetof(struct sigframe, fp); regs->pc = (unsigned long)ka->sa.sa_handler; if (ka->sa.sa_flags & SA_RESTORER) @@ -257,17 +279,18 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, if (!frame) return 1; - __put_user_error(0, &frame->uc.uc_flags, err); - __put_user_error(NULL, &frame->uc.uc_link, err); + __put_user_error(0, &frame->sig.uc.uc_flags, err); + __put_user_error(NULL, &frame->sig.uc.uc_link, err); - err |= __save_altstack(&frame->uc.uc_stack, regs->sp); - err |= setup_sigframe(frame, regs, set); + err |= __save_altstack(&frame->sig.uc.uc_stack, regs->sp); + err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) { - setup_return(regs, &ksig->ka, frame, usig); + setup_return(regs, &ksig->ka, frame, + offsetof(struct rt_sigframe, sig), usig); if (ksig->ka.sa.sa_flags & SA_SIGINFO) { err |= copy_siginfo_to_user(&frame->info, &ksig->info); regs->regs[1] = (unsigned long)&frame->info; - regs->regs[2] = (unsigned long)&frame->uc; + regs->regs[2] = (unsigned long)&frame->sig.uc; } } -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 20/23] arm64: signal32: move ilp32 and aarch32 common code to separated file 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/signal32_common.h | 25 +++++++ arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/signal32.c | 85 ----------------------- arch/arm64/kernel/signal32_common.c | 115 +++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+), 85 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 0000000..b4f2099 --- /dev/null +++ b/arch/arm64/include/asm/signal32_common.h @@ -0,0 +1,25 @@ +/* + * 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); + +#endif /* CONFIG_COMPAT*/ + +#endif /* __ASM_SIGNAL32_COMMON_H */ + diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 7aa65ea..3ed55eb 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,6 +29,7 @@ arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o \ ../../arm/kernel/opcodes.o binfmt_elf32.o arm64-obj-$(CONFIG_ARM64_ILP32) += binfmt_ilp32.o sys_ilp32.o +arm64-obj-$(CONFIG_COMPAT) += 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 b7063de..b103af3 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c @@ -125,91 +125,6 @@ static inline int get_sigset_t(sigset_t *set, 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, &to->si_signo); - err |= __put_user(from->si_errno, &to->si_errno); - err |= __put_user((short)from->si_code, &to->si_code); - if (from->si_code < 0) - err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, - SI_PAD_SIZE); - else switch (from->si_code & __SI_MASK) { - case __SI_KILL: - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - break; - case __SI_TIMER: - err |= __put_user(from->si_tid, &to->si_tid); - err |= __put_user(from->si_overrun, &to->si_overrun); - err |= __put_user(from->si_int, &to->si_int); - break; - case __SI_POLL: - err |= __put_user(from->si_band, &to->si_band); - err |= __put_user(from->si_fd, &to->si_fd); - break; - case __SI_FAULT: - err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr, - &to->si_addr); -#ifdef BUS_MCEERR_AO - /* - * Other callers might not initialize the si_lsb field, - * so check explicitly for the right codes here. - */ - if (from->si_signo == SIGBUS && - (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO)) - err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); -#endif - break; - case __SI_CHLD: - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - err |= __put_user(from->si_status, &to->si_status); - err |= __put_user(from->si_utime, &to->si_utime); - err |= __put_user(from->si_stime, &to->si_stime); - break; - case __SI_RT: /* This is not generated by the kernel as of now. */ - case __SI_MESGQ: /* But this is */ - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - err |= __put_user(from->si_int, &to->si_int); - break; - case __SI_SYS: - err |= __put_user((compat_uptr_t)(unsigned long) - from->si_call_addr, &to->si_call_addr); - err |= __put_user(from->si_syscall, &to->si_syscall); - err |= __put_user(from->si_arch, &to->si_arch); - break; - default: /* this is just in case for now ... */ - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - break; - } - return err; -} - -int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) -{ - if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) || - copy_from_user(to->_sifields._pad, - from->_sifields._pad, SI_PAD_SIZE)) - return -EFAULT; - - 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 0000000..8fbb609 --- /dev/null +++ b/arch/arm64/kernel/signal32_common.c @@ -0,0 +1,115 @@ +/* + * Based on arch/arm/kernel/signal.c + * + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Modified by Will Deacon <will.deacon@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 <linux/compat.h> +#include <linux/signal.h> +#include <linux/ratelimit.h> + +#include <asm/esr.h> +#include <asm/fpsimd.h> +#include <asm/signal32_common.h> +#include <asm/uaccess.h> +#include <asm/unistd.h> + +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, &to->si_signo); + err |= __put_user(from->si_errno, &to->si_errno); + err |= __put_user((short)from->si_code, &to->si_code); + if (from->si_code < 0) + err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, + SI_PAD_SIZE); + else switch (from->si_code & __SI_MASK) { + case __SI_KILL: + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + break; + case __SI_TIMER: + err |= __put_user(from->si_tid, &to->si_tid); + err |= __put_user(from->si_overrun, &to->si_overrun); + err |= __put_user(from->si_int, &to->si_int); + break; + case __SI_POLL: + err |= __put_user(from->si_band, &to->si_band); + err |= __put_user(from->si_fd, &to->si_fd); + break; + case __SI_FAULT: + err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr, + &to->si_addr); +#ifdef BUS_MCEERR_AO + /* + * Other callers might not initialize the si_lsb field, + * so check explicitly for the right codes here. + */ + if (from->si_signo == SIGBUS && + (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO)) + err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); +#endif + break; + case __SI_CHLD: + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + err |= __put_user(from->si_status, &to->si_status); + err |= __put_user(from->si_utime, &to->si_utime); + err |= __put_user(from->si_stime, &to->si_stime); + break; + case __SI_RT: /* This is not generated by the kernel as of now. */ + case __SI_MESGQ: /* But this is */ + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + err |= __put_user(from->si_int, &to->si_int); + break; + case __SI_SYS: + err |= __put_user((compat_uptr_t)(unsigned long) + from->si_call_addr, &to->si_call_addr); + err |= __put_user(from->si_syscall, &to->si_syscall); + err |= __put_user(from->si_arch, &to->si_arch); + break; + default: /* this is just in case for now ... */ + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + break; + } + return err; +} + +int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) +{ + if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) || + copy_from_user(to->_sifields._pad, + from->_sifields._pad, SI_PAD_SIZE)) + return -EFAULT; + + return 0; +} + -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 20/23] arm64: signal32: move ilp32 and aarch32 common code to separated file @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/signal32_common.h | 25 +++++++ arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/signal32.c | 85 ----------------------- arch/arm64/kernel/signal32_common.c | 115 +++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+), 85 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 0000000..b4f2099 --- /dev/null +++ b/arch/arm64/include/asm/signal32_common.h @@ -0,0 +1,25 @@ +/* + * 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); + +#endif /* CONFIG_COMPAT*/ + +#endif /* __ASM_SIGNAL32_COMMON_H */ + diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 7aa65ea..3ed55eb 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,6 +29,7 @@ arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o \ ../../arm/kernel/opcodes.o binfmt_elf32.o arm64-obj-$(CONFIG_ARM64_ILP32) += binfmt_ilp32.o sys_ilp32.o +arm64-obj-$(CONFIG_COMPAT) += 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 b7063de..b103af3 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c @@ -125,91 +125,6 @@ static inline int get_sigset_t(sigset_t *set, 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, &to->si_signo); - err |= __put_user(from->si_errno, &to->si_errno); - err |= __put_user((short)from->si_code, &to->si_code); - if (from->si_code < 0) - err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, - SI_PAD_SIZE); - else switch (from->si_code & __SI_MASK) { - case __SI_KILL: - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - break; - case __SI_TIMER: - err |= __put_user(from->si_tid, &to->si_tid); - err |= __put_user(from->si_overrun, &to->si_overrun); - err |= __put_user(from->si_int, &to->si_int); - break; - case __SI_POLL: - err |= __put_user(from->si_band, &to->si_band); - err |= __put_user(from->si_fd, &to->si_fd); - break; - case __SI_FAULT: - err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr, - &to->si_addr); -#ifdef BUS_MCEERR_AO - /* - * Other callers might not initialize the si_lsb field, - * so check explicitly for the right codes here. - */ - if (from->si_signo == SIGBUS && - (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO)) - err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); -#endif - break; - case __SI_CHLD: - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - err |= __put_user(from->si_status, &to->si_status); - err |= __put_user(from->si_utime, &to->si_utime); - err |= __put_user(from->si_stime, &to->si_stime); - break; - case __SI_RT: /* This is not generated by the kernel as of now. */ - case __SI_MESGQ: /* But this is */ - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - err |= __put_user(from->si_int, &to->si_int); - break; - case __SI_SYS: - err |= __put_user((compat_uptr_t)(unsigned long) - from->si_call_addr, &to->si_call_addr); - err |= __put_user(from->si_syscall, &to->si_syscall); - err |= __put_user(from->si_arch, &to->si_arch); - break; - default: /* this is just in case for now ... */ - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - break; - } - return err; -} - -int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) -{ - if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) || - copy_from_user(to->_sifields._pad, - from->_sifields._pad, SI_PAD_SIZE)) - return -EFAULT; - - 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 0000000..8fbb609 --- /dev/null +++ b/arch/arm64/kernel/signal32_common.c @@ -0,0 +1,115 @@ +/* + * Based on arch/arm/kernel/signal.c + * + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Modified by Will Deacon <will.deacon@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 <linux/compat.h> +#include <linux/signal.h> +#include <linux/ratelimit.h> + +#include <asm/esr.h> +#include <asm/fpsimd.h> +#include <asm/signal32_common.h> +#include <asm/uaccess.h> +#include <asm/unistd.h> + +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, &to->si_signo); + err |= __put_user(from->si_errno, &to->si_errno); + err |= __put_user((short)from->si_code, &to->si_code); + if (from->si_code < 0) + err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, + SI_PAD_SIZE); + else switch (from->si_code & __SI_MASK) { + case __SI_KILL: + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + break; + case __SI_TIMER: + err |= __put_user(from->si_tid, &to->si_tid); + err |= __put_user(from->si_overrun, &to->si_overrun); + err |= __put_user(from->si_int, &to->si_int); + break; + case __SI_POLL: + err |= __put_user(from->si_band, &to->si_band); + err |= __put_user(from->si_fd, &to->si_fd); + break; + case __SI_FAULT: + err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr, + &to->si_addr); +#ifdef BUS_MCEERR_AO + /* + * Other callers might not initialize the si_lsb field, + * so check explicitly for the right codes here. + */ + if (from->si_signo == SIGBUS && + (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO)) + err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); +#endif + break; + case __SI_CHLD: + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + err |= __put_user(from->si_status, &to->si_status); + err |= __put_user(from->si_utime, &to->si_utime); + err |= __put_user(from->si_stime, &to->si_stime); + break; + case __SI_RT: /* This is not generated by the kernel as of now. */ + case __SI_MESGQ: /* But this is */ + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + err |= __put_user(from->si_int, &to->si_int); + break; + case __SI_SYS: + err |= __put_user((compat_uptr_t)(unsigned long) + from->si_call_addr, &to->si_call_addr); + err |= __put_user(from->si_syscall, &to->si_syscall); + err |= __put_user(from->si_arch, &to->si_arch); + break; + default: /* this is just in case for now ... */ + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + break; + } + return err; +} + +int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) +{ + if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) || + copy_from_user(to->_sifields._pad, + from->_sifields._pad, SI_PAD_SIZE)) + return -EFAULT; + + return 0; +} + -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 20/23] arm64: signal32: move ilp32 and aarch32 common code to separated file @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/signal32_common.h | 25 +++++++ arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/signal32.c | 85 ----------------------- arch/arm64/kernel/signal32_common.c | 115 +++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+), 85 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 0000000..b4f2099 --- /dev/null +++ b/arch/arm64/include/asm/signal32_common.h @@ -0,0 +1,25 @@ +/* + * 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); + +#endif /* CONFIG_COMPAT*/ + +#endif /* __ASM_SIGNAL32_COMMON_H */ + diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 7aa65ea..3ed55eb 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -29,6 +29,7 @@ arm64-obj-$(CONFIG_AARCH32_EL0) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o \ ../../arm/kernel/opcodes.o binfmt_elf32.o arm64-obj-$(CONFIG_ARM64_ILP32) += binfmt_ilp32.o sys_ilp32.o +arm64-obj-$(CONFIG_COMPAT) += 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 b7063de..b103af3 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c @@ -125,91 +125,6 @@ static inline int get_sigset_t(sigset_t *set, 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, &to->si_signo); - err |= __put_user(from->si_errno, &to->si_errno); - err |= __put_user((short)from->si_code, &to->si_code); - if (from->si_code < 0) - err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, - SI_PAD_SIZE); - else switch (from->si_code & __SI_MASK) { - case __SI_KILL: - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - break; - case __SI_TIMER: - err |= __put_user(from->si_tid, &to->si_tid); - err |= __put_user(from->si_overrun, &to->si_overrun); - err |= __put_user(from->si_int, &to->si_int); - break; - case __SI_POLL: - err |= __put_user(from->si_band, &to->si_band); - err |= __put_user(from->si_fd, &to->si_fd); - break; - case __SI_FAULT: - err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr, - &to->si_addr); -#ifdef BUS_MCEERR_AO - /* - * Other callers might not initialize the si_lsb field, - * so check explicitly for the right codes here. - */ - if (from->si_signo == SIGBUS && - (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO)) - err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); -#endif - break; - case __SI_CHLD: - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - err |= __put_user(from->si_status, &to->si_status); - err |= __put_user(from->si_utime, &to->si_utime); - err |= __put_user(from->si_stime, &to->si_stime); - break; - case __SI_RT: /* This is not generated by the kernel as of now. */ - case __SI_MESGQ: /* But this is */ - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - err |= __put_user(from->si_int, &to->si_int); - break; - case __SI_SYS: - err |= __put_user((compat_uptr_t)(unsigned long) - from->si_call_addr, &to->si_call_addr); - err |= __put_user(from->si_syscall, &to->si_syscall); - err |= __put_user(from->si_arch, &to->si_arch); - break; - default: /* this is just in case for now ... */ - err |= __put_user(from->si_pid, &to->si_pid); - err |= __put_user(from->si_uid, &to->si_uid); - break; - } - return err; -} - -int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) -{ - if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) || - copy_from_user(to->_sifields._pad, - from->_sifields._pad, SI_PAD_SIZE)) - return -EFAULT; - - 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 0000000..8fbb609 --- /dev/null +++ b/arch/arm64/kernel/signal32_common.c @@ -0,0 +1,115 @@ +/* + * Based on arch/arm/kernel/signal.c + * + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Modified by Will Deacon <will.deacon@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 <linux/compat.h> +#include <linux/signal.h> +#include <linux/ratelimit.h> + +#include <asm/esr.h> +#include <asm/fpsimd.h> +#include <asm/signal32_common.h> +#include <asm/uaccess.h> +#include <asm/unistd.h> + +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, &to->si_signo); + err |= __put_user(from->si_errno, &to->si_errno); + err |= __put_user((short)from->si_code, &to->si_code); + if (from->si_code < 0) + err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, + SI_PAD_SIZE); + else switch (from->si_code & __SI_MASK) { + case __SI_KILL: + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + break; + case __SI_TIMER: + err |= __put_user(from->si_tid, &to->si_tid); + err |= __put_user(from->si_overrun, &to->si_overrun); + err |= __put_user(from->si_int, &to->si_int); + break; + case __SI_POLL: + err |= __put_user(from->si_band, &to->si_band); + err |= __put_user(from->si_fd, &to->si_fd); + break; + case __SI_FAULT: + err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr, + &to->si_addr); +#ifdef BUS_MCEERR_AO + /* + * Other callers might not initialize the si_lsb field, + * so check explicitly for the right codes here. + */ + if (from->si_signo == SIGBUS && + (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO)) + err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); +#endif + break; + case __SI_CHLD: + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + err |= __put_user(from->si_status, &to->si_status); + err |= __put_user(from->si_utime, &to->si_utime); + err |= __put_user(from->si_stime, &to->si_stime); + break; + case __SI_RT: /* This is not generated by the kernel as of now. */ + case __SI_MESGQ: /* But this is */ + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + err |= __put_user(from->si_int, &to->si_int); + break; + case __SI_SYS: + err |= __put_user((compat_uptr_t)(unsigned long) + from->si_call_addr, &to->si_call_addr); + err |= __put_user(from->si_syscall, &to->si_syscall); + err |= __put_user(from->si_arch, &to->si_arch); + break; + default: /* this is just in case for now ... */ + err |= __put_user(from->si_pid, &to->si_pid); + err |= __put_user(from->si_uid, &to->si_uid); + break; + } + return err; +} + +int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) +{ + if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) || + copy_from_user(to->_sifields._pad, + from->_sifields._pad, SI_PAD_SIZE)) + return -EFAULT; + + return 0; +} + -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski From: Andrew Pinski <apinski@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.Pinski@caviumnetworks.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/signal_ilp32.h | 34 ++++++ arch/arm64/kernel/Makefile | 3 +- arch/arm64/kernel/entry_ilp32.S | 23 ++++ arch/arm64/kernel/signal.c | 3 + arch/arm64/kernel/signal_ilp32.c | 192 ++++++++++++++++++++++++++++++++++ arch/arm64/kernel/sys_ilp32.c | 3 + 6 files changed, 257 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 0000000..30eff23 --- /dev/null +++ b/arch/arm64/include/asm/signal_ilp32.h @@ -0,0 +1,34 @@ +/* + * 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_ILP32_H +#define __ASM_SIGNAL_ILP32_H + +#ifdef CONFIG_ARM64_ILP32 + +#include <linux/compat.h> + +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 3ed55eb..09e4373 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 \ ../../arm/kernel/opcodes.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) += 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 0000000..5063172 --- /dev/null +++ b/arch/arm64/kernel/entry_ilp32.S @@ -0,0 +1,23 @@ +/* + * 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 <linux/linkage.h> + +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 f9fbf8a..45bcd96 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -35,6 +35,7 @@ #include <asm/signal32.h> #include <asm/vdso.h> #include <asm/signal_common.h> +#include <asm/signal_ilp32.h> struct sigframe { struct ucontext uc; @@ -323,6 +324,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 mode 100644 index 0000000..841e8f8 --- /dev/null +++ b/arch/arm64/kernel/signal_ilp32.c @@ -0,0 +1,192 @@ +/* + * Based on arch/arm/kernel/signal.c + * + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2016 Cavium Networks. + * Yury Norov <ynorov@caviumnetworks.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/compat.h> +#include <linux/signal.h> +#include <linux/syscalls.h> +#include <linux/ratelimit.h> + +#include <asm/esr.h> +#include <asm/fpsimd.h> +#include <asm/signal32_common.h> +#include <asm/signal_common.h> +#include <asm/uaccess.h> +#include <asm/unistd.h> +#include <asm/ucontext.h> + + +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 ilp32_sigframe { + struct ilp32_ucontext uc; + u64 fp; + u64 lr; +}; + +struct ilp32_rt_sigframe { + struct compat_siginfo info; + struct ilp32_sigframe sig; +}; + +static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set) +{ + compat_sigset_t cset; + + cset.sig[0] = set->sig[0] & 0xffffffffull; + cset.sig[1] = set->sig[0] >> 32; + + return copy_to_user(uset, &cset, 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(&s32, uset, sizeof(*uset))) + return -EFAULT; + + set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); + return 0; +} + +static int restore_ilp32_sigframe(struct pt_regs *regs, + struct ilp32_sigframe __user *sf) +{ + sigset_t set; + int err; + err = get_sigset_t(&set, &sf->uc.uc_sigmask); + if (err == 0) + set_current_blocked(&set); + err |= restore_sigcontext(regs, &sf->uc.uc_mcontext); + return err; +} + +static int setup_ilp32_sigframe(struct ilp32_sigframe __user *sf, + struct pt_regs *regs, sigset_t *set) +{ + int err = 0; + /* set up the stack frame for unwinding */ + __put_user_error(regs->regs[29], &sf->fp, err); + __put_user_error(regs->regs[30], &sf->lr, err); + + err |= put_sigset_t(&sf->uc.uc_sigmask, set); + err |= setup_sigcontext(&sf->uc.uc_mcontext, regs); + return err; +} + +asmlinkage long ilp32_sys_rt_sigreturn(struct pt_regs *regs) +{ + struct ilp32_rt_sigframe __user *frame; + + /* Always make any pending restarted system calls return -EINTR */ + current->restart_block.fn = do_no_restart_syscall; + + /* + * Since we stacked the signal on a 128-bit boundary, + * then 'sp' should be word aligned here. If it's + * not, then the user is trying to mess with us. + */ + if (regs->sp & 15) + goto badframe; + + frame = (struct ilp32_rt_sigframe __user *)regs->sp; + + if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) + goto badframe; + + if (restore_ilp32_sigframe(regs, &frame->sig)) + goto badframe; + + if (compat_restore_altstack(&frame->sig.uc.uc_stack)) + goto badframe; + + return regs->regs[0]; + +badframe: + if (show_unhandled_signals) + pr_info_ratelimited("%s[%d]: bad frame in %s: pc=%08llx sp=%08llx\n", + current->comm, task_pid_nr(current), __func__, + regs->pc, regs->compat_sp); + force_sig(SIGSEGV, current); + return 0; +} + +static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, + struct pt_regs *regs) +{ + unsigned long sp, sp_top; + struct ilp32_rt_sigframe __user *frame; + + sp = sp_top = sigsp(regs->sp, ksig); + + sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; + frame = (struct ilp32_rt_sigframe __user *)sp; + + /* + * Check that we can actually write to the signal frame. + */ + if (!access_ok(VERIFY_WRITE, frame, sp_top - sp)) + frame = NULL; + + return frame; +} + +/* + * ILP32 signal handling routines called from signal.c + */ +int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, + sigset_t *set, struct pt_regs *regs) +{ + struct ilp32_rt_sigframe __user *frame; + int err = 0; + + frame = ilp32_get_sigframe(ksig, regs); + + if (!frame) + return 1; + + err |= copy_siginfo_to_user32(&frame->info, &ksig->info); + + __put_user_error(0, &frame->sig.uc.uc_flags, err); + __put_user_error(0, &frame->sig.uc.uc_link, err); + + err |= __compat_save_altstack(&frame->sig.uc.uc_stack, regs->sp); + err |= setup_ilp32_sigframe(&frame->sig, regs, set); + if (err == 0) { + setup_return(regs, &ksig->ka, frame, + offsetof(struct ilp32_rt_sigframe, sig), usig); + regs->regs[1] = (unsigned long)&frame->info; + regs->regs[2] = (unsigned long)&frame->sig.uc; + } + + return err; +} + diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c index d4cd2a9..a31d538 100644 --- a/arch/arm64/kernel/sys_ilp32.c +++ b/arch/arm64/kernel/sys_ilp32.c @@ -65,6 +65,9 @@ static unsigned long compat_sys_pwrite64(unsigned int fd, return sys_pwrite64(fd, (char *) ubuf, count, offset); } +asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); +#define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper + #include <asm/syscall.h> #undef __SYSCALL -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel From: Andrew Pinski <apinski@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.Pinski@caviumnetworks.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/signal_ilp32.h | 34 ++++++ arch/arm64/kernel/Makefile | 3 +- arch/arm64/kernel/entry_ilp32.S | 23 ++++ arch/arm64/kernel/signal.c | 3 + arch/arm64/kernel/signal_ilp32.c | 192 ++++++++++++++++++++++++++++++++++ arch/arm64/kernel/sys_ilp32.c | 3 + 6 files changed, 257 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 0000000..30eff23 --- /dev/null +++ b/arch/arm64/include/asm/signal_ilp32.h @@ -0,0 +1,34 @@ +/* + * 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_ILP32_H +#define __ASM_SIGNAL_ILP32_H + +#ifdef CONFIG_ARM64_ILP32 + +#include <linux/compat.h> + +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 3ed55eb..09e4373 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 \ ../../arm/kernel/opcodes.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) += 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 0000000..5063172 --- /dev/null +++ b/arch/arm64/kernel/entry_ilp32.S @@ -0,0 +1,23 @@ +/* + * 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 <linux/linkage.h> + +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 f9fbf8a..45bcd96 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -35,6 +35,7 @@ #include <asm/signal32.h> #include <asm/vdso.h> #include <asm/signal_common.h> +#include <asm/signal_ilp32.h> struct sigframe { struct ucontext uc; @@ -323,6 +324,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 mode 100644 index 0000000..841e8f8 --- /dev/null +++ b/arch/arm64/kernel/signal_ilp32.c @@ -0,0 +1,192 @@ +/* + * Based on arch/arm/kernel/signal.c + * + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2016 Cavium Networks. + * Yury Norov <ynorov@caviumnetworks.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/compat.h> +#include <linux/signal.h> +#include <linux/syscalls.h> +#include <linux/ratelimit.h> + +#include <asm/esr.h> +#include <asm/fpsimd.h> +#include <asm/signal32_common.h> +#include <asm/signal_common.h> +#include <asm/uaccess.h> +#include <asm/unistd.h> +#include <asm/ucontext.h> + + +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 ilp32_sigframe { + struct ilp32_ucontext uc; + u64 fp; + u64 lr; +}; + +struct ilp32_rt_sigframe { + struct compat_siginfo info; + struct ilp32_sigframe sig; +}; + +static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set) +{ + compat_sigset_t cset; + + cset.sig[0] = set->sig[0] & 0xffffffffull; + cset.sig[1] = set->sig[0] >> 32; + + return copy_to_user(uset, &cset, 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(&s32, uset, sizeof(*uset))) + return -EFAULT; + + set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); + return 0; +} + +static int restore_ilp32_sigframe(struct pt_regs *regs, + struct ilp32_sigframe __user *sf) +{ + sigset_t set; + int err; + err = get_sigset_t(&set, &sf->uc.uc_sigmask); + if (err == 0) + set_current_blocked(&set); + err |= restore_sigcontext(regs, &sf->uc.uc_mcontext); + return err; +} + +static int setup_ilp32_sigframe(struct ilp32_sigframe __user *sf, + struct pt_regs *regs, sigset_t *set) +{ + int err = 0; + /* set up the stack frame for unwinding */ + __put_user_error(regs->regs[29], &sf->fp, err); + __put_user_error(regs->regs[30], &sf->lr, err); + + err |= put_sigset_t(&sf->uc.uc_sigmask, set); + err |= setup_sigcontext(&sf->uc.uc_mcontext, regs); + return err; +} + +asmlinkage long ilp32_sys_rt_sigreturn(struct pt_regs *regs) +{ + struct ilp32_rt_sigframe __user *frame; + + /* Always make any pending restarted system calls return -EINTR */ + current->restart_block.fn = do_no_restart_syscall; + + /* + * Since we stacked the signal on a 128-bit boundary, + * then 'sp' should be word aligned here. If it's + * not, then the user is trying to mess with us. + */ + if (regs->sp & 15) + goto badframe; + + frame = (struct ilp32_rt_sigframe __user *)regs->sp; + + if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) + goto badframe; + + if (restore_ilp32_sigframe(regs, &frame->sig)) + goto badframe; + + if (compat_restore_altstack(&frame->sig.uc.uc_stack)) + goto badframe; + + return regs->regs[0]; + +badframe: + if (show_unhandled_signals) + pr_info_ratelimited("%s[%d]: bad frame in %s: pc=%08llx sp=%08llx\n", + current->comm, task_pid_nr(current), __func__, + regs->pc, regs->compat_sp); + force_sig(SIGSEGV, current); + return 0; +} + +static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, + struct pt_regs *regs) +{ + unsigned long sp, sp_top; + struct ilp32_rt_sigframe __user *frame; + + sp = sp_top = sigsp(regs->sp, ksig); + + sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; + frame = (struct ilp32_rt_sigframe __user *)sp; + + /* + * Check that we can actually write to the signal frame. + */ + if (!access_ok(VERIFY_WRITE, frame, sp_top - sp)) + frame = NULL; + + return frame; +} + +/* + * ILP32 signal handling routines called from signal.c + */ +int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, + sigset_t *set, struct pt_regs *regs) +{ + struct ilp32_rt_sigframe __user *frame; + int err = 0; + + frame = ilp32_get_sigframe(ksig, regs); + + if (!frame) + return 1; + + err |= copy_siginfo_to_user32(&frame->info, &ksig->info); + + __put_user_error(0, &frame->sig.uc.uc_flags, err); + __put_user_error(0, &frame->sig.uc.uc_link, err); + + err |= __compat_save_altstack(&frame->sig.uc.uc_stack, regs->sp); + err |= setup_ilp32_sigframe(&frame->sig, regs, set); + if (err == 0) { + setup_return(regs, &ksig->ka, frame, + offsetof(struct ilp32_rt_sigframe, sig), usig); + regs->regs[1] = (unsigned long)&frame->info; + regs->regs[2] = (unsigned long)&frame->sig.uc; + } + + return err; +} + diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c index d4cd2a9..a31d538 100644 --- a/arch/arm64/kernel/sys_ilp32.c +++ b/arch/arm64/kernel/sys_ilp32.c @@ -65,6 +65,9 @@ static unsigned long compat_sys_pwrite64(unsigned int fd, return sys_pwrite64(fd, (char *) ubuf, count, offset); } +asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); +#define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper + #include <asm/syscall.h> #undef __SYSCALL -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski From: Andrew Pinski <apinski@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.Pinski@caviumnetworks.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/signal_ilp32.h | 34 ++++++ arch/arm64/kernel/Makefile | 3 +- arch/arm64/kernel/entry_ilp32.S | 23 ++++ arch/arm64/kernel/signal.c | 3 + arch/arm64/kernel/signal_ilp32.c | 192 ++++++++++++++++++++++++++++++++++ arch/arm64/kernel/sys_ilp32.c | 3 + 6 files changed, 257 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 0000000..30eff23 --- /dev/null +++ b/arch/arm64/include/asm/signal_ilp32.h @@ -0,0 +1,34 @@ +/* + * 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_ILP32_H +#define __ASM_SIGNAL_ILP32_H + +#ifdef CONFIG_ARM64_ILP32 + +#include <linux/compat.h> + +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 3ed55eb..09e4373 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 \ ../../arm/kernel/opcodes.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) += 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 0000000..5063172 --- /dev/null +++ b/arch/arm64/kernel/entry_ilp32.S @@ -0,0 +1,23 @@ +/* + * 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 <linux/linkage.h> + +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 f9fbf8a..45bcd96 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -35,6 +35,7 @@ #include <asm/signal32.h> #include <asm/vdso.h> #include <asm/signal_common.h> +#include <asm/signal_ilp32.h> struct sigframe { struct ucontext uc; @@ -323,6 +324,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 mode 100644 index 0000000..841e8f8 --- /dev/null +++ b/arch/arm64/kernel/signal_ilp32.c @@ -0,0 +1,192 @@ +/* + * Based on arch/arm/kernel/signal.c + * + * Copyright (C) 1995-2009 Russell King + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2016 Cavium Networks. + * Yury Norov <ynorov@caviumnetworks.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/compat.h> +#include <linux/signal.h> +#include <linux/syscalls.h> +#include <linux/ratelimit.h> + +#include <asm/esr.h> +#include <asm/fpsimd.h> +#include <asm/signal32_common.h> +#include <asm/signal_common.h> +#include <asm/uaccess.h> +#include <asm/unistd.h> +#include <asm/ucontext.h> + + +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 ilp32_sigframe { + struct ilp32_ucontext uc; + u64 fp; + u64 lr; +}; + +struct ilp32_rt_sigframe { + struct compat_siginfo info; + struct ilp32_sigframe sig; +}; + +static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set) +{ + compat_sigset_t cset; + + cset.sig[0] = set->sig[0] & 0xffffffffull; + cset.sig[1] = set->sig[0] >> 32; + + return copy_to_user(uset, &cset, 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(&s32, uset, sizeof(*uset))) + return -EFAULT; + + set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); + return 0; +} + +static int restore_ilp32_sigframe(struct pt_regs *regs, + struct ilp32_sigframe __user *sf) +{ + sigset_t set; + int err; + err = get_sigset_t(&set, &sf->uc.uc_sigmask); + if (err == 0) + set_current_blocked(&set); + err |= restore_sigcontext(regs, &sf->uc.uc_mcontext); + return err; +} + +static int setup_ilp32_sigframe(struct ilp32_sigframe __user *sf, + struct pt_regs *regs, sigset_t *set) +{ + int err = 0; + /* set up the stack frame for unwinding */ + __put_user_error(regs->regs[29], &sf->fp, err); + __put_user_error(regs->regs[30], &sf->lr, err); + + err |= put_sigset_t(&sf->uc.uc_sigmask, set); + err |= setup_sigcontext(&sf->uc.uc_mcontext, regs); + return err; +} + +asmlinkage long ilp32_sys_rt_sigreturn(struct pt_regs *regs) +{ + struct ilp32_rt_sigframe __user *frame; + + /* Always make any pending restarted system calls return -EINTR */ + current->restart_block.fn = do_no_restart_syscall; + + /* + * Since we stacked the signal on a 128-bit boundary, + * then 'sp' should be word aligned here. If it's + * not, then the user is trying to mess with us. + */ + if (regs->sp & 15) + goto badframe; + + frame = (struct ilp32_rt_sigframe __user *)regs->sp; + + if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) + goto badframe; + + if (restore_ilp32_sigframe(regs, &frame->sig)) + goto badframe; + + if (compat_restore_altstack(&frame->sig.uc.uc_stack)) + goto badframe; + + return regs->regs[0]; + +badframe: + if (show_unhandled_signals) + pr_info_ratelimited("%s[%d]: bad frame in %s: pc=%08llx sp=%08llx\n", + current->comm, task_pid_nr(current), __func__, + regs->pc, regs->compat_sp); + force_sig(SIGSEGV, current); + return 0; +} + +static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, + struct pt_regs *regs) +{ + unsigned long sp, sp_top; + struct ilp32_rt_sigframe __user *frame; + + sp = sp_top = sigsp(regs->sp, ksig); + + sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; + frame = (struct ilp32_rt_sigframe __user *)sp; + + /* + * Check that we can actually write to the signal frame. + */ + if (!access_ok(VERIFY_WRITE, frame, sp_top - sp)) + frame = NULL; + + return frame; +} + +/* + * ILP32 signal handling routines called from signal.c + */ +int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, + sigset_t *set, struct pt_regs *regs) +{ + struct ilp32_rt_sigframe __user *frame; + int err = 0; + + frame = ilp32_get_sigframe(ksig, regs); + + if (!frame) + return 1; + + err |= copy_siginfo_to_user32(&frame->info, &ksig->info); + + __put_user_error(0, &frame->sig.uc.uc_flags, err); + __put_user_error(0, &frame->sig.uc.uc_link, err); + + err |= __compat_save_altstack(&frame->sig.uc.uc_stack, regs->sp); + err |= setup_ilp32_sigframe(&frame->sig, regs, set); + if (err == 0) { + setup_return(regs, &ksig->ka, frame, + offsetof(struct ilp32_rt_sigframe, sig), usig); + regs->regs[1] = (unsigned long)&frame->info; + regs->regs[2] = (unsigned long)&frame->sig.uc; + } + + return err; +} + diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c index d4cd2a9..a31d538 100644 --- a/arch/arm64/kernel/sys_ilp32.c +++ b/arch/arm64/kernel/sys_ilp32.c @@ -65,6 +65,9 @@ static unsigned long compat_sys_pwrite64(unsigned int fd, return sys_pwrite64(fd, (char *) ubuf, count, offset); } +asmlinkage long ilp32_sys_rt_sigreturn_wrapper(void); +#define compat_sys_rt_sigreturn ilp32_sys_rt_sigreturn_wrapper + #include <asm/syscall.h> #undef __SYSCALL -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext 2016-05-24 0:04 ` Yury Norov (?) @ 2016-06-04 11:34 ` Zhangjian (Bamvor) -1 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-04 11:34 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) Hi, I found an issue of unwind with the following code. The correct backtrace should be: (gdb) where #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 #1 <signal handler called> #2 func2 (num=0) at test_force3.c:22 #3 0x00400540 in func1 (num=1) at test_force3.c:28 #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 Without my patch, the backtrace is: (gdb) where #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 #1 <signal handler called> #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 With my patch which fix the wrong frame pointer(setup_return calculate the offset of fp through ilp32_sigframe instead of sigfreame), the backtrace is: (gdb) where #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 #1 <signal handler called> #2 func1 () at test_force3.c:28 #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 does not work correctly when unwind without framepointer. The test code is: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void my_sig(int sig) { printf("sig=%d\n", sig); *(int *)0 = 0x0; } void func2() { *(int *)0 = 0x0; } void func1() { func2(); } int main(int argc, char **argv) { signal(11, my_sig); func1(); return 0; } The full patch is as follows: From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> Date: Sat, 4 Jun 2016 14:30:05 +0800 Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the new fp ILP32 define its own sigframe(ilp32_sigframe) because of the difference uc_context. setup_return do not use ilp32 specific sigframe to calculate the new offset of fp which lead to wrong fp in signal handler. At this circumstance, gdb backtrace will miss one item: (gdb) where It should be: (gdb) where The test code is as follows: void my_sig(int sig) { printf("sig=%d\n", sig); *(int *)0 = 0x0; } void func2(int num) { printf("%s: %d\n", __FUNCTION__, num); *(int *)0 = 0x0; func2(num-1); } void func1(int num) { printf("%s\n", __FUNCTION__); func2(num - 1); } int main(int argc, char **argv) { signal(11, my_sig); func1(argc); return 0; } This patch fix this by passing the correct offset of fp to setup_return. Test pass on both ILP32 and LP64 in aarch64 EE. Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> --- arch/arm64/include/asm/signal_common.h | 3 ++- arch/arm64/kernel/signal.c | 9 +++++---- arch/arm64/kernel/signal_ilp32.c | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h index de93c71..a5d7b63 100644 --- a/arch/arm64/include/asm/signal_common.h +++ b/arch/arm64/include/asm/signal_common.h @@ -29,6 +29,7 @@ int setup_sigcontex(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); + void __user *frame, off_t sigframe_off, off_t fp_off, + int usig); #endif /* __ASM_SIGNAL_COMMON_H */ diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 038bebe..e66a6e9 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, } void setup_return(struct pt_regs *regs, struct k_sigaction *ka, - void __user *frame, off_t sigframe_off, int usig) + void __user *frame, off_t sigframe_off, off_t fp_off, + int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; - regs->regs[29] = regs->sp + sigframe_off + - offsetof(struct sigframe, fp); + regs->regs[29] = regs->sp + sigframe_off + fp_off; regs->pc = (unsigned long)ka->sa.sa_handler; if (ka->sa.sa_flags & SA_RESTORER) @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) { setup_return(regs, &ksig->ka, frame, - offsetof(struct rt_sigframe, sig), usig); + offsetof(struct rt_sigframe, sig), + offsetof(struct sigframe, fp), usig); if (ksig->ka.sa.sa_flags & SA_SIGINFO) { err |= copy_siginfo_to_user(&frame->info, &ksig->info); regs->regs[1] = (unsigned long)&frame->info; diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c index a8ea73e..9030f14 100644 --- a/arch/arm64/kernel/signal_ilp32.c +++ b/arch/arm64/kernel/signal_ilp32.c @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, struct ilp32_rt_sigframe __user *frame; sp = sp_top = sigsp(regs->sp, ksig); - sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; frame = (struct ilp32_rt_sigframe __user *)sp; @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, err |= setup_ilp32_sigframe(&frame->sig, regs, set); if (err == 0) { setup_return(regs, &ksig->ka, frame, - offsetof(struct ilp32_rt_sigframe, sig), usig); + offsetof(struct ilp32_rt_sigframe, sig), + offsetof(struct ilp32_sigframe, fp), usig); regs->regs[1] = (unsigned long)&frame->info; regs->regs[2] = (unsigned long)&frame->sig.uc; } -- 1.8.4.5 Regards Bamvor ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-04 11:34 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-04 11:34 UTC (permalink / raw) To: linux-arm-kernel Hi, I found an issue of unwind with the following code. The correct backtrace should be: (gdb) where #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 #1 <signal handler called> #2 func2 (num=0) at test_force3.c:22 #3 0x00400540 in func1 (num=1) at test_force3.c:28 #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 Without my patch, the backtrace is: (gdb) where #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 #1 <signal handler called> #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 With my patch which fix the wrong frame pointer(setup_return calculate the offset of fp through ilp32_sigframe instead of sigfreame), the backtrace is: (gdb) where #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 #1 <signal handler called> #2 func1 () at test_force3.c:28 #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 does not work correctly when unwind without framepointer. The test code is: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void my_sig(int sig) { printf("sig=%d\n", sig); *(int *)0 = 0x0; } void func2() { *(int *)0 = 0x0; } void func1() { func2(); } int main(int argc, char **argv) { signal(11, my_sig); func1(); return 0; } The full patch is as follows: From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> Date: Sat, 4 Jun 2016 14:30:05 +0800 Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the new fp ILP32 define its own sigframe(ilp32_sigframe) because of the difference uc_context. setup_return do not use ilp32 specific sigframe to calculate the new offset of fp which lead to wrong fp in signal handler. At this circumstance, gdb backtrace will miss one item: (gdb) where It should be: (gdb) where The test code is as follows: void my_sig(int sig) { printf("sig=%d\n", sig); *(int *)0 = 0x0; } void func2(int num) { printf("%s: %d\n", __FUNCTION__, num); *(int *)0 = 0x0; func2(num-1); } void func1(int num) { printf("%s\n", __FUNCTION__); func2(num - 1); } int main(int argc, char **argv) { signal(11, my_sig); func1(argc); return 0; } This patch fix this by passing the correct offset of fp to setup_return. Test pass on both ILP32 and LP64 in aarch64 EE. Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> --- arch/arm64/include/asm/signal_common.h | 3 ++- arch/arm64/kernel/signal.c | 9 +++++---- arch/arm64/kernel/signal_ilp32.c | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h index de93c71..a5d7b63 100644 --- a/arch/arm64/include/asm/signal_common.h +++ b/arch/arm64/include/asm/signal_common.h @@ -29,6 +29,7 @@ int setup_sigcontex(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); + void __user *frame, off_t sigframe_off, off_t fp_off, + int usig); #endif /* __ASM_SIGNAL_COMMON_H */ diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 038bebe..e66a6e9 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, } void setup_return(struct pt_regs *regs, struct k_sigaction *ka, - void __user *frame, off_t sigframe_off, int usig) + void __user *frame, off_t sigframe_off, off_t fp_off, + int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; - regs->regs[29] = regs->sp + sigframe_off + - offsetof(struct sigframe, fp); + regs->regs[29] = regs->sp + sigframe_off + fp_off; regs->pc = (unsigned long)ka->sa.sa_handler; if (ka->sa.sa_flags & SA_RESTORER) @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) { setup_return(regs, &ksig->ka, frame, - offsetof(struct rt_sigframe, sig), usig); + offsetof(struct rt_sigframe, sig), + offsetof(struct sigframe, fp), usig); if (ksig->ka.sa.sa_flags & SA_SIGINFO) { err |= copy_siginfo_to_user(&frame->info, &ksig->info); regs->regs[1] = (unsigned long)&frame->info; diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c index a8ea73e..9030f14 100644 --- a/arch/arm64/kernel/signal_ilp32.c +++ b/arch/arm64/kernel/signal_ilp32.c @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, struct ilp32_rt_sigframe __user *frame; sp = sp_top = sigsp(regs->sp, ksig); - sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; frame = (struct ilp32_rt_sigframe __user *)sp; @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, err |= setup_ilp32_sigframe(&frame->sig, regs, set); if (err == 0) { setup_return(regs, &ksig->ka, frame, - offsetof(struct ilp32_rt_sigframe, sig), usig); + offsetof(struct ilp32_rt_sigframe, sig), + offsetof(struct ilp32_sigframe, fp), usig); regs->regs[1] = (unsigned long)&frame->info; regs->regs[2] = (unsigned long)&frame->sig.uc; } -- 1.8.4.5 Regards Bamvor ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-04 11:34 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-04 11:34 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) Hi, I found an issue of unwind with the following code. The correct backtrace should be: (gdb) where #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 #1 <signal handler called> #2 func2 (num=0) at test_force3.c:22 #3 0x00400540 in func1 (num=1) at test_force3.c:28 #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 Without my patch, the backtrace is: (gdb) where #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 #1 <signal handler called> #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 With my patch which fix the wrong frame pointer(setup_return calculate the offset of fp through ilp32_sigframe instead of sigfreame), the backtrace is: (gdb) where #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 #1 <signal handler called> #2 func1 () at test_force3.c:28 #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 does not work correctly when unwind without framepointer. The test code is: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void my_sig(int sig) { printf("sig=%d\n", sig); *(int *)0 = 0x0; } void func2() { *(int *)0 = 0x0; } void func1() { func2(); } int main(int argc, char **argv) { signal(11, my_sig); func1(); return 0; } The full patch is as follows: From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> Date: Sat, 4 Jun 2016 14:30:05 +0800 Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the new fp ILP32 define its own sigframe(ilp32_sigframe) because of the difference uc_context. setup_return do not use ilp32 specific sigframe to calculate the new offset of fp which lead to wrong fp in signal handler. At this circumstance, gdb backtrace will miss one item: (gdb) where It should be: (gdb) where The test code is as follows: void my_sig(int sig) { printf("sig=%d\n", sig); *(int *)0 = 0x0; } void func2(int num) { printf("%s: %d\n", __FUNCTION__, num); *(int *)0 = 0x0; func2(num-1); } void func1(int num) { printf("%s\n", __FUNCTION__); func2(num - 1); } int main(int argc, char **argv) { signal(11, my_sig); func1(argc); return 0; } This patch fix this by passing the correct offset of fp to setup_return. Test pass on both ILP32 and LP64 in aarch64 EE. Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> --- arch/arm64/include/asm/signal_common.h | 3 ++- arch/arm64/kernel/signal.c | 9 +++++---- arch/arm64/kernel/signal_ilp32.c | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h index de93c71..a5d7b63 100644 --- a/arch/arm64/include/asm/signal_common.h +++ b/arch/arm64/include/asm/signal_common.h @@ -29,6 +29,7 @@ int setup_sigcontex(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); + void __user *frame, off_t sigframe_off, off_t fp_off, + int usig); #endif /* __ASM_SIGNAL_COMMON_H */ diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 038bebe..e66a6e9 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, } void setup_return(struct pt_regs *regs, struct k_sigaction *ka, - void __user *frame, off_t sigframe_off, int usig) + void __user *frame, off_t sigframe_off, off_t fp_off, + int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; - regs->regs[29] = regs->sp + sigframe_off + - offsetof(struct sigframe, fp); + regs->regs[29] = regs->sp + sigframe_off + fp_off; regs->pc = (unsigned long)ka->sa.sa_handler; if (ka->sa.sa_flags & SA_RESTORER) @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) { setup_return(regs, &ksig->ka, frame, - offsetof(struct rt_sigframe, sig), usig); + offsetof(struct rt_sigframe, sig), + offsetof(struct sigframe, fp), usig); if (ksig->ka.sa.sa_flags & SA_SIGINFO) { err |= copy_siginfo_to_user(&frame->info, &ksig->info); regs->regs[1] = (unsigned long)&frame->info; diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c index a8ea73e..9030f14 100644 --- a/arch/arm64/kernel/signal_ilp32.c +++ b/arch/arm64/kernel/signal_ilp32.c @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, struct ilp32_rt_sigframe __user *frame; sp = sp_top = sigsp(regs->sp, ksig); - sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; frame = (struct ilp32_rt_sigframe __user *)sp; @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, err |= setup_ilp32_sigframe(&frame->sig, regs, set); if (err == 0) { setup_return(regs, &ksig->ka, frame, - offsetof(struct ilp32_rt_sigframe, sig), usig); + offsetof(struct ilp32_rt_sigframe, sig), + offsetof(struct ilp32_sigframe, fp), usig); regs->regs[1] = (unsigned long)&frame->info; regs->regs[2] = (unsigned long)&frame->sig.uc; } -- 1.8.4.5 Regards Bamvor ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext 2016-06-04 11:34 ` Zhangjian (Bamvor) (?) @ 2016-06-12 12:34 ` Zhangjian (Bamvor) -1 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 12:34 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) ping On 2016/6/4 19:34, Zhangjian (Bamvor) wrote: > Hi, > > I found an issue of unwind with the following code. The correct backtrace > should be: > (gdb) where > #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func2 (num=0) at test_force3.c:22 > #3 0x00400540 in func1 (num=1) at test_force3.c:28 > #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 > > Without my patch, the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > With my patch which fix the wrong frame pointer(setup_return calculate the offset > of fp through ilp32_sigframe instead of sigfreame), the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func1 () at test_force3.c:28 > #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 > does not work correctly when unwind without framepointer. > > The test code is: > > #include <stdio.h> > #include <stdlib.h> > #include <unistd.h> > #include <signal.h> > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > > void func2() > { > *(int *)0 = 0x0; > } > > void func1() > { > func2(); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(); > return 0; > } > > > The full patch is as follows: > > From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Sat, 4 Jun 2016 14:30:05 +0800 > Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the > new fp > > ILP32 define its own sigframe(ilp32_sigframe) because of the > difference uc_context. setup_return do not use ilp32 specific > sigframe to calculate the new offset of fp which lead to wrong > fp in signal handler. At this circumstance, gdb backtrace will miss > one item: > (gdb) where > > It should be: > (gdb) where > > The test code is as follows: > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > void func2(int num) > { > printf("%s: %d\n", __FUNCTION__, num); > *(int *)0 = 0x0; > func2(num-1); > } > > void func1(int num) > { > printf("%s\n", __FUNCTION__); > func2(num - 1); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(argc); > return 0; > } > > This patch fix this by passing the correct offset of fp to > setup_return. > Test pass on both ILP32 and LP64 in aarch64 EE. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/signal_common.h | 3 ++- > arch/arm64/kernel/signal.c | 9 +++++---- > arch/arm64/kernel/signal_ilp32.c | 4 ++-- > 3 files changed, 9 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h > index de93c71..a5d7b63 100644 > --- a/arch/arm64/include/asm/signal_common.h > +++ b/arch/arm64/include/asm/signal_common.h > @@ -29,6 +29,7 @@ int setup_sigcontex(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); > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig); > > #endif /* __ASM_SIGNAL_COMMON_H */ > diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c > index 038bebe..e66a6e9 100644 > --- a/arch/arm64/kernel/signal.c > +++ b/arch/arm64/kernel/signal.c > @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, > } > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > - void __user *frame, off_t sigframe_off, int usig) > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > - regs->regs[29] = regs->sp + sigframe_off + > - offsetof(struct sigframe, fp); > + regs->regs[29] = regs->sp + sigframe_off + fp_off; > regs->pc = (unsigned long)ka->sa.sa_handler; > > if (ka->sa.sa_flags & SA_RESTORER) > @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, > err |= setup_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct rt_sigframe, sig), usig); > + offsetof(struct rt_sigframe, sig), > + offsetof(struct sigframe, fp), usig); > if (ksig->ka.sa.sa_flags & SA_SIGINFO) { > err |= copy_siginfo_to_user(&frame->info, &ksig->info); > regs->regs[1] = (unsigned long)&frame->info; > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > index a8ea73e..9030f14 100644 > --- a/arch/arm64/kernel/signal_ilp32.c > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, > struct ilp32_rt_sigframe __user *frame; > > sp = sp_top = sigsp(regs->sp, ksig); > - > sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; > frame = (struct ilp32_rt_sigframe __user *)sp; > > @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, > err |= setup_ilp32_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct ilp32_rt_sigframe, sig), usig); > + offsetof(struct ilp32_rt_sigframe, sig), > + offsetof(struct ilp32_sigframe, fp), usig); > regs->regs[1] = (unsigned long)&frame->info; > regs->regs[2] = (unsigned long)&frame->sig.uc; > } ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-12 12:34 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 12:34 UTC (permalink / raw) To: linux-arm-kernel ping On 2016/6/4 19:34, Zhangjian (Bamvor) wrote: > Hi, > > I found an issue of unwind with the following code. The correct backtrace > should be: > (gdb) where > #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func2 (num=0) at test_force3.c:22 > #3 0x00400540 in func1 (num=1) at test_force3.c:28 > #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 > > Without my patch, the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > With my patch which fix the wrong frame pointer(setup_return calculate the offset > of fp through ilp32_sigframe instead of sigfreame), the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func1 () at test_force3.c:28 > #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 > does not work correctly when unwind without framepointer. > > The test code is: > > #include <stdio.h> > #include <stdlib.h> > #include <unistd.h> > #include <signal.h> > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > > void func2() > { > *(int *)0 = 0x0; > } > > void func1() > { > func2(); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(); > return 0; > } > > > The full patch is as follows: > > From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Sat, 4 Jun 2016 14:30:05 +0800 > Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the > new fp > > ILP32 define its own sigframe(ilp32_sigframe) because of the > difference uc_context. setup_return do not use ilp32 specific > sigframe to calculate the new offset of fp which lead to wrong > fp in signal handler. At this circumstance, gdb backtrace will miss > one item: > (gdb) where > > It should be: > (gdb) where > > The test code is as follows: > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > void func2(int num) > { > printf("%s: %d\n", __FUNCTION__, num); > *(int *)0 = 0x0; > func2(num-1); > } > > void func1(int num) > { > printf("%s\n", __FUNCTION__); > func2(num - 1); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(argc); > return 0; > } > > This patch fix this by passing the correct offset of fp to > setup_return. > Test pass on both ILP32 and LP64 in aarch64 EE. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/signal_common.h | 3 ++- > arch/arm64/kernel/signal.c | 9 +++++---- > arch/arm64/kernel/signal_ilp32.c | 4 ++-- > 3 files changed, 9 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h > index de93c71..a5d7b63 100644 > --- a/arch/arm64/include/asm/signal_common.h > +++ b/arch/arm64/include/asm/signal_common.h > @@ -29,6 +29,7 @@ int setup_sigcontex(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); > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig); > > #endif /* __ASM_SIGNAL_COMMON_H */ > diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c > index 038bebe..e66a6e9 100644 > --- a/arch/arm64/kernel/signal.c > +++ b/arch/arm64/kernel/signal.c > @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, > } > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > - void __user *frame, off_t sigframe_off, int usig) > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > - regs->regs[29] = regs->sp + sigframe_off + > - offsetof(struct sigframe, fp); > + regs->regs[29] = regs->sp + sigframe_off + fp_off; > regs->pc = (unsigned long)ka->sa.sa_handler; > > if (ka->sa.sa_flags & SA_RESTORER) > @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, > err |= setup_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct rt_sigframe, sig), usig); > + offsetof(struct rt_sigframe, sig), > + offsetof(struct sigframe, fp), usig); > if (ksig->ka.sa.sa_flags & SA_SIGINFO) { > err |= copy_siginfo_to_user(&frame->info, &ksig->info); > regs->regs[1] = (unsigned long)&frame->info; > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > index a8ea73e..9030f14 100644 > --- a/arch/arm64/kernel/signal_ilp32.c > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, > struct ilp32_rt_sigframe __user *frame; > > sp = sp_top = sigsp(regs->sp, ksig); > - > sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; > frame = (struct ilp32_rt_sigframe __user *)sp; > > @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, > err |= setup_ilp32_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct ilp32_rt_sigframe, sig), usig); > + offsetof(struct ilp32_rt_sigframe, sig), > + offsetof(struct ilp32_sigframe, fp), usig); > regs->regs[1] = (unsigned long)&frame->info; > regs->regs[2] = (unsigned long)&frame->sig.uc; > } ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-12 12:34 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 12:34 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) ping On 2016/6/4 19:34, Zhangjian (Bamvor) wrote: > Hi, > > I found an issue of unwind with the following code. The correct backtrace > should be: > (gdb) where > #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func2 (num=0) at test_force3.c:22 > #3 0x00400540 in func1 (num=1) at test_force3.c:28 > #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 > > Without my patch, the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > With my patch which fix the wrong frame pointer(setup_return calculate the offset > of fp through ilp32_sigframe instead of sigfreame), the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func1 () at test_force3.c:28 > #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 > does not work correctly when unwind without framepointer. > > The test code is: > > #include <stdio.h> > #include <stdlib.h> > #include <unistd.h> > #include <signal.h> > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > > void func2() > { > *(int *)0 = 0x0; > } > > void func1() > { > func2(); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(); > return 0; > } > > > The full patch is as follows: > > From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Sat, 4 Jun 2016 14:30:05 +0800 > Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the > new fp > > ILP32 define its own sigframe(ilp32_sigframe) because of the > difference uc_context. setup_return do not use ilp32 specific > sigframe to calculate the new offset of fp which lead to wrong > fp in signal handler. At this circumstance, gdb backtrace will miss > one item: > (gdb) where > > It should be: > (gdb) where > > The test code is as follows: > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > void func2(int num) > { > printf("%s: %d\n", __FUNCTION__, num); > *(int *)0 = 0x0; > func2(num-1); > } > > void func1(int num) > { > printf("%s\n", __FUNCTION__); > func2(num - 1); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(argc); > return 0; > } > > This patch fix this by passing the correct offset of fp to > setup_return. > Test pass on both ILP32 and LP64 in aarch64 EE. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/signal_common.h | 3 ++- > arch/arm64/kernel/signal.c | 9 +++++---- > arch/arm64/kernel/signal_ilp32.c | 4 ++-- > 3 files changed, 9 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h > index de93c71..a5d7b63 100644 > --- a/arch/arm64/include/asm/signal_common.h > +++ b/arch/arm64/include/asm/signal_common.h > @@ -29,6 +29,7 @@ int setup_sigcontex(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); > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig); > > #endif /* __ASM_SIGNAL_COMMON_H */ > diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c > index 038bebe..e66a6e9 100644 > --- a/arch/arm64/kernel/signal.c > +++ b/arch/arm64/kernel/signal.c > @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, > } > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > - void __user *frame, off_t sigframe_off, int usig) > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > - regs->regs[29] = regs->sp + sigframe_off + > - offsetof(struct sigframe, fp); > + regs->regs[29] = regs->sp + sigframe_off + fp_off; > regs->pc = (unsigned long)ka->sa.sa_handler; > > if (ka->sa.sa_flags & SA_RESTORER) > @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, > err |= setup_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct rt_sigframe, sig), usig); > + offsetof(struct rt_sigframe, sig), > + offsetof(struct sigframe, fp), usig); > if (ksig->ka.sa.sa_flags & SA_SIGINFO) { > err |= copy_siginfo_to_user(&frame->info, &ksig->info); > regs->regs[1] = (unsigned long)&frame->info; > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > index a8ea73e..9030f14 100644 > --- a/arch/arm64/kernel/signal_ilp32.c > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, > struct ilp32_rt_sigframe __user *frame; > > sp = sp_top = sigsp(regs->sp, ksig); > - > sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; > frame = (struct ilp32_rt_sigframe __user *)sp; > > @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, > err |= setup_ilp32_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct ilp32_rt_sigframe, sig), usig); > + offsetof(struct ilp32_rt_sigframe, sig), > + offsetof(struct ilp32_sigframe, fp), usig); > regs->regs[1] = (unsigned long)&frame->info; > regs->regs[2] = (unsigned long)&frame->sig.uc; > } ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext 2016-06-04 11:34 ` Zhangjian (Bamvor) (?) @ 2016-06-12 13:12 ` Zhangjian (Bamvor) -1 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 13:12 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) Hi, On 2016/6/4 19:34, Zhangjian (Bamvor) wrote: > Hi, > > I found an issue of unwind with the following code. The correct backtrace > should be: > (gdb) where > #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func2 (num=0) at test_force3.c:22 > #3 0x00400540 in func1 (num=1) at test_force3.c:28 > #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 > > Without my patch, the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > With my patch which fix the wrong frame pointer(setup_return calculate the offset > of fp through ilp32_sigframe instead of sigfreame), the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func1 () at test_force3.c:28 > #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 > does not work correctly when unwind without framepointer. I confirm that the reason why gdb could not unwind the func2 is gdb do not get the correct offset of uc_mcontext. And it seems that the kernel part is a reasonable fix for me. Regards Bamvor > > The test code is: > > #include <stdio.h> > #include <stdlib.h> > #include <unistd.h> > #include <signal.h> > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > > void func2() > { > *(int *)0 = 0x0; > } > > void func1() > { > func2(); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(); > return 0; > } > > > The full patch is as follows: > > From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Sat, 4 Jun 2016 14:30:05 +0800 > Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the > new fp > > ILP32 define its own sigframe(ilp32_sigframe) because of the > difference uc_context. setup_return do not use ilp32 specific > sigframe to calculate the new offset of fp which lead to wrong > fp in signal handler. At this circumstance, gdb backtrace will miss > one item: > (gdb) where > > It should be: > (gdb) where > > The test code is as follows: > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > void func2(int num) > { > printf("%s: %d\n", __FUNCTION__, num); > *(int *)0 = 0x0; > func2(num-1); > } > > void func1(int num) > { > printf("%s\n", __FUNCTION__); > func2(num - 1); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(argc); > return 0; > } > > This patch fix this by passing the correct offset of fp to > setup_return. > Test pass on both ILP32 and LP64 in aarch64 EE. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/signal_common.h | 3 ++- > arch/arm64/kernel/signal.c | 9 +++++---- > arch/arm64/kernel/signal_ilp32.c | 4 ++-- > 3 files changed, 9 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h > index de93c71..a5d7b63 100644 > --- a/arch/arm64/include/asm/signal_common.h > +++ b/arch/arm64/include/asm/signal_common.h > @@ -29,6 +29,7 @@ int setup_sigcontex(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); > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig); > > #endif /* __ASM_SIGNAL_COMMON_H */ > diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c > index 038bebe..e66a6e9 100644 > --- a/arch/arm64/kernel/signal.c > +++ b/arch/arm64/kernel/signal.c > @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, > } > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > - void __user *frame, off_t sigframe_off, int usig) > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > - regs->regs[29] = regs->sp + sigframe_off + > - offsetof(struct sigframe, fp); > + regs->regs[29] = regs->sp + sigframe_off + fp_off; > regs->pc = (unsigned long)ka->sa.sa_handler; > > if (ka->sa.sa_flags & SA_RESTORER) > @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, > err |= setup_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct rt_sigframe, sig), usig); > + offsetof(struct rt_sigframe, sig), > + offsetof(struct sigframe, fp), usig); > if (ksig->ka.sa.sa_flags & SA_SIGINFO) { > err |= copy_siginfo_to_user(&frame->info, &ksig->info); > regs->regs[1] = (unsigned long)&frame->info; > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > index a8ea73e..9030f14 100644 > --- a/arch/arm64/kernel/signal_ilp32.c > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, > struct ilp32_rt_sigframe __user *frame; > > sp = sp_top = sigsp(regs->sp, ksig); > - > sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; > frame = (struct ilp32_rt_sigframe __user *)sp; > > @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, > err |= setup_ilp32_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct ilp32_rt_sigframe, sig), usig); > + offsetof(struct ilp32_rt_sigframe, sig), > + offsetof(struct ilp32_sigframe, fp), usig); > regs->regs[1] = (unsigned long)&frame->info; > regs->regs[2] = (unsigned long)&frame->sig.uc; > } ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-12 13:12 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 13:12 UTC (permalink / raw) To: linux-arm-kernel Hi, On 2016/6/4 19:34, Zhangjian (Bamvor) wrote: > Hi, > > I found an issue of unwind with the following code. The correct backtrace > should be: > (gdb) where > #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func2 (num=0) at test_force3.c:22 > #3 0x00400540 in func1 (num=1) at test_force3.c:28 > #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 > > Without my patch, the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > With my patch which fix the wrong frame pointer(setup_return calculate the offset > of fp through ilp32_sigframe instead of sigfreame), the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func1 () at test_force3.c:28 > #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 > does not work correctly when unwind without framepointer. I confirm that the reason why gdb could not unwind the func2 is gdb do not get the correct offset of uc_mcontext. And it seems that the kernel part is a reasonable fix for me. Regards Bamvor > > The test code is: > > #include <stdio.h> > #include <stdlib.h> > #include <unistd.h> > #include <signal.h> > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > > void func2() > { > *(int *)0 = 0x0; > } > > void func1() > { > func2(); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(); > return 0; > } > > > The full patch is as follows: > > From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Sat, 4 Jun 2016 14:30:05 +0800 > Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the > new fp > > ILP32 define its own sigframe(ilp32_sigframe) because of the > difference uc_context. setup_return do not use ilp32 specific > sigframe to calculate the new offset of fp which lead to wrong > fp in signal handler. At this circumstance, gdb backtrace will miss > one item: > (gdb) where > > It should be: > (gdb) where > > The test code is as follows: > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > void func2(int num) > { > printf("%s: %d\n", __FUNCTION__, num); > *(int *)0 = 0x0; > func2(num-1); > } > > void func1(int num) > { > printf("%s\n", __FUNCTION__); > func2(num - 1); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(argc); > return 0; > } > > This patch fix this by passing the correct offset of fp to > setup_return. > Test pass on both ILP32 and LP64 in aarch64 EE. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/signal_common.h | 3 ++- > arch/arm64/kernel/signal.c | 9 +++++---- > arch/arm64/kernel/signal_ilp32.c | 4 ++-- > 3 files changed, 9 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h > index de93c71..a5d7b63 100644 > --- a/arch/arm64/include/asm/signal_common.h > +++ b/arch/arm64/include/asm/signal_common.h > @@ -29,6 +29,7 @@ int setup_sigcontex(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); > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig); > > #endif /* __ASM_SIGNAL_COMMON_H */ > diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c > index 038bebe..e66a6e9 100644 > --- a/arch/arm64/kernel/signal.c > +++ b/arch/arm64/kernel/signal.c > @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, > } > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > - void __user *frame, off_t sigframe_off, int usig) > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > - regs->regs[29] = regs->sp + sigframe_off + > - offsetof(struct sigframe, fp); > + regs->regs[29] = regs->sp + sigframe_off + fp_off; > regs->pc = (unsigned long)ka->sa.sa_handler; > > if (ka->sa.sa_flags & SA_RESTORER) > @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, > err |= setup_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct rt_sigframe, sig), usig); > + offsetof(struct rt_sigframe, sig), > + offsetof(struct sigframe, fp), usig); > if (ksig->ka.sa.sa_flags & SA_SIGINFO) { > err |= copy_siginfo_to_user(&frame->info, &ksig->info); > regs->regs[1] = (unsigned long)&frame->info; > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > index a8ea73e..9030f14 100644 > --- a/arch/arm64/kernel/signal_ilp32.c > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, > struct ilp32_rt_sigframe __user *frame; > > sp = sp_top = sigsp(regs->sp, ksig); > - > sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; > frame = (struct ilp32_rt_sigframe __user *)sp; > > @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, > err |= setup_ilp32_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct ilp32_rt_sigframe, sig), usig); > + offsetof(struct ilp32_rt_sigframe, sig), > + offsetof(struct ilp32_sigframe, fp), usig); > regs->regs[1] = (unsigned long)&frame->info; > regs->regs[2] = (unsigned long)&frame->sig.uc; > } ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-12 13:12 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 13:12 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) Hi, On 2016/6/4 19:34, Zhangjian (Bamvor) wrote: > Hi, > > I found an issue of unwind with the following code. The correct backtrace > should be: > (gdb) where > #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func2 (num=0) at test_force3.c:22 > #3 0x00400540 in func1 (num=1) at test_force3.c:28 > #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 > > Without my patch, the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > With my patch which fix the wrong frame pointer(setup_return calculate the offset > of fp through ilp32_sigframe instead of sigfreame), the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func1 () at test_force3.c:28 > #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 > does not work correctly when unwind without framepointer. I confirm that the reason why gdb could not unwind the func2 is gdb do not get the correct offset of uc_mcontext. And it seems that the kernel part is a reasonable fix for me. Regards Bamvor > > The test code is: > > #include <stdio.h> > #include <stdlib.h> > #include <unistd.h> > #include <signal.h> > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > > void func2() > { > *(int *)0 = 0x0; > } > > void func1() > { > func2(); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(); > return 0; > } > > > The full patch is as follows: > > From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Sat, 4 Jun 2016 14:30:05 +0800 > Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the > new fp > > ILP32 define its own sigframe(ilp32_sigframe) because of the > difference uc_context. setup_return do not use ilp32 specific > sigframe to calculate the new offset of fp which lead to wrong > fp in signal handler. At this circumstance, gdb backtrace will miss > one item: > (gdb) where > > It should be: > (gdb) where > > The test code is as follows: > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > void func2(int num) > { > printf("%s: %d\n", __FUNCTION__, num); > *(int *)0 = 0x0; > func2(num-1); > } > > void func1(int num) > { > printf("%s\n", __FUNCTION__); > func2(num - 1); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(argc); > return 0; > } > > This patch fix this by passing the correct offset of fp to > setup_return. > Test pass on both ILP32 and LP64 in aarch64 EE. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/signal_common.h | 3 ++- > arch/arm64/kernel/signal.c | 9 +++++---- > arch/arm64/kernel/signal_ilp32.c | 4 ++-- > 3 files changed, 9 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h > index de93c71..a5d7b63 100644 > --- a/arch/arm64/include/asm/signal_common.h > +++ b/arch/arm64/include/asm/signal_common.h > @@ -29,6 +29,7 @@ int setup_sigcontex(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); > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig); > > #endif /* __ASM_SIGNAL_COMMON_H */ > diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c > index 038bebe..e66a6e9 100644 > --- a/arch/arm64/kernel/signal.c > +++ b/arch/arm64/kernel/signal.c > @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, > } > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > - void __user *frame, off_t sigframe_off, int usig) > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > - regs->regs[29] = regs->sp + sigframe_off + > - offsetof(struct sigframe, fp); > + regs->regs[29] = regs->sp + sigframe_off + fp_off; > regs->pc = (unsigned long)ka->sa.sa_handler; > > if (ka->sa.sa_flags & SA_RESTORER) > @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, > err |= setup_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct rt_sigframe, sig), usig); > + offsetof(struct rt_sigframe, sig), > + offsetof(struct sigframe, fp), usig); > if (ksig->ka.sa.sa_flags & SA_SIGINFO) { > err |= copy_siginfo_to_user(&frame->info, &ksig->info); > regs->regs[1] = (unsigned long)&frame->info; > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > index a8ea73e..9030f14 100644 > --- a/arch/arm64/kernel/signal_ilp32.c > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, > struct ilp32_rt_sigframe __user *frame; > > sp = sp_top = sigsp(regs->sp, ksig); > - > sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; > frame = (struct ilp32_rt_sigframe __user *)sp; > > @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, > err |= setup_ilp32_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct ilp32_rt_sigframe, sig), usig); > + offsetof(struct ilp32_rt_sigframe, sig), > + offsetof(struct ilp32_sigframe, fp), usig); > regs->regs[1] = (unsigned long)&frame->info; > regs->regs[2] = (unsigned long)&frame->sig.uc; > } ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext 2016-06-04 11:34 ` Zhangjian (Bamvor) (?) @ 2016-06-12 17:44 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-12 17:44 UTC (permalink / raw) To: Zhangjian (Bamvor) Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo Hi Bamvor, Sorry, I missed this patch. On Sat, Jun 04, 2016 at 07:34:32PM +0800, Zhangjian (Bamvor) wrote: > Hi, > > I found an issue of unwind with the following code. The correct backtrace > should be: > (gdb) where > #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func2 (num=0) at test_force3.c:22 > #3 0x00400540 in func1 (num=1) at test_force3.c:28 > #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 > > Without my patch, the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > With my patch which fix the wrong frame pointer(setup_return calculate the offset > of fp through ilp32_sigframe instead of sigfreame), the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func1 () at test_force3.c:28 > #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 > does not work correctly when unwind without framepointer. > > The test code is: > > From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Sat, 4 Jun 2016 14:30:05 +0800 > Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the > new fp > > ILP32 define its own sigframe(ilp32_sigframe) because of the > difference uc_context. setup_return do not use ilp32 specific > sigframe to calculate the new offset of fp which lead to wrong > fp in signal handler. At this circumstance, gdb backtrace will miss > one item: > (gdb) where > > It should be: > (gdb) where > > The test code is as follows: > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > void func2(int num) > { > printf("%s: %d\n", __FUNCTION__, num); > *(int *)0 = 0x0; > func2(num-1); > } > > void func1(int num) > { > printf("%s\n", __FUNCTION__); > func2(num - 1); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(argc); > return 0; > } > > This patch fix this by passing the correct offset of fp to > setup_return. > Test pass on both ILP32 and LP64 in aarch64 EE. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/signal_common.h | 3 ++- > arch/arm64/kernel/signal.c | 9 +++++---- > arch/arm64/kernel/signal_ilp32.c | 4 ++-- > 3 files changed, 9 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h > index de93c71..a5d7b63 100644 > --- a/arch/arm64/include/asm/signal_common.h > +++ b/arch/arm64/include/asm/signal_common.h > @@ -29,6 +29,7 @@ int setup_sigcontex(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); > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig); > > #endif /* __ASM_SIGNAL_COMMON_H */ > diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c > index 038bebe..e66a6e9 100644 > --- a/arch/arm64/kernel/signal.c > +++ b/arch/arm64/kernel/signal.c > @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, > } > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > - void __user *frame, off_t sigframe_off, int usig) > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > - regs->regs[29] = regs->sp + sigframe_off + > - offsetof(struct sigframe, fp); > + regs->regs[29] = regs->sp + sigframe_off + fp_off; I think you are right here. The only nitpick is what for we send 2 offsets just to add one to another inside setup_return()? We can do like this: void setup_return(struct pt_regs *regs, struct k_sigaction *ka, void __user *frame, off_t fp_off, int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; regs->regs[29] = regs->sp + fp_off; [...] } Where fp_off calculation is done by caller. setup_return(regs, &ksig->ka, frame, offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp), usig); For me it's more clear to understand what happens with this approach. I don't think struct rt_sigframe will grow, but we can even introduce some helper for it: #define RT_SIGFRAME_FP_POS (offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp)) If no objections, I'll apply your patch with my fix in next series. > regs->pc = (unsigned long)ka->sa.sa_handler; > > if (ka->sa.sa_flags & SA_RESTORER) > @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, > err |= setup_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct rt_sigframe, sig), usig); > + offsetof(struct rt_sigframe, sig), > + offsetof(struct sigframe, fp), usig); > if (ksig->ka.sa.sa_flags & SA_SIGINFO) { > err |= copy_siginfo_to_user(&frame->info, &ksig->info); > regs->regs[1] = (unsigned long)&frame->info; > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > index a8ea73e..9030f14 100644 > --- a/arch/arm64/kernel/signal_ilp32.c > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, > struct ilp32_rt_sigframe __user *frame; > > sp = sp_top = sigsp(regs->sp, ksig); > - > sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; > frame = (struct ilp32_rt_sigframe __user *)sp; > > @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, > err |= setup_ilp32_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct ilp32_rt_sigframe, sig), usig); > + offsetof(struct ilp32_rt_sigframe, sig), > + offsetof(struct ilp32_sigframe, fp), usig); > regs->regs[1] = (unsigned long)&frame->info; > regs->regs[2] = (unsigned long)&frame->sig.uc; > } > -- > 1.8.4.5 > > Regards > > Bamvor > > ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-12 17:44 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-12 17:44 UTC (permalink / raw) To: linux-arm-kernel Hi Bamvor, Sorry, I missed this patch. On Sat, Jun 04, 2016 at 07:34:32PM +0800, Zhangjian (Bamvor) wrote: > Hi, > > I found an issue of unwind with the following code. The correct backtrace > should be: > (gdb) where > #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func2 (num=0) at test_force3.c:22 > #3 0x00400540 in func1 (num=1) at test_force3.c:28 > #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 > > Without my patch, the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > With my patch which fix the wrong frame pointer(setup_return calculate the offset > of fp through ilp32_sigframe instead of sigfreame), the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func1 () at test_force3.c:28 > #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 > does not work correctly when unwind without framepointer. > > The test code is: > > From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Sat, 4 Jun 2016 14:30:05 +0800 > Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the > new fp > > ILP32 define its own sigframe(ilp32_sigframe) because of the > difference uc_context. setup_return do not use ilp32 specific > sigframe to calculate the new offset of fp which lead to wrong > fp in signal handler. At this circumstance, gdb backtrace will miss > one item: > (gdb) where > > It should be: > (gdb) where > > The test code is as follows: > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > void func2(int num) > { > printf("%s: %d\n", __FUNCTION__, num); > *(int *)0 = 0x0; > func2(num-1); > } > > void func1(int num) > { > printf("%s\n", __FUNCTION__); > func2(num - 1); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(argc); > return 0; > } > > This patch fix this by passing the correct offset of fp to > setup_return. > Test pass on both ILP32 and LP64 in aarch64 EE. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/signal_common.h | 3 ++- > arch/arm64/kernel/signal.c | 9 +++++---- > arch/arm64/kernel/signal_ilp32.c | 4 ++-- > 3 files changed, 9 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h > index de93c71..a5d7b63 100644 > --- a/arch/arm64/include/asm/signal_common.h > +++ b/arch/arm64/include/asm/signal_common.h > @@ -29,6 +29,7 @@ int setup_sigcontex(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); > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig); > > #endif /* __ASM_SIGNAL_COMMON_H */ > diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c > index 038bebe..e66a6e9 100644 > --- a/arch/arm64/kernel/signal.c > +++ b/arch/arm64/kernel/signal.c > @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, > } > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > - void __user *frame, off_t sigframe_off, int usig) > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > - regs->regs[29] = regs->sp + sigframe_off + > - offsetof(struct sigframe, fp); > + regs->regs[29] = regs->sp + sigframe_off + fp_off; I think you are right here. The only nitpick is what for we send 2 offsets just to add one to another inside setup_return()? We can do like this: void setup_return(struct pt_regs *regs, struct k_sigaction *ka, void __user *frame, off_t fp_off, int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; regs->regs[29] = regs->sp + fp_off; [...] } Where fp_off calculation is done by caller. setup_return(regs, &ksig->ka, frame, offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp), usig); For me it's more clear to understand what happens with this approach. I don't think struct rt_sigframe will grow, but we can even introduce some helper for it: #define RT_SIGFRAME_FP_POS (offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp)) If no objections, I'll apply your patch with my fix in next series. > regs->pc = (unsigned long)ka->sa.sa_handler; > > if (ka->sa.sa_flags & SA_RESTORER) > @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, > err |= setup_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct rt_sigframe, sig), usig); > + offsetof(struct rt_sigframe, sig), > + offsetof(struct sigframe, fp), usig); > if (ksig->ka.sa.sa_flags & SA_SIGINFO) { > err |= copy_siginfo_to_user(&frame->info, &ksig->info); > regs->regs[1] = (unsigned long)&frame->info; > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > index a8ea73e..9030f14 100644 > --- a/arch/arm64/kernel/signal_ilp32.c > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, > struct ilp32_rt_sigframe __user *frame; > > sp = sp_top = sigsp(regs->sp, ksig); > - > sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; > frame = (struct ilp32_rt_sigframe __user *)sp; > > @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, > err |= setup_ilp32_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct ilp32_rt_sigframe, sig), usig); > + offsetof(struct ilp32_rt_sigframe, sig), > + offsetof(struct ilp32_sigframe, fp), usig); > regs->regs[1] = (unsigned long)&frame->info; > regs->regs[2] = (unsigned long)&frame->sig.uc; > } > -- > 1.8.4.5 > > Regards > > Bamvor > > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-12 17:44 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-12 17:44 UTC (permalink / raw) To: Zhangjian (Bamvor) Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo Hi Bamvor, Sorry, I missed this patch. On Sat, Jun 04, 2016 at 07:34:32PM +0800, Zhangjian (Bamvor) wrote: > Hi, > > I found an issue of unwind with the following code. The correct backtrace > should be: > (gdb) where > #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func2 (num=0) at test_force3.c:22 > #3 0x00400540 in func1 (num=1) at test_force3.c:28 > #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 > > Without my patch, the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > With my patch which fix the wrong frame pointer(setup_return calculate the offset > of fp through ilp32_sigframe instead of sigfreame), the backtrace is: > (gdb) where > #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 > #1 <signal handler called> > #2 func1 () at test_force3.c:28 > #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 > > I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 > does not work correctly when unwind without framepointer. > > The test code is: > > From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 > From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > Date: Sat, 4 Jun 2016 14:30:05 +0800 > Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the > new fp > > ILP32 define its own sigframe(ilp32_sigframe) because of the > difference uc_context. setup_return do not use ilp32 specific > sigframe to calculate the new offset of fp which lead to wrong > fp in signal handler. At this circumstance, gdb backtrace will miss > one item: > (gdb) where > > It should be: > (gdb) where > > The test code is as follows: > > void my_sig(int sig) > { > printf("sig=%d\n", sig); > *(int *)0 = 0x0; > } > > void func2(int num) > { > printf("%s: %d\n", __FUNCTION__, num); > *(int *)0 = 0x0; > func2(num-1); > } > > void func1(int num) > { > printf("%s\n", __FUNCTION__); > func2(num - 1); > } > > int main(int argc, char **argv) > { > signal(11, my_sig); > func1(argc); > return 0; > } > > This patch fix this by passing the correct offset of fp to > setup_return. > Test pass on both ILP32 and LP64 in aarch64 EE. > > Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> > --- > arch/arm64/include/asm/signal_common.h | 3 ++- > arch/arm64/kernel/signal.c | 9 +++++---- > arch/arm64/kernel/signal_ilp32.c | 4 ++-- > 3 files changed, 9 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h > index de93c71..a5d7b63 100644 > --- a/arch/arm64/include/asm/signal_common.h > +++ b/arch/arm64/include/asm/signal_common.h > @@ -29,6 +29,7 @@ int setup_sigcontex(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); > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig); > > #endif /* __ASM_SIGNAL_COMMON_H */ > diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c > index 038bebe..e66a6e9 100644 > --- a/arch/arm64/kernel/signal.c > +++ b/arch/arm64/kernel/signal.c > @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, > } > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > - void __user *frame, off_t sigframe_off, int usig) > + void __user *frame, off_t sigframe_off, off_t fp_off, > + int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > - regs->regs[29] = regs->sp + sigframe_off + > - offsetof(struct sigframe, fp); > + regs->regs[29] = regs->sp + sigframe_off + fp_off; I think you are right here. The only nitpick is what for we send 2 offsets just to add one to another inside setup_return()? We can do like this: void setup_return(struct pt_regs *regs, struct k_sigaction *ka, void __user *frame, off_t fp_off, int usig) { __sigrestore_t sigtramp; regs->regs[0] = usig; regs->sp = (unsigned long)frame; regs->regs[29] = regs->sp + fp_off; [...] } Where fp_off calculation is done by caller. setup_return(regs, &ksig->ka, frame, offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp), usig); For me it's more clear to understand what happens with this approach. I don't think struct rt_sigframe will grow, but we can even introduce some helper for it: #define RT_SIGFRAME_FP_POS (offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp)) If no objections, I'll apply your patch with my fix in next series. > regs->pc = (unsigned long)ka->sa.sa_handler; > > if (ka->sa.sa_flags & SA_RESTORER) > @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, > err |= setup_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct rt_sigframe, sig), usig); > + offsetof(struct rt_sigframe, sig), > + offsetof(struct sigframe, fp), usig); > if (ksig->ka.sa.sa_flags & SA_SIGINFO) { > err |= copy_siginfo_to_user(&frame->info, &ksig->info); > regs->regs[1] = (unsigned long)&frame->info; > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > index a8ea73e..9030f14 100644 > --- a/arch/arm64/kernel/signal_ilp32.c > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, > struct ilp32_rt_sigframe __user *frame; > > sp = sp_top = sigsp(regs->sp, ksig); > - > sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; > frame = (struct ilp32_rt_sigframe __user *)sp; > > @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, > err |= setup_ilp32_sigframe(&frame->sig, regs, set); > if (err == 0) { > setup_return(regs, &ksig->ka, frame, > - offsetof(struct ilp32_rt_sigframe, sig), usig); > + offsetof(struct ilp32_rt_sigframe, sig), > + offsetof(struct ilp32_sigframe, fp), usig); > regs->regs[1] = (unsigned long)&frame->info; > regs->regs[2] = (unsigned long)&frame->sig.uc; > } > -- > 1.8.4.5 > > Regards > > Bamvor > > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext 2016-06-12 17:44 ` Yury Norov (?) @ 2016-06-16 11:21 ` Zhangjian (Bamvor) -1 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-16 11:21 UTC (permalink / raw) To: Yury Norov Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) Hi, On 2016/6/13 1:44, Yury Norov wrote: > Hi Bamvor, > > Sorry, I missed this patch. > > On Sat, Jun 04, 2016 at 07:34:32PM +0800, Zhangjian (Bamvor) wrote: >> Hi, >> >> I found an issue of unwind with the following code. The correct backtrace >> should be: >> (gdb) where >> #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 >> #1 <signal handler called> >> #2 func2 (num=0) at test_force3.c:22 >> #3 0x00400540 in func1 (num=1) at test_force3.c:28 >> #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 >> >> Without my patch, the backtrace is: >> (gdb) where >> #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 >> #1 <signal handler called> >> #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 >> >> With my patch which fix the wrong frame pointer(setup_return calculate the offset >> of fp through ilp32_sigframe instead of sigfreame), the backtrace is: >> (gdb) where >> #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 >> #1 <signal handler called> >> #2 func1 () at test_force3.c:28 >> #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 >> >> I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 >> does not work correctly when unwind without framepointer. >> >> The test code is: >> >> From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 >> From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> >> Date: Sat, 4 Jun 2016 14:30:05 +0800 >> Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the >> new fp >> >> ILP32 define its own sigframe(ilp32_sigframe) because of the >> difference uc_context. setup_return do not use ilp32 specific >> sigframe to calculate the new offset of fp which lead to wrong >> fp in signal handler. At this circumstance, gdb backtrace will miss >> one item: >> (gdb) where >> >> It should be: >> (gdb) where >> >> The test code is as follows: >> >> void my_sig(int sig) >> { >> printf("sig=%d\n", sig); >> *(int *)0 = 0x0; >> } >> >> void func2(int num) >> { >> printf("%s: %d\n", __FUNCTION__, num); >> *(int *)0 = 0x0; >> func2(num-1); >> } >> >> void func1(int num) >> { >> printf("%s\n", __FUNCTION__); >> func2(num - 1); >> } >> >> int main(int argc, char **argv) >> { >> signal(11, my_sig); >> func1(argc); >> return 0; >> } >> >> This patch fix this by passing the correct offset of fp to >> setup_return. >> Test pass on both ILP32 and LP64 in aarch64 EE. >> >> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> >> --- >> arch/arm64/include/asm/signal_common.h | 3 ++- >> arch/arm64/kernel/signal.c | 9 +++++---- >> arch/arm64/kernel/signal_ilp32.c | 4 ++-- >> 3 files changed, 9 insertions(+), 7 deletions(-) >> >> diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h >> index de93c71..a5d7b63 100644 >> --- a/arch/arm64/include/asm/signal_common.h >> +++ b/arch/arm64/include/asm/signal_common.h >> @@ -29,6 +29,7 @@ int setup_sigcontex(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); >> + void __user *frame, off_t sigframe_off, off_t fp_off, >> + int usig); >> >> #endif /* __ASM_SIGNAL_COMMON_H */ >> diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c >> index 038bebe..e66a6e9 100644 >> --- a/arch/arm64/kernel/signal.c >> +++ b/arch/arm64/kernel/signal.c >> @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, >> } >> >> void setup_return(struct pt_regs *regs, struct k_sigaction *ka, >> - void __user *frame, off_t sigframe_off, int usig) >> + void __user *frame, off_t sigframe_off, off_t fp_off, >> + int usig) >> { >> __sigrestore_t sigtramp; >> >> regs->regs[0] = usig; >> regs->sp = (unsigned long)frame; >> - regs->regs[29] = regs->sp + sigframe_off + >> - offsetof(struct sigframe, fp); >> + regs->regs[29] = regs->sp + sigframe_off + fp_off; > > I think you are right here. The only nitpick is what for we send 2 > offsets just to add one to another inside setup_return()? > We can do like this: > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > void __user *frame, off_t fp_off, int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > regs->regs[29] = regs->sp + fp_off; > [...] > } > > Where fp_off calculation is done by caller. > > setup_return(regs, &ksig->ka, frame, > offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp), > usig); > > For me it's more clear to understand what happens with this approach. > I don't think struct rt_sigframe will grow, but we can even introduce > some helper for it: > #define RT_SIGFRAME_FP_POS (offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp)) > > If no objections, I'll apply your patch with my fix in next series. Sure. Thanks. Regards Bamvor > >> regs->pc = (unsigned long)ka->sa.sa_handler; >> >> if (ka->sa.sa_flags & SA_RESTORER) >> @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, >> err |= setup_sigframe(&frame->sig, regs, set); >> if (err == 0) { >> setup_return(regs, &ksig->ka, frame, >> - offsetof(struct rt_sigframe, sig), usig); >> + offsetof(struct rt_sigframe, sig), >> + offsetof(struct sigframe, fp), usig); >> if (ksig->ka.sa.sa_flags & SA_SIGINFO) { >> err |= copy_siginfo_to_user(&frame->info, &ksig->info); >> regs->regs[1] = (unsigned long)&frame->info; >> diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c >> index a8ea73e..9030f14 100644 >> --- a/arch/arm64/kernel/signal_ilp32.c >> +++ b/arch/arm64/kernel/signal_ilp32.c >> @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, >> struct ilp32_rt_sigframe __user *frame; >> >> sp = sp_top = sigsp(regs->sp, ksig); >> - >> sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; >> frame = (struct ilp32_rt_sigframe __user *)sp; >> >> @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, >> err |= setup_ilp32_sigframe(&frame->sig, regs, set); >> if (err == 0) { >> setup_return(regs, &ksig->ka, frame, >> - offsetof(struct ilp32_rt_sigframe, sig), usig); >> + offsetof(struct ilp32_rt_sigframe, sig), >> + offsetof(struct ilp32_sigframe, fp), usig); >> regs->regs[1] = (unsigned long)&frame->info; >> regs->regs[2] = (unsigned long)&frame->sig.uc; >> } >> -- >> 1.8.4.5 >> >> Regards >> >> Bamvor >> >> ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-16 11:21 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-16 11:21 UTC (permalink / raw) To: linux-arm-kernel Hi, On 2016/6/13 1:44, Yury Norov wrote: > Hi Bamvor, > > Sorry, I missed this patch. > > On Sat, Jun 04, 2016 at 07:34:32PM +0800, Zhangjian (Bamvor) wrote: >> Hi, >> >> I found an issue of unwind with the following code. The correct backtrace >> should be: >> (gdb) where >> #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 >> #1 <signal handler called> >> #2 func2 (num=0) at test_force3.c:22 >> #3 0x00400540 in func1 (num=1) at test_force3.c:28 >> #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 >> >> Without my patch, the backtrace is: >> (gdb) where >> #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 >> #1 <signal handler called> >> #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 >> >> With my patch which fix the wrong frame pointer(setup_return calculate the offset >> of fp through ilp32_sigframe instead of sigfreame), the backtrace is: >> (gdb) where >> #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 >> #1 <signal handler called> >> #2 func1 () at test_force3.c:28 >> #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 >> >> I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 >> does not work correctly when unwind without framepointer. >> >> The test code is: >> >> From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 >> From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> >> Date: Sat, 4 Jun 2016 14:30:05 +0800 >> Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the >> new fp >> >> ILP32 define its own sigframe(ilp32_sigframe) because of the >> difference uc_context. setup_return do not use ilp32 specific >> sigframe to calculate the new offset of fp which lead to wrong >> fp in signal handler. At this circumstance, gdb backtrace will miss >> one item: >> (gdb) where >> >> It should be: >> (gdb) where >> >> The test code is as follows: >> >> void my_sig(int sig) >> { >> printf("sig=%d\n", sig); >> *(int *)0 = 0x0; >> } >> >> void func2(int num) >> { >> printf("%s: %d\n", __FUNCTION__, num); >> *(int *)0 = 0x0; >> func2(num-1); >> } >> >> void func1(int num) >> { >> printf("%s\n", __FUNCTION__); >> func2(num - 1); >> } >> >> int main(int argc, char **argv) >> { >> signal(11, my_sig); >> func1(argc); >> return 0; >> } >> >> This patch fix this by passing the correct offset of fp to >> setup_return. >> Test pass on both ILP32 and LP64 in aarch64 EE. >> >> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> >> --- >> arch/arm64/include/asm/signal_common.h | 3 ++- >> arch/arm64/kernel/signal.c | 9 +++++---- >> arch/arm64/kernel/signal_ilp32.c | 4 ++-- >> 3 files changed, 9 insertions(+), 7 deletions(-) >> >> diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h >> index de93c71..a5d7b63 100644 >> --- a/arch/arm64/include/asm/signal_common.h >> +++ b/arch/arm64/include/asm/signal_common.h >> @@ -29,6 +29,7 @@ int setup_sigcontex(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); >> + void __user *frame, off_t sigframe_off, off_t fp_off, >> + int usig); >> >> #endif /* __ASM_SIGNAL_COMMON_H */ >> diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c >> index 038bebe..e66a6e9 100644 >> --- a/arch/arm64/kernel/signal.c >> +++ b/arch/arm64/kernel/signal.c >> @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, >> } >> >> void setup_return(struct pt_regs *regs, struct k_sigaction *ka, >> - void __user *frame, off_t sigframe_off, int usig) >> + void __user *frame, off_t sigframe_off, off_t fp_off, >> + int usig) >> { >> __sigrestore_t sigtramp; >> >> regs->regs[0] = usig; >> regs->sp = (unsigned long)frame; >> - regs->regs[29] = regs->sp + sigframe_off + >> - offsetof(struct sigframe, fp); >> + regs->regs[29] = regs->sp + sigframe_off + fp_off; > > I think you are right here. The only nitpick is what for we send 2 > offsets just to add one to another inside setup_return()? > We can do like this: > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > void __user *frame, off_t fp_off, int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > regs->regs[29] = regs->sp + fp_off; > [...] > } > > Where fp_off calculation is done by caller. > > setup_return(regs, &ksig->ka, frame, > offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp), > usig); > > For me it's more clear to understand what happens with this approach. > I don't think struct rt_sigframe will grow, but we can even introduce > some helper for it: > #define RT_SIGFRAME_FP_POS (offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp)) > > If no objections, I'll apply your patch with my fix in next series. Sure. Thanks. Regards Bamvor > >> regs->pc = (unsigned long)ka->sa.sa_handler; >> >> if (ka->sa.sa_flags & SA_RESTORER) >> @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, >> err |= setup_sigframe(&frame->sig, regs, set); >> if (err == 0) { >> setup_return(regs, &ksig->ka, frame, >> - offsetof(struct rt_sigframe, sig), usig); >> + offsetof(struct rt_sigframe, sig), >> + offsetof(struct sigframe, fp), usig); >> if (ksig->ka.sa.sa_flags & SA_SIGINFO) { >> err |= copy_siginfo_to_user(&frame->info, &ksig->info); >> regs->regs[1] = (unsigned long)&frame->info; >> diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c >> index a8ea73e..9030f14 100644 >> --- a/arch/arm64/kernel/signal_ilp32.c >> +++ b/arch/arm64/kernel/signal_ilp32.c >> @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, >> struct ilp32_rt_sigframe __user *frame; >> >> sp = sp_top = sigsp(regs->sp, ksig); >> - >> sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; >> frame = (struct ilp32_rt_sigframe __user *)sp; >> >> @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, >> err |= setup_ilp32_sigframe(&frame->sig, regs, set); >> if (err == 0) { >> setup_return(regs, &ksig->ka, frame, >> - offsetof(struct ilp32_rt_sigframe, sig), usig); >> + offsetof(struct ilp32_rt_sigframe, sig), >> + offsetof(struct ilp32_sigframe, fp), usig); >> regs->regs[1] = (unsigned long)&frame->info; >> regs->regs[2] = (unsigned long)&frame->sig.uc; >> } >> -- >> 1.8.4.5 >> >> Regards >> >> Bamvor >> >> ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-16 11:21 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-16 11:21 UTC (permalink / raw) To: Yury Norov Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) Hi, On 2016/6/13 1:44, Yury Norov wrote: > Hi Bamvor, > > Sorry, I missed this patch. > > On Sat, Jun 04, 2016 at 07:34:32PM +0800, Zhangjian (Bamvor) wrote: >> Hi, >> >> I found an issue of unwind with the following code. The correct backtrace >> should be: >> (gdb) where >> #0 0x004004d0 in my_sig (sig=11) at test_force3.c:16 >> #1 <signal handler called> >> #2 func2 (num=0) at test_force3.c:22 >> #3 0x00400540 in func1 (num=1) at test_force3.c:28 >> #4 0x00400574 in main (argc=1, argv=0xffd7bc04) at test_force3.c:33 >> >> Without my patch, the backtrace is: >> (gdb) where >> #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 >> #1 <signal handler called> >> #2 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 >> >> With my patch which fix the wrong frame pointer(setup_return calculate the offset >> of fp through ilp32_sigframe instead of sigfreame), the backtrace is: >> (gdb) where >> #0 0x00400490 in my_sig (sig=11) at test_force3.c:16 >> #1 <signal handler called> >> #2 func1 () at test_force3.c:28 >> #3 0x004004e4 in main (argc=1, argv=0xffe6f8f4) at test_force3.c:33 >> >> I am not sure there is still some issue in kernel. But it seem that the gdb of ilp32 >> does not work correctly when unwind without framepointer. >> >> The test code is: >> >> From 7e364a765097f57aed2d73f94c1688c2e7343e79 Mon Sep 17 00:00:00 2001 >> From: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> >> Date: Sat, 4 Jun 2016 14:30:05 +0800 >> Subject: [PATCH] arm64: ilp32: fix for wrong fp offset when calculate the >> new fp >> >> ILP32 define its own sigframe(ilp32_sigframe) because of the >> difference uc_context. setup_return do not use ilp32 specific >> sigframe to calculate the new offset of fp which lead to wrong >> fp in signal handler. At this circumstance, gdb backtrace will miss >> one item: >> (gdb) where >> >> It should be: >> (gdb) where >> >> The test code is as follows: >> >> void my_sig(int sig) >> { >> printf("sig=%d\n", sig); >> *(int *)0 = 0x0; >> } >> >> void func2(int num) >> { >> printf("%s: %d\n", __FUNCTION__, num); >> *(int *)0 = 0x0; >> func2(num-1); >> } >> >> void func1(int num) >> { >> printf("%s\n", __FUNCTION__); >> func2(num - 1); >> } >> >> int main(int argc, char **argv) >> { >> signal(11, my_sig); >> func1(argc); >> return 0; >> } >> >> This patch fix this by passing the correct offset of fp to >> setup_return. >> Test pass on both ILP32 and LP64 in aarch64 EE. >> >> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com> >> --- >> arch/arm64/include/asm/signal_common.h | 3 ++- >> arch/arm64/kernel/signal.c | 9 +++++---- >> arch/arm64/kernel/signal_ilp32.c | 4 ++-- >> 3 files changed, 9 insertions(+), 7 deletions(-) >> >> diff --git a/arch/arm64/include/asm/signal_common.h b/arch/arm64/include/asm/signal_common.h >> index de93c71..a5d7b63 100644 >> --- a/arch/arm64/include/asm/signal_common.h >> +++ b/arch/arm64/include/asm/signal_common.h >> @@ -29,6 +29,7 @@ int setup_sigcontex(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); >> + void __user *frame, off_t sigframe_off, off_t fp_off, >> + int usig); >> >> #endif /* __ASM_SIGNAL_COMMON_H */ >> diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c >> index 038bebe..e66a6e9 100644 >> --- a/arch/arm64/kernel/signal.c >> +++ b/arch/arm64/kernel/signal.c >> @@ -256,14 +256,14 @@ static struct rt_sigframe __user *get_sigframe(struct ksignal *ksig, >> } >> >> void setup_return(struct pt_regs *regs, struct k_sigaction *ka, >> - void __user *frame, off_t sigframe_off, int usig) >> + void __user *frame, off_t sigframe_off, off_t fp_off, >> + int usig) >> { >> __sigrestore_t sigtramp; >> >> regs->regs[0] = usig; >> regs->sp = (unsigned long)frame; >> - regs->regs[29] = regs->sp + sigframe_off + >> - offsetof(struct sigframe, fp); >> + regs->regs[29] = regs->sp + sigframe_off + fp_off; > > I think you are right here. The only nitpick is what for we send 2 > offsets just to add one to another inside setup_return()? > We can do like this: > > void setup_return(struct pt_regs *regs, struct k_sigaction *ka, > void __user *frame, off_t fp_off, int usig) > { > __sigrestore_t sigtramp; > > regs->regs[0] = usig; > regs->sp = (unsigned long)frame; > regs->regs[29] = regs->sp + fp_off; > [...] > } > > Where fp_off calculation is done by caller. > > setup_return(regs, &ksig->ka, frame, > offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp), > usig); > > For me it's more clear to understand what happens with this approach. > I don't think struct rt_sigframe will grow, but we can even introduce > some helper for it: > #define RT_SIGFRAME_FP_POS (offsetof(struct rt_sigframe, sig) + offsetof(struct sigframe, fp)) > > If no objections, I'll apply your patch with my fix in next series. Sure. Thanks. Regards Bamvor > >> regs->pc = (unsigned long)ka->sa.sa_handler; >> >> if (ka->sa.sa_flags & SA_RESTORER) >> @@ -294,7 +294,8 @@ static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set, >> err |= setup_sigframe(&frame->sig, regs, set); >> if (err == 0) { >> setup_return(regs, &ksig->ka, frame, >> - offsetof(struct rt_sigframe, sig), usig); >> + offsetof(struct rt_sigframe, sig), >> + offsetof(struct sigframe, fp), usig); >> if (ksig->ka.sa.sa_flags & SA_SIGINFO) { >> err |= copy_siginfo_to_user(&frame->info, &ksig->info); >> regs->regs[1] = (unsigned long)&frame->info; >> diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c >> index a8ea73e..9030f14 100644 >> --- a/arch/arm64/kernel/signal_ilp32.c >> +++ b/arch/arm64/kernel/signal_ilp32.c >> @@ -147,7 +147,6 @@ static struct ilp32_rt_sigframe __user *ilp32_get_sigframe(struct ksignal *ksig, >> struct ilp32_rt_sigframe __user *frame; >> >> sp = sp_top = sigsp(regs->sp, ksig); >> - >> sp = (sp - sizeof(struct ilp32_rt_sigframe)) & ~15; >> frame = (struct ilp32_rt_sigframe __user *)sp; >> >> @@ -183,7 +182,8 @@ int ilp32_setup_rt_frame(int usig, struct ksignal *ksig, >> err |= setup_ilp32_sigframe(&frame->sig, regs, set); >> if (err == 0) { >> setup_return(regs, &ksig->ka, frame, >> - offsetof(struct ilp32_rt_sigframe, sig), usig); >> + offsetof(struct ilp32_rt_sigframe, sig), >> + offsetof(struct ilp32_sigframe, fp), usig); >> regs->regs[1] = (unsigned long)&frame->info; >> regs->regs[2] = (unsigned long)&frame->sig.uc; >> } >> -- >> 1.8.4.5 >> >> Regards >> >> Bamvor >> >> ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext 2016-05-24 0:04 ` Yury Norov (?) @ 2016-06-12 12:39 ` Zhangjian (Bamvor) -1 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 12:39 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) Hi, Yury Here is another print issue in this patch: On 2016/5/24 8:04, Yury Norov wrote: > From: Andrew Pinski <apinski@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. > [...] > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > new file mode 100644 > index 0000000..841e8f8 > --- /dev/null > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -0,0 +1,192 @@ > +/* [...] > +asmlinkage long ilp32_sys_rt_sigreturn(struct pt_regs *regs) > +{ > + struct ilp32_rt_sigframe __user *frame; > + > + /* Always make any pending restarted system calls return -EINTR */ > + current->restart_block.fn = do_no_restart_syscall; > + > + /* > + * Since we stacked the signal on a 128-bit boundary, > + * then 'sp' should be word aligned here. If it's > + * not, then the user is trying to mess with us. > + */ > + if (regs->sp & 15) > + goto badframe; > + > + frame = (struct ilp32_rt_sigframe __user *)regs->sp; > + > + if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) > + goto badframe; > + > + if (restore_ilp32_sigframe(regs, &frame->sig)) > + goto badframe; > + > + if (compat_restore_altstack(&frame->sig.uc.uc_stack)) > + goto badframe; > + > + return regs->regs[0]; > + > +badframe: > + if (show_unhandled_signals) > + pr_info_ratelimited("%s[%d]: bad frame in %s: pc=%08llx sp=%08llx\n", > + current->comm, task_pid_nr(current), __func__, > + regs->pc, regs->compat_sp); It should be sp instead of compat_sp. The latter one is used by aarch32 EE. Regards Bamvor > + force_sig(SIGSEGV, current); > + return 0; > +} > + ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-12 12:39 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 12:39 UTC (permalink / raw) To: linux-arm-kernel Hi, Yury Here is another print issue in this patch: On 2016/5/24 8:04, Yury Norov wrote: > From: Andrew Pinski <apinski@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. > [...] > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > new file mode 100644 > index 0000000..841e8f8 > --- /dev/null > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -0,0 +1,192 @@ > +/* [...] > +asmlinkage long ilp32_sys_rt_sigreturn(struct pt_regs *regs) > +{ > + struct ilp32_rt_sigframe __user *frame; > + > + /* Always make any pending restarted system calls return -EINTR */ > + current->restart_block.fn = do_no_restart_syscall; > + > + /* > + * Since we stacked the signal on a 128-bit boundary, > + * then 'sp' should be word aligned here. If it's > + * not, then the user is trying to mess with us. > + */ > + if (regs->sp & 15) > + goto badframe; > + > + frame = (struct ilp32_rt_sigframe __user *)regs->sp; > + > + if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) > + goto badframe; > + > + if (restore_ilp32_sigframe(regs, &frame->sig)) > + goto badframe; > + > + if (compat_restore_altstack(&frame->sig.uc.uc_stack)) > + goto badframe; > + > + return regs->regs[0]; > + > +badframe: > + if (show_unhandled_signals) > + pr_info_ratelimited("%s[%d]: bad frame in %s: pc=%08llx sp=%08llx\n", > + current->comm, task_pid_nr(current), __func__, > + regs->pc, regs->compat_sp); It should be sp instead of compat_sp. The latter one is used by aarch32 EE. Regards Bamvor > + force_sig(SIGSEGV, current); > + return 0; > +} > + ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext @ 2016-06-12 12:39 ` Zhangjian (Bamvor) 0 siblings, 0 replies; 207+ messages in thread From: Zhangjian (Bamvor) @ 2016-06-12 12:39 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski, Hanjun Guo, Zhangjian (Bamvor) Hi, Yury Here is another print issue in this patch: On 2016/5/24 8:04, Yury Norov wrote: > From: Andrew Pinski <apinski@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. > [...] > diff --git a/arch/arm64/kernel/signal_ilp32.c b/arch/arm64/kernel/signal_ilp32.c > new file mode 100644 > index 0000000..841e8f8 > --- /dev/null > +++ b/arch/arm64/kernel/signal_ilp32.c > @@ -0,0 +1,192 @@ > +/* [...] > +asmlinkage long ilp32_sys_rt_sigreturn(struct pt_regs *regs) > +{ > + struct ilp32_rt_sigframe __user *frame; > + > + /* Always make any pending restarted system calls return -EINTR */ > + current->restart_block.fn = do_no_restart_syscall; > + > + /* > + * Since we stacked the signal on a 128-bit boundary, > + * then 'sp' should be word aligned here. If it's > + * not, then the user is trying to mess with us. > + */ > + if (regs->sp & 15) > + goto badframe; > + > + frame = (struct ilp32_rt_sigframe __user *)regs->sp; > + > + if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) > + goto badframe; > + > + if (restore_ilp32_sigframe(regs, &frame->sig)) > + goto badframe; > + > + if (compat_restore_altstack(&frame->sig.uc.uc_stack)) > + goto badframe; > + > + return regs->regs[0]; > + > +badframe: > + if (show_unhandled_signals) > + pr_info_ratelimited("%s[%d]: bad frame in %s: pc=%08llx sp=%08llx\n", > + current->comm, task_pid_nr(current), __func__, > + regs->pc, regs->compat_sp); It should be sp instead of compat_sp. The latter one is used by aarch32 EE. Regards Bamvor > + force_sig(SIGSEGV, current); > + return 0; > +} > + ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH 22/23] arm64:ilp32: add vdso-ilp32 and use for signal return 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich From: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> ILP32 VDSO exports next 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 move data page before code pages in sync with commit 601255ae3c98fdeeee3a8bb4696425e4f868b4f1 Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/vdso.h | 6 ++ arch/arm64/kernel/Makefile | 7 ++ 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 | 74 +++++++++++++++++++++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S | 33 ++++++++++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S | 95 +++++++++++++++++++++++++++ arch/arm64/kernel/vdso.c | 61 ++++++++++++++--- arch/arm64/kernel/vdso/gettimeofday.S | 20 +++++- 10 files changed, 294 insertions(+), 13 deletions(-) create mode 100644 arch/arm64/kernel/vdso-ilp32/.gitignore create mode 100644 arch/arm64/kernel/vdso-ilp32/Makefile create mode 100644 arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S create mode 100644 arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h index 839ce00..649a9a4 100644 --- a/arch/arm64/include/asm/vdso.h +++ b/arch/arm64/include/asm/vdso.h @@ -29,6 +29,12 @@ #include <generated/vdso-offsets.h> +#ifdef CONFIG_ARM64_ILP32 +#include <generated/vdso-ilp32-offsets.h> +#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 09e4373..e98add5 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -50,6 +50,7 @@ arm64-obj-$(CONFIG_PARAVIRT) += paravirt.o arm64-obj-$(CONFIG_RANDOMIZE_BASE) += kaslr.o obj-y += $(arm64-obj-y) vdso/ +obj-$(CONFIG_ARM64_ILP32) += vdso-ilp32/ obj-m += $(arm64-obj-m) head-y := head.o extra-y += $(head-y) vmlinux.lds @@ -57,3 +58,9 @@ extra-y += $(head-y) vmlinux.lds # vDSO - this must be built first to generate the symbol offsets $(call objectify,$(arm64-obj-y)): $(obj)/vdso/vdso-offsets.h $(obj)/vdso/vdso-offsets.h: $(obj)/vdso + +ifeq ($(CONFIG_ARM64_ILP32),y) +# vDSO - this must be built first to generate the symbol offsets +$(call objectify,$(arm64-obj-y)): $(obj)/vdso-ilp32/vdso-ilp32-offsets.h +$(obj)/vdso-ilp32/vdso-ilp32-offsets.h: $(obj)/vdso-ilp32 +endif diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index e229525..af69b81 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -101,6 +101,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 45bcd96..933cdcf 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -264,6 +264,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->mm->context.vdso, sigtramp); diff --git a/arch/arm64/kernel/vdso-ilp32/.gitignore b/arch/arm64/kernel/vdso-ilp32/.gitignore new file mode 100644 index 0000000..61806c3 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/.gitignore @@ -0,0 +1,2 @@ +vdso-ilp32.lds +vdso-ilp32-offsets.h diff --git a/arch/arm64/kernel/vdso-ilp32/Makefile b/arch/arm64/kernel/vdso-ilp32/Makefile new file mode 100644 index 0000000..0671e88 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/Makefile @@ -0,0 +1,74 @@ +# +# Building a vDSO image for AArch64. +# +# Author: Will Deacon <will.deacon@arm.com> +# Heavily based on the vDSO Makefiles for other archs. +# + +obj-ilp32-vdso := gettimeofday-ilp32.o note-ilp32.o sigreturn-ilp32.o + +# Build rules +targets := $(obj-ilp32-vdso) vdso-ilp32.so vdso-ilp32.so.dbg +obj-ilp32-vdso := $(addprefix $(obj)/, $(obj-ilp32-vdso)) + +ccflags-y := -shared -fno-common -fno-builtin +ccflags-y += -nostdlib -Wl,-soname=linux-ilp32-vdso.so.1 \ + $(call cc-ldoption, -Wl$(comma)--hash-style=sysv) + +obj-y += vdso-ilp32.o +extra-y += vdso-ilp32.lds vdso-ilp32-offsets.h +CPPFLAGS_vdso-ilp32.lds += -P -C -U$(ARCH) -mabi=ilp32 + +# Force dependency (incbin is bad) +$(obj)/vdso-ilp32.o : $(obj)/vdso-ilp32.so + +# Link rule for the .so file, .lds has to be first +$(obj)/vdso-ilp32.so.dbg: $(src)/vdso-ilp32.lds $(obj-ilp32-vdso) + $(call if_changed,vdso-ilp32ld) + +# Strip rule for the .so file +$(obj)/%.so: OBJCOPYFLAGS := -S +$(obj)/%.so: $(obj)/%.so.dbg FORCE + $(call if_changed,objcopy) + +# Generate VDSO offsets using helper script +gen-vdsosym := $(srctree)/$(src)/../vdso/gen_vdso_offsets.sh +quiet_cmd_vdsosym = VDSOSYM $@ +define cmd_vdsosym + $(NM) $< | $(gen-vdsosym) | LC_ALL=C sort > $@ && \ + cp $@ include/generated/ +endef + +$(obj)/vdso-ilp32-offsets.h: $(obj)/vdso-ilp32.so.dbg FORCE + $(call if_changed,vdsosym) + +# Assembly rules for the .S files +#$(obj-ilp32-vdso): %.o: $(src)/../vdso/$(subst -ilp32,,%.S) +# $(call if_changed_dep,vdso-ilp32as) + +$(obj)/gettimeofday-ilp32.o: $(src)/../vdso/gettimeofday.S + $(call if_changed_dep,vdso-ilp32as) + +$(obj)/note-ilp32.o: $(src)/../vdso/note.S + $(call if_changed_dep,vdso-ilp32as) + +# This one should be fine because ILP32 uses the same generic +# __NR_rt_sigreturn syscall number. +$(obj)/sigreturn-ilp32.o: $(src)/../vdso/sigreturn.S + $(call if_changed_dep,vdso-ilp32as) + +# Actual build commands +quiet_cmd_vdso-ilp32ld = VDSOILP32L $@ + cmd_vdso-ilp32ld = $(CC) $(c_flags) -mabi=ilp32 -Wl,-n -Wl,-T $^ -o $@ +quiet_cmd_vdso-ilp32as = VDSOILP32A $@ + cmd_vdso-ilp32as = $(CC) $(a_flags) -mabi=ilp32 -c -o $@ $< + +# Install commands for the unstripped file +quiet_cmd_vdso_install = INSTALL $@ + cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@ + +vdso-ilp32.so: $(obj)/vdso-ilp32.so.dbg + @mkdir -p $(MODLIB)/vdso + $(call cmd,vdso_install) + +vdso_install: vdso-ilp32.so diff --git a/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S new file mode 100644 index 0000000..46ac072 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2012 ARM Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Author: Will Deacon <will.deacon@arm.com> + */ + +#include <linux/init.h> +#include <linux/linkage.h> +#include <linux/const.h> +#include <asm/page.h> + + __PAGE_ALIGNED_DATA + + .globl vdso_ilp32_start, vdso_ilp32_end + .balign PAGE_SIZE +vdso_ilp32_start: + .incbin "arch/arm64/kernel/vdso-ilp32/vdso-ilp32.so" + .balign PAGE_SIZE +vdso_ilp32_end: + + .previous diff --git a/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S new file mode 100644 index 0000000..1dde31f --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S @@ -0,0 +1,95 @@ +/* + * GNU linker script for the VDSO library. + * + * Copyright (C) 2012 ARM Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Author: Will Deacon <will.deacon@arm.com> + * Heavily based on the vDSO linker scripts for other archs. + */ + +#include <linux/const.h> +#include <asm/page.h> +#include <asm/vdso.h> + +SECTIONS +{ + PROVIDE(_vdso_data = . - PAGE_SIZE); + . = VDSO_LBASE + SIZEOF_HEADERS; + + .hash : { *(.hash) } :text + .gnu.hash : { *(.gnu.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + + .note : { *(.note.*) } :text :note + + . = ALIGN(16); + + .text : { *(.text*) } :text =0xd503201f + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr + .eh_frame : { KEEP (*(.eh_frame)) } :text + + .dynamic : { *(.dynamic) } :text :dynamic + + .rodata : { *(.rodata*) } :text + + _end = .; + PROVIDE(end = .); + + /DISCARD/ : { + *(.note.GNU-stack) + *(.data .data.* .gnu.linkonce.d.* .sdata*) + *(.bss .sbss .dynbss .dynsbss) + } +} + +/* + * We must supply the ELF program headers explicitly to get just one + * PT_LOAD segment, and set the flags explicitly to make segments read-only. + */ +PHDRS +{ + text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */ + dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ + note PT_NOTE FLAGS(4); /* PF_R */ + eh_frame_hdr PT_GNU_EH_FRAME; +} + +/* + * This controls what symbols we export from the DSO. + */ +VERSION +{ + LINUX_4.6 { + global: + __kernel_rt_sigreturn; + __kernel_gettimeofday; + __kernel_clock_gettime; + __kernel_clock_getres; + local: *; + }; +} + +/* + * Make the sigreturn code visible to the kernel. + */ +VDSO_sigtramp_ilp32 = __kernel_rt_sigreturn; diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 26352a6..521a8e4 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -40,6 +40,12 @@ extern char vdso_start, vdso_end; static unsigned long vdso_pages; static struct page **vdso_pagelist; +#ifdef CONFIG_ARM64_ILP32 +extern char vdso_ilp32_start, vdso_ilp32_end; +static unsigned long vdso_ilp32_pages; +static struct page **vdso_ilp32_pagelist; +#endif + /* * The vDSO data page. */ @@ -109,24 +115,29 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) } #endif /* CONFIG_AARCH32_EL0 */ -static struct vm_special_mapping vdso_spec[2]; - -static int __init vdso_init(void) +static int __init vdso_init_common(char *vdso_start, char *vdso_end, + unsigned long *vdso_pagesp, + struct page ***vdso_pagelistp, + struct vm_special_mapping* vdso_spec) { int i; + unsigned long vdso_pages; + struct page **vdso_pagelist; - if (memcmp(&vdso_start, "\177ELF", 4)) { + if (memcmp(vdso_start, "\177ELF", 4)) { pr_err("vDSO is not a valid ELF object!\n"); return -EINVAL; } - vdso_pages = (&vdso_end - &vdso_start) >> PAGE_SHIFT; + vdso_pages = (vdso_end - vdso_start) >> PAGE_SHIFT; + *vdso_pagesp = vdso_pages; pr_info("vdso: %ld pages (%ld code @ %p, %ld data @ %p)\n", - vdso_pages + 1, vdso_pages, &vdso_start, 1L, vdso_data); + vdso_pages + 1, vdso_pages, vdso_start, 1L, vdso_data); /* Allocate the vDSO pagelist, plus a page for the data. */ vdso_pagelist = kcalloc(vdso_pages + 1, sizeof(struct page *), GFP_KERNEL); + *vdso_pagelistp = vdso_pagelist; if (vdso_pagelist == NULL) return -ENOMEM; @@ -135,7 +146,7 @@ static int __init vdso_init(void) /* Grab the vDSO code pages. */ for (i = 0; i < vdso_pages; i++) - vdso_pagelist[i + 1] = virt_to_page(&vdso_start + i * PAGE_SIZE); + vdso_pagelist[i + 1] = virt_to_page(vdso_start + i * PAGE_SIZE); /* Populate the special mapping structures */ vdso_spec[0] = (struct vm_special_mapping) { @@ -150,16 +161,46 @@ static int __init vdso_init(void) return 0; } + +static struct vm_special_mapping vdso_spec[2]; + +static int __init vdso_init(void) +{ + return vdso_init_common(&vdso_start, &vdso_end, + &vdso_pages, &vdso_pagelist, + vdso_spec); +} arch_initcall(vdso_init); +#ifdef CONFIG_ARM64_ILP32 +static struct vm_special_mapping vdso_ilp32_spec[2]; + +static int __init vdso_ilp32_init(void) +{ + return vdso_init_common(&vdso_ilp32_start, &vdso_ilp32_end, + &vdso_ilp32_pages, &vdso_ilp32_pagelist, + vdso_ilp32_spec); +} +arch_initcall(vdso_ilp32_init); +#endif + int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { struct mm_struct *mm = current->mm; unsigned long vdso_base, vdso_text_len, vdso_mapping_len; void *ret; + unsigned long pages = vdso_pages; + struct vm_special_mapping *spec = vdso_spec; + +#ifdef CONFIG_ARM64_ILP32 + if (is_ilp32_compat_task()) { + pages = vdso_ilp32_pages; + spec = vdso_ilp32_spec; + } +#endif - vdso_text_len = vdso_pages << PAGE_SHIFT; + vdso_text_len = pages << PAGE_SHIFT; /* Be sure to map the data page */ vdso_mapping_len = vdso_text_len + PAGE_SIZE; @@ -171,7 +212,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, } ret = _install_special_mapping(mm, vdso_base, PAGE_SIZE, VM_READ|VM_MAYREAD, - &vdso_spec[0]); + &spec[0]); if (IS_ERR(ret)) goto up_fail; @@ -180,7 +221,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, ret = _install_special_mapping(mm, vdso_base, vdso_text_len, VM_READ|VM_EXEC| VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, - &vdso_spec[1]); + &spec[1]); if (IS_ERR(ret)) goto up_fail; diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S index efa79e8..a2d8a70 100644 --- a/arch/arm64/kernel/vdso/gettimeofday.S +++ b/arch/arm64/kernel/vdso/gettimeofday.S @@ -25,6 +25,16 @@ #define NSEC_PER_SEC_LO16 0xca00 #define NSEC_PER_SEC_HI16 0x3b9a +#ifdef __LP64__ +#define PTR_REG(n) x##n +#define OFFSET(n) n +#define DELOUSE(n) +#else +#define PTR_REG(n) w##n +#define OFFSET(n) COMPAT_##n +#define DELOUSE(n) mov w##n, w##n +#endif + vdso_data .req x6 use_syscall .req w7 seqcnt .req w8 @@ -51,6 +61,8 @@ seqcnt .req w8 /* int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz); */ ENTRY(__kernel_gettimeofday) .cfi_startproc + DELOUSE(0) + DELOUSE(1) mov x2, x30 .cfi_register x30, x2 @@ -68,7 +80,7 @@ ENTRY(__kernel_gettimeofday) mov x13, #1000 lsl x13, x13, x12 udiv x11, x11, x13 - stp x10, x11, [x0, #TVAL_TV_SEC] + stp PTR_REG(10), PTR_REG(11), [x0, #OFFSET(TVAL_TV_SEC)] 2: /* If tz is NULL, return 0. */ cbz x1, 3f @@ -88,6 +100,7 @@ ENDPROC(__kernel_gettimeofday) /* int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp); */ ENTRY(__kernel_clock_gettime) .cfi_startproc + DELOUSE(1) cmp w0, #CLOCK_REALTIME ccmp w0, #CLOCK_MONOTONIC, #0x4, ne b.ne 2f @@ -159,7 +172,7 @@ ENTRY(__kernel_clock_gettime) 6: /* Store to the user timespec. */ lsr x11, x11, x12 - stp x10, x11, [x1, #TSPEC_TV_SEC] + stp PTR_REG(10), PTR_REG(11), [x1, #OFFSET(TSPEC_TV_SEC)] mov x0, xzr ret 7: @@ -174,6 +187,7 @@ ENDPROC(__kernel_clock_gettime) /* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res); */ ENTRY(__kernel_clock_getres) .cfi_startproc + DELOUSE(1) cmp w0, #CLOCK_REALTIME ccmp w0, #CLOCK_MONOTONIC, #0x4, ne b.ne 1f @@ -187,7 +201,7 @@ ENTRY(__kernel_clock_getres) ldr x2, 6f 2: cbz w1, 3f - stp xzr, x2, [x1] + stp PTR_REG(zr), PTR_REG(2), [x1] 3: /* res == NULL. */ mov w0, wzr -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 22/23] arm64:ilp32: add vdso-ilp32 and use for signal return @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel From: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> ILP32 VDSO exports next 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 move data page before code pages in sync with commit 601255ae3c98fdeeee3a8bb4696425e4f868b4f1 Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/vdso.h | 6 ++ arch/arm64/kernel/Makefile | 7 ++ 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 | 74 +++++++++++++++++++++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S | 33 ++++++++++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S | 95 +++++++++++++++++++++++++++ arch/arm64/kernel/vdso.c | 61 ++++++++++++++--- arch/arm64/kernel/vdso/gettimeofday.S | 20 +++++- 10 files changed, 294 insertions(+), 13 deletions(-) create mode 100644 arch/arm64/kernel/vdso-ilp32/.gitignore create mode 100644 arch/arm64/kernel/vdso-ilp32/Makefile create mode 100644 arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S create mode 100644 arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h index 839ce00..649a9a4 100644 --- a/arch/arm64/include/asm/vdso.h +++ b/arch/arm64/include/asm/vdso.h @@ -29,6 +29,12 @@ #include <generated/vdso-offsets.h> +#ifdef CONFIG_ARM64_ILP32 +#include <generated/vdso-ilp32-offsets.h> +#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 09e4373..e98add5 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -50,6 +50,7 @@ arm64-obj-$(CONFIG_PARAVIRT) += paravirt.o arm64-obj-$(CONFIG_RANDOMIZE_BASE) += kaslr.o obj-y += $(arm64-obj-y) vdso/ +obj-$(CONFIG_ARM64_ILP32) += vdso-ilp32/ obj-m += $(arm64-obj-m) head-y := head.o extra-y += $(head-y) vmlinux.lds @@ -57,3 +58,9 @@ extra-y += $(head-y) vmlinux.lds # vDSO - this must be built first to generate the symbol offsets $(call objectify,$(arm64-obj-y)): $(obj)/vdso/vdso-offsets.h $(obj)/vdso/vdso-offsets.h: $(obj)/vdso + +ifeq ($(CONFIG_ARM64_ILP32),y) +# vDSO - this must be built first to generate the symbol offsets +$(call objectify,$(arm64-obj-y)): $(obj)/vdso-ilp32/vdso-ilp32-offsets.h +$(obj)/vdso-ilp32/vdso-ilp32-offsets.h: $(obj)/vdso-ilp32 +endif diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index e229525..af69b81 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -101,6 +101,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 45bcd96..933cdcf 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -264,6 +264,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->mm->context.vdso, sigtramp); diff --git a/arch/arm64/kernel/vdso-ilp32/.gitignore b/arch/arm64/kernel/vdso-ilp32/.gitignore new file mode 100644 index 0000000..61806c3 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/.gitignore @@ -0,0 +1,2 @@ +vdso-ilp32.lds +vdso-ilp32-offsets.h diff --git a/arch/arm64/kernel/vdso-ilp32/Makefile b/arch/arm64/kernel/vdso-ilp32/Makefile new file mode 100644 index 0000000..0671e88 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/Makefile @@ -0,0 +1,74 @@ +# +# Building a vDSO image for AArch64. +# +# Author: Will Deacon <will.deacon@arm.com> +# Heavily based on the vDSO Makefiles for other archs. +# + +obj-ilp32-vdso := gettimeofday-ilp32.o note-ilp32.o sigreturn-ilp32.o + +# Build rules +targets := $(obj-ilp32-vdso) vdso-ilp32.so vdso-ilp32.so.dbg +obj-ilp32-vdso := $(addprefix $(obj)/, $(obj-ilp32-vdso)) + +ccflags-y := -shared -fno-common -fno-builtin +ccflags-y += -nostdlib -Wl,-soname=linux-ilp32-vdso.so.1 \ + $(call cc-ldoption, -Wl$(comma)--hash-style=sysv) + +obj-y += vdso-ilp32.o +extra-y += vdso-ilp32.lds vdso-ilp32-offsets.h +CPPFLAGS_vdso-ilp32.lds += -P -C -U$(ARCH) -mabi=ilp32 + +# Force dependency (incbin is bad) +$(obj)/vdso-ilp32.o : $(obj)/vdso-ilp32.so + +# Link rule for the .so file, .lds has to be first +$(obj)/vdso-ilp32.so.dbg: $(src)/vdso-ilp32.lds $(obj-ilp32-vdso) + $(call if_changed,vdso-ilp32ld) + +# Strip rule for the .so file +$(obj)/%.so: OBJCOPYFLAGS := -S +$(obj)/%.so: $(obj)/%.so.dbg FORCE + $(call if_changed,objcopy) + +# Generate VDSO offsets using helper script +gen-vdsosym := $(srctree)/$(src)/../vdso/gen_vdso_offsets.sh +quiet_cmd_vdsosym = VDSOSYM $@ +define cmd_vdsosym + $(NM) $< | $(gen-vdsosym) | LC_ALL=C sort > $@ && \ + cp $@ include/generated/ +endef + +$(obj)/vdso-ilp32-offsets.h: $(obj)/vdso-ilp32.so.dbg FORCE + $(call if_changed,vdsosym) + +# Assembly rules for the .S files +#$(obj-ilp32-vdso): %.o: $(src)/../vdso/$(subst -ilp32,,%.S) +# $(call if_changed_dep,vdso-ilp32as) + +$(obj)/gettimeofday-ilp32.o: $(src)/../vdso/gettimeofday.S + $(call if_changed_dep,vdso-ilp32as) + +$(obj)/note-ilp32.o: $(src)/../vdso/note.S + $(call if_changed_dep,vdso-ilp32as) + +# This one should be fine because ILP32 uses the same generic +# __NR_rt_sigreturn syscall number. +$(obj)/sigreturn-ilp32.o: $(src)/../vdso/sigreturn.S + $(call if_changed_dep,vdso-ilp32as) + +# Actual build commands +quiet_cmd_vdso-ilp32ld = VDSOILP32L $@ + cmd_vdso-ilp32ld = $(CC) $(c_flags) -mabi=ilp32 -Wl,-n -Wl,-T $^ -o $@ +quiet_cmd_vdso-ilp32as = VDSOILP32A $@ + cmd_vdso-ilp32as = $(CC) $(a_flags) -mabi=ilp32 -c -o $@ $< + +# Install commands for the unstripped file +quiet_cmd_vdso_install = INSTALL $@ + cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@ + +vdso-ilp32.so: $(obj)/vdso-ilp32.so.dbg + @mkdir -p $(MODLIB)/vdso + $(call cmd,vdso_install) + +vdso_install: vdso-ilp32.so diff --git a/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S new file mode 100644 index 0000000..46ac072 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2012 ARM Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Author: Will Deacon <will.deacon@arm.com> + */ + +#include <linux/init.h> +#include <linux/linkage.h> +#include <linux/const.h> +#include <asm/page.h> + + __PAGE_ALIGNED_DATA + + .globl vdso_ilp32_start, vdso_ilp32_end + .balign PAGE_SIZE +vdso_ilp32_start: + .incbin "arch/arm64/kernel/vdso-ilp32/vdso-ilp32.so" + .balign PAGE_SIZE +vdso_ilp32_end: + + .previous diff --git a/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S new file mode 100644 index 0000000..1dde31f --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S @@ -0,0 +1,95 @@ +/* + * GNU linker script for the VDSO library. + * + * Copyright (C) 2012 ARM Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Author: Will Deacon <will.deacon@arm.com> + * Heavily based on the vDSO linker scripts for other archs. + */ + +#include <linux/const.h> +#include <asm/page.h> +#include <asm/vdso.h> + +SECTIONS +{ + PROVIDE(_vdso_data = . - PAGE_SIZE); + . = VDSO_LBASE + SIZEOF_HEADERS; + + .hash : { *(.hash) } :text + .gnu.hash : { *(.gnu.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + + .note : { *(.note.*) } :text :note + + . = ALIGN(16); + + .text : { *(.text*) } :text =0xd503201f + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr + .eh_frame : { KEEP (*(.eh_frame)) } :text + + .dynamic : { *(.dynamic) } :text :dynamic + + .rodata : { *(.rodata*) } :text + + _end = .; + PROVIDE(end = .); + + /DISCARD/ : { + *(.note.GNU-stack) + *(.data .data.* .gnu.linkonce.d.* .sdata*) + *(.bss .sbss .dynbss .dynsbss) + } +} + +/* + * We must supply the ELF program headers explicitly to get just one + * PT_LOAD segment, and set the flags explicitly to make segments read-only. + */ +PHDRS +{ + text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */ + dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ + note PT_NOTE FLAGS(4); /* PF_R */ + eh_frame_hdr PT_GNU_EH_FRAME; +} + +/* + * This controls what symbols we export from the DSO. + */ +VERSION +{ + LINUX_4.6 { + global: + __kernel_rt_sigreturn; + __kernel_gettimeofday; + __kernel_clock_gettime; + __kernel_clock_getres; + local: *; + }; +} + +/* + * Make the sigreturn code visible to the kernel. + */ +VDSO_sigtramp_ilp32 = __kernel_rt_sigreturn; diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 26352a6..521a8e4 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -40,6 +40,12 @@ extern char vdso_start, vdso_end; static unsigned long vdso_pages; static struct page **vdso_pagelist; +#ifdef CONFIG_ARM64_ILP32 +extern char vdso_ilp32_start, vdso_ilp32_end; +static unsigned long vdso_ilp32_pages; +static struct page **vdso_ilp32_pagelist; +#endif + /* * The vDSO data page. */ @@ -109,24 +115,29 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) } #endif /* CONFIG_AARCH32_EL0 */ -static struct vm_special_mapping vdso_spec[2]; - -static int __init vdso_init(void) +static int __init vdso_init_common(char *vdso_start, char *vdso_end, + unsigned long *vdso_pagesp, + struct page ***vdso_pagelistp, + struct vm_special_mapping* vdso_spec) { int i; + unsigned long vdso_pages; + struct page **vdso_pagelist; - if (memcmp(&vdso_start, "\177ELF", 4)) { + if (memcmp(vdso_start, "\177ELF", 4)) { pr_err("vDSO is not a valid ELF object!\n"); return -EINVAL; } - vdso_pages = (&vdso_end - &vdso_start) >> PAGE_SHIFT; + vdso_pages = (vdso_end - vdso_start) >> PAGE_SHIFT; + *vdso_pagesp = vdso_pages; pr_info("vdso: %ld pages (%ld code @ %p, %ld data @ %p)\n", - vdso_pages + 1, vdso_pages, &vdso_start, 1L, vdso_data); + vdso_pages + 1, vdso_pages, vdso_start, 1L, vdso_data); /* Allocate the vDSO pagelist, plus a page for the data. */ vdso_pagelist = kcalloc(vdso_pages + 1, sizeof(struct page *), GFP_KERNEL); + *vdso_pagelistp = vdso_pagelist; if (vdso_pagelist == NULL) return -ENOMEM; @@ -135,7 +146,7 @@ static int __init vdso_init(void) /* Grab the vDSO code pages. */ for (i = 0; i < vdso_pages; i++) - vdso_pagelist[i + 1] = virt_to_page(&vdso_start + i * PAGE_SIZE); + vdso_pagelist[i + 1] = virt_to_page(vdso_start + i * PAGE_SIZE); /* Populate the special mapping structures */ vdso_spec[0] = (struct vm_special_mapping) { @@ -150,16 +161,46 @@ static int __init vdso_init(void) return 0; } + +static struct vm_special_mapping vdso_spec[2]; + +static int __init vdso_init(void) +{ + return vdso_init_common(&vdso_start, &vdso_end, + &vdso_pages, &vdso_pagelist, + vdso_spec); +} arch_initcall(vdso_init); +#ifdef CONFIG_ARM64_ILP32 +static struct vm_special_mapping vdso_ilp32_spec[2]; + +static int __init vdso_ilp32_init(void) +{ + return vdso_init_common(&vdso_ilp32_start, &vdso_ilp32_end, + &vdso_ilp32_pages, &vdso_ilp32_pagelist, + vdso_ilp32_spec); +} +arch_initcall(vdso_ilp32_init); +#endif + int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { struct mm_struct *mm = current->mm; unsigned long vdso_base, vdso_text_len, vdso_mapping_len; void *ret; + unsigned long pages = vdso_pages; + struct vm_special_mapping *spec = vdso_spec; + +#ifdef CONFIG_ARM64_ILP32 + if (is_ilp32_compat_task()) { + pages = vdso_ilp32_pages; + spec = vdso_ilp32_spec; + } +#endif - vdso_text_len = vdso_pages << PAGE_SHIFT; + vdso_text_len = pages << PAGE_SHIFT; /* Be sure to map the data page */ vdso_mapping_len = vdso_text_len + PAGE_SIZE; @@ -171,7 +212,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, } ret = _install_special_mapping(mm, vdso_base, PAGE_SIZE, VM_READ|VM_MAYREAD, - &vdso_spec[0]); + &spec[0]); if (IS_ERR(ret)) goto up_fail; @@ -180,7 +221,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, ret = _install_special_mapping(mm, vdso_base, vdso_text_len, VM_READ|VM_EXEC| VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, - &vdso_spec[1]); + &spec[1]); if (IS_ERR(ret)) goto up_fail; diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S index efa79e8..a2d8a70 100644 --- a/arch/arm64/kernel/vdso/gettimeofday.S +++ b/arch/arm64/kernel/vdso/gettimeofday.S @@ -25,6 +25,16 @@ #define NSEC_PER_SEC_LO16 0xca00 #define NSEC_PER_SEC_HI16 0x3b9a +#ifdef __LP64__ +#define PTR_REG(n) x##n +#define OFFSET(n) n +#define DELOUSE(n) +#else +#define PTR_REG(n) w##n +#define OFFSET(n) COMPAT_##n +#define DELOUSE(n) mov w##n, w##n +#endif + vdso_data .req x6 use_syscall .req w7 seqcnt .req w8 @@ -51,6 +61,8 @@ seqcnt .req w8 /* int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz); */ ENTRY(__kernel_gettimeofday) .cfi_startproc + DELOUSE(0) + DELOUSE(1) mov x2, x30 .cfi_register x30, x2 @@ -68,7 +80,7 @@ ENTRY(__kernel_gettimeofday) mov x13, #1000 lsl x13, x13, x12 udiv x11, x11, x13 - stp x10, x11, [x0, #TVAL_TV_SEC] + stp PTR_REG(10), PTR_REG(11), [x0, #OFFSET(TVAL_TV_SEC)] 2: /* If tz is NULL, return 0. */ cbz x1, 3f @@ -88,6 +100,7 @@ ENDPROC(__kernel_gettimeofday) /* int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp); */ ENTRY(__kernel_clock_gettime) .cfi_startproc + DELOUSE(1) cmp w0, #CLOCK_REALTIME ccmp w0, #CLOCK_MONOTONIC, #0x4, ne b.ne 2f @@ -159,7 +172,7 @@ ENTRY(__kernel_clock_gettime) 6: /* Store to the user timespec. */ lsr x11, x11, x12 - stp x10, x11, [x1, #TSPEC_TV_SEC] + stp PTR_REG(10), PTR_REG(11), [x1, #OFFSET(TSPEC_TV_SEC)] mov x0, xzr ret 7: @@ -174,6 +187,7 @@ ENDPROC(__kernel_clock_gettime) /* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res); */ ENTRY(__kernel_clock_getres) .cfi_startproc + DELOUSE(1) cmp w0, #CLOCK_REALTIME ccmp w0, #CLOCK_MONOTONIC, #0x4, ne b.ne 1f @@ -187,7 +201,7 @@ ENTRY(__kernel_clock_getres) ldr x2, 6f 2: cbz w1, 3f - stp xzr, x2, [x1] + stp PTR_REG(zr), PTR_REG(2), [x1] 3: /* res == NULL. */ mov w0, wzr -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 22/23] arm64:ilp32: add vdso-ilp32 and use for signal return @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich From: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> ILP32 VDSO exports next 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 move data page before code pages in sync with commit 601255ae3c98fdeeee3a8bb4696425e4f868b4f1 Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- arch/arm64/include/asm/vdso.h | 6 ++ arch/arm64/kernel/Makefile | 7 ++ 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 | 74 +++++++++++++++++++++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S | 33 ++++++++++ arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S | 95 +++++++++++++++++++++++++++ arch/arm64/kernel/vdso.c | 61 ++++++++++++++--- arch/arm64/kernel/vdso/gettimeofday.S | 20 +++++- 10 files changed, 294 insertions(+), 13 deletions(-) create mode 100644 arch/arm64/kernel/vdso-ilp32/.gitignore create mode 100644 arch/arm64/kernel/vdso-ilp32/Makefile create mode 100644 arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S create mode 100644 arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h index 839ce00..649a9a4 100644 --- a/arch/arm64/include/asm/vdso.h +++ b/arch/arm64/include/asm/vdso.h @@ -29,6 +29,12 @@ #include <generated/vdso-offsets.h> +#ifdef CONFIG_ARM64_ILP32 +#include <generated/vdso-ilp32-offsets.h> +#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 09e4373..e98add5 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -50,6 +50,7 @@ arm64-obj-$(CONFIG_PARAVIRT) += paravirt.o arm64-obj-$(CONFIG_RANDOMIZE_BASE) += kaslr.o obj-y += $(arm64-obj-y) vdso/ +obj-$(CONFIG_ARM64_ILP32) += vdso-ilp32/ obj-m += $(arm64-obj-m) head-y := head.o extra-y += $(head-y) vmlinux.lds @@ -57,3 +58,9 @@ extra-y += $(head-y) vmlinux.lds # vDSO - this must be built first to generate the symbol offsets $(call objectify,$(arm64-obj-y)): $(obj)/vdso/vdso-offsets.h $(obj)/vdso/vdso-offsets.h: $(obj)/vdso + +ifeq ($(CONFIG_ARM64_ILP32),y) +# vDSO - this must be built first to generate the symbol offsets +$(call objectify,$(arm64-obj-y)): $(obj)/vdso-ilp32/vdso-ilp32-offsets.h +$(obj)/vdso-ilp32/vdso-ilp32-offsets.h: $(obj)/vdso-ilp32 +endif diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index e229525..af69b81 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -101,6 +101,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 45bcd96..933cdcf 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -264,6 +264,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->mm->context.vdso, sigtramp); diff --git a/arch/arm64/kernel/vdso-ilp32/.gitignore b/arch/arm64/kernel/vdso-ilp32/.gitignore new file mode 100644 index 0000000..61806c3 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/.gitignore @@ -0,0 +1,2 @@ +vdso-ilp32.lds +vdso-ilp32-offsets.h diff --git a/arch/arm64/kernel/vdso-ilp32/Makefile b/arch/arm64/kernel/vdso-ilp32/Makefile new file mode 100644 index 0000000..0671e88 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/Makefile @@ -0,0 +1,74 @@ +# +# Building a vDSO image for AArch64. +# +# Author: Will Deacon <will.deacon@arm.com> +# Heavily based on the vDSO Makefiles for other archs. +# + +obj-ilp32-vdso := gettimeofday-ilp32.o note-ilp32.o sigreturn-ilp32.o + +# Build rules +targets := $(obj-ilp32-vdso) vdso-ilp32.so vdso-ilp32.so.dbg +obj-ilp32-vdso := $(addprefix $(obj)/, $(obj-ilp32-vdso)) + +ccflags-y := -shared -fno-common -fno-builtin +ccflags-y += -nostdlib -Wl,-soname=linux-ilp32-vdso.so.1 \ + $(call cc-ldoption, -Wl$(comma)--hash-style=sysv) + +obj-y += vdso-ilp32.o +extra-y += vdso-ilp32.lds vdso-ilp32-offsets.h +CPPFLAGS_vdso-ilp32.lds += -P -C -U$(ARCH) -mabi=ilp32 + +# Force dependency (incbin is bad) +$(obj)/vdso-ilp32.o : $(obj)/vdso-ilp32.so + +# Link rule for the .so file, .lds has to be first +$(obj)/vdso-ilp32.so.dbg: $(src)/vdso-ilp32.lds $(obj-ilp32-vdso) + $(call if_changed,vdso-ilp32ld) + +# Strip rule for the .so file +$(obj)/%.so: OBJCOPYFLAGS := -S +$(obj)/%.so: $(obj)/%.so.dbg FORCE + $(call if_changed,objcopy) + +# Generate VDSO offsets using helper script +gen-vdsosym := $(srctree)/$(src)/../vdso/gen_vdso_offsets.sh +quiet_cmd_vdsosym = VDSOSYM $@ +define cmd_vdsosym + $(NM) $< | $(gen-vdsosym) | LC_ALL=C sort > $@ && \ + cp $@ include/generated/ +endef + +$(obj)/vdso-ilp32-offsets.h: $(obj)/vdso-ilp32.so.dbg FORCE + $(call if_changed,vdsosym) + +# Assembly rules for the .S files +#$(obj-ilp32-vdso): %.o: $(src)/../vdso/$(subst -ilp32,,%.S) +# $(call if_changed_dep,vdso-ilp32as) + +$(obj)/gettimeofday-ilp32.o: $(src)/../vdso/gettimeofday.S + $(call if_changed_dep,vdso-ilp32as) + +$(obj)/note-ilp32.o: $(src)/../vdso/note.S + $(call if_changed_dep,vdso-ilp32as) + +# This one should be fine because ILP32 uses the same generic +# __NR_rt_sigreturn syscall number. +$(obj)/sigreturn-ilp32.o: $(src)/../vdso/sigreturn.S + $(call if_changed_dep,vdso-ilp32as) + +# Actual build commands +quiet_cmd_vdso-ilp32ld = VDSOILP32L $@ + cmd_vdso-ilp32ld = $(CC) $(c_flags) -mabi=ilp32 -Wl,-n -Wl,-T $^ -o $@ +quiet_cmd_vdso-ilp32as = VDSOILP32A $@ + cmd_vdso-ilp32as = $(CC) $(a_flags) -mabi=ilp32 -c -o $@ $< + +# Install commands for the unstripped file +quiet_cmd_vdso_install = INSTALL $@ + cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@ + +vdso-ilp32.so: $(obj)/vdso-ilp32.so.dbg + @mkdir -p $(MODLIB)/vdso + $(call cmd,vdso_install) + +vdso_install: vdso-ilp32.so diff --git a/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S new file mode 100644 index 0000000..46ac072 --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.S @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2012 ARM Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Author: Will Deacon <will.deacon@arm.com> + */ + +#include <linux/init.h> +#include <linux/linkage.h> +#include <linux/const.h> +#include <asm/page.h> + + __PAGE_ALIGNED_DATA + + .globl vdso_ilp32_start, vdso_ilp32_end + .balign PAGE_SIZE +vdso_ilp32_start: + .incbin "arch/arm64/kernel/vdso-ilp32/vdso-ilp32.so" + .balign PAGE_SIZE +vdso_ilp32_end: + + .previous diff --git a/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S new file mode 100644 index 0000000..1dde31f --- /dev/null +++ b/arch/arm64/kernel/vdso-ilp32/vdso-ilp32.lds.S @@ -0,0 +1,95 @@ +/* + * GNU linker script for the VDSO library. + * + * Copyright (C) 2012 ARM Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Author: Will Deacon <will.deacon@arm.com> + * Heavily based on the vDSO linker scripts for other archs. + */ + +#include <linux/const.h> +#include <asm/page.h> +#include <asm/vdso.h> + +SECTIONS +{ + PROVIDE(_vdso_data = . - PAGE_SIZE); + . = VDSO_LBASE + SIZEOF_HEADERS; + + .hash : { *(.hash) } :text + .gnu.hash : { *(.gnu.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + + .note : { *(.note.*) } :text :note + + . = ALIGN(16); + + .text : { *(.text*) } :text =0xd503201f + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr + .eh_frame : { KEEP (*(.eh_frame)) } :text + + .dynamic : { *(.dynamic) } :text :dynamic + + .rodata : { *(.rodata*) } :text + + _end = .; + PROVIDE(end = .); + + /DISCARD/ : { + *(.note.GNU-stack) + *(.data .data.* .gnu.linkonce.d.* .sdata*) + *(.bss .sbss .dynbss .dynsbss) + } +} + +/* + * We must supply the ELF program headers explicitly to get just one + * PT_LOAD segment, and set the flags explicitly to make segments read-only. + */ +PHDRS +{ + text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */ + dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ + note PT_NOTE FLAGS(4); /* PF_R */ + eh_frame_hdr PT_GNU_EH_FRAME; +} + +/* + * This controls what symbols we export from the DSO. + */ +VERSION +{ + LINUX_4.6 { + global: + __kernel_rt_sigreturn; + __kernel_gettimeofday; + __kernel_clock_gettime; + __kernel_clock_getres; + local: *; + }; +} + +/* + * Make the sigreturn code visible to the kernel. + */ +VDSO_sigtramp_ilp32 = __kernel_rt_sigreturn; diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 26352a6..521a8e4 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -40,6 +40,12 @@ extern char vdso_start, vdso_end; static unsigned long vdso_pages; static struct page **vdso_pagelist; +#ifdef CONFIG_ARM64_ILP32 +extern char vdso_ilp32_start, vdso_ilp32_end; +static unsigned long vdso_ilp32_pages; +static struct page **vdso_ilp32_pagelist; +#endif + /* * The vDSO data page. */ @@ -109,24 +115,29 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) } #endif /* CONFIG_AARCH32_EL0 */ -static struct vm_special_mapping vdso_spec[2]; - -static int __init vdso_init(void) +static int __init vdso_init_common(char *vdso_start, char *vdso_end, + unsigned long *vdso_pagesp, + struct page ***vdso_pagelistp, + struct vm_special_mapping* vdso_spec) { int i; + unsigned long vdso_pages; + struct page **vdso_pagelist; - if (memcmp(&vdso_start, "\177ELF", 4)) { + if (memcmp(vdso_start, "\177ELF", 4)) { pr_err("vDSO is not a valid ELF object!\n"); return -EINVAL; } - vdso_pages = (&vdso_end - &vdso_start) >> PAGE_SHIFT; + vdso_pages = (vdso_end - vdso_start) >> PAGE_SHIFT; + *vdso_pagesp = vdso_pages; pr_info("vdso: %ld pages (%ld code @ %p, %ld data @ %p)\n", - vdso_pages + 1, vdso_pages, &vdso_start, 1L, vdso_data); + vdso_pages + 1, vdso_pages, vdso_start, 1L, vdso_data); /* Allocate the vDSO pagelist, plus a page for the data. */ vdso_pagelist = kcalloc(vdso_pages + 1, sizeof(struct page *), GFP_KERNEL); + *vdso_pagelistp = vdso_pagelist; if (vdso_pagelist == NULL) return -ENOMEM; @@ -135,7 +146,7 @@ static int __init vdso_init(void) /* Grab the vDSO code pages. */ for (i = 0; i < vdso_pages; i++) - vdso_pagelist[i + 1] = virt_to_page(&vdso_start + i * PAGE_SIZE); + vdso_pagelist[i + 1] = virt_to_page(vdso_start + i * PAGE_SIZE); /* Populate the special mapping structures */ vdso_spec[0] = (struct vm_special_mapping) { @@ -150,16 +161,46 @@ static int __init vdso_init(void) return 0; } + +static struct vm_special_mapping vdso_spec[2]; + +static int __init vdso_init(void) +{ + return vdso_init_common(&vdso_start, &vdso_end, + &vdso_pages, &vdso_pagelist, + vdso_spec); +} arch_initcall(vdso_init); +#ifdef CONFIG_ARM64_ILP32 +static struct vm_special_mapping vdso_ilp32_spec[2]; + +static int __init vdso_ilp32_init(void) +{ + return vdso_init_common(&vdso_ilp32_start, &vdso_ilp32_end, + &vdso_ilp32_pages, &vdso_ilp32_pagelist, + vdso_ilp32_spec); +} +arch_initcall(vdso_ilp32_init); +#endif + int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { struct mm_struct *mm = current->mm; unsigned long vdso_base, vdso_text_len, vdso_mapping_len; void *ret; + unsigned long pages = vdso_pages; + struct vm_special_mapping *spec = vdso_spec; + +#ifdef CONFIG_ARM64_ILP32 + if (is_ilp32_compat_task()) { + pages = vdso_ilp32_pages; + spec = vdso_ilp32_spec; + } +#endif - vdso_text_len = vdso_pages << PAGE_SHIFT; + vdso_text_len = pages << PAGE_SHIFT; /* Be sure to map the data page */ vdso_mapping_len = vdso_text_len + PAGE_SIZE; @@ -171,7 +212,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, } ret = _install_special_mapping(mm, vdso_base, PAGE_SIZE, VM_READ|VM_MAYREAD, - &vdso_spec[0]); + &spec[0]); if (IS_ERR(ret)) goto up_fail; @@ -180,7 +221,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, ret = _install_special_mapping(mm, vdso_base, vdso_text_len, VM_READ|VM_EXEC| VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, - &vdso_spec[1]); + &spec[1]); if (IS_ERR(ret)) goto up_fail; diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S index efa79e8..a2d8a70 100644 --- a/arch/arm64/kernel/vdso/gettimeofday.S +++ b/arch/arm64/kernel/vdso/gettimeofday.S @@ -25,6 +25,16 @@ #define NSEC_PER_SEC_LO16 0xca00 #define NSEC_PER_SEC_HI16 0x3b9a +#ifdef __LP64__ +#define PTR_REG(n) x##n +#define OFFSET(n) n +#define DELOUSE(n) +#else +#define PTR_REG(n) w##n +#define OFFSET(n) COMPAT_##n +#define DELOUSE(n) mov w##n, w##n +#endif + vdso_data .req x6 use_syscall .req w7 seqcnt .req w8 @@ -51,6 +61,8 @@ seqcnt .req w8 /* int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz); */ ENTRY(__kernel_gettimeofday) .cfi_startproc + DELOUSE(0) + DELOUSE(1) mov x2, x30 .cfi_register x30, x2 @@ -68,7 +80,7 @@ ENTRY(__kernel_gettimeofday) mov x13, #1000 lsl x13, x13, x12 udiv x11, x11, x13 - stp x10, x11, [x0, #TVAL_TV_SEC] + stp PTR_REG(10), PTR_REG(11), [x0, #OFFSET(TVAL_TV_SEC)] 2: /* If tz is NULL, return 0. */ cbz x1, 3f @@ -88,6 +100,7 @@ ENDPROC(__kernel_gettimeofday) /* int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp); */ ENTRY(__kernel_clock_gettime) .cfi_startproc + DELOUSE(1) cmp w0, #CLOCK_REALTIME ccmp w0, #CLOCK_MONOTONIC, #0x4, ne b.ne 2f @@ -159,7 +172,7 @@ ENTRY(__kernel_clock_gettime) 6: /* Store to the user timespec. */ lsr x11, x11, x12 - stp x10, x11, [x1, #TSPEC_TV_SEC] + stp PTR_REG(10), PTR_REG(11), [x1, #OFFSET(TSPEC_TV_SEC)] mov x0, xzr ret 7: @@ -174,6 +187,7 @@ ENDPROC(__kernel_clock_gettime) /* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res); */ ENTRY(__kernel_clock_getres) .cfi_startproc + DELOUSE(1) cmp w0, #CLOCK_REALTIME ccmp w0, #CLOCK_MONOTONIC, #0x4, ne b.ne 1f @@ -187,7 +201,7 @@ ENTRY(__kernel_clock_getres) ldr x2, 6f 2: cbz w1, 3f - stp xzr, x2, [x1] + stp PTR_REG(zr), PTR_REG(2), [x1] 3: /* res == NULL. */ mov w0, wzr -- 2.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 23/23] arm64:ilp32: add ARM64_ILP32 to Kconfig 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-24 0:04 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski From: Andrew Pinski <apinski@cavium.com> This patch adds the config option for ILP32. Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.com> --- arch/arm64/Kconfig | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 0bb7adc..765d7c2 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -926,12 +926,13 @@ source "fs/Kconfig.binfmt" config COMPAT bool - depends on AARCH32_EL0 + depends on AARCH32_EL0 || ARM64_ILP32 config AARCH32_EL0 bool "Kernel support for 32-bit EL0" def_bool y depends on ARM64_4K_PAGES || EXPERT + select COMPAT select HAVE_UID16 select OLD_SIGSUSPEND3 select COMPAT_OLD_SIGACTION @@ -947,6 +948,15 @@ config AARCH32_EL0 If you want to execute 32-bit userspace applications, say Y. +config ARM64_ILP32 + bool "Kernel support for ILP32" + select COMPAT + select COMPAT_WRAPPER + 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.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 23/23] arm64:ilp32: add ARM64_ILP32 to Kconfig @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: linux-arm-kernel From: Andrew Pinski <apinski@cavium.com> This patch adds the config option for ILP32. Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.com> --- arch/arm64/Kconfig | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 0bb7adc..765d7c2 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -926,12 +926,13 @@ source "fs/Kconfig.binfmt" config COMPAT bool - depends on AARCH32_EL0 + depends on AARCH32_EL0 || ARM64_ILP32 config AARCH32_EL0 bool "Kernel support for 32-bit EL0" def_bool y depends on ARM64_4K_PAGES || EXPERT + select COMPAT select HAVE_UID16 select OLD_SIGSUSPEND3 select COMPAT_OLD_SIGACTION @@ -947,6 +948,15 @@ config AARCH32_EL0 If you want to execute 32-bit userspace applications, say Y. +config ARM64_ILP32 + bool "Kernel support for ILP32" + select COMPAT + select COMPAT_WRAPPER + 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.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* [PATCH 23/23] arm64:ilp32: add ARM64_ILP32 to Kconfig @ 2016-05-24 0:04 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-24 0:04 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, ynorov, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich, Andrew Pinski, Andrew Pinski From: Andrew Pinski <apinski@cavium.com> This patch adds the config option for ILP32. Signed-off-by: Andrew Pinski <Andrew.Pinski@caviumnetworks.com> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> Reviewed-by: David Daney <ddaney@caviumnetworks.com> --- arch/arm64/Kconfig | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 0bb7adc..765d7c2 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -926,12 +926,13 @@ source "fs/Kconfig.binfmt" config COMPAT bool - depends on AARCH32_EL0 + depends on AARCH32_EL0 || ARM64_ILP32 config AARCH32_EL0 bool "Kernel support for 32-bit EL0" def_bool y depends on ARM64_4K_PAGES || EXPERT + select COMPAT select HAVE_UID16 select OLD_SIGSUSPEND3 select COMPAT_OLD_SIGACTION @@ -947,6 +948,15 @@ config AARCH32_EL0 If you want to execute 32-bit userspace applications, say Y. +config ARM64_ILP32 + bool "Kernel support for ILP32" + select COMPAT + select COMPAT_WRAPPER + 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.5.0 ^ permalink raw reply related [flat|nested] 207+ messages in thread
* Re: [PATCH v6 00/21] ILP32 for ARM64 2016-05-24 0:04 ` Yury Norov (?) @ 2016-05-25 10:42 ` Szabolcs Nagy -1 siblings, 0 replies; 207+ messages in thread From: Szabolcs Nagy @ 2016-05-25 10:42 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: nd, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On 24/05/16 01:04, Yury Norov wrote: > This version is based on kernel v4.6. > It works with glibc-2.23, and tested with LTP. > ... > ILP32 glibc branch is available here: > https://github.com/norov/glibc/tree/ilp32-2.23 > > It is tested with this series with no major downsides. I will send it to > glibc-alpha soon, after final revise. Please review and comment it as well. i spotted one __ilp32__ vs __ILP32__ typo in the glibc code, i can review it in detail when there is a cleaned up patch set. in general the approach seems ok, the ugly part is when lp64 and ilp32 share code, but ilp32 needs some tweaks compared to the current code (e.g. x vs w regs in asm, long changed to long long in syscalls, different relocations etc) those will be hard to review. the naming is sometimes _be_ilp32 sometimes ilp32_be, but let's hope there will be no new abi variant to confuse this further. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH v6 00/21] ILP32 for ARM64 @ 2016-05-25 10:42 ` Szabolcs Nagy 0 siblings, 0 replies; 207+ messages in thread From: Szabolcs Nagy @ 2016-05-25 10:42 UTC (permalink / raw) To: linux-arm-kernel On 24/05/16 01:04, Yury Norov wrote: > This version is based on kernel v4.6. > It works with glibc-2.23, and tested with LTP. > ... > ILP32 glibc branch is available here: > https://github.com/norov/glibc/tree/ilp32-2.23 > > It is tested with this series with no major downsides. I will send it to > glibc-alpha soon, after final revise. Please review and comment it as well. i spotted one __ilp32__ vs __ILP32__ typo in the glibc code, i can review it in detail when there is a cleaned up patch set. in general the approach seems ok, the ugly part is when lp64 and ilp32 share code, but ilp32 needs some tweaks compared to the current code (e.g. x vs w regs in asm, long changed to long long in syscalls, different relocations etc) those will be hard to review. the naming is sometimes _be_ilp32 sometimes ilp32_be, but let's hope there will be no new abi variant to confuse this further. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH v6 00/21] ILP32 for ARM64 @ 2016-05-25 10:42 ` Szabolcs Nagy 0 siblings, 0 replies; 207+ messages in thread From: Szabolcs Nagy @ 2016-05-25 10:42 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: nd, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On 24/05/16 01:04, Yury Norov wrote: > This version is based on kernel v4.6. > It works with glibc-2.23, and tested with LTP. > ... > ILP32 glibc branch is available here: > https://github.com/norov/glibc/tree/ilp32-2.23 > > It is tested with this series with no major downsides. I will send it to > glibc-alpha soon, after final revise. Please review and comment it as well. i spotted one __ilp32__ vs __ILP32__ typo in the glibc code, i can review it in detail when there is a cleaned up patch set. in general the approach seems ok, the ugly part is when lp64 and ilp32 share code, but ilp32 needs some tweaks compared to the current code (e.g. x vs w regs in asm, long changed to long long in syscalls, different relocations etc) those will be hard to review. the naming is sometimes _be_ilp32 sometimes ilp32_be, but let's hope there will be no new abi variant to confuse this further. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH v6 00/21] ILP32 for ARM64 2016-05-25 10:42 ` Szabolcs Nagy (?) @ 2016-05-25 16:41 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-25 16:41 UTC (permalink / raw) To: Szabolcs Nagy Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, nd, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Wed, May 25, 2016 at 11:42:04AM +0100, Szabolcs Nagy wrote: > On 24/05/16 01:04, Yury Norov wrote: > > This version is based on kernel v4.6. > > It works with glibc-2.23, and tested with LTP. > > > ... > > ILP32 glibc branch is available here: > > https://github.com/norov/glibc/tree/ilp32-2.23 > > > > It is tested with this series with no major downsides. I will send it to > > glibc-alpha soon, after final revise. Please review and comment it as well. > > i spotted one __ilp32__ vs __ILP32__ typo in the glibc code, Yes, I also found it. Thank you. > i can review it in detail when there is a cleaned up patch set. > > in general the approach seems ok, the ugly part is when lp64 > and ilp32 share code, but ilp32 needs some tweaks compared to > the current code (e.g. x vs w regs in asm, long changed to > long long in syscalls, different relocations etc) those will > be hard to review. the naming is sometimes _be_ilp32 sometimes > ilp32_be, but let's hope there will be no new abi variant to > confuse this further. I think I shared the link too soon, and patches should be revised again. So I continue the work on it. If you curious, find it here. https://github.com/norov/glibc/tree/ilp32-dev (I don't promise I'll keep it stable, or will avoid using things like fast-forward. It's just a branch for my experiments.) For now, it has fixed: - __ilp32__ mess (by introducing DELOUSE() macro); - few unneeded patches dropped; - 32-bit off_t turned to 64-bit. With all changes, LPT fail list grows: peio_3 FAIL 5 pipeio_6 FAIL 1 abort01 FAIL 2 clone02 FAIL 4 fcntl11 FAIL 1 fcntl14 FAIL 1 fcntl17 FAIL 1 fcntl19 FAIL 1 fcntl20 FAIL 1 fcntl21 FAIL 1 fpathconf01 FAIL 1 ftruncate04 FAIL 1 kill11 FAIL 2 mmap16 FAIL 6 open12 FAIL 2 pread01 FAIL 2 pread02 FAIL 2 pread03 FAIL 2 preadv01 FAIL 6 preadv02 FAIL 6 pwrite01 FAIL 2 pwrite02 FAIL 2 pwrite04 FAIL 6 pwrite02_64 FAIL 1 pwritev01 FAIL 2 pwritev02 FAIL 2 rename11 FAIL 2 rmdir02 FAIL 2 umount2_01 FAIL 2 umount2_02 FAIL 2 umount2_03 FAIL 2 utime06 FAIL 2 mtest01 FAIL 1 mtest01w FAIL 1 mtest06 FAIL 11 gf01 FAIL 1 gf02 FAIL 1 gf07 FAIL 1 gf10 FAIL 1 gf11 FAIL 1 gf15 FAIL 1 gf18 FAIL 1 gf19 FAIL 1 Yury ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH v6 00/21] ILP32 for ARM64 @ 2016-05-25 16:41 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-25 16:41 UTC (permalink / raw) To: linux-arm-kernel On Wed, May 25, 2016 at 11:42:04AM +0100, Szabolcs Nagy wrote: > On 24/05/16 01:04, Yury Norov wrote: > > This version is based on kernel v4.6. > > It works with glibc-2.23, and tested with LTP. > > > ... > > ILP32 glibc branch is available here: > > https://github.com/norov/glibc/tree/ilp32-2.23 > > > > It is tested with this series with no major downsides. I will send it to > > glibc-alpha soon, after final revise. Please review and comment it as well. > > i spotted one __ilp32__ vs __ILP32__ typo in the glibc code, Yes, I also found it. Thank you. > i can review it in detail when there is a cleaned up patch set. > > in general the approach seems ok, the ugly part is when lp64 > and ilp32 share code, but ilp32 needs some tweaks compared to > the current code (e.g. x vs w regs in asm, long changed to > long long in syscalls, different relocations etc) those will > be hard to review. the naming is sometimes _be_ilp32 sometimes > ilp32_be, but let's hope there will be no new abi variant to > confuse this further. I think I shared the link too soon, and patches should be revised again. So I continue the work on it. If you curious, find it here. https://github.com/norov/glibc/tree/ilp32-dev (I don't promise I'll keep it stable, or will avoid using things like fast-forward. It's just a branch for my experiments.) For now, it has fixed: - __ilp32__ mess (by introducing DELOUSE() macro); - few unneeded patches dropped; - 32-bit off_t turned to 64-bit. With all changes, LPT fail list grows: peio_3 FAIL 5 pipeio_6 FAIL 1 abort01 FAIL 2 clone02 FAIL 4 fcntl11 FAIL 1 fcntl14 FAIL 1 fcntl17 FAIL 1 fcntl19 FAIL 1 fcntl20 FAIL 1 fcntl21 FAIL 1 fpathconf01 FAIL 1 ftruncate04 FAIL 1 kill11 FAIL 2 mmap16 FAIL 6 open12 FAIL 2 pread01 FAIL 2 pread02 FAIL 2 pread03 FAIL 2 preadv01 FAIL 6 preadv02 FAIL 6 pwrite01 FAIL 2 pwrite02 FAIL 2 pwrite04 FAIL 6 pwrite02_64 FAIL 1 pwritev01 FAIL 2 pwritev02 FAIL 2 rename11 FAIL 2 rmdir02 FAIL 2 umount2_01 FAIL 2 umount2_02 FAIL 2 umount2_03 FAIL 2 utime06 FAIL 2 mtest01 FAIL 1 mtest01w FAIL 1 mtest06 FAIL 11 gf01 FAIL 1 gf02 FAIL 1 gf07 FAIL 1 gf10 FAIL 1 gf11 FAIL 1 gf15 FAIL 1 gf18 FAIL 1 gf19 FAIL 1 Yury ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH v6 00/21] ILP32 for ARM64 @ 2016-05-25 16:41 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-05-25 16:41 UTC (permalink / raw) To: Szabolcs Nagy Cc: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha, nd, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Wed, May 25, 2016 at 11:42:04AM +0100, Szabolcs Nagy wrote: > On 24/05/16 01:04, Yury Norov wrote: > > This version is based on kernel v4.6. > > It works with glibc-2.23, and tested with LTP. > > > ... > > ILP32 glibc branch is available here: > > https://github.com/norov/glibc/tree/ilp32-2.23 > > > > It is tested with this series with no major downsides. I will send it to > > glibc-alpha soon, after final revise. Please review and comment it as well. > > i spotted one __ilp32__ vs __ILP32__ typo in the glibc code, Yes, I also found it. Thank you. > i can review it in detail when there is a cleaned up patch set. > > in general the approach seems ok, the ugly part is when lp64 > and ilp32 share code, but ilp32 needs some tweaks compared to > the current code (e.g. x vs w regs in asm, long changed to > long long in syscalls, different relocations etc) those will > be hard to review. the naming is sometimes _be_ilp32 sometimes > ilp32_be, but let's hope there will be no new abi variant to > confuse this further. I think I shared the link too soon, and patches should be revised again. So I continue the work on it. If you curious, find it here. https://github.com/norov/glibc/tree/ilp32-dev (I don't promise I'll keep it stable, or will avoid using things like fast-forward. It's just a branch for my experiments.) For now, it has fixed: - __ilp32__ mess (by introducing DELOUSE() macro); - few unneeded patches dropped; - 32-bit off_t turned to 64-bit. With all changes, LPT fail list grows: peio_3 FAIL 5 pipeio_6 FAIL 1 abort01 FAIL 2 clone02 FAIL 4 fcntl11 FAIL 1 fcntl14 FAIL 1 fcntl17 FAIL 1 fcntl19 FAIL 1 fcntl20 FAIL 1 fcntl21 FAIL 1 fpathconf01 FAIL 1 ftruncate04 FAIL 1 kill11 FAIL 2 mmap16 FAIL 6 open12 FAIL 2 pread01 FAIL 2 pread02 FAIL 2 pread03 FAIL 2 preadv01 FAIL 6 preadv02 FAIL 6 pwrite01 FAIL 2 pwrite02 FAIL 2 pwrite04 FAIL 6 pwrite02_64 FAIL 1 pwritev01 FAIL 2 pwritev02 FAIL 2 rename11 FAIL 2 rmdir02 FAIL 2 umount2_01 FAIL 2 umount2_02 FAIL 2 umount2_03 FAIL 2 utime06 FAIL 2 mtest01 FAIL 1 mtest01w FAIL 1 mtest06 FAIL 11 gf01 FAIL 1 gf02 FAIL 1 gf07 FAIL 1 gf10 FAIL 1 gf11 FAIL 1 gf15 FAIL 1 gf18 FAIL 1 gf19 FAIL 1 Yury ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH v6 00/21] ILP32 for ARM64 2016-05-24 0:04 ` Yury Norov (?) (?) @ 2016-06-02 19:03 ` Yury Norov -1 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-02 19:03 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Tue, May 24, 2016 at 03:04:29AM +0300, Yury Norov wrote: > This series enables aarch64 with ilp32 mode, and as supporting work, > introduces compat wrappers based on s390 solution, and also 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). > > This version is based on kernel v4.6. > It works with glibc-2.23, and tested with LTP. > > It was tested on QEMU and ThunderX machines. No major differences found. > > This is not RFC anymore, because ILP32 is now tested in big-endian mode; > signals, vDSO and other subsystems are tested, and look working > > 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: ABI reworked significantly; > - syscall input arguments are deloused with compat wrappers; > - vDSO is now working for both BE and LE; > - signal subsystem is reworked to handle signal context properly; > - binfmt_elf is reworked, and now most of places where execution mode > should be detected, are handled statically; > - many other less-important fixes. > > ILP32 glibc branch is available here: > https://github.com/norov/glibc/tree/ilp32-2.23 > So for AARCH64/ILP32 we turn next types to 64-bit in glibc: #define __INO_T_TYPE __UQUAD_TYPE #define __OFF_T_TYPE __SQUAD_TYPE #define __BLKCNT_T_TYPE __SQUAD_TYPE #define __FSBLKCNT_T_TYPE __UQUAD_TYPE #define __FSFILCNT_T_TYPE __UQUAD_TYPE And define: # define __INO_T_MATCHES_INO64_T 1 # define __OFF_T_MATCHES_OFF64_T 1 # define __BLKCNT_T_MATCHES_BLKCNT64_T 1 # define __FSBLKCNT_T_MATCHES_FSBLKCNT64_T 1 # define __FSFILCNT_T_MATCHES_FSFILCNT_T 1 If so, stat and statfs structures for ilp32 are turning the same as for lp64. And so we'd handle related syscalls with native lp64 handlers (wrapped, to zero top halves) in kernel. And we don't need stat64 for ilp32. Did I miss something? Is everything correct? OFF_T is turned to 64-bit quite smoothly, others make applications crash with segfault. Now I'm in deep debugging. https://github.com/norov/glibc/commits/ilp32-dev https://github.com/norov/linux/commits/ilp32 Yury. ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH v6 00/21] ILP32 for ARM64 @ 2016-06-02 19:03 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-02 19:03 UTC (permalink / raw) To: linux-arm-kernel On Tue, May 24, 2016 at 03:04:29AM +0300, Yury Norov wrote: > This series enables aarch64 with ilp32 mode, and as supporting work, > introduces compat wrappers based on s390 solution, and also 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). > > This version is based on kernel v4.6. > It works with glibc-2.23, and tested with LTP. > > It was tested on QEMU and ThunderX machines. No major differences found. > > This is not RFC anymore, because ILP32 is now tested in big-endian mode; > signals, vDSO and other subsystems are tested, and look working > > 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: ABI reworked significantly; > - syscall input arguments are deloused with compat wrappers; > - vDSO is now working for both BE and LE; > - signal subsystem is reworked to handle signal context properly; > - binfmt_elf is reworked, and now most of places where execution mode > should be detected, are handled statically; > - many other less-important fixes. > > ILP32 glibc branch is available here: > https://github.com/norov/glibc/tree/ilp32-2.23 > So for AARCH64/ILP32 we turn next types to 64-bit in glibc: #define __INO_T_TYPE __UQUAD_TYPE #define __OFF_T_TYPE __SQUAD_TYPE #define __BLKCNT_T_TYPE __SQUAD_TYPE #define __FSBLKCNT_T_TYPE __UQUAD_TYPE #define __FSFILCNT_T_TYPE __UQUAD_TYPE And define: # define __INO_T_MATCHES_INO64_T 1 # define __OFF_T_MATCHES_OFF64_T 1 # define __BLKCNT_T_MATCHES_BLKCNT64_T 1 # define __FSBLKCNT_T_MATCHES_FSBLKCNT64_T 1 # define __FSFILCNT_T_MATCHES_FSFILCNT_T 1 If so, stat and statfs structures for ilp32 are turning the same as for lp64. And so we'd handle related syscalls with native lp64 handlers (wrapped, to zero top halves) in kernel. And we don't need stat64 for ilp32. Did I miss something? Is everything correct? OFF_T is turned to 64-bit quite smoothly, others make applications crash with segfault. Now I'm in deep debugging. https://github.com/norov/glibc/commits/ilp32-dev https://github.com/norov/linux/commits/ilp32 Yury. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH v6 00/21] ILP32 for ARM64 @ 2016-06-02 19:03 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-02 19:03 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, szabolcs.nagy, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On Tue, May 24, 2016 at 03:04:29AM +0300, Yury Norov wrote: > This series enables aarch64 with ilp32 mode, and as supporting work, > introduces compat wrappers based on s390 solution, and also 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). > > This version is based on kernel v4.6. > It works with glibc-2.23, and tested with LTP. > > It was tested on QEMU and ThunderX machines. No major differences found. > > This is not RFC anymore, because ILP32 is now tested in big-endian mode; > signals, vDSO and other subsystems are tested, and look working > > 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: ABI reworked significantly; > - syscall input arguments are deloused with compat wrappers; > - vDSO is now working for both BE and LE; > - signal subsystem is reworked to handle signal context properly; > - binfmt_elf is reworked, and now most of places where execution mode > should be detected, are handled statically; > - many other less-important fixes. > > ILP32 glibc branch is available here: > https://github.com/norov/glibc/tree/ilp32-2.23 > So for AARCH64/ILP32 we turn next types to 64-bit in glibc: #define __INO_T_TYPE __UQUAD_TYPE #define __OFF_T_TYPE __SQUAD_TYPE #define __BLKCNT_T_TYPE __SQUAD_TYPE #define __FSBLKCNT_T_TYPE __UQUAD_TYPE #define __FSFILCNT_T_TYPE __UQUAD_TYPE And define: # define __INO_T_MATCHES_INO64_T 1 # define __OFF_T_MATCHES_OFF64_T 1 # define __BLKCNT_T_MATCHES_BLKCNT64_T 1 # define __FSBLKCNT_T_MATCHES_FSBLKCNT64_T 1 # define __FSFILCNT_T_MATCHES_FSFILCNT_T 1 If so, stat and statfs structures for ilp32 are turning the same as for lp64. And so we'd handle related syscalls with native lp64 handlers (wrapped, to zero top halves) in kernel. And we don't need stat64 for ilp32. Did I miss something? Is everything correct? OFF_T is turned to 64-bit quite smoothly, others make applications crash with segfault. Now I'm in deep debugging. https://github.com/norov/glibc/commits/ilp32-dev https://github.com/norov/linux/commits/ilp32 Yury. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH v6 00/21] ILP32 for ARM64 @ 2016-06-02 19:03 ` Yury Norov 0 siblings, 0 replies; 207+ messages in thread From: Yury Norov @ 2016-06-02 19:03 UTC (permalink / raw) To: arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: kilobyte, pinskia, szabolcs.nagy, Nathan_Lynch, heiko.carstens, agraf, Prasun.Kapoor, klimov.linux, broonie, bamvor.zhangjian, schwidefsky, geert, philipp.tomsich, joseph, christoph.muellner On Tue, May 24, 2016 at 03:04:29AM +0300, Yury Norov wrote: > This series enables aarch64 with ilp32 mode, and as supporting work, > introduces compat wrappers based on s390 solution, and also 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). > > This version is based on kernel v4.6. > It works with glibc-2.23, and tested with LTP. > > It was tested on QEMU and ThunderX machines. No major differences found. > > This is not RFC anymore, because ILP32 is now tested in big-endian mode; > signals, vDSO and other subsystems are tested, and look working > > 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: ABI reworked significantly; > - syscall input arguments are deloused with compat wrappers; > - vDSO is now working for both BE and LE; > - signal subsystem is reworked to handle signal context properly; > - binfmt_elf is reworked, and now most of places where execution mode > should be detected, are handled statically; > - many other less-important fixes. > > ILP32 glibc branch is available here: > https://github.com/norov/glibc/tree/ilp32-2.23 > So for AARCH64/ILP32 we turn next types to 64-bit in glibc: #define __INO_T_TYPE __UQUAD_TYPE #define __OFF_T_TYPE __SQUAD_TYPE #define __BLKCNT_T_TYPE __SQUAD_TYPE #define __FSBLKCNT_T_TYPE __UQUAD_TYPE #define __FSFILCNT_T_TYPE __UQUAD_TYPE And define: # define __INO_T_MATCHES_INO64_T 1 # define __OFF_T_MATCHES_OFF64_T 1 # define __BLKCNT_T_MATCHES_BLKCNT64_T 1 # define __FSBLKCNT_T_MATCHES_FSBLKCNT64_T 1 # define __FSFILCNT_T_MATCHES_FSFILCNT_T 1 If so, stat and statfs structures for ilp32 are turning the same as for lp64. And so we'd handle related syscalls with native lp64 handlers (wrapped, to zero top halves) in kernel. And we don't need stat64 for ilp32. Did I miss something? Is everything correct? OFF_T is turned to 64-bit quite smoothly, others make applications crash with segfault. Now I'm in deep debugging. https://github.com/norov/glibc/commits/ilp32-dev https://github.com/norov/linux/commits/ilp32 Yury. ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH v6 00/21] ILP32 for ARM64 2016-06-02 19:03 ` Yury Norov (?) @ 2016-06-03 11:02 ` Szabolcs Nagy -1 siblings, 0 replies; 207+ messages in thread From: Szabolcs Nagy @ 2016-06-03 11:02 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: nd, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On 02/06/16 20:03, Yury Norov wrote: > On Tue, May 24, 2016 at 03:04:29AM +0300, Yury Norov wrote: >> ILP32 glibc branch is available here: >> https://github.com/norov/glibc/tree/ilp32-2.23 >> > > So for AARCH64/ILP32 we turn next types to 64-bit in glibc: > #define __INO_T_TYPE __UQUAD_TYPE > #define __OFF_T_TYPE __SQUAD_TYPE > #define __BLKCNT_T_TYPE __SQUAD_TYPE > #define __FSBLKCNT_T_TYPE __UQUAD_TYPE > #define __FSFILCNT_T_TYPE __UQUAD_TYPE > > And define: > # define __INO_T_MATCHES_INO64_T 1 > # define __OFF_T_MATCHES_OFF64_T 1 > # define __BLKCNT_T_MATCHES_BLKCNT64_T 1 > # define __FSBLKCNT_T_MATCHES_FSBLKCNT64_T 1 > # define __FSFILCNT_T_MATCHES_FSFILCNT_T 1 > > If so, stat and statfs structures for ilp32 are turning the same as > for lp64. And so we'd handle related syscalls with native lp64 > handlers (wrapped, to zero top halves) in kernel. > > And we don't need stat64 for ilp32. > > Did I miss something? Is everything correct? > > OFF_T is turned to 64-bit quite smoothly, others make applications > crash with segfault. Now I'm in deep debugging. > based on previous discussions, non-trivial glibc changes may be needed to make 64bit fs apis the default on a 32bit abi. http://sourceware.org/ml/libc-alpha/2016-05/msg00337.html http://sourceware.org/ml/libc-alpha/2016-05/msg00356.html but i guess if you consistently fix the 32bit assumptions then it should work. > https://github.com/norov/glibc/commits/ilp32-dev > https://github.com/norov/linux/commits/ilp32 > > Yury. > ^ permalink raw reply [flat|nested] 207+ messages in thread
* [PATCH v6 00/21] ILP32 for ARM64 @ 2016-06-03 11:02 ` Szabolcs Nagy 0 siblings, 0 replies; 207+ messages in thread From: Szabolcs Nagy @ 2016-06-03 11:02 UTC (permalink / raw) To: linux-arm-kernel On 02/06/16 20:03, Yury Norov wrote: > On Tue, May 24, 2016 at 03:04:29AM +0300, Yury Norov wrote: >> ILP32 glibc branch is available here: >> https://github.com/norov/glibc/tree/ilp32-2.23 >> > > So for AARCH64/ILP32 we turn next types to 64-bit in glibc: > #define __INO_T_TYPE __UQUAD_TYPE > #define __OFF_T_TYPE __SQUAD_TYPE > #define __BLKCNT_T_TYPE __SQUAD_TYPE > #define __FSBLKCNT_T_TYPE __UQUAD_TYPE > #define __FSFILCNT_T_TYPE __UQUAD_TYPE > > And define: > # define __INO_T_MATCHES_INO64_T 1 > # define __OFF_T_MATCHES_OFF64_T 1 > # define __BLKCNT_T_MATCHES_BLKCNT64_T 1 > # define __FSBLKCNT_T_MATCHES_FSBLKCNT64_T 1 > # define __FSFILCNT_T_MATCHES_FSFILCNT_T 1 > > If so, stat and statfs structures for ilp32 are turning the same as > for lp64. And so we'd handle related syscalls with native lp64 > handlers (wrapped, to zero top halves) in kernel. > > And we don't need stat64 for ilp32. > > Did I miss something? Is everything correct? > > OFF_T is turned to 64-bit quite smoothly, others make applications > crash with segfault. Now I'm in deep debugging. > based on previous discussions, non-trivial glibc changes may be needed to make 64bit fs apis the default on a 32bit abi. http://sourceware.org/ml/libc-alpha/2016-05/msg00337.html http://sourceware.org/ml/libc-alpha/2016-05/msg00356.html but i guess if you consistently fix the 32bit assumptions then it should work. > https://github.com/norov/glibc/commits/ilp32-dev > https://github.com/norov/linux/commits/ilp32 > > Yury. > ^ permalink raw reply [flat|nested] 207+ messages in thread
* Re: [PATCH v6 00/21] ILP32 for ARM64 @ 2016-06-03 11:02 ` Szabolcs Nagy 0 siblings, 0 replies; 207+ messages in thread From: Szabolcs Nagy @ 2016-06-03 11:02 UTC (permalink / raw) To: Yury Norov, arnd, catalin.marinas, linux-arm-kernel, linux-kernel, linux-doc, linux-arch, linux-s390, libc-alpha Cc: nd, schwidefsky, heiko.carstens, pinskia, broonie, joseph, christoph.muellner, bamvor.zhangjian, klimov.linux, Nathan_Lynch, agraf, Prasun.Kapoor, kilobyte, geert, philipp.tomsich On 02/06/16 20:03, Yury Norov wrote: > On Tue, May 24, 2016 at 03:04:29AM +0300, Yury Norov wrote: >> ILP32 glibc branch is available here: >> https://github.com/norov/glibc/tree/ilp32-2.23 >> > > So for AARCH64/ILP32 we turn next types to 64-bit in glibc: > #define __INO_T_TYPE __UQUAD_TYPE > #define __OFF_T_TYPE __SQUAD_TYPE > #define __BLKCNT_T_TYPE __SQUAD_TYPE > #define __FSBLKCNT_T_TYPE __UQUAD_TYPE > #define __FSFILCNT_T_TYPE __UQUAD_TYPE > > And define: > # define __INO_T_MATCHES_INO64_T 1 > # define __OFF_T_MATCHES_OFF64_T 1 > # define __BLKCNT_T_MATCHES_BLKCNT64_T 1 > # define __FSBLKCNT_T_MATCHES_FSBLKCNT64_T 1 > # define __FSFILCNT_T_MATCHES_FSFILCNT_T 1 > > If so, stat and statfs structures for ilp32 are turning the same as > for lp64. And so we'd handle related syscalls with native lp64 > handlers (wrapped, to zero top halves) in kernel. > > And we don't need stat64 for ilp32. > > Did I miss something? Is everything correct? > > OFF_T is turned to 64-bit quite smoothly, others make applications > crash with segfault. Now I'm in deep debugging. > based on previous discussions, non-trivial glibc changes may be needed to make 64bit fs apis the default on a 32bit abi. http://sourceware.org/ml/libc-alpha/2016-05/msg00337.html http://sourceware.org/ml/libc-alpha/2016-05/msg00356.html but i guess if you consistently fix the 32bit assumptions then it should work. > https://github.com/norov/glibc/commits/ilp32-dev > https://github.com/norov/linux/commits/ilp32 > > Yury. > ^ permalink raw reply [flat|nested] 207+ messages in thread
end of thread, other threads:[~2016-06-27 2:12 UTC | newest] Thread overview: 207+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2016-05-24 0:04 [PATCH v6 00/21] ILP32 for ARM64 Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 01/23] all: syscall wrappers: add documentation Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-25 19:30 ` David Miller 2016-05-25 19:30 ` David Miller 2016-05-25 20:03 ` Yury Norov 2016-05-25 20:03 ` Yury Norov 2016-05-25 20:03 ` Yury Norov 2016-05-25 20:21 ` David Miller 2016-05-25 20:21 ` David Miller 2016-05-25 20:47 ` Arnd Bergmann 2016-05-25 20:47 ` Arnd Bergmann 2016-05-25 20:50 ` David Miller 2016-05-25 20:50 ` David Miller 2016-05-25 21:01 ` Arnd Bergmann 2016-05-25 21:01 ` Arnd Bergmann 2016-05-25 21:28 ` David Miller 2016-05-25 21:28 ` David Miller 2016-05-26 14:20 ` Catalin Marinas 2016-05-26 14:20 ` Catalin Marinas 2016-05-26 14:50 ` Szabolcs Nagy 2016-05-26 14:50 ` Szabolcs Nagy 2016-05-26 14:50 ` Szabolcs Nagy 2016-05-26 15:19 ` Catalin Marinas 2016-05-26 15:19 ` Catalin Marinas 2016-05-26 19:43 ` David Miller 2016-05-26 19:43 ` David Miller 2016-05-27 10:10 ` Catalin Marinas 2016-05-27 10:10 ` Catalin Marinas 2016-05-26 20:48 ` Yury Norov 2016-05-26 20:48 ` Yury Norov 2016-05-26 20:48 ` Yury Norov 2016-05-26 22:29 ` Catalin Marinas 2016-05-26 22:29 ` Catalin Marinas 2016-05-27 0:37 ` Yury Norov 2016-05-27 0:37 ` Yury Norov 2016-05-27 0:37 ` Yury Norov 2016-05-27 6:03 ` Heiko Carstens 2016-05-27 6:03 ` Heiko Carstens 2016-05-27 8:42 ` Arnd Bergmann 2016-05-27 8:42 ` Arnd Bergmann 2016-05-27 9:30 ` Catalin Marinas 2016-05-27 9:30 ` Catalin Marinas 2016-05-27 10:49 ` Arnd Bergmann 2016-05-27 10:49 ` Arnd Bergmann 2016-05-27 13:04 ` Catalin Marinas 2016-05-27 13:04 ` Catalin Marinas 2016-05-27 16:58 ` Yury Norov 2016-05-27 16:58 ` Yury Norov 2016-05-27 16:58 ` Yury Norov 2016-05-27 17:36 ` Catalin Marinas 2016-05-27 17:36 ` Catalin Marinas 2016-05-27 9:01 ` Catalin Marinas 2016-05-27 9:01 ` Catalin Marinas 2016-06-14 23:08 ` Yury Norov 2016-06-14 23:08 ` Yury Norov 2016-06-14 23:08 ` Yury Norov 2016-05-27 5:52 ` Heiko Carstens 2016-05-27 5:52 ` Heiko Carstens 2016-05-24 0:04 ` [PATCH 02/23] all: introduce COMPAT_WRAPPER option and enable it for s390 Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 03/23] all: s390: move wrapper infrastructure to generic headers Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 04/23] all: s390: move compat_wrappers.c from arch/s390/kernel to kernel/ Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 05/23] all: wrap needed syscalls in generic unistd Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 06/23] compat ABI: use non-compat openat and open_by_handle_at variants Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 07/23] 32-bit ABI: introduce ARCH_32BIT_OFF_T config option Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 08/23] arm64: ilp32: add documentation on the ILP32 ABI for ARM64 Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 09/23] arm64: ensure the kernel is compiled for LP64 Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 10/23] arm64: rename COMPAT to AARCH32_EL0 in Kconfig Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 11/23] arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 12/23] thread: move thread bits accessors to separated file Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 13/23] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-06-12 12:21 ` Zhangjian (Bamvor) 2016-06-12 12:21 ` Zhangjian (Bamvor) 2016-06-12 12:21 ` Zhangjian (Bamvor) 2016-06-12 13:08 ` Zhangjian (Bamvor) 2016-06-12 13:08 ` Zhangjian (Bamvor) 2016-06-12 13:08 ` Zhangjian (Bamvor) 2016-06-12 17:56 ` Yury Norov 2016-06-12 17:56 ` Yury Norov 2016-06-12 17:56 ` Yury Norov 2016-05-24 0:04 ` [PATCH 14/23] arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64 Yury Norov 2016-05-24 0:04 ` [PATCH 14/23] arm64: ilp32: add is_ilp32_compat_{task, thread} " Yury Norov 2016-05-24 0:04 ` [PATCH 14/23] arm64: ilp32: add is_ilp32_compat_{task,thread} " Yury Norov 2016-05-24 0:04 ` [PATCH 15/23] arm64: introduce binfmt_elf32.c Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 16/23] arm64: ilp32: introduce binfmt_ilp32.c Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-26 13:49 ` Zhangjian (Bamvor) 2016-05-26 13:49 ` Zhangjian (Bamvor) 2016-05-26 13:49 ` Zhangjian (Bamvor) 2016-05-26 21:08 ` Yury Norov 2016-05-26 21:08 ` Yury Norov 2016-05-26 21:08 ` Yury Norov 2016-06-15 0:40 ` Yury Norov 2016-06-15 0:40 ` Yury Norov 2016-06-15 0:40 ` Yury Norov 2016-06-13 3:05 ` Zhangjian (Bamvor) 2016-06-13 3:05 ` Zhangjian (Bamvor) 2016-06-13 3:05 ` Zhangjian (Bamvor) 2016-06-13 13:22 ` Zhangjian (Bamvor) 2016-06-13 13:22 ` Zhangjian (Bamvor) 2016-06-13 13:22 ` Zhangjian (Bamvor) 2016-05-24 0:04 ` [PATCH 17/23] arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-06-08 1:34 ` zhouchengming 2016-06-08 1:34 ` zhouchengming 2016-06-08 1:34 ` zhouchengming 2016-06-08 17:00 ` Yury Norov 2016-06-08 17:00 ` Yury Norov 2016-06-08 17:00 ` Yury Norov 2016-06-25 9:36 ` zhouchengming 2016-06-25 9:36 ` zhouchengming 2016-06-25 9:36 ` zhouchengming 2016-06-25 14:15 ` Bamvor Zhang 2016-06-25 14:15 ` Bamvor Zhang 2016-06-27 2:09 ` zhouchengming 2016-06-27 2:09 ` zhouchengming 2016-06-27 2:09 ` zhouchengming 2016-05-24 0:04 ` [PATCH 18/23] arm64: ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-25 20:26 ` Arnd Bergmann 2016-05-25 20:26 ` Arnd Bergmann 2016-05-24 0:04 ` [PATCH 19/23] arm64: signal: share lp64 signal routines to ilp32 Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 20/23] arm64: signal32: move ilp32 and aarch32 common code to separated file Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 21/23] arm64: ilp32: introduce ilp32-specific handlers for sigframe and ucontext Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-06-04 11:34 ` Zhangjian (Bamvor) 2016-06-04 11:34 ` Zhangjian (Bamvor) 2016-06-04 11:34 ` Zhangjian (Bamvor) 2016-06-12 12:34 ` Zhangjian (Bamvor) 2016-06-12 12:34 ` Zhangjian (Bamvor) 2016-06-12 12:34 ` Zhangjian (Bamvor) 2016-06-12 13:12 ` Zhangjian (Bamvor) 2016-06-12 13:12 ` Zhangjian (Bamvor) 2016-06-12 13:12 ` Zhangjian (Bamvor) 2016-06-12 17:44 ` Yury Norov 2016-06-12 17:44 ` Yury Norov 2016-06-12 17:44 ` Yury Norov 2016-06-16 11:21 ` Zhangjian (Bamvor) 2016-06-16 11:21 ` Zhangjian (Bamvor) 2016-06-16 11:21 ` Zhangjian (Bamvor) 2016-06-12 12:39 ` Zhangjian (Bamvor) 2016-06-12 12:39 ` Zhangjian (Bamvor) 2016-06-12 12:39 ` Zhangjian (Bamvor) 2016-05-24 0:04 ` [PATCH 22/23] arm64:ilp32: add vdso-ilp32 and use for signal return Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` [PATCH 23/23] arm64:ilp32: add ARM64_ILP32 to Kconfig Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-24 0:04 ` Yury Norov 2016-05-25 10:42 ` [PATCH v6 00/21] ILP32 for ARM64 Szabolcs Nagy 2016-05-25 10:42 ` Szabolcs Nagy 2016-05-25 10:42 ` Szabolcs Nagy 2016-05-25 16:41 ` Yury Norov 2016-05-25 16:41 ` Yury Norov 2016-05-25 16:41 ` Yury Norov 2016-06-02 19:03 ` Yury Norov 2016-06-02 19:03 ` Yury Norov 2016-06-02 19:03 ` Yury Norov 2016-06-02 19:03 ` Yury Norov 2016-06-03 11:02 ` Szabolcs Nagy 2016-06-03 11:02 ` Szabolcs Nagy 2016-06-03 11:02 ` Szabolcs Nagy
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.