diff options
Diffstat (limited to 'include/linux/context_tracking.h')
| -rw-r--r-- | include/linux/context_tracking.h | 24 | 
1 files changed, 22 insertions, 2 deletions
diff --git a/include/linux/context_tracking.h b/include/linux/context_tracking.h index b28d161c109..365f4a61bf0 100644 --- a/include/linux/context_tracking.h +++ b/include/linux/context_tracking.h @@ -1,9 +1,9 @@  #ifndef _LINUX_CONTEXT_TRACKING_H  #define _LINUX_CONTEXT_TRACKING_H -#ifdef CONFIG_CONTEXT_TRACKING  #include <linux/sched.h>  #include <linux/percpu.h> +#include <asm/ptrace.h>  struct context_tracking {  	/* @@ -13,12 +13,13 @@ struct context_tracking {  	 * may be further optimized using static keys.  	 */  	bool active; -	enum { +	enum ctx_state {  		IN_KERNEL = 0,  		IN_USER,  	} state;  }; +#ifdef CONFIG_CONTEXT_TRACKING  DECLARE_PER_CPU(struct context_tracking, context_tracking);  static inline bool context_tracking_in_user(void) @@ -33,12 +34,31 @@ static inline bool context_tracking_active(void)  extern void user_enter(void);  extern void user_exit(void); + +static inline enum ctx_state exception_enter(void) +{ +	enum ctx_state prev_ctx; + +	prev_ctx = this_cpu_read(context_tracking.state); +	user_exit(); + +	return prev_ctx; +} + +static inline void exception_exit(enum ctx_state prev_ctx) +{ +	if (prev_ctx == IN_USER) +		user_enter(); +} +  extern void context_tracking_task_switch(struct task_struct *prev,  					 struct task_struct *next);  #else  static inline bool context_tracking_in_user(void) { return false; }  static inline void user_enter(void) { }  static inline void user_exit(void) { } +static inline enum ctx_state exception_enter(void) { return 0; } +static inline void exception_exit(enum ctx_state prev_ctx) { }  static inline void context_tracking_task_switch(struct task_struct *prev,  						struct task_struct *next) { }  #endif /* !CONFIG_CONTEXT_TRACKING */  |