The clone3 syscall is currently broken when used with CLONE_SETTLS on all architectures that don't have an implementation of copy_thread_tls. The old copy_thread function handles CLONE_SETTLS by reading the new TLS value from pt_regs containing the clone syscall parameters. Since clone3 passes the TLS value in clone_args, this results in the TLS register being initialized to a garbage value.
This patch series implements copy_thread_tls on all architectures that currently define __ARCH_WANT_SYS_CLONE3 and adds a compile-time check to ensure that any architecture that enables clone3 in the future also implements copy_thread_tls.
I have also included a minor fix for the arm64 uapi headers which caused __NR_clone3 to be missing from the exported user headers.
I have only tested this on arm64, but the copy_thread_tls implementations for the various architectures are fairly straightforward.
Amanieu d'Antras (7): arm64: Move __ARCH_WANT_SYS_CLONE3 definition to uapi headers arm64: Implement copy_thread_tls arm: Implement copy_thread_tls parisc: Implement copy_thread_tls riscv: Implement copy_thread_tls xtensa: Implement copy_thread_tls clone3: ensure copy_thread_tls is implemented
arch/arm/Kconfig | 1 + arch/arm/kernel/process.c | 6 +++--- arch/arm64/Kconfig | 1 + arch/arm64/include/asm/unistd.h | 1 - arch/arm64/include/uapi/asm/unistd.h | 1 + arch/arm64/kernel/process.c | 10 +++++----- arch/parisc/Kconfig | 1 + arch/parisc/kernel/process.c | 8 ++++---- arch/riscv/Kconfig | 1 + arch/riscv/kernel/process.c | 6 +++--- arch/xtensa/Kconfig | 1 + arch/xtensa/kernel/process.c | 8 ++++---- kernel/fork.c | 10 ++++++++++ 13 files changed, 35 insertions(+), 20 deletions(-)