|
@@ -1,10 +1,11 @@
|
|
|
#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>
|
|
|
|
|
|
+#ifdef CONFIG_CONTEXT_TRACKING
|
|
|
struct context_tracking {
|
|
|
/*
|
|
|
* When active is false, probes are unset in order
|
|
@@ -33,12 +34,26 @@ static inline bool context_tracking_active(void)
|
|
|
|
|
|
extern void user_enter(void);
|
|
|
extern void user_exit(void);
|
|
|
+
|
|
|
+static inline void exception_enter(struct pt_regs *regs)
|
|
|
+{
|
|
|
+ user_exit();
|
|
|
+}
|
|
|
+
|
|
|
+static inline void exception_exit(struct pt_regs *regs)
|
|
|
+{
|
|
|
+ if (user_mode(regs))
|
|
|
+ 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 void exception_enter(struct pt_regs *regs) { }
|
|
|
+static inline void exception_exit(struct pt_regs *regs) { }
|
|
|
static inline void context_tracking_task_switch(struct task_struct *prev,
|
|
|
struct task_struct *next) { }
|
|
|
#endif /* !CONFIG_CONTEXT_TRACKING */
|