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