hw_breakpoint.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #ifndef _LINUX_HW_BREAKPOINT_H
  2. #define _LINUX_HW_BREAKPOINT_H
  3. #include <linux/perf_event.h>
  4. enum {
  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. enum {
  11. HW_BREAKPOINT_R = 1,
  12. HW_BREAKPOINT_W = 2,
  13. HW_BREAKPOINT_X = 4,
  14. };
  15. #ifdef CONFIG_HAVE_HW_BREAKPOINT
  16. static inline unsigned long hw_breakpoint_addr(struct perf_event *bp)
  17. {
  18. return bp->attr.bp_addr;
  19. }
  20. static inline int hw_breakpoint_type(struct perf_event *bp)
  21. {
  22. return bp->attr.bp_type;
  23. }
  24. static inline int hw_breakpoint_len(struct perf_event *bp)
  25. {
  26. return bp->attr.bp_len;
  27. }
  28. extern struct perf_event *
  29. register_user_hw_breakpoint(unsigned long addr,
  30. int len,
  31. int type,
  32. perf_callback_t triggered,
  33. struct task_struct *tsk,
  34. bool active);
  35. /* FIXME: only change from the attr, and don't unregister */
  36. extern struct perf_event *
  37. modify_user_hw_breakpoint(struct perf_event *bp,
  38. unsigned long addr,
  39. int len,
  40. int type,
  41. perf_callback_t triggered,
  42. struct task_struct *tsk,
  43. bool active);
  44. /*
  45. * Kernel breakpoints are not associated with any particular thread.
  46. */
  47. extern struct perf_event *
  48. register_wide_hw_breakpoint_cpu(unsigned long addr,
  49. int len,
  50. int type,
  51. perf_callback_t triggered,
  52. int cpu,
  53. bool active);
  54. extern struct perf_event **
  55. register_wide_hw_breakpoint(unsigned long addr,
  56. int len,
  57. int type,
  58. perf_callback_t triggered,
  59. bool active);
  60. extern int register_perf_hw_breakpoint(struct perf_event *bp);
  61. extern int __register_perf_hw_breakpoint(struct perf_event *bp);
  62. extern void unregister_hw_breakpoint(struct perf_event *bp);
  63. extern void unregister_wide_hw_breakpoint(struct perf_event **cpu_events);
  64. extern int reserve_bp_slot(struct perf_event *bp);
  65. extern void release_bp_slot(struct perf_event *bp);
  66. extern void flush_ptrace_hw_breakpoint(struct task_struct *tsk);
  67. static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp)
  68. {
  69. return &bp->hw.info;
  70. }
  71. #else /* !CONFIG_HAVE_HW_BREAKPOINT */
  72. static inline struct perf_event *
  73. register_user_hw_breakpoint(unsigned long addr,
  74. int len,
  75. int type,
  76. perf_callback_t triggered,
  77. struct task_struct *tsk,
  78. bool active) { return NULL; }
  79. static inline struct perf_event *
  80. modify_user_hw_breakpoint(struct perf_event *bp,
  81. unsigned long addr,
  82. int len,
  83. int type,
  84. perf_callback_t triggered,
  85. struct task_struct *tsk,
  86. bool active) { return NULL; }
  87. static inline struct perf_event *
  88. register_wide_hw_breakpoint_cpu(unsigned long addr,
  89. int len,
  90. int type,
  91. perf_callback_t triggered,
  92. int cpu,
  93. bool active) { return NULL; }
  94. static inline struct perf_event **
  95. register_wide_hw_breakpoint(unsigned long addr,
  96. int len,
  97. int type,
  98. perf_callback_t triggered,
  99. bool active) { return NULL; }
  100. static inline int
  101. register_perf_hw_breakpoint(struct perf_event *bp) { return -ENOSYS; }
  102. static inline int
  103. __register_perf_hw_breakpoint(struct perf_event *bp) { return -ENOSYS; }
  104. static inline void unregister_hw_breakpoint(struct perf_event *bp) { }
  105. static inline void
  106. unregister_wide_hw_breakpoint(struct perf_event **cpu_events) { }
  107. static inline int
  108. reserve_bp_slot(struct perf_event *bp) {return -ENOSYS; }
  109. static inline void release_bp_slot(struct perf_event *bp) { }
  110. static inline void flush_ptrace_hw_breakpoint(struct task_struct *tsk) { }
  111. static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp)
  112. {
  113. return NULL;
  114. }
  115. #endif /* CONFIG_HAVE_HW_BREAKPOINT */
  116. #endif /* _LINUX_HW_BREAKPOINT_H */