Blame view
include/linux/hw_breakpoint.h
4.29 KB
2da3e160c
|
1 2 |
#ifndef _LINUX_HW_BREAKPOINT_H #define _LINUX_HW_BREAKPOINT_H |
b332828c3
|
3 |
|
24f1e32c6
|
4 5 6 7 8 |
enum { HW_BREAKPOINT_LEN_1 = 1, HW_BREAKPOINT_LEN_2 = 2, HW_BREAKPOINT_LEN_4 = 4, HW_BREAKPOINT_LEN_8 = 8, |
b332828c3
|
9 |
}; |
24f1e32c6
|
10 |
enum { |
0102752e4
|
11 12 13 14 15 16 |
HW_BREAKPOINT_EMPTY = 0, HW_BREAKPOINT_R = 1, HW_BREAKPOINT_W = 2, HW_BREAKPOINT_RW = HW_BREAKPOINT_R | HW_BREAKPOINT_W, HW_BREAKPOINT_X = 4, HW_BREAKPOINT_INVALID = HW_BREAKPOINT_RW | HW_BREAKPOINT_X, |
24f1e32c6
|
17 |
}; |
feef47d0c
|
18 19 20 21 22 23 24 25 26 |
enum bp_type_idx { TYPE_INST = 0, #ifdef CONFIG_HAVE_MIXED_BREAKPOINTS_REGS TYPE_DATA = 0, #else TYPE_DATA = 1, #endif TYPE_MAX }; |
5093ebad5
|
27 |
#ifdef __KERNEL__ |
688bcaff2
|
28 |
|
e6db48765
|
29 |
#include <linux/perf_event.h> |
fa7c27ee9
|
30 |
#ifdef CONFIG_HAVE_HW_BREAKPOINT |
3c502e7a0
|
31 |
extern int __init init_hw_breakpoint(void); |
dd1853c3f
|
32 33 |
static inline void hw_breakpoint_init(struct perf_event_attr *attr) { |
ed872d09e
|
34 |
memset(attr, 0, sizeof(*attr)); |
dd1853c3f
|
35 36 |
attr->type = PERF_TYPE_BREAKPOINT; attr->size = sizeof(*attr); |
b326e9560
|
37 38 39 40 |
/* * As it's for in-kernel or ptrace use, we want it to be pinned * and to call its callback every hits. */ |
dd1853c3f
|
41 |
attr->pinned = 1; |
b326e9560
|
42 |
attr->sample_period = 1; |
73266fc1d
|
43 44 45 46 47 48 |
} static inline void ptrace_breakpoint_init(struct perf_event_attr *attr) { hw_breakpoint_init(attr); attr->exclude_kernel = 1; |
dd1853c3f
|
49 |
} |
24f1e32c6
|
50 51 52 53 54 55 56 57 58 |
static inline unsigned long hw_breakpoint_addr(struct perf_event *bp) { return bp->attr.bp_addr; } static inline int hw_breakpoint_type(struct perf_event *bp) { return bp->attr.bp_type; } |
cd757645f
|
59 |
static inline unsigned long hw_breakpoint_len(struct perf_event *bp) |
24f1e32c6
|
60 61 62 |
{ return bp->attr.bp_len; } |
24f1e32c6
|
63 |
extern struct perf_event * |
5fa10b28e
|
64 |
register_user_hw_breakpoint(struct perf_event_attr *attr, |
b326e9560
|
65 |
perf_overflow_handler_t triggered, |
4dc0da869
|
66 |
void *context, |
5fa10b28e
|
67 |
struct task_struct *tsk); |
24f1e32c6
|
68 69 |
/* FIXME: only change from the attr, and don't unregister */ |
44234adcd
|
70 |
extern int |
2f0993e0f
|
71 |
modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *attr); |
b332828c3
|
72 |
|
b332828c3
|
73 74 75 |
/* * Kernel breakpoints are not associated with any particular thread. */ |
24f1e32c6
|
76 |
extern struct perf_event * |
dd1853c3f
|
77 |
register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr, |
b326e9560
|
78 |
perf_overflow_handler_t triggered, |
4dc0da869
|
79 |
void *context, |
dd1853c3f
|
80 |
int cpu); |
24f1e32c6
|
81 |
|
44ee63587
|
82 |
extern struct perf_event * __percpu * |
dd1853c3f
|
83 |
register_wide_hw_breakpoint(struct perf_event_attr *attr, |
4dc0da869
|
84 85 |
perf_overflow_handler_t triggered, void *context); |
24f1e32c6
|
86 87 88 89 |
extern int register_perf_hw_breakpoint(struct perf_event *bp); extern int __register_perf_hw_breakpoint(struct perf_event *bp); extern void unregister_hw_breakpoint(struct perf_event *bp); |
44ee63587
|
90 |
extern void unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events); |
24f1e32c6
|
91 |
|
5352ae638
|
92 93 |
extern int dbg_reserve_bp_slot(struct perf_event *bp); extern int dbg_release_bp_slot(struct perf_event *bp); |
24f1e32c6
|
94 95 96 97 |
extern int reserve_bp_slot(struct perf_event *bp); extern void release_bp_slot(struct perf_event *bp); extern void flush_ptrace_hw_breakpoint(struct task_struct *tsk); |
687b16fb6
|
98 99 100 101 |
static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp) { return &bp->hw.info; } |
24f1e32c6
|
102 |
#else /* !CONFIG_HAVE_HW_BREAKPOINT */ |
3c502e7a0
|
103 |
static inline int __init init_hw_breakpoint(void) { return 0; } |
24f1e32c6
|
104 |
static inline struct perf_event * |
5fa10b28e
|
105 |
register_user_hw_breakpoint(struct perf_event_attr *attr, |
b326e9560
|
106 |
perf_overflow_handler_t triggered, |
4dc0da869
|
107 |
void *context, |
5fa10b28e
|
108 |
struct task_struct *tsk) { return NULL; } |
44234adcd
|
109 |
static inline int |
24f1e32c6
|
110 |
modify_user_hw_breakpoint(struct perf_event *bp, |
99ac64c82
|
111 |
struct perf_event_attr *attr) { return -ENOSYS; } |
24f1e32c6
|
112 |
static inline struct perf_event * |
dd1853c3f
|
113 |
register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr, |
b326e9560
|
114 |
perf_overflow_handler_t triggered, |
4dc0da869
|
115 |
void *context, |
dd1853c3f
|
116 |
int cpu) { return NULL; } |
44ee63587
|
117 |
static inline struct perf_event * __percpu * |
dd1853c3f
|
118 |
register_wide_hw_breakpoint(struct perf_event_attr *attr, |
4dc0da869
|
119 120 |
perf_overflow_handler_t triggered, void *context) { return NULL; } |
24f1e32c6
|
121 122 123 124 125 126 |
static inline int register_perf_hw_breakpoint(struct perf_event *bp) { return -ENOSYS; } static inline int __register_perf_hw_breakpoint(struct perf_event *bp) { return -ENOSYS; } static inline void unregister_hw_breakpoint(struct perf_event *bp) { } static inline void |
44ee63587
|
127 |
unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events) { } |
24f1e32c6
|
128 129 130 131 132 |
static inline int reserve_bp_slot(struct perf_event *bp) {return -ENOSYS; } static inline void release_bp_slot(struct perf_event *bp) { } static inline void flush_ptrace_hw_breakpoint(struct task_struct *tsk) { } |
b332828c3
|
133 |
|
687b16fb6
|
134 135 136 137 |
static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp) { return NULL; } |
24f1e32c6
|
138 |
#endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
5093ebad5
|
139 |
#endif /* __KERNEL__ */ |
b332828c3
|
140 |
|
24f1e32c6
|
141 |
#endif /* _LINUX_HW_BREAKPOINT_H */ |