Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp1635833pxb; Fri, 13 Nov 2020 19:32:29 -0800 (PST) X-Google-Smtp-Source: ABdhPJzhoWksIizzPSyF12z6bntkPUdKYdrqWUztyLu+zuBbIJ2WqMJO82f6mH23hFy8kDHUdj3t X-Received: by 2002:a17:906:6a57:: with SMTP id n23mr5517968ejs.315.1605324749211; Fri, 13 Nov 2020 19:32:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605324749; cv=none; d=google.com; s=arc-20160816; b=AcoWrFXbEgINajYKJJf1wiQVNL3YUZtcv2ZMck62D68spIHXHeqv7k9OqQr85f0jHc Fxn4K6Qw/2suzdA3o1Q4FeqBGTJ822kb+dcbL6/ojInaG6t2LGQJ99vkgjwvWpC2nlHR ew+f7gMw07LI3jPwbRD9keOM5RKDzoJnl3CmLol3jUSURJFjafKtUFj6KwXYjvLMIUWN 2iFUDqjscPsIwIAvTnPrZS/P1btwDVJ1rh6fXPVTeno/NzbT6zOjBBqZNzaZbaMZ9JQr NoeJah5xglL+47BsBytXpHQ49u60CedIu+bCgs9slIFZDCj4fFNJsDESCaa+9+XVGm8g nw2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=YGB9rwxlEoYIksggHBGe28EB+f1jlWomQ/cm5UnYf3E=; b=abs9q92Iw2+pKWzItwOcY2H5x+cd789zClo200sakIHt6wJikHa8oVWbbMBejsCUe2 6s6MhgCicRZVwq8DURWRbnhOfrGEqkp212/OsgygHD/KlNIwegZLjqsz4C6GQ3OijkhS 3QBrXywOOmzdllPPC/Wn8+iDNznIcdYDEsl3KkR6fssYyrowbvtRqBoi6NlbNDrzp4L3 L6bY6758GLtkHr/GqVRQEiP/gg5EMnagUG4SHfHo9DfkOQIbLth82Y6+WFUzxUINW7n6 xvsn6Jn0tehAiZwK0ky6Jtw+T+3D1zWgSRefhSXc0GBOC549i6NGPkqnBWjqEFoydf2n /wcQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n7si7132677ejk.217.2020.11.13.19.32.06; Fri, 13 Nov 2020 19:32:29 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726511AbgKNDaF (ORCPT + 99 others); Fri, 13 Nov 2020 22:30:05 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:58620 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726494AbgKNDaF (ORCPT ); Fri, 13 Nov 2020 22:30:05 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: krisman) with ESMTPSA id 6B1521F47989 From: Gabriel Krisman Bertazi To: tglx@linutronix.de Cc: mingo@redhat.com, keescook@chromium.org, arnd@arndb.de, luto@amacapital.net, wad@chromium.org, rostedt@goodmis.org, paul@paul-moore.com, eparis@redhat.com, oleg@redhat.com, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, x86@kernel.org, Gabriel Krisman Bertazi , kernel@collabora.com Subject: [PATCH 07/10] ptrace: Migrate TIF_SYSCALL_EMU to use SYSCALL_WORK flag Date: Fri, 13 Nov 2020 22:29:14 -0500 Message-Id: <20201114032917.1205658-8-krisman@collabora.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201114032917.1205658-1-krisman@collabora.com> References: <20201114032917.1205658-1-krisman@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For architectures that rely on the generic syscall entry code, use the syscall_work field in struct thread_info and the specific SYSCALL_WORK flag. This set of flags has the advantage of being architecture independent. Users of the flag outside of the generic entry code should rely on the accessor macros, such that the flag is still correctly resolved for architectures that don't use the generic entry code and still rely on TIF flags for system call work. Signed-off-by: Gabriel Krisman Bertazi --- include/linux/entry-common.h | 8 ++------ include/linux/thread_info.h | 2 ++ include/linux/tracehook.h | 2 +- kernel/entry/common.c | 19 ++++++++++--------- kernel/fork.c | 4 ++-- kernel/ptrace.c | 10 +++++----- 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/include/linux/entry-common.h b/include/linux/entry-common.h index dc864edb7950..39d56558818d 100644 --- a/include/linux/entry-common.h +++ b/include/linux/entry-common.h @@ -13,10 +13,6 @@ * Define dummy _TIF work flags if not defined by the architecture or for * disabled functionality. */ -#ifndef _TIF_SYSCALL_EMU -# define _TIF_SYSCALL_EMU (0) -#endif - #ifndef _TIF_SYSCALL_AUDIT # define _TIF_SYSCALL_AUDIT (0) #endif @@ -42,7 +38,6 @@ #define SYSCALL_ENTER_WORK \ (_TIF_SYSCALL_AUDIT | \ - _TIF_SYSCALL_EMU | \ ARCH_SYSCALL_ENTER_WORK) /* @@ -58,7 +53,8 @@ #define SYSCALL_WORK_ENTER (SYSCALL_WORK_SECCOMP | \ SYSCALL_WORK_SYSCALL_TRACEPOINT | \ - SYSCALL_WORK_SYSCALL_TRACE) + SYSCALL_WORK_SYSCALL_TRACE | \ + SYSCALL_WORK_SYSCALL_EMU) #define SYSCALL_WORK_EXIT (SYSCALL_WORK_SYSCALL_TRACEPOINT | \ SYSCALL_WORK_SYSCALL_TRACE) diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h index b01f05282158..3c7dedadf94d 100644 --- a/include/linux/thread_info.h +++ b/include/linux/thread_info.h @@ -40,11 +40,13 @@ enum syscall_work_bit { SYSCALL_WORK_SECCOMP = 0, SYSCALL_WORK_SYSCALL_TRACEPOINT = 1, SYSCALL_WORK_SYSCALL_TRACE = 2, + SYSCALL_WORK_SYSCALL_EMU = 3, }; #define _SYSCALL_WORK_SECCOMP BIT(SYSCALL_WORK_SECCOMP) #define _SYSCALL_WORK_SYSCALL_TRACEPOINT BIT(SYSCALL_WORK_SYSCALL_TRACEPOINT) #define _SYSCALL_WORK_SYSCALL_TRACE BIT(SYSCALL_WORK_SYSCALL_TRACE) +#define _SYSCALL_WORK_SYSCALL_EMU BIT(SYSCALL_WORK_SYSCALL_EMU) #include diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h index 0aa3771d1df5..24424da49abc 100644 --- a/include/linux/tracehook.h +++ b/include/linux/tracehook.h @@ -83,7 +83,7 @@ static inline int ptrace_report_syscall(struct pt_regs *regs, * tracehook_report_syscall_entry - task is about to attempt a system call * @regs: user register state of current task * - * This will be called if %SYSCALL_TRACE or %TIF_SYSCALL_EMU have been set, + * This will be called if %SYSCALL_TRACE or %SYSCALL_EMU have been set, * when the current task has just entered the kernel for a system call. * Full user register state is available here. Changing the values * in @regs can affect the system call number and arguments to be tried. diff --git a/kernel/entry/common.c b/kernel/entry/common.c index 55ede5fed650..0170a4ae58f8 100644 --- a/kernel/entry/common.c +++ b/kernel/entry/common.c @@ -47,9 +47,9 @@ static long syscall_trace_enter(struct pt_regs *regs, long syscall, long ret = 0; /* Handle ptrace */ - if (work & _SYSCALL_WORK_SYSCALL_TRACE || ti_work & _TIF_SYSCALL_EMU) { + if (work & (_SYSCALL_WORK_SYSCALL_TRACE | _SYSCALL_WORK_SYSCALL_EMU)) { ret = arch_syscall_enter_tracehook(regs); - if (ret || (ti_work & _TIF_SYSCALL_EMU)) + if (ret || (work & _SYSCALL_WORK_SYSCALL_EMU)) return -1L; } @@ -208,21 +208,22 @@ static void exit_to_user_mode_prepare(struct pt_regs *regs) } #ifndef _TIF_SINGLESTEP -static inline bool report_single_step(unsigned long ti_work) +static inline bool report_single_step(unsigned long work) { return false; } #else /* - * If TIF_SYSCALL_EMU is set, then the only reason to report is when + * If SYSCALL_EMU is set, then the only reason to report is when * TIF_SINGLESTEP is set (i.e. PTRACE_SYSEMU_SINGLESTEP). This syscall * instruction has been already reported in syscall_enter_from_user_mode(). */ -#define SYSEMU_STEP (_TIF_SINGLESTEP | _TIF_SYSCALL_EMU) - -static inline bool report_single_step(unsigned long ti_work) +static inline bool report_single_step(unsigned long work) { - return (ti_work & SYSEMU_STEP) == _TIF_SINGLESTEP; + if (!(work & _SYSCALL_WORK_SYSCALL_EMU)) + return false; + + return !!(current_thread_info()->flags & _TIF_SINGLESTEP); } #endif @@ -236,7 +237,7 @@ static void syscall_exit_work(struct pt_regs *regs, unsigned long ti_work, if (work & _SYSCALL_WORK_SYSCALL_TRACEPOINT) trace_sys_exit(regs, syscall_get_return_value(current, regs)); - step = report_single_step(ti_work); + step = report_single_step(work); if (step || work & _SYSCALL_WORK_SYSCALL_TRACE) arch_syscall_exit_tracehook(regs, step); } diff --git a/kernel/fork.c b/kernel/fork.c index 6f934a930015..4f131cb0192a 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -2159,8 +2159,8 @@ static __latent_entropy struct task_struct *copy_process( */ user_disable_single_step(p); clear_task_syscall_work(p, SYSCALL_TRACE); -#ifdef TIF_SYSCALL_EMU - clear_tsk_thread_flag(p, TIF_SYSCALL_EMU); +#if defined(CONFIG_GENERIC_ENTRY) || defined(TIF_SYSCALL_EMU) + clear_task_syscall_work(p, SYSCALL_EMU); #endif clear_tsk_latency_tracing(p); diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 55a2bc3186a7..237bcd6d255c 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -118,8 +118,8 @@ void __ptrace_unlink(struct task_struct *child) BUG_ON(!child->ptrace); clear_task_syscall_work(child, SYSCALL_TRACE); -#ifdef TIF_SYSCALL_EMU - clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); +#if defined(CONFIG_GENERIC_ENTRY) || defined(TIF_SYSCALL_EMU) + clear_task_syscall_work(child, SYSCALL_EMU); #endif child->parent = child->real_parent; @@ -816,11 +816,11 @@ static int ptrace_resume(struct task_struct *child, long request, else clear_task_syscall_work(child, SYSCALL_TRACE); -#ifdef TIF_SYSCALL_EMU +#if defined(CONFIG_GENERIC_ENTRY) || defined(TIF_SYSCALL_EMU) if (request == PTRACE_SYSEMU || request == PTRACE_SYSEMU_SINGLESTEP) - set_tsk_thread_flag(child, TIF_SYSCALL_EMU); + set_task_syscall_work(child, SYSCALL_EMU); else - clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); + clear_task_syscall_work(child, SYSCALL_EMU); #endif if (is_singleblock(request)) { -- 2.29.2