mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
entry_Add_enter_from_user_mode_wrapper
To be called from architecture specific code if the combo interfaces are not suitable. It simply calls __enter_from_user_mode(). This way __enter_from_user_mode will still be inlined because it is declared static __always_inline. [ tglx: Amend comments and move it to a different location in the header ] Signed-off-by: Sven Schnelle <svens@linux.ibm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20201201142755.31931-4-svens@linux.ibm.com
This commit is contained in:
parent
bb793562f0
commit
96e2fbccd0
@ -101,6 +101,27 @@ static inline __must_check int arch_syscall_enter_tracehook(struct pt_regs *regs
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enter_from_user_mode - Establish state when coming from user mode
|
||||||
|
*
|
||||||
|
* Syscall/interrupt entry disables interrupts, but user mode is traced as
|
||||||
|
* interrupts enabled. Also with NO_HZ_FULL RCU might be idle.
|
||||||
|
*
|
||||||
|
* 1) Tell lockdep that interrupts are disabled
|
||||||
|
* 2) Invoke context tracking if enabled to reactivate RCU
|
||||||
|
* 3) Trace interrupts off state
|
||||||
|
*
|
||||||
|
* Invoked from architecture specific syscall entry code with interrupts
|
||||||
|
* disabled. The calling code has to be non-instrumentable. When the
|
||||||
|
* function returns all state is correct and interrupts are still
|
||||||
|
* disabled. The subsequent functions can be instrumented.
|
||||||
|
*
|
||||||
|
* This is invoked when there is architecture specific functionality to be
|
||||||
|
* done between establishing state and enabling interrupts. The caller must
|
||||||
|
* enable interrupts before invoking syscall_enter_from_user_mode_work().
|
||||||
|
*/
|
||||||
|
void enter_from_user_mode(struct pt_regs *regs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* syscall_enter_from_user_mode_prepare - Establish state and enable interrupts
|
* syscall_enter_from_user_mode_prepare - Establish state and enable interrupts
|
||||||
* @regs: Pointer to currents pt_regs
|
* @regs: Pointer to currents pt_regs
|
||||||
@ -110,7 +131,8 @@ static inline __must_check int arch_syscall_enter_tracehook(struct pt_regs *regs
|
|||||||
* function returns all state is correct, interrupts are enabled and the
|
* function returns all state is correct, interrupts are enabled and the
|
||||||
* subsequent functions can be instrumented.
|
* subsequent functions can be instrumented.
|
||||||
*
|
*
|
||||||
* This handles lockdep, RCU (context tracking) and tracing state.
|
* This handles lockdep, RCU (context tracking) and tracing state, i.e.
|
||||||
|
* the functionality provided by enter_from_user_mode().
|
||||||
*
|
*
|
||||||
* This is invoked when there is extra architecture specific functionality
|
* This is invoked when there is extra architecture specific functionality
|
||||||
* to be done between establishing state and handling user mode entry work.
|
* to be done between establishing state and handling user mode entry work.
|
||||||
|
@ -10,16 +10,7 @@
|
|||||||
#define CREATE_TRACE_POINTS
|
#define CREATE_TRACE_POINTS
|
||||||
#include <trace/events/syscalls.h>
|
#include <trace/events/syscalls.h>
|
||||||
|
|
||||||
/**
|
/* See comment for enter_from_user_mode() in entry-common.h */
|
||||||
* __enter_from_user_mode - Establish state when coming from user mode
|
|
||||||
*
|
|
||||||
* Syscall/interrupt entry disables interrupts, but user mode is traced as
|
|
||||||
* interrupts enabled. Also with NO_HZ_FULL RCU might be idle.
|
|
||||||
*
|
|
||||||
* 1) Tell lockdep that interrupts are disabled
|
|
||||||
* 2) Invoke context tracking if enabled to reactivate RCU
|
|
||||||
* 3) Trace interrupts off state
|
|
||||||
*/
|
|
||||||
static __always_inline void __enter_from_user_mode(struct pt_regs *regs)
|
static __always_inline void __enter_from_user_mode(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
arch_check_user_regs(regs);
|
arch_check_user_regs(regs);
|
||||||
@ -33,6 +24,11 @@ static __always_inline void __enter_from_user_mode(struct pt_regs *regs)
|
|||||||
instrumentation_end();
|
instrumentation_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void noinstr enter_from_user_mode(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
__enter_from_user_mode(regs);
|
||||||
|
}
|
||||||
|
|
||||||
static inline void syscall_enter_audit(struct pt_regs *regs, long syscall)
|
static inline void syscall_enter_audit(struct pt_regs *regs, long syscall)
|
||||||
{
|
{
|
||||||
if (unlikely(audit_context())) {
|
if (unlikely(audit_context())) {
|
||||||
|
Loading…
Reference in New Issue
Block a user