hw_breakpoint.h 3.8 KB

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