From: Thomas Gleixner <tglx@linutronix.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: x86@kernel.org, Peter Zijlstra <peterz@infradead.org>,
Andy Lutomirski <luto@kernel.org>, Will Deacon <will@kernel.org>,
Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, linux-arch@vger.kernel.org,
Mike Rapoport <rppt@linux.ibm.com>,
Josh Poimboeuf <jpoimboe@redhat.com>,
Miroslav Benes <mbenes@suse.cz>
Subject: [patch V2 11/17] x86/entry: Use generic syscall entry function
Date: Wed, 23 Oct 2019 14:27:16 +0200 [thread overview]
Message-ID: <20191023123118.687475813@linutronix.de> (raw)
In-Reply-To: 20191023122705.198339581@linutronix.de
From: Thomas Gleixner <tglx@linutronix.de>
Replace the syscall entry work handling with the generic version, Provide
the necessary helper inlines to handle the real architecture specific
parts, e.g. audit and seccomp invocations.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/x86/Kconfig | 1
arch/x86/entry/common.c | 108 +++---------------------------------
arch/x86/include/asm/entry-common.h | 59 +++++++++++++++++++
arch/x86/include/asm/thread_info.h | 5 -
4 files changed, 70 insertions(+), 103 deletions(-)
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -111,6 +111,7 @@ config X86
select GENERIC_CPU_AUTOPROBE
select GENERIC_CPU_VULNERABILITIES
select GENERIC_EARLY_IOREMAP
+ select GENERIC_ENTRY
select GENERIC_FIND_FIRST_BIT
select GENERIC_IOMAP
select GENERIC_IRQ_EFFECTIVE_AFF_MASK if SMP
--- a/arch/x86/entry/common.c
+++ b/arch/x86/entry/common.c
@@ -10,13 +10,13 @@
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/sched/task_stack.h>
+#include <linux/entry-common.h>
#include <linux/mm.h>
#include <linux/smp.h>
#include <linux/errno.h>
#include <linux/ptrace.h>
#include <linux/tracehook.h>
#include <linux/audit.h>
-#include <linux/seccomp.h>
#include <linux/signal.h>
#include <linux/export.h>
#include <linux/context_tracking.h>
@@ -34,7 +34,6 @@
#include <asm/fpu/api.h>
#include <asm/nospec-branch.h>
-#define CREATE_TRACE_POINTS
#include <trace/events/syscalls.h>
#ifdef CONFIG_CONTEXT_TRACKING
@@ -48,86 +47,6 @@
static inline void enter_from_user_mode(void) {}
#endif
-static void do_audit_syscall_entry(struct pt_regs *regs, u32 arch)
-{
-#ifdef CONFIG_X86_64
- if (arch == AUDIT_ARCH_X86_64) {
- audit_syscall_entry(regs->orig_ax, regs->di,
- regs->si, regs->dx, regs->r10);
- } else
-#endif
- {
- audit_syscall_entry(regs->orig_ax, regs->bx,
- regs->cx, regs->dx, regs->si);
- }
-}
-
-/*
- * Returns the syscall nr to run (which should match regs->orig_ax) or -1
- * to skip the syscall.
- */
-static long syscall_trace_enter(struct pt_regs *regs)
-{
- u32 arch = in_ia32_syscall() ? AUDIT_ARCH_I386 : AUDIT_ARCH_X86_64;
-
- struct thread_info *ti = current_thread_info();
- unsigned long ret = 0;
- u32 work;
-
- if (IS_ENABLED(CONFIG_DEBUG_ENTRY))
- BUG_ON(regs != task_pt_regs(current));
-
- work = READ_ONCE(ti->flags);
-
- if (work & (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_EMU)) {
- ret = tracehook_report_syscall_entry(regs);
- if (ret || (work & _TIF_SYSCALL_EMU))
- return -1L;
- }
-
-#ifdef CONFIG_SECCOMP
- /*
- * Do seccomp after ptrace, to catch any tracer changes.
- */
- if (work & _TIF_SECCOMP) {
- struct seccomp_data sd;
-
- sd.arch = arch;
- sd.nr = regs->orig_ax;
- sd.instruction_pointer = regs->ip;
-#ifdef CONFIG_X86_64
- if (arch == AUDIT_ARCH_X86_64) {
- sd.args[0] = regs->di;
- sd.args[1] = regs->si;
- sd.args[2] = regs->dx;
- sd.args[3] = regs->r10;
- sd.args[4] = regs->r8;
- sd.args[5] = regs->r9;
- } else
-#endif
- {
- sd.args[0] = regs->bx;
- sd.args[1] = regs->cx;
- sd.args[2] = regs->dx;
- sd.args[3] = regs->si;
- sd.args[4] = regs->di;
- sd.args[5] = regs->bp;
- }
-
- ret = __secure_computing(&sd);
- if (ret == -1)
- return ret;
- }
-#endif
-
- if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
- trace_sys_enter(regs, regs->orig_ax);
-
- do_audit_syscall_entry(regs, arch);
-
- return ret ?: regs->orig_ax;
-}
-
#define EXIT_TO_USERMODE_LOOP_FLAGS \
(_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
_TIF_NEED_RESCHED | _TIF_USER_RETURN_NOTIFY | _TIF_PATCH_PENDING)
@@ -280,16 +199,13 @@ static void syscall_slow_exit_work(struc
#ifdef CONFIG_X86_64
__visible void do_syscall_64(unsigned long nr, struct pt_regs *regs)
{
- struct thread_info *ti;
-
/* User to kernel transition disabled interrupts. */
trace_hardirqs_off();
enter_from_user_mode();
local_irq_enable();
- ti = current_thread_info();
- if (READ_ONCE(ti->flags) & _TIF_WORK_SYSCALL_ENTRY)
- nr = syscall_trace_enter(regs);
+
+ nr = syscall_enter_from_usermode(regs, nr);
if (likely(nr < NR_syscalls)) {
nr = array_index_nospec(nr, NR_syscalls);
@@ -316,22 +232,18 @@ static void syscall_slow_exit_work(struc
*/
static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs)
{
- struct thread_info *ti = current_thread_info();
unsigned int nr = (unsigned int)regs->orig_ax;
#ifdef CONFIG_IA32_EMULATION
- ti->status |= TS_COMPAT;
+ current_thread_info()->status |= TS_COMPAT;
#endif
- if (READ_ONCE(ti->flags) & _TIF_WORK_SYSCALL_ENTRY) {
- /*
- * Subtlety here: if ptrace pokes something larger than
- * 2^32-1 into orig_ax, this truncates it. This may or
- * may not be necessary, but it matches the old asm
- * behavior.
- */
- nr = syscall_trace_enter(regs);
- }
+ /*
+ * Subtlety here: if ptrace pokes something larger than 2^32-1 into
+ * orig_ax, this truncates it. This may or may not be necessary,
+ * but it matches the old asm behavior.
+ */
+ nr = syscall_enter_from_usermode(regs, nr);
if (likely(nr < IA32_NR_syscalls)) {
nr = array_index_nospec(nr, IA32_NR_syscalls);
--- /dev/null
+++ b/arch/x86/include/asm/entry-common.h
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef _ASM_X86_ENTRY_COMMON_H
+#define _ASM_X86_ENTRY_COMMON_H
+
+#include <linux/seccomp.h>
+#include <linux/audit.h>
+
+static inline long arch_syscall_enter_seccomp(struct pt_regs *regs)
+{
+#ifdef CONFIG_SECCOMP
+ u32 arch = in_ia32_syscall() ? AUDIT_ARCH_I386 : AUDIT_ARCH_X86_64;
+ struct seccomp_data sd;
+
+ sd.arch = arch;
+ sd.nr = regs->orig_ax;
+ sd.instruction_pointer = regs->ip;
+
+#ifdef CONFIG_X86_64
+ if (arch == AUDIT_ARCH_X86_64) {
+ sd.args[0] = regs->di;
+ sd.args[1] = regs->si;
+ sd.args[2] = regs->dx;
+ sd.args[3] = regs->r10;
+ sd.args[4] = regs->r8;
+ sd.args[5] = regs->r9;
+ } else
+#endif
+ {
+ sd.args[0] = regs->bx;
+ sd.args[1] = regs->cx;
+ sd.args[2] = regs->dx;
+ sd.args[3] = regs->si;
+ sd.args[4] = regs->di;
+ sd.args[5] = regs->bp;
+ }
+
+ return __secure_computing(&sd);
+#else
+ return 0;
+#endif
+}
+#define arch_syscall_enter_seccomp arch_syscall_enter_seccomp
+
+static inline void arch_syscall_enter_audit(struct pt_regs *regs)
+{
+#ifdef CONFIG_X86_64
+ if (in_ia32_syscall()) {
+ audit_syscall_entry(regs->orig_ax, regs->di,
+ regs->si, regs->dx, regs->r10);
+ } else
+#endif
+ {
+ audit_syscall_entry(regs->orig_ax, regs->bx,
+ regs->cx, regs->dx, regs->si);
+ }
+}
+#define arch_syscall_enter_audit arch_syscall_enter_audit
+
+#endif
--- a/arch/x86/include/asm/thread_info.h
+++ b/arch/x86/include/asm/thread_info.h
@@ -133,11 +133,6 @@ struct thread_info {
#define _TIF_X32 (1 << TIF_X32)
#define _TIF_FSCHECK (1 << TIF_FSCHECK)
-/* Work to do before invoking the actual syscall. */
-#define _TIF_WORK_SYSCALL_ENTRY \
- (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_EMU | _TIF_SYSCALL_AUDIT | \
- _TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT)
-
/* flags to check in __switch_to() */
#define _TIF_WORK_CTXSW_BASE \
(_TIF_IO_BITMAP|_TIF_NOCPUID|_TIF_NOTSC|_TIF_BLOCKSTEP| \
next prev parent reply other threads:[~2019-10-23 12:27 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-23 12:27 [patch V2 00/17] entry: Provide generic implementation for host and guest entry/exit work Thomas Gleixner
2019-10-23 12:27 ` [patch V2 01/17] x86/entry/32: Remove unused resume_userspace label Thomas Gleixner
2019-10-23 13:43 ` Sean Christopherson
2019-11-06 15:26 ` Alexandre Chartre
2019-11-16 12:02 ` [tip: x86/asm] " tip-bot2 for Thomas Gleixner
2019-10-23 12:27 ` [patch V2 02/17] x86/entry/64: Remove pointless jump in paranoid_exit Thomas Gleixner
2019-10-23 13:45 ` Sean Christopherson
2019-11-06 15:29 ` Alexandre Chartre
2019-11-16 12:02 ` [tip: x86/asm] " tip-bot2 for Thomas Gleixner
2019-10-23 12:27 ` [patch V2 03/17] x86/traps: Remove pointless irq enable from do_spurious_interrupt_bug() Thomas Gleixner
2019-10-23 13:52 ` Sean Christopherson
2019-10-23 21:31 ` Josh Poimboeuf
2019-10-23 22:35 ` Thomas Gleixner
2019-10-23 22:49 ` Josh Poimboeuf
2019-10-23 23:18 ` Thomas Gleixner
2019-11-06 15:33 ` Alexandre Chartre
2020-02-27 14:15 ` [tip: x86/entry] " tip-bot2 for Thomas Gleixner
2019-10-23 12:27 ` [patch V2 04/17] x86/entry: Make DEBUG_ENTRY_ASSERT_IRQS_OFF available for 32bit Thomas Gleixner
2019-10-23 14:16 ` Sean Christopherson
2019-11-06 15:50 ` Alexandre Chartre
2019-10-23 12:27 ` [patch V2 05/17] x86/traps: Make interrupt enable/disable symmetric in C code Thomas Gleixner
2019-10-23 14:16 ` Sean Christopherson
2019-10-23 22:01 ` Josh Poimboeuf
2019-10-23 23:23 ` Thomas Gleixner
2019-11-06 16:19 ` Alexandre Chartre
2019-10-23 12:27 ` [patch V2 06/17] x86/entry/32: Remove redundant interrupt disable Thomas Gleixner
2019-10-23 14:17 ` Sean Christopherson
2019-11-08 10:41 ` Alexandre Chartre
2019-10-23 12:27 ` [patch V2 07/17] x86/entry/64: " Thomas Gleixner
2019-10-23 14:20 ` Sean Christopherson
2019-10-23 22:06 ` Josh Poimboeuf
2019-10-23 23:52 ` Thomas Gleixner
2019-10-24 16:18 ` Andy Lutomirski
2019-10-24 20:52 ` Thomas Gleixner
2019-10-24 20:59 ` Thomas Gleixner
2019-10-24 21:21 ` Peter Zijlstra
2019-10-24 21:24 ` Andy Lutomirski
2019-10-24 22:33 ` Thomas Gleixner
2019-11-08 11:07 ` Alexandre Chartre
2019-10-23 12:27 ` [patch V2 08/17] x86/entry: Move syscall irq tracing to C code Thomas Gleixner
2019-10-23 21:30 ` Andy Lutomirski
2019-10-23 21:35 ` Andy Lutomirski
2019-10-23 23:31 ` Thomas Gleixner
2019-10-23 23:16 ` Thomas Gleixner
2019-10-24 16:24 ` Andy Lutomirski
2019-10-24 17:40 ` Peter Zijlstra
2019-10-24 20:54 ` Thomas Gleixner
2019-10-23 12:27 ` [patch V2 09/17] x86/entry: Remove _TIF_NOHZ from _TIF_WORK_SYSCALL_ENTRY Thomas Gleixner
2020-01-06 4:11 ` Frederic Weisbecker
2019-10-23 12:27 ` [patch V2 10/17] entry: Provide generic syscall entry functionality Thomas Gleixner
2019-10-23 12:27 ` Thomas Gleixner [this message]
2019-10-23 12:27 ` [patch V2 12/17] entry: Provide generic syscall exit function Thomas Gleixner
2019-10-23 12:27 ` [patch V2 13/17] x86/entry: Use generic syscall exit functionality Thomas Gleixner
2019-10-23 12:27 ` [patch V2 14/17] entry: Provide generic exit to usermode functionality Thomas Gleixner
2019-10-23 21:34 ` Andy Lutomirski
2019-10-23 23:20 ` Thomas Gleixner
2019-10-23 12:27 ` [patch V2 15/17] x86/entry: Use generic exit to usermode Thomas Gleixner
2019-10-23 12:27 ` [patch V2 16/17] kvm/workpending: Provide infrastructure for work before entering a guest Thomas Gleixner
2019-10-23 14:55 ` Sean Christopherson
2019-10-23 12:27 ` [patch V2 17/17] x86/kvm: Use generic exit to guest work function Thomas Gleixner
2019-10-23 14:48 ` Sean Christopherson
2019-10-23 14:37 ` [patch V2 00/17] entry: Provide generic implementation for host and guest entry/exit work Peter Zijlstra
2019-10-23 21:20 ` Josh Poimboeuf
2019-10-29 11:28 ` Will Deacon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191023123118.687475813@linutronix.de \
--to=tglx@linutronix.de \
--cc=jpoimboe@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mbenes@suse.cz \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=rppt@linux.ibm.com \
--cc=will@kernel.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.