2 * Copyright (c) 2009 Google, Inc
3 * Contributed by Stephane Eranian <eranian@google.com>
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is furnished to do so,
10 * subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in all
13 * copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
16 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
17 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
18 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
19 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
20 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 * This file is part of libpfm, a performance monitoring support library for
23 * applications on Linux.
26 #define CACHE_ST_ACCESS(n, d, e) \
29 .desc = d" store accesses",\
30 .id = PERF_COUNT_HW_CACHE_##e,\
31 .type = PERF_TYPE_HW_CACHE,\
32 .modmsk = PERF_ATTR_HW,\
33 .umask_ovfl_idx = -1,\
34 .equiv = "PERF_COUNT_HW_CACHE_"#e":WRITE:ACCESS"\
37 .name = #n"-STORE-MISSES",\
38 .desc = d" store misses",\
39 .id = PERF_COUNT_HW_CACHE_##e,\
40 .type = PERF_TYPE_HW_CACHE,\
41 .modmsk = PERF_ATTR_HW,\
42 .umask_ovfl_idx = -1,\
43 .equiv = "PERF_COUNT_HW_CACHE_"#e":WRITE:MISS"\
46 #define CACHE_PF_ACCESS(n, d, e) \
48 .name = #n"-PREFETCHES",\
49 .desc = d" prefetch accesses",\
50 .id = PERF_COUNT_HW_CACHE_##e,\
51 .type = PERF_TYPE_HW_CACHE,\
52 .modmsk = PERF_ATTR_HW,\
53 .umask_ovfl_idx = -1,\
54 .equiv = "PERF_COUNT_HW_CACHE_"#e":PREFETCH:ACCESS"\
57 .name = #n"-PREFETCH-MISSES",\
58 .desc = d" prefetch misses",\
59 .id = PERF_COUNT_HW_CACHE_##e,\
60 .type = PERF_TYPE_HW_CACHE,\
61 .modmsk = PERF_ATTR_HW,\
62 .umask_ovfl_idx = -1,\
63 .equiv = "PERF_COUNT_HW_CACHE_"#e":PREFETCH:MISS"\
67 #define CACHE_LD_ACCESS(n, d, e) \
70 .desc = d" load accesses",\
71 .id = PERF_COUNT_HW_CACHE_##e,\
72 .type = PERF_TYPE_HW_CACHE,\
73 .modmsk = PERF_ATTR_HW,\
74 .umask_ovfl_idx = -1,\
75 .equiv = "PERF_COUNT_HW_CACHE_"#e":READ:ACCESS"\
78 .name = #n"-LOAD-MISSES",\
79 .desc = d" load misses",\
80 .id = PERF_COUNT_HW_CACHE_##e,\
81 .type = PERF_TYPE_HW_CACHE,\
82 .modmsk = PERF_ATTR_HW,\
83 .umask_ovfl_idx = -1,\
84 .equiv = "PERF_COUNT_HW_CACHE_"#e":READ:MISS"\
87 #define CACHE_ACCESS(n, d, e) \
88 CACHE_LD_ACCESS(n, d, e), \
89 CACHE_ST_ACCESS(n, d, e), \
90 CACHE_PF_ACCESS(n, d, e)
92 #define ICACHE_ACCESS(n, d, e) \
93 CACHE_LD_ACCESS(n, d, e), \
94 CACHE_PF_ACCESS(n, d, e)
96 static perf_event_t perf_static_events[]={
97 PCL_EVT_HW(CPU_CYCLES),
98 PCL_EVT_AHW(CYCLES, CPU_CYCLES),
99 PCL_EVT_AHW(CPU-CYCLES, CPU_CYCLES),
101 PCL_EVT_HW(INSTRUCTIONS),
102 PCL_EVT_AHW(INSTRUCTIONS, INSTRUCTIONS),
104 PCL_EVT_HW(CACHE_REFERENCES),
105 PCL_EVT_AHW(CACHE-REFERENCES, CACHE_REFERENCES),
107 PCL_EVT_HW(CACHE_MISSES),
108 PCL_EVT_AHW(CACHE-MISSES,CACHE_MISSES),
110 PCL_EVT_HW(BRANCH_INSTRUCTIONS),
111 PCL_EVT_AHW(BRANCH-INSTRUCTIONS, BRANCH_INSTRUCTIONS),
112 PCL_EVT_AHW(BRANCHES, BRANCH_INSTRUCTIONS),
114 PCL_EVT_HW(BRANCH_MISSES),
115 PCL_EVT_AHW(BRANCH-MISSES, BRANCH_MISSES),
117 PCL_EVT_HW(BUS_CYCLES),
118 PCL_EVT_AHW(BUS-CYCLES, BUS_CYCLES),
120 PCL_EVT_HW(STALLED_CYCLES_FRONTEND),
121 PCL_EVT_AHW(STALLED-CYCLES-FRONTEND, STALLED_CYCLES_FRONTEND),
122 PCL_EVT_AHW(IDLE-CYCLES-FRONTEND, STALLED_CYCLES_FRONTEND),
124 PCL_EVT_HW(STALLED_CYCLES_BACKEND),
125 PCL_EVT_AHW(STALLED-CYCLES-BACKEND, STALLED_CYCLES_BACKEND),
126 PCL_EVT_AHW(IDLE-CYCLES-BACKEND, STALLED_CYCLES_BACKEND),
128 PCL_EVT_HW(REF_CPU_CYCLES),
129 PCL_EVT_AHW(REF-CYCLES,REF_CPU_CYCLES),
131 PCL_EVT_SW(CPU_CLOCK),
132 PCL_EVT_ASW(CPU-CLOCK, CPU_CLOCK),
134 PCL_EVT_SW(TASK_CLOCK),
135 PCL_EVT_ASW(TASK-CLOCK, TASK_CLOCK),
137 PCL_EVT_SW(PAGE_FAULTS),
138 PCL_EVT_ASW(PAGE-FAULTS, PAGE_FAULTS),
139 PCL_EVT_ASW(FAULTS, PAGE_FAULTS),
141 PCL_EVT_SW(CONTEXT_SWITCHES),
142 PCL_EVT_ASW(CONTEXT-SWITCHES, CONTEXT_SWITCHES),
143 PCL_EVT_ASW(CS, CONTEXT_SWITCHES),
145 PCL_EVT_SW(CPU_MIGRATIONS),
146 PCL_EVT_ASW(CPU-MIGRATIONS, CPU_MIGRATIONS),
147 PCL_EVT_ASW(MIGRATIONS, CPU_MIGRATIONS),
149 PCL_EVT_SW(PAGE_FAULTS_MIN),
150 PCL_EVT_ASW(MINOR-FAULTS, PAGE_FAULTS_MIN),
152 PCL_EVT_SW(PAGE_FAULTS_MAJ),
153 PCL_EVT_ASW(MAJOR-FAULTS, PAGE_FAULTS_MAJ),
155 .name = "PERF_COUNT_HW_CACHE_L1D",
156 .desc = "L1 data cache",
157 .id = PERF_COUNT_HW_CACHE_L1D,
158 .type = PERF_TYPE_HW_CACHE,
160 .modmsk = PERF_ATTR_HW,
161 .umask_ovfl_idx = -1,
165 .udesc = "read access",
166 .uid = PERF_COUNT_HW_CACHE_OP_READ << 8,
167 .uflags= PERF_FL_DEFAULT,
171 .udesc = "write access",
172 .uid = PERF_COUNT_HW_CACHE_OP_WRITE << 8,
175 { .uname = "PREFETCH",
176 .udesc = "prefetch access",
177 .uid = PERF_COUNT_HW_CACHE_OP_PREFETCH << 8,
181 .udesc = "hit access",
182 .uid = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16,
186 .udesc = "miss access",
187 .uid = PERF_COUNT_HW_CACHE_RESULT_MISS << 16,
188 .uflags= PERF_FL_DEFAULT,
193 CACHE_ACCESS(L1-DCACHE, "L1 cache", L1D),
195 .name = "PERF_COUNT_HW_CACHE_L1I",
196 .desc = "L1 instruction cache",
197 .id = PERF_COUNT_HW_CACHE_L1I,
198 .type = PERF_TYPE_HW_CACHE,
200 .modmsk = PERF_ATTR_HW,
201 .umask_ovfl_idx = -1,
205 .udesc = "read access",
206 .uid = PERF_COUNT_HW_CACHE_OP_READ << 8,
207 .uflags= PERF_FL_DEFAULT,
210 { .uname = "PREFETCH",
211 .udesc = "prefetch access",
212 .uid = PERF_COUNT_HW_CACHE_OP_PREFETCH << 8,
216 .udesc = "hit access",
217 .uid = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16,
221 .udesc = "miss access",
222 .uid = PERF_COUNT_HW_CACHE_RESULT_MISS << 16,
223 .uflags= PERF_FL_DEFAULT,
228 ICACHE_ACCESS(L1-ICACHE, "L1I cache", L1I),
230 .name = "PERF_COUNT_HW_CACHE_LL",
231 .desc = "Last level cache",
232 .id = PERF_COUNT_HW_CACHE_LL,
233 .type = PERF_TYPE_HW_CACHE,
235 .modmsk = PERF_ATTR_HW,
236 .umask_ovfl_idx = -1,
240 .udesc = "read access",
241 .uid = PERF_COUNT_HW_CACHE_OP_READ << 8,
242 .uflags= PERF_FL_DEFAULT,
246 .udesc = "write access",
247 .uid = PERF_COUNT_HW_CACHE_OP_WRITE << 8,
250 { .uname = "PREFETCH",
251 .udesc = "prefetch access",
252 .uid = PERF_COUNT_HW_CACHE_OP_PREFETCH << 8,
256 .udesc = "hit access",
257 .uid = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16,
261 .udesc = "miss access",
262 .uid = PERF_COUNT_HW_CACHE_RESULT_MISS << 16,
263 .uflags= PERF_FL_DEFAULT,
268 CACHE_ACCESS(LLC, "Last level cache", LL),
270 .name = "PERF_COUNT_HW_CACHE_DTLB",
271 .desc = "Data Translation Lookaside Buffer",
272 .id = PERF_COUNT_HW_CACHE_DTLB,
273 .type = PERF_TYPE_HW_CACHE,
275 .modmsk = PERF_ATTR_HW,
276 .umask_ovfl_idx = -1,
280 .udesc = "read access",
281 .uid = PERF_COUNT_HW_CACHE_OP_READ << 8,
282 .uflags= PERF_FL_DEFAULT,
286 .udesc = "write access",
287 .uid = PERF_COUNT_HW_CACHE_OP_WRITE << 8,
290 { .uname = "PREFETCH",
291 .udesc = "prefetch access",
292 .uid = PERF_COUNT_HW_CACHE_OP_PREFETCH << 8,
296 .udesc = "hit access",
297 .uid = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16,
301 .udesc = "miss access",
302 .uid = PERF_COUNT_HW_CACHE_RESULT_MISS << 16,
303 .uflags= PERF_FL_DEFAULT,
308 CACHE_ACCESS(DTLB, "Data TLB", DTLB),
310 .name = "PERF_COUNT_HW_CACHE_ITLB",
311 .desc = "Instruction Translation Lookaside Buffer",
312 .id = PERF_COUNT_HW_CACHE_ITLB,
313 .type = PERF_TYPE_HW_CACHE,
315 .modmsk = PERF_ATTR_HW,
316 .umask_ovfl_idx = -1,
320 .udesc = "read access",
321 .uid = PERF_COUNT_HW_CACHE_OP_READ << 8,
322 .uflags= PERF_FL_DEFAULT,
326 .udesc = "hit access",
327 .uid = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16,
331 .udesc = "miss access",
332 .uid = PERF_COUNT_HW_CACHE_RESULT_MISS << 16,
333 .uflags= PERF_FL_DEFAULT,
338 CACHE_LD_ACCESS(ITLB, "Instruction TLB", ITLB),
340 .name = "PERF_COUNT_HW_CACHE_BPU",
341 .desc = "Branch Prediction Unit",
342 .id = PERF_COUNT_HW_CACHE_BPU,
343 .type = PERF_TYPE_HW_CACHE,
345 .modmsk = PERF_ATTR_HW,
346 .umask_ovfl_idx = -1,
350 .udesc = "read access",
351 .uid = PERF_COUNT_HW_CACHE_OP_READ << 8,
352 .uflags= PERF_FL_DEFAULT,
356 .udesc = "hit access",
357 .uid = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16,
361 .udesc = "miss access",
362 .uid = PERF_COUNT_HW_CACHE_RESULT_MISS << 16,
363 .uflags= PERF_FL_DEFAULT,
368 CACHE_LD_ACCESS(BRANCH, "Branch ", BPU),
370 .name = "PERF_COUNT_HW_CACHE_NODE",
371 .desc = "Node memory access",
372 .id = PERF_COUNT_HW_CACHE_NODE,
373 .type = PERF_TYPE_HW_CACHE,
375 .modmsk = PERF_ATTR_HW,
376 .umask_ovfl_idx = -1,
380 .udesc = "read access",
381 .uid = PERF_COUNT_HW_CACHE_OP_READ << 8,
382 .uflags= PERF_FL_DEFAULT,
386 .udesc = "write access",
387 .uid = PERF_COUNT_HW_CACHE_OP_WRITE << 8,
390 { .uname = "PREFETCH",
391 .udesc = "prefetch access",
392 .uid = PERF_COUNT_HW_CACHE_OP_PREFETCH << 8,
396 .udesc = "hit access",
397 .uid = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16,
401 .udesc = "miss access",
402 .uid = PERF_COUNT_HW_CACHE_RESULT_MISS << 16,
403 .uflags= PERF_FL_DEFAULT,
408 CACHE_ACCESS(NODE, "Node ", NODE)
410 #define PME_PERF_EVENT_COUNT (sizeof(perf_static_events)/sizeof(perf_event_t))