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