aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/context_tracking.h
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2013-02-23 18:23:25 -0500
committerFrederic Weisbecker <fweisbec@gmail.com>2013-03-07 11:09:25 -0500
commit56dd9470d7c8734f055da2a6bac553caf4a468eb (patch)
tree5a7dc1ee23be1e15171c301516d20db90eee9435 /include/linux/context_tracking.h
parent6dbe51c251a327e012439c4772097a13df43c5b8 (diff)
context_tracking: Move exception handling to generic code
Exceptions handling on context tracking should share common treatment: on entry we exit user mode if the exception triggered in that context. Then on exception exit we return to that previous context. Generalize this to avoid duplication across archs. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Li Zhong <zhong@linux.vnet.ibm.com> Cc: Kevin Hilman <khilman@linaro.org> Cc: Mats Liljegren <mats.liljegren@enea.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Namhyung Kim <namhyung.kim@lge.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'include/linux/context_tracking.h')
-rw-r--r--include/linux/context_tracking.h17
1 files changed, 16 insertions, 1 deletions
diff --git a/include/linux/context_tracking.h b/include/linux/context_tracking.h
index b28d161c1091..5a69273e93e6 100644
--- a/include/linux/context_tracking.h
+++ b/include/linux/context_tracking.h
@@ -1,10 +1,11 @@
1#ifndef _LINUX_CONTEXT_TRACKING_H 1#ifndef _LINUX_CONTEXT_TRACKING_H
2#define _LINUX_CONTEXT_TRACKING_H 2#define _LINUX_CONTEXT_TRACKING_H
3 3
4#ifdef CONFIG_CONTEXT_TRACKING
5#include <linux/sched.h> 4#include <linux/sched.h>
6#include <linux/percpu.h> 5#include <linux/percpu.h>
6#include <asm/ptrace.h>
7 7
8#ifdef CONFIG_CONTEXT_TRACKING
8struct context_tracking { 9struct context_tracking {
9 /* 10 /*
10 * When active is false, probes are unset in order 11 * When active is false, probes are unset in order
@@ -33,12 +34,26 @@ static inline bool context_tracking_active(void)
33 34
34extern void user_enter(void); 35extern void user_enter(void);
35extern void user_exit(void); 36extern void user_exit(void);
37
38static inline void exception_enter(struct pt_regs *regs)
39{
40 user_exit();
41}
42
43static inline void exception_exit(struct pt_regs *regs)
44{
45 if (user_mode(regs))
46 user_enter();
47}
48
36extern void context_tracking_task_switch(struct task_struct *prev, 49extern void context_tracking_task_switch(struct task_struct *prev,
37 struct task_struct *next); 50 struct task_struct *next);
38#else 51#else
39static inline bool context_tracking_in_user(void) { return false; } 52static inline bool context_tracking_in_user(void) { return false; }
40static inline void user_enter(void) { } 53static inline void user_enter(void) { }
41static inline void user_exit(void) { } 54static inline void user_exit(void) { }
55static inline void exception_enter(struct pt_regs *regs) { }
56static inline void exception_exit(struct pt_regs *regs) { }
42static inline void context_tracking_task_switch(struct task_struct *prev, 57static inline void context_tracking_task_switch(struct task_struct *prev,
43 struct task_struct *next) { } 58 struct task_struct *next) { }
44#endif /* !CONFIG_CONTEXT_TRACKING */ 59#endif /* !CONFIG_CONTEXT_TRACKING */