hw_breakpoint.h 3.6 KB

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