Commit 9f9781b6 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

x86/entry: Provide idtentry_enter/exit_user()



As there are exceptions which already handle entry from user mode and from
kernel mode separately, providing explicit user entry/exit handling callbacks
makes sense and makes the code easier to understand.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Acked-by: default avatarAndy Lutomirski <luto@kernel.org>
Link: https://lore.kernel.org/r/20200521202117.289548561@linutronix.de
parent 3eeec385
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -658,3 +658,34 @@ void noinstr idtentry_exit_cond_rcu(struct pt_regs *regs, bool rcu_exit)
			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);
}
+3 −0
Original line number Diff line number Diff line
@@ -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);