| /* |
| * 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)) |