[PATCH 1/4] powerpc: convert to copy_thread_tls
Christophe Leroy
christophe.leroy at c-s.fr
Tue Aug 27 16:07:02 AEST 2019
Le 27/08/2019 à 05:30, Nicholas Piggin a écrit :
> Commit 3033f14ab78c3 ("clone: support passing tls argument via C rather
> than pt_regs magic") introduced the HAVE_COPY_THREAD_TLS option. Use it
> to avoid a subtle assumption about the argument ordering of clone type
> syscalls.
>
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
> ---
> arch/powerpc/Kconfig | 1 +
> arch/powerpc/kernel/process.c | 9 +++++----
> 2 files changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index d8dcd8820369..7477a3263225 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -182,6 +182,7 @@ config PPC
> select HAVE_STACKPROTECTOR if PPC64 && $(cc-option,-mstack-protector-guard=tls -mstack-protector-guard-reg=r13)
> select HAVE_STACKPROTECTOR if PPC32 && $(cc-option,-mstack-protector-guard=tls -mstack-protector-guard-reg=r2)
> select HAVE_CONTEXT_TRACKING if PPC64
> + select HAVE_COPY_THREAD_TLS
> select HAVE_DEBUG_KMEMLEAK
> select HAVE_DEBUG_STACKOVERFLOW
> select HAVE_DYNAMIC_FTRACE
> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
> index 8fc4de0d22b4..24621e7e5033 100644
> --- a/arch/powerpc/kernel/process.c
> +++ b/arch/powerpc/kernel/process.c
> @@ -1600,8 +1600,9 @@ static void setup_ksp_vsid(struct task_struct *p, unsigned long sp)
> /*
> * Copy architecture-specific thread state
> */
> -int copy_thread(unsigned long clone_flags, unsigned long usp,
> - unsigned long kthread_arg, struct task_struct *p)
> +int copy_thread_tls(unsigned long clone_flags, unsigned long usp,
> + unsigned long kthread_arg, struct task_struct *p,
> + unsigned long tls)
> {
> struct pt_regs *childregs, *kregs;
> extern void ret_from_fork(void);
> @@ -1642,10 +1643,10 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
> if (clone_flags & CLONE_SETTLS) {
> #ifdef CONFIG_PPC64
is_32bit_task() exists and always returns 1 on PPC32 so this gross ifdef
in the middle of an if/else is pointless, it should be dropped.
> if (!is_32bit_task())
> - childregs->gpr[13] = childregs->gpr[6];
> + childregs->gpr[13] = tls;
> else
> #endif
> - childregs->gpr[2] = childregs->gpr[6];
> + childregs->gpr[2] = tls;
> }
>
> f = ret_from_fork;
>
Christophe
More information about the Linuxppc-dev
mailing list