diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2013-02-23 18:23:25 -0500 |
---|---|---|
committer | Frederic Weisbecker <fweisbec@gmail.com> | 2013-03-07 11:09:25 -0500 |
commit | 56dd9470d7c8734f055da2a6bac553caf4a468eb (patch) | |
tree | 5a7dc1ee23be1e15171c301516d20db90eee9435 /include/linux/context_tracking.h | |
parent | 6dbe51c251a327e012439c4772097a13df43c5b8 (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.h | 17 |
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 | ||
8 | struct context_tracking { | 9 | struct 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 | ||
34 | extern void user_enter(void); | 35 | extern void user_enter(void); |
35 | extern void user_exit(void); | 36 | extern void user_exit(void); |
37 | |||
38 | static inline void exception_enter(struct pt_regs *regs) | ||
39 | { | ||
40 | user_exit(); | ||
41 | } | ||
42 | |||
43 | static inline void exception_exit(struct pt_regs *regs) | ||
44 | { | ||
45 | if (user_mode(regs)) | ||
46 | user_enter(); | ||
47 | } | ||
48 | |||
36 | extern void context_tracking_task_switch(struct task_struct *prev, | 49 | extern void context_tracking_task_switch(struct task_struct *prev, |
37 | struct task_struct *next); | 50 | struct task_struct *next); |
38 | #else | 51 | #else |
39 | static inline bool context_tracking_in_user(void) { return false; } | 52 | static inline bool context_tracking_in_user(void) { return false; } |
40 | static inline void user_enter(void) { } | 53 | static inline void user_enter(void) { } |
41 | static inline void user_exit(void) { } | 54 | static inline void user_exit(void) { } |
55 | static inline void exception_enter(struct pt_regs *regs) { } | ||
56 | static inline void exception_exit(struct pt_regs *regs) { } | ||
42 | static inline void context_tracking_task_switch(struct task_struct *prev, | 57 | static 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 */ |