perf.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. #ifndef _PERF_PERF_H
  2. #define _PERF_PERF_H
  3. #include <asm/unistd.h>
  4. #if defined(__i386__)
  5. #define mb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory")
  6. #define wmb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory")
  7. #define rmb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory")
  8. #define cpu_relax() asm volatile("rep; nop" ::: "memory");
  9. #define CPUINFO_PROC "model name"
  10. #ifndef __NR_perf_event_open
  11. # define __NR_perf_event_open 336
  12. #endif
  13. #ifndef __NR_futex
  14. # define __NR_futex 240
  15. #endif
  16. #endif
  17. #if defined(__x86_64__)
  18. #define mb() asm volatile("mfence" ::: "memory")
  19. #define wmb() asm volatile("sfence" ::: "memory")
  20. #define rmb() asm volatile("lfence" ::: "memory")
  21. #define cpu_relax() asm volatile("rep; nop" ::: "memory");
  22. #define CPUINFO_PROC "model name"
  23. #ifndef __NR_perf_event_open
  24. # define __NR_perf_event_open 298
  25. #endif
  26. #ifndef __NR_futex
  27. # define __NR_futex 202
  28. #endif
  29. #endif
  30. #ifdef __powerpc__
  31. #include "../../arch/powerpc/include/uapi/asm/unistd.h"
  32. #define mb() asm volatile ("sync" ::: "memory")
  33. #define wmb() asm volatile ("sync" ::: "memory")
  34. #define rmb() asm volatile ("sync" ::: "memory")
  35. #define CPUINFO_PROC "cpu"
  36. #endif
  37. #ifdef __s390__
  38. #define mb() asm volatile("bcr 15,0" ::: "memory")
  39. #define wmb() asm volatile("bcr 15,0" ::: "memory")
  40. #define rmb() asm volatile("bcr 15,0" ::: "memory")
  41. #endif
  42. #ifdef __sh__
  43. #if defined(__SH4A__) || defined(__SH5__)
  44. # define mb() asm volatile("synco" ::: "memory")
  45. # define wmb() asm volatile("synco" ::: "memory")
  46. # define rmb() asm volatile("synco" ::: "memory")
  47. #else
  48. # define mb() asm volatile("" ::: "memory")
  49. # define wmb() asm volatile("" ::: "memory")
  50. # define rmb() asm volatile("" ::: "memory")
  51. #endif
  52. #define CPUINFO_PROC "cpu type"
  53. #endif
  54. #ifdef __hppa__
  55. #define mb() asm volatile("" ::: "memory")
  56. #define wmb() asm volatile("" ::: "memory")
  57. #define rmb() asm volatile("" ::: "memory")
  58. #define CPUINFO_PROC "cpu"
  59. #endif
  60. #ifdef __sparc__
  61. #ifdef __LP64__
  62. #define mb() asm volatile("ba,pt %%xcc, 1f\n" \
  63. "membar #StoreLoad\n" \
  64. "1:\n":::"memory")
  65. #else
  66. #define mb() asm volatile("":::"memory")
  67. #endif
  68. #define wmb() asm volatile("":::"memory")
  69. #define rmb() asm volatile("":::"memory")
  70. #define CPUINFO_PROC "cpu"
  71. #endif
  72. #ifdef __alpha__
  73. #define mb() asm volatile("mb" ::: "memory")
  74. #define wmb() asm volatile("wmb" ::: "memory")
  75. #define rmb() asm volatile("mb" ::: "memory")
  76. #define CPUINFO_PROC "cpu model"
  77. #endif
  78. #ifdef __ia64__
  79. #define mb() asm volatile ("mf" ::: "memory")
  80. #define wmb() asm volatile ("mf" ::: "memory")
  81. #define rmb() asm volatile ("mf" ::: "memory")
  82. #define cpu_relax() asm volatile ("hint @pause" ::: "memory")
  83. #define CPUINFO_PROC "model name"
  84. #endif
  85. #ifdef __arm__
  86. /*
  87. * Use the __kuser_memory_barrier helper in the CPU helper page. See
  88. * arch/arm/kernel/entry-armv.S in the kernel source for details.
  89. */
  90. #define mb() ((void(*)(void))0xffff0fa0)()
  91. #define wmb() ((void(*)(void))0xffff0fa0)()
  92. #define rmb() ((void(*)(void))0xffff0fa0)()
  93. #define CPUINFO_PROC "Processor"
  94. #endif
  95. #ifdef __aarch64__
  96. #define mb() asm volatile("dmb ish" ::: "memory")
  97. #define wmb() asm volatile("dmb ishst" ::: "memory")
  98. #define rmb() asm volatile("dmb ishld" ::: "memory")
  99. #define cpu_relax() asm volatile("yield" ::: "memory")
  100. #endif
  101. #ifdef __mips__
  102. #define mb() asm volatile( \
  103. ".set mips2\n\t" \
  104. "sync\n\t" \
  105. ".set mips0" \
  106. : /* no output */ \
  107. : /* no input */ \
  108. : "memory")
  109. #define wmb() mb()
  110. #define rmb() mb()
  111. #define CPUINFO_PROC "cpu model"
  112. #endif
  113. #ifdef __arc__
  114. #define mb() asm volatile("" ::: "memory")
  115. #define wmb() asm volatile("" ::: "memory")
  116. #define rmb() asm volatile("" ::: "memory")
  117. #define CPUINFO_PROC "Processor"
  118. #endif
  119. #ifdef __metag__
  120. #define mb() asm volatile("" ::: "memory")
  121. #define wmb() asm volatile("" ::: "memory")
  122. #define rmb() asm volatile("" ::: "memory")
  123. #define CPUINFO_PROC "CPU"
  124. #endif
  125. #ifdef __xtensa__
  126. #define mb() asm volatile("memw" ::: "memory")
  127. #define wmb() asm volatile("memw" ::: "memory")
  128. #define rmb() asm volatile("" ::: "memory")
  129. #define CPUINFO_PROC "core ID"
  130. #endif
  131. #ifdef __tile__
  132. #define mb() asm volatile ("mf" ::: "memory")
  133. #define wmb() asm volatile ("mf" ::: "memory")
  134. #define rmb() asm volatile ("mf" ::: "memory")
  135. #define cpu_relax() asm volatile ("mfspr zero, PASS" ::: "memory")
  136. #define CPUINFO_PROC "model name"
  137. #endif
  138. #define barrier() asm volatile ("" ::: "memory")
  139. #ifndef cpu_relax
  140. #define cpu_relax() barrier()
  141. #endif
  142. #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
  143. #include <time.h>
  144. #include <unistd.h>
  145. #include <sys/types.h>
  146. #include <sys/syscall.h>
  147. #include <linux/perf_event.h>
  148. #include "util/types.h"
  149. #include <stdbool.h>
  150. /*
  151. * prctl(PR_TASK_PERF_EVENTS_DISABLE) will (cheaply) disable all
  152. * counters in the current task.
  153. */
  154. #define PR_TASK_PERF_EVENTS_DISABLE 31
  155. #define PR_TASK_PERF_EVENTS_ENABLE 32
  156. #ifndef NSEC_PER_SEC
  157. # define NSEC_PER_SEC 1000000000ULL
  158. #endif
  159. #ifndef NSEC_PER_USEC
  160. # define NSEC_PER_USEC 1000ULL
  161. #endif
  162. static inline unsigned long long rdclock(void)
  163. {
  164. struct timespec ts;
  165. clock_gettime(CLOCK_MONOTONIC, &ts);
  166. return ts.tv_sec * 1000000000ULL + ts.tv_nsec;
  167. }
  168. /*
  169. * Pick up some kernel type conventions:
  170. */
  171. #define __user
  172. #define asmlinkage
  173. #define unlikely(x) __builtin_expect(!!(x), 0)
  174. #define min(x, y) ({ \
  175. typeof(x) _min1 = (x); \
  176. typeof(y) _min2 = (y); \
  177. (void) (&_min1 == &_min2); \
  178. _min1 < _min2 ? _min1 : _min2; })
  179. extern bool test_attr__enabled;
  180. void test_attr__init(void);
  181. void test_attr__open(struct perf_event_attr *attr, pid_t pid, int cpu,
  182. int fd, int group_fd, unsigned long flags);
  183. static inline int
  184. sys_perf_event_open(struct perf_event_attr *attr,
  185. pid_t pid, int cpu, int group_fd,
  186. unsigned long flags)
  187. {
  188. int fd;
  189. fd = syscall(__NR_perf_event_open, attr, pid, cpu,
  190. group_fd, flags);
  191. if (unlikely(test_attr__enabled))
  192. test_attr__open(attr, pid, cpu, fd, group_fd, flags);
  193. return fd;
  194. }
  195. #define MAX_COUNTERS 256
  196. #define MAX_NR_CPUS 256
  197. struct ip_callchain {
  198. u64 nr;
  199. u64 ips[0];
  200. };
  201. struct branch_flags {
  202. u64 mispred:1;
  203. u64 predicted:1;
  204. u64 in_tx:1;
  205. u64 abort:1;
  206. u64 reserved:60;
  207. };
  208. struct branch_entry {
  209. u64 from;
  210. u64 to;
  211. struct branch_flags flags;
  212. };
  213. struct branch_stack {
  214. u64 nr;
  215. struct branch_entry entries[0];
  216. };
  217. extern const char *input_name;
  218. extern bool perf_host, perf_guest;
  219. extern const char perf_version_string[];
  220. void pthread__unblock_sigwinch(void);
  221. #include "util/target.h"
  222. enum perf_call_graph_mode {
  223. CALLCHAIN_NONE,
  224. CALLCHAIN_FP,
  225. CALLCHAIN_DWARF,
  226. CALLCHAIN_MAX
  227. };
  228. struct record_opts {
  229. struct target target;
  230. int call_graph;
  231. bool call_graph_enabled;
  232. bool group;
  233. bool inherit_stat;
  234. bool no_buffering;
  235. bool no_inherit;
  236. bool no_inherit_set;
  237. bool no_samples;
  238. bool raw_samples;
  239. bool sample_address;
  240. bool sample_weight;
  241. bool sample_time;
  242. bool period;
  243. unsigned int freq;
  244. unsigned int mmap_pages;
  245. unsigned int user_freq;
  246. u64 branch_stack;
  247. u64 default_interval;
  248. u64 user_interval;
  249. u16 stack_dump_size;
  250. bool sample_transaction;
  251. unsigned initial_delay;
  252. };
  253. #endif