[PATCH v5 0/5] ARM: support THREAD_INFO_IN_TASK
Amit Kachhap
amit.kachhap at arm.com
Sun Sep 19 06:44:11 PDT 2021
On 9/18/21 2:14 PM, Ard Biesheuvel wrote:
> Placing thread_info in the kernel stack leaves it vulnerable to stack
> overflow attacks. This short series addresses that by using the existing
> THREAD_INFO_IN_TASK infrastructure.
>
> Changes since v4:
>
> - Pass -mtp=cp15 to the compiler to force the use of the TLS register
> when __builtin_thread_pointer() is used - this allows us to enable its
> use on Clang as well.
>
> - Tweak the __switch_to() changes not to affect builds that have the
> feature disabled (as requested by Russell), and to defer update of the
> TLS register to the point where the stack pointer is updated as well.
>
> - Tweak the #ifdef's so we avoid touching the TLS registers on builds
> that may target v6 systems without HWCAP_TLS.
>
> - Use task_cpu() in the final patch to assign thread_info->cpu, so that
> this series can be carried independently of the series I proposed for
> moving the CPU field back into thread_info [1].
>
> Changes since v3:
>
> - Leave the CPU field in thread_info, and keep it in sync at context
> switch time. This is by far the easiest and cleanest way to work
> around the fact that it is infeasible to implement
> raw_smp_processor_id() in terms of task_struct::cpu (for reasons of
> header soup).
>
> - Drop the VFP changes, they are no longer necessary given the previous
> point.
>
> - Drop the change to pass the CPU number to secondary_start_kernel().
> Given that we also need to pass the idle task pointer, which carries
> the CPU number, passing the CPU number directly is redundant.
>
> - Use the TPIDRURO register to carry 'current' while running in the
> kernel, and keep using TPIDRPRW for the per-CPU offset as before. This
> way, there is no need to make any changes to the way the per-CPU offsets
> are programmed. It also avoids the concurrency issues that would
> result from carrying the 'current' pointer in a per-CPU variable.
>
> - Update the per-task stack protector plugin to pull the stack canary
> value directly from the task struct.
>
> Cc: Keith Packard <keithpac at amazon.com>
> Cc: Russell King <linux at armlinux.org.uk>
> Cc: Kees Cook <keescook at chromium.org>
> Cc: Arnd Bergmann <arnd at arndb.de>
> Cc: Linus Walleij <linus.walleij at linaro.org>
This series boots with both CURRENT_POINTER_IN_TPIDRURO and
!CURRENT_POINTER_IN_TPIDRURO mode so,
Tested-by: Amit Daniel Kachhap <amit.kachhap at arm.com>
Thanks,
Amit Daniel
>
> [0] https://lore.kernel.org/all/20210907220038.91021-1-keithpac@amazon.com/
> [1] https://lore.kernel.org/all/20210914121036.3975026-1-ardb@kernel.org/
>
> Ard Biesheuvel (4):
> gcc-plugins: arm-ssp: Prepare for THREAD_INFO_IN_TASK support
> ARM: smp: Free up the TLS register while running in the kernel
> ARM: smp: Store current pointer in TPIDRURO register if available
> ARM: smp: Enable THREAD_INFO_IN_TASK
>
> Keith Packard (1):
> ARM: smp: Pass task to secondary_start_kernel
>
> arch/arm/Kconfig | 8 +++-
> arch/arm/Makefile | 9 ++--
> arch/arm/include/asm/assembler.h | 29 ++++++++++++
> arch/arm/include/asm/current.h | 50 ++++++++++++++++++++
> arch/arm/include/asm/smp.h | 3 +-
> arch/arm/include/asm/stackprotector.h | 2 -
> arch/arm/include/asm/switch_to.h | 16 +++++++
> arch/arm/include/asm/thread_info.h | 15 ++++--
> arch/arm/include/asm/tls.h | 10 ++--
> arch/arm/kernel/asm-offsets.c | 6 +--
> arch/arm/kernel/entry-armv.S | 5 ++
> arch/arm/kernel/entry-common.S | 1 +
> arch/arm/kernel/entry-header.S | 8 ++++
> arch/arm/kernel/head-common.S | 5 ++
> arch/arm/kernel/head-nommu.S | 1 +
> arch/arm/kernel/head.S | 5 +-
> arch/arm/kernel/process.c | 8 ++--
> arch/arm/kernel/smp.c | 13 ++++-
> arch/arm/mm/proc-macros.S | 3 +-
> scripts/gcc-plugins/arm_ssp_per_task_plugin.c | 27 +++--------
> 20 files changed, 174 insertions(+), 50 deletions(-)
> create mode 100644 arch/arm/include/asm/current.h
>
More information about the linux-arm-kernel
mailing list