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