Commit a27a0a55 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

x86/entry: Cleanup idtentry_enter/exit



Remove the temporary defines and fixup all references.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarKees Cook <keescook@chromium.org>
Link: https://lkml.kernel.org/r/20200722220520.855839271@linutronix.de
parent bdcd178a
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -248,9 +248,9 @@ __visible noinstr void xen_pv_evtchn_do_upcall(struct pt_regs *regs)
{
	struct pt_regs *old_regs;
	bool inhcall;
	idtentry_state_t state;
	irqentry_state_t state;

	state = idtentry_enter(regs);
	state = irqentry_enter(regs);
	old_regs = set_irq_regs(regs);

	instrumentation_begin();
@@ -266,7 +266,7 @@ __visible noinstr void xen_pv_evtchn_do_upcall(struct pt_regs *regs)
		instrumentation_end();
		restore_inhcall(inhcall);
	} else {
		idtentry_exit(regs, state);
		irqentry_exit(regs, state);
	}
}
#endif /* CONFIG_XEN_PV */
+14 −19
Original line number Diff line number Diff line
@@ -11,11 +11,6 @@

#include <asm/irq_stack.h>

/* Temporary defines */
typedef irqentry_state_t idtentry_state_t;
#define idtentry_enter irqentry_enter
#define idtentry_exit irqentry_exit

/**
 * DECLARE_IDTENTRY - Declare functions for simple IDT entry points
 *		      No error code pushed by hardware
@@ -45,8 +40,8 @@ typedef irqentry_state_t idtentry_state_t;
 * The macro is written so it acts as function definition. Append the
 * body with a pair of curly brackets.
 *
 * idtentry_enter() contains common code which has to be invoked before
 * arbitrary code in the body. idtentry_exit() contains common code
 * irqentry_enter() contains common code which has to be invoked before
 * arbitrary code in the body. irqentry_exit() contains common code
 * which has to run before returning to the low level assembly code.
 */
#define DEFINE_IDTENTRY(func)						\
@@ -54,12 +49,12 @@ static __always_inline void __##func(struct pt_regs *regs); \
									\
__visible noinstr void func(struct pt_regs *regs)			\
{									\
	idtentry_state_t state = idtentry_enter(regs);			\
	irqentry_state_t state = irqentry_enter(regs);			\
									\
	instrumentation_begin();					\
	__##func (regs);						\
	instrumentation_end();						\
	idtentry_exit(regs, state);					\
	irqentry_exit(regs, state);					\
}									\
									\
static __always_inline void __##func(struct pt_regs *regs)
@@ -101,12 +96,12 @@ static __always_inline void __##func(struct pt_regs *regs, \
__visible noinstr void func(struct pt_regs *regs,			\
			    unsigned long error_code)			\
{									\
	idtentry_state_t state = idtentry_enter(regs);			\
	irqentry_state_t state = irqentry_enter(regs);			\
									\
	instrumentation_begin();					\
	__##func (regs, error_code);					\
	instrumentation_end();						\
	idtentry_exit(regs, state);					\
	irqentry_exit(regs, state);					\
}									\
									\
static __always_inline void __##func(struct pt_regs *regs,		\
@@ -161,7 +156,7 @@ __visible noinstr void func(struct pt_regs *regs)
 * body with a pair of curly brackets.
 *
 * Contrary to DEFINE_IDTENTRY_ERRORCODE() this does not invoke the
 * idtentry_enter/exit() helpers before and after the body invocation. This
 * irqentry_enter/exit() helpers before and after the body invocation. This
 * needs to be done in the body itself if applicable. Use if extra work
 * is required before the enter/exit() helpers are invoked.
 */
@@ -197,7 +192,7 @@ static __always_inline void __##func(struct pt_regs *regs, u8 vector); \
__visible noinstr void func(struct pt_regs *regs,			\
			    unsigned long error_code)			\
{									\
	idtentry_state_t state = idtentry_enter(regs);			\
	irqentry_state_t state = irqentry_enter(regs);			\
									\
	instrumentation_begin();					\
	irq_enter_rcu();						\
@@ -205,7 +200,7 @@ __visible noinstr void func(struct pt_regs *regs, \
	__##func (regs, (u8)error_code);				\
	irq_exit_rcu();							\
	instrumentation_end();						\
	idtentry_exit(regs, state);					\
	irqentry_exit(regs, state);					\
}									\
									\
static __always_inline void __##func(struct pt_regs *regs, u8 vector)
@@ -229,7 +224,7 @@ static __always_inline void __##func(struct pt_regs *regs, u8 vector)
 * DEFINE_IDTENTRY_SYSVEC - Emit code for system vector IDT entry points
 * @func:	Function name of the entry point
 *
 * idtentry_enter/exit() and irq_enter/exit_rcu() are invoked before the
 * irqentry_enter/exit() and irq_enter/exit_rcu() are invoked before the
 * function body. KVM L1D flush request is set.
 *
 * Runs the function on the interrupt stack if the entry hit kernel mode
@@ -239,7 +234,7 @@ static void __##func(struct pt_regs *regs); \
									\
__visible noinstr void func(struct pt_regs *regs)			\
{									\
	idtentry_state_t state = idtentry_enter(regs);			\
	irqentry_state_t state = irqentry_enter(regs);			\
									\
	instrumentation_begin();					\
	irq_enter_rcu();						\
@@ -247,7 +242,7 @@ __visible noinstr void func(struct pt_regs *regs) \
	run_on_irqstack_cond(__##func, regs, regs);			\
	irq_exit_rcu();							\
	instrumentation_end();						\
	idtentry_exit(regs, state);					\
	irqentry_exit(regs, state);					\
}									\
									\
static noinline void __##func(struct pt_regs *regs)
@@ -268,7 +263,7 @@ static __always_inline void __##func(struct pt_regs *regs); \
									\
__visible noinstr void func(struct pt_regs *regs)			\
{									\
	idtentry_state_t state = idtentry_enter(regs);			\
	irqentry_state_t state = irqentry_enter(regs);			\
									\
	instrumentation_begin();					\
	__irq_enter_raw();						\
@@ -276,7 +271,7 @@ __visible noinstr void func(struct pt_regs *regs) \
	__##func (regs);						\
	__irq_exit_raw();						\
	instrumentation_end();						\
	idtentry_exit(regs, state);					\
	irqentry_exit(regs, state);					\
}									\
									\
static __always_inline void __##func(struct pt_regs *regs)
+3 −3
Original line number Diff line number Diff line
@@ -233,7 +233,7 @@ EXPORT_SYMBOL_GPL(kvm_read_and_reset_apf_flags);
noinstr bool __kvm_handle_async_pf(struct pt_regs *regs, u32 token)
{
	u32 reason = kvm_read_and_reset_apf_flags();
	idtentry_state_t state;
	irqentry_state_t state;

	switch (reason) {
	case KVM_PV_REASON_PAGE_NOT_PRESENT:
@@ -243,7 +243,7 @@ noinstr bool __kvm_handle_async_pf(struct pt_regs *regs, u32 token)
		return false;
	}

	state = idtentry_enter(regs);
	state = irqentry_enter(regs);
	instrumentation_begin();

	/*
@@ -264,7 +264,7 @@ noinstr bool __kvm_handle_async_pf(struct pt_regs *regs, u32 token)
	}

	instrumentation_end();
	idtentry_exit(regs, state);
	irqentry_exit(regs, state);
	return true;
}

+3 −3
Original line number Diff line number Diff line
@@ -245,7 +245,7 @@ static noinstr bool handle_bug(struct pt_regs *regs)

DEFINE_IDTENTRY_RAW(exc_invalid_op)
{
	idtentry_state_t state;
	irqentry_state_t state;

	/*
	 * We use UD2 as a short encoding for 'CALL __WARN', as such
@@ -255,11 +255,11 @@ DEFINE_IDTENTRY_RAW(exc_invalid_op)
	if (!user_mode(regs) && handle_bug(regs))
		return;

	state = idtentry_enter(regs);
	state = irqentry_enter(regs);
	instrumentation_begin();
	handle_invalid_op(regs);
	instrumentation_end();
	idtentry_exit(regs, state);
	irqentry_exit(regs, state);
}

DEFINE_IDTENTRY(exc_coproc_segment_overrun)
+3 −3
Original line number Diff line number Diff line
@@ -1377,7 +1377,7 @@ handle_page_fault(struct pt_regs *regs, unsigned long error_code,
DEFINE_IDTENTRY_RAW_ERRORCODE(exc_page_fault)
{
	unsigned long address = read_cr2();
	idtentry_state_t state;
	irqentry_state_t state;

	prefetchw(&current->mm->mmap_lock);

@@ -1412,11 +1412,11 @@ DEFINE_IDTENTRY_RAW_ERRORCODE(exc_page_fault)
	 * code reenabled RCU to avoid subsequent wreckage which helps
	 * debugability.
	 */
	state = idtentry_enter(regs);
	state = irqentry_enter(regs);

	instrumentation_begin();
	handle_page_fault(regs, error_code, address);
	instrumentation_end();

	idtentry_exit(regs, state);
	irqentry_exit(regs, state);
}