Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp3782891ybl; Mon, 13 Jan 2020 02:32:34 -0800 (PST) X-Google-Smtp-Source: APXvYqwaf1LRLiJEzuri3C7AAxVLS8hOjQoUQIA4U3pc9BKngkF931R1NsItBZH9yDTRiMMF5hoz X-Received: by 2002:a9d:6f0d:: with SMTP id n13mr13074649otq.165.1578911553962; Mon, 13 Jan 2020 02:32:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578911553; cv=none; d=google.com; s=arc-20160816; b=QUEC4DGmomdobTD22NC542gwahAMhS/JZThfK1PLicxwpgYVzKPo45x19IZcETL55p wGLsFznFn3nh0/UEX4CT+wvEPhAINvQ8gcbSCJOiRbWNdPmpxwPSAUKuOrbb7dRlJmdK aGQtVx9C+C/Sn4Ot6je79PdDrAB4kiMXcp/c3UMcLWMSv/OLFiHtHeiudGI7H2lYFKBw H78rUC4tAmoY00o+lScVgbDoXo/NpE6KraNokRGsPyWjghqWRUKYHrPV2rSVWOoAHWAE M1rr4Vr7MbZSReKW8kOPzPjF8syvrNtYZJG4/j9fPMF/I59B6tBGieleLexC3CBSsDuU 6M0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=0losf0h7QOFn8n2xzIlyI5RmJEVs5zFQx0HZQuIM+Fc=; b=C/Vull7YlKbGPBwnhQRSMwdmkKc7+VeC9ExUXU9it3rD8ZrSDSjulA69Kna5Uw9tOo LJ2dvRHzLHOk8AHjFlPBG5vqolUQ6FcsjkTUjz6rP79QbhPaXSrOjxr16hGvSQWD+RSo rTbAz9uBvySfulSxUaMwywNh3UDz9/WcgI2oY+fvUCSuax3Hqa4q6QwNJpHSZZp1SXCk 6w87ZZbmsQUlLHHCiqr2+XUxEgTUtorbI054Y+QSGV59RPyXd3c4RXMcXCG08p9o6KMa H9dz04DPxGHOaL1FrVAb2SpQAHWZysz/yr3ZCpFDMVtknFBq4cj0C+3e5JiPuLw8Bazc Nm/g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q72si5835844oic.18.2020.01.13.02.32.22; Mon, 13 Jan 2020 02:32:33 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728640AbgAMKar (ORCPT + 99 others); Mon, 13 Jan 2020 05:30:47 -0500 Received: from michel.telenet-ops.be ([195.130.137.88]:37312 "EHLO michel.telenet-ops.be" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727014AbgAMKaq (ORCPT ); Mon, 13 Jan 2020 05:30:46 -0500 Received: from ramsan ([84.195.182.253]) by michel.telenet-ops.be with bizsmtp id pmWi210035USYZQ06mWi1z; Mon, 13 Jan 2020 11:30:44 +0100 Received: from rox.of.borg ([192.168.97.57]) by ramsan with esmtp (Exim 4.90_1) (envelope-from ) id 1iqwzZ-0000aP-SZ; Mon, 13 Jan 2020 11:30:41 +0100 Received: from geert by rox.of.borg with local (Exim 4.90_1) (envelope-from ) id 1iqwzZ-0006AN-Pz; Mon, 13 Jan 2020 11:30:41 +0100 From: Geert Uytterhoeven To: Greg Ungerer Cc: Amanieu d'Antras , Christian Brauner , Kars de Jong , Al Viro , linux-m68k@lists.linux-m68k.org, linux-kernel@vger.kernel.org, linux-next@vger.kernel.org, Geert Uytterhoeven Subject: [PATCH] m68k: Implement copy_thread_tls() Date: Mon, 13 Jan 2020 11:30:40 +0100 Message-Id: <20200113103040.23661-1-geert@linux-m68k.org> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is required for clone3(), which passes the TLS value through a struct rather than a register. As do_fork() is only available if CONFIG_HAVE_COPY_THREAD_TLS is set, m68k_clone() must be changed to call _do_fork() directly. Signed-off-by: Geert Uytterhoeven --- This is a dependency for the combination of commits e8bb2a2a1d51511e ("m68k: Wire up clone3() syscall") in m68k/for-next, dd499f7a7e342702 ("clone3: ensure copy_thread_tls is implemented") in v5.5-rc6. --- arch/m68k/Kconfig | 1 + arch/m68k/kernel/process.c | 31 ++++++++++++++++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index 6663f1741798e83f..6ad6cdac74b3dc42 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -14,6 +14,7 @@ config M68K select HAVE_AOUT if MMU select HAVE_ASM_MODVERSIONS select HAVE_DEBUG_BUGVERBOSE + select HAVE_COPY_THREAD_TLS select GENERIC_IRQ_SHOW select GENERIC_ATOMIC64 select HAVE_UID16 diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c index 22e6b8f4f9582aa4..8f0d9140700f09ad 100644 --- a/arch/m68k/kernel/process.c +++ b/arch/m68k/kernel/process.c @@ -108,16 +108,28 @@ void flush_thread(void) * on top of pt_regs, which means that sys_clone() arguments would be * buried. We could, of course, copy them, but it's too costly for no * good reason - generic clone() would have to copy them *again* for - * do_fork() anyway. So in this case it's actually better to pass pt_regs * - * and extract arguments for do_fork() from there. Eventually we might - * go for calling do_fork() directly from the wrapper, but only after we - * are finished with do_fork() prototype conversion. + * _do_fork() anyway. So in this case it's actually better to pass pt_regs * + * and extract arguments for _do_fork() from there. Eventually we might + * go for calling _do_fork() directly from the wrapper, but only after we + * are finished with _do_fork() prototype conversion. */ asmlinkage int m68k_clone(struct pt_regs *regs) { /* regs will be equal to current_pt_regs() */ - return do_fork(regs->d1, regs->d2, 0, - (int __user *)regs->d3, (int __user *)regs->d4); + struct kernel_clone_args args = { + .flags = regs->d1 & ~CSIGNAL, + .pidfd = (int __user *)regs->d3, + .child_tid = (int __user *)regs->d4, + .parent_tid = (int __user *)regs->d3, + .exit_signal = regs->d1 & CSIGNAL, + .stack = regs->d2, + .tls = regs->d5, + }; + + if (!legacy_clone_args_valid(&args)) + return -EINVAL; + + return _do_fork(&args); } /* @@ -130,8 +142,9 @@ asmlinkage int m68k_clone3(struct pt_regs *regs) return sys_clone3((struct clone_args __user *)regs->d1, regs->d2); } -int copy_thread(unsigned long clone_flags, unsigned long usp, - unsigned long arg, struct task_struct *p) +int copy_thread_tls(unsigned long clone_flags, unsigned long usp, + unsigned long arg, struct task_struct *p, + unsigned long tls) { struct fork_frame { struct switch_stack sw; @@ -166,7 +179,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, p->thread.usp = usp ?: rdusp(); if (clone_flags & CLONE_SETTLS) - task_thread_info(p)->tp_value = frame->regs.d5; + task_thread_info(p)->tp_value = tls; #ifdef CONFIG_FPU if (!FPU_IS_EMU) { -- 2.17.1