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