hw-breakpoints: Rewrite the hw-breakpoints layer on top of perf events
[safe/jmp/linux-2.6] / include / linux / hw_breakpoint.h
1 #ifndef _LINUX_HW_BREAKPOINT_H
2 #define _LINUX_HW_BREAKPOINT_H
3
4 #include <linux/perf_event.h>
5
6 enum {
7         HW_BREAKPOINT_LEN_1 = 1,
8         HW_BREAKPOINT_LEN_2 = 2,
9         HW_BREAKPOINT_LEN_4 = 4,
10         HW_BREAKPOINT_LEN_8 = 8,
11 };
12
13 enum {
14         HW_BREAKPOINT_R = 1,
15         HW_BREAKPOINT_W = 2,
16         HW_BREAKPOINT_X = 4,
17 };
18
19 static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp)
20 {
21         return &bp->hw.info;
22 }
23
24 static inline unsigned long hw_breakpoint_addr(struct perf_event *bp)
25 {
26         return bp->attr.bp_addr;
27 }
28
29 static inline int hw_breakpoint_type(struct perf_event *bp)
30 {
31         return bp->attr.bp_type;
32 }
33
34 static inline int hw_breakpoint_len(struct perf_event *bp)
35 {
36         return bp->attr.bp_len;
37 }
38
39 #ifdef CONFIG_HAVE_HW_BREAKPOINT
40 extern struct perf_event *
41 register_user_hw_breakpoint(unsigned long addr,
42                             int len,
43                             int type,
44                             perf_callback_t triggered,
45                             struct task_struct *tsk,
46                             bool active);
47
48 /* FIXME: only change from the attr, and don't unregister */
49 extern struct perf_event *
50 modify_user_hw_breakpoint(struct perf_event *bp,
51                           unsigned long addr,
52                           int len,
53                           int type,
54                           perf_callback_t triggered,
55                           struct task_struct *tsk,
56                           bool active);
57
58 /*
59  * Kernel breakpoints are not associated with any particular thread.
60  */
61 extern struct perf_event *
62 register_wide_hw_breakpoint_cpu(unsigned long addr,
63                                 int len,
64                                 int type,
65                                 perf_callback_t triggered,
66                                 int cpu,
67                                 bool active);
68
69 extern struct perf_event **
70 register_wide_hw_breakpoint(unsigned long addr,
71                             int len,
72                             int type,
73                             perf_callback_t triggered,
74                             bool active);
75
76 extern int register_perf_hw_breakpoint(struct perf_event *bp);
77 extern int __register_perf_hw_breakpoint(struct perf_event *bp);
78 extern void unregister_hw_breakpoint(struct perf_event *bp);
79 extern void unregister_wide_hw_breakpoint(struct perf_event **cpu_events);
80
81 extern int reserve_bp_slot(struct perf_event *bp);
82 extern void release_bp_slot(struct perf_event *bp);
83
84 extern void flush_ptrace_hw_breakpoint(struct task_struct *tsk);
85
86 #else /* !CONFIG_HAVE_HW_BREAKPOINT */
87
88 static inline struct perf_event *
89 register_user_hw_breakpoint(unsigned long addr,
90                             int len,
91                             int type,
92                             perf_callback_t triggered,
93                             struct task_struct *tsk,
94                             bool active)                { return NULL; }
95 static inline struct perf_event *
96 modify_user_hw_breakpoint(struct perf_event *bp,
97                           unsigned long addr,
98                           int len,
99                           int type,
100                           perf_callback_t triggered,
101                           struct task_struct *tsk,
102                           bool active)                  { return NULL; }
103 static inline struct perf_event *
104 register_wide_hw_breakpoint_cpu(unsigned long addr,
105                                 int len,
106                                 int type,
107                                 perf_callback_t triggered,
108                                 int cpu,
109                                 bool active)            { return NULL; }
110 static inline struct perf_event **
111 register_wide_hw_breakpoint(unsigned long addr,
112                             int len,
113                             int type,
114                             perf_callback_t triggered,
115                             bool active)                { return NULL; }
116 static inline int
117 register_perf_hw_breakpoint(struct perf_event *bp)      { return -ENOSYS; }
118 static inline int
119 __register_perf_hw_breakpoint(struct perf_event *bp)    { return -ENOSYS; }
120 static inline void unregister_hw_breakpoint(struct perf_event *bp)      { }
121 static inline void
122 unregister_wide_hw_breakpoint(struct perf_event **cpu_events)           { }
123 static inline int
124 reserve_bp_slot(struct perf_event *bp)                  {return -ENOSYS; }
125 static inline void release_bp_slot(struct perf_event *bp)               { }
126
127 static inline void flush_ptrace_hw_breakpoint(struct task_struct *tsk)  { }
128
129 #endif /* CONFIG_HAVE_HW_BREAKPOINT */
130
131 #endif /* _LINUX_HW_BREAKPOINT_H */