[patch V9 05/39] x86/entry: Provide idtentry_enter/exit_user()

From: Thomas Gleixner
Date: Thu May 21 2020 - 16:33:59 EST


As there are exceptions which already handle entry from user mode and from
kernel mode separately having an explicit user handling makes sense and
makes the code easier to understand.

Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
---
V9: New patch
---
arch/x86/entry/common.c | 31 +++++++++++++++++++++++++++++++
arch/x86/include/asm/idtentry.h | 3 +++
2 files changed, 34 insertions(+)

--- a/arch/x86/entry/common.c
+++ b/arch/x86/entry/common.c
@@ -655,3 +655,34 @@ void noinstr idtentry_exit_cond_rcu(stru
rcu_irq_exit();
}
}
+
+/**
+ * idtentry_enter_user - Handle state tracking on idtentry from user mode
+ * @regs: Pointer to pt_regs of interrupted context
+ *
+ * Invokes enter_from_user_mode() to establish the proper context for
+ * NOHZ_FULL. Otherwise scheduling on exit would not be possible.
+ */
+void noinstr idtentry_enter_user(struct pt_regs *regs)
+{
+ enter_from_user_mode();
+}
+
+/**
+ * idtentry_exit_user - Handle return from exception to user mode
+ * @regs: Pointer to pt_regs (exception entry regs)
+ *
+ * Runs the necessary preemption and work checks and returns to the caller
+ * with interrupts disabled and no further work pending.
+ *
+ * This is the last action before returning to the low level ASM code which
+ * just needs to return to the appropriate context.
+ *
+ * Counterpart to idtentry_enter_user().
+ */
+void noinstr idtentry_exit_user(struct pt_regs *regs)
+{
+ lockdep_assert_irqs_disabled();
+
+ prepare_exit_to_usermode(regs);
+}
--- a/arch/x86/include/asm/idtentry.h
+++ b/arch/x86/include/asm/idtentry.h
@@ -7,6 +7,9 @@

#ifndef __ASSEMBLY__

+void idtentry_enter_user(struct pt_regs *regs);
+void idtentry_exit_user(struct pt_regs *regs);
+
bool idtentry_enter_cond_rcu(struct pt_regs *regs, bool cond_rcu);
void idtentry_exit_cond_rcu(struct pt_regs *regs, bool rcu_exit);