Blame view
include/linux/hw_breakpoint.h
3.81 KB
2da3e160c
|
1 2 |
#ifndef _LINUX_HW_BREAKPOINT_H #define _LINUX_HW_BREAKPOINT_H |
b332828c3
|
3 |
|
e6db48765
|
4 |
#include <linux/perf_event.h> |
d2709c7ce
|
5 |
#include <uapi/linux/hw_breakpoint.h> |
e6db48765
|
6 |
|
fa7c27ee9
|
7 |
#ifdef CONFIG_HAVE_HW_BREAKPOINT |
3c502e7a0
|
8 |
extern int __init init_hw_breakpoint(void); |
dd1853c3f
|
9 10 |
static inline void hw_breakpoint_init(struct perf_event_attr *attr) { |
ed872d09e
|
11 |
memset(attr, 0, sizeof(*attr)); |
dd1853c3f
|
12 13 |
attr->type = PERF_TYPE_BREAKPOINT; attr->size = sizeof(*attr); |
b326e9560
|
14 15 16 17 |
/* * As it's for in-kernel or ptrace use, we want it to be pinned * and to call its callback every hits. */ |
dd1853c3f
|
18 |
attr->pinned = 1; |
b326e9560
|
19 |
attr->sample_period = 1; |
73266fc1d
|
20 21 22 23 24 25 |
} static inline void ptrace_breakpoint_init(struct perf_event_attr *attr) { hw_breakpoint_init(attr); attr->exclude_kernel = 1; |
dd1853c3f
|
26 |
} |
24f1e32c6
|
27 28 29 30 31 32 33 34 35 |
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
|
36 |
static inline unsigned long hw_breakpoint_len(struct perf_event *bp) |
24f1e32c6
|
37 38 39 |
{ return bp->attr.bp_len; } |
24f1e32c6
|
40 |
extern struct perf_event * |
5fa10b28e
|
41 |
register_user_hw_breakpoint(struct perf_event_attr *attr, |
b326e9560
|
42 |
perf_overflow_handler_t triggered, |
4dc0da869
|
43 |
void *context, |
5fa10b28e
|
44 |
struct task_struct *tsk); |
24f1e32c6
|
45 46 |
/* FIXME: only change from the attr, and don't unregister */ |
44234adcd
|
47 |
extern int |
2f0993e0f
|
48 |
modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *attr); |
b332828c3
|
49 |
|
b332828c3
|
50 51 52 |
/* * Kernel breakpoints are not associated with any particular thread. */ |
24f1e32c6
|
53 |
extern struct perf_event * |
dd1853c3f
|
54 |
register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr, |
b326e9560
|
55 |
perf_overflow_handler_t triggered, |
4dc0da869
|
56 |
void *context, |
dd1853c3f
|
57 |
int cpu); |
24f1e32c6
|
58 |
|
44ee63587
|
59 |
extern struct perf_event * __percpu * |
dd1853c3f
|
60 |
register_wide_hw_breakpoint(struct perf_event_attr *attr, |
4dc0da869
|
61 62 |
perf_overflow_handler_t triggered, void *context); |
24f1e32c6
|
63 64 65 66 |
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
|
67 |
extern void unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events); |
24f1e32c6
|
68 |
|
5352ae638
|
69 70 |
extern int dbg_reserve_bp_slot(struct perf_event *bp); extern int dbg_release_bp_slot(struct perf_event *bp); |
24f1e32c6
|
71 72 73 74 |
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
|
75 76 77 78 |
static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp) { return &bp->hw.info; } |
24f1e32c6
|
79 |
#else /* !CONFIG_HAVE_HW_BREAKPOINT */ |
3c502e7a0
|
80 |
static inline int __init init_hw_breakpoint(void) { return 0; } |
24f1e32c6
|
81 |
static inline struct perf_event * |
5fa10b28e
|
82 |
register_user_hw_breakpoint(struct perf_event_attr *attr, |
b326e9560
|
83 |
perf_overflow_handler_t triggered, |
4dc0da869
|
84 |
void *context, |
5fa10b28e
|
85 |
struct task_struct *tsk) { return NULL; } |
44234adcd
|
86 |
static inline int |
24f1e32c6
|
87 |
modify_user_hw_breakpoint(struct perf_event *bp, |
99ac64c82
|
88 |
struct perf_event_attr *attr) { return -ENOSYS; } |
24f1e32c6
|
89 |
static inline struct perf_event * |
dd1853c3f
|
90 |
register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr, |
b326e9560
|
91 |
perf_overflow_handler_t triggered, |
4dc0da869
|
92 |
void *context, |
dd1853c3f
|
93 |
int cpu) { return NULL; } |
44ee63587
|
94 |
static inline struct perf_event * __percpu * |
dd1853c3f
|
95 |
register_wide_hw_breakpoint(struct perf_event_attr *attr, |
4dc0da869
|
96 97 |
perf_overflow_handler_t triggered, void *context) { return NULL; } |
24f1e32c6
|
98 99 100 101 102 103 |
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
|
104 |
unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events) { } |
24f1e32c6
|
105 106 107 108 109 |
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
|
110 |
|
687b16fb6
|
111 112 113 114 |
static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp) { return NULL; } |
24f1e32c6
|
115 |
#endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
24f1e32c6
|
116 |
#endif /* _LINUX_HW_BREAKPOINT_H */ |