| /* | 
 |  * Copyright (c) 2009 Google, Inc | 
 |  * Contributed by Stephane Eranian <eranian@google.com> | 
 |  * | 
 |  * Permission is hereby granted, free of charge, to any person obtaining a copy | 
 |  * of this software and associated documentation files (the "Software"), to deal | 
 |  * in the Software without restriction, including without limitation the rights | 
 |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies | 
 |  * of the Software, and to permit persons to whom the Software is furnished to do so, | 
 |  * subject to the following conditions: | 
 |  * | 
 |  * The above copyright notice and this permission notice shall be included in all | 
 |  * copies or substantial portions of the Software. | 
 |  * | 
 |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, | 
 |  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | 
 |  * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | 
 |  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | 
 |  * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE | 
 |  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | 
 |  * | 
 |  * This file is part of libpfm, a performance monitoring support library for | 
 |  * applications on Linux. | 
 |  */ | 
 |  | 
 | #define CACHE_ST_ACCESS(n, d, e) \ | 
 |        {\ | 
 | 	.name = #n"-STORES",\ | 
 | 	.desc = d" store accesses",\ | 
 | 	.id   = PERF_COUNT_HW_CACHE_##e,\ | 
 | 	.type = PERF_TYPE_HW_CACHE,\ | 
 | 	.modmsk = PERF_ATTR_HW,\ | 
 | 	.umask_ovfl_idx = -1,\ | 
 | 	.equiv = "PERF_COUNT_HW_CACHE_"#e":WRITE:ACCESS"\ | 
 |        },\ | 
 |        {\ | 
 | 	.name = #n"-STORE-MISSES",\ | 
 | 	.desc = d" store misses",\ | 
 | 	.id   = PERF_COUNT_HW_CACHE_##e,\ | 
 | 	.type = PERF_TYPE_HW_CACHE,\ | 
 | 	.modmsk = PERF_ATTR_HW,\ | 
 | 	.umask_ovfl_idx = -1,\ | 
 | 	.equiv = "PERF_COUNT_HW_CACHE_"#e":WRITE:MISS"\ | 
 |        } | 
 |  | 
 | #define CACHE_PF_ACCESS(n, d, e) \ | 
 |        {\ | 
 | 	.name = #n"-PREFETCHES",\ | 
 | 	.desc = d" prefetch accesses",\ | 
 | 	.id   = PERF_COUNT_HW_CACHE_##e,\ | 
 | 	.type = PERF_TYPE_HW_CACHE,\ | 
 | 	.modmsk = PERF_ATTR_HW,\ | 
 | 	.umask_ovfl_idx = -1,\ | 
 | 	.equiv = "PERF_COUNT_HW_CACHE_"#e":PREFETCH:ACCESS"\ | 
 |        },\ | 
 |        {\ | 
 | 	.name = #n"-PREFETCH-MISSES",\ | 
 | 	.desc = d" prefetch misses",\ | 
 | 	.id   = PERF_COUNT_HW_CACHE_##e,\ | 
 | 	.type = PERF_TYPE_HW_CACHE,\ | 
 | 	.modmsk = PERF_ATTR_HW,\ | 
 | 	.umask_ovfl_idx = -1,\ | 
 | 	.equiv = "PERF_COUNT_HW_CACHE_"#e":PREFETCH:MISS"\ | 
 |        } | 
 |  | 
 |  | 
 | #define CACHE_LD_ACCESS(n, d, e) \ | 
 |        {\ | 
 | 	.name = #n"-LOADS",\ | 
 | 	.desc = d" load accesses",\ | 
 | 	.id   = PERF_COUNT_HW_CACHE_##e,\ | 
 | 	.type = PERF_TYPE_HW_CACHE,\ | 
 | 	.modmsk = PERF_ATTR_HW,\ | 
 | 	.umask_ovfl_idx = -1,\ | 
 | 	.equiv = "PERF_COUNT_HW_CACHE_"#e":READ:ACCESS"\ | 
 |        },\ | 
 |        {\ | 
 | 	.name = #n"-LOAD-MISSES",\ | 
 | 	.desc = d" load misses",\ | 
 | 	.id   = PERF_COUNT_HW_CACHE_##e,\ | 
 | 	.type = PERF_TYPE_HW_CACHE,\ | 
 | 	.modmsk = PERF_ATTR_HW,\ | 
 | 	.umask_ovfl_idx = -1,\ | 
 | 	.equiv = "PERF_COUNT_HW_CACHE_"#e":READ:MISS"\ | 
 |        } | 
 |  | 
 | #define CACHE_ACCESS(n, d, e) \ | 
 | 	CACHE_LD_ACCESS(n, d, e), \ | 
 | 	CACHE_ST_ACCESS(n, d, e), \ | 
 | 	CACHE_PF_ACCESS(n, d, e) | 
 |  | 
 | #define ICACHE_ACCESS(n, d, e) \ | 
 | 	CACHE_LD_ACCESS(n, d, e), \ | 
 | 	CACHE_PF_ACCESS(n, d, e) | 
 |  | 
 | static perf_event_t perf_static_events[]={ | 
 | 	PCL_EVT_HW(CPU_CYCLES), | 
 | 	PCL_EVT_AHW(CYCLES, CPU_CYCLES), | 
 | 	PCL_EVT_AHW(CPU-CYCLES, CPU_CYCLES), | 
 |  | 
 | 	PCL_EVT_HW(INSTRUCTIONS), | 
 | 	PCL_EVT_AHW(INSTRUCTIONS, INSTRUCTIONS), | 
 |  | 
 | 	PCL_EVT_HW(CACHE_REFERENCES), | 
 | 	PCL_EVT_AHW(CACHE-REFERENCES, CACHE_REFERENCES), | 
 |  | 
 | 	PCL_EVT_HW(CACHE_MISSES), | 
 | 	PCL_EVT_AHW(CACHE-MISSES,CACHE_MISSES), | 
 |  | 
 | 	PCL_EVT_HW(BRANCH_INSTRUCTIONS), | 
 | 	PCL_EVT_AHW(BRANCH-INSTRUCTIONS, BRANCH_INSTRUCTIONS), | 
 | 	PCL_EVT_AHW(BRANCHES, BRANCH_INSTRUCTIONS), | 
 |  | 
 | 	PCL_EVT_HW(BRANCH_MISSES), | 
 | 	PCL_EVT_AHW(BRANCH-MISSES, BRANCH_MISSES), | 
 |  | 
 | 	PCL_EVT_HW(BUS_CYCLES), | 
 | 	PCL_EVT_AHW(BUS-CYCLES, BUS_CYCLES), | 
 |  | 
 | 	PCL_EVT_HW(STALLED_CYCLES_FRONTEND), | 
 | 	PCL_EVT_AHW(STALLED-CYCLES-FRONTEND, STALLED_CYCLES_FRONTEND), | 
 | 	PCL_EVT_AHW(IDLE-CYCLES-FRONTEND, STALLED_CYCLES_FRONTEND), | 
 |  | 
 | 	PCL_EVT_HW(STALLED_CYCLES_BACKEND), | 
 | 	PCL_EVT_AHW(STALLED-CYCLES-BACKEND, STALLED_CYCLES_BACKEND), | 
 | 	PCL_EVT_AHW(IDLE-CYCLES-BACKEND, STALLED_CYCLES_BACKEND), | 
 |  | 
 | 	PCL_EVT_HW(REF_CPU_CYCLES), | 
 | 	PCL_EVT_AHW(REF-CYCLES,REF_CPU_CYCLES), | 
 |  | 
 |         PCL_EVT_SW(CPU_CLOCK), | 
 |         PCL_EVT_ASW(CPU-CLOCK, CPU_CLOCK), | 
 |  | 
 |         PCL_EVT_SW(TASK_CLOCK), | 
 |         PCL_EVT_ASW(TASK-CLOCK, TASK_CLOCK), | 
 |  | 
 |         PCL_EVT_SW(PAGE_FAULTS), | 
 |         PCL_EVT_ASW(PAGE-FAULTS, PAGE_FAULTS), | 
 |         PCL_EVT_ASW(FAULTS, PAGE_FAULTS), | 
 |  | 
 |         PCL_EVT_SW(CONTEXT_SWITCHES), | 
 |         PCL_EVT_ASW(CONTEXT-SWITCHES, CONTEXT_SWITCHES), | 
 |         PCL_EVT_ASW(CS, CONTEXT_SWITCHES), | 
 |  | 
 |         PCL_EVT_SW(CPU_MIGRATIONS), | 
 |         PCL_EVT_ASW(CPU-MIGRATIONS, CPU_MIGRATIONS), | 
 |         PCL_EVT_ASW(MIGRATIONS, CPU_MIGRATIONS), | 
 |  | 
 |         PCL_EVT_SW(PAGE_FAULTS_MIN), | 
 |         PCL_EVT_ASW(MINOR-FAULTS, PAGE_FAULTS_MIN), | 
 |  | 
 |         PCL_EVT_SW(PAGE_FAULTS_MAJ), | 
 |         PCL_EVT_ASW(MAJOR-FAULTS, PAGE_FAULTS_MAJ), | 
 | 	{ | 
 | 	.name = "PERF_COUNT_HW_CACHE_L1D", | 
 | 	.desc = "L1 data cache", | 
 | 	.id   = PERF_COUNT_HW_CACHE_L1D, | 
 | 	.type = PERF_TYPE_HW_CACHE, | 
 | 	.numasks = 5, | 
 | 	.modmsk = PERF_ATTR_HW, | 
 | 	.umask_ovfl_idx = -1, | 
 | 	.ngrp = 2, | 
 | 	.umasks = { | 
 | 		{ .uname = "READ", | 
 | 		  .udesc = "read access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_READ << 8, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "WRITE", | 
 | 		  .udesc = "write access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_WRITE << 8, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "PREFETCH", | 
 | 		  .udesc = "prefetch access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_PREFETCH << 8, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "ACCESS", | 
 | 		  .udesc = "hit access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16, | 
 | 		  .grpid = 1, | 
 | 		}, | 
 | 		{ .uname = "MISS", | 
 | 		  .udesc = "miss access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_MISS << 16, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 1, | 
 | 		} | 
 | 	} | 
 |        }, | 
 |        CACHE_ACCESS(L1-DCACHE, "L1 cache", L1D), | 
 |        { | 
 | 	.name = "PERF_COUNT_HW_CACHE_L1I", | 
 | 	.desc = "L1 instruction cache", | 
 | 	.id   = PERF_COUNT_HW_CACHE_L1I, | 
 | 	.type = PERF_TYPE_HW_CACHE, | 
 | 	.numasks = 4, | 
 | 	.modmsk = PERF_ATTR_HW, | 
 | 	.umask_ovfl_idx = -1, | 
 | 	.ngrp = 2, | 
 | 	.umasks = { | 
 | 		{ .uname = "READ", | 
 | 		  .udesc = "read access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_READ << 8, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "PREFETCH", | 
 | 		  .udesc = "prefetch access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_PREFETCH << 8, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "ACCESS", | 
 | 		  .udesc = "hit access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16, | 
 | 		  .grpid = 1, | 
 | 		}, | 
 | 		{ .uname = "MISS", | 
 | 		  .udesc = "miss access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_MISS << 16, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 1, | 
 | 		} | 
 | 	} | 
 |        }, | 
 |        ICACHE_ACCESS(L1-ICACHE, "L1I cache", L1I), | 
 |        { | 
 | 	.name = "PERF_COUNT_HW_CACHE_LL", | 
 | 	.desc = "Last level cache", | 
 | 	.id   = PERF_COUNT_HW_CACHE_LL, | 
 | 	.type = PERF_TYPE_HW_CACHE, | 
 | 	.numasks = 5, | 
 | 	.modmsk = PERF_ATTR_HW, | 
 | 	.umask_ovfl_idx = -1, | 
 | 	.ngrp = 2, | 
 | 	.umasks = { | 
 | 		{ .uname = "READ", | 
 | 		  .udesc = "read access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_READ << 8, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "WRITE", | 
 | 		  .udesc = "write access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_WRITE << 8, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "PREFETCH", | 
 | 		  .udesc = "prefetch access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_PREFETCH << 8, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "ACCESS", | 
 | 		  .udesc = "hit access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16, | 
 | 		  .grpid = 1, | 
 | 		}, | 
 | 		{ .uname = "MISS", | 
 | 		  .udesc = "miss access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_MISS << 16, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 1, | 
 | 		} | 
 | 	} | 
 |        }, | 
 |        CACHE_ACCESS(LLC, "Last level cache", LL), | 
 |        { | 
 | 	.name = "PERF_COUNT_HW_CACHE_DTLB", | 
 | 	.desc = "Data Translation Lookaside Buffer", | 
 | 	.id   = PERF_COUNT_HW_CACHE_DTLB, | 
 | 	.type = PERF_TYPE_HW_CACHE, | 
 | 	.numasks = 5, | 
 | 	.modmsk = PERF_ATTR_HW, | 
 | 	.umask_ovfl_idx = -1, | 
 | 	.ngrp = 2, | 
 | 	.umasks = { | 
 | 		{ .uname = "READ", | 
 | 		  .udesc = "read access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_READ << 8, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "WRITE", | 
 | 		  .udesc = "write access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_WRITE << 8, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "PREFETCH", | 
 | 		  .udesc = "prefetch access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_PREFETCH << 8, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "ACCESS", | 
 | 		  .udesc = "hit access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16, | 
 | 		  .grpid = 1, | 
 | 		}, | 
 | 		{ .uname = "MISS", | 
 | 		  .udesc = "miss access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_MISS << 16, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 1, | 
 | 		} | 
 | 	} | 
 |        }, | 
 |        CACHE_ACCESS(DTLB, "Data TLB", DTLB), | 
 |        { | 
 | 	.name = "PERF_COUNT_HW_CACHE_ITLB", | 
 | 	.desc = "Instruction Translation Lookaside Buffer", | 
 | 	.id   = PERF_COUNT_HW_CACHE_ITLB, | 
 | 	.type = PERF_TYPE_HW_CACHE, | 
 | 	.numasks = 3, | 
 | 	.modmsk = PERF_ATTR_HW, | 
 | 	.umask_ovfl_idx = -1, | 
 | 	.ngrp = 2, | 
 | 	.umasks = { | 
 | 		{ .uname = "READ", | 
 | 		  .udesc = "read access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_READ << 8, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "ACCESS", | 
 | 		  .udesc = "hit access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16, | 
 | 		  .grpid = 1, | 
 | 		}, | 
 | 		{ .uname = "MISS", | 
 | 		  .udesc = "miss access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_MISS << 16, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 1, | 
 | 		} | 
 | 	} | 
 |        }, | 
 |        CACHE_LD_ACCESS(ITLB, "Instruction TLB", ITLB), | 
 |        { | 
 | 	.name = "PERF_COUNT_HW_CACHE_BPU", | 
 | 	.desc = "Branch Prediction Unit", | 
 | 	.id   = PERF_COUNT_HW_CACHE_BPU, | 
 | 	.type = PERF_TYPE_HW_CACHE, | 
 | 	.numasks = 3, | 
 | 	.modmsk = PERF_ATTR_HW, | 
 | 	.umask_ovfl_idx = -1, | 
 | 	.ngrp = 2, | 
 | 	.umasks = { | 
 | 		{ .uname = "READ", | 
 | 		  .udesc = "read access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_READ << 8, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "ACCESS", | 
 | 		  .udesc = "hit access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16, | 
 | 		  .grpid = 1, | 
 | 		}, | 
 | 		{ .uname = "MISS", | 
 | 		  .udesc = "miss access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_MISS << 16, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 1, | 
 | 		} | 
 | 	} | 
 |        }, | 
 |        CACHE_LD_ACCESS(BRANCH, "Branch ", BPU), | 
 |        { | 
 | 	.name = "PERF_COUNT_HW_CACHE_NODE", | 
 | 	.desc = "Node memory access", | 
 | 	.id   = PERF_COUNT_HW_CACHE_NODE, | 
 | 	.type = PERF_TYPE_HW_CACHE, | 
 | 	.numasks = 5, | 
 | 	.modmsk = PERF_ATTR_HW, | 
 | 	.umask_ovfl_idx = -1, | 
 | 	.ngrp = 2, | 
 | 	.umasks = { | 
 | 		{ .uname = "READ", | 
 | 		  .udesc = "read access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_READ << 8, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "WRITE", | 
 | 		  .udesc = "write access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_WRITE << 8, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "PREFETCH", | 
 | 		  .udesc = "prefetch access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_OP_PREFETCH << 8, | 
 | 		  .grpid = 0, | 
 | 		}, | 
 | 		{ .uname = "ACCESS", | 
 | 		  .udesc = "hit access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16, | 
 | 		  .grpid = 1, | 
 | 		}, | 
 | 		{ .uname = "MISS", | 
 | 		  .udesc = "miss access", | 
 | 		  .uid   = PERF_COUNT_HW_CACHE_RESULT_MISS << 16, | 
 | 		  .uflags= PERF_FL_DEFAULT, | 
 | 		  .grpid = 1, | 
 | 		} | 
 | 	}, | 
 |        }, | 
 |        CACHE_ACCESS(NODE, "Node ", NODE) | 
 | }; | 
 | #define PME_PERF_EVENT_COUNT (sizeof(perf_static_events)/sizeof(perf_event_t)) |