1 #ifndef _LINUX_HW_BREAKPOINT_H
2 #define _LINUX_HW_BREAKPOINT_H
5 HW_BREAKPOINT_LEN_1 = 1,
6 HW_BREAKPOINT_LEN_2 = 2,
7 HW_BREAKPOINT_LEN_4 = 4,
8 HW_BREAKPOINT_LEN_8 = 8,
19 #include <linux/perf_event.h>
21 #ifdef CONFIG_HAVE_HW_BREAKPOINT
23 static inline void hw_breakpoint_init(struct perf_event_attr *attr)
25 attr->type = PERF_TYPE_BREAKPOINT;
26 attr->size = sizeof(*attr);
28 * As it's for in-kernel or ptrace use, we want it to be pinned
29 * and to call its callback every hits.
32 attr->sample_period = 1;
35 static inline unsigned long hw_breakpoint_addr(struct perf_event *bp)
37 return bp->attr.bp_addr;
40 static inline int hw_breakpoint_type(struct perf_event *bp)
42 return bp->attr.bp_type;
45 static inline int hw_breakpoint_len(struct perf_event *bp)
47 return bp->attr.bp_len;
50 extern struct perf_event *
51 register_user_hw_breakpoint(struct perf_event_attr *attr,
52 perf_overflow_handler_t triggered,
53 struct task_struct *tsk);
55 /* FIXME: only change from the attr, and don't unregister */
56 extern struct perf_event *
57 modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *attr);
60 * Kernel breakpoints are not associated with any particular thread.
62 extern struct perf_event *
63 register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr,
64 perf_overflow_handler_t triggered,
67 extern struct perf_event **
68 register_wide_hw_breakpoint(struct perf_event_attr *attr,
69 perf_overflow_handler_t triggered);
71 extern int register_perf_hw_breakpoint(struct perf_event *bp);
72 extern int __register_perf_hw_breakpoint(struct perf_event *bp);
73 extern void unregister_hw_breakpoint(struct perf_event *bp);
74 extern void unregister_wide_hw_breakpoint(struct perf_event **cpu_events);
76 extern int reserve_bp_slot(struct perf_event *bp);
77 extern void release_bp_slot(struct perf_event *bp);
79 extern void flush_ptrace_hw_breakpoint(struct task_struct *tsk);
81 static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp)
86 #else /* !CONFIG_HAVE_HW_BREAKPOINT */
88 static inline struct perf_event *
89 register_user_hw_breakpoint(struct perf_event_attr *attr,
90 perf_overflow_handler_t triggered,
91 struct task_struct *tsk) { return NULL; }
92 static inline struct perf_event *
93 modify_user_hw_breakpoint(struct perf_event *bp,
94 struct perf_event_attr *attr) { return NULL; }
95 static inline struct perf_event *
96 register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr,
97 perf_overflow_handler_t triggered,
98 int cpu) { return NULL; }
99 static inline struct perf_event **
100 register_wide_hw_breakpoint(struct perf_event_attr *attr,
101 perf_overflow_handler_t triggered) { return NULL; }
103 register_perf_hw_breakpoint(struct perf_event *bp) { return -ENOSYS; }
105 __register_perf_hw_breakpoint(struct perf_event *bp) { return -ENOSYS; }
106 static inline void unregister_hw_breakpoint(struct perf_event *bp) { }
108 unregister_wide_hw_breakpoint(struct perf_event **cpu_events) { }
110 reserve_bp_slot(struct perf_event *bp) {return -ENOSYS; }
111 static inline void release_bp_slot(struct perf_event *bp) { }
113 static inline void flush_ptrace_hw_breakpoint(struct task_struct *tsk) { }
115 static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp)
120 #endif /* CONFIG_HAVE_HW_BREAKPOINT */
121 #endif /* __KERNEL__ */
123 #endif /* _LINUX_HW_BREAKPOINT_H */