Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf updates from Ingo Molnar: "This update is pretty big and almost exclusively includes tooling changes, because v4.9's LTS status forced to completion most of the pending kernel side hardware enablement work and because we tried to freeze core perf work a bit to give a time window for the fuzzing efforts. The diff is large mostly due to the JSON hardware event tables added for Intel and Power8 CPUs. This was a popular feature request from people working close to hardware and from the HPC community. Tree size is big because this added the CPU event tables for over a decade of Intel CPUs. Future changes for a CPU vendor alrady support should be much smaller, as events for new models are added. The new events are listed in 'perf list', for the CPU model the tool is running on. If you find an interesting event it can be used as-is: $ perf stat -a -e l2_lines_out.pf_clean sleep 1 Performance counter stats for 'system wide': 7,860,403 l2_lines_out.pf_clean 1.000624918 seconds time elapsed The event lists can be searched the usual 'perf list' fashion for (case insensitive) substrings as well: $ perf list l2_lines_out List of pre-defined events (to be used in -e): cache: l2_lines_out.demand_clean [Clean L2 cache lines evicted by demand] l2_lines_out.demand_dirty [Dirty L2 cache lines evicted by demand] l2_lines_out.dirty_all [Dirty L2 cache lines filling the L2] l2_lines_out.pf_clean [Clean L2 cache lines evicted by L2 prefetch] l2_lines_out.pf_dirty [Dirty L2 cache lines evicted by L2 prefetch] etc. There's a few high level categories as well that can be listed: 'cache', 'floating point', 'frontend', 'memory', 'pipeline', 'virtual memory'. Existing generic events and workflows should work as-is. The only kernel side change is a late breaking fix for an older regression, related to Intel BTS, LBR and PT feature interaction. On the tooling side there are three new tools / major features: - The new 'perf c2c' tool provides means for Shared Data C2C/HITM analysis. This allows you to track down cacheline contention. The tool is based on x86's load latency and precise store facility events provided by Intel CPUs. It was tested by Joe Mario and has proven to be useful, finding some cacheline contentions. Joe also wrote a blog about c2c tool with examples: https://joemario.github.io/blog/2016/09/01/c2c-blog/ excerpt of the content on this site: At a high level, “perf c2c” will show you: * The cachelines where false sharing was detected. * The readers and writers to those cachelines, and the offsets where those accesses occurred. * The pid, tid, instruction addr, function name, binary object name for those readers and writers. * The source file and line number for each reader and writer. * The average load latency for the loads to those cachelines. * Which numa nodes the samples a cacheline came from and which CPUs were involved. Using perf c2c is similar to using the Linux perf tool today. First collect data with “perf c2c record”, then generate a report output with “perf c2c report” There one finds extensive details on using the tool, with tips on reducing the volume of samples while still capturing enough to do its job. (Dick Fowles, Joe Mario, Don Zickus, Jiri Olsa) - The new 'perf sched timehist' tool provides tailored analysis of scheduling events. Example usage: perf sched record -- sleep 1 perf sched timehist By default it shows the individual schedule events, including the wait time (time between sched-out and next sched-in events for the task), the task scheduling delay (time between wakeup and actually running) and run time for the task: time cpu task name wait time sch delay run time [tid/pid] (msec) (msec) (msec) -------- ------ ---------------- --------- --------- -------- 1.874569 [0011] gcc[31949] 0.014 0.000 1.148 1.874591 [0010] gcc[31951] 0.000 0.000 0.024 1.874603 [0010] migration/10[59] 3.350 0.004 0.011 1.874604 [0011] <idle> 1.148 0.000 0.035 1.874723 [0005] <idle> 0.016 0.000 1.383 1.874746 [0005] gcc[31949] 0.153 0.078 0.022 ... Times are in msec.usec. (David Ahern, Namhyung Kim) - Add CPU vendor hardware event tables: Add JSON files with vendor event naming for Intel and Power8 processors, allowing users of tools like oprofile to keep using the event names they are used to, as well as people reading vendor documentation, where such naming is used. (Andi Kleen, Sukadev Bhattiprolu) You should see all the new events with 'perf list' and you should be able to search them, for example 'perf list miss' will list all the myriads of miss events. Other tooling features added were: - Cross-arch annotation support: o Improve ARM support in the annotation code, affecting 'perf annotate', 'perf report' and live annotation in 'perf top' (Kim Phillips) o Initial support for PowerPC in the annotation code (Ravi Bangoria) o Support AArch64 in the 'annotate' code, native/local and cross-arch/remote (Kim Phillips) - Allow considering just events in a given time interval, via the '--time start.s.ms,end.s.ms' command line, added to 'perf kmem', 'perf report', 'perf sched timehist' and 'perf script' (David Ahern) - Add option to stop printing a callchain at one of a given group of symbol names (David Ahern) - Track memory freed in 'perf kmem stat' (David Ahern) - Allow querying and setting .perfconfig variables (Taeung Song) - Show branch information in callchains (predicted, TSX aborts, loop iteractions, etc) (Jin Yao) - Dynamicly change verbosity level by pressing 'V' in the 'perf top/report' hists TUI browser (Alexis Berlemont) - Implement 'perf trace --delay' in the same fashion as in 'perf record --delay', to skip sampling workload initialization events (Alexis Berlemont) - Make vendor named events case insensitive in 'perf list', i.e. 'perf list LONGEST_LAT' works just the same as 'perf list longest_lat' (Andi Kleen) - Add unwinding support for jitdump (Stefano Sanfilippo) Tooling infrastructure changes: - Support linking perf with clang and LLVM libraries, initially statically, but this limitation will be lifted and shared libraries, when available, will be preferred to the static build, that should, as with other features, be enabled explicitly (Wang Nan) - Add initial support (and perf test entry) for tooling hooks, starting with 'record_start' and 'record_end', that will have as its initial user the eBPF infrastructure, where perf_ prefixed functions will be JITed and run when such hooks are called (Wang Nan) - Implement assorted libbpf improvements (Wang Nan)" ... and lots of other changes, features, cleanups and refactorings I did not list, see the shortlog and the git log for details" * 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (220 commits) perf/x86: Fix exclusion of BTS and LBR for Goldmont perf tools: Explicitly document that --children is enabled by default perf sched timehist: Cleanup idle_max_cpu handling perf sched timehist: Handle zero sample->tid properly perf callchain: Introduce callchain_cursor__copy() perf sched: Cleanup option processing perf sched timehist: Improve error message when analyzing wrong file perf tools: Move perf build related variables under non fixdep leg perf tools: Force fixdep compilation at the start of the build perf tools: Move PERF-VERSION-FILE target into rules area perf build: Check LLVM version in feature check perf annotate: Show raw form for jump instruction with indirect target perf tools: Add non config targets perf tools: Cleanup build directory before each test perf tools: Move python/perf.so target into rules area perf tools: Move install-gtk target into rules area tools build: Move tabs to spaces where suitable tools build: Make the .cmd file more readable perf clang: Compile BPF script using builtin clang support perf clang: Support compile IR to BPF object and add testcase ...
This commit is contained in:
commit
bca13ce455
@ -365,7 +365,11 @@ int x86_add_exclusive(unsigned int what)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (x86_pmu.lbr_pt_coexist)
|
||||
/*
|
||||
* When lbr_pt_coexist we allow PT to coexist with either LBR or BTS.
|
||||
* LBR and BTS are still mutually exclusive.
|
||||
*/
|
||||
if (x86_pmu.lbr_pt_coexist && what == x86_lbr_exclusive_pt)
|
||||
return 0;
|
||||
|
||||
if (!atomic_inc_not_zero(&x86_pmu.lbr_exclusive[what])) {
|
||||
@ -388,7 +392,7 @@ fail_unlock:
|
||||
|
||||
void x86_del_exclusive(unsigned int what)
|
||||
{
|
||||
if (x86_pmu.lbr_pt_coexist)
|
||||
if (x86_pmu.lbr_pt_coexist && what == x86_lbr_exclusive_pt)
|
||||
return;
|
||||
|
||||
atomic_dec(&x86_pmu.lbr_exclusive[what]);
|
||||
|
@ -604,7 +604,7 @@ struct x86_pmu {
|
||||
u64 lbr_sel_mask; /* LBR_SELECT valid bits */
|
||||
const int *lbr_sel_map; /* lbr_select mappings */
|
||||
bool lbr_double_abort; /* duplicated lbr aborts */
|
||||
bool lbr_pt_coexist; /* LBR may coexist with PT */
|
||||
bool lbr_pt_coexist; /* (LBR|BTS) may coexist with PT */
|
||||
|
||||
/*
|
||||
* Intel PT/LBR/BTS are exclusive
|
||||
|
@ -65,22 +65,22 @@ dep-cmd = $(if $(wildcard $(fixdep)),
|
||||
printf '\# cannot find fixdep (%s)\n' $(fixdep) > $(dot-target).cmd; \
|
||||
printf '\# using basic dep data\n\n' >> $(dot-target).cmd; \
|
||||
cat $(depfile) >> $(dot-target).cmd; \
|
||||
printf '%s\n' 'cmd_$@ := $(make-cmd)' >> $(dot-target).cmd)
|
||||
printf '\n%s\n' 'cmd_$@ := $(make-cmd)' >> $(dot-target).cmd)
|
||||
|
||||
###
|
||||
# if_changed_dep - execute command if any prerequisite is newer than
|
||||
# target, or command line has changed and update
|
||||
# dependencies in the cmd file
|
||||
if_changed_dep = $(if $(strip $(any-prereq) $(arg-check)), \
|
||||
@set -e; \
|
||||
$(echo-cmd) $(cmd_$(1)) && $(dep-cmd))
|
||||
@set -e; \
|
||||
$(echo-cmd) $(cmd_$(1)) && $(dep-cmd))
|
||||
|
||||
# if_changed - execute command if any prerequisite is newer than
|
||||
# target, or command line has changed
|
||||
if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
|
||||
@set -e; \
|
||||
$(echo-cmd) $(cmd_$(1)); \
|
||||
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
|
||||
if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
|
||||
@set -e; \
|
||||
$(echo-cmd) $(cmd_$(1)); \
|
||||
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
|
||||
|
||||
###
|
||||
# C flags to be used in rule definitions, includes:
|
||||
@ -89,10 +89,12 @@ if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
|
||||
# - per target C flags
|
||||
# - per object C flags
|
||||
# - BUILD_STR macro to allow '-D"$(variable)"' constructs
|
||||
c_flags = -Wp,-MD,$(depfile),-MT,$@ $(CFLAGS) -D"BUILD_STR(s)=\#s" $(CFLAGS_$(basetarget).o) $(CFLAGS_$(obj))
|
||||
cxx_flags = -Wp,-MD,$(depfile),-MT,$@ $(CXXFLAGS) -D"BUILD_STR(s)=\#s" $(CXXFLAGS_$(basetarget).o) $(CXXFLAGS_$(obj))
|
||||
c_flags_1 = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CFLAGS) -D"BUILD_STR(s)=\#s" $(CFLAGS_$(basetarget).o) $(CFLAGS_$(obj))
|
||||
c_flags_2 = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(c_flags_1))
|
||||
c_flags = $(filter-out $(CFLAGS_REMOVE_$(obj)), $(c_flags_2))
|
||||
cxx_flags = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CXXFLAGS) -D"BUILD_STR(s)=\#s" $(CXXFLAGS_$(basetarget).o) $(CXXFLAGS_$(obj))
|
||||
|
||||
###
|
||||
## HOSTCC C flags
|
||||
|
||||
host_c_flags = -Wp,-MD,$(depfile),-MT,$@ $(CHOSTFLAGS) -D"BUILD_STR(s)=\#s" $(CHOSTFLAGS_$(basetarget).o) $(CHOSTFLAGS_$(obj))
|
||||
host_c_flags = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CHOSTFLAGS) -D"BUILD_STR(s)=\#s" $(CHOSTFLAGS_$(basetarget).o) $(CHOSTFLAGS_$(obj))
|
||||
|
@ -135,8 +135,10 @@ CFLAGS
|
||||
|
||||
It's possible to alter the standard object C flags in the following way:
|
||||
|
||||
CFLAGS_perf.o += '...' - alters CFLAGS for perf.o object
|
||||
CFLAGS_gtk += '...' - alters CFLAGS for gtk build object
|
||||
CFLAGS_perf.o += '...' - adds CFLAGS for perf.o object
|
||||
CFLAGS_gtk += '...' - adds CFLAGS for gtk build object
|
||||
CFLAGS_REMOVE_perf.o += '...' - removes CFLAGS for perf.o object
|
||||
CFLAGS_REMOVE_gtk += '...' - removes CFLAGS for gtk build object
|
||||
|
||||
This C flags changes has the scope of the Build makefile they are defined in.
|
||||
|
||||
|
@ -27,58 +27,58 @@ endef
|
||||
# the rule that uses them - an example for that is the 'bionic'
|
||||
# feature check. ]
|
||||
#
|
||||
FEATURE_TESTS_BASIC := \
|
||||
backtrace \
|
||||
dwarf \
|
||||
dwarf_getlocations \
|
||||
fortify-source \
|
||||
sync-compare-and-swap \
|
||||
glibc \
|
||||
gtk2 \
|
||||
gtk2-infobar \
|
||||
libaudit \
|
||||
libbfd \
|
||||
libelf \
|
||||
libelf-getphdrnum \
|
||||
libelf-gelf_getnote \
|
||||
libelf-getshdrstrndx \
|
||||
libelf-mmap \
|
||||
libnuma \
|
||||
numa_num_possible_cpus \
|
||||
libperl \
|
||||
libpython \
|
||||
libpython-version \
|
||||
libslang \
|
||||
libcrypto \
|
||||
libunwind \
|
||||
libunwind-x86 \
|
||||
libunwind-x86_64 \
|
||||
libunwind-arm \
|
||||
libunwind-aarch64 \
|
||||
pthread-attr-setaffinity-np \
|
||||
stackprotector-all \
|
||||
timerfd \
|
||||
libdw-dwarf-unwind \
|
||||
zlib \
|
||||
lzma \
|
||||
get_cpuid \
|
||||
bpf \
|
||||
sdt
|
||||
FEATURE_TESTS_BASIC := \
|
||||
backtrace \
|
||||
dwarf \
|
||||
dwarf_getlocations \
|
||||
fortify-source \
|
||||
sync-compare-and-swap \
|
||||
glibc \
|
||||
gtk2 \
|
||||
gtk2-infobar \
|
||||
libaudit \
|
||||
libbfd \
|
||||
libelf \
|
||||
libelf-getphdrnum \
|
||||
libelf-gelf_getnote \
|
||||
libelf-getshdrstrndx \
|
||||
libelf-mmap \
|
||||
libnuma \
|
||||
numa_num_possible_cpus \
|
||||
libperl \
|
||||
libpython \
|
||||
libpython-version \
|
||||
libslang \
|
||||
libcrypto \
|
||||
libunwind \
|
||||
libunwind-x86 \
|
||||
libunwind-x86_64 \
|
||||
libunwind-arm \
|
||||
libunwind-aarch64 \
|
||||
pthread-attr-setaffinity-np \
|
||||
stackprotector-all \
|
||||
timerfd \
|
||||
libdw-dwarf-unwind \
|
||||
zlib \
|
||||
lzma \
|
||||
get_cpuid \
|
||||
bpf \
|
||||
sdt
|
||||
|
||||
# FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list
|
||||
# of all feature tests
|
||||
FEATURE_TESTS_EXTRA := \
|
||||
bionic \
|
||||
compile-32 \
|
||||
compile-x32 \
|
||||
cplus-demangle \
|
||||
hello \
|
||||
libbabeltrace \
|
||||
liberty \
|
||||
liberty-z \
|
||||
libunwind-debug-frame \
|
||||
libunwind-debug-frame-arm \
|
||||
libunwind-debug-frame-aarch64
|
||||
FEATURE_TESTS_EXTRA := \
|
||||
bionic \
|
||||
compile-32 \
|
||||
compile-x32 \
|
||||
cplus-demangle \
|
||||
hello \
|
||||
libbabeltrace \
|
||||
liberty \
|
||||
liberty-z \
|
||||
libunwind-debug-frame \
|
||||
libunwind-debug-frame-arm \
|
||||
libunwind-debug-frame-aarch64
|
||||
|
||||
FEATURE_TESTS ?= $(FEATURE_TESTS_BASIC)
|
||||
|
||||
@ -86,26 +86,26 @@ ifeq ($(FEATURE_TESTS),all)
|
||||
FEATURE_TESTS := $(FEATURE_TESTS_BASIC) $(FEATURE_TESTS_EXTRA)
|
||||
endif
|
||||
|
||||
FEATURE_DISPLAY ?= \
|
||||
dwarf \
|
||||
dwarf_getlocations \
|
||||
glibc \
|
||||
gtk2 \
|
||||
libaudit \
|
||||
libbfd \
|
||||
libelf \
|
||||
libnuma \
|
||||
numa_num_possible_cpus \
|
||||
libperl \
|
||||
libpython \
|
||||
libslang \
|
||||
libcrypto \
|
||||
libunwind \
|
||||
libdw-dwarf-unwind \
|
||||
zlib \
|
||||
lzma \
|
||||
get_cpuid \
|
||||
bpf
|
||||
FEATURE_DISPLAY ?= \
|
||||
dwarf \
|
||||
dwarf_getlocations \
|
||||
glibc \
|
||||
gtk2 \
|
||||
libaudit \
|
||||
libbfd \
|
||||
libelf \
|
||||
libnuma \
|
||||
numa_num_possible_cpus \
|
||||
libperl \
|
||||
libpython \
|
||||
libslang \
|
||||
libcrypto \
|
||||
libunwind \
|
||||
libdw-dwarf-unwind \
|
||||
zlib \
|
||||
lzma \
|
||||
get_cpuid \
|
||||
bpf
|
||||
|
||||
# Set FEATURE_CHECK_(C|LD)FLAGS-all for all FEATURE_TESTS features.
|
||||
# If in the future we need per-feature checks/flags for features not
|
||||
|
@ -1,59 +1,61 @@
|
||||
FILES= \
|
||||
test-all.bin \
|
||||
test-backtrace.bin \
|
||||
test-bionic.bin \
|
||||
test-dwarf.bin \
|
||||
test-dwarf_getlocations.bin \
|
||||
test-fortify-source.bin \
|
||||
test-sync-compare-and-swap.bin \
|
||||
test-glibc.bin \
|
||||
test-gtk2.bin \
|
||||
test-gtk2-infobar.bin \
|
||||
test-hello.bin \
|
||||
test-libaudit.bin \
|
||||
test-libbfd.bin \
|
||||
test-liberty.bin \
|
||||
test-liberty-z.bin \
|
||||
test-cplus-demangle.bin \
|
||||
test-libelf.bin \
|
||||
test-libelf-getphdrnum.bin \
|
||||
test-libelf-gelf_getnote.bin \
|
||||
test-libelf-getshdrstrndx.bin \
|
||||
test-libelf-mmap.bin \
|
||||
test-libnuma.bin \
|
||||
test-numa_num_possible_cpus.bin \
|
||||
test-libperl.bin \
|
||||
test-libpython.bin \
|
||||
test-libpython-version.bin \
|
||||
test-libslang.bin \
|
||||
test-libcrypto.bin \
|
||||
test-libunwind.bin \
|
||||
test-libunwind-debug-frame.bin \
|
||||
test-libunwind-x86.bin \
|
||||
test-libunwind-x86_64.bin \
|
||||
test-libunwind-arm.bin \
|
||||
test-libunwind-aarch64.bin \
|
||||
test-libunwind-debug-frame-arm.bin \
|
||||
test-libunwind-debug-frame-aarch64.bin \
|
||||
test-pthread-attr-setaffinity-np.bin \
|
||||
test-stackprotector-all.bin \
|
||||
test-timerfd.bin \
|
||||
test-libdw-dwarf-unwind.bin \
|
||||
test-libbabeltrace.bin \
|
||||
test-compile-32.bin \
|
||||
test-compile-x32.bin \
|
||||
test-zlib.bin \
|
||||
test-lzma.bin \
|
||||
test-bpf.bin \
|
||||
test-get_cpuid.bin \
|
||||
test-sdt.bin \
|
||||
test-cxx.bin
|
||||
FILES= \
|
||||
test-all.bin \
|
||||
test-backtrace.bin \
|
||||
test-bionic.bin \
|
||||
test-dwarf.bin \
|
||||
test-dwarf_getlocations.bin \
|
||||
test-fortify-source.bin \
|
||||
test-sync-compare-and-swap.bin \
|
||||
test-glibc.bin \
|
||||
test-gtk2.bin \
|
||||
test-gtk2-infobar.bin \
|
||||
test-hello.bin \
|
||||
test-libaudit.bin \
|
||||
test-libbfd.bin \
|
||||
test-liberty.bin \
|
||||
test-liberty-z.bin \
|
||||
test-cplus-demangle.bin \
|
||||
test-libelf.bin \
|
||||
test-libelf-getphdrnum.bin \
|
||||
test-libelf-gelf_getnote.bin \
|
||||
test-libelf-getshdrstrndx.bin \
|
||||
test-libelf-mmap.bin \
|
||||
test-libnuma.bin \
|
||||
test-numa_num_possible_cpus.bin \
|
||||
test-libperl.bin \
|
||||
test-libpython.bin \
|
||||
test-libpython-version.bin \
|
||||
test-libslang.bin \
|
||||
test-libcrypto.bin \
|
||||
test-libunwind.bin \
|
||||
test-libunwind-debug-frame.bin \
|
||||
test-libunwind-x86.bin \
|
||||
test-libunwind-x86_64.bin \
|
||||
test-libunwind-arm.bin \
|
||||
test-libunwind-aarch64.bin \
|
||||
test-libunwind-debug-frame-arm.bin \
|
||||
test-libunwind-debug-frame-aarch64.bin \
|
||||
test-pthread-attr-setaffinity-np.bin \
|
||||
test-stackprotector-all.bin \
|
||||
test-timerfd.bin \
|
||||
test-libdw-dwarf-unwind.bin \
|
||||
test-libbabeltrace.bin \
|
||||
test-compile-32.bin \
|
||||
test-compile-x32.bin \
|
||||
test-zlib.bin \
|
||||
test-lzma.bin \
|
||||
test-bpf.bin \
|
||||
test-get_cpuid.bin \
|
||||
test-sdt.bin \
|
||||
test-cxx.bin \
|
||||
test-jvmti.bin
|
||||
|
||||
FILES := $(addprefix $(OUTPUT),$(FILES))
|
||||
|
||||
CC := $(CROSS_COMPILE)gcc -MD
|
||||
CXX := $(CROSS_COMPILE)g++ -MD
|
||||
PKG_CONFIG := $(CROSS_COMPILE)pkg-config
|
||||
LLVM_CONFIG ?= llvm-config
|
||||
|
||||
all: $(FILES)
|
||||
|
||||
@ -225,6 +227,30 @@ $(OUTPUT)test-sdt.bin:
|
||||
$(OUTPUT)test-cxx.bin:
|
||||
$(BUILDXX) -std=gnu++11
|
||||
|
||||
$(OUTPUT)test-jvmti.bin:
|
||||
$(BUILD)
|
||||
|
||||
$(OUTPUT)test-llvm.bin:
|
||||
$(BUILDXX) -std=gnu++11 \
|
||||
-I$(shell $(LLVM_CONFIG) --includedir) \
|
||||
-L$(shell $(LLVM_CONFIG) --libdir) \
|
||||
$(shell $(LLVM_CONFIG) --libs Core BPF) \
|
||||
$(shell $(LLVM_CONFIG) --system-libs)
|
||||
|
||||
$(OUTPUT)test-llvm-version.bin:
|
||||
$(BUILDXX) -std=gnu++11 \
|
||||
-I$(shell $(LLVM_CONFIG) --includedir)
|
||||
|
||||
$(OUTPUT)test-clang.bin:
|
||||
$(BUILDXX) -std=gnu++11 \
|
||||
-I$(shell $(LLVM_CONFIG) --includedir) \
|
||||
-L$(shell $(LLVM_CONFIG) --libdir) \
|
||||
-Wl,--start-group -lclangBasic -lclangDriver \
|
||||
-lclangFrontend -lclangEdit -lclangLex \
|
||||
-lclangAST -Wl,--end-group \
|
||||
$(shell $(LLVM_CONFIG) --libs Core option) \
|
||||
$(shell $(LLVM_CONFIG) --system-libs)
|
||||
|
||||
-include $(OUTPUT)*.d
|
||||
|
||||
###############################
|
||||
|
21
tools/build/feature/test-clang.cpp
Normal file
21
tools/build/feature/test-clang.cpp
Normal file
@ -0,0 +1,21 @@
|
||||
#include "clang/Basic/VirtualFileSystem.h"
|
||||
#include "clang/Driver/Driver.h"
|
||||
#include "clang/Frontend/TextDiagnosticPrinter.h"
|
||||
#include "llvm/ADT/IntrusiveRefCntPtr.h"
|
||||
#include "llvm/Support/ManagedStatic.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
||||
using namespace clang;
|
||||
using namespace clang::driver;
|
||||
|
||||
int main()
|
||||
{
|
||||
IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
|
||||
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
|
||||
|
||||
DiagnosticsEngine Diags(DiagID, &*DiagOpts);
|
||||
Driver TheDriver("test", "bpf-pc-linux", Diags);
|
||||
|
||||
llvm::llvm_shutdown();
|
||||
return 0;
|
||||
}
|
13
tools/build/feature/test-jvmti.c
Normal file
13
tools/build/feature/test-jvmti.c
Normal file
@ -0,0 +1,13 @@
|
||||
#include <jvmti.h>
|
||||
#include <jvmticmlr.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
JavaVM jvm __attribute__((unused));
|
||||
jvmtiEventCallbacks cb __attribute__((unused));
|
||||
jvmtiCapabilities caps __attribute__((unused));
|
||||
jvmtiJlocationFormat format __attribute__((unused));
|
||||
jvmtiEnv jvmti __attribute__((unused));
|
||||
|
||||
return 0;
|
||||
}
|
11
tools/build/feature/test-llvm-version.cpp
Normal file
11
tools/build/feature/test-llvm-version.cpp
Normal file
@ -0,0 +1,11 @@
|
||||
#include <cstdio>
|
||||
#include "llvm/Config/llvm-config.h"
|
||||
|
||||
#define NUM_VERSION (((LLVM_VERSION_MAJOR) << 16) + (LLVM_VERSION_MINOR << 8) + LLVM_VERSION_PATCH)
|
||||
#define pass int main() {printf("%x\n", NUM_VERSION); return 0;}
|
||||
|
||||
#if NUM_VERSION >= 0x030900
|
||||
pass
|
||||
#else
|
||||
# error This LLVM is not tested yet.
|
||||
#endif
|
13
tools/build/feature/test-llvm.cpp
Normal file
13
tools/build/feature/test-llvm.cpp
Normal file
@ -0,0 +1,13 @@
|
||||
#include "llvm/Support/ManagedStatic.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#define NUM_VERSION (((LLVM_VERSION_MAJOR) << 16) + (LLVM_VERSION_MINOR << 8) + LLVM_VERSION_PATCH)
|
||||
|
||||
#if NUM_VERSION < 0x030900
|
||||
# error "LLVM version too low"
|
||||
#endif
|
||||
int main()
|
||||
{
|
||||
llvm::errs() << "Hello World!\n";
|
||||
llvm::llvm_shutdown();
|
||||
return 0;
|
||||
}
|
@ -49,7 +49,7 @@ static void parse_dep_file(void *map, size_t len)
|
||||
char *end = m + len;
|
||||
char *p;
|
||||
char s[PATH_MAX];
|
||||
int is_target;
|
||||
int is_target, has_target = 0;
|
||||
int saw_any_target = 0;
|
||||
int is_first_dep = 0;
|
||||
|
||||
@ -67,7 +67,8 @@ static void parse_dep_file(void *map, size_t len)
|
||||
if (is_target) {
|
||||
/* The /next/ file is the first dependency */
|
||||
is_first_dep = 1;
|
||||
} else {
|
||||
has_target = 1;
|
||||
} else if (has_target) {
|
||||
/* Save this token/filename */
|
||||
memcpy(s, m, p-m);
|
||||
s[p - m] = 0;
|
||||
|
@ -13,6 +13,7 @@
|
||||
*/
|
||||
|
||||
#include <asm-generic/bitops/__ffs.h>
|
||||
#include <asm-generic/bitops/__ffz.h>
|
||||
#include <asm-generic/bitops/fls.h>
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
|
12
tools/include/asm-generic/bitops/__ffz.h
Normal file
12
tools/include/asm-generic/bitops/__ffz.h
Normal file
@ -0,0 +1,12 @@
|
||||
#ifndef _ASM_GENERIC_BITOPS_FFZ_H_
|
||||
#define _ASM_GENERIC_BITOPS_FFZ_H_
|
||||
|
||||
/*
|
||||
* ffz - find first zero in word.
|
||||
* @word: The word to search
|
||||
*
|
||||
* Undefined if no zero exists, so code should check against ~0UL first.
|
||||
*/
|
||||
#define ffz(x) __ffs(~(x))
|
||||
|
||||
#endif /* _ASM_GENERIC_BITOPS_FFZ_H_ */
|
@ -15,6 +15,21 @@ extern unsigned long find_next_bit(const unsigned long *addr, unsigned long
|
||||
size, unsigned long offset);
|
||||
#endif
|
||||
|
||||
#ifndef find_next_zero_bit
|
||||
|
||||
/**
|
||||
* find_next_zero_bit - find the next cleared bit in a memory region
|
||||
* @addr: The address to base the search on
|
||||
* @offset: The bitnumber to start searching at
|
||||
* @size: The bitmap size in bits
|
||||
*
|
||||
* Returns the bit number of the next zero bit
|
||||
* If no bits are zero, returns @size.
|
||||
*/
|
||||
unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size,
|
||||
unsigned long offset);
|
||||
#endif
|
||||
|
||||
#ifndef find_first_bit
|
||||
|
||||
/**
|
||||
@ -30,4 +45,17 @@ extern unsigned long find_first_bit(const unsigned long *addr,
|
||||
|
||||
#endif /* find_first_bit */
|
||||
|
||||
#ifndef find_first_zero_bit
|
||||
|
||||
/**
|
||||
* find_first_zero_bit - find the first cleared bit in a memory region
|
||||
* @addr: The address to start the search at
|
||||
* @size: The maximum number of bits to search
|
||||
*
|
||||
* Returns the bit number of the first cleared bit.
|
||||
* If no bits are zero, returns @size.
|
||||
*/
|
||||
unsigned long find_first_zero_bit(const unsigned long *addr, unsigned long size);
|
||||
#endif
|
||||
|
||||
#endif /*_TOOLS_LINUX_ASM_GENERIC_BITOPS_FIND_H_ */
|
||||
|
@ -39,6 +39,11 @@ extern unsigned long __sw_hweight64(__u64 w);
|
||||
(bit) < (size); \
|
||||
(bit) = find_next_bit((addr), (size), (bit) + 1))
|
||||
|
||||
#define for_each_clear_bit(bit, addr, size) \
|
||||
for ((bit) = find_first_zero_bit((addr), (size)); \
|
||||
(bit) < (size); \
|
||||
(bit) = find_next_zero_bit((addr), (size), (bit) + 1))
|
||||
|
||||
/* same as for_each_set_bit() but use bit as value to start with */
|
||||
#define for_each_set_bit_from(bit, addr, size) \
|
||||
for ((bit) = find_next_bit((addr), (size), (bit)); \
|
||||
|
@ -72,4 +72,9 @@
|
||||
#define MAP_HUGE_SHIFT 26
|
||||
#define MAP_HUGE_MASK 0x3f
|
||||
|
||||
#define PKEY_DISABLE_ACCESS 0x1
|
||||
#define PKEY_DISABLE_WRITE 0x2
|
||||
#define PKEY_ACCESS_MASK (PKEY_DISABLE_ACCESS |\
|
||||
PKEY_DISABLE_WRITE)
|
||||
|
||||
#endif /* __ASM_GENERIC_MMAN_COMMON_H */
|
||||
|
@ -110,3 +110,59 @@ int bpf_map_update_elem(int fd, void *key, void *value,
|
||||
|
||||
return sys_bpf(BPF_MAP_UPDATE_ELEM, &attr, sizeof(attr));
|
||||
}
|
||||
|
||||
int bpf_map_lookup_elem(int fd, void *key, void *value)
|
||||
{
|
||||
union bpf_attr attr;
|
||||
|
||||
bzero(&attr, sizeof(attr));
|
||||
attr.map_fd = fd;
|
||||
attr.key = ptr_to_u64(key);
|
||||
attr.value = ptr_to_u64(value);
|
||||
|
||||
return sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr));
|
||||
}
|
||||
|
||||
int bpf_map_delete_elem(int fd, void *key)
|
||||
{
|
||||
union bpf_attr attr;
|
||||
|
||||
bzero(&attr, sizeof(attr));
|
||||
attr.map_fd = fd;
|
||||
attr.key = ptr_to_u64(key);
|
||||
|
||||
return sys_bpf(BPF_MAP_DELETE_ELEM, &attr, sizeof(attr));
|
||||
}
|
||||
|
||||
int bpf_map_get_next_key(int fd, void *key, void *next_key)
|
||||
{
|
||||
union bpf_attr attr;
|
||||
|
||||
bzero(&attr, sizeof(attr));
|
||||
attr.map_fd = fd;
|
||||
attr.key = ptr_to_u64(key);
|
||||
attr.next_key = ptr_to_u64(next_key);
|
||||
|
||||
return sys_bpf(BPF_MAP_GET_NEXT_KEY, &attr, sizeof(attr));
|
||||
}
|
||||
|
||||
int bpf_obj_pin(int fd, const char *pathname)
|
||||
{
|
||||
union bpf_attr attr;
|
||||
|
||||
bzero(&attr, sizeof(attr));
|
||||
attr.pathname = ptr_to_u64((void *)pathname);
|
||||
attr.bpf_fd = fd;
|
||||
|
||||
return sys_bpf(BPF_OBJ_PIN, &attr, sizeof(attr));
|
||||
}
|
||||
|
||||
int bpf_obj_get(const char *pathname)
|
||||
{
|
||||
union bpf_attr attr;
|
||||
|
||||
bzero(&attr, sizeof(attr));
|
||||
attr.pathname = ptr_to_u64((void *)pathname);
|
||||
|
||||
return sys_bpf(BPF_OBJ_GET, &attr, sizeof(attr));
|
||||
}
|
||||
|
@ -35,4 +35,11 @@ int bpf_load_program(enum bpf_prog_type type, struct bpf_insn *insns,
|
||||
|
||||
int bpf_map_update_elem(int fd, void *key, void *value,
|
||||
u64 flags);
|
||||
|
||||
int bpf_map_lookup_elem(int fd, void *key, void *value);
|
||||
int bpf_map_delete_elem(int fd, void *key);
|
||||
int bpf_map_get_next_key(int fd, void *key, void *next_key);
|
||||
int bpf_obj_pin(int fd, const char *pathname);
|
||||
int bpf_obj_get(const char *pathname);
|
||||
|
||||
#endif
|
||||
|
@ -185,6 +185,7 @@ struct bpf_program {
|
||||
struct bpf_map {
|
||||
int fd;
|
||||
char *name;
|
||||
size_t offset;
|
||||
struct bpf_map_def def;
|
||||
void *priv;
|
||||
bpf_map_clear_priv_t clear_priv;
|
||||
@ -228,6 +229,10 @@ struct bpf_object {
|
||||
* all objects.
|
||||
*/
|
||||
struct list_head list;
|
||||
|
||||
void *priv;
|
||||
bpf_object_clear_priv_t clear_priv;
|
||||
|
||||
char path[];
|
||||
};
|
||||
#define obj_elf_valid(o) ((o)->efile.elf)
|
||||
@ -513,20 +518,83 @@ bpf_object__init_kversion(struct bpf_object *obj,
|
||||
}
|
||||
|
||||
static int
|
||||
bpf_object__init_maps(struct bpf_object *obj, void *data,
|
||||
size_t size)
|
||||
bpf_object__validate_maps(struct bpf_object *obj)
|
||||
{
|
||||
size_t nr_maps;
|
||||
int i;
|
||||
|
||||
nr_maps = size / sizeof(struct bpf_map_def);
|
||||
if (!data || !nr_maps) {
|
||||
pr_debug("%s doesn't need map definition\n",
|
||||
obj->path);
|
||||
/*
|
||||
* If there's only 1 map, the only error case should have been
|
||||
* catched in bpf_object__init_maps().
|
||||
*/
|
||||
if (!obj->maps || !obj->nr_maps || (obj->nr_maps == 1))
|
||||
return 0;
|
||||
|
||||
for (i = 1; i < obj->nr_maps; i++) {
|
||||
const struct bpf_map *a = &obj->maps[i - 1];
|
||||
const struct bpf_map *b = &obj->maps[i];
|
||||
|
||||
if (b->offset - a->offset < sizeof(struct bpf_map_def)) {
|
||||
pr_warning("corrupted map section in %s: map \"%s\" too small\n",
|
||||
obj->path, a->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int compare_bpf_map(const void *_a, const void *_b)
|
||||
{
|
||||
const struct bpf_map *a = _a;
|
||||
const struct bpf_map *b = _b;
|
||||
|
||||
return a->offset - b->offset;
|
||||
}
|
||||
|
||||
static int
|
||||
bpf_object__init_maps(struct bpf_object *obj)
|
||||
{
|
||||
int i, map_idx, nr_maps = 0;
|
||||
Elf_Scn *scn;
|
||||
Elf_Data *data;
|
||||
Elf_Data *symbols = obj->efile.symbols;
|
||||
|
||||
if (obj->efile.maps_shndx < 0)
|
||||
return -EINVAL;
|
||||
if (!symbols)
|
||||
return -EINVAL;
|
||||
|
||||
scn = elf_getscn(obj->efile.elf, obj->efile.maps_shndx);
|
||||
if (scn)
|
||||
data = elf_getdata(scn, NULL);
|
||||
if (!scn || !data) {
|
||||
pr_warning("failed to get Elf_Data from map section %d\n",
|
||||
obj->efile.maps_shndx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pr_debug("maps in %s: %zd bytes\n", obj->path, size);
|
||||
/*
|
||||
* Count number of maps. Each map has a name.
|
||||
* Array of maps is not supported: only the first element is
|
||||
* considered.
|
||||
*
|
||||
* TODO: Detect array of map and report error.
|
||||
*/
|
||||
for (i = 0; i < symbols->d_size / sizeof(GElf_Sym); i++) {
|
||||
GElf_Sym sym;
|
||||
|
||||
if (!gelf_getsym(symbols, i, &sym))
|
||||
continue;
|
||||
if (sym.st_shndx != obj->efile.maps_shndx)
|
||||
continue;
|
||||
nr_maps++;
|
||||
}
|
||||
|
||||
/* Alloc obj->maps and fill nr_maps. */
|
||||
pr_debug("maps in %s: %d maps in %zd bytes\n", obj->path,
|
||||
nr_maps, data->d_size);
|
||||
|
||||
if (!nr_maps)
|
||||
return 0;
|
||||
|
||||
obj->maps = calloc(nr_maps, sizeof(obj->maps[0]));
|
||||
if (!obj->maps) {
|
||||
@ -535,35 +603,21 @@ bpf_object__init_maps(struct bpf_object *obj, void *data,
|
||||
}
|
||||
obj->nr_maps = nr_maps;
|
||||
|
||||
for (i = 0; i < nr_maps; i++) {
|
||||
struct bpf_map_def *def = &obj->maps[i].def;
|
||||
|
||||
/*
|
||||
* fill all fd with -1 so won't close incorrect
|
||||
* fd (fd=0 is stdin) when failure (zclose won't close
|
||||
* negative fd)).
|
||||
*/
|
||||
/*
|
||||
* fill all fd with -1 so won't close incorrect
|
||||
* fd (fd=0 is stdin) when failure (zclose won't close
|
||||
* negative fd)).
|
||||
*/
|
||||
for (i = 0; i < nr_maps; i++)
|
||||
obj->maps[i].fd = -1;
|
||||
|
||||
/* Save map definition into obj->maps */
|
||||
*def = ((struct bpf_map_def *)data)[i];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bpf_object__init_maps_name(struct bpf_object *obj)
|
||||
{
|
||||
int i;
|
||||
Elf_Data *symbols = obj->efile.symbols;
|
||||
|
||||
if (!symbols || obj->efile.maps_shndx < 0)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < symbols->d_size / sizeof(GElf_Sym); i++) {
|
||||
/*
|
||||
* Fill obj->maps using data in "maps" section.
|
||||
*/
|
||||
for (i = 0, map_idx = 0; i < symbols->d_size / sizeof(GElf_Sym); i++) {
|
||||
GElf_Sym sym;
|
||||
size_t map_idx;
|
||||
const char *map_name;
|
||||
struct bpf_map_def *def;
|
||||
|
||||
if (!gelf_getsym(symbols, i, &sym))
|
||||
continue;
|
||||
@ -573,21 +627,27 @@ bpf_object__init_maps_name(struct bpf_object *obj)
|
||||
map_name = elf_strptr(obj->efile.elf,
|
||||
obj->efile.strtabidx,
|
||||
sym.st_name);
|
||||
map_idx = sym.st_value / sizeof(struct bpf_map_def);
|
||||
if (map_idx >= obj->nr_maps) {
|
||||
pr_warning("index of map \"%s\" is buggy: %zu > %zu\n",
|
||||
map_name, map_idx, obj->nr_maps);
|
||||
continue;
|
||||
obj->maps[map_idx].offset = sym.st_value;
|
||||
if (sym.st_value + sizeof(struct bpf_map_def) > data->d_size) {
|
||||
pr_warning("corrupted maps section in %s: last map \"%s\" too small\n",
|
||||
obj->path, map_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
obj->maps[map_idx].name = strdup(map_name);
|
||||
if (!obj->maps[map_idx].name) {
|
||||
pr_warning("failed to alloc map name\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
pr_debug("map %zu is \"%s\"\n", map_idx,
|
||||
pr_debug("map %d is \"%s\"\n", map_idx,
|
||||
obj->maps[map_idx].name);
|
||||
def = (struct bpf_map_def *)(data->d_buf + sym.st_value);
|
||||
obj->maps[map_idx].def = *def;
|
||||
map_idx++;
|
||||
}
|
||||
return 0;
|
||||
|
||||
qsort(obj->maps, obj->nr_maps, sizeof(obj->maps[0]), compare_bpf_map);
|
||||
return bpf_object__validate_maps(obj);
|
||||
}
|
||||
|
||||
static int bpf_object__elf_collect(struct bpf_object *obj)
|
||||
@ -645,11 +705,9 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
|
||||
err = bpf_object__init_kversion(obj,
|
||||
data->d_buf,
|
||||
data->d_size);
|
||||
else if (strcmp(name, "maps") == 0) {
|
||||
err = bpf_object__init_maps(obj, data->d_buf,
|
||||
data->d_size);
|
||||
else if (strcmp(name, "maps") == 0)
|
||||
obj->efile.maps_shndx = idx;
|
||||
} else if (sh.sh_type == SHT_SYMTAB) {
|
||||
else if (sh.sh_type == SHT_SYMTAB) {
|
||||
if (obj->efile.symbols) {
|
||||
pr_warning("bpf: multiple SYMTAB in %s\n",
|
||||
obj->path);
|
||||
@ -698,7 +756,7 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
|
||||
return LIBBPF_ERRNO__FORMAT;
|
||||
}
|
||||
if (obj->efile.maps_shndx >= 0)
|
||||
err = bpf_object__init_maps_name(obj);
|
||||
err = bpf_object__init_maps(obj);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
@ -807,7 +865,7 @@ bpf_object__create_maps(struct bpf_object *obj)
|
||||
zclose(obj->maps[j].fd);
|
||||
return err;
|
||||
}
|
||||
pr_debug("create map: fd=%d\n", *pfd);
|
||||
pr_debug("create map %s: fd=%d\n", obj->maps[i].name, *pfd);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -1175,6 +1233,9 @@ void bpf_object__close(struct bpf_object *obj)
|
||||
if (!obj)
|
||||
return;
|
||||
|
||||
if (obj->clear_priv)
|
||||
obj->clear_priv(obj, obj->priv);
|
||||
|
||||
bpf_object__elf_finish(obj);
|
||||
bpf_object__unload(obj);
|
||||
|
||||
@ -1228,6 +1289,22 @@ unsigned int bpf_object__kversion(struct bpf_object *obj)
|
||||
return obj ? obj->kern_version : 0;
|
||||
}
|
||||
|
||||
int bpf_object__set_priv(struct bpf_object *obj, void *priv,
|
||||
bpf_object_clear_priv_t clear_priv)
|
||||
{
|
||||
if (obj->priv && obj->clear_priv)
|
||||
obj->clear_priv(obj, obj->priv);
|
||||
|
||||
obj->priv = priv;
|
||||
obj->clear_priv = clear_priv;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *bpf_object__priv(struct bpf_object *obj)
|
||||
{
|
||||
return obj ? obj->priv : ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
struct bpf_program *
|
||||
bpf_program__next(struct bpf_program *prev, struct bpf_object *obj)
|
||||
{
|
||||
@ -1447,3 +1524,15 @@ bpf_object__find_map_by_name(struct bpf_object *obj, const char *name)
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct bpf_map *
|
||||
bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < obj->nr_maps; i++) {
|
||||
if (obj->maps[i].offset == offset)
|
||||
return &obj->maps[i];
|
||||
}
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <linux/err.h>
|
||||
#include <sys/types.h> // for size_t
|
||||
|
||||
enum libbpf_errno {
|
||||
__LIBBPF_ERRNO__START = 4000,
|
||||
@ -79,6 +80,11 @@ struct bpf_object *bpf_object__next(struct bpf_object *prev);
|
||||
(pos) != NULL; \
|
||||
(pos) = (tmp), (tmp) = bpf_object__next(tmp))
|
||||
|
||||
typedef void (*bpf_object_clear_priv_t)(struct bpf_object *, void *);
|
||||
int bpf_object__set_priv(struct bpf_object *obj, void *priv,
|
||||
bpf_object_clear_priv_t clear_priv);
|
||||
void *bpf_object__priv(struct bpf_object *prog);
|
||||
|
||||
/* Accessors of bpf_program. */
|
||||
struct bpf_program;
|
||||
struct bpf_program *bpf_program__next(struct bpf_program *prog,
|
||||
@ -195,6 +201,13 @@ struct bpf_map;
|
||||
struct bpf_map *
|
||||
bpf_object__find_map_by_name(struct bpf_object *obj, const char *name);
|
||||
|
||||
/*
|
||||
* Get bpf_map through the offset of corresponding struct bpf_map_def
|
||||
* in the bpf object file.
|
||||
*/
|
||||
struct bpf_map *
|
||||
bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset);
|
||||
|
||||
struct bpf_map *
|
||||
bpf_map__next(struct bpf_map *map, struct bpf_object *obj);
|
||||
#define bpf_map__for_each(pos, obj) \
|
||||
|
@ -82,3 +82,28 @@ unsigned long find_first_bit(const unsigned long *addr, unsigned long size)
|
||||
return size;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef find_first_zero_bit
|
||||
/*
|
||||
* Find the first cleared bit in a memory region.
|
||||
*/
|
||||
unsigned long find_first_zero_bit(const unsigned long *addr, unsigned long size)
|
||||
{
|
||||
unsigned long idx;
|
||||
|
||||
for (idx = 0; idx * BITS_PER_LONG < size; idx++) {
|
||||
if (addr[idx] != ~0UL)
|
||||
return min(idx * BITS_PER_LONG + ffz(addr[idx]), size);
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef find_next_zero_bit
|
||||
unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size,
|
||||
unsigned long offset)
|
||||
{
|
||||
return _find_next_bit(addr, size, offset, ~0UL);
|
||||
}
|
||||
#endif
|
||||
|
@ -314,12 +314,19 @@ static int get_value(struct parse_opt_ctx_t *p,
|
||||
|
||||
static int parse_short_opt(struct parse_opt_ctx_t *p, const struct option *options)
|
||||
{
|
||||
retry:
|
||||
for (; options->type != OPTION_END; options++) {
|
||||
if (options->short_name == *p->opt) {
|
||||
p->opt = p->opt[1] ? p->opt + 1 : NULL;
|
||||
return get_value(p, options, OPT_SHORT);
|
||||
}
|
||||
}
|
||||
|
||||
if (options->parent) {
|
||||
options = options->parent;
|
||||
goto retry;
|
||||
}
|
||||
|
||||
return -2;
|
||||
}
|
||||
|
||||
@ -333,6 +340,7 @@ static int parse_long_opt(struct parse_opt_ctx_t *p, const char *arg,
|
||||
if (!arg_end)
|
||||
arg_end = arg + strlen(arg);
|
||||
|
||||
retry:
|
||||
for (; options->type != OPTION_END; options++) {
|
||||
const char *rest;
|
||||
int flags = 0;
|
||||
@ -426,6 +434,12 @@ match:
|
||||
}
|
||||
if (abbrev_option)
|
||||
return get_value(p, abbrev_option, abbrev_flags);
|
||||
|
||||
if (options->parent) {
|
||||
options = options->parent;
|
||||
goto retry;
|
||||
}
|
||||
|
||||
return -2;
|
||||
}
|
||||
|
||||
|
@ -109,11 +109,13 @@ struct option {
|
||||
intptr_t defval;
|
||||
bool *set;
|
||||
void *data;
|
||||
const struct option *parent;
|
||||
};
|
||||
|
||||
#define check_vtype(v, type) ( BUILD_BUG_ON_ZERO(!__builtin_types_compatible_p(typeof(v), type)) + v )
|
||||
|
||||
#define OPT_END() { .type = OPTION_END }
|
||||
#define OPT_PARENT(p) { .type = OPTION_END, .parent = (p) }
|
||||
#define OPT_ARGUMENT(l, h) { .type = OPTION_ARGUMENT, .long_name = (l), .help = (h) }
|
||||
#define OPT_GROUP(h) { .type = OPTION_GROUP, .help = (h) }
|
||||
#define OPT_BIT(s, l, v, h, b) { .type = OPTION_BIT, .short_name = (s), .long_name = (l), .value = check_vtype(v, int *), .help = (h), .defval = (b) }
|
||||
|
@ -99,8 +99,6 @@ libdir_SQ = $(subst ','\'',$(libdir))
|
||||
libdir_relative_SQ = $(subst ','\'',$(libdir_relative))
|
||||
plugin_dir_SQ = $(subst ','\'',$(plugin_dir))
|
||||
|
||||
LIB_FILE = libtraceevent.a libtraceevent.so
|
||||
|
||||
CONFIG_INCLUDES =
|
||||
CONFIG_LIBS =
|
||||
CONFIG_FLAGS =
|
||||
@ -114,6 +112,9 @@ N =
|
||||
|
||||
EVENT_PARSE_VERSION = $(EP_VERSION).$(EP_PATCHLEVEL).$(EP_EXTRAVERSION)
|
||||
|
||||
LIB_TARGET = libtraceevent.a libtraceevent.so.$(EVENT_PARSE_VERSION)
|
||||
LIB_INSTALL = libtraceevent.a libtraceevent.so*
|
||||
|
||||
INCLUDES = -I. -I $(srctree)/tools/include $(CONFIG_INCLUDES)
|
||||
|
||||
# Set compile option CFLAGS
|
||||
@ -156,11 +157,11 @@ PLUGINS += plugin_cfg80211.so
|
||||
PLUGINS := $(addprefix $(OUTPUT),$(PLUGINS))
|
||||
PLUGINS_IN := $(PLUGINS:.so=-in.o)
|
||||
|
||||
TE_IN := $(OUTPUT)libtraceevent-in.o
|
||||
LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE))
|
||||
TE_IN := $(OUTPUT)libtraceevent-in.o
|
||||
LIB_TARGET := $(addprefix $(OUTPUT),$(LIB_TARGET))
|
||||
DYNAMIC_LIST_FILE := $(OUTPUT)libtraceevent-dynamic-list
|
||||
|
||||
CMD_TARGETS = $(LIB_FILE) $(PLUGINS) $(DYNAMIC_LIST_FILE)
|
||||
CMD_TARGETS = $(LIB_TARGET) $(PLUGINS) $(DYNAMIC_LIST_FILE)
|
||||
|
||||
TARGETS = $(CMD_TARGETS)
|
||||
|
||||
@ -171,8 +172,10 @@ all_cmd: $(CMD_TARGETS)
|
||||
$(TE_IN): force
|
||||
$(Q)$(MAKE) $(build)=libtraceevent
|
||||
|
||||
$(OUTPUT)libtraceevent.so: $(TE_IN)
|
||||
$(QUIET_LINK)$(CC) --shared $^ -o $@
|
||||
$(OUTPUT)libtraceevent.so.$(EVENT_PARSE_VERSION): $(TE_IN)
|
||||
$(QUIET_LINK)$(CC) --shared $^ -Wl,-soname,libtraceevent.so.$(EP_VERSION) -o $@
|
||||
@ln -sf $(@F) $(OUTPUT)libtraceevent.so
|
||||
@ln -sf $(@F) $(OUTPUT)libtraceevent.so.$(EP_VERSION)
|
||||
|
||||
$(OUTPUT)libtraceevent.a: $(TE_IN)
|
||||
$(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^
|
||||
@ -236,11 +239,15 @@ TAGS: force
|
||||
find . -name '*.[ch]' | xargs etags \
|
||||
--regex='/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/'
|
||||
|
||||
define do_install_mkdir
|
||||
if [ ! -d '$(DESTDIR_SQ)$1' ]; then \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$1'; \
|
||||
fi
|
||||
endef
|
||||
|
||||
define do_install
|
||||
if [ ! -d '$(DESTDIR_SQ)$2' ]; then \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2'; \
|
||||
fi; \
|
||||
$(INSTALL) $1 '$(DESTDIR_SQ)$2'
|
||||
$(call do_install_mkdir,$2); \
|
||||
$(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR_SQ)$2'
|
||||
endef
|
||||
|
||||
define do_install_plugins
|
||||
@ -257,13 +264,20 @@ define do_generate_dynamic_list_file
|
||||
endef
|
||||
|
||||
install_lib: all_cmd install_plugins
|
||||
$(call QUIET_INSTALL, $(LIB_FILE)) \
|
||||
$(call do_install,$(LIB_FILE),$(libdir_SQ))
|
||||
$(call QUIET_INSTALL, $(LIB_TARGET)) \
|
||||
$(call do_install_mkdir,$(libdir_SQ)); \
|
||||
cp -fpR $(LIB_INSTALL) $(DESTDIR)$(libdir_SQ)
|
||||
|
||||
install_plugins: $(PLUGINS)
|
||||
$(call QUIET_INSTALL, trace_plugins) \
|
||||
$(call do_install_plugins, $(PLUGINS))
|
||||
|
||||
install_headers:
|
||||
$(call QUIET_INSTALL, headers) \
|
||||
$(call do_install,event-parse.h,$(prefix)/include/traceevent,644); \
|
||||
$(call do_install,event-utils.h,$(prefix)/include/traceevent,644); \
|
||||
$(call do_install,kbuffer.h,$(prefix)/include/traceevent,644)
|
||||
|
||||
install: install_lib
|
||||
|
||||
clean:
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include <stdint.h>
|
||||
#include <limits.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/time64.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include "event-parse.h"
|
||||
@ -5191,17 +5192,43 @@ struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type
|
||||
}
|
||||
|
||||
/**
|
||||
* pevent_data_pid - parse the PID from raw data
|
||||
* pevent_data_pid - parse the PID from record
|
||||
* @pevent: a handle to the pevent
|
||||
* @rec: the record to parse
|
||||
*
|
||||
* This returns the PID from a raw data.
|
||||
* This returns the PID from a record.
|
||||
*/
|
||||
int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec)
|
||||
{
|
||||
return parse_common_pid(pevent, rec->data);
|
||||
}
|
||||
|
||||
/**
|
||||
* pevent_data_prempt_count - parse the preempt count from the record
|
||||
* @pevent: a handle to the pevent
|
||||
* @rec: the record to parse
|
||||
*
|
||||
* This returns the preempt count from a record.
|
||||
*/
|
||||
int pevent_data_prempt_count(struct pevent *pevent, struct pevent_record *rec)
|
||||
{
|
||||
return parse_common_pc(pevent, rec->data);
|
||||
}
|
||||
|
||||
/**
|
||||
* pevent_data_flags - parse the latency flags from the record
|
||||
* @pevent: a handle to the pevent
|
||||
* @rec: the record to parse
|
||||
*
|
||||
* This returns the latency flags from a record.
|
||||
*
|
||||
* Use trace_flag_type enum for the flags (see event-parse.h).
|
||||
*/
|
||||
int pevent_data_flags(struct pevent *pevent, struct pevent_record *rec)
|
||||
{
|
||||
return parse_common_flags(pevent, rec->data);
|
||||
}
|
||||
|
||||
/**
|
||||
* pevent_data_comm_from_pid - return the command line from PID
|
||||
* @pevent: a handle to the pevent
|
||||
@ -5424,8 +5451,8 @@ void pevent_print_event_time(struct pevent *pevent, struct trace_seq *s,
|
||||
use_usec_format = is_timestamp_in_us(pevent->trace_clock,
|
||||
use_trace_clock);
|
||||
if (use_usec_format) {
|
||||
secs = record->ts / NSECS_PER_SEC;
|
||||
nsecs = record->ts - secs * NSECS_PER_SEC;
|
||||
secs = record->ts / NSEC_PER_SEC;
|
||||
nsecs = record->ts - secs * NSEC_PER_SEC;
|
||||
}
|
||||
|
||||
if (pevent->latency_format) {
|
||||
@ -5437,10 +5464,10 @@ void pevent_print_event_time(struct pevent *pevent, struct trace_seq *s,
|
||||
usecs = nsecs;
|
||||
p = 9;
|
||||
} else {
|
||||
usecs = (nsecs + 500) / NSECS_PER_USEC;
|
||||
usecs = (nsecs + 500) / NSEC_PER_USEC;
|
||||
/* To avoid usecs larger than 1 sec */
|
||||
if (usecs >= 1000000) {
|
||||
usecs -= 1000000;
|
||||
if (usecs >= USEC_PER_SEC) {
|
||||
usecs -= USEC_PER_SEC;
|
||||
secs++;
|
||||
}
|
||||
p = 6;
|
||||
|
@ -172,9 +172,6 @@ struct pevent_plugin_option {
|
||||
#define PEVENT_PLUGIN_OPTIONS_NAME MAKE_STR(PEVENT_PLUGIN_OPTIONS)
|
||||
#define PEVENT_PLUGIN_ALIAS_NAME MAKE_STR(PEVENT_PLUGIN_ALIAS)
|
||||
|
||||
#define NSECS_PER_SEC 1000000000ULL
|
||||
#define NSECS_PER_USEC 1000ULL
|
||||
|
||||
enum format_flags {
|
||||
FIELD_IS_ARRAY = 1,
|
||||
FIELD_IS_POINTER = 2,
|
||||
@ -712,6 +709,8 @@ void pevent_data_lat_fmt(struct pevent *pevent,
|
||||
int pevent_data_type(struct pevent *pevent, struct pevent_record *rec);
|
||||
struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type);
|
||||
int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec);
|
||||
int pevent_data_prempt_count(struct pevent *pevent, struct pevent_record *rec);
|
||||
int pevent_data_flags(struct pevent *pevent, struct pevent_record *rec);
|
||||
const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid);
|
||||
struct cmdline;
|
||||
struct cmdline *pevent_data_pid_from_comm(struct pevent *pevent, const char *comm,
|
||||
|
@ -21,6 +21,7 @@ perf-y += builtin-inject.o
|
||||
perf-y += builtin-mem.o
|
||||
perf-y += builtin-data.o
|
||||
perf-y += builtin-version.o
|
||||
perf-y += builtin-c2c.o
|
||||
|
||||
perf-$(CONFIG_AUDIT) += builtin-trace.o
|
||||
perf-$(CONFIG_LIBELF) += builtin-probe.o
|
||||
|
@ -550,6 +550,18 @@ Unless /proc/sys/kernel/perf_event_paranoid is set to -1, unprivileged users
|
||||
have memory limits imposed upon them. That affects what buffer sizes they can
|
||||
have as outlined above.
|
||||
|
||||
The v4.2 kernel introduced support for a context switch metadata event,
|
||||
PERF_RECORD_SWITCH, which allows unprivileged users to see when their processes
|
||||
are scheduled out and in, just not by whom, which is left for the
|
||||
PERF_RECORD_SWITCH_CPU_WIDE, that is only accessible in system wide context,
|
||||
which in turn requires CAP_SYS_ADMIN.
|
||||
|
||||
Please see the 45ac1403f564 ("perf: Add PERF_RECORD_SWITCH to indicate context
|
||||
switches") commit, that introduces these metadata events for further info.
|
||||
|
||||
When working with kernels < v4.2, the following considerations must be taken,
|
||||
as the sched:sched_switch tracepoints will be used to receive such information:
|
||||
|
||||
Unless /proc/sys/kernel/perf_event_paranoid is set to -1, unprivileged users are
|
||||
not permitted to use tracepoints which means there is insufficient side-band
|
||||
information to decode Intel PT in per-cpu mode, and potentially workload-only
|
||||
@ -564,8 +576,11 @@ sched_switch tracepoint
|
||||
-----------------------
|
||||
|
||||
The sched_switch tracepoint is used to provide side-band data for Intel PT
|
||||
decoding. sched_switch events are automatically added. e.g. the second event
|
||||
shown below
|
||||
decoding in kernels where the PERF_RECORD_SWITCH metadata event isn't
|
||||
available.
|
||||
|
||||
The sched_switch events are automatically added. e.g. the second event shown
|
||||
below:
|
||||
|
||||
$ perf record -vv -e intel_pt//u uname
|
||||
------------------------------------------------------------
|
||||
|
170
tools/perf/Documentation/jitdump-specification.txt
Normal file
170
tools/perf/Documentation/jitdump-specification.txt
Normal file
@ -0,0 +1,170 @@
|
||||
JITDUMP specification version 2
|
||||
Last Revised: 09/15/2016
|
||||
Author: Stephane Eranian <eranian@gmail.com>
|
||||
|
||||
--------------------------------------------------------
|
||||
| Revision | Date | Description |
|
||||
--------------------------------------------------------
|
||||
| 1 | 09/07/2016 | Initial revision |
|
||||
--------------------------------------------------------
|
||||
| 2 | 09/15/2016 | Add JIT_CODE_UNWINDING_INFO |
|
||||
--------------------------------------------------------
|
||||
|
||||
|
||||
I/ Introduction
|
||||
|
||||
|
||||
This document describes the jitdump file format. The file is generated by Just-In-time compiler runtimes to save meta-data information about the generated code, such as address, size, and name of generated functions, the native code generated, the source line information. The data may then be used by performance tools, such as Linux perf to generate function and assembly level profiles.
|
||||
|
||||
The format is not specific to any particular programming language. It can be extended as need be.
|
||||
|
||||
The format of the file is binary. It is self-describing in terms of endianness and is portable across multiple processor architectures.
|
||||
|
||||
|
||||
II/ Overview of the format
|
||||
|
||||
|
||||
The format requires only sequential accesses, i.e., append only mode. The file starts with a fixed size file header describing the version of the specification, the endianness.
|
||||
|
||||
The header is followed by a series of records, each starting with a fixed size header describing the type of record and its size. It is, itself, followed by the payload for the record. Records can have a variable size even for a given type.
|
||||
|
||||
Each entry in the file is timestamped. All timestamps must use the same clock source. The CLOCK_MONOTONIC clock source is recommended.
|
||||
|
||||
|
||||
III/ Jitdump file header format
|
||||
|
||||
Each jitdump file starts with a fixed size header containing the following fields in order:
|
||||
|
||||
|
||||
* uint32_t magic : a magic number tagging the file type. The value is 4-byte long and represents the string "JiTD" in ASCII form. It is 0x4A695444 or 0x4454694a depending on the endianness. The field can be used to detect the endianness of the file
|
||||
* uint32_t version : a 4-byte value representing the format version. It is currently set to 2
|
||||
* uint32_t total_size: size in bytes of file header
|
||||
* uint32_t elf_mach : ELF architecture encoding (ELF e_machine value as specified in /usr/include/elf.h)
|
||||
* uint32_t pad1 : padding. Reserved for future use
|
||||
* uint32_t pid : JIT runtime process identification (OS specific)
|
||||
* uint64_t timestamp : timestamp of when the file was created
|
||||
* uint64_t flags : a bitmask of flags
|
||||
|
||||
The flags currently defined are as follows:
|
||||
* bit 0: JITDUMP_FLAGS_ARCH_TIMESTAMP : set if the jitdump file is using an architecture-specific timestamp clock source. For instance, on x86, one could use TSC directly
|
||||
|
||||
IV/ Record header
|
||||
|
||||
The file header is immediately followed by records. Each record starts with a fixed size header describing the record that follows.
|
||||
|
||||
The record header is specified in order as follows:
|
||||
* uint32_t id : a value identifying the record type (see below)
|
||||
* uint32_t total_size: the size in bytes of the record including the header.
|
||||
* uint64_t timestamp : a timestamp of when the record was created.
|
||||
|
||||
The following record types are defined:
|
||||
* Value 0 : JIT_CODE_LOAD : record describing a jitted function
|
||||
* Value 1 : JIT_CODE_MOVE : record describing an already jitted function which is moved
|
||||
* Value 2 : JIT_CODE_DEBUG_INFO: record describing the debug information for a jitted function
|
||||
* Value 3 : JIT_CODE_CLOSE : record marking the end of the jit runtime (optional)
|
||||
* Value 4 : JIT_CODE_UNWINDING_INFO: record describing a function unwinding information
|
||||
|
||||
The payload of the record must immediately follow the record header without padding.
|
||||
|
||||
V/ JIT_CODE_LOAD record
|
||||
|
||||
|
||||
The record has the following fields following the fixed-size record header in order:
|
||||
* uint32_t pid: OS process id of the runtime generating the jitted code
|
||||
* uint32_t tid: OS thread identification of the runtime thread generating the jitted code
|
||||
* uint64_t vma: virtual address of jitted code start
|
||||
* uint64_t code_addr: code start address for the jitted code. By default vma = code_addr
|
||||
* uint64_t code_size: size in bytes of the generated jitted code
|
||||
* uint64_t code_index: unique identifier for the jitted code (see below)
|
||||
* char[n]: function name in ASCII including the null termination
|
||||
* native code: raw byte encoding of the jitted code
|
||||
|
||||
The record header total_size field is inclusive of all components:
|
||||
* record header
|
||||
* fixed-sized fields
|
||||
* function name string, including termination
|
||||
* native code length
|
||||
* record specific variable data (e.g., array of data entries)
|
||||
|
||||
The code_index is used to uniquely identify each jitted function. The index can be a monotonically increasing 64-bit value. Each time a function is jitted it gets a new number. This value is used in case the code for a function is moved and avoids having to issue another JIT_CODE_LOAD record.
|
||||
|
||||
The format supports empty functions with no native code.
|
||||
|
||||
|
||||
VI/ JIT_CODE_MOVE record
|
||||
|
||||
The record type is optional.
|
||||
|
||||
The record has the following fields following the fixed-size record header in order:
|
||||
* uint32_t pid : OS process id of the runtime generating the jitted code
|
||||
* uint32_t tid : OS thread identification of the runtime thread generating the jitted code
|
||||
* uint64_t vma : new virtual address of jitted code start
|
||||
* uint64_t old_code_addr: previous code address for the same function
|
||||
* uint64_t new_code_addr: alternate new code started address for the jitted code. By default it should be equal to the vma address.
|
||||
* uint64_t code_size : size in bytes of the jitted code
|
||||
* uint64_t code_index : index referring to the JIT_CODE_LOAD code_index record of when the function was initially jitted
|
||||
|
||||
|
||||
The MOVE record can be used in case an already jitted function is simply moved by the runtime inside the code cache.
|
||||
|
||||
The JIT_CODE_MOVE record cannot come before the JIT_CODE_LOAD record for the same function name. The function cannot have changed name, otherwise a new JIT_CODE_LOAD record must be emitted.
|
||||
|
||||
The code size of the function cannot change.
|
||||
|
||||
|
||||
VII/ JIT_DEBUG_INFO record
|
||||
|
||||
The record type is optional.
|
||||
|
||||
The record contains source lines debug information, i.e., a way to map a code address back to a source line. This information may be used by the performance tool.
|
||||
|
||||
The record has the following fields following the fixed-size record header in order:
|
||||
* uint64_t code_addr: address of function for which the debug information is generated
|
||||
* uint64_t nr_entry : number of debug entries for the function
|
||||
* debug_entry[n]: array of nr_entry debug entries for the function
|
||||
|
||||
The debug_entry describes the source line information. It is defined as follows in order:
|
||||
* uint64_t code_addr: address of function for which the debug information is generated
|
||||
* uint32_t line : source file line number (starting at 1)
|
||||
* uint32_t discrim : column discriminator, 0 is default
|
||||
* char name[n] : source file name in ASCII, including null termination
|
||||
|
||||
The debug_entry entries are saved in sequence but given that they have variable sizes due to the file name string, they cannot be indexed directly.
|
||||
They need to be walked sequentially. The next debug_entry is found at sizeof(debug_entry) + strlen(name) + 1.
|
||||
|
||||
IMPORTANT:
|
||||
The JIT_CODE_DEBUG for a given function must always be generated BEFORE the JIT_CODE_LOAD for the function. This facilitates greatly the parser for the jitdump file.
|
||||
|
||||
|
||||
VIII/ JIT_CODE_CLOSE record
|
||||
|
||||
|
||||
The record type is optional.
|
||||
|
||||
The record is used as a marker for the end of the jitted runtime. It can be replaced by the end of the file.
|
||||
|
||||
The JIT_CODE_CLOSE record does not have any specific fields, the record header contains all the information needed.
|
||||
|
||||
|
||||
IX/ JIT_CODE_UNWINDING_INFO
|
||||
|
||||
|
||||
The record type is optional.
|
||||
|
||||
The record is used to describe the unwinding information for a jitted function.
|
||||
|
||||
The record has the following fields following the fixed-size record header in order:
|
||||
|
||||
uint64_t unwind_data_size : the size in bytes of the unwinding data table at the end of the record
|
||||
uint64_t eh_frame_hdr_size : the size in bytes of the DWARF EH Frame Header at the start of the unwinding data table at the end of the record
|
||||
uint64_t mapped_size : the size of the unwinding data mapped in memory
|
||||
const char unwinding_data[n]: an array of unwinding data, consisting of the EH Frame Header, followed by the actual EH Frame
|
||||
|
||||
|
||||
The EH Frame header follows the Linux Standard Base (LSB) specification as described in the document at https://refspecs.linuxfoundation.org/LSB_1.3.0/gLSB/gLSB/ehframehdr.html
|
||||
|
||||
|
||||
The EH Frame follows the LSB specicfication as described in the document at https://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html
|
||||
|
||||
|
||||
NOTE: The mapped_size is generally either the same as unwind_data_size (if the unwinding data was mapped in memory by the running process) or zero (if the unwinding data is not mapped by the process). If the unwinding data was not mapped, then only the EH Frame Header will be read, which can be used to specify FP based unwinding for a function which does not have unwinding information.
|
290
tools/perf/Documentation/perf-c2c.txt
Normal file
290
tools/perf/Documentation/perf-c2c.txt
Normal file
@ -0,0 +1,290 @@
|
||||
perf-c2c(1)
|
||||
===========
|
||||
|
||||
NAME
|
||||
----
|
||||
perf-c2c - Shared Data C2C/HITM Analyzer.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'perf c2c record' [<options>] <command>
|
||||
'perf c2c record' [<options>] -- [<record command options>] <command>
|
||||
'perf c2c report' [<options>]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
C2C stands for Cache To Cache.
|
||||
|
||||
The perf c2c tool provides means for Shared Data C2C/HITM analysis. It allows
|
||||
you to track down the cacheline contentions.
|
||||
|
||||
The tool is based on x86's load latency and precise store facility events
|
||||
provided by Intel CPUs. These events provide:
|
||||
- memory address of the access
|
||||
- type of the access (load and store details)
|
||||
- latency (in cycles) of the load access
|
||||
|
||||
The c2c tool provide means to record this data and report back access details
|
||||
for cachelines with highest contention - highest number of HITM accesses.
|
||||
|
||||
The basic workflow with this tool follows the standard record/report phase.
|
||||
User uses the record command to record events data and report command to
|
||||
display it.
|
||||
|
||||
|
||||
RECORD OPTIONS
|
||||
--------------
|
||||
-e::
|
||||
--event=::
|
||||
Select the PMU event. Use 'perf mem record -e list'
|
||||
to list available events.
|
||||
|
||||
-v::
|
||||
--verbose::
|
||||
Be more verbose (show counter open errors, etc).
|
||||
|
||||
-l::
|
||||
--ldlat::
|
||||
Configure mem-loads latency.
|
||||
|
||||
-k::
|
||||
--all-kernel::
|
||||
Configure all used events to run in kernel space.
|
||||
|
||||
-u::
|
||||
--all-user::
|
||||
Configure all used events to run in user space.
|
||||
|
||||
REPORT OPTIONS
|
||||
--------------
|
||||
-k::
|
||||
--vmlinux=<file>::
|
||||
vmlinux pathname
|
||||
|
||||
-v::
|
||||
--verbose::
|
||||
Be more verbose (show counter open errors, etc).
|
||||
|
||||
-i::
|
||||
--input::
|
||||
Specify the input file to process.
|
||||
|
||||
-N::
|
||||
--node-info::
|
||||
Show extra node info in report (see NODE INFO section)
|
||||
|
||||
-c::
|
||||
--coalesce::
|
||||
Specify sorintg fields for single cacheline display.
|
||||
Following fields are available: tid,pid,iaddr,dso
|
||||
(see COALESCE)
|
||||
|
||||
-g::
|
||||
--call-graph::
|
||||
Setup callchains parameters.
|
||||
Please refer to perf-report man page for details.
|
||||
|
||||
--stdio::
|
||||
Force the stdio output (see STDIO OUTPUT)
|
||||
|
||||
--stats::
|
||||
Display only statistic tables and force stdio mode.
|
||||
|
||||
--full-symbols::
|
||||
Display full length of symbols.
|
||||
|
||||
--no-source::
|
||||
Do not display Source:Line column.
|
||||
|
||||
--show-all::
|
||||
Show all captured HITM lines, with no regard to HITM % 0.0005 limit.
|
||||
|
||||
-f::
|
||||
--force::
|
||||
Don't do ownership validation.
|
||||
|
||||
-d::
|
||||
--display::
|
||||
Siwtch to HITM type (rmt, lcl) to display and sort on. Total HITMs as default.
|
||||
|
||||
C2C RECORD
|
||||
----------
|
||||
The perf c2c record command setup options related to HITM cacheline analysis
|
||||
and calls standard perf record command.
|
||||
|
||||
Following perf record options are configured by default:
|
||||
(check perf record man page for details)
|
||||
|
||||
-W,-d,--sample-cpu
|
||||
|
||||
Unless specified otherwise with '-e' option, following events are monitored by
|
||||
default:
|
||||
|
||||
cpu/mem-loads,ldlat=30/P
|
||||
cpu/mem-stores/P
|
||||
|
||||
User can pass any 'perf record' option behind '--' mark, like (to enable
|
||||
callchains and system wide monitoring):
|
||||
|
||||
$ perf c2c record -- -g -a
|
||||
|
||||
Please check RECORD OPTIONS section for specific c2c record options.
|
||||
|
||||
C2C REPORT
|
||||
----------
|
||||
The perf c2c report command displays shared data analysis. It comes in two
|
||||
display modes: stdio and tui (default).
|
||||
|
||||
The report command workflow is following:
|
||||
- sort all the data based on the cacheline address
|
||||
- store access details for each cacheline
|
||||
- sort all cachelines based on user settings
|
||||
- display data
|
||||
|
||||
In general perf report output consist of 2 basic views:
|
||||
1) most expensive cachelines list
|
||||
2) offsets details for each cacheline
|
||||
|
||||
For each cacheline in the 1) list we display following data:
|
||||
(Both stdio and TUI modes follow the same fields output)
|
||||
|
||||
Index
|
||||
- zero based index to identify the cacheline
|
||||
|
||||
Cacheline
|
||||
- cacheline address (hex number)
|
||||
|
||||
Total records
|
||||
- sum of all cachelines accesses
|
||||
|
||||
Rmt/Lcl Hitm
|
||||
- cacheline percentage of all Remote/Local HITM accesses
|
||||
|
||||
LLC Load Hitm - Total, Lcl, Rmt
|
||||
- count of Total/Local/Remote load HITMs
|
||||
|
||||
Store Reference - Total, L1Hit, L1Miss
|
||||
Total - all store accesses
|
||||
L1Hit - store accesses that hit L1
|
||||
L1Hit - store accesses that missed L1
|
||||
|
||||
Load Dram
|
||||
- count of local and remote DRAM accesses
|
||||
|
||||
LLC Ld Miss
|
||||
- count of all accesses that missed LLC
|
||||
|
||||
Total Loads
|
||||
- sum of all load accesses
|
||||
|
||||
Core Load Hit - FB, L1, L2
|
||||
- count of load hits in FB (Fill Buffer), L1 and L2 cache
|
||||
|
||||
LLC Load Hit - Llc, Rmt
|
||||
- count of LLC and Remote load hits
|
||||
|
||||
For each offset in the 2) list we display following data:
|
||||
|
||||
HITM - Rmt, Lcl
|
||||
- % of Remote/Local HITM accesses for given offset within cacheline
|
||||
|
||||
Store Refs - L1 Hit, L1 Miss
|
||||
- % of store accesses that hit/missed L1 for given offset within cacheline
|
||||
|
||||
Data address - Offset
|
||||
- offset address
|
||||
|
||||
Pid
|
||||
- pid of the process responsible for the accesses
|
||||
|
||||
Tid
|
||||
- tid of the process responsible for the accesses
|
||||
|
||||
Code address
|
||||
- code address responsible for the accesses
|
||||
|
||||
cycles - rmt hitm, lcl hitm, load
|
||||
- sum of cycles for given accesses - Remote/Local HITM and generic load
|
||||
|
||||
cpu cnt
|
||||
- number of cpus that participated on the access
|
||||
|
||||
Symbol
|
||||
- code symbol related to the 'Code address' value
|
||||
|
||||
Shared Object
|
||||
- shared object name related to the 'Code address' value
|
||||
|
||||
Source:Line
|
||||
- source information related to the 'Code address' value
|
||||
|
||||
Node
|
||||
- nodes participating on the access (see NODE INFO section)
|
||||
|
||||
NODE INFO
|
||||
---------
|
||||
The 'Node' field displays nodes that accesses given cacheline
|
||||
offset. Its output comes in 3 flavors:
|
||||
- node IDs separated by ','
|
||||
- node IDs with stats for each ID, in following format:
|
||||
Node{cpus %hitms %stores}
|
||||
- node IDs with list of affected CPUs in following format:
|
||||
Node{cpu list}
|
||||
|
||||
User can switch between above flavors with -N option or
|
||||
use 'n' key to interactively switch in TUI mode.
|
||||
|
||||
COALESCE
|
||||
--------
|
||||
User can specify how to sort offsets for cacheline.
|
||||
|
||||
Following fields are available and governs the final
|
||||
output fields set for caheline offsets output:
|
||||
|
||||
tid - coalesced by process TIDs
|
||||
pid - coalesced by process PIDs
|
||||
iaddr - coalesced by code address, following fields are displayed:
|
||||
Code address, Code symbol, Shared Object, Source line
|
||||
dso - coalesced by shared object
|
||||
|
||||
By default the coalescing is setup with 'pid,tid,iaddr'.
|
||||
|
||||
STDIO OUTPUT
|
||||
------------
|
||||
The stdio output displays data on standard output.
|
||||
|
||||
Following tables are displayed:
|
||||
Trace Event Information
|
||||
- overall statistics of memory accesses
|
||||
|
||||
Global Shared Cache Line Event Information
|
||||
- overall statistics on shared cachelines
|
||||
|
||||
Shared Data Cache Line Table
|
||||
- list of most expensive cachelines
|
||||
|
||||
Shared Cache Line Distribution Pareto
|
||||
- list of all accessed offsets for each cacheline
|
||||
|
||||
TUI OUTPUT
|
||||
----------
|
||||
The TUI output provides interactive interface to navigate
|
||||
through cachelines list and to display offset details.
|
||||
|
||||
For details please refer to the help window by pressing '?' key.
|
||||
|
||||
CREDITS
|
||||
-------
|
||||
Although Don Zickus, Dick Fowles and Joe Mario worked together
|
||||
to get this implemented, we got lots of early help from Arnaldo
|
||||
Carvalho de Melo, Stephane Eranian, Jiri Olsa and Andi Kleen.
|
||||
|
||||
C2C BLOG
|
||||
--------
|
||||
Check Joe's blog on c2c tool for detailed use case explanation:
|
||||
https://joemario.github.io/blog/2016/09/01/c2c-blog/
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkperf:perf-record[1], linkperf:perf-mem[1]
|
@ -8,6 +8,8 @@ perf-config - Get and set variables in a configuration file.
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'perf config' [<file-option>] [section.name[=value] ...]
|
||||
or
|
||||
'perf config' [<file-option>] -l | --list
|
||||
|
||||
DESCRIPTION
|
||||
@ -118,6 +120,39 @@ Given a $HOME/.perfconfig like this:
|
||||
children = true
|
||||
group = true
|
||||
|
||||
You can hide source code of annotate feature setting the config to false with
|
||||
|
||||
% perf config annotate.hide_src_code=true
|
||||
|
||||
If you want to add or modify several config items, you can do like
|
||||
|
||||
% perf config ui.show-headers=false kmem.default=slab
|
||||
|
||||
To modify the sort order of report functionality in user config file(i.e. `~/.perfconfig`), do
|
||||
|
||||
% perf config --user report sort-order=srcline
|
||||
|
||||
To change colors of selected line to other foreground and background colors
|
||||
in system config file (i.e. `$(sysconf)/perfconfig`), do
|
||||
|
||||
% perf config --system colors.selected=yellow,green
|
||||
|
||||
To query the record mode of call graph, do
|
||||
|
||||
% perf config call-graph.record-mode
|
||||
|
||||
If you want to know multiple config key/value pairs, you can do like
|
||||
|
||||
% perf config report.queue-size call-graph.order report.children
|
||||
|
||||
To query the config value of sort order of call graph in user config file (i.e. `~/.perfconfig`), do
|
||||
|
||||
% perf config --user call-graph.sort-order
|
||||
|
||||
To query the config value of buildid directory in system config file (i.e. `$(sysconf)/perfconfig`), do
|
||||
|
||||
% perf config --system buildid.dir
|
||||
|
||||
Variables
|
||||
~~~~~~~~~
|
||||
|
||||
|
@ -61,6 +61,13 @@ OPTIONS
|
||||
default, but this option shows live (currently allocated) pages
|
||||
instead. (This option works with --page option only)
|
||||
|
||||
--time::
|
||||
Only analyze samples within given time window: <start>,<stop>. Times
|
||||
have the format seconds.microseconds. If start is not given (i.e., time
|
||||
string is ',x.y') then analysis starts at the beginning of the file. If
|
||||
stop time is not given (i.e, time string is 'x.y,') then analysis goes
|
||||
to end of file.
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkperf:perf-record[1]
|
||||
|
@ -45,9 +45,9 @@ OPTIONS
|
||||
param1 and param2 are defined as formats for the PMU in:
|
||||
/sys/bus/event_source/devices/<pmu>/format/*
|
||||
|
||||
There are also some params which are not defined in .../<pmu>/format/*.
|
||||
There are also some parameters which are not defined in .../<pmu>/format/*.
|
||||
These params can be used to overload default config values per event.
|
||||
Here is a list of the params.
|
||||
Here are some common parameters:
|
||||
- 'period': Set event sampling period
|
||||
- 'freq': Set event sampling frequency
|
||||
- 'time': Disable/enable time stamping. Acceptable values are 1 for
|
||||
@ -57,8 +57,11 @@ OPTIONS
|
||||
FP mode, "dwarf" for DWARF mode, "lbr" for LBR mode and
|
||||
"no" for disable callgraph.
|
||||
- 'stack-size': user stack size for dwarf mode
|
||||
|
||||
See the linkperf:perf-list[1] man page for more parameters.
|
||||
|
||||
Note: If user explicitly sets options which conflict with the params,
|
||||
the value set by the params will be overridden.
|
||||
the value set by the parameters will be overridden.
|
||||
|
||||
Also not defined in .../<pmu>/format/* are PMU driver specific
|
||||
configuration parameters. Any configuration parameter preceded by
|
||||
|
@ -239,7 +239,8 @@ OPTIONS
|
||||
Accumulate callchain of children to parent entry so that then can
|
||||
show up in the output. The output will have a new "Children" column
|
||||
and will be sorted on the data. It requires callchains are recorded.
|
||||
See the `overhead calculation' section for more details.
|
||||
See the `overhead calculation' section for more details. Enabled by
|
||||
default, disable with --no-children.
|
||||
|
||||
--max-stack::
|
||||
Set the stack depth limit when parsing the callchain, anything
|
||||
@ -382,6 +383,13 @@ OPTIONS
|
||||
--header-only::
|
||||
Show only perf.data header (forces --stdio).
|
||||
|
||||
--time::
|
||||
Only analyze samples within given time window: <start>,<stop>. Times
|
||||
have the format seconds.microseconds. If start is not given (i.e., time
|
||||
string is ',x.y') then analysis starts at the beginning of the file. If
|
||||
stop time is not given (i.e, time string is 'x.y,') then analysis goes
|
||||
to end of file.
|
||||
|
||||
--itrace::
|
||||
Options for decoding instruction tracing data. The options are:
|
||||
|
||||
|
@ -8,11 +8,11 @@ perf-sched - Tool to trace/measure scheduler properties (latencies)
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'perf sched' {record|latency|map|replay|script}
|
||||
'perf sched' {record|latency|map|replay|script|timehist}
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
There are five variants of perf sched:
|
||||
There are several variants of 'perf sched':
|
||||
|
||||
'perf sched record <command>' to record the scheduling events
|
||||
of an arbitrary workload.
|
||||
@ -36,6 +36,30 @@ There are five variants of perf sched:
|
||||
are running on a CPU. A '*' denotes the CPU that had the event, and
|
||||
a dot signals an idle CPU.
|
||||
|
||||
'perf sched timehist' provides an analysis of scheduling events.
|
||||
|
||||
Example usage:
|
||||
perf sched record -- sleep 1
|
||||
perf sched timehist
|
||||
|
||||
By default it shows the individual schedule events, including the wait
|
||||
time (time between sched-out and next sched-in events for the task), the
|
||||
task scheduling delay (time between wakeup and actually running) and run
|
||||
time for the task:
|
||||
|
||||
time cpu task name wait time sch delay run time
|
||||
[tid/pid] (msec) (msec) (msec)
|
||||
-------------- ------ -------------------- --------- --------- ---------
|
||||
79371.874569 [0011] gcc[31949] 0.014 0.000 1.148
|
||||
79371.874591 [0010] gcc[31951] 0.000 0.000 0.024
|
||||
79371.874603 [0010] migration/10[59] 3.350 0.004 0.011
|
||||
79371.874604 [0011] <idle> 1.148 0.000 0.035
|
||||
79371.874723 [0005] <idle> 0.016 0.000 1.383
|
||||
79371.874746 [0005] gcc[31949] 0.153 0.078 0.022
|
||||
...
|
||||
|
||||
Times are in msec.usec.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
-i::
|
||||
@ -66,6 +90,56 @@ OPTIONS for 'perf sched map'
|
||||
--color-pids::
|
||||
Highlight the given pids.
|
||||
|
||||
OPTIONS for 'perf sched timehist'
|
||||
---------------------------------
|
||||
-k::
|
||||
--vmlinux=<file>::
|
||||
vmlinux pathname
|
||||
|
||||
--kallsyms=<file>::
|
||||
kallsyms pathname
|
||||
|
||||
-g::
|
||||
--no-call-graph::
|
||||
Do not display call chains if present.
|
||||
|
||||
--max-stack::
|
||||
Maximum number of functions to display in backtrace, default 5.
|
||||
|
||||
-s::
|
||||
--summary::
|
||||
Show only a summary of scheduling by thread with min, max, and average
|
||||
run times (in sec) and relative stddev.
|
||||
|
||||
-S::
|
||||
--with-summary::
|
||||
Show all scheduling events followed by a summary by thread with min,
|
||||
max, and average run times (in sec) and relative stddev.
|
||||
|
||||
--symfs=<directory>::
|
||||
Look for files with symbols relative to this directory.
|
||||
|
||||
-V::
|
||||
--cpu-visual::
|
||||
Show visual aid for sched switches by CPU: 'i' marks idle time,
|
||||
's' are scheduler events.
|
||||
|
||||
-w::
|
||||
--wakeups::
|
||||
Show wakeup events.
|
||||
|
||||
-M::
|
||||
--migrations::
|
||||
Show migration events.
|
||||
|
||||
--time::
|
||||
Only analyze samples within given time window: <start>,<stop>. Times
|
||||
have the format seconds.microseconds. If start is not given (i.e., time
|
||||
string is ',x.y') then analysis starts at the beginning of the file. If
|
||||
stop time is not given (i.e, time string is 'x.y,') then analysis goes
|
||||
to end of file.
|
||||
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkperf:perf-record[1]
|
||||
|
@ -117,7 +117,7 @@ OPTIONS
|
||||
Comma separated list of fields to print. Options are:
|
||||
comm, tid, pid, time, cpu, event, trace, ip, sym, dso, addr, symoff,
|
||||
srcline, period, iregs, brstack, brstacksym, flags, bpf-output,
|
||||
callindent. Field list can be prepended with the type, trace, sw or hw,
|
||||
callindent, insn, insnlen. Field list can be prepended with the type, trace, sw or hw,
|
||||
to indicate to which event type the field list applies.
|
||||
e.g., -F sw:comm,tid,time,ip,sym and -F trace:time,cpu,trace
|
||||
|
||||
@ -181,6 +181,10 @@ OPTIONS
|
||||
Instruction Trace decoding. For calls and returns, it will display the
|
||||
name of the symbol indented with spaces to reflect the stack depth.
|
||||
|
||||
When doing instruction trace decoding insn and insnlen give the
|
||||
instruction bytes and the instruction length of the current
|
||||
instruction.
|
||||
|
||||
Finally, a user may not set fields to none for all event types.
|
||||
i.e., -F "" is not allowed.
|
||||
|
||||
@ -208,6 +212,9 @@ OPTIONS
|
||||
--hide-call-graph::
|
||||
When printing symbols do not display call chain.
|
||||
|
||||
--stop-bt::
|
||||
Stop display of callgraph at these symbols
|
||||
|
||||
-C::
|
||||
--cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can
|
||||
be provided as a comma-separated list with no space: 0,1. Ranges of
|
||||
@ -285,6 +292,13 @@ include::itrace.txt[]
|
||||
--force::
|
||||
Don't do ownership validation.
|
||||
|
||||
--time::
|
||||
Only analyze samples within given time window: <start>,<stop>. Times
|
||||
have the format seconds.microseconds. If start is not given (i.e., time
|
||||
string is ',x.y') then analysis starts at the beginning of the file. If
|
||||
stop time is not given (i.e, time string is 'x.y,') then analysis goes
|
||||
to end of file.
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkperf:perf-record[1], linkperf:perf-script-perl[1],
|
||||
|
@ -170,6 +170,7 @@ Default is to monitor all CPUS.
|
||||
show up in the output. The output will have a new "Children" column
|
||||
and will be sorted on the data. It requires -g/--call-graph option
|
||||
enabled. See the `overhead calculation' section for more details.
|
||||
Enabled by default, disable with --no-children.
|
||||
|
||||
--max-stack::
|
||||
Set the stack depth limit when parsing the callchain, anything
|
||||
|
@ -39,6 +39,11 @@ OPTIONS
|
||||
Prefixing with ! shows all syscalls but the ones specified. You may
|
||||
need to escape it.
|
||||
|
||||
-D msecs::
|
||||
--delay msecs::
|
||||
After starting the program, wait msecs before measuring. This is useful to
|
||||
filter out the startup phase of the program, which is often very different.
|
||||
|
||||
-o::
|
||||
--output=::
|
||||
Output file name.
|
||||
|
@ -51,6 +51,7 @@ tools/include/asm-generic/bitops/arch_hweight.h
|
||||
tools/include/asm-generic/bitops/atomic.h
|
||||
tools/include/asm-generic/bitops/const_hweight.h
|
||||
tools/include/asm-generic/bitops/__ffs.h
|
||||
tools/include/asm-generic/bitops/__ffz.h
|
||||
tools/include/asm-generic/bitops/__fls.h
|
||||
tools/include/asm-generic/bitops/find.h
|
||||
tools/include/asm-generic/bitops/fls64.h
|
||||
|
@ -136,6 +136,7 @@ endif
|
||||
# Treat warnings as errors unless directed not to
|
||||
ifneq ($(WERROR),0)
|
||||
CFLAGS += -Werror
|
||||
CXXFLAGS += -Werror
|
||||
endif
|
||||
|
||||
ifndef DEBUG
|
||||
@ -182,6 +183,13 @@ CFLAGS += -Wall
|
||||
CFLAGS += -Wextra
|
||||
CFLAGS += -std=gnu99
|
||||
|
||||
CXXFLAGS += -std=gnu++11 -fno-exceptions -fno-rtti
|
||||
CXXFLAGS += -Wall
|
||||
CXXFLAGS += -fno-omit-frame-pointer
|
||||
CXXFLAGS += -ggdb3
|
||||
CXXFLAGS += -funwind-tables
|
||||
CXXFLAGS += -Wno-strict-aliasing
|
||||
|
||||
# Enforce a non-executable stack, as we may regress (again) in the future by
|
||||
# adding assembler files missing the .GNU-stack linker note.
|
||||
LDFLAGS += -Wl,-z,noexecstack
|
||||
@ -204,24 +212,27 @@ ifeq ($(DEBUG),0)
|
||||
endif
|
||||
endif
|
||||
|
||||
CFLAGS += -I$(src-perf)/util/include
|
||||
CFLAGS += -I$(src-perf)/arch/$(ARCH)/include
|
||||
CFLAGS += -I$(srctree)/tools/include/uapi
|
||||
CFLAGS += -I$(srctree)/tools/include/
|
||||
CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/uapi
|
||||
CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/
|
||||
CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/
|
||||
INC_FLAGS += -I$(src-perf)/util/include
|
||||
INC_FLAGS += -I$(src-perf)/arch/$(ARCH)/include
|
||||
INC_FLAGS += -I$(srctree)/tools/include/uapi
|
||||
INC_FLAGS += -I$(srctree)/tools/include/
|
||||
INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/uapi
|
||||
INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/
|
||||
INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/
|
||||
|
||||
# $(obj-perf) for generated common-cmds.h
|
||||
# $(obj-perf)/util for generated bison/flex headers
|
||||
ifneq ($(OUTPUT),)
|
||||
CFLAGS += -I$(obj-perf)/util
|
||||
CFLAGS += -I$(obj-perf)
|
||||
INC_FLAGS += -I$(obj-perf)/util
|
||||
INC_FLAGS += -I$(obj-perf)
|
||||
endif
|
||||
|
||||
CFLAGS += -I$(src-perf)/util
|
||||
CFLAGS += -I$(src-perf)
|
||||
CFLAGS += -I$(srctree)/tools/lib/
|
||||
INC_FLAGS += -I$(src-perf)/util
|
||||
INC_FLAGS += -I$(src-perf)
|
||||
INC_FLAGS += -I$(srctree)/tools/lib/
|
||||
|
||||
CFLAGS += $(INC_FLAGS)
|
||||
CXXFLAGS += $(INC_FLAGS)
|
||||
|
||||
CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
|
||||
|
||||
@ -366,7 +377,7 @@ ifndef NO_SDT
|
||||
endif
|
||||
|
||||
ifdef PERF_HAVE_JITDUMP
|
||||
ifndef NO_DWARF
|
||||
ifndef NO_LIBELF
|
||||
$(call detected,CONFIG_JITDUMP)
|
||||
CFLAGS += -DHAVE_JITDUMP
|
||||
endif
|
||||
@ -758,6 +769,62 @@ ifndef NO_AUXTRACE
|
||||
endif
|
||||
endif
|
||||
|
||||
ifndef NO_JVMTI
|
||||
ifneq (,$(wildcard /usr/sbin/update-java-alternatives))
|
||||
JDIR=$(shell /usr/sbin/update-java-alternatives -l | head -1 | awk '{print $$3}')
|
||||
else
|
||||
ifneq (,$(wildcard /usr/sbin/alternatives))
|
||||
JDIR=$(shell alternatives --display java | tail -1 | cut -d' ' -f 5 | sed 's%/jre/bin/java.%%g')
|
||||
endif
|
||||
endif
|
||||
ifndef JDIR
|
||||
$(warning No alternatives command found, you need to set JDIR= to point to the root of your Java directory)
|
||||
NO_JVMTI := 1
|
||||
endif
|
||||
endif
|
||||
|
||||
ifndef NO_JVMTI
|
||||
FEATURE_CHECK_CFLAGS-jvmti := -I$(JDIR)/include -I$(JDIR)/include/linux
|
||||
$(call feature_check,jvmti)
|
||||
ifeq ($(feature-jvmti), 1)
|
||||
$(call detected_var,JDIR)
|
||||
else
|
||||
$(warning No openjdk development package found, please install JDK package)
|
||||
NO_JVMTI := 1
|
||||
endif
|
||||
endif
|
||||
|
||||
USE_CXX = 0
|
||||
USE_CLANGLLVM = 0
|
||||
ifdef LIBCLANGLLVM
|
||||
$(call feature_check,cxx)
|
||||
ifneq ($(feature-cxx), 1)
|
||||
msg := $(warning No g++ found, disable clang and llvm support. Please install g++)
|
||||
else
|
||||
$(call feature_check,llvm)
|
||||
$(call feature_check,llvm-version)
|
||||
ifneq ($(feature-llvm), 1)
|
||||
msg := $(warning No suitable libLLVM found, disabling builtin clang and LLVM support. Please install llvm-dev(el) (>= 3.9.0))
|
||||
else
|
||||
$(call feature_check,clang)
|
||||
ifneq ($(feature-clang), 1)
|
||||
msg := $(warning No suitable libclang found, disabling builtin clang and LLVM support. Please install libclang-dev(el) (>= 3.9.0))
|
||||
else
|
||||
CFLAGS += -DHAVE_LIBCLANGLLVM_SUPPORT
|
||||
CXXFLAGS += -DHAVE_LIBCLANGLLVM_SUPPORT -I$(shell $(LLVM_CONFIG) --includedir)
|
||||
$(call detected,CONFIG_CXX)
|
||||
$(call detected,CONFIG_CLANGLLVM)
|
||||
USE_CXX = 1
|
||||
USE_LLVM = 1
|
||||
USE_CLANG = 1
|
||||
ifneq ($(feature-llvm-version),1)
|
||||
msg := $(warning This version of LLVM is not tested. May cause build errors)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
# Among the variables below, these:
|
||||
# perfexecdir
|
||||
# template_dir
|
||||
@ -850,6 +917,7 @@ ifeq ($(VF),1)
|
||||
$(call print_var,sysconfdir)
|
||||
$(call print_var,LIBUNWIND_DIR)
|
||||
$(call print_var,LIBDW_DIR)
|
||||
$(call print_var,JDIR)
|
||||
|
||||
ifeq ($(dwarf-post-unwind),1)
|
||||
$(call feature_print_text,"DWARF post unwind library", $(dwarf-post-unwind-text))
|
||||
|
@ -86,6 +86,12 @@ include ../scripts/utilities.mak
|
||||
#
|
||||
# Define FEATURES_DUMP to provide features detection dump file
|
||||
# and bypass the feature detection
|
||||
#
|
||||
# Define NO_JVMTI if you do not want jvmti agent built
|
||||
#
|
||||
# Define LIBCLANGLLVM if you DO want builtin clang and llvm support.
|
||||
# When selected, pass LLVM_CONFIG=/path/to/llvm-config to `make' if
|
||||
# llvm-config is not in $PATH.
|
||||
|
||||
# As per kernel Makefile, avoid funny character set dependencies
|
||||
unexport LC_ALL
|
||||
@ -122,10 +128,6 @@ endif
|
||||
# (this improves performance and avoids hard-to-debug behaviour);
|
||||
MAKEFLAGS += -r
|
||||
|
||||
$(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
|
||||
$(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
|
||||
$(Q)touch $(OUTPUT)PERF-VERSION-FILE
|
||||
|
||||
# Makefiles suck: This macro sets a default value of $(2) for the
|
||||
# variable named by $(1), unless the variable has been set by
|
||||
# environment or command line. This is necessary for CC and AR
|
||||
@ -141,6 +143,7 @@ endef
|
||||
$(call allow-override,CC,$(CROSS_COMPILE)gcc)
|
||||
$(call allow-override,AR,$(CROSS_COMPILE)ar)
|
||||
$(call allow-override,LD,$(CROSS_COMPILE)ld)
|
||||
$(call allow-override,CXX,$(CROSS_COMPILE)g++)
|
||||
|
||||
LD += $(EXTRA_LDFLAGS)
|
||||
|
||||
@ -149,6 +152,7 @@ HOSTLD ?= ld
|
||||
HOSTAR ?= ar
|
||||
|
||||
PKG_CONFIG = $(CROSS_COMPILE)pkg-config
|
||||
LLVM_CONFIG ?= llvm-config
|
||||
|
||||
RM = rm -f
|
||||
LN = ln -f
|
||||
@ -160,16 +164,11 @@ BISON = bison
|
||||
STRIP = strip
|
||||
AWK = awk
|
||||
|
||||
LIB_DIR = $(srctree)/tools/lib/api/
|
||||
TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/
|
||||
BPF_DIR = $(srctree)/tools/lib/bpf/
|
||||
SUBCMD_DIR = $(srctree)/tools/lib/subcmd/
|
||||
|
||||
# include Makefile.config by default and rule out
|
||||
# non-config cases
|
||||
config := 1
|
||||
|
||||
NON_CONFIG_TARGETS := clean TAGS tags cscope help install-doc
|
||||
NON_CONFIG_TARGETS := clean TAGS tags cscope help install-doc install-man install-html install-info install-pdf doc man html info pdf
|
||||
|
||||
ifdef MAKECMDGOALS
|
||||
ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),)
|
||||
@ -177,6 +176,40 @@ ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),)
|
||||
endif
|
||||
endif
|
||||
|
||||
# The fixdep build - we force fixdep tool to be built as
|
||||
# the first target in the separate make session not to be
|
||||
# disturbed by any parallel make jobs. Once fixdep is done
|
||||
# we issue the requested build with FIXDEP=1 variable.
|
||||
#
|
||||
# The fixdep build is disabled for $(NON_CONFIG_TARGETS)
|
||||
# targets, because it's not necessary.
|
||||
|
||||
ifdef FIXDEP
|
||||
force_fixdep := 0
|
||||
else
|
||||
force_fixdep := $(config)
|
||||
endif
|
||||
|
||||
export srctree OUTPUT RM CC CXX LD AR CFLAGS CXXFLAGS V BISON FLEX AWK
|
||||
export HOSTCC HOSTLD HOSTAR
|
||||
|
||||
include $(srctree)/tools/build/Makefile.include
|
||||
|
||||
ifeq ($(force_fixdep),1)
|
||||
goals := $(filter-out all sub-make, $(MAKECMDGOALS))
|
||||
|
||||
$(goals) all: sub-make
|
||||
|
||||
sub-make: fixdep
|
||||
$(Q)$(MAKE) FIXDEP=1 -f Makefile.perf $(goals)
|
||||
|
||||
else # force_fixdep
|
||||
|
||||
LIB_DIR = $(srctree)/tools/lib/api/
|
||||
TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/
|
||||
BPF_DIR = $(srctree)/tools/lib/bpf/
|
||||
SUBCMD_DIR = $(srctree)/tools/lib/subcmd/
|
||||
|
||||
# Set FEATURE_TESTS to 'all' so all possible feature checkers are executed.
|
||||
# Without this setting the output feature dump file misses some features, for
|
||||
# example, liberty. Select all checkers so we won't get an incomplete feature
|
||||
@ -260,17 +293,6 @@ python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT
|
||||
PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
|
||||
PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
|
||||
|
||||
$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST)
|
||||
$(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
|
||||
CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
|
||||
$(PYTHON_WORD) util/setup.py \
|
||||
--quiet build_ext; \
|
||||
mkdir -p $(OUTPUT)python && \
|
||||
cp $(PYTHON_EXTBUILD_LIB)perf.so $(OUTPUT)python/
|
||||
#
|
||||
# No Perl scripts right now:
|
||||
#
|
||||
|
||||
SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
|
||||
|
||||
PROGRAMS += $(OUTPUT)perf
|
||||
@ -283,6 +305,12 @@ ifndef NO_PERF_READ_VDSOX32
|
||||
PROGRAMS += $(OUTPUT)perf-read-vdsox32
|
||||
endif
|
||||
|
||||
LIBJVMTI = libperf-jvmti.so
|
||||
|
||||
ifndef NO_JVMTI
|
||||
PROGRAMS += $(OUTPUT)$(LIBJVMTI)
|
||||
endif
|
||||
|
||||
# what 'all' will build and 'install' will install, in perfexecdir
|
||||
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
|
||||
|
||||
@ -317,11 +345,6 @@ endif
|
||||
ifndef NO_GTK2
|
||||
ALL_PROGRAMS += $(OUTPUT)libperf-gtk.so
|
||||
GTK_IN := $(OUTPUT)gtk-in.o
|
||||
|
||||
install-gtk: $(OUTPUT)libperf-gtk.so
|
||||
$(call QUIET_INSTALL, 'GTK UI') \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \
|
||||
$(INSTALL) $(OUTPUT)libperf-gtk.so '$(DESTDIR_SQ)$(libdir_SQ)'
|
||||
endif
|
||||
|
||||
ifdef ASCIIDOC8
|
||||
@ -330,6 +353,21 @@ endif
|
||||
|
||||
LIBS = -Wl,--whole-archive $(PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $(EXTLIBS) -Wl,--end-group
|
||||
|
||||
ifeq ($(USE_CLANG), 1)
|
||||
CLANGLIBS_LIST = AST Basic CodeGen Driver Frontend Lex Tooling Edit Sema Analysis Parse Serialization
|
||||
LIBCLANG = $(foreach l,$(CLANGLIBS_LIST),$(wildcard $(shell $(LLVM_CONFIG) --libdir)/libclang$(l).a))
|
||||
LIBS += -Wl,--start-group $(LIBCLANG) -Wl,--end-group
|
||||
endif
|
||||
|
||||
ifeq ($(USE_LLVM), 1)
|
||||
LIBLLVM = $(shell $(LLVM_CONFIG) --libs all) $(shell $(LLVM_CONFIG) --system-libs)
|
||||
LIBS += -L$(shell $(LLVM_CONFIG) --libdir) $(LIBLLVM)
|
||||
endif
|
||||
|
||||
ifeq ($(USE_CXX), 1)
|
||||
LIBS += -lstdc++
|
||||
endif
|
||||
|
||||
export INSTALL SHELL_PATH
|
||||
|
||||
### Build rules
|
||||
@ -338,6 +376,14 @@ SHELL = $(SHELL_PATH)
|
||||
|
||||
all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
|
||||
|
||||
$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST)
|
||||
$(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
|
||||
CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
|
||||
$(PYTHON_WORD) util/setup.py \
|
||||
--quiet build_ext; \
|
||||
mkdir -p $(OUTPUT)python && \
|
||||
cp $(PYTHON_EXTBUILD_LIB)perf.so $(OUTPUT)python/
|
||||
|
||||
please_set_SHELL_PATH_to_a_more_modern_shell:
|
||||
$(Q)$$(:)
|
||||
|
||||
@ -348,10 +394,6 @@ strip: $(PROGRAMS) $(OUTPUT)perf
|
||||
|
||||
PERF_IN := $(OUTPUT)perf-in.o
|
||||
|
||||
export srctree OUTPUT RM CC LD AR CFLAGS V BISON FLEX AWK
|
||||
export HOSTCC HOSTLD HOSTAR
|
||||
include $(srctree)/tools/build/Makefile.include
|
||||
|
||||
JEVENTS := $(OUTPUT)pmu-events/jevents
|
||||
JEVENTS_IN := $(OUTPUT)pmu-events/jevents-in.o
|
||||
|
||||
@ -381,10 +423,10 @@ $(PERF_IN): prepare FORCE
|
||||
(diff -B ../arch/x86/include/asm/cpufeatures.h ../../arch/x86/include/asm/cpufeatures.h >/dev/null) \
|
||||
|| echo "Warning: tools/arch/x86/include/asm/cpufeatures.h differs from kernel" >&2 )) || true
|
||||
@(test -f ../../arch/x86/lib/memcpy_64.S && ( \
|
||||
(diff -B ../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memcpy_64.S >/dev/null) \
|
||||
(diff -B -I "^EXPORT_SYMBOL" -I "^#include <asm/export.h>" ../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memcpy_64.S >/dev/null) \
|
||||
|| echo "Warning: tools/arch/x86/lib/memcpy_64.S differs from kernel" >&2 )) || true
|
||||
@(test -f ../../arch/x86/lib/memset_64.S && ( \
|
||||
(diff -B ../arch/x86/lib/memset_64.S ../../arch/x86/lib/memset_64.S >/dev/null) \
|
||||
(diff -B -I "^EXPORT_SYMBOL" -I "^#include <asm/export.h>" ../arch/x86/lib/memset_64.S ../../arch/x86/lib/memset_64.S >/dev/null) \
|
||||
|| echo "Warning: tools/arch/x86/lib/memset_64.S differs from kernel" >&2 )) || true
|
||||
@(test -f ../../arch/arm/include/uapi/asm/perf_regs.h && ( \
|
||||
(diff -B ../arch/arm/include/uapi/asm/perf_regs.h ../../arch/arm/include/uapi/asm/perf_regs.h >/dev/null) \
|
||||
@ -470,7 +512,7 @@ $(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_L
|
||||
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
|
||||
$(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
|
||||
|
||||
$(GTK_IN): fixdep FORCE
|
||||
$(GTK_IN): FORCE
|
||||
$(Q)$(MAKE) $(build)=gtk
|
||||
|
||||
$(OUTPUT)libperf-gtk.so: $(GTK_IN) $(PERFLIBS)
|
||||
@ -484,6 +526,10 @@ $(OUTPUT)common-cmds.h: $(wildcard Documentation/perf-*.txt)
|
||||
$(SCRIPTS) : % : %.sh
|
||||
$(QUIET_GEN)$(INSTALL) '$@.sh' '$(OUTPUT)$@'
|
||||
|
||||
$(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
|
||||
$(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
|
||||
$(Q)touch $(OUTPUT)PERF-VERSION-FILE
|
||||
|
||||
# These can record PERF_VERSION
|
||||
perf.spec $(SCRIPTS) \
|
||||
: $(OUTPUT)PERF-VERSION-FILE
|
||||
@ -515,7 +561,7 @@ endif
|
||||
__build-dir = $(subst $(OUTPUT),,$(dir $@))
|
||||
build-dir = $(if $(__build-dir),$(__build-dir),.)
|
||||
|
||||
prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h fixdep archheaders
|
||||
prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders
|
||||
|
||||
$(OUTPUT)%.o: %.c prepare FORCE
|
||||
$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
|
||||
@ -551,11 +597,21 @@ $(OUTPUT)perf-read-vdsox32: perf-read-vdso.c util/find-vdso-map.c
|
||||
$(QUIET_CC)$(CC) -mx32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c
|
||||
endif
|
||||
|
||||
ifndef NO_JVMTI
|
||||
LIBJVMTI_IN := $(OUTPUT)jvmti/jvmti-in.o
|
||||
|
||||
$(LIBJVMTI_IN): FORCE
|
||||
$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=jvmti obj=jvmti
|
||||
|
||||
$(OUTPUT)$(LIBJVMTI): $(LIBJVMTI_IN)
|
||||
$(QUIET_LINK)$(CC) -shared -Wl,-soname -Wl,$(LIBJVMTI) -o $@ $< -lelf -lrt
|
||||
endif
|
||||
|
||||
$(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
|
||||
|
||||
LIBPERF_IN := $(OUTPUT)libperf-in.o
|
||||
|
||||
$(LIBPERF_IN): prepare fixdep FORCE
|
||||
$(LIBPERF_IN): prepare FORCE
|
||||
$(Q)$(MAKE) $(build)=libperf
|
||||
|
||||
$(LIB_FILE): $(LIBPERF_IN)
|
||||
@ -563,10 +619,10 @@ $(LIB_FILE): $(LIBPERF_IN)
|
||||
|
||||
LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ)
|
||||
|
||||
$(LIBTRACEEVENT): fixdep FORCE
|
||||
$(LIBTRACEEVENT): FORCE
|
||||
$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent.a
|
||||
|
||||
libtraceevent_plugins: fixdep FORCE
|
||||
libtraceevent_plugins: FORCE
|
||||
$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) plugins
|
||||
|
||||
$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
|
||||
@ -579,21 +635,21 @@ $(LIBTRACEEVENT)-clean:
|
||||
install-traceevent-plugins: libtraceevent_plugins
|
||||
$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) install_plugins
|
||||
|
||||
$(LIBAPI): fixdep FORCE
|
||||
$(LIBAPI): FORCE
|
||||
$(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) $(OUTPUT)libapi.a
|
||||
|
||||
$(LIBAPI)-clean:
|
||||
$(call QUIET_CLEAN, libapi)
|
||||
$(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) clean >/dev/null
|
||||
|
||||
$(LIBBPF): fixdep FORCE
|
||||
$(LIBBPF): FORCE
|
||||
$(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) $(OUTPUT)libbpf.a FEATURES_DUMP=$(FEATURE_DUMP_EXPORT)
|
||||
|
||||
$(LIBBPF)-clean:
|
||||
$(call QUIET_CLEAN, libbpf)
|
||||
$(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) clean >/dev/null
|
||||
|
||||
$(LIBSUBCMD): fixdep FORCE
|
||||
$(LIBSUBCMD): FORCE
|
||||
$(Q)$(MAKE) -C $(SUBCMD_DIR) O=$(OUTPUT) $(OUTPUT)libsubcmd.a
|
||||
|
||||
$(LIBSUBCMD)-clean:
|
||||
@ -673,7 +729,14 @@ check: $(OUTPUT)common-cmds.h
|
||||
|
||||
### Installation rules
|
||||
|
||||
ifndef NO_GTK2
|
||||
install-gtk: $(OUTPUT)libperf-gtk.so
|
||||
$(call QUIET_INSTALL, 'GTK UI') \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \
|
||||
$(INSTALL) $(OUTPUT)libperf-gtk.so '$(DESTDIR_SQ)$(libdir_SQ)'
|
||||
else
|
||||
install-gtk:
|
||||
endif
|
||||
|
||||
install-tools: all install-gtk
|
||||
$(call QUIET_INSTALL, binaries) \
|
||||
@ -687,6 +750,10 @@ endif
|
||||
ifndef NO_PERF_READ_VDSOX32
|
||||
$(call QUIET_INSTALL, perf-read-vdsox32) \
|
||||
$(INSTALL) $(OUTPUT)perf-read-vdsox32 '$(DESTDIR_SQ)$(bindir_SQ)';
|
||||
endif
|
||||
ifndef NO_JVMTI
|
||||
$(call QUIET_INSTALL, $(LIBJVMTI)) \
|
||||
$(INSTALL) $(OUTPUT)$(LIBJVMTI) '$(DESTDIR_SQ)$(libdir_SQ)';
|
||||
endif
|
||||
$(call QUIET_INSTALL, libexec) \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
|
||||
@ -754,7 +821,7 @@ clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clea
|
||||
$(call QUIET_CLEAN, core-objs) $(RM) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
|
||||
$(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
|
||||
$(Q)$(RM) $(OUTPUT).config-detected
|
||||
$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents
|
||||
$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents $(OUTPUT)$(LIBJVMTI).so
|
||||
$(call QUIET_CLEAN, core-gen) $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)FEATURE-DUMP $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex* \
|
||||
$(OUTPUT)util/intel-pt-decoder/inat-tables.c $(OUTPUT)fixdep \
|
||||
$(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \
|
||||
@ -790,3 +857,4 @@ FORCE:
|
||||
.PHONY: $(GIT-HEAD-PHONY) TAGS tags cscope FORCE prepare
|
||||
.PHONY: libtraceevent_plugins archheaders
|
||||
|
||||
endif # force_fixdep
|
||||
|
59
tools/perf/arch/arm/annotate/instructions.c
Normal file
59
tools/perf/arch/arm/annotate/instructions.c
Normal file
@ -0,0 +1,59 @@
|
||||
#include <sys/types.h>
|
||||
#include <regex.h>
|
||||
|
||||
struct arm_annotate {
|
||||
regex_t call_insn,
|
||||
jump_insn;
|
||||
};
|
||||
|
||||
static struct ins_ops *arm__associate_instruction_ops(struct arch *arch, const char *name)
|
||||
{
|
||||
struct arm_annotate *arm = arch->priv;
|
||||
struct ins_ops *ops;
|
||||
regmatch_t match[2];
|
||||
|
||||
if (!regexec(&arm->call_insn, name, 2, match, 0))
|
||||
ops = &call_ops;
|
||||
else if (!regexec(&arm->jump_insn, name, 2, match, 0))
|
||||
ops = &jump_ops;
|
||||
else
|
||||
return NULL;
|
||||
|
||||
arch__associate_ins_ops(arch, name, ops);
|
||||
return ops;
|
||||
}
|
||||
|
||||
static int arm__annotate_init(struct arch *arch)
|
||||
{
|
||||
struct arm_annotate *arm;
|
||||
int err;
|
||||
|
||||
if (arch->initialized)
|
||||
return 0;
|
||||
|
||||
arm = zalloc(sizeof(*arm));
|
||||
if (!arm)
|
||||
return -1;
|
||||
|
||||
#define ARM_CONDS "(cc|cs|eq|ge|gt|hi|le|ls|lt|mi|ne|pl|vc|vs)"
|
||||
err = regcomp(&arm->call_insn, "^blx?" ARM_CONDS "?$", REG_EXTENDED);
|
||||
if (err)
|
||||
goto out_free_arm;
|
||||
err = regcomp(&arm->jump_insn, "^bx?" ARM_CONDS "?$", REG_EXTENDED);
|
||||
if (err)
|
||||
goto out_free_call;
|
||||
#undef ARM_CONDS
|
||||
|
||||
arch->initialized = true;
|
||||
arch->priv = arm;
|
||||
arch->associate_instruction_ops = arm__associate_instruction_ops;
|
||||
arch->objdump.comment_char = ';';
|
||||
arch->objdump.skip_functions_char = '+';
|
||||
return 0;
|
||||
|
||||
out_free_call:
|
||||
regfree(&arm->call_insn);
|
||||
out_free_arm:
|
||||
free(arm);
|
||||
return -1;
|
||||
}
|
@ -575,8 +575,6 @@ static FILE *cs_device__open_file(const char *name)
|
||||
snprintf(path, PATH_MAX,
|
||||
"%s" CS_BUS_DEVICE_PATH "%s", sysfs, name);
|
||||
|
||||
printf("path: %s\n", path);
|
||||
|
||||
if (stat(path, &st) < 0)
|
||||
return NULL;
|
||||
|
||||
|
62
tools/perf/arch/arm64/annotate/instructions.c
Normal file
62
tools/perf/arch/arm64/annotate/instructions.c
Normal file
@ -0,0 +1,62 @@
|
||||
#include <sys/types.h>
|
||||
#include <regex.h>
|
||||
|
||||
struct arm64_annotate {
|
||||
regex_t call_insn,
|
||||
jump_insn;
|
||||
};
|
||||
|
||||
static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, const char *name)
|
||||
{
|
||||
struct arm64_annotate *arm = arch->priv;
|
||||
struct ins_ops *ops;
|
||||
regmatch_t match[2];
|
||||
|
||||
if (!regexec(&arm->jump_insn, name, 2, match, 0))
|
||||
ops = &jump_ops;
|
||||
else if (!regexec(&arm->call_insn, name, 2, match, 0))
|
||||
ops = &call_ops;
|
||||
else if (!strcmp(name, "ret"))
|
||||
ops = &ret_ops;
|
||||
else
|
||||
return NULL;
|
||||
|
||||
arch__associate_ins_ops(arch, name, ops);
|
||||
return ops;
|
||||
}
|
||||
|
||||
static int arm64__annotate_init(struct arch *arch)
|
||||
{
|
||||
struct arm64_annotate *arm;
|
||||
int err;
|
||||
|
||||
if (arch->initialized)
|
||||
return 0;
|
||||
|
||||
arm = zalloc(sizeof(*arm));
|
||||
if (!arm)
|
||||
return -1;
|
||||
|
||||
/* bl, blr */
|
||||
err = regcomp(&arm->call_insn, "^blr?$", REG_EXTENDED);
|
||||
if (err)
|
||||
goto out_free_arm;
|
||||
/* b, b.cond, br, cbz/cbnz, tbz/tbnz */
|
||||
err = regcomp(&arm->jump_insn, "^[ct]?br?\\.?(cc|cs|eq|ge|gt|hi|le|ls|lt|mi|ne|pl)?n?z?$",
|
||||
REG_EXTENDED);
|
||||
if (err)
|
||||
goto out_free_call;
|
||||
|
||||
arch->initialized = true;
|
||||
arch->priv = arm;
|
||||
arch->associate_instruction_ops = arm64__associate_instruction_ops;
|
||||
arch->objdump.comment_char = ';';
|
||||
arch->objdump.skip_functions_char = '+';
|
||||
return 0;
|
||||
|
||||
out_free_call:
|
||||
regfree(&arm->call_insn);
|
||||
out_free_arm:
|
||||
free(arm);
|
||||
return -1;
|
||||
}
|
58
tools/perf/arch/powerpc/annotate/instructions.c
Normal file
58
tools/perf/arch/powerpc/annotate/instructions.c
Normal file
@ -0,0 +1,58 @@
|
||||
static struct ins_ops *powerpc__associate_instruction_ops(struct arch *arch, const char *name)
|
||||
{
|
||||
int i;
|
||||
struct ins_ops *ops;
|
||||
|
||||
/*
|
||||
* - Interested only if instruction starts with 'b'.
|
||||
* - Few start with 'b', but aren't branch instructions.
|
||||
*/
|
||||
if (name[0] != 'b' ||
|
||||
!strncmp(name, "bcd", 3) ||
|
||||
!strncmp(name, "brinc", 5) ||
|
||||
!strncmp(name, "bper", 4))
|
||||
return NULL;
|
||||
|
||||
ops = &jump_ops;
|
||||
|
||||
i = strlen(name) - 1;
|
||||
if (i < 0)
|
||||
return NULL;
|
||||
|
||||
/* ignore optional hints at the end of the instructions */
|
||||
if (name[i] == '+' || name[i] == '-')
|
||||
i--;
|
||||
|
||||
if (name[i] == 'l' || (name[i] == 'a' && name[i-1] == 'l')) {
|
||||
/*
|
||||
* if the instruction ends up with 'l' or 'la', then
|
||||
* those are considered 'calls' since they update LR.
|
||||
* ... except for 'bnl' which is branch if not less than
|
||||
* and the absolute form of the same.
|
||||
*/
|
||||
if (strcmp(name, "bnl") && strcmp(name, "bnl+") &&
|
||||
strcmp(name, "bnl-") && strcmp(name, "bnla") &&
|
||||
strcmp(name, "bnla+") && strcmp(name, "bnla-"))
|
||||
ops = &call_ops;
|
||||
}
|
||||
if (name[i] == 'r' && name[i-1] == 'l')
|
||||
/*
|
||||
* instructions ending with 'lr' are considered to be
|
||||
* return instructions
|
||||
*/
|
||||
ops = &ret_ops;
|
||||
|
||||
arch__associate_ins_ops(arch, name, ops);
|
||||
return ops;
|
||||
}
|
||||
|
||||
static int powerpc__annotate_init(struct arch *arch)
|
||||
{
|
||||
if (!arch->initialized) {
|
||||
arch->initialized = true;
|
||||
arch->associate_instruction_ops = powerpc__associate_instruction_ops;
|
||||
arch->objdump.comment_char = '#';
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
78
tools/perf/arch/x86/annotate/instructions.c
Normal file
78
tools/perf/arch/x86/annotate/instructions.c
Normal file
@ -0,0 +1,78 @@
|
||||
static struct ins x86__instructions[] = {
|
||||
{ .name = "add", .ops = &mov_ops, },
|
||||
{ .name = "addl", .ops = &mov_ops, },
|
||||
{ .name = "addq", .ops = &mov_ops, },
|
||||
{ .name = "addw", .ops = &mov_ops, },
|
||||
{ .name = "and", .ops = &mov_ops, },
|
||||
{ .name = "bts", .ops = &mov_ops, },
|
||||
{ .name = "call", .ops = &call_ops, },
|
||||
{ .name = "callq", .ops = &call_ops, },
|
||||
{ .name = "cmp", .ops = &mov_ops, },
|
||||
{ .name = "cmpb", .ops = &mov_ops, },
|
||||
{ .name = "cmpl", .ops = &mov_ops, },
|
||||
{ .name = "cmpq", .ops = &mov_ops, },
|
||||
{ .name = "cmpw", .ops = &mov_ops, },
|
||||
{ .name = "cmpxch", .ops = &mov_ops, },
|
||||
{ .name = "dec", .ops = &dec_ops, },
|
||||
{ .name = "decl", .ops = &dec_ops, },
|
||||
{ .name = "imul", .ops = &mov_ops, },
|
||||
{ .name = "inc", .ops = &dec_ops, },
|
||||
{ .name = "incl", .ops = &dec_ops, },
|
||||
{ .name = "ja", .ops = &jump_ops, },
|
||||
{ .name = "jae", .ops = &jump_ops, },
|
||||
{ .name = "jb", .ops = &jump_ops, },
|
||||
{ .name = "jbe", .ops = &jump_ops, },
|
||||
{ .name = "jc", .ops = &jump_ops, },
|
||||
{ .name = "jcxz", .ops = &jump_ops, },
|
||||
{ .name = "je", .ops = &jump_ops, },
|
||||
{ .name = "jecxz", .ops = &jump_ops, },
|
||||
{ .name = "jg", .ops = &jump_ops, },
|
||||
{ .name = "jge", .ops = &jump_ops, },
|
||||
{ .name = "jl", .ops = &jump_ops, },
|
||||
{ .name = "jle", .ops = &jump_ops, },
|
||||
{ .name = "jmp", .ops = &jump_ops, },
|
||||
{ .name = "jmpq", .ops = &jump_ops, },
|
||||
{ .name = "jna", .ops = &jump_ops, },
|
||||
{ .name = "jnae", .ops = &jump_ops, },
|
||||
{ .name = "jnb", .ops = &jump_ops, },
|
||||
{ .name = "jnbe", .ops = &jump_ops, },
|
||||
{ .name = "jnc", .ops = &jump_ops, },
|
||||
{ .name = "jne", .ops = &jump_ops, },
|
||||
{ .name = "jng", .ops = &jump_ops, },
|
||||
{ .name = "jnge", .ops = &jump_ops, },
|
||||
{ .name = "jnl", .ops = &jump_ops, },
|
||||
{ .name = "jnle", .ops = &jump_ops, },
|
||||
{ .name = "jno", .ops = &jump_ops, },
|
||||
{ .name = "jnp", .ops = &jump_ops, },
|
||||
{ .name = "jns", .ops = &jump_ops, },
|
||||
{ .name = "jnz", .ops = &jump_ops, },
|
||||
{ .name = "jo", .ops = &jump_ops, },
|
||||
{ .name = "jp", .ops = &jump_ops, },
|
||||
{ .name = "jpe", .ops = &jump_ops, },
|
||||
{ .name = "jpo", .ops = &jump_ops, },
|
||||
{ .name = "jrcxz", .ops = &jump_ops, },
|
||||
{ .name = "js", .ops = &jump_ops, },
|
||||
{ .name = "jz", .ops = &jump_ops, },
|
||||
{ .name = "lea", .ops = &mov_ops, },
|
||||
{ .name = "lock", .ops = &lock_ops, },
|
||||
{ .name = "mov", .ops = &mov_ops, },
|
||||
{ .name = "movb", .ops = &mov_ops, },
|
||||
{ .name = "movdqa", .ops = &mov_ops, },
|
||||
{ .name = "movl", .ops = &mov_ops, },
|
||||
{ .name = "movq", .ops = &mov_ops, },
|
||||
{ .name = "movslq", .ops = &mov_ops, },
|
||||
{ .name = "movzbl", .ops = &mov_ops, },
|
||||
{ .name = "movzwl", .ops = &mov_ops, },
|
||||
{ .name = "nop", .ops = &nop_ops, },
|
||||
{ .name = "nopl", .ops = &nop_ops, },
|
||||
{ .name = "nopw", .ops = &nop_ops, },
|
||||
{ .name = "or", .ops = &mov_ops, },
|
||||
{ .name = "orl", .ops = &mov_ops, },
|
||||
{ .name = "test", .ops = &mov_ops, },
|
||||
{ .name = "testb", .ops = &mov_ops, },
|
||||
{ .name = "testl", .ops = &mov_ops, },
|
||||
{ .name = "xadd", .ops = &mov_ops, },
|
||||
{ .name = "xbeginl", .ops = &jump_ops, },
|
||||
{ .name = "xbeginq", .ops = &jump_ops, },
|
||||
{ .name = "retq", .ops = &ret_ops, },
|
||||
};
|
@ -335,6 +335,9 @@
|
||||
326 common copy_file_range sys_copy_file_range
|
||||
327 64 preadv2 sys_preadv2
|
||||
328 64 pwritev2 sys_pwritev2
|
||||
329 common pkey_mprotect sys_pkey_mprotect
|
||||
330 common pkey_alloc sys_pkey_alloc
|
||||
331 common pkey_free sys_pkey_free
|
||||
|
||||
#
|
||||
# x32-specific system call numbers start at 512 to avoid cache impact
|
||||
@ -374,5 +377,5 @@
|
||||
543 x32 io_setup compat_sys_io_setup
|
||||
544 x32 io_submit compat_sys_io_submit
|
||||
545 x32 execveat compat_sys_execveat/ptregs
|
||||
534 x32 preadv2 compat_sys_preadv2
|
||||
535 x32 pwritev2 compat_sys_pwritev2
|
||||
546 x32 preadv2 compat_sys_preadv64v2
|
||||
547 x32 pwritev2 compat_sys_pwritev64v2
|
||||
|
@ -4,27 +4,27 @@
|
||||
|
||||
struct test arch_tests[] = {
|
||||
{
|
||||
.desc = "x86 rdpmc test",
|
||||
.desc = "x86 rdpmc",
|
||||
.func = test__rdpmc,
|
||||
},
|
||||
{
|
||||
.desc = "Test converting perf time to TSC",
|
||||
.desc = "Convert perf time to TSC",
|
||||
.func = test__perf_time_to_tsc,
|
||||
},
|
||||
#ifdef HAVE_DWARF_UNWIND_SUPPORT
|
||||
{
|
||||
.desc = "Test dwarf unwind",
|
||||
.desc = "DWARF unwind",
|
||||
.func = test__dwarf_unwind,
|
||||
},
|
||||
#endif
|
||||
#ifdef HAVE_AUXTRACE_SUPPORT
|
||||
{
|
||||
.desc = "Test x86 instruction decoder - new instructions",
|
||||
.desc = "x86 instruction decoder - new instructions",
|
||||
.func = test__insn_x86,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.desc = "Test intel cqm nmi context read",
|
||||
.desc = "Intel cqm nmi context read",
|
||||
.func = test__intel_cqm_count_nmi_context,
|
||||
},
|
||||
{
|
||||
|
@ -63,8 +63,9 @@ static const char * const bench_futex_hash_usage[] = {
|
||||
static void *workerfn(void *arg)
|
||||
{
|
||||
int ret;
|
||||
unsigned int i;
|
||||
struct worker *w = (struct worker *) arg;
|
||||
unsigned int i;
|
||||
unsigned long ops = w->ops; /* avoid cacheline bouncing */
|
||||
|
||||
pthread_mutex_lock(&thread_lock);
|
||||
threads_starting--;
|
||||
@ -74,7 +75,7 @@ static void *workerfn(void *arg)
|
||||
pthread_mutex_unlock(&thread_lock);
|
||||
|
||||
do {
|
||||
for (i = 0; i < nfutexes; i++, w->ops++) {
|
||||
for (i = 0; i < nfutexes; i++, ops++) {
|
||||
/*
|
||||
* We want the futex calls to fail in order to stress
|
||||
* the hashing of uaddr and not measure other steps,
|
||||
@ -88,6 +89,7 @@ static void *workerfn(void *arg)
|
||||
}
|
||||
} while (!done);
|
||||
|
||||
w->ops = ops;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -128,6 +130,8 @@ int bench_futex_hash(int argc, const char **argv,
|
||||
}
|
||||
|
||||
ncpus = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
nsecs = futexbench_sanitize_numeric(nsecs);
|
||||
nfutexes = futexbench_sanitize_numeric(nfutexes);
|
||||
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
@ -135,6 +139,8 @@ int bench_futex_hash(int argc, const char **argv,
|
||||
|
||||
if (!nthreads) /* default to the number of CPUs */
|
||||
nthreads = ncpus;
|
||||
else
|
||||
nthreads = futexbench_sanitize_numeric(nthreads);
|
||||
|
||||
worker = calloc(nthreads, sizeof(*worker));
|
||||
if (!worker)
|
||||
|
@ -75,6 +75,7 @@ static void toggle_done(int sig __maybe_unused,
|
||||
static void *workerfn(void *arg)
|
||||
{
|
||||
struct worker *w = (struct worker *) arg;
|
||||
unsigned long ops = w->ops;
|
||||
|
||||
pthread_mutex_lock(&thread_lock);
|
||||
threads_starting--;
|
||||
@ -103,9 +104,10 @@ static void *workerfn(void *arg)
|
||||
if (ret && !silent)
|
||||
warn("thread %d: Could not unlock pi-lock for %p (%d)",
|
||||
w->tid, w->futex, ret);
|
||||
w->ops++; /* account for thread's share of work */
|
||||
ops++; /* account for thread's share of work */
|
||||
} while (!done);
|
||||
|
||||
w->ops = ops;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -150,6 +152,7 @@ int bench_futex_lock_pi(int argc, const char **argv,
|
||||
goto err;
|
||||
|
||||
ncpus = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
nsecs = futexbench_sanitize_numeric(nsecs);
|
||||
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
@ -157,6 +160,8 @@ int bench_futex_lock_pi(int argc, const char **argv,
|
||||
|
||||
if (!nthreads)
|
||||
nthreads = ncpus;
|
||||
else
|
||||
nthreads = futexbench_sanitize_numeric(nthreads);
|
||||
|
||||
worker = calloc(nthreads, sizeof(*worker));
|
||||
if (!worker)
|
||||
|
@ -128,6 +128,8 @@ int bench_futex_requeue(int argc, const char **argv,
|
||||
|
||||
if (!nthreads)
|
||||
nthreads = ncpus;
|
||||
else
|
||||
nthreads = futexbench_sanitize_numeric(nthreads);
|
||||
|
||||
worker = calloc(nthreads, sizeof(*worker));
|
||||
if (!worker)
|
||||
|
@ -217,8 +217,12 @@ int bench_futex_wake_parallel(int argc, const char **argv,
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
|
||||
ncpus = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
nwaking_threads = futexbench_sanitize_numeric(nwaking_threads);
|
||||
|
||||
if (!nblocked_threads)
|
||||
nblocked_threads = ncpus;
|
||||
else
|
||||
nblocked_threads = futexbench_sanitize_numeric(nblocked_threads);
|
||||
|
||||
/* some sanity checks */
|
||||
if (nwaking_threads > nblocked_threads || !nwaking_threads)
|
||||
|
@ -129,6 +129,7 @@ int bench_futex_wake(int argc, const char **argv,
|
||||
}
|
||||
|
||||
ncpus = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
nwakes = futexbench_sanitize_numeric(nwakes);
|
||||
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
@ -136,6 +137,8 @@ int bench_futex_wake(int argc, const char **argv,
|
||||
|
||||
if (!nthreads)
|
||||
nthreads = ncpus;
|
||||
else
|
||||
nthreads = futexbench_sanitize_numeric(nthreads);
|
||||
|
||||
worker = calloc(nthreads, sizeof(*worker));
|
||||
if (!worker)
|
||||
|
@ -7,6 +7,7 @@
|
||||
#ifndef _FUTEX_H
|
||||
#define _FUTEX_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/types.h>
|
||||
@ -99,4 +100,7 @@ static inline int pthread_attr_setaffinity_np(pthread_attr_t *attr,
|
||||
}
|
||||
#endif
|
||||
|
||||
/* User input sanitation */
|
||||
#define futexbench_sanitize_numeric(__n) abs((__n))
|
||||
|
||||
#endif /* _FUTEX_H */
|
||||
|
@ -106,9 +106,10 @@ static double timeval2double(struct timeval *ts)
|
||||
|
||||
struct bench_mem_info {
|
||||
const struct function *functions;
|
||||
u64 (*do_cycles)(const struct function *r, size_t size);
|
||||
double (*do_gettimeofday)(const struct function *r, size_t size);
|
||||
u64 (*do_cycles)(const struct function *r, size_t size, void *src, void *dst);
|
||||
double (*do_gettimeofday)(const struct function *r, size_t size, void *src, void *dst);
|
||||
const char *const *usage;
|
||||
bool alloc_src;
|
||||
};
|
||||
|
||||
static void __bench_mem_function(struct bench_mem_info *info, int r_idx, size_t size, double size_total)
|
||||
@ -116,16 +117,26 @@ static void __bench_mem_function(struct bench_mem_info *info, int r_idx, size_t
|
||||
const struct function *r = &info->functions[r_idx];
|
||||
double result_bps = 0.0;
|
||||
u64 result_cycles = 0;
|
||||
void *src = NULL, *dst = zalloc(size);
|
||||
|
||||
printf("# function '%s' (%s)\n", r->name, r->desc);
|
||||
|
||||
if (dst == NULL)
|
||||
goto out_alloc_failed;
|
||||
|
||||
if (info->alloc_src) {
|
||||
src = zalloc(size);
|
||||
if (src == NULL)
|
||||
goto out_alloc_failed;
|
||||
}
|
||||
|
||||
if (bench_format == BENCH_FORMAT_DEFAULT)
|
||||
printf("# Copying %s bytes ...\n\n", size_str);
|
||||
|
||||
if (use_cycles) {
|
||||
result_cycles = info->do_cycles(r, size);
|
||||
result_cycles = info->do_cycles(r, size, src, dst);
|
||||
} else {
|
||||
result_bps = info->do_gettimeofday(r, size);
|
||||
result_bps = info->do_gettimeofday(r, size, src, dst);
|
||||
}
|
||||
|
||||
switch (bench_format) {
|
||||
@ -149,6 +160,14 @@ static void __bench_mem_function(struct bench_mem_info *info, int r_idx, size_t
|
||||
BUG_ON(1);
|
||||
break;
|
||||
}
|
||||
|
||||
out_free:
|
||||
free(src);
|
||||
free(dst);
|
||||
return;
|
||||
out_alloc_failed:
|
||||
printf("# Memory allocation failed - maybe size (%s) is too large?\n", size_str);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
static int bench_mem_common(int argc, const char **argv, struct bench_mem_info *info)
|
||||
@ -201,28 +220,14 @@ static int bench_mem_common(int argc, const char **argv, struct bench_mem_info *
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void memcpy_alloc_mem(void **dst, void **src, size_t size)
|
||||
{
|
||||
*dst = zalloc(size);
|
||||
if (!*dst)
|
||||
die("memory allocation failed - maybe size is too large?\n");
|
||||
|
||||
*src = zalloc(size);
|
||||
if (!*src)
|
||||
die("memory allocation failed - maybe size is too large?\n");
|
||||
|
||||
/* Make sure to always prefault zero pages even if MMAP_THRESH is crossed: */
|
||||
memset(*src, 0, size);
|
||||
}
|
||||
|
||||
static u64 do_memcpy_cycles(const struct function *r, size_t size)
|
||||
static u64 do_memcpy_cycles(const struct function *r, size_t size, void *src, void *dst)
|
||||
{
|
||||
u64 cycle_start = 0ULL, cycle_end = 0ULL;
|
||||
void *src = NULL, *dst = NULL;
|
||||
memcpy_t fn = r->fn.memcpy;
|
||||
int i;
|
||||
|
||||
memcpy_alloc_mem(&dst, &src, size);
|
||||
/* Make sure to always prefault zero pages even if MMAP_THRESH is crossed: */
|
||||
memset(src, 0, size);
|
||||
|
||||
/*
|
||||
* We prefault the freshly allocated memory range here,
|
||||
@ -235,20 +240,15 @@ static u64 do_memcpy_cycles(const struct function *r, size_t size)
|
||||
fn(dst, src, size);
|
||||
cycle_end = get_cycles();
|
||||
|
||||
free(src);
|
||||
free(dst);
|
||||
return cycle_end - cycle_start;
|
||||
}
|
||||
|
||||
static double do_memcpy_gettimeofday(const struct function *r, size_t size)
|
||||
static double do_memcpy_gettimeofday(const struct function *r, size_t size, void *src, void *dst)
|
||||
{
|
||||
struct timeval tv_start, tv_end, tv_diff;
|
||||
memcpy_t fn = r->fn.memcpy;
|
||||
void *src = NULL, *dst = NULL;
|
||||
int i;
|
||||
|
||||
memcpy_alloc_mem(&dst, &src, size);
|
||||
|
||||
/*
|
||||
* We prefault the freshly allocated memory range here,
|
||||
* to not measure page fault overhead:
|
||||
@ -262,9 +262,6 @@ static double do_memcpy_gettimeofday(const struct function *r, size_t size)
|
||||
|
||||
timersub(&tv_end, &tv_start, &tv_diff);
|
||||
|
||||
free(src);
|
||||
free(dst);
|
||||
|
||||
return (double)(((double)size * nr_loops) / timeval2double(&tv_diff));
|
||||
}
|
||||
|
||||
@ -294,27 +291,18 @@ int bench_mem_memcpy(int argc, const char **argv, const char *prefix __maybe_unu
|
||||
.do_cycles = do_memcpy_cycles,
|
||||
.do_gettimeofday = do_memcpy_gettimeofday,
|
||||
.usage = bench_mem_memcpy_usage,
|
||||
.alloc_src = true,
|
||||
};
|
||||
|
||||
return bench_mem_common(argc, argv, &info);
|
||||
}
|
||||
|
||||
static void memset_alloc_mem(void **dst, size_t size)
|
||||
{
|
||||
*dst = zalloc(size);
|
||||
if (!*dst)
|
||||
die("memory allocation failed - maybe size is too large?\n");
|
||||
}
|
||||
|
||||
static u64 do_memset_cycles(const struct function *r, size_t size)
|
||||
static u64 do_memset_cycles(const struct function *r, size_t size, void *src __maybe_unused, void *dst)
|
||||
{
|
||||
u64 cycle_start = 0ULL, cycle_end = 0ULL;
|
||||
memset_t fn = r->fn.memset;
|
||||
void *dst = NULL;
|
||||
int i;
|
||||
|
||||
memset_alloc_mem(&dst, size);
|
||||
|
||||
/*
|
||||
* We prefault the freshly allocated memory range here,
|
||||
* to not measure page fault overhead:
|
||||
@ -326,19 +314,15 @@ static u64 do_memset_cycles(const struct function *r, size_t size)
|
||||
fn(dst, i, size);
|
||||
cycle_end = get_cycles();
|
||||
|
||||
free(dst);
|
||||
return cycle_end - cycle_start;
|
||||
}
|
||||
|
||||
static double do_memset_gettimeofday(const struct function *r, size_t size)
|
||||
static double do_memset_gettimeofday(const struct function *r, size_t size, void *src __maybe_unused, void *dst)
|
||||
{
|
||||
struct timeval tv_start, tv_end, tv_diff;
|
||||
memset_t fn = r->fn.memset;
|
||||
void *dst = NULL;
|
||||
int i;
|
||||
|
||||
memset_alloc_mem(&dst, size);
|
||||
|
||||
/*
|
||||
* We prefault the freshly allocated memory range here,
|
||||
* to not measure page fault overhead:
|
||||
@ -352,7 +336,6 @@ static double do_memset_gettimeofday(const struct function *r, size_t size)
|
||||
|
||||
timersub(&tv_end, &tv_start, &tv_diff);
|
||||
|
||||
free(dst);
|
||||
return (double)(((double)size * nr_loops) / timeval2double(&tv_diff));
|
||||
}
|
||||
|
||||
|
2780
tools/perf/builtin-c2c.c
Normal file
2780
tools/perf/builtin-c2c.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -17,7 +17,7 @@
|
||||
static bool use_system_config, use_user_config;
|
||||
|
||||
static const char * const config_usage[] = {
|
||||
"perf config [<file-option>] [options]",
|
||||
"perf config [<file-option>] [options] [section.name[=value] ...]",
|
||||
NULL
|
||||
};
|
||||
|
||||
@ -33,6 +33,73 @@ static struct option config_options[] = {
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
static int set_config(struct perf_config_set *set, const char *file_name,
|
||||
const char *var, const char *value)
|
||||
{
|
||||
struct perf_config_section *section = NULL;
|
||||
struct perf_config_item *item = NULL;
|
||||
const char *first_line = "# this file is auto-generated.";
|
||||
FILE *fp;
|
||||
|
||||
if (set == NULL)
|
||||
return -1;
|
||||
|
||||
fp = fopen(file_name, "w");
|
||||
if (!fp)
|
||||
return -1;
|
||||
|
||||
perf_config_set__collect(set, file_name, var, value);
|
||||
fprintf(fp, "%s\n", first_line);
|
||||
|
||||
/* overwrite configvariables */
|
||||
perf_config_items__for_each_entry(&set->sections, section) {
|
||||
if (!use_system_config && section->from_system_config)
|
||||
continue;
|
||||
fprintf(fp, "[%s]\n", section->name);
|
||||
|
||||
perf_config_items__for_each_entry(§ion->items, item) {
|
||||
if (!use_system_config && section->from_system_config)
|
||||
continue;
|
||||
if (item->value)
|
||||
fprintf(fp, "\t%s = %s\n",
|
||||
item->name, item->value);
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int show_spec_config(struct perf_config_set *set, const char *var)
|
||||
{
|
||||
struct perf_config_section *section;
|
||||
struct perf_config_item *item;
|
||||
|
||||
if (set == NULL)
|
||||
return -1;
|
||||
|
||||
perf_config_items__for_each_entry(&set->sections, section) {
|
||||
if (prefixcmp(var, section->name) != 0)
|
||||
continue;
|
||||
|
||||
perf_config_items__for_each_entry(§ion->items, item) {
|
||||
const char *name = var + strlen(section->name) + 1;
|
||||
|
||||
if (strcmp(name, item->name) == 0) {
|
||||
char *value = item->value;
|
||||
|
||||
if (value) {
|
||||
printf("%s=%s\n", var, value);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int show_config(struct perf_config_set *set)
|
||||
{
|
||||
struct perf_config_section *section;
|
||||
@ -52,9 +119,44 @@ static int show_config(struct perf_config_set *set)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_config_arg(char *arg, char **var, char **value)
|
||||
{
|
||||
const char *last_dot = strchr(arg, '.');
|
||||
|
||||
/*
|
||||
* Since "var" actually contains the section name and the real
|
||||
* config variable name separated by a dot, we have to know where the dot is.
|
||||
*/
|
||||
if (last_dot == NULL || last_dot == arg) {
|
||||
pr_err("The config variable does not contain a section name: %s\n", arg);
|
||||
return -1;
|
||||
}
|
||||
if (!last_dot[1]) {
|
||||
pr_err("The config variable does not contain a variable name: %s\n", arg);
|
||||
return -1;
|
||||
}
|
||||
|
||||
*value = strchr(arg, '=');
|
||||
if (*value == NULL)
|
||||
*var = arg;
|
||||
else if (!strcmp(*value, "=")) {
|
||||
pr_err("The config variable does not contain a value: %s\n", arg);
|
||||
return -1;
|
||||
} else {
|
||||
*value = *value + 1; /* excluding a first character '=' */
|
||||
*var = strsep(&arg, "=");
|
||||
if (*var[0] == '\0') {
|
||||
pr_err("invalid config variable: %s\n", arg);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||
{
|
||||
int ret = 0;
|
||||
int i, ret = 0;
|
||||
struct perf_config_set *set;
|
||||
char *user_config = mkpath("%s/.perfconfig", getenv("HOME"));
|
||||
|
||||
@ -100,7 +202,36 @@ int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||
}
|
||||
break;
|
||||
default:
|
||||
usage_with_options(config_usage, config_options);
|
||||
if (argc) {
|
||||
for (i = 0; argv[i]; i++) {
|
||||
char *var, *value;
|
||||
char *arg = strdup(argv[i]);
|
||||
|
||||
if (!arg) {
|
||||
pr_err("%s: strdup failed\n", __func__);
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (parse_config_arg(arg, &var, &value) < 0) {
|
||||
free(arg);
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (value == NULL)
|
||||
ret = show_spec_config(set, var);
|
||||
else {
|
||||
const char *config_filename = config_exclusive_filename;
|
||||
|
||||
if (!config_exclusive_filename)
|
||||
config_filename = user_config;
|
||||
ret = set_config(set, config_filename, var, value);
|
||||
}
|
||||
free(arg);
|
||||
}
|
||||
} else
|
||||
usage_with_options(config_usage, config_options);
|
||||
}
|
||||
|
||||
perf_config_set__delete(set);
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "util/session.h"
|
||||
#include "util/tool.h"
|
||||
#include "util/callchain.h"
|
||||
#include "util/time-utils.h"
|
||||
|
||||
#include <subcmd/parse-options.h>
|
||||
#include "util/trace-event.h"
|
||||
@ -49,6 +50,7 @@ struct alloc_stat {
|
||||
u64 ptr;
|
||||
u64 bytes_req;
|
||||
u64 bytes_alloc;
|
||||
u64 last_alloc;
|
||||
u32 hit;
|
||||
u32 pingpong;
|
||||
|
||||
@ -62,9 +64,13 @@ static struct rb_root root_alloc_sorted;
|
||||
static struct rb_root root_caller_stat;
|
||||
static struct rb_root root_caller_sorted;
|
||||
|
||||
static unsigned long total_requested, total_allocated;
|
||||
static unsigned long total_requested, total_allocated, total_freed;
|
||||
static unsigned long nr_allocs, nr_cross_allocs;
|
||||
|
||||
/* filters for controlling start and stop of time of analysis */
|
||||
static struct perf_time_interval ptime;
|
||||
const char *time_str;
|
||||
|
||||
static int insert_alloc_stat(unsigned long call_site, unsigned long ptr,
|
||||
int bytes_req, int bytes_alloc, int cpu)
|
||||
{
|
||||
@ -105,6 +111,8 @@ static int insert_alloc_stat(unsigned long call_site, unsigned long ptr,
|
||||
}
|
||||
data->call_site = call_site;
|
||||
data->alloc_cpu = cpu;
|
||||
data->last_alloc = bytes_alloc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -223,6 +231,8 @@ static int perf_evsel__process_free_event(struct perf_evsel *evsel,
|
||||
if (!s_alloc)
|
||||
return 0;
|
||||
|
||||
total_freed += s_alloc->last_alloc;
|
||||
|
||||
if ((short)sample->cpu != s_alloc->alloc_cpu) {
|
||||
s_alloc->pingpong++;
|
||||
|
||||
@ -907,6 +917,15 @@ static int perf_evsel__process_page_free_event(struct perf_evsel *evsel,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool perf_kmem__skip_sample(struct perf_sample *sample)
|
||||
{
|
||||
/* skip sample based on time? */
|
||||
if (perf_time__skip_sample(&ptime, sample->time))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
typedef int (*tracepoint_handler)(struct perf_evsel *evsel,
|
||||
struct perf_sample *sample);
|
||||
|
||||
@ -926,6 +945,9 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (perf_kmem__skip_sample(sample))
|
||||
return 0;
|
||||
|
||||
dump_printf(" ... thread: %s:%d\n", thread__comm_str(thread), thread->tid);
|
||||
|
||||
if (evsel->handler != NULL) {
|
||||
@ -1128,6 +1150,11 @@ static void print_slab_summary(void)
|
||||
printf("\n========================\n");
|
||||
printf("Total bytes requested: %'lu\n", total_requested);
|
||||
printf("Total bytes allocated: %'lu\n", total_allocated);
|
||||
printf("Total bytes freed: %'lu\n", total_freed);
|
||||
if (total_allocated > total_freed) {
|
||||
printf("Net total bytes allocated: %'lu\n",
|
||||
total_allocated - total_freed);
|
||||
}
|
||||
printf("Total bytes wasted on internal fragmentation: %'lu\n",
|
||||
total_allocated - total_requested);
|
||||
printf("Internal fragmentation: %f%%\n",
|
||||
@ -1884,6 +1911,8 @@ int cmd_kmem(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||
OPT_CALLBACK_NOOPT(0, "page", NULL, NULL, "Analyze page allocator",
|
||||
parse_page_opt),
|
||||
OPT_BOOLEAN(0, "live", &live_page, "Show live page stat"),
|
||||
OPT_STRING(0, "time", &time_str, "str",
|
||||
"Time span of interest (start,stop)"),
|
||||
OPT_END()
|
||||
};
|
||||
const char *const kmem_subcommands[] = { "record", "stat", NULL };
|
||||
@ -1944,6 +1973,11 @@ int cmd_kmem(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||
|
||||
symbol__init(&session->header.env);
|
||||
|
||||
if (perf_time__parse_str(&ptime, time_str) != 0) {
|
||||
pr_err("Invalid time string\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!strcmp(argv[0], "stat")) {
|
||||
setlocale(LC_ALL, "");
|
||||
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include "util/llvm-utils.h"
|
||||
#include "util/bpf-loader.h"
|
||||
#include "util/trigger.h"
|
||||
#include "util/perf-hooks.h"
|
||||
#include "asm/bug.h"
|
||||
|
||||
#include <unistd.h>
|
||||
@ -206,6 +207,12 @@ static void sig_handler(int sig)
|
||||
done = 1;
|
||||
}
|
||||
|
||||
static void sigsegv_handler(int sig)
|
||||
{
|
||||
perf_hooks__recover();
|
||||
sighandler_dump_stack(sig);
|
||||
}
|
||||
|
||||
static void record__sig_exit(void)
|
||||
{
|
||||
if (signr == -1)
|
||||
@ -833,6 +840,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
signal(SIGCHLD, sig_handler);
|
||||
signal(SIGINT, sig_handler);
|
||||
signal(SIGTERM, sig_handler);
|
||||
signal(SIGSEGV, sigsegv_handler);
|
||||
|
||||
if (rec->opts.auxtrace_snapshot_mode || rec->switch_output) {
|
||||
signal(SIGUSR2, snapshot_sig_handler);
|
||||
@ -970,6 +978,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
|
||||
trigger_ready(&auxtrace_snapshot_trigger);
|
||||
trigger_ready(&switch_output_trigger);
|
||||
perf_hooks__invoke_record_start();
|
||||
for (;;) {
|
||||
unsigned long long hits = rec->samples;
|
||||
|
||||
@ -1114,6 +1123,8 @@ out_child:
|
||||
}
|
||||
}
|
||||
|
||||
perf_hooks__invoke_record_end();
|
||||
|
||||
if (!err && !quiet) {
|
||||
char samples[128];
|
||||
const char *postfix = rec->timestamp_filename ?
|
||||
|
@ -36,7 +36,7 @@
|
||||
#include "util/hist.h"
|
||||
#include "util/data.h"
|
||||
#include "arch/common.h"
|
||||
|
||||
#include "util/time-utils.h"
|
||||
#include "util/auxtrace.h"
|
||||
|
||||
#include <dlfcn.h>
|
||||
@ -59,6 +59,8 @@ struct report {
|
||||
const char *pretty_printing_style;
|
||||
const char *cpu_list;
|
||||
const char *symbol_filter_str;
|
||||
const char *time_str;
|
||||
struct perf_time_interval ptime;
|
||||
float min_percent;
|
||||
u64 nr_entries;
|
||||
u64 queue_size;
|
||||
@ -158,6 +160,9 @@ static int process_sample_event(struct perf_tool *tool,
|
||||
};
|
||||
int ret = 0;
|
||||
|
||||
if (perf_time__skip_sample(&rep->ptime, sample->time))
|
||||
return 0;
|
||||
|
||||
if (machine__resolve(machine, &al, sample) < 0) {
|
||||
pr_debug("problem processing %d event, skipping it.\n",
|
||||
event->header.type);
|
||||
@ -207,11 +212,14 @@ static int process_read_event(struct perf_tool *tool,
|
||||
|
||||
if (rep->show_threads) {
|
||||
const char *name = evsel ? perf_evsel__name(evsel) : "unknown";
|
||||
perf_read_values_add_value(&rep->show_threads_values,
|
||||
int err = perf_read_values_add_value(&rep->show_threads_values,
|
||||
event->read.pid, event->read.tid,
|
||||
event->read.id,
|
||||
name,
|
||||
event->read.value);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
dump_printf(": %d %d %s %" PRIu64 "\n", event->read.pid, event->read.tid,
|
||||
@ -539,8 +547,11 @@ static int __cmd_report(struct report *rep)
|
||||
}
|
||||
}
|
||||
|
||||
if (rep->show_threads)
|
||||
perf_read_values_init(&rep->show_threads_values);
|
||||
if (rep->show_threads) {
|
||||
ret = perf_read_values_init(&rep->show_threads_values);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = report__setup_sample_type(rep);
|
||||
if (ret) {
|
||||
@ -824,6 +835,8 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||
OPT_CALLBACK_DEFAULT(0, "stdio-color", NULL, "mode",
|
||||
"'always' (default), 'never' or 'auto' only applicable to --stdio mode",
|
||||
stdio__config_color, "always"),
|
||||
OPT_STRING(0, "time", &report.time_str, "str",
|
||||
"Time span of interest (start,stop)"),
|
||||
OPT_END()
|
||||
};
|
||||
struct perf_data_file file = {
|
||||
@ -905,6 +918,9 @@ repeat:
|
||||
if (itrace_synth_opts.last_branch)
|
||||
has_br_stack = true;
|
||||
|
||||
if (has_br_stack && branch_call_mode)
|
||||
symbol_conf.show_branchflag_count = true;
|
||||
|
||||
/*
|
||||
* Branch mode is a tristate:
|
||||
* -1 means default, so decide based on the file having branch data.
|
||||
@ -1006,6 +1022,11 @@ repeat:
|
||||
if (symbol__init(&session->header.env) < 0)
|
||||
goto error;
|
||||
|
||||
if (perf_time__parse_str(&report.ptime, report.time_str) != 0) {
|
||||
pr_err("Invalid time string\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
sort__setup_elide(stdout);
|
||||
|
||||
ret = __cmd_report(&report);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -22,6 +22,7 @@
|
||||
#include "util/thread_map.h"
|
||||
#include "util/stat.h"
|
||||
#include "util/thread-stack.h"
|
||||
#include "util/time-utils.h"
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/time64.h>
|
||||
@ -66,6 +67,8 @@ enum perf_output_field {
|
||||
PERF_OUTPUT_WEIGHT = 1U << 18,
|
||||
PERF_OUTPUT_BPF_OUTPUT = 1U << 19,
|
||||
PERF_OUTPUT_CALLINDENT = 1U << 20,
|
||||
PERF_OUTPUT_INSN = 1U << 21,
|
||||
PERF_OUTPUT_INSNLEN = 1U << 22,
|
||||
};
|
||||
|
||||
struct output_option {
|
||||
@ -93,6 +96,8 @@ struct output_option {
|
||||
{.str = "weight", .field = PERF_OUTPUT_WEIGHT},
|
||||
{.str = "bpf-output", .field = PERF_OUTPUT_BPF_OUTPUT},
|
||||
{.str = "callindent", .field = PERF_OUTPUT_CALLINDENT},
|
||||
{.str = "insn", .field = PERF_OUTPUT_INSN},
|
||||
{.str = "insnlen", .field = PERF_OUTPUT_INSNLEN},
|
||||
};
|
||||
|
||||
/* default set to maintain compatibility with current format */
|
||||
@ -437,7 +442,6 @@ static void print_sample_start(struct perf_sample *sample,
|
||||
{
|
||||
struct perf_event_attr *attr = &evsel->attr;
|
||||
unsigned long secs;
|
||||
unsigned long usecs;
|
||||
unsigned long long nsecs;
|
||||
|
||||
if (PRINT_FIELD(COMM)) {
|
||||
@ -467,11 +471,14 @@ static void print_sample_start(struct perf_sample *sample,
|
||||
nsecs = sample->time;
|
||||
secs = nsecs / NSEC_PER_SEC;
|
||||
nsecs -= secs * NSEC_PER_SEC;
|
||||
usecs = nsecs / NSEC_PER_USEC;
|
||||
|
||||
if (nanosecs)
|
||||
printf("%5lu.%09llu: ", secs, nsecs);
|
||||
else
|
||||
printf("%5lu.%06lu: ", secs, usecs);
|
||||
else {
|
||||
char sample_time[32];
|
||||
timestamp__scnprintf_usec(sample->time, sample_time, sizeof(sample_time));
|
||||
printf("%12s: ", sample_time);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -624,6 +631,20 @@ static void print_sample_callindent(struct perf_sample *sample,
|
||||
printf("%*s", spacing - len, "");
|
||||
}
|
||||
|
||||
static void print_insn(struct perf_sample *sample,
|
||||
struct perf_event_attr *attr)
|
||||
{
|
||||
if (PRINT_FIELD(INSNLEN))
|
||||
printf(" ilen: %d", sample->insn_len);
|
||||
if (PRINT_FIELD(INSN)) {
|
||||
int i;
|
||||
|
||||
printf(" insn:");
|
||||
for (i = 0; i < sample->insn_len; i++)
|
||||
printf(" %02x", (unsigned char)sample->insn[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void print_sample_bts(struct perf_sample *sample,
|
||||
struct perf_evsel *evsel,
|
||||
struct thread *thread,
|
||||
@ -668,6 +689,8 @@ static void print_sample_bts(struct perf_sample *sample,
|
||||
if (print_srcline_last)
|
||||
map__fprintf_srcline(al->map, al->addr, "\n ", stdout);
|
||||
|
||||
print_insn(sample, attr);
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
@ -811,6 +834,8 @@ struct perf_script {
|
||||
struct cpu_map *cpus;
|
||||
struct thread_map *threads;
|
||||
int name_width;
|
||||
const char *time_str;
|
||||
struct perf_time_interval ptime;
|
||||
};
|
||||
|
||||
static int perf_evlist__max_name_len(struct perf_evlist *evlist)
|
||||
@ -911,7 +936,7 @@ static void process_event(struct perf_script *script,
|
||||
|
||||
if (perf_evsel__is_bpf_output(evsel) && PRINT_FIELD(BPF_OUTPUT))
|
||||
print_sample_bpf_output(sample);
|
||||
|
||||
print_insn(sample, attr);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
@ -992,6 +1017,9 @@ static int process_sample_event(struct perf_tool *tool,
|
||||
struct perf_script *scr = container_of(tool, struct perf_script, tool);
|
||||
struct addr_location al;
|
||||
|
||||
if (perf_time__skip_sample(&scr->ptime, sample->time))
|
||||
return 0;
|
||||
|
||||
if (debug_mode) {
|
||||
if (sample->time < last_timestamp) {
|
||||
pr_err("Samples misordered, previous: %" PRIu64
|
||||
@ -2124,11 +2152,13 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||
"Valid types: hw,sw,trace,raw. "
|
||||
"Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,"
|
||||
"addr,symoff,period,iregs,brstack,brstacksym,flags,"
|
||||
"bpf-output,callindent", parse_output_fields),
|
||||
"bpf-output,callindent,insn,insnlen", parse_output_fields),
|
||||
OPT_BOOLEAN('a', "all-cpus", &system_wide,
|
||||
"system-wide collection from all CPUs"),
|
||||
OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]",
|
||||
"only consider these symbols"),
|
||||
OPT_STRING(0, "stop-bt", &symbol_conf.bt_stop_list_str, "symbol[,symbol...]",
|
||||
"Stop display of callgraph at these symbols"),
|
||||
OPT_STRING('C', "cpu", &cpu_list, "cpu", "list of cpus to profile"),
|
||||
OPT_STRING('c', "comms", &symbol_conf.comm_list_str, "comm[,comm...]",
|
||||
"only display events for these comms"),
|
||||
@ -2162,7 +2192,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||
"Enable symbol demangling"),
|
||||
OPT_BOOLEAN(0, "demangle-kernel", &symbol_conf.demangle_kernel,
|
||||
"Enable kernel symbol demangling"),
|
||||
|
||||
OPT_STRING(0, "time", &script.time_str, "str",
|
||||
"Time span of interest (start,stop)"),
|
||||
OPT_END()
|
||||
};
|
||||
const char * const script_subcommands[] = { "record", "report", NULL };
|
||||
@ -2441,6 +2472,12 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||
if (err < 0)
|
||||
goto out_delete;
|
||||
|
||||
/* needs to be parsed after looking up reference time */
|
||||
if (perf_time__parse_str(&script.ptime, script.time_str) != 0) {
|
||||
pr_err("Invalid time string\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
err = __cmd_script(&script);
|
||||
|
||||
flush_scripting();
|
||||
|
@ -130,7 +130,7 @@ static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = symbol__disassemble(sym, map, 0);
|
||||
err = symbol__disassemble(sym, map, NULL, 0);
|
||||
if (err == 0) {
|
||||
out_assign:
|
||||
top->sym_filter_entry = he;
|
||||
|
@ -74,8 +74,6 @@ struct trace {
|
||||
size_t nr;
|
||||
int *entries;
|
||||
} ev_qualifier_ids;
|
||||
struct intlist *tid_list;
|
||||
struct intlist *pid_list;
|
||||
struct {
|
||||
size_t nr;
|
||||
pid_t *entries;
|
||||
@ -843,7 +841,6 @@ static size_t fprintf_duration(unsigned long t, FILE *fp)
|
||||
*/
|
||||
struct thread_trace {
|
||||
u64 entry_time;
|
||||
u64 exit_time;
|
||||
bool entry_pending;
|
||||
unsigned long nr_events;
|
||||
unsigned long pfmaj, pfmin;
|
||||
@ -1452,7 +1449,7 @@ static int trace__printf_interrupted_entry(struct trace *trace, struct perf_samp
|
||||
|
||||
duration = sample->time - ttrace->entry_time;
|
||||
|
||||
printed = trace__fprintf_entry_head(trace, trace->current, duration, sample->time, trace->output);
|
||||
printed = trace__fprintf_entry_head(trace, trace->current, duration, ttrace->entry_time, trace->output);
|
||||
printed += fprintf(trace->output, "%-70s) ...\n", ttrace->entry_str);
|
||||
ttrace->entry_pending = false;
|
||||
|
||||
@ -1499,7 +1496,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
|
||||
|
||||
if (sc->is_exit) {
|
||||
if (!(trace->duration_filter || trace->summary_only || trace->min_stack)) {
|
||||
trace__fprintf_entry_head(trace, thread, 1, sample->time, trace->output);
|
||||
trace__fprintf_entry_head(trace, thread, 1, ttrace->entry_time, trace->output);
|
||||
fprintf(trace->output, "%-70s)\n", ttrace->entry_str);
|
||||
}
|
||||
} else {
|
||||
@ -1571,8 +1568,6 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
|
||||
++trace->stats.vfs_getname;
|
||||
}
|
||||
|
||||
ttrace->exit_time = sample->time;
|
||||
|
||||
if (ttrace->entry_time) {
|
||||
duration = sample->time - ttrace->entry_time;
|
||||
if (trace__filter_duration(trace, duration))
|
||||
@ -1592,7 +1587,7 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
|
||||
if (trace->summary_only)
|
||||
goto out;
|
||||
|
||||
trace__fprintf_entry_head(trace, thread, duration, sample->time, trace->output);
|
||||
trace__fprintf_entry_head(trace, thread, duration, ttrace->entry_time, trace->output);
|
||||
|
||||
if (ttrace->entry_pending) {
|
||||
fprintf(trace->output, "%-70s", ttrace->entry_str);
|
||||
@ -1893,18 +1888,6 @@ out_put:
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool skip_sample(struct trace *trace, struct perf_sample *sample)
|
||||
{
|
||||
if ((trace->pid_list && intlist__find(trace->pid_list, sample->pid)) ||
|
||||
(trace->tid_list && intlist__find(trace->tid_list, sample->tid)))
|
||||
return false;
|
||||
|
||||
if (trace->pid_list || trace->tid_list)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void trace__set_base_time(struct trace *trace,
|
||||
struct perf_evsel *evsel,
|
||||
struct perf_sample *sample)
|
||||
@ -1929,11 +1912,13 @@ static int trace__process_sample(struct perf_tool *tool,
|
||||
struct machine *machine __maybe_unused)
|
||||
{
|
||||
struct trace *trace = container_of(tool, struct trace, tool);
|
||||
struct thread *thread;
|
||||
int err = 0;
|
||||
|
||||
tracepoint_handler handler = evsel->handler;
|
||||
|
||||
if (skip_sample(trace, sample))
|
||||
thread = machine__findnew_thread(trace->host, sample->pid, sample->tid);
|
||||
if (thread && thread__is_filtered(thread))
|
||||
return 0;
|
||||
|
||||
trace__set_base_time(trace, evsel, sample);
|
||||
@ -1946,27 +1931,6 @@ static int trace__process_sample(struct perf_tool *tool,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int parse_target_str(struct trace *trace)
|
||||
{
|
||||
if (trace->opts.target.pid) {
|
||||
trace->pid_list = intlist__new(trace->opts.target.pid);
|
||||
if (trace->pid_list == NULL) {
|
||||
pr_err("Error parsing process id string\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (trace->opts.target.tid) {
|
||||
trace->tid_list = intlist__new(trace->opts.target.tid);
|
||||
if (trace->tid_list == NULL) {
|
||||
pr_err("Error parsing thread id string\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int trace__record(struct trace *trace, int argc, const char **argv)
|
||||
{
|
||||
unsigned int rec_argc, i, j;
|
||||
@ -2310,12 +2274,17 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
if (err < 0)
|
||||
goto out_error_mmap;
|
||||
|
||||
if (!target__none(&trace->opts.target))
|
||||
if (!target__none(&trace->opts.target) && !trace->opts.initial_delay)
|
||||
perf_evlist__enable(evlist);
|
||||
|
||||
if (forks)
|
||||
perf_evlist__start_workload(evlist);
|
||||
|
||||
if (trace->opts.initial_delay) {
|
||||
usleep(trace->opts.initial_delay * 1000);
|
||||
perf_evlist__enable(evlist);
|
||||
}
|
||||
|
||||
trace->multiple_threads = thread_map__pid(evlist->threads, 0) == -1 ||
|
||||
evlist->threads->nr > 1 ||
|
||||
perf_evlist__first(evlist)->attr.inherit;
|
||||
@ -2458,6 +2427,12 @@ static int trace__replay(struct trace *trace)
|
||||
if (session == NULL)
|
||||
return -1;
|
||||
|
||||
if (trace->opts.target.pid)
|
||||
symbol_conf.pid_list_str = strdup(trace->opts.target.pid);
|
||||
|
||||
if (trace->opts.target.tid)
|
||||
symbol_conf.tid_list_str = strdup(trace->opts.target.tid);
|
||||
|
||||
if (symbol__init(&session->header.env) < 0)
|
||||
goto out;
|
||||
|
||||
@ -2501,10 +2476,6 @@ static int trace__replay(struct trace *trace)
|
||||
evsel->handler = trace__pgfault;
|
||||
}
|
||||
|
||||
err = parse_target_str(trace);
|
||||
if (err != 0)
|
||||
goto out;
|
||||
|
||||
setup_pager();
|
||||
|
||||
err = perf_session__process_events(session);
|
||||
@ -2816,6 +2787,9 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||
"Default: kernel.perf_event_max_stack or " __stringify(PERF_MAX_STACK_DEPTH)),
|
||||
OPT_UINTEGER(0, "proc-map-timeout", &trace.opts.proc_map_timeout,
|
||||
"per thread proc mmap processing timeout in ms"),
|
||||
OPT_UINTEGER('D', "delay", &trace.opts.initial_delay,
|
||||
"ms to wait before starting measurement after program "
|
||||
"start"),
|
||||
OPT_END()
|
||||
};
|
||||
bool __maybe_unused max_stack_user_set = true;
|
||||
|
@ -18,6 +18,7 @@ int cmd_bench(int argc, const char **argv, const char *prefix);
|
||||
int cmd_buildid_cache(int argc, const char **argv, const char *prefix);
|
||||
int cmd_buildid_list(int argc, const char **argv, const char *prefix);
|
||||
int cmd_config(int argc, const char **argv, const char *prefix);
|
||||
int cmd_c2c(int argc, const char **argv, const char *prefix);
|
||||
int cmd_diff(int argc, const char **argv, const char *prefix);
|
||||
int cmd_evlist(int argc, const char **argv, const char *prefix);
|
||||
int cmd_help(int argc, const char **argv, const char *prefix);
|
||||
|
8
tools/perf/jvmti/Build
Normal file
8
tools/perf/jvmti/Build
Normal file
@ -0,0 +1,8 @@
|
||||
jvmti-y += libjvmti.o
|
||||
jvmti-y += jvmti_agent.o
|
||||
|
||||
CFLAGS_jvmti = -fPIC -DPIC -I$(JDIR)/include -I$(JDIR)/include/linux
|
||||
CFLAGS_REMOVE_jvmti = -Wmissing-declarations
|
||||
CFLAGS_REMOVE_jvmti += -Wstrict-prototypes
|
||||
CFLAGS_REMOVE_jvmti += -Wextra
|
||||
CFLAGS_REMOVE_jvmti += -Wwrite-strings
|
@ -1,89 +0,0 @@
|
||||
ARCH=$(shell uname -m)
|
||||
|
||||
ifeq ($(ARCH), x86_64)
|
||||
JARCH=amd64
|
||||
endif
|
||||
ifeq ($(ARCH), armv7l)
|
||||
JARCH=armhf
|
||||
endif
|
||||
ifeq ($(ARCH), armv6l)
|
||||
JARCH=armhf
|
||||
endif
|
||||
ifeq ($(ARCH), aarch64)
|
||||
JARCH=aarch64
|
||||
endif
|
||||
ifeq ($(ARCH), ppc64)
|
||||
JARCH=powerpc
|
||||
endif
|
||||
ifeq ($(ARCH), ppc64le)
|
||||
JARCH=powerpc
|
||||
endif
|
||||
|
||||
DESTDIR=/usr/local
|
||||
|
||||
VERSION=1
|
||||
REVISION=0
|
||||
AGE=0
|
||||
|
||||
LN=ln -sf
|
||||
RM=rm
|
||||
|
||||
SLIBJVMTI=libjvmti.so.$(VERSION).$(REVISION).$(AGE)
|
||||
VLIBJVMTI=libjvmti.so.$(VERSION)
|
||||
SLDFLAGS=-shared -Wl,-soname -Wl,$(VLIBJVMTI)
|
||||
SOLIBEXT=so
|
||||
|
||||
# The following works at least on fedora 23, you may need the next
|
||||
# line for other distros.
|
||||
ifneq (,$(wildcard /usr/sbin/update-java-alternatives))
|
||||
JDIR=$(shell /usr/sbin/update-java-alternatives -l | head -1 | awk '{print $$3}')
|
||||
else
|
||||
ifneq (,$(wildcard /usr/sbin/alternatives))
|
||||
JDIR=$(shell alternatives --display java | tail -1 | cut -d' ' -f 5 | sed 's%/jre/bin/java.%%g')
|
||||
endif
|
||||
endif
|
||||
ifndef JDIR
|
||||
$(error Could not find alternatives command, you need to set JDIR= to point to the root of your Java directory)
|
||||
else
|
||||
ifeq (,$(wildcard $(JDIR)/include/jvmti.h))
|
||||
$(error the openjdk development package appears to me missing, install and try again)
|
||||
endif
|
||||
endif
|
||||
$(info Using Java from $(JDIR))
|
||||
# -lrt required in 32-bit mode for clock_gettime()
|
||||
LIBS=-lelf -lrt
|
||||
INCDIR=-I $(JDIR)/include -I $(JDIR)/include/linux
|
||||
|
||||
TARGETS=$(SLIBJVMTI)
|
||||
|
||||
SRCS=libjvmti.c jvmti_agent.c
|
||||
OBJS=$(SRCS:.c=.o)
|
||||
SOBJS=$(OBJS:.o=.lo)
|
||||
OPT=-O2 -g -Werror -Wall
|
||||
|
||||
CFLAGS=$(INCDIR) $(OPT)
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
.c.o:
|
||||
$(CC) $(CFLAGS) -c $*.c
|
||||
.c.lo:
|
||||
$(CC) -fPIC -DPIC $(CFLAGS) -c $*.c -o $*.lo
|
||||
|
||||
$(OBJS) $(SOBJS): Makefile jvmti_agent.h ../util/jitdump.h
|
||||
|
||||
$(SLIBJVMTI): $(SOBJS)
|
||||
$(CC) $(CFLAGS) $(SLDFLAGS) -o $@ $(SOBJS) $(LIBS)
|
||||
$(LN) $@ libjvmti.$(SOLIBEXT)
|
||||
|
||||
clean:
|
||||
$(RM) -f *.o *.so.* *.so *.lo
|
||||
|
||||
install:
|
||||
-mkdir -p $(DESTDIR)/lib
|
||||
install -m 755 $(SLIBJVMTI) $(DESTDIR)/lib/
|
||||
(cd $(DESTDIR)/lib; $(LN) $(SLIBJVMTI) $(VLIBJVMTI))
|
||||
(cd $(DESTDIR)/lib; $(LN) $(SLIBJVMTI) libjvmti.$(SOLIBEXT))
|
||||
ldconfig
|
||||
|
||||
.SUFFIXES: .c .S .o .lo
|
@ -44,11 +44,6 @@
|
||||
static char jit_path[PATH_MAX];
|
||||
static void *marker_addr;
|
||||
|
||||
/*
|
||||
* padding buffer
|
||||
*/
|
||||
static const char pad_bytes[7];
|
||||
|
||||
static inline pid_t gettid(void)
|
||||
{
|
||||
return (pid_t)syscall(__NR_gettid);
|
||||
@ -230,7 +225,6 @@ init_arch_timestamp(void)
|
||||
|
||||
void *jvmti_open(void)
|
||||
{
|
||||
int pad_cnt;
|
||||
char dump_path[PATH_MAX];
|
||||
struct jitheader header;
|
||||
int fd;
|
||||
@ -288,10 +282,6 @@ void *jvmti_open(void)
|
||||
header.total_size = sizeof(header);
|
||||
header.pid = getpid();
|
||||
|
||||
/* calculate amount of padding '\0' */
|
||||
pad_cnt = PADDING_8ALIGNED(header.total_size);
|
||||
header.total_size += pad_cnt;
|
||||
|
||||
header.timestamp = perf_get_timestamp();
|
||||
|
||||
if (use_arch_timestamp)
|
||||
@ -301,13 +291,6 @@ void *jvmti_open(void)
|
||||
warn("jvmti: cannot write dumpfile header");
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* write padding '\0' if necessary */
|
||||
if (pad_cnt && !fwrite(pad_bytes, pad_cnt, 1, fp)) {
|
||||
warn("jvmti: cannot write dumpfile header padding");
|
||||
goto error;
|
||||
}
|
||||
|
||||
return fp;
|
||||
error:
|
||||
fclose(fp);
|
||||
@ -349,7 +332,6 @@ jvmti_write_code(void *agent, char const *sym,
|
||||
static int code_generation = 1;
|
||||
struct jr_code_load rec;
|
||||
size_t sym_len;
|
||||
size_t padding_count;
|
||||
FILE *fp = agent;
|
||||
int ret = -1;
|
||||
|
||||
@ -366,8 +348,6 @@ jvmti_write_code(void *agent, char const *sym,
|
||||
|
||||
rec.p.id = JIT_CODE_LOAD;
|
||||
rec.p.total_size = sizeof(rec) + sym_len;
|
||||
padding_count = PADDING_8ALIGNED(rec.p.total_size);
|
||||
rec.p. total_size += padding_count;
|
||||
rec.p.timestamp = perf_get_timestamp();
|
||||
|
||||
rec.code_size = size;
|
||||
@ -393,9 +373,6 @@ jvmti_write_code(void *agent, char const *sym,
|
||||
ret = fwrite_unlocked(&rec, sizeof(rec), 1, fp);
|
||||
fwrite_unlocked(sym, sym_len, 1, fp);
|
||||
|
||||
if (padding_count)
|
||||
fwrite_unlocked(pad_bytes, padding_count, 1, fp);
|
||||
|
||||
if (code)
|
||||
fwrite_unlocked(code, size, 1, fp);
|
||||
|
||||
@ -412,7 +389,6 @@ jvmti_write_debug_info(void *agent, uint64_t code, const char *file,
|
||||
{
|
||||
struct jr_code_debug_info rec;
|
||||
size_t sret, len, size, flen;
|
||||
size_t padding_count;
|
||||
uint64_t addr;
|
||||
const char *fn = file;
|
||||
FILE *fp = agent;
|
||||
@ -443,16 +419,10 @@ jvmti_write_debug_info(void *agent, uint64_t code, const char *file,
|
||||
* int : line number
|
||||
* int : column discriminator
|
||||
* file[] : source file name
|
||||
* padding : pad to multiple of 8 bytes
|
||||
*/
|
||||
size += nr_lines * sizeof(struct debug_entry);
|
||||
size += flen * nr_lines;
|
||||
/*
|
||||
* pad to 8 bytes
|
||||
*/
|
||||
padding_count = PADDING_8ALIGNED(size);
|
||||
|
||||
rec.p.total_size = size + padding_count;
|
||||
rec.p.total_size = size;
|
||||
|
||||
/*
|
||||
* If JVM is multi-threaded, nultiple concurrent calls to agent
|
||||
@ -486,12 +456,6 @@ jvmti_write_debug_info(void *agent, uint64_t code, const char *file,
|
||||
if (sret != 1)
|
||||
goto error;
|
||||
}
|
||||
if (padding_count) {
|
||||
sret = fwrite_unlocked(pad_bytes, padding_count, 1, fp);
|
||||
if (sret != 1)
|
||||
goto error;
|
||||
}
|
||||
|
||||
funlockfile(fp);
|
||||
return 0;
|
||||
error:
|
||||
|
@ -12,6 +12,19 @@
|
||||
static int has_line_numbers;
|
||||
void *jvmti_agent;
|
||||
|
||||
static void print_error(jvmtiEnv *jvmti, const char *msg, jvmtiError ret)
|
||||
{
|
||||
char *err_msg = NULL;
|
||||
jvmtiError err;
|
||||
err = (*jvmti)->GetErrorName(jvmti, ret, &err_msg);
|
||||
if (err == JVMTI_ERROR_NONE) {
|
||||
warnx("%s failed with %s", msg, err_msg);
|
||||
(*jvmti)->Deallocate(jvmti, (unsigned char *)err_msg);
|
||||
} else {
|
||||
warnx("%s failed with an unknown error %d", msg, ret);
|
||||
}
|
||||
}
|
||||
|
||||
static jvmtiError
|
||||
do_get_line_numbers(jvmtiEnv *jvmti, void *pc, jmethodID m, jint bci,
|
||||
jvmti_line_info_t *tab, jint *nr)
|
||||
@ -22,8 +35,10 @@ do_get_line_numbers(jvmtiEnv *jvmti, void *pc, jmethodID m, jint bci,
|
||||
jvmtiError ret;
|
||||
|
||||
ret = (*jvmti)->GetLineNumberTable(jvmti, m, &nr_lines, &loc_tab);
|
||||
if (ret != JVMTI_ERROR_NONE)
|
||||
if (ret != JVMTI_ERROR_NONE) {
|
||||
print_error(jvmti, "GetLineNumberTable", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i < nr_lines; i++) {
|
||||
if (loc_tab[i].start_location < bci) {
|
||||
@ -71,6 +86,8 @@ get_line_numbers(jvmtiEnv *jvmti, const void *compile_info, jvmti_line_info_t **
|
||||
/* free what was allocated for nothing */
|
||||
(*jvmti)->Deallocate(jvmti, (unsigned char *)lne);
|
||||
nr_total += (int)nr;
|
||||
} else {
|
||||
print_error(jvmti, "GetLineNumberTable", ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -130,7 +147,7 @@ compiled_method_load_cb(jvmtiEnv *jvmti,
|
||||
ret = (*jvmti)->GetMethodDeclaringClass(jvmti, method,
|
||||
&decl_class);
|
||||
if (ret != JVMTI_ERROR_NONE) {
|
||||
warnx("jvmti: cannot get declaring class");
|
||||
print_error(jvmti, "GetMethodDeclaringClass", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -144,21 +161,21 @@ compiled_method_load_cb(jvmtiEnv *jvmti,
|
||||
|
||||
ret = (*jvmti)->GetSourceFileName(jvmti, decl_class, &file_name);
|
||||
if (ret != JVMTI_ERROR_NONE) {
|
||||
warnx("jvmti: cannot get source filename ret=%d", ret);
|
||||
print_error(jvmti, "GetSourceFileName", ret);
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = (*jvmti)->GetClassSignature(jvmti, decl_class,
|
||||
&class_sign, NULL);
|
||||
if (ret != JVMTI_ERROR_NONE) {
|
||||
warnx("jvmti: getclassignature failed");
|
||||
print_error(jvmti, "GetClassSignature", ret);
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = (*jvmti)->GetMethodName(jvmti, method, &func_name,
|
||||
&func_sign, NULL);
|
||||
if (ret != JVMTI_ERROR_NONE) {
|
||||
warnx("jvmti: failed getmethodname");
|
||||
print_error(jvmti, "GetMethodName", ret);
|
||||
goto error;
|
||||
}
|
||||
|
||||
@ -253,7 +270,7 @@ Agent_OnLoad(JavaVM *jvm, char *options, void *reserved __unused)
|
||||
|
||||
ret = (*jvmti)->AddCapabilities(jvmti, &caps1);
|
||||
if (ret != JVMTI_ERROR_NONE) {
|
||||
warnx("jvmti: acquire compiled_method capability failed");
|
||||
print_error(jvmti, "AddCapabilities", ret);
|
||||
return -1;
|
||||
}
|
||||
ret = (*jvmti)->GetJLocationFormat(jvmti, &format);
|
||||
@ -264,7 +281,9 @@ Agent_OnLoad(JavaVM *jvm, char *options, void *reserved __unused)
|
||||
ret = (*jvmti)->AddCapabilities(jvmti, &caps1);
|
||||
if (ret == JVMTI_ERROR_NONE)
|
||||
has_line_numbers = 1;
|
||||
}
|
||||
} else if (ret != JVMTI_ERROR_NONE)
|
||||
print_error(jvmti, "GetJLocationFormat", ret);
|
||||
|
||||
|
||||
memset(&cb, 0, sizeof(cb));
|
||||
|
||||
@ -273,21 +292,21 @@ Agent_OnLoad(JavaVM *jvm, char *options, void *reserved __unused)
|
||||
|
||||
ret = (*jvmti)->SetEventCallbacks(jvmti, &cb, sizeof(cb));
|
||||
if (ret != JVMTI_ERROR_NONE) {
|
||||
warnx("jvmti: cannot set event callbacks");
|
||||
print_error(jvmti, "SetEventCallbacks", ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = (*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE,
|
||||
JVMTI_EVENT_COMPILED_METHOD_LOAD, NULL);
|
||||
if (ret != JVMTI_ERROR_NONE) {
|
||||
warnx("jvmti: setnotification failed for method_load");
|
||||
print_error(jvmti, "SetEventNotificationMode(METHOD_LOAD)", ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = (*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE,
|
||||
JVMTI_EVENT_DYNAMIC_CODE_GENERATED, NULL);
|
||||
if (ret != JVMTI_ERROR_NONE) {
|
||||
warnx("jvmti: setnotification failed on code_generated");
|
||||
print_error(jvmti, "SetEventNotificationMode(CODE_GENERATED)", ret);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -43,6 +43,7 @@ static struct cmd_struct commands[] = {
|
||||
{ "buildid-cache", cmd_buildid_cache, 0 },
|
||||
{ "buildid-list", cmd_buildid_list, 0 },
|
||||
{ "config", cmd_config, 0 },
|
||||
{ "c2c", cmd_c2c, 0 },
|
||||
{ "diff", cmd_diff, 0 },
|
||||
{ "evlist", cmd_evlist, 0 },
|
||||
{ "help", cmd_help, 0 },
|
||||
|
21
tools/perf/pmu-events/arch/powerpc/mapfile.csv
Normal file
21
tools/perf/pmu-events/arch/powerpc/mapfile.csv
Normal file
@ -0,0 +1,21 @@
|
||||
# Format:
|
||||
# PVR,Version,JSON/file/pathname,Type
|
||||
#
|
||||
# where
|
||||
# PVR Processor version
|
||||
# Version could be used to track version of of JSON file
|
||||
# but currently unused.
|
||||
# JSON/file/pathname is the path to JSON file, relative
|
||||
# to tools/perf/pmu-events/arch/powerpc/.
|
||||
# Type is core, uncore etc
|
||||
#
|
||||
# Multiple PVRs could map to a single JSON file.
|
||||
#
|
||||
|
||||
# Power8 entries
|
||||
004b0000,1,power8.json,core
|
||||
004b0201,1,power8.json,core
|
||||
004c0000,1,power8.json,core
|
||||
004d0000,1,power8.json,core
|
||||
004d0100,1,power8.json,core
|
||||
004d0200,1,power8.json,core
|
|
176
tools/perf/pmu-events/arch/powerpc/power8/cache.json
Normal file
176
tools/perf/pmu-events/arch/powerpc/power8/cache.json
Normal file
@ -0,0 +1,176 @@
|
||||
[
|
||||
{,
|
||||
"EventCode": "0x4c048",
|
||||
"EventName": "PM_DATA_FROM_DL2L3_MOD",
|
||||
"BriefDescription": "The processor's data cache was reloaded with Modified (M) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded with Modified (M) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3c048",
|
||||
"EventName": "PM_DATA_FROM_DL2L3_SHR",
|
||||
"BriefDescription": "The processor's data cache was reloaded with Shared (S) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded with Shared (S) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3c04c",
|
||||
"EventName": "PM_DATA_FROM_DL4",
|
||||
"BriefDescription": "The processor's data cache was reloaded from another chip's L4 on a different Node or Group (Distant) due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from another chip's L4 on a different Node or Group (Distant) due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c042",
|
||||
"EventName": "PM_DATA_FROM_L2",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L2 due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from local core's L2 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x200fe",
|
||||
"EventName": "PM_DATA_FROM_L2MISS",
|
||||
"BriefDescription": "Demand LD - L2 Miss (not L2 hit)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c04e",
|
||||
"EventName": "PM_DATA_FROM_L2MISS_MOD",
|
||||
"BriefDescription": "The processor's data cache was reloaded from a localtion other than the local core's L2 due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from a localtion other than the local core's L2 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3c040",
|
||||
"EventName": "PM_DATA_FROM_L2_DISP_CONFLICT_LDHITST",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L2 with load hit store conflict due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from local core's L2 with load hit store conflict due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c040",
|
||||
"EventName": "PM_DATA_FROM_L2_DISP_CONFLICT_OTHER",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L2 with dispatch conflict due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from local core's L2 with dispatch conflict due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c040",
|
||||
"EventName": "PM_DATA_FROM_L2_MEPF",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L2 hit without dispatch conflicts on Mepf state due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from local core's L2 hit without dispatch conflicts on Mepf state due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c040",
|
||||
"EventName": "PM_DATA_FROM_L2_NO_CONFLICT",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L2 without conflict due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from local core's L2 without conflict due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c042",
|
||||
"EventName": "PM_DATA_FROM_L3",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L3 due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from local core's L3 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x300fe",
|
||||
"EventName": "PM_DATA_FROM_L3MISS",
|
||||
"BriefDescription": "Demand LD - L3 Miss (not L2 hit and not L3 hit)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c04e",
|
||||
"EventName": "PM_DATA_FROM_L3MISS_MOD",
|
||||
"BriefDescription": "The processor's data cache was reloaded from a localtion other than the local core's L3 due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from a localtion other than the local core's L3 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3c042",
|
||||
"EventName": "PM_DATA_FROM_L3_DISP_CONFLICT",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L3 with dispatch conflict due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from local core's L3 with dispatch conflict due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c042",
|
||||
"EventName": "PM_DATA_FROM_L3_MEPF",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L3 without dispatch conflicts hit on Mepf state due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from local core's L3 without dispatch conflicts hit on Mepf state due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c044",
|
||||
"EventName": "PM_DATA_FROM_L3_NO_CONFLICT",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L3 without conflict due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from local core's L3 without conflict due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c04c",
|
||||
"EventName": "PM_DATA_FROM_LL4",
|
||||
"BriefDescription": "The processor's data cache was reloaded from the local chip's L4 cache due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from the local chip's L4 cache due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c04a",
|
||||
"EventName": "PM_DATA_FROM_OFF_CHIP_CACHE",
|
||||
"BriefDescription": "The processor's data cache was reloaded either shared or modified data from another core's L2/L3 on a different chip (remote or distant) due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded either shared or modified data from another core's L2/L3 on a different chip (remote or distant) due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c048",
|
||||
"EventName": "PM_DATA_FROM_ON_CHIP_CACHE",
|
||||
"BriefDescription": "The processor's data cache was reloaded either shared or modified data from another core's L2/L3 on the same chip due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded either shared or modified data from another core's L2/L3 on the same chip due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c046",
|
||||
"EventName": "PM_DATA_FROM_RL2L3_MOD",
|
||||
"BriefDescription": "The processor's data cache was reloaded with Modified (M) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded with Modified (M) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c04a",
|
||||
"EventName": "PM_DATA_FROM_RL2L3_SHR",
|
||||
"BriefDescription": "The processor's data cache was reloaded with Shared (S) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded with Shared (S) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3001a",
|
||||
"EventName": "PM_DATA_TABLEWALK_CYC",
|
||||
"BriefDescription": "Tablwalk Cycles (could be 1 or 2 active)",
|
||||
"PublicDescription": "Data Tablewalk Active"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4e04e",
|
||||
"EventName": "PM_DPTEG_FROM_L3MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L3 due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xd094",
|
||||
"EventName": "PM_DSLB_MISS",
|
||||
"BriefDescription": "Data SLB Miss - Total of all segment sizes",
|
||||
"PublicDescription": "Data SLB Miss - Total of all segment sizesData SLB misses"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1002c",
|
||||
"EventName": "PM_L1_DCACHE_RELOADED_ALL",
|
||||
"BriefDescription": "L1 data cache reloaded for demand or prefetch",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x300f6",
|
||||
"EventName": "PM_L1_DCACHE_RELOAD_VALID",
|
||||
"BriefDescription": "DL1 reloaded due to Demand Load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3e054",
|
||||
"EventName": "PM_LD_MISS_L1",
|
||||
"BriefDescription": "Load Missed L1",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x100ee",
|
||||
"EventName": "PM_LD_REF_L1",
|
||||
"BriefDescription": "All L1 D cache load references counted at finish, gated by reject",
|
||||
"PublicDescription": "Load Ref count combined for all units"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x300f0",
|
||||
"EventName": "PM_ST_MISS_L1",
|
||||
"BriefDescription": "Store Missed L1",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
]
|
@ -0,0 +1,14 @@
|
||||
[
|
||||
{,
|
||||
"EventCode": "0x2000e",
|
||||
"EventName": "PM_FXU_BUSY",
|
||||
"BriefDescription": "fxu0 busy and fxu1 busy",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1000e",
|
||||
"EventName": "PM_FXU_IDLE",
|
||||
"BriefDescription": "fxu0 idle and fxu1 idle",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
]
|
470
tools/perf/pmu-events/arch/powerpc/power8/frontend.json
Normal file
470
tools/perf/pmu-events/arch/powerpc/power8/frontend.json
Normal file
@ -0,0 +1,470 @@
|
||||
[
|
||||
{,
|
||||
"EventCode": "0x2505e",
|
||||
"EventName": "PM_BACK_BR_CMPL",
|
||||
"BriefDescription": "Branch instruction completed with a target address less than current instruction address",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10068",
|
||||
"EventName": "PM_BRU_FIN",
|
||||
"BriefDescription": "Branch Instruction Finished",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20036",
|
||||
"EventName": "PM_BR_2PATH",
|
||||
"BriefDescription": "two path branch",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40060",
|
||||
"EventName": "PM_BR_CMPL",
|
||||
"BriefDescription": "Branch Instruction completed",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x400f6",
|
||||
"EventName": "PM_BR_MPRED_CMPL",
|
||||
"BriefDescription": "Number of Branch Mispredicts",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x200fa",
|
||||
"EventName": "PM_BR_TAKEN_CMPL",
|
||||
"BriefDescription": "New event for Branch Taken",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10018",
|
||||
"EventName": "PM_IC_DEMAND_CYC",
|
||||
"BriefDescription": "Cycles when a demand ifetch was pending",
|
||||
"PublicDescription": "Demand ifetch pending"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x100f6",
|
||||
"EventName": "PM_IERAT_RELOAD",
|
||||
"BriefDescription": "Number of I-ERAT reloads",
|
||||
"PublicDescription": "IERAT Reloaded (Miss)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4006a",
|
||||
"EventName": "PM_IERAT_RELOAD_16M",
|
||||
"BriefDescription": "IERAT Reloaded (Miss) for a 16M page",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20064",
|
||||
"EventName": "PM_IERAT_RELOAD_4K",
|
||||
"BriefDescription": "IERAT Miss (Not implemented as DI on POWER6)",
|
||||
"PublicDescription": "IERAT Reloaded (Miss) for a 4k page"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3006a",
|
||||
"EventName": "PM_IERAT_RELOAD_64K",
|
||||
"BriefDescription": "IERAT Reloaded (Miss) for a 64k page",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x14050",
|
||||
"EventName": "PM_INST_CHIP_PUMP_CPRED",
|
||||
"BriefDescription": "Initial and Final Pump Scope was chip pump (prediction=correct) for an instruction fetch",
|
||||
"PublicDescription": "Initial and Final Pump Scope and data sourced across this scope was chip pump (prediction=correct) for an instruction fetch"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2",
|
||||
"EventName": "PM_INST_CMPL",
|
||||
"BriefDescription": "Number of PowerPC Instructions that completed",
|
||||
"PublicDescription": "PPC Instructions Finished (completed)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x200f2",
|
||||
"EventName": "PM_INST_DISP",
|
||||
"BriefDescription": "PPC Dispatched",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x44048",
|
||||
"EventName": "PM_INST_FROM_DL2L3_MOD",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded with Modified (M) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded with Modified (M) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x34048",
|
||||
"EventName": "PM_INST_FROM_DL2L3_SHR",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded with Shared (S) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded with Shared (S) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3404c",
|
||||
"EventName": "PM_INST_FROM_DL4",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from another chip's L4 on a different Node or Group (Distant) due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from another chip's L4 on a different Node or Group (Distant) due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4404c",
|
||||
"EventName": "PM_INST_FROM_DMEM",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from another chip's memory on the same Node or Group (Distant) due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from another chip's memory on the same Node or Group (Distant) due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x14042",
|
||||
"EventName": "PM_INST_FROM_L2",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from local core's L2 due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from local core's L2 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1404e",
|
||||
"EventName": "PM_INST_FROM_L2MISS",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L2 due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L2 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x34040",
|
||||
"EventName": "PM_INST_FROM_L2_DISP_CONFLICT_LDHITST",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from local core's L2 with load hit store conflict due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from local core's L2 with load hit store conflict due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x44040",
|
||||
"EventName": "PM_INST_FROM_L2_DISP_CONFLICT_OTHER",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from local core's L2 with dispatch conflict due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from local core's L2 with dispatch conflict due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x24040",
|
||||
"EventName": "PM_INST_FROM_L2_MEPF",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from local core's L2 hit without dispatch conflicts on Mepf state. due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from local core's L2 hit without dispatch conflicts on Mepf state. due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x14040",
|
||||
"EventName": "PM_INST_FROM_L2_NO_CONFLICT",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from local core's L2 without conflict due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from local core's L2 without conflict due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x44042",
|
||||
"EventName": "PM_INST_FROM_L3",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from local core's L3 due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from local core's L3 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x300fa",
|
||||
"EventName": "PM_INST_FROM_L3MISS",
|
||||
"BriefDescription": "Marked instruction was reloaded from a location beyond the local chiplet",
|
||||
"PublicDescription": "Inst from L3 miss"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4404e",
|
||||
"EventName": "PM_INST_FROM_L3MISS_MOD",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L3 due to a instruction fetch",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L3 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x34042",
|
||||
"EventName": "PM_INST_FROM_L3_DISP_CONFLICT",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from local core's L3 with dispatch conflict due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from local core's L3 with dispatch conflict due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x24042",
|
||||
"EventName": "PM_INST_FROM_L3_MEPF",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from local core's L3 without dispatch conflicts hit on Mepf state. due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from local core's L3 without dispatch conflicts hit on Mepf state. due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x14044",
|
||||
"EventName": "PM_INST_FROM_L3_NO_CONFLICT",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from local core's L3 without conflict due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from local core's L3 without conflict due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1404c",
|
||||
"EventName": "PM_INST_FROM_LL4",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from the local chip's L4 cache due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from the local chip's L4 cache due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x24048",
|
||||
"EventName": "PM_INST_FROM_LMEM",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from the local chip's Memory due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from the local chip's Memory due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2404c",
|
||||
"EventName": "PM_INST_FROM_MEMORY",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from a memory location including L4 from local remote or distant due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from a memory location including L4 from local remote or distant due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4404a",
|
||||
"EventName": "PM_INST_FROM_OFF_CHIP_CACHE",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded either shared or modified data from another core's L2/L3 on a different chip (remote or distant) due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded either shared or modified data from another core's L2/L3 on a different chip (remote or distant) due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x14048",
|
||||
"EventName": "PM_INST_FROM_ON_CHIP_CACHE",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded either shared or modified data from another core's L2/L3 on the same chip due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded either shared or modified data from another core's L2/L3 on the same chip due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x24046",
|
||||
"EventName": "PM_INST_FROM_RL2L3_MOD",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded with Modified (M) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded with Modified (M) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1404a",
|
||||
"EventName": "PM_INST_FROM_RL2L3_SHR",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded with Shared (S) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded with Shared (S) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2404a",
|
||||
"EventName": "PM_INST_FROM_RL4",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from another chip's L4 on the same Node or Group ( Remote) due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from another chip's L4 on the same Node or Group ( Remote) due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3404a",
|
||||
"EventName": "PM_INST_FROM_RMEM",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from another chip's memory on the same Node or Group ( Remote) due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from another chip's memory on the same Node or Group ( Remote) due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x24050",
|
||||
"EventName": "PM_INST_GRP_PUMP_CPRED",
|
||||
"BriefDescription": "Initial and Final Pump Scope was group pump (prediction=correct) for an instruction fetch",
|
||||
"PublicDescription": "Initial and Final Pump Scope and data sourced across this scope was group pump for an instruction fetch"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x24052",
|
||||
"EventName": "PM_INST_GRP_PUMP_MPRED",
|
||||
"BriefDescription": "Final Pump Scope (Group) ended up either larger or smaller than Initial Pump Scope for an instruction fetch",
|
||||
"PublicDescription": "Final Pump Scope(Group) to get data sourced, ended up larger than Initial Pump Scope OR Final Pump Scope(Group) got data from source that was at smaller scope(Chip) Final pump was group pump and initial pump was chip or final and initial pump was gro"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x14052",
|
||||
"EventName": "PM_INST_GRP_PUMP_MPRED_RTY",
|
||||
"BriefDescription": "Final Pump Scope (Group) ended up larger than Initial Pump Scope (Chip) for an instruction fetch",
|
||||
"PublicDescription": "Final Pump Scope(Group) to get data sourced, ended up larger than Initial Pump Scope (Chip) Final pump was group pump and initial pump was chip pumpfor an instruction fetch"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1003a",
|
||||
"EventName": "PM_INST_IMC_MATCH_CMPL",
|
||||
"BriefDescription": "IMC Match Count ( Not architected in P8)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x14054",
|
||||
"EventName": "PM_INST_PUMP_CPRED",
|
||||
"BriefDescription": "Pump prediction correct. Counts across all types of pumps for an instruction fetch",
|
||||
"PublicDescription": "Pump prediction correct. Counts across all types of pumpsfor an instruction fetch"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x44052",
|
||||
"EventName": "PM_INST_PUMP_MPRED",
|
||||
"BriefDescription": "Pump misprediction. Counts across all types of pumps for an instruction fetch",
|
||||
"PublicDescription": "Pump Mis prediction Counts across all types of pumpsfor an instruction fetch"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x34050",
|
||||
"EventName": "PM_INST_SYS_PUMP_CPRED",
|
||||
"BriefDescription": "Initial and Final Pump Scope was system pump (prediction=correct) for an instruction fetch",
|
||||
"PublicDescription": "Initial and Final Pump Scope and data sourced across this scope was system pump for an instruction fetch"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x34052",
|
||||
"EventName": "PM_INST_SYS_PUMP_MPRED",
|
||||
"BriefDescription": "Final Pump Scope (system) mispredicted. Either the original scope was too small (Chip/Group) or the original scope was System and it should have been smaller. Counts for an instruction fetch",
|
||||
"PublicDescription": "Final Pump Scope(system) to get data sourced, ended up larger than Initial Pump Scope(Chip/Group) OR Final Pump Scope(system) got data from source that was at smaller scope(Chip/group) Final pump was system pump and initial pump was chip or group or"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x44050",
|
||||
"EventName": "PM_INST_SYS_PUMP_MPRED_RTY",
|
||||
"BriefDescription": "Final Pump Scope (system) ended up larger than Initial Pump Scope (Chip/Group) for an instruction fetch",
|
||||
"PublicDescription": "Final Pump Scope(system) to get data sourced, ended up larger than Initial Pump Scope (Chip or Group) for an instruction fetch"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x45048",
|
||||
"EventName": "PM_IPTEG_FROM_DL2L3_MOD",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Modified (M) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x35048",
|
||||
"EventName": "PM_IPTEG_FROM_DL2L3_SHR",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Shared (S) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3504c",
|
||||
"EventName": "PM_IPTEG_FROM_DL4",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's L4 on a different Node or Group (Distant) due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4504c",
|
||||
"EventName": "PM_IPTEG_FROM_DMEM",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's memory on the same Node or Group (Distant) due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x15042",
|
||||
"EventName": "PM_IPTEG_FROM_L2",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L2 due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1504e",
|
||||
"EventName": "PM_IPTEG_FROM_L2MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L2 due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x25040",
|
||||
"EventName": "PM_IPTEG_FROM_L2_MEPF",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L2 hit without dispatch conflicts on Mepf state. due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x15040",
|
||||
"EventName": "PM_IPTEG_FROM_L2_NO_CONFLICT",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L2 without conflict due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x45042",
|
||||
"EventName": "PM_IPTEG_FROM_L3",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4504e",
|
||||
"EventName": "PM_IPTEG_FROM_L3MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L3 due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x35042",
|
||||
"EventName": "PM_IPTEG_FROM_L3_DISP_CONFLICT",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 with dispatch conflict due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x25042",
|
||||
"EventName": "PM_IPTEG_FROM_L3_MEPF",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 without dispatch conflicts hit on Mepf state. due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x15044",
|
||||
"EventName": "PM_IPTEG_FROM_L3_NO_CONFLICT",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 without conflict due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1504c",
|
||||
"EventName": "PM_IPTEG_FROM_LL4",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from the local chip's L4 cache due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x25048",
|
||||
"EventName": "PM_IPTEG_FROM_LMEM",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from the local chip's Memory due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2504c",
|
||||
"EventName": "PM_IPTEG_FROM_MEMORY",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a memory location including L4 from local remote or distant due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4504a",
|
||||
"EventName": "PM_IPTEG_FROM_OFF_CHIP_CACHE",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB either shared or modified data from another core's L2/L3 on a different chip (remote or distant) due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x15048",
|
||||
"EventName": "PM_IPTEG_FROM_ON_CHIP_CACHE",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB either shared or modified data from another core's L2/L3 on the same chip due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x25046",
|
||||
"EventName": "PM_IPTEG_FROM_RL2L3_MOD",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Modified (M) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1504a",
|
||||
"EventName": "PM_IPTEG_FROM_RL2L3_SHR",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Shared (S) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2504a",
|
||||
"EventName": "PM_IPTEG_FROM_RL4",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's L4 on the same Node or Group ( Remote) due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3504a",
|
||||
"EventName": "PM_IPTEG_FROM_RMEM",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's memory on the same Node or Group ( Remote) due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0xd096",
|
||||
"EventName": "PM_ISLB_MISS",
|
||||
"BriefDescription": "I SLB Miss",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x400fc",
|
||||
"EventName": "PM_ITLB_MISS",
|
||||
"BriefDescription": "ITLB Reloaded (always zero on POWER6)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x200fd",
|
||||
"EventName": "PM_L1_ICACHE_MISS",
|
||||
"BriefDescription": "Demand iCache Miss",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40012",
|
||||
"EventName": "PM_L1_ICACHE_RELOADED_ALL",
|
||||
"BriefDescription": "Counts all Icache reloads includes demand, prefetchm prefetch turned into demand and demand turned into prefetch",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30068",
|
||||
"EventName": "PM_L1_ICACHE_RELOADED_PREF",
|
||||
"BriefDescription": "Counts all Icache prefetch reloads ( includes demand turned into prefetch)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x300f4",
|
||||
"EventName": "PM_THRD_CONC_RUN_INST",
|
||||
"BriefDescription": "PPC Instructions Finished when both threads in run_cycles",
|
||||
"PublicDescription": "Concurrent Run Instructions"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30060",
|
||||
"EventName": "PM_TM_TRANS_RUN_INST",
|
||||
"BriefDescription": "Instructions completed in transactional state",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4e014",
|
||||
"EventName": "PM_TM_TX_PASS_RUN_INST",
|
||||
"BriefDescription": "run instructions spent in successful transactions",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
]
|
794
tools/perf/pmu-events/arch/powerpc/power8/marked.json
Normal file
794
tools/perf/pmu-events/arch/powerpc/power8/marked.json
Normal file
@ -0,0 +1,794 @@
|
||||
[
|
||||
{,
|
||||
"EventCode": "0x3515e",
|
||||
"EventName": "PM_MRK_BACK_BR_CMPL",
|
||||
"BriefDescription": "Marked branch instruction completed with a target address less than current instruction address",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2013a",
|
||||
"EventName": "PM_MRK_BRU_FIN",
|
||||
"BriefDescription": "bru marked instr finish",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1016e",
|
||||
"EventName": "PM_MRK_BR_CMPL",
|
||||
"BriefDescription": "Branch Instruction completed",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x301e4",
|
||||
"EventName": "PM_MRK_BR_MPRED_CMPL",
|
||||
"BriefDescription": "Marked Branch Mispredicted",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x101e2",
|
||||
"EventName": "PM_MRK_BR_TAKEN_CMPL",
|
||||
"BriefDescription": "Marked Branch Taken completed",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d148",
|
||||
"EventName": "PM_MRK_DATA_FROM_DL2L3_MOD",
|
||||
"BriefDescription": "The processor's data cache was reloaded with Modified (M) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d128",
|
||||
"EventName": "PM_MRK_DATA_FROM_DL2L3_MOD_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload with Modified (M) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3d148",
|
||||
"EventName": "PM_MRK_DATA_FROM_DL2L3_SHR",
|
||||
"BriefDescription": "The processor's data cache was reloaded with Shared (S) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c128",
|
||||
"EventName": "PM_MRK_DATA_FROM_DL2L3_SHR_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload with Shared (S) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3d14c",
|
||||
"EventName": "PM_MRK_DATA_FROM_DL4",
|
||||
"BriefDescription": "The processor's data cache was reloaded from another chip's L4 on a different Node or Group (Distant) due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c12c",
|
||||
"EventName": "PM_MRK_DATA_FROM_DL4_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from another chip's L4 on a different Node or Group (Distant) due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d14c",
|
||||
"EventName": "PM_MRK_DATA_FROM_DMEM",
|
||||
"BriefDescription": "The processor's data cache was reloaded from another chip's memory on the same Node or Group (Distant) due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d12c",
|
||||
"EventName": "PM_MRK_DATA_FROM_DMEM_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from another chip's memory on the same Node or Group (Distant) due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1d142",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L2 due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1d14e",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2MISS",
|
||||
"BriefDescription": "Data cache reload L2 miss",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c12e",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2MISS_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from a localtion other than the local core's L2 due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c122",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from local core's L2 due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3d140",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_DISP_CONFLICT_LDHITST",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L2 with load hit store conflict due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c120",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_DISP_CONFLICT_LDHITST_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from local core's L2 with load hit store conflict due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d140",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_DISP_CONFLICT_OTHER",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L2 with dispatch conflict due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d120",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_DISP_CONFLICT_OTHER_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from local core's L2 with dispatch conflict due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d140",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_MEPF",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L2 hit without dispatch conflicts on Mepf state. due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d120",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_MEPF_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from local core's L2 hit without dispatch conflicts on Mepf state. due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1d140",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_NO_CONFLICT",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L2 without conflict due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c120",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2_NO_CONFLICT_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from local core's L2 without conflict due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d142",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L3 due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x201e4",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3MISS",
|
||||
"BriefDescription": "The processor's data cache was reloaded from a localtion other than the local core's L3 due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d12e",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3MISS_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from a localtion other than the local core's L3 due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d122",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from local core's L3 due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3d142",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3_DISP_CONFLICT",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L3 with dispatch conflict due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c122",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3_DISP_CONFLICT_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from local core's L3 with dispatch conflict due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d142",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3_MEPF",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L3 without dispatch conflicts hit on Mepf state. due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d122",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3_MEPF_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from local core's L3 without dispatch conflicts hit on Mepf state. due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1d144",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3_NO_CONFLICT",
|
||||
"BriefDescription": "The processor's data cache was reloaded from local core's L3 without conflict due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c124",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3_NO_CONFLICT_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from local core's L3 without conflict due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1d14c",
|
||||
"EventName": "PM_MRK_DATA_FROM_LL4",
|
||||
"BriefDescription": "The processor's data cache was reloaded from the local chip's L4 cache due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c12c",
|
||||
"EventName": "PM_MRK_DATA_FROM_LL4_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from the local chip's L4 cache due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d148",
|
||||
"EventName": "PM_MRK_DATA_FROM_LMEM",
|
||||
"BriefDescription": "The processor's data cache was reloaded from the local chip's Memory due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d128",
|
||||
"EventName": "PM_MRK_DATA_FROM_LMEM_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from the local chip's Memory due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d14c",
|
||||
"EventName": "PM_MRK_DATA_FROM_MEMORY",
|
||||
"BriefDescription": "The processor's data cache was reloaded from a memory location including L4 from local remote or distant due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d12c",
|
||||
"EventName": "PM_MRK_DATA_FROM_MEMORY_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from a memory location including L4 from local remote or distant due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d14a",
|
||||
"EventName": "PM_MRK_DATA_FROM_OFF_CHIP_CACHE",
|
||||
"BriefDescription": "The processor's data cache was reloaded either shared or modified data from another core's L2/L3 on a different chip (remote or distant) due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d12a",
|
||||
"EventName": "PM_MRK_DATA_FROM_OFF_CHIP_CACHE_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload either shared or modified data from another core's L2/L3 on a different chip (remote or distant) due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1d148",
|
||||
"EventName": "PM_MRK_DATA_FROM_ON_CHIP_CACHE",
|
||||
"BriefDescription": "The processor's data cache was reloaded either shared or modified data from another core's L2/L3 on the same chip due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c128",
|
||||
"EventName": "PM_MRK_DATA_FROM_ON_CHIP_CACHE_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload either shared or modified data from another core's L2/L3 on the same chip due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d146",
|
||||
"EventName": "PM_MRK_DATA_FROM_RL2L3_MOD",
|
||||
"BriefDescription": "The processor's data cache was reloaded with Modified (M) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d126",
|
||||
"EventName": "PM_MRK_DATA_FROM_RL2L3_MOD_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload with Modified (M) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1d14a",
|
||||
"EventName": "PM_MRK_DATA_FROM_RL2L3_SHR",
|
||||
"BriefDescription": "The processor's data cache was reloaded with Shared (S) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c12a",
|
||||
"EventName": "PM_MRK_DATA_FROM_RL2L3_SHR_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload with Shared (S) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d14a",
|
||||
"EventName": "PM_MRK_DATA_FROM_RL4",
|
||||
"BriefDescription": "The processor's data cache was reloaded from another chip's L4 on the same Node or Group ( Remote) due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d12a",
|
||||
"EventName": "PM_MRK_DATA_FROM_RL4_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from another chip's L4 on the same Node or Group ( Remote) due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3d14a",
|
||||
"EventName": "PM_MRK_DATA_FROM_RMEM",
|
||||
"BriefDescription": "The processor's data cache was reloaded from another chip's memory on the same Node or Group ( Remote) due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c12a",
|
||||
"EventName": "PM_MRK_DATA_FROM_RMEM_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from another chip's memory on the same Node or Group ( Remote) due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40118",
|
||||
"EventName": "PM_MRK_DCACHE_RELOAD_INTV",
|
||||
"BriefDescription": "Combined Intervention event",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x301e6",
|
||||
"EventName": "PM_MRK_DERAT_MISS",
|
||||
"BriefDescription": "Erat Miss (TLB Access) All page sizes",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d154",
|
||||
"EventName": "PM_MRK_DERAT_MISS_16G",
|
||||
"BriefDescription": "Marked Data ERAT Miss (Data TLB Access) page size 16G",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3d154",
|
||||
"EventName": "PM_MRK_DERAT_MISS_16M",
|
||||
"BriefDescription": "Marked Data ERAT Miss (Data TLB Access) page size 16M",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1d156",
|
||||
"EventName": "PM_MRK_DERAT_MISS_4K",
|
||||
"BriefDescription": "Marked Data ERAT Miss (Data TLB Access) page size 4K",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d154",
|
||||
"EventName": "PM_MRK_DERAT_MISS_64K",
|
||||
"BriefDescription": "Marked Data ERAT Miss (Data TLB Access) page size 64K",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20132",
|
||||
"EventName": "PM_MRK_DFU_FIN",
|
||||
"BriefDescription": "Decimal Unit marked Instruction Finish",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4f148",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_DL2L3_MOD",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Modified (M) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3f148",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_DL2L3_SHR",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Shared (S) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3f14c",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_DL4",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's L4 on a different Node or Group (Distant) due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4f14c",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_DMEM",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's memory on the same Node or Group (Distant) due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1f142",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_L2",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L2 due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1f14e",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_L2MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L2 due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2f140",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_L2_MEPF",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L2 hit without dispatch conflicts on Mepf state. due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1f140",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_L2_NO_CONFLICT",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L2 without conflict due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4f142",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_L3",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4f14e",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_L3MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L3 due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3f142",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_L3_DISP_CONFLICT",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 with dispatch conflict due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2f142",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_L3_MEPF",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 without dispatch conflicts hit on Mepf state. due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1f144",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_L3_NO_CONFLICT",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 without conflict due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1f14c",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_LL4",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from the local chip's L4 cache due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2f148",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_LMEM",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from the local chip's Memory due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2f14c",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_MEMORY",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a memory location including L4 from local remote or distant due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4f14a",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_OFF_CHIP_CACHE",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB either shared or modified data from another core's L2/L3 on a different chip (remote or distant) due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1f148",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_ON_CHIP_CACHE",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB either shared or modified data from another core's L2/L3 on the same chip due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2f146",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_RL2L3_MOD",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Modified (M) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1f14a",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_RL2L3_SHR",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Shared (S) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2f14a",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_RL4",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's L4 on the same Node or Group ( Remote) due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3f14a",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_RMEM",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's memory on the same Node or Group ( Remote) due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x401e4",
|
||||
"EventName": "PM_MRK_DTLB_MISS",
|
||||
"BriefDescription": "Marked dtlb miss",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1d158",
|
||||
"EventName": "PM_MRK_DTLB_MISS_16G",
|
||||
"BriefDescription": "Marked Data TLB Miss page size 16G",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d156",
|
||||
"EventName": "PM_MRK_DTLB_MISS_16M",
|
||||
"BriefDescription": "Marked Data TLB Miss page size 16M",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d156",
|
||||
"EventName": "PM_MRK_DTLB_MISS_4K",
|
||||
"BriefDescription": "Marked Data TLB Miss page size 4k",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3d156",
|
||||
"EventName": "PM_MRK_DTLB_MISS_64K",
|
||||
"BriefDescription": "Marked Data TLB Miss page size 64K",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40154",
|
||||
"EventName": "PM_MRK_FAB_RSP_BKILL",
|
||||
"BriefDescription": "Marked store had to do a bkill",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2f150",
|
||||
"EventName": "PM_MRK_FAB_RSP_BKILL_CYC",
|
||||
"BriefDescription": "cycles L2 RC took for a bkill",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3015e",
|
||||
"EventName": "PM_MRK_FAB_RSP_CLAIM_RTY",
|
||||
"BriefDescription": "Sampled store did a rwitm and got a rty",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30154",
|
||||
"EventName": "PM_MRK_FAB_RSP_DCLAIM",
|
||||
"BriefDescription": "Marked store had to do a dclaim",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2f152",
|
||||
"EventName": "PM_MRK_FAB_RSP_DCLAIM_CYC",
|
||||
"BriefDescription": "cycles L2 RC took for a dclaim",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4015e",
|
||||
"EventName": "PM_MRK_FAB_RSP_RD_RTY",
|
||||
"BriefDescription": "Sampled L2 reads retry count",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1015e",
|
||||
"EventName": "PM_MRK_FAB_RSP_RD_T_INTV",
|
||||
"BriefDescription": "Sampled Read got a T intervention",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4f150",
|
||||
"EventName": "PM_MRK_FAB_RSP_RWITM_CYC",
|
||||
"BriefDescription": "cycles L2 RC took for a rwitm",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2015e",
|
||||
"EventName": "PM_MRK_FAB_RSP_RWITM_RTY",
|
||||
"BriefDescription": "Sampled store did a rwitm and got a rty",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20134",
|
||||
"EventName": "PM_MRK_FXU_FIN",
|
||||
"BriefDescription": "fxu marked instr finish",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x401e0",
|
||||
"EventName": "PM_MRK_INST_CMPL",
|
||||
"BriefDescription": "marked instruction completed",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20130",
|
||||
"EventName": "PM_MRK_INST_DECODED",
|
||||
"BriefDescription": "marked instruction decoded",
|
||||
"PublicDescription": "marked instruction decoded. Name from ISU?"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x101e0",
|
||||
"EventName": "PM_MRK_INST_DISP",
|
||||
"BriefDescription": "The thread has dispatched a randomly sampled marked instruction",
|
||||
"PublicDescription": "Marked Instruction dispatched"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30130",
|
||||
"EventName": "PM_MRK_INST_FIN",
|
||||
"BriefDescription": "marked instruction finished",
|
||||
"PublicDescription": "marked instr finish any unit"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x401e6",
|
||||
"EventName": "PM_MRK_INST_FROM_L3MISS",
|
||||
"BriefDescription": "Marked instruction was reloaded from a location beyond the local chiplet",
|
||||
"PublicDescription": "n/a"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10132",
|
||||
"EventName": "PM_MRK_INST_ISSUED",
|
||||
"BriefDescription": "Marked instruction issued",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40134",
|
||||
"EventName": "PM_MRK_INST_TIMEO",
|
||||
"BriefDescription": "marked Instruction finish timeout (instruction lost)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x101e4",
|
||||
"EventName": "PM_MRK_L1_ICACHE_MISS",
|
||||
"BriefDescription": "sampled Instruction suffered an icache Miss",
|
||||
"PublicDescription": "Marked L1 Icache Miss"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x101ea",
|
||||
"EventName": "PM_MRK_L1_RELOAD_VALID",
|
||||
"BriefDescription": "Marked demand reload",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20114",
|
||||
"EventName": "PM_MRK_L2_RC_DISP",
|
||||
"BriefDescription": "Marked Instruction RC dispatched in L2",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3012a",
|
||||
"EventName": "PM_MRK_L2_RC_DONE",
|
||||
"BriefDescription": "Marked RC done",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40116",
|
||||
"EventName": "PM_MRK_LARX_FIN",
|
||||
"BriefDescription": "Larx finished",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1013e",
|
||||
"EventName": "PM_MRK_LD_MISS_EXPOSED_CYC",
|
||||
"BriefDescription": "Marked Load exposed Miss cycles",
|
||||
"PublicDescription": "Marked Load exposed Miss (use edge detect to count #)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x201e2",
|
||||
"EventName": "PM_MRK_LD_MISS_L1",
|
||||
"BriefDescription": "Marked DL1 Demand Miss counted at exec time",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4013e",
|
||||
"EventName": "PM_MRK_LD_MISS_L1_CYC",
|
||||
"BriefDescription": "Marked ld latency",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40132",
|
||||
"EventName": "PM_MRK_LSU_FIN",
|
||||
"BriefDescription": "lsu marked instr finish",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20112",
|
||||
"EventName": "PM_MRK_NTF_FIN",
|
||||
"BriefDescription": "Marked next to finish instruction finished",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1d15e",
|
||||
"EventName": "PM_MRK_RUN_CYC",
|
||||
"BriefDescription": "Marked run cycles",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3013e",
|
||||
"EventName": "PM_MRK_STALL_CMPLU_CYC",
|
||||
"BriefDescription": "Marked Group completion Stall",
|
||||
"PublicDescription": "Marked Group Completion Stall cycles (use edge detect to count #)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3e158",
|
||||
"EventName": "PM_MRK_STCX_FAIL",
|
||||
"BriefDescription": "marked stcx failed",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10134",
|
||||
"EventName": "PM_MRK_ST_CMPL",
|
||||
"BriefDescription": "marked store completed and sent to nest",
|
||||
"PublicDescription": "Marked store completed"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30134",
|
||||
"EventName": "PM_MRK_ST_CMPL_INT",
|
||||
"BriefDescription": "marked store finished with intervention",
|
||||
"PublicDescription": "marked store complete (data home) with intervention"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3f150",
|
||||
"EventName": "PM_MRK_ST_DRAIN_TO_L2DISP_CYC",
|
||||
"BriefDescription": "cycles to drain st from core to L2",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3012c",
|
||||
"EventName": "PM_MRK_ST_FWD",
|
||||
"BriefDescription": "Marked st forwards",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1f150",
|
||||
"EventName": "PM_MRK_ST_L2DISP_TO_CMPL_CYC",
|
||||
"BriefDescription": "cycles from L2 rc disp to l2 rc completion",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20138",
|
||||
"EventName": "PM_MRK_ST_NEST",
|
||||
"BriefDescription": "Marked store sent to nest",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30132",
|
||||
"EventName": "PM_MRK_VSU_FIN",
|
||||
"BriefDescription": "VSU marked instr finish",
|
||||
"PublicDescription": "vsu (fpu) marked instr finish"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3d15e",
|
||||
"EventName": "PM_MULT_MRK",
|
||||
"BriefDescription": "mult marked instr",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x15152",
|
||||
"EventName": "PM_SYNC_MRK_BR_LINK",
|
||||
"BriefDescription": "Marked Branch and link branch that can cause a synchronous interrupt",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1515c",
|
||||
"EventName": "PM_SYNC_MRK_BR_MPRED",
|
||||
"BriefDescription": "Marked Branch mispredict that can cause a synchronous interrupt",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x15156",
|
||||
"EventName": "PM_SYNC_MRK_FX_DIVIDE",
|
||||
"BriefDescription": "Marked fixed point divide that can cause a synchronous interrupt",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x15158",
|
||||
"EventName": "PM_SYNC_MRK_L2HIT",
|
||||
"BriefDescription": "Marked L2 Hits that can throw a synchronous interrupt",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1515a",
|
||||
"EventName": "PM_SYNC_MRK_L2MISS",
|
||||
"BriefDescription": "Marked L2 Miss that can throw a synchronous interrupt",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x15154",
|
||||
"EventName": "PM_SYNC_MRK_L3MISS",
|
||||
"BriefDescription": "Marked L3 misses that can throw a synchronous interrupt",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x15150",
|
||||
"EventName": "PM_SYNC_MRK_PROBE_NOP",
|
||||
"BriefDescription": "Marked probeNops which can cause synchronous interrupts",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
]
|
212
tools/perf/pmu-events/arch/powerpc/power8/memory.json
Normal file
212
tools/perf/pmu-events/arch/powerpc/power8/memory.json
Normal file
@ -0,0 +1,212 @@
|
||||
[
|
||||
{,
|
||||
"EventCode": "0x10050",
|
||||
"EventName": "PM_CHIP_PUMP_CPRED",
|
||||
"BriefDescription": "Initial and Final Pump Scope was chip pump (prediction=correct) for all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)",
|
||||
"PublicDescription": "Initial and Final Pump Scope and data sourced across this scope was chip pump (prediction=correct) for all data types ( demand load,data,inst prefetch,inst fetch,xlate (I or d)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c050",
|
||||
"EventName": "PM_DATA_CHIP_PUMP_CPRED",
|
||||
"BriefDescription": "Initial and Final Pump Scope was chip pump (prediction=correct) for a demand load",
|
||||
"PublicDescription": "Initial and Final Pump Scope and data sourced across this scope was chip pump (prediction=correct) for a demand load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c04c",
|
||||
"EventName": "PM_DATA_FROM_DMEM",
|
||||
"BriefDescription": "The processor's data cache was reloaded from another chip's memory on the same Node or Group (Distant) due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from another chip's memory on the same Node or Group (Distant) due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c048",
|
||||
"EventName": "PM_DATA_FROM_LMEM",
|
||||
"BriefDescription": "The processor's data cache was reloaded from the local chip's Memory due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from the local chip's Memory due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c04c",
|
||||
"EventName": "PM_DATA_FROM_MEMORY",
|
||||
"BriefDescription": "The processor's data cache was reloaded from a memory location including L4 from local remote or distant due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from a memory location including L4 from local remote or distant due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c04a",
|
||||
"EventName": "PM_DATA_FROM_RL4",
|
||||
"BriefDescription": "The processor's data cache was reloaded from another chip's L4 on the same Node or Group ( Remote) due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from another chip's L4 on the same Node or Group ( Remote) due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3c04a",
|
||||
"EventName": "PM_DATA_FROM_RMEM",
|
||||
"BriefDescription": "The processor's data cache was reloaded from another chip's memory on the same Node or Group ( Remote) due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from another chip's memory on the same Node or Group ( Remote) due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c050",
|
||||
"EventName": "PM_DATA_GRP_PUMP_CPRED",
|
||||
"BriefDescription": "Initial and Final Pump Scope was group pump (prediction=correct) for a demand load",
|
||||
"PublicDescription": "Initial and Final Pump Scope and data sourced across this scope was group pump for a demand load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c052",
|
||||
"EventName": "PM_DATA_GRP_PUMP_MPRED",
|
||||
"BriefDescription": "Final Pump Scope (Group) ended up either larger or smaller than Initial Pump Scope for a demand load",
|
||||
"PublicDescription": "Final Pump Scope(Group) to get data sourced, ended up larger than Initial Pump Scope OR Final Pump Scope(Group) got data from source that was at smaller scope(Chip) Final pump was group pump and initial pump was chip or final and initial pump was gro"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c052",
|
||||
"EventName": "PM_DATA_GRP_PUMP_MPRED_RTY",
|
||||
"BriefDescription": "Final Pump Scope (Group) ended up larger than Initial Pump Scope (Chip) for a demand load",
|
||||
"PublicDescription": "Final Pump Scope(Group) to get data sourced, ended up larger than Initial Pump Scope (Chip) Final pump was group pump and initial pump was chip pumpfor a demand load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c054",
|
||||
"EventName": "PM_DATA_PUMP_CPRED",
|
||||
"BriefDescription": "Pump prediction correct. Counts across all types of pumps for a demand load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c052",
|
||||
"EventName": "PM_DATA_PUMP_MPRED",
|
||||
"BriefDescription": "Pump misprediction. Counts across all types of pumps for a demand load",
|
||||
"PublicDescription": "Pump Mis prediction Counts across all types of pumpsfor a demand load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3c050",
|
||||
"EventName": "PM_DATA_SYS_PUMP_CPRED",
|
||||
"BriefDescription": "Initial and Final Pump Scope was system pump (prediction=correct) for a demand load",
|
||||
"PublicDescription": "Initial and Final Pump Scope and data sourced across this scope was system pump for a demand load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3c052",
|
||||
"EventName": "PM_DATA_SYS_PUMP_MPRED",
|
||||
"BriefDescription": "Final Pump Scope (system) mispredicted. Either the original scope was too small (Chip/Group) or the original scope was System and it should have been smaller. Counts for a demand load",
|
||||
"PublicDescription": "Final Pump Scope(system) to get data sourced, ended up larger than Initial Pump Scope(Chip/Group) OR Final Pump Scope(system) got data from source that was at smaller scope(Chip/group) Final pump was system pump and initial pump was chip or group or"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c050",
|
||||
"EventName": "PM_DATA_SYS_PUMP_MPRED_RTY",
|
||||
"BriefDescription": "Final Pump Scope (system) ended up larger than Initial Pump Scope (Chip/Group) for a demand load",
|
||||
"PublicDescription": "Final Pump Scope(system) to get data sourced, ended up larger than Initial Pump Scope (Chip or Group) for a demand load"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3e04c",
|
||||
"EventName": "PM_DPTEG_FROM_DL4",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's L4 on a different Node or Group (Distant) due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4e04c",
|
||||
"EventName": "PM_DPTEG_FROM_DMEM",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's memory on the same Node or Group (Distant) due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3e04a",
|
||||
"EventName": "PM_DPTEG_FROM_RMEM",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's memory on the same Node or Group ( Remote) due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20050",
|
||||
"EventName": "PM_GRP_PUMP_CPRED",
|
||||
"BriefDescription": "Initial and Final Pump Scope and data sourced across this scope was group pump for all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20052",
|
||||
"EventName": "PM_GRP_PUMP_MPRED",
|
||||
"BriefDescription": "Final Pump Scope (Group) ended up either larger or smaller than Initial Pump Scope for all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)",
|
||||
"PublicDescription": "Final Pump Scope(Group) to get data sourced, ended up larger than Initial Pump Scope OR Final Pump Scope(Group) got data from source that was at smaller scope(Chip) Final pump was group pump and initial pump was chip or final and initial pump was gro"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10052",
|
||||
"EventName": "PM_GRP_PUMP_MPRED_RTY",
|
||||
"BriefDescription": "Final Pump Scope (Group) ended up larger than Initial Pump Scope (Chip) for all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)",
|
||||
"PublicDescription": "Final Pump Scope(Group) to get data sourced, ended up larger than Initial Pump Scope (Chip) Final pump was group pump and initial pump was chip pumpfor all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x18082",
|
||||
"EventName": "PM_L3_CO_MEPF",
|
||||
"BriefDescription": "L3 CO of line in Mep state ( includes casthrough",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c058",
|
||||
"EventName": "PM_MEM_CO",
|
||||
"BriefDescription": "Memory castouts from this lpar",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10058",
|
||||
"EventName": "PM_MEM_LOC_THRESH_IFU",
|
||||
"BriefDescription": "Local Memory above threshold for IFU speculation control",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40056",
|
||||
"EventName": "PM_MEM_LOC_THRESH_LSU_HIGH",
|
||||
"BriefDescription": "Local memory above threshold for LSU medium",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c05e",
|
||||
"EventName": "PM_MEM_LOC_THRESH_LSU_MED",
|
||||
"BriefDescription": "Local memory above theshold for data prefetch",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c058",
|
||||
"EventName": "PM_MEM_PREF",
|
||||
"BriefDescription": "Memory prefetch for this lpar. Includes L4",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10056",
|
||||
"EventName": "PM_MEM_READ",
|
||||
"BriefDescription": "Reads from Memory from this lpar (includes data/inst/xlate/l1prefetch/inst prefetch). Includes L4",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3c05e",
|
||||
"EventName": "PM_MEM_RWITM",
|
||||
"BriefDescription": "Memory rwitm for this lpar",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3006e",
|
||||
"EventName": "PM_NEST_REF_CLK",
|
||||
"BriefDescription": "Multiply by 4 to obtain the number of PB cycles",
|
||||
"PublicDescription": "Nest reference clocks"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10054",
|
||||
"EventName": "PM_PUMP_CPRED",
|
||||
"BriefDescription": "Pump prediction correct. Counts across all types of pumps for all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)",
|
||||
"PublicDescription": "Pump prediction correct. Counts across all types of pumpsfor all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40052",
|
||||
"EventName": "PM_PUMP_MPRED",
|
||||
"BriefDescription": "Pump misprediction. Counts across all types of pumps for all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)",
|
||||
"PublicDescription": "Pump Mis prediction Counts across all types of pumpsfor all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30050",
|
||||
"EventName": "PM_SYS_PUMP_CPRED",
|
||||
"BriefDescription": "Initial and Final Pump Scope was system pump for all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)",
|
||||
"PublicDescription": "Initial and Final Pump Scope and data sourced across this scope was system pump for all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30052",
|
||||
"EventName": "PM_SYS_PUMP_MPRED",
|
||||
"BriefDescription": "Final Pump Scope (system) mispredicted. Either the original scope was too small (Chip/Group) or the original scope was System and it should have been smaller. Counts for all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)",
|
||||
"PublicDescription": "Final Pump Scope(system) to get data sourced, ended up larger than Initial Pump Scope(Chip/Group) OR Final Pump Scope(system) got data from source that was at smaller scope(Chip/group) Final pump was system pump and initial pump was chip or group or"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40050",
|
||||
"EventName": "PM_SYS_PUMP_MPRED_RTY",
|
||||
"BriefDescription": "Final Pump Scope (system) ended up larger than Initial Pump Scope (Chip/Group) for all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)",
|
||||
"PublicDescription": "Final Pump Scope(system) to get data sourced, ended up larger than Initial Pump Scope (Chip or Group) for all data types excluding data prefetch (demand load,inst prefetch,inst fetch,xlate)"
|
||||
},
|
||||
]
|
4064
tools/perf/pmu-events/arch/powerpc/power8/other.json
Normal file
4064
tools/perf/pmu-events/arch/powerpc/power8/other.json
Normal file
File diff suppressed because it is too large
Load Diff
350
tools/perf/pmu-events/arch/powerpc/power8/pipeline.json
Normal file
350
tools/perf/pmu-events/arch/powerpc/power8/pipeline.json
Normal file
@ -0,0 +1,350 @@
|
||||
[
|
||||
{,
|
||||
"EventCode": "0x100f2",
|
||||
"EventName": "PM_1PLUS_PPC_CMPL",
|
||||
"BriefDescription": "1 or more ppc insts finished",
|
||||
"PublicDescription": "1 or more ppc insts finished (completed)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x400f2",
|
||||
"EventName": "PM_1PLUS_PPC_DISP",
|
||||
"BriefDescription": "Cycles at least one Instr Dispatched",
|
||||
"PublicDescription": "Cycles at least one Instr Dispatched. Could be a group with only microcode. Issue HW016521"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x100fa",
|
||||
"EventName": "PM_ANY_THRD_RUN_CYC",
|
||||
"BriefDescription": "One of threads in run_cycles",
|
||||
"PublicDescription": "Any thread in run_cycles (was one thread in run_cycles)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4000a",
|
||||
"EventName": "PM_CMPLU_STALL",
|
||||
"BriefDescription": "Completion stall",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d018",
|
||||
"EventName": "PM_CMPLU_STALL_BRU",
|
||||
"BriefDescription": "Completion stall due to a Branch Unit",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c012",
|
||||
"EventName": "PM_CMPLU_STALL_DCACHE_MISS",
|
||||
"BriefDescription": "Completion stall by Dcache miss",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c018",
|
||||
"EventName": "PM_CMPLU_STALL_DMISS_L21_L31",
|
||||
"BriefDescription": "Completion stall by Dcache miss which resolved on chip ( excluding local L2/L3)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c016",
|
||||
"EventName": "PM_CMPLU_STALL_DMISS_L2L3",
|
||||
"BriefDescription": "Completion stall by Dcache miss which resolved in L2/L3",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c016",
|
||||
"EventName": "PM_CMPLU_STALL_DMISS_L2L3_CONFLICT",
|
||||
"BriefDescription": "Completion stall due to cache miss that resolves in the L2 or L3 with a conflict",
|
||||
"PublicDescription": "Completion stall due to cache miss resolving in core's L2/L3 with a conflict"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c01a",
|
||||
"EventName": "PM_CMPLU_STALL_DMISS_L3MISS",
|
||||
"BriefDescription": "Completion stall due to cache miss resolving missed the L3",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c018",
|
||||
"EventName": "PM_CMPLU_STALL_DMISS_LMEM",
|
||||
"BriefDescription": "Completion stall due to cache miss that resolves in local memory",
|
||||
"PublicDescription": "Completion stall due to cache miss resolving in core's Local Memory"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c01c",
|
||||
"EventName": "PM_CMPLU_STALL_DMISS_REMOTE",
|
||||
"BriefDescription": "Completion stall by Dcache miss which resolved from remote chip (cache or memory)",
|
||||
"PublicDescription": "Completion stall by Dcache miss which resolved on chip ( excluding local L2/L3)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c012",
|
||||
"EventName": "PM_CMPLU_STALL_ERAT_MISS",
|
||||
"BriefDescription": "Completion stall due to LSU reject ERAT miss",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d016",
|
||||
"EventName": "PM_CMPLU_STALL_FXLONG",
|
||||
"BriefDescription": "Completion stall due to a long latency fixed point instruction",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2d016",
|
||||
"EventName": "PM_CMPLU_STALL_FXU",
|
||||
"BriefDescription": "Completion stall due to FXU",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30036",
|
||||
"EventName": "PM_CMPLU_STALL_HWSYNC",
|
||||
"BriefDescription": "completion stall due to hwsync",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4d014",
|
||||
"EventName": "PM_CMPLU_STALL_LOAD_FINISH",
|
||||
"BriefDescription": "Completion stall due to a Load finish",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c010",
|
||||
"EventName": "PM_CMPLU_STALL_LSU",
|
||||
"BriefDescription": "Completion stall by LSU instruction",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10036",
|
||||
"EventName": "PM_CMPLU_STALL_LWSYNC",
|
||||
"BriefDescription": "completion stall due to isync/lwsync",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30006",
|
||||
"EventName": "PM_CMPLU_STALL_OTHER_CMPL",
|
||||
"BriefDescription": "Instructions core completed while this tread was stalled",
|
||||
"PublicDescription": "Instructions core completed while this thread was stalled"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c01c",
|
||||
"EventName": "PM_CMPLU_STALL_ST_FWD",
|
||||
"BriefDescription": "Completion stall due to store forward",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1001c",
|
||||
"EventName": "PM_CMPLU_STALL_THRD",
|
||||
"BriefDescription": "Completion Stalled due to thread conflict. Group ready to complete but it was another thread's turn",
|
||||
"PublicDescription": "Completion stall due to thread conflict"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1e",
|
||||
"EventName": "PM_CYC",
|
||||
"BriefDescription": "Cycles",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10006",
|
||||
"EventName": "PM_DISP_HELD",
|
||||
"BriefDescription": "Dispatch Held",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4003c",
|
||||
"EventName": "PM_DISP_HELD_SYNC_HOLD",
|
||||
"BriefDescription": "Dispatch held due to SYNC hold",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x200f8",
|
||||
"EventName": "PM_EXT_INT",
|
||||
"BriefDescription": "external interrupt",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x400f8",
|
||||
"EventName": "PM_FLUSH",
|
||||
"BriefDescription": "Flush (any type)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30012",
|
||||
"EventName": "PM_FLUSH_COMPLETION",
|
||||
"BriefDescription": "Completion Flush",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3000c",
|
||||
"EventName": "PM_FREQ_DOWN",
|
||||
"BriefDescription": "Power Management: Below Threshold B",
|
||||
"PublicDescription": "Frequency is being slewed down due to Power Management"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4000c",
|
||||
"EventName": "PM_FREQ_UP",
|
||||
"BriefDescription": "Power Management: Above Threshold A",
|
||||
"PublicDescription": "Frequency is being slewed up due to Power Management"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2000a",
|
||||
"EventName": "PM_HV_CYC",
|
||||
"BriefDescription": "Cycles in which msr_hv is high. Note that this event does not take msr_pr into consideration",
|
||||
"PublicDescription": "cycles in hypervisor mode"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3405e",
|
||||
"EventName": "PM_IFETCH_THROTTLE",
|
||||
"BriefDescription": "Cycles in which Instruction fetch throttle was active",
|
||||
"PublicDescription": "Cycles instruction fecth was throttled in IFU"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10014",
|
||||
"EventName": "PM_IOPS_CMPL",
|
||||
"BriefDescription": "Internal Operations completed",
|
||||
"PublicDescription": "IOPS Completed"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3c058",
|
||||
"EventName": "PM_LARX_FIN",
|
||||
"BriefDescription": "Larx finished",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1002e",
|
||||
"EventName": "PM_LD_CMPL",
|
||||
"BriefDescription": "count of Loads completed",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10062",
|
||||
"EventName": "PM_LD_L3MISS_PEND_CYC",
|
||||
"BriefDescription": "Cycles L3 miss was pending for this thread",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30066",
|
||||
"EventName": "PM_LSU_FIN",
|
||||
"BriefDescription": "LSU Finished an instruction (up to 2 per cycle)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2003e",
|
||||
"EventName": "PM_LSU_LMQ_SRQ_EMPTY_CYC",
|
||||
"BriefDescription": "LSU empty (lmq and srq empty)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2e05c",
|
||||
"EventName": "PM_LSU_REJECT_ERAT_MISS",
|
||||
"BriefDescription": "LSU Reject due to ERAT (up to 4 per cycles)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4e05c",
|
||||
"EventName": "PM_LSU_REJECT_LHS",
|
||||
"BriefDescription": "LSU Reject due to LHS (up to 4 per cycle)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1e05c",
|
||||
"EventName": "PM_LSU_REJECT_LMQ_FULL",
|
||||
"BriefDescription": "LSU reject due to LMQ full ( 4 per cycle)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1001a",
|
||||
"EventName": "PM_LSU_SRQ_FULL_CYC",
|
||||
"BriefDescription": "Storage Queue is full and is blocking dispatch",
|
||||
"PublicDescription": "SRQ is Full"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40014",
|
||||
"EventName": "PM_PROBE_NOP_DISP",
|
||||
"BriefDescription": "ProbeNops dispatched",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x600f4",
|
||||
"EventName": "PM_RUN_CYC",
|
||||
"BriefDescription": "Run_cycles",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3006c",
|
||||
"EventName": "PM_RUN_CYC_SMT2_MODE",
|
||||
"BriefDescription": "Cycles run latch is set and core is in SMT2 mode",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2006c",
|
||||
"EventName": "PM_RUN_CYC_SMT4_MODE",
|
||||
"BriefDescription": "cycles this threads run latch is set and the core is in SMT4 mode",
|
||||
"PublicDescription": "Cycles run latch is set and core is in SMT4 mode"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1006c",
|
||||
"EventName": "PM_RUN_CYC_ST_MODE",
|
||||
"BriefDescription": "Cycles run latch is set and core is in ST mode",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x500fa",
|
||||
"EventName": "PM_RUN_INST_CMPL",
|
||||
"BriefDescription": "Run_Instructions",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1e058",
|
||||
"EventName": "PM_STCX_FAIL",
|
||||
"BriefDescription": "stcx failed",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20016",
|
||||
"EventName": "PM_ST_CMPL",
|
||||
"BriefDescription": "Store completion count",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x200f0",
|
||||
"EventName": "PM_ST_FIN",
|
||||
"BriefDescription": "Store Instructions Finished",
|
||||
"PublicDescription": "Store Instructions Finished (store sent to nest)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20018",
|
||||
"EventName": "PM_ST_FWD",
|
||||
"BriefDescription": "Store forwards that finished",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10026",
|
||||
"EventName": "PM_TABLEWALK_CYC",
|
||||
"BriefDescription": "Cycles when a tablewalk (I or D) is active",
|
||||
"PublicDescription": "Tablewalk Active"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x300f8",
|
||||
"EventName": "PM_TB_BIT_TRANS",
|
||||
"BriefDescription": "timebase event",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2000c",
|
||||
"EventName": "PM_THRD_ALL_RUN_CYC",
|
||||
"BriefDescription": "All Threads in Run_cycles (was both threads in run_cycles)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30058",
|
||||
"EventName": "PM_TLBIE_FIN",
|
||||
"BriefDescription": "tlbie finished",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10060",
|
||||
"EventName": "PM_TM_TRANS_RUN_CYC",
|
||||
"BriefDescription": "run cycles in transactional state",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2e012",
|
||||
"EventName": "PM_TM_TX_PASS_RUN_CYC",
|
||||
"BriefDescription": "cycles spent in successful transactions",
|
||||
"PublicDescription": "run cycles spent in successful transactions"
|
||||
},
|
||||
]
|
140
tools/perf/pmu-events/arch/powerpc/power8/pmc.json
Normal file
140
tools/perf/pmu-events/arch/powerpc/power8/pmc.json
Normal file
@ -0,0 +1,140 @@
|
||||
[
|
||||
{,
|
||||
"EventCode": "0x20010",
|
||||
"EventName": "PM_PMC1_OVERFLOW",
|
||||
"BriefDescription": "Overflow from counter 1",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30010",
|
||||
"EventName": "PM_PMC2_OVERFLOW",
|
||||
"BriefDescription": "Overflow from counter 2",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30020",
|
||||
"EventName": "PM_PMC2_REWIND",
|
||||
"BriefDescription": "PMC2 Rewind Event (did not match condition)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10022",
|
||||
"EventName": "PM_PMC2_SAVED",
|
||||
"BriefDescription": "PMC2 Rewind Value saved",
|
||||
"PublicDescription": "PMC2 Rewind Value saved (matched condition)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x40010",
|
||||
"EventName": "PM_PMC3_OVERFLOW",
|
||||
"BriefDescription": "Overflow from counter 3",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10010",
|
||||
"EventName": "PM_PMC4_OVERFLOW",
|
||||
"BriefDescription": "Overflow from counter 4",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10020",
|
||||
"EventName": "PM_PMC4_REWIND",
|
||||
"BriefDescription": "PMC4 Rewind Event",
|
||||
"PublicDescription": "PMC4 Rewind Event (did not match condition)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30022",
|
||||
"EventName": "PM_PMC4_SAVED",
|
||||
"BriefDescription": "PMC4 Rewind Value saved (matched condition)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10024",
|
||||
"EventName": "PM_PMC5_OVERFLOW",
|
||||
"BriefDescription": "Overflow from counter 5",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x30024",
|
||||
"EventName": "PM_PMC6_OVERFLOW",
|
||||
"BriefDescription": "Overflow from counter 6",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x400f4",
|
||||
"EventName": "PM_RUN_PURR",
|
||||
"BriefDescription": "Run_PURR",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x10008",
|
||||
"EventName": "PM_RUN_SPURR",
|
||||
"BriefDescription": "Run SPURR",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x0",
|
||||
"EventName": "PM_SUSPENDED",
|
||||
"BriefDescription": "Counter OFF",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x301ea",
|
||||
"EventName": "PM_THRESH_EXC_1024",
|
||||
"BriefDescription": "Threshold counter exceeded a value of 1024",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x401ea",
|
||||
"EventName": "PM_THRESH_EXC_128",
|
||||
"BriefDescription": "Threshold counter exceeded a value of 128",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x401ec",
|
||||
"EventName": "PM_THRESH_EXC_2048",
|
||||
"BriefDescription": "Threshold counter exceeded a value of 2048",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x101e8",
|
||||
"EventName": "PM_THRESH_EXC_256",
|
||||
"BriefDescription": "Threshold counter exceed a count of 256",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x201e6",
|
||||
"EventName": "PM_THRESH_EXC_32",
|
||||
"BriefDescription": "Threshold counter exceeded a value of 32",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x101e6",
|
||||
"EventName": "PM_THRESH_EXC_4096",
|
||||
"BriefDescription": "Threshold counter exceed a count of 4096",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x201e8",
|
||||
"EventName": "PM_THRESH_EXC_512",
|
||||
"BriefDescription": "Threshold counter exceeded a value of 512",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x301e8",
|
||||
"EventName": "PM_THRESH_EXC_64",
|
||||
"BriefDescription": "IFU non-branch finished",
|
||||
"PublicDescription": "Threshold counter exceeded a value of 64"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x101ec",
|
||||
"EventName": "PM_THRESH_MET",
|
||||
"BriefDescription": "threshold exceeded",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4016e",
|
||||
"EventName": "PM_THRESH_NOT_MET",
|
||||
"BriefDescription": "Threshold counter did not meet threshold",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
]
|
176
tools/perf/pmu-events/arch/powerpc/power8/translation.json
Normal file
176
tools/perf/pmu-events/arch/powerpc/power8/translation.json
Normal file
@ -0,0 +1,176 @@
|
||||
[
|
||||
{,
|
||||
"EventCode": "0x4c054",
|
||||
"EventName": "PM_DERAT_MISS_16G",
|
||||
"BriefDescription": "Data ERAT Miss (Data TLB Access) page size 16G",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3c054",
|
||||
"EventName": "PM_DERAT_MISS_16M",
|
||||
"BriefDescription": "Data ERAT Miss (Data TLB Access) page size 16M",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c056",
|
||||
"EventName": "PM_DERAT_MISS_4K",
|
||||
"BriefDescription": "Data ERAT Miss (Data TLB Access) page size 4K",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c054",
|
||||
"EventName": "PM_DERAT_MISS_64K",
|
||||
"BriefDescription": "Data ERAT Miss (Data TLB Access) page size 64K",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4e048",
|
||||
"EventName": "PM_DPTEG_FROM_DL2L3_MOD",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Modified (M) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3e048",
|
||||
"EventName": "PM_DPTEG_FROM_DL2L3_SHR",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Shared (S) data from another chip's L2 or L3 on a different Node or Group (Distant), as this chip due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1e042",
|
||||
"EventName": "PM_DPTEG_FROM_L2",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L2 due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1e04e",
|
||||
"EventName": "PM_DPTEG_FROM_L2MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L2 due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2e040",
|
||||
"EventName": "PM_DPTEG_FROM_L2_MEPF",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L2 hit without dispatch conflicts on Mepf state. due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1e040",
|
||||
"EventName": "PM_DPTEG_FROM_L2_NO_CONFLICT",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L2 without conflict due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4e042",
|
||||
"EventName": "PM_DPTEG_FROM_L3",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3e042",
|
||||
"EventName": "PM_DPTEG_FROM_L3_DISP_CONFLICT",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 with dispatch conflict due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2e042",
|
||||
"EventName": "PM_DPTEG_FROM_L3_MEPF",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 without dispatch conflicts hit on Mepf state. due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1e044",
|
||||
"EventName": "PM_DPTEG_FROM_L3_NO_CONFLICT",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from local core's L3 without conflict due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1e04c",
|
||||
"EventName": "PM_DPTEG_FROM_LL4",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from the local chip's L4 cache due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2e048",
|
||||
"EventName": "PM_DPTEG_FROM_LMEM",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from the local chip's Memory due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2e04c",
|
||||
"EventName": "PM_DPTEG_FROM_MEMORY",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a memory location including L4 from local remote or distant due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4e04a",
|
||||
"EventName": "PM_DPTEG_FROM_OFF_CHIP_CACHE",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB either shared or modified data from another core's L2/L3 on a different chip (remote or distant) due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1e048",
|
||||
"EventName": "PM_DPTEG_FROM_ON_CHIP_CACHE",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB either shared or modified data from another core's L2/L3 on the same chip due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2e046",
|
||||
"EventName": "PM_DPTEG_FROM_RL2L3_MOD",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Modified (M) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1e04a",
|
||||
"EventName": "PM_DPTEG_FROM_RL2L3_SHR",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB with Shared (S) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2e04a",
|
||||
"EventName": "PM_DPTEG_FROM_RL4",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from another chip's L4 on the same Node or Group ( Remote) due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x300fc",
|
||||
"EventName": "PM_DTLB_MISS",
|
||||
"BriefDescription": "Data PTEG reload",
|
||||
"PublicDescription": "Data PTEG Reloaded (DTLB Miss)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x1c058",
|
||||
"EventName": "PM_DTLB_MISS_16G",
|
||||
"BriefDescription": "Data TLB Miss page size 16G",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x4c056",
|
||||
"EventName": "PM_DTLB_MISS_16M",
|
||||
"BriefDescription": "Data TLB Miss page size 16M",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x2c056",
|
||||
"EventName": "PM_DTLB_MISS_4K",
|
||||
"BriefDescription": "Data TLB Miss page size 4k",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x3c056",
|
||||
"EventName": "PM_DTLB_MISS_64K",
|
||||
"BriefDescription": "Data TLB Miss page size 64K",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x200f6",
|
||||
"EventName": "PM_LSU_DERAT_MISS",
|
||||
"BriefDescription": "DERAT Reloaded due to a DERAT miss",
|
||||
"PublicDescription": "DERAT Reloaded (Miss)"
|
||||
},
|
||||
{,
|
||||
"EventCode": "0x20066",
|
||||
"EventName": "PM_TLB_MISS",
|
||||
"BriefDescription": "TLB Miss (I + D)",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
]
|
746
tools/perf/pmu-events/arch/x86/bonnell/cache.json
Normal file
746
tools/perf/pmu-events/arch/x86/bonnell/cache.json
Normal file
@ -0,0 +1,746 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0x21",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "L2_ADS.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Cycles L2 address bus is in use."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x22",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "L2_DBUS_BUSY.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Cycles the L2 cache data bus is busy."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x23",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "L2_DBUS_BUSY_RD.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Cycles the L2 transfers data to the core."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x70",
|
||||
"EventName": "L2_LINES_IN.SELF.ANY",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache misses."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "L2_LINES_IN.SELF.DEMAND",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache misses."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x50",
|
||||
"EventName": "L2_LINES_IN.SELF.PREFETCH",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache misses."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x25",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "L2_M_LINES_IN.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache line modifications."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x26",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x70",
|
||||
"EventName": "L2_LINES_OUT.SELF.ANY",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache lines evicted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x26",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "L2_LINES_OUT.SELF.DEMAND",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache lines evicted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x26",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x50",
|
||||
"EventName": "L2_LINES_OUT.SELF.PREFETCH",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache lines evicted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x27",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x70",
|
||||
"EventName": "L2_M_LINES_OUT.SELF.ANY",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Modified lines evicted from the L2 cache"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x27",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "L2_M_LINES_OUT.SELF.DEMAND",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Modified lines evicted from the L2 cache"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x27",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x50",
|
||||
"EventName": "L2_M_LINES_OUT.SELF.PREFETCH",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Modified lines evicted from the L2 cache"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x28",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x44",
|
||||
"EventName": "L2_IFETCH.SELF.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cacheable instruction fetch requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x28",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x41",
|
||||
"EventName": "L2_IFETCH.SELF.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cacheable instruction fetch requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x28",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x48",
|
||||
"EventName": "L2_IFETCH.SELF.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cacheable instruction fetch requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x28",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x42",
|
||||
"EventName": "L2_IFETCH.SELF.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cacheable instruction fetch requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x28",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4f",
|
||||
"EventName": "L2_IFETCH.SELF.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cacheable instruction fetch requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x74",
|
||||
"EventName": "L2_LD.SELF.ANY.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x71",
|
||||
"EventName": "L2_LD.SELF.ANY.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x78",
|
||||
"EventName": "L2_LD.SELF.ANY.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x72",
|
||||
"EventName": "L2_LD.SELF.ANY.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x7f",
|
||||
"EventName": "L2_LD.SELF.ANY.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x44",
|
||||
"EventName": "L2_LD.SELF.DEMAND.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x41",
|
||||
"EventName": "L2_LD.SELF.DEMAND.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x48",
|
||||
"EventName": "L2_LD.SELF.DEMAND.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x42",
|
||||
"EventName": "L2_LD.SELF.DEMAND.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4f",
|
||||
"EventName": "L2_LD.SELF.DEMAND.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x54",
|
||||
"EventName": "L2_LD.SELF.PREFETCH.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x51",
|
||||
"EventName": "L2_LD.SELF.PREFETCH.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x58",
|
||||
"EventName": "L2_LD.SELF.PREFETCH.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x52",
|
||||
"EventName": "L2_LD.SELF.PREFETCH.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x29",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x5f",
|
||||
"EventName": "L2_LD.SELF.PREFETCH.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2A",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x44",
|
||||
"EventName": "L2_ST.SELF.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 store requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2A",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x41",
|
||||
"EventName": "L2_ST.SELF.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 store requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2A",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x48",
|
||||
"EventName": "L2_ST.SELF.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 store requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2A",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x42",
|
||||
"EventName": "L2_ST.SELF.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 store requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2A",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4f",
|
||||
"EventName": "L2_ST.SELF.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 store requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2B",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x44",
|
||||
"EventName": "L2_LOCK.SELF.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 locked accesses"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2B",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x41",
|
||||
"EventName": "L2_LOCK.SELF.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 locked accesses"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2B",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x48",
|
||||
"EventName": "L2_LOCK.SELF.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 locked accesses"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2B",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x42",
|
||||
"EventName": "L2_LOCK.SELF.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 locked accesses"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2B",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4f",
|
||||
"EventName": "L2_LOCK.SELF.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 locked accesses"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2C",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x44",
|
||||
"EventName": "L2_DATA_RQSTS.SELF.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All data requests from the L1 data cache"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2C",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x41",
|
||||
"EventName": "L2_DATA_RQSTS.SELF.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All data requests from the L1 data cache"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2C",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x48",
|
||||
"EventName": "L2_DATA_RQSTS.SELF.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All data requests from the L1 data cache"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2C",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x42",
|
||||
"EventName": "L2_DATA_RQSTS.SELF.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All data requests from the L1 data cache"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2C",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4f",
|
||||
"EventName": "L2_DATA_RQSTS.SELF.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All data requests from the L1 data cache"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2D",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x44",
|
||||
"EventName": "L2_LD_IFETCH.SELF.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All read requests from L1 instruction and data caches"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2D",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x41",
|
||||
"EventName": "L2_LD_IFETCH.SELF.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All read requests from L1 instruction and data caches"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2D",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x48",
|
||||
"EventName": "L2_LD_IFETCH.SELF.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All read requests from L1 instruction and data caches"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2D",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x42",
|
||||
"EventName": "L2_LD_IFETCH.SELF.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All read requests from L1 instruction and data caches"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2D",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4f",
|
||||
"EventName": "L2_LD_IFETCH.SELF.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All read requests from L1 instruction and data caches"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x74",
|
||||
"EventName": "L2_RQSTS.SELF.ANY.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x71",
|
||||
"EventName": "L2_RQSTS.SELF.ANY.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x78",
|
||||
"EventName": "L2_RQSTS.SELF.ANY.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x72",
|
||||
"EventName": "L2_RQSTS.SELF.ANY.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x7f",
|
||||
"EventName": "L2_RQSTS.SELF.ANY.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x44",
|
||||
"EventName": "L2_RQSTS.SELF.DEMAND.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x48",
|
||||
"EventName": "L2_RQSTS.SELF.DEMAND.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x42",
|
||||
"EventName": "L2_RQSTS.SELF.DEMAND.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x54",
|
||||
"EventName": "L2_RQSTS.SELF.PREFETCH.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x51",
|
||||
"EventName": "L2_RQSTS.SELF.PREFETCH.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x58",
|
||||
"EventName": "L2_RQSTS.SELF.PREFETCH.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x52",
|
||||
"EventName": "L2_RQSTS.SELF.PREFETCH.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x5f",
|
||||
"EventName": "L2_RQSTS.SELF.PREFETCH.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x41",
|
||||
"EventName": "L2_RQSTS.SELF.DEMAND.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache demand requests from this core that missed the L2"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4f",
|
||||
"EventName": "L2_RQSTS.SELF.DEMAND.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L2 cache demand requests from this core"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x74",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.ANY.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x71",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.ANY.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x78",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.ANY.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x72",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.ANY.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x7f",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.ANY.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x44",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.DEMAND.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x41",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.DEMAND.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x48",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.DEMAND.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x42",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.DEMAND.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4f",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.DEMAND.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x54",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.PREFETCH.E_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x51",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.PREFETCH.I_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x58",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.PREFETCH.M_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x52",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.PREFETCH.S_STATE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x30",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x5f",
|
||||
"EventName": "L2_REJECT_BUSQ.SELF.PREFETCH.MESI",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Rejected L2 cache requests"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x32",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "L2_NO_REQ.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Cycles no L2 cache requests are pending"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x40",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xa1",
|
||||
"EventName": "L1D_CACHE.LD",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "L1 Cacheable Data Reads"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x40",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xa2",
|
||||
"EventName": "L1D_CACHE.ST",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "L1 Cacheable Data Writes"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x40",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x83",
|
||||
"EventName": "L1D_CACHE.ALL_REF",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "L1 Data reads and writes"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x40",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xa3",
|
||||
"EventName": "L1D_CACHE.ALL_CACHE_REF",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "L1 Data Cacheable reads and writes"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x40",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8",
|
||||
"EventName": "L1D_CACHE.REPL",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L1 Data line replacements"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x40",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x48",
|
||||
"EventName": "L1D_CACHE.REPLM",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Modified cache lines allocated in the L1 data cache"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x40",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x10",
|
||||
"EventName": "L1D_CACHE.EVICT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Modified cache lines evicted from the L1 data cache"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCB",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "MEM_LOAD_RETIRED.L2_HIT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Retired loads that hit the L2 cache (precise event)."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCB",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "MEM_LOAD_RETIRED.L2_MISS",
|
||||
"SampleAfterValue": "10000",
|
||||
"BriefDescription": "Retired loads that miss the L2 cache"
|
||||
}
|
||||
]
|
261
tools/perf/pmu-events/arch/x86/bonnell/floating-point.json
Normal file
261
tools/perf/pmu-events/arch/x86/bonnell/floating-point.json
Normal file
@ -0,0 +1,261 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0x10",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "X87_COMP_OPS_EXE.ANY.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Floating point computational micro-ops executed."
|
||||
},
|
||||
{
|
||||
"PEBS": "2",
|
||||
"EventCode": "0x10",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x81",
|
||||
"EventName": "X87_COMP_OPS_EXE.ANY.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Floating point computational micro-ops retired."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x10",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "X87_COMP_OPS_EXE.FXCH.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "FXCH uops executed."
|
||||
},
|
||||
{
|
||||
"PEBS": "2",
|
||||
"EventCode": "0x10",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x82",
|
||||
"EventName": "X87_COMP_OPS_EXE.FXCH.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "FXCH uops retired."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x11",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "FP_ASSIST.S",
|
||||
"SampleAfterValue": "10000",
|
||||
"BriefDescription": "Floating point assists."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x11",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x81",
|
||||
"EventName": "FP_ASSIST.AR",
|
||||
"SampleAfterValue": "10000",
|
||||
"BriefDescription": "Floating point assists for retired operations."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB0",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "SIMD_UOPS_EXEC.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD micro-ops executed (excluding stores)."
|
||||
},
|
||||
{
|
||||
"PEBS": "2",
|
||||
"EventCode": "0xB0",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x80",
|
||||
"EventName": "SIMD_UOPS_EXEC.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD micro-ops retired (excluding stores)."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB1",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "SIMD_SAT_UOP_EXEC.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD saturated arithmetic micro-ops executed."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB1",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x80",
|
||||
"EventName": "SIMD_SAT_UOP_EXEC.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD saturated arithmetic micro-ops retired."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.MUL.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD packed multiply micro-ops executed"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x81",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.MUL.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD packed multiply micro-ops retired"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.SHIFT.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD packed shift micro-ops executed"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x82",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.SHIFT.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD packed shift micro-ops retired"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.PACK.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD packed micro-ops executed"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x84",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.PACK.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD packed micro-ops retired"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.UNPACK.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD unpacked micro-ops executed"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x88",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.UNPACK.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD unpacked micro-ops retired"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x10",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.LOGICAL.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD packed logical micro-ops executed"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x90",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.LOGICAL.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD packed logical micro-ops retired"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x20",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.ARITHMETIC.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD packed arithmetic micro-ops executed"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xa0",
|
||||
"EventName": "SIMD_UOP_TYPE_EXEC.ARITHMETIC.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD packed arithmetic micro-ops retired"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "SIMD_INST_RETIRED.PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired Streaming SIMD Extensions (SSE) packed-single instructions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "SIMD_INST_RETIRED.SCALAR_SINGLE",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired Streaming SIMD Extensions (SSE) scalar-single instructions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8",
|
||||
"EventName": "SIMD_INST_RETIRED.SCALAR_DOUBLE",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired Streaming SIMD Extensions 2 (SSE2) scalar-double instructions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x10",
|
||||
"EventName": "SIMD_INST_RETIRED.VECTOR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired Streaming SIMD Extensions 2 (SSE2) vector instructions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "SIMD_COMP_INST_RETIRED.PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired computational Streaming SIMD Extensions (SSE) packed-single instructions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "SIMD_COMP_INST_RETIRED.SCALAR_SINGLE",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired computational Streaming SIMD Extensions (SSE) scalar-single instructions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8",
|
||||
"EventName": "SIMD_COMP_INST_RETIRED.SCALAR_DOUBLE",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired computational Streaming SIMD Extensions 2 (SSE2) scalar-double instructions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCD",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "SIMD_ASSIST",
|
||||
"SampleAfterValue": "100000",
|
||||
"BriefDescription": "SIMD assists invoked."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCE",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "SIMD_INSTR_RETIRED",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "SIMD Instructions retired."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCF",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "SIMD_SAT_INSTR_RETIRED",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Saturated arithmetic instructions retired."
|
||||
}
|
||||
]
|
83
tools/perf/pmu-events/arch/x86/bonnell/frontend.json
Normal file
83
tools/perf/pmu-events/arch/x86/bonnell/frontend.json
Normal file
@ -0,0 +1,83 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0x80",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x3",
|
||||
"EventName": "ICACHE.ACCESSES",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Instruction fetches."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x80",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "ICACHE.HIT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Icache hit"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x80",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "ICACHE.MISSES",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Icache miss"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x86",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "CYCLES_ICACHE_MEM_STALLED.ICACHE_MEM_STALLED",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Cycles during which instruction fetches are stalled."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x87",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "DECODE_STALL.PFB_EMPTY",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Decode stall due to PFB empty"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x87",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "DECODE_STALL.IQ_FULL",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Decode stall due to IQ full"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xAA",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "MACRO_INSTS.NON_CISC_DECODED",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Non-CISC nacro instructions decoded"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xAA",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "MACRO_INSTS.CISC_DECODED",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "CISC macro instructions decoded"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xAA",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x3",
|
||||
"EventName": "MACRO_INSTS.ALL_DECODED",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "All Instructions decoded"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xA9",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "UOPS.MS_CYCLES",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "This event counts the cycles where 1 or more uops are issued by the micro-sequencer (MS), including microcode assists and inserted flows, and written to the IQ. ",
|
||||
"CounterMask": "1"
|
||||
}
|
||||
]
|
154
tools/perf/pmu-events/arch/x86/bonnell/memory.json
Normal file
154
tools/perf/pmu-events/arch/x86/bonnell/memory.json
Normal file
@ -0,0 +1,154 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0x5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xf",
|
||||
"EventName": "MISALIGN_MEM_REF.SPLIT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Memory references that cross an 8-byte boundary."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x9",
|
||||
"EventName": "MISALIGN_MEM_REF.LD_SPLIT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Load splits"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xa",
|
||||
"EventName": "MISALIGN_MEM_REF.ST_SPLIT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Store splits"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8f",
|
||||
"EventName": "MISALIGN_MEM_REF.SPLIT.AR",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Memory references that cross an 8-byte boundary (At Retirement)"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x89",
|
||||
"EventName": "MISALIGN_MEM_REF.LD_SPLIT.AR",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Load splits (At Retirement)"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8a",
|
||||
"EventName": "MISALIGN_MEM_REF.ST_SPLIT.AR",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Store splits (Ar Retirement)"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8c",
|
||||
"EventName": "MISALIGN_MEM_REF.RMW_SPLIT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "ld-op-st splits"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x97",
|
||||
"EventName": "MISALIGN_MEM_REF.BUBBLE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Nonzero segbase 1 bubble"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x91",
|
||||
"EventName": "MISALIGN_MEM_REF.LD_BUBBLE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Nonzero segbase load 1 bubble"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x92",
|
||||
"EventName": "MISALIGN_MEM_REF.ST_BUBBLE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Nonzero segbase store 1 bubble"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x94",
|
||||
"EventName": "MISALIGN_MEM_REF.RMW_BUBBLE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Nonzero segbase ld-op-st 1 bubble"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x81",
|
||||
"EventName": "PREFETCH.PREFETCHT0",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Streaming SIMD Extensions (SSE) PrefetchT0 instructions executed."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x82",
|
||||
"EventName": "PREFETCH.PREFETCHT1",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Streaming SIMD Extensions (SSE) PrefetchT1 instructions executed."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x84",
|
||||
"EventName": "PREFETCH.PREFETCHT2",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Streaming SIMD Extensions (SSE) PrefetchT2 instructions executed."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x86",
|
||||
"EventName": "PREFETCH.SW_L2",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Streaming SIMD Extensions (SSE) PrefetchT1 and PrefetchT2 instructions executed"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x88",
|
||||
"EventName": "PREFETCH.PREFETCHNTA",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Streaming SIMD Extensions (SSE) Prefetch NTA instructions executed"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x10",
|
||||
"EventName": "PREFETCH.HW_PREFETCH",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "L1 hardware prefetch request"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xf",
|
||||
"EventName": "PREFETCH.SOFTWARE_PREFETCH",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Any Software prefetch"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8f",
|
||||
"EventName": "PREFETCH.SOFTWARE_PREFETCH.AR",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Any Software prefetch"
|
||||
}
|
||||
]
|
450
tools/perf/pmu-events/arch/x86/bonnell/other.json
Normal file
450
tools/perf/pmu-events/arch/x86/bonnell/other.json
Normal file
@ -0,0 +1,450 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0x6",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x80",
|
||||
"EventName": "SEGMENT_REG_LOADS.ANY",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Number of segment register loads."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x20",
|
||||
"EventName": "DISPATCH_BLOCKED.ANY",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Memory cluster signals to block micro-op dispatch for any reason"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x3A",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "EIST_TRANS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Number of Enhanced Intel SpeedStep(R) Technology (EIST) transitions"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x3B",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xc0",
|
||||
"EventName": "THERMAL_TRIP",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Number of thermal trips"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x60",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_REQUEST_OUTSTANDING.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Outstanding cacheable data read bus requests duration."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x60",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_REQUEST_OUTSTANDING.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Outstanding cacheable data read bus requests duration."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x61",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x20",
|
||||
"EventName": "BUS_BNR_DRV.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Number of Bus Not Ready signals asserted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x61",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "BUS_BNR_DRV.THIS_AGENT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Number of Bus Not Ready signals asserted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x62",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x20",
|
||||
"EventName": "BUS_DRDY_CLOCKS.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Bus cycles when data is sent on the bus."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x62",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "BUS_DRDY_CLOCKS.THIS_AGENT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Bus cycles when data is sent on the bus."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x63",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_LOCK_CLOCKS.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Bus cycles when a LOCK signal is asserted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x63",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_LOCK_CLOCKS.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Bus cycles when a LOCK signal is asserted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x64",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_DATA_RCV.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Bus cycles while processor receives data."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x65",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_BRD.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Burst read bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x65",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_BRD.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Burst read bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x66",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_RFO.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "RFO bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x66",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_RFO.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "RFO bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x67",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_WB.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Explicit writeback bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x67",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_WB.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Explicit writeback bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x68",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_IFETCH.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Instruction-fetch bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x68",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_IFETCH.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Instruction-fetch bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x69",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_INVAL.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Invalidate bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x69",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_INVAL.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Invalidate bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6A",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_PWR.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Partial write bus transaction."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6A",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_PWR.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Partial write bus transaction."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6B",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_P.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Partial bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6B",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_P.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Partial bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6C",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_IO.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "IO bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6C",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_IO.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "IO bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6D",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_DEF.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Deferred bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6D",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_DEF.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Deferred bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_BURST.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Burst (full cache-line) bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_BURST.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Burst (full cache-line) bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6F",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_MEM.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Memory bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x6F",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_MEM.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Memory bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x70",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "BUS_TRANS_ANY.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x70",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_TRANS_ANY.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All bus transactions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x77",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xb",
|
||||
"EventName": "EXT_SNOOP.THIS_AGENT.ANY",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "External snoops."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x77",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "EXT_SNOOP.THIS_AGENT.CLEAN",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "External snoops."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x77",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "EXT_SNOOP.THIS_AGENT.HIT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "External snoops."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x77",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8",
|
||||
"EventName": "EXT_SNOOP.THIS_AGENT.HITM",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "External snoops."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x77",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2b",
|
||||
"EventName": "EXT_SNOOP.ALL_AGENTS.ANY",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "External snoops."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x77",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x21",
|
||||
"EventName": "EXT_SNOOP.ALL_AGENTS.CLEAN",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "External snoops."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x77",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x22",
|
||||
"EventName": "EXT_SNOOP.ALL_AGENTS.HIT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "External snoops."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x77",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x28",
|
||||
"EventName": "EXT_SNOOP.ALL_AGENTS.HITM",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "External snoops."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7A",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x20",
|
||||
"EventName": "BUS_HIT_DRV.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "HIT signal asserted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7A",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "BUS_HIT_DRV.THIS_AGENT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "HIT signal asserted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7B",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x20",
|
||||
"EventName": "BUS_HITM_DRV.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "HITM signal asserted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7B",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "BUS_HITM_DRV.THIS_AGENT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "HITM signal asserted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7D",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUSQ_EMPTY.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Bus queue is empty."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xe0",
|
||||
"EventName": "SNOOP_STALL_DRV.ALL_AGENTS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Bus stalled for snoops."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7E",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "SNOOP_STALL_DRV.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Bus stalled for snoops."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x7F",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x40",
|
||||
"EventName": "BUS_IO_WAIT.SELF",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "IO requests waiting in the bus queue."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "CYCLES_INT_MASKED.CYCLES_INT_MASKED",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Cycles during which interrupts are disabled."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "CYCLES_INT_MASKED.CYCLES_INT_PENDING_AND_MASKED",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Cycles during which interrupts are pending and disabled."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC8",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "HW_INT_RCV",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Hardware interrupts received."
|
||||
}
|
||||
]
|
364
tools/perf/pmu-events/arch/x86/bonnell/pipeline.json
Normal file
364
tools/perf/pmu-events/arch/x86/bonnell/pipeline.json
Normal file
@ -0,0 +1,364 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0x2",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x83",
|
||||
"EventName": "STORE_FORWARDS.ANY",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "All store forwards"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x81",
|
||||
"EventName": "STORE_FORWARDS.GOOD",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Good store forwards"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x7f",
|
||||
"EventName": "REISSUE.ANY",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Micro-op reissues for any cause"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xff",
|
||||
"EventName": "REISSUE.ANY.AR",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Micro-op reissues for any cause (At Retirement)"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x12",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "MUL.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Multiply operations executed."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x12",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x81",
|
||||
"EventName": "MUL.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Multiply operations retired"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x13",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "DIV.S",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Divide operations executed."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x13",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x81",
|
||||
"EventName": "DIV.AR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Divide operations retired"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x14",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "CYCLES_DIV_BUSY",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Cycles the divider is busy."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x3C",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "CPU_CLK_UNHALTED.CORE_P",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Core cycles when core is not halted"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x3C",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "CPU_CLK_UNHALTED.BUS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Bus cycles when core is not halted"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xA",
|
||||
"Counter": "Fixed counter 2",
|
||||
"UMask": "0x0",
|
||||
"EventName": "CPU_CLK_UNHALTED.CORE",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Core cycles when core is not halted"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xA",
|
||||
"Counter": "Fixed counter 3",
|
||||
"UMask": "0x0",
|
||||
"EventName": "CPU_CLK_UNHALTED.REF",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Reference cycles when core is not halted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x88",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "BR_INST_TYPE_RETIRED.COND",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "All macro conditional branch instructions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x88",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "BR_INST_TYPE_RETIRED.UNCOND",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "All macro unconditional branch instructions, excluding calls and indirects"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x88",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4",
|
||||
"EventName": "BR_INST_TYPE_RETIRED.IND",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "All indirect branches that are not calls."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x88",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8",
|
||||
"EventName": "BR_INST_TYPE_RETIRED.RET",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "All indirect branches that have a return mnemonic"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x88",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x10",
|
||||
"EventName": "BR_INST_TYPE_RETIRED.DIR_CALL",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "All non-indirect calls"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x88",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x20",
|
||||
"EventName": "BR_INST_TYPE_RETIRED.IND_CALL",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "All indirect calls, including both register and memory indirect."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x88",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x41",
|
||||
"EventName": "BR_INST_TYPE_RETIRED.COND_TAKEN",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Only taken macro conditional branch instructions"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x89",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "BR_MISSP_TYPE_RETIRED.COND",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Mispredicted cond branch instructions retired"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x89",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "BR_MISSP_TYPE_RETIRED.IND",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Mispredicted ind branches that are not calls"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x89",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4",
|
||||
"EventName": "BR_MISSP_TYPE_RETIRED.RETURN",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Mispredicted return branches"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x89",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8",
|
||||
"EventName": "BR_MISSP_TYPE_RETIRED.IND_CALL",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Mispredicted indirect calls, including both register and memory indirect. "
|
||||
},
|
||||
{
|
||||
"EventCode": "0x89",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x11",
|
||||
"EventName": "BR_MISSP_TYPE_RETIRED.COND_TAKEN",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Mispredicted and taken cond branch instructions retired"
|
||||
},
|
||||
{
|
||||
"PEBS": "2",
|
||||
"EventCode": "0xC0",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "INST_RETIRED.ANY_P",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Instructions retired (precise event)."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xA",
|
||||
"Counter": "Fixed counter 1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "INST_RETIRED.ANY",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Instructions retired."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC2",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x10",
|
||||
"EventName": "UOPS_RETIRED.ANY",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Micro-ops retired."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC2",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x10",
|
||||
"EventName": "UOPS_RETIRED.STALLED_CYCLES",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Cycles no micro-ops retired."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC2",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x10",
|
||||
"EventName": "UOPS_RETIRED.STALLS",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Periods no micro-ops retired."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "MACHINE_CLEARS.SMC",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Self-Modifying Code detected."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC4",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "BR_INST_RETIRED.ANY",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired branch instructions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC4",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "BR_INST_RETIRED.PRED_NOT_TAKEN",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired branch instructions that were predicted not-taken."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC4",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "BR_INST_RETIRED.MISPRED_NOT_TAKEN",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Retired branch instructions that were mispredicted not-taken."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC4",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4",
|
||||
"EventName": "BR_INST_RETIRED.PRED_TAKEN",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired branch instructions that were predicted taken."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC4",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x8",
|
||||
"EventName": "BR_INST_RETIRED.MISPRED_TAKEN",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Retired branch instructions that were mispredicted taken."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC4",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xc",
|
||||
"EventName": "BR_INST_RETIRED.TAKEN",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired taken branch instructions."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC4",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xf",
|
||||
"EventName": "BR_INST_RETIRED.ANY1",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Retired branch instructions."
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xC5",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x0",
|
||||
"EventName": "BR_INST_RETIRED.MISPRED",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Retired mispredicted branch instructions (precise event)."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xDC",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "RESOURCE_STALLS.DIV_BUSY",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Cycles issue is stalled due to div busy."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xE0",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "BR_INST_DECODED",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Branch instructions decoded"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xE4",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "BOGUS_BR",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Bogus branches"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xE6",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "BACLEARS.ANY",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "BACLEARS asserted."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "REISSUE.OVERLAP_STORE",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Micro-op reissues on a store-load collision"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x3",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x81",
|
||||
"EventName": "REISSUE.OVERLAP_STORE.AR",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Micro-op reissues on a store-load collision (At Retirement)"
|
||||
}
|
||||
]
|
124
tools/perf/pmu-events/arch/x86/bonnell/virtual-memory.json
Normal file
124
tools/perf/pmu-events/arch/x86/bonnell/virtual-memory.json
Normal file
@ -0,0 +1,124 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0x8",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x7",
|
||||
"EventName": "DATA_TLB_MISSES.DTLB_MISS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Memory accesses that missed the DTLB."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x8",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x5",
|
||||
"EventName": "DATA_TLB_MISSES.DTLB_MISS_LD",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "DTLB misses due to load operations."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x8",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x9",
|
||||
"EventName": "DATA_TLB_MISSES.L0_DTLB_MISS_LD",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L0 DTLB misses due to load operations."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x8",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x6",
|
||||
"EventName": "DATA_TLB_MISSES.DTLB_MISS_ST",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "DTLB misses due to store operations."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x8",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0xa",
|
||||
"EventName": "DATA_TLB_MISSES.L0_DTLB_MISS_ST",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "L0 DTLB misses due to store operations"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x3",
|
||||
"EventName": "PAGE_WALKS.WALKS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Number of page-walks executed."
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x3",
|
||||
"EventName": "PAGE_WALKS.CYCLES",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Duration of page-walks in core cycles"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "PAGE_WALKS.D_SIDE_WALKS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Number of D-side only page walks"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "PAGE_WALKS.D_SIDE_CYCLES",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Duration of D-side only page walks"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "PAGE_WALKS.I_SIDE_WALKS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Number of I-Side page walks"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "PAGE_WALKS.I_SIDE_CYCLES",
|
||||
"SampleAfterValue": "2000000",
|
||||
"BriefDescription": "Duration of I-Side page walks"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x82",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x1",
|
||||
"EventName": "ITLB.HIT",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "ITLB hits."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x82",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4",
|
||||
"EventName": "ITLB.FLUSH",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "ITLB flushes."
|
||||
},
|
||||
{
|
||||
"PEBS": "2",
|
||||
"EventCode": "0x82",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x2",
|
||||
"EventName": "ITLB.MISSES",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "ITLB misses."
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xCB",
|
||||
"Counter": "0,1",
|
||||
"UMask": "0x4",
|
||||
"EventName": "MEM_LOAD_RETIRED.DTLB_MISS",
|
||||
"SampleAfterValue": "200000",
|
||||
"BriefDescription": "Retired loads that miss the DTLB (precise event)."
|
||||
}
|
||||
]
|
3198
tools/perf/pmu-events/arch/x86/broadwell/cache.json
Normal file
3198
tools/perf/pmu-events/arch/x86/broadwell/cache.json
Normal file
File diff suppressed because it is too large
Load Diff
171
tools/perf/pmu-events/arch/x86/broadwell/floating-point.json
Normal file
171
tools/perf/pmu-events/arch/x86/broadwell/floating-point.json
Normal file
@ -0,0 +1,171 @@
|
||||
[
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of transitions from AVX-256 to legacy SSE when penalty is applicable.",
|
||||
"EventCode": "0xC1",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
"Errata": "BDM30",
|
||||
"EventName": "OTHER_ASSISTS.AVX_TO_SSE",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Number of transitions from AVX-256 to legacy SSE when penalty applicable.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of transitions from legacy SSE to AVX-256 when penalty is applicable.",
|
||||
"EventCode": "0xC1",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"Errata": "BDM30",
|
||||
"EventName": "OTHER_ASSISTS.SSE_TO_AVX",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Number of transitions from SSE to AVX-256 when penalty applicable.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar double precision floating-point instructions retired. Each count represents 1 computation. Applies to SSE* and AVX* scalar double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar single precision floating-point instructions retired. Each count represents 1 computation. Applies to SSE* and AVX* scalar single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of SSE/AVX computational 128-bit packed double precision floating-point instructions retired. Each count represents 2 computations. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of SSE/AVX computational 128-bit packed single precision floating-point instructions retired. Each count represents 4 computations. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of SSE/AVX computational 256-bit packed double precision floating-point instructions retired. Each count represents 4 computations. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of x87 floating point (FP) micro-code assist (numeric overflow/underflow, inexact result) when the output value (destination register) is invalid.",
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
"EventName": "FP_ASSIST.X87_OUTPUT",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Number of X87 assists due to output value.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts x87 floating point (FP) micro-code assist (invalid operation, denormal operand, SNaN operand) when the input value (one of the source operands to an FP instruction) is invalid.",
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
"EventName": "FP_ASSIST.X87_INPUT",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Number of X87 assists due to input value.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of SSE* floating point (FP) micro-code assist (numeric overflow/underflow) when the output value (destination register) is invalid. Counting covers only cases involving penalties that require micro-code assist intervention.",
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
"EventName": "FP_ASSIST.SIMD_OUTPUT",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Number of SIMD FP assists due to Output values",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts any input SSE* FP assist - invalid operation, denormal operand, dividing by zero, SNaN operand. Counting includes only cases involving penalties that required micro-code assist intervention.",
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"EventName": "FP_ASSIST.SIMD_INPUT",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Number of SIMD FP assists due to input values",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles with any input and output SSE or x87 FP assist. If an input and output assist are detected on the same cycle the event increments by 1.",
|
||||
"EventCode": "0xCA",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1e",
|
||||
"EventName": "FP_ASSIST.ANY",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Cycles with any input/output SSE or FP assist",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PEBS": "1",
|
||||
"EventCode": "0xc7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x20",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of SSE/AVX computational 256-bit packed single precision floating-point instructions retired. Each count represents 8 computations. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar floating-point instructions retired. Applies to SSE* and AVX* scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RSQRT RCP SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x3c",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.PACKED",
|
||||
"SampleAfterValue": "2000004",
|
||||
"BriefDescription": "Number of SSE/AVX computational packed floating-point instructions retired. Applies to SSE* and AVX*, packed, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RSQRT RCP SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2a",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SINGLE",
|
||||
"SampleAfterValue": "2000005",
|
||||
"BriefDescription": "Number of SSE/AVX computational single precision floating-point instructions retired. Applies to SSE* and AVX*scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element. ?.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x15",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.DOUBLE",
|
||||
"SampleAfterValue": "2000006",
|
||||
"BriefDescription": "Number of SSE/AVX computational double precision floating-point instructions retired. Applies to SSE* and AVX*scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element. ?.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
}
|
||||
]
|
286
tools/perf/pmu-events/arch/x86/broadwell/frontend.json
Normal file
286
tools/perf/pmu-events/arch/x86/broadwell/frontend.json
Normal file
@ -0,0 +1,286 @@
|
||||
[
|
||||
{
|
||||
"PublicDescription": "This counts the number of cycles that the instruction decoder queue is empty and can indicate that the application may be bound in the front end. It does not determine whether there are uops being delivered to the Alloc stage since uops can be delivered by bypass skipping the Instruction Decode Queue (IDQ) when it is empty.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
"EventName": "IDQ.EMPTY",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Instruction Decode Queue (IDQ) empty cycles",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
"EventName": "IDQ.MITE_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from MITE path",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
"EventName": "IDQ.DSB_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops initiated by Decode Stream Buffer (DSB) that are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"EventName": "IDQ.MS_DSB_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops initiated by Decode Stream Buffer (DSB) that are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x20",
|
||||
"EventName": "IDQ.MS_MITE_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the total number of uops delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may \"bypass\" the IDQ. Uops maybe initiated by Decode Stream Buffer (DSB) or MITE.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x30",
|
||||
"EventName": "IDQ.MS_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may \"bypass\" the IDQ. Uops maybe initiated by Decode Stream Buffer (DSB) or MITE.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x30",
|
||||
"EventName": "IDQ.MS_CYCLES",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
"EventName": "IDQ.MITE_CYCLES",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from MITE path",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
"EventName": "IDQ.DSB_CYCLES",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from Decode Stream Buffer (DSB) path",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"EventName": "IDQ.MS_DSB_CYCLES",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles when uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of deliveries to Instruction Decode Queue (IDQ) initiated by Decode Stream Buffer (DSB) while the Microcode Sequencer (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"EdgeDetect": "1",
|
||||
"EventName": "IDQ.MS_DSB_OCCUR",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Deliveries to Instruction Decode Queue (IDQ) initiated by Decode Stream Buffer (DSB) while Microcode Sequenser (MS) is busy",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles 4 uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x18",
|
||||
"EventName": "IDQ.ALL_DSB_CYCLES_4_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles Decode Stream Buffer (DSB) is delivering 4 Uops",
|
||||
"CounterMask": "4",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x18",
|
||||
"EventName": "IDQ.ALL_DSB_CYCLES_ANY_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles Decode Stream Buffer (DSB) is delivering any Uop",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles 4 uops were delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x24",
|
||||
"EventName": "IDQ.ALL_MITE_CYCLES_4_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles MITE is delivering 4 Uops",
|
||||
"CounterMask": "4",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles uops were delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x24",
|
||||
"EventName": "IDQ.ALL_MITE_CYCLES_ANY_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles MITE is delivering any Uop",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x3c",
|
||||
"EventName": "IDQ.MITE_ALL_UOPS",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from MITE path",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of both cacheable and noncacheable Instruction Cache, Streaming Buffer and Victim Cache Reads including UC fetches.",
|
||||
"EventCode": "0x80",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "ICACHE.HIT",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of Instruction Cache, Streaming Buffer and Victim Cache Reads. both cacheable and noncacheable, including UC fetches",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of instruction cache, streaming buffer and victim cache misses. Counting includes UC accesses.",
|
||||
"EventCode": "0x80",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
"EventName": "ICACHE.MISSES",
|
||||
"SampleAfterValue": "200003",
|
||||
"BriefDescription": "Number of Instruction Cache, Streaming Buffer and Victim Cache Misses. Includes Uncacheable accesses.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles during which the demand fetch waits for data (wfdM104H) from L2 or iSB (opportunistic hit).",
|
||||
"EventCode": "0x80",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
"EventName": "ICACHE.IFDATA_STALL",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles where a code fetch is stalled due to L1 instruction-cache miss.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of uops not delivered to Resource Allocation Table (RAT) per thread adding ?4 ? x? when Resource Allocation Table (RAT) is not stalled and Instruction Decode Queue (IDQ) delivers x uops to Resource Allocation Table (RAT) (where x belongs to {0,1,2,3}). Counting does not cover cases when:\n a. IDQ-Resource Allocation Table (RAT) pipe serves the other thread;\n b. Resource Allocation Table (RAT) is stalled for the thread (including uop drops and clear BE conditions); \n c. Instruction Decode Queue (IDQ) delivers four uops.",
|
||||
"EventCode": "0x9C",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CORE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Uops not delivered to Resource Allocation Table (RAT) per thread when backend of the machine is not stalled",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts, on the per-thread basis, cycles when no uops are delivered to Resource Allocation Table (RAT). IDQ_Uops_Not_Delivered.core =4.",
|
||||
"EventCode": "0x9C",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles per thread when 4 or more uops are not delivered to Resource Allocation Table (RAT) when backend of the machine is not stalled",
|
||||
"CounterMask": "4",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts, on the per-thread basis, cycles when less than 1 uop is delivered to Resource Allocation Table (RAT). IDQ_Uops_Not_Delivered.core >=3.",
|
||||
"EventCode": "0x9C",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_1_UOP_DELIV.CORE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles per thread when 3 or more uops are not delivered to Resource Allocation Table (RAT) when backend of the machine is not stalled",
|
||||
"CounterMask": "3",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_2_UOP_DELIV.CORE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles with less than 2 uops delivered by the front end.",
|
||||
"CounterMask": "2",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_3_UOP_DELIV.CORE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles with less than 3 uops delivered by the front end.",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"Invert": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_FE_WAS_OK",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Counts cycles FE delivered 4 uops or Resource Allocation Table (RAT) was stalling FE.",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts Decode Stream Buffer (DSB)-to-MITE switch true penalty cycles. These cycles do not include uops routed through because of the switch itself, for example, when Instruction Decode Queue (IDQ) pre-allocation is unavailable, or Instruction Decode Queue (IDQ) is full. SBD-to-MITE switch true penalty cycles happen after the merge mux (MM) receives Decode Stream Buffer (DSB) Sync-indication until receiving the first MITE uop. \nMM is placed before Instruction Decode Queue (IDQ) to merge uops being fed from the MITE and Decode Stream Buffer (DSB) paths. Decode Stream Buffer (DSB) inserts the Sync-indication whenever a Decode Stream Buffer (DSB)-to-MITE switch occurs.\nPenalty: A Decode Stream Buffer (DSB) hit followed by a Decode Stream Buffer (DSB) miss can cost up to six cycles in which no uops are delivered to the IDQ. Most often, such switches from the Decode Stream Buffer (DSB) to the legacy pipeline cost 0?2 cycles.",
|
||||
"EventCode": "0xAB",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
"EventName": "DSB2MITE_SWITCHES.PENALTY_CYCLES",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Decode Stream Buffer (DSB)-to-MITE switch true penalty cycles.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x30",
|
||||
"EdgeDetect": "1",
|
||||
"EventName": "IDQ.MS_SWITCHES",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of switches from DSB (Decode Stream Buffer) or MITE (legacy decode pipeline) to the Microcode Sequencer.",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
}
|
||||
]
|
2845
tools/perf/pmu-events/arch/x86/broadwell/memory.json
Normal file
2845
tools/perf/pmu-events/arch/x86/broadwell/memory.json
Normal file
File diff suppressed because it is too large
Load Diff
44
tools/perf/pmu-events/arch/x86/broadwell/other.json
Normal file
44
tools/perf/pmu-events/arch/x86/broadwell/other.json
Normal file
@ -0,0 +1,44 @@
|
||||
[
|
||||
{
|
||||
"PublicDescription": "This event counts the unhalted core cycles during which the thread is in the ring 0 privileged mode.",
|
||||
"EventCode": "0x5C",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "CPL_CYCLES.RING0",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Unhalted core cycles when the thread is in ring 0",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts unhalted core cycles during which the thread is in rings 1, 2, or 3.",
|
||||
"EventCode": "0x5C",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
"EventName": "CPL_CYCLES.RING123",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Unhalted core cycles when thread is in rings 1, 2, or 3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts when there is a transition from ring 1,2 or 3 to ring0.",
|
||||
"EventCode": "0x5C",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EdgeDetect": "1",
|
||||
"EventName": "CPL_CYCLES.RING0_TRANS",
|
||||
"SampleAfterValue": "100007",
|
||||
"BriefDescription": "Number of intervals between processor halts while thread is in ring 0",
|
||||
"CounterMask": "1",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles in which the L1 and L2 are locked due to a UC lock or split lock. A lock is asserted in case of locked memory access, due to noncacheable memory, locked operation that spans two cache lines, or a page walk from the noncacheable page table. L1D and L2 locks have a very high performance penalty and it is highly recommended to avoid such access.",
|
||||
"EventCode": "0x63",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "LOCK_CYCLES.SPLIT_LOCK_UC_LOCK_DURATION",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles when L1 and L2 are locked due to UC or split lock",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
}
|
||||
]
|
1417
tools/perf/pmu-events/arch/x86/broadwell/pipeline.json
Normal file
1417
tools/perf/pmu-events/arch/x86/broadwell/pipeline.json
Normal file
File diff suppressed because it is too large
Load Diff
388
tools/perf/pmu-events/arch/x86/broadwell/virtual-memory.json
Normal file
388
tools/perf/pmu-events/arch/x86/broadwell/virtual-memory.json
Normal file
@ -0,0 +1,388 @@
|
||||
[
|
||||
{
|
||||
"PublicDescription": "This event counts load misses in all DTLB levels that cause page walks of any page size (4K/2M/4M/1G).",
|
||||
"EventCode": "0x08",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_LOAD_MISSES.MISS_CAUSES_A_WALK",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Load misses in all DTLB levels that cause page walks",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts load misses in all DTLB levels that cause a completed page walk (4K page size). The page walk can end with or without a fault.",
|
||||
"EventCode": "0x08",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_4K",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Demand load Miss in all translation lookaside buffer (TLB) levels causes a page walk that completes (4K).",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts load misses in all DTLB levels that cause a completed page walk (2M and 4M page sizes). The page walk can end with or without a fault.",
|
||||
"EventCode": "0x08",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_2M_4M",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Demand load Miss in all translation lookaside buffer (TLB) levels causes a page walk that completes (2M/4M).",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts load misses in all DTLB levels that cause a completed page walk (1G page size). The page walk can end with or without a fault.",
|
||||
"EventCode": "0x08",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_1G",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Load miss in all TLB levels causes a page walk that completes. (1G)",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles while PMH is busy with the page walk.",
|
||||
"EventCode": "0x08",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_DURATION",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycles when PMH is busy with page walks",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x20",
|
||||
"EventName": "DTLB_LOAD_MISSES.STLB_HIT_4K",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Load misses that miss the DTLB and hit the STLB (4K).",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x40",
|
||||
"EventName": "DTLB_LOAD_MISSES.STLB_HIT_2M",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Load misses that miss the DTLB and hit the STLB (2M).",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts store misses in all DTLB levels that cause page walks of any page size (4K/2M/4M/1G).",
|
||||
"EventCode": "0x49",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_STORE_MISSES.MISS_CAUSES_A_WALK",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Store misses in all DTLB levels that cause page walks",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts store misses in all DTLB levels that cause a completed page walk (4K page size). The page walk can end with or without a fault.",
|
||||
"EventCode": "0x49",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_4K",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Store miss in all TLB levels causes a page walk that completes. (4K)",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts store misses in all DTLB levels that cause a completed page walk (2M and 4M page sizes). The page walk can end with or without a fault.",
|
||||
"EventCode": "0x49",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_2M_4M",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Store misses in all DTLB levels that cause completed page walks (2M/4M)",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts store misses in all DTLB levels that cause a completed page walk (1G page size). The page walk can end with or without a fault.",
|
||||
"EventCode": "0x49",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_1G",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Store misses in all DTLB levels that cause completed page walks (1G)",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles while PMH is busy with the page walk.",
|
||||
"EventCode": "0x49",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_DURATION",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Cycles when PMH is busy with page walks",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x20",
|
||||
"EventName": "DTLB_STORE_MISSES.STLB_HIT_4K",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Store misses that miss the DTLB and hit the STLB (4K).",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x40",
|
||||
"EventName": "DTLB_STORE_MISSES.STLB_HIT_2M",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Store misses that miss the DTLB and hit the STLB (2M).",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts cycles for an extended page table walk. The Extended Page directory cache differs from standard TLB caches by the operating system that use it. Virtual machine operating systems use the extended page directory cache, while guest operating systems use the standard TLB caches.",
|
||||
"EventCode": "0x4F",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"EventName": "EPT.WALK_CYCLES",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Cycle count for an Extended Page table walk.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts store misses in all DTLB levels that cause page walks of any page size (4K/2M/4M/1G).",
|
||||
"EventCode": "0x85",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "ITLB_MISSES.MISS_CAUSES_A_WALK",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Misses at all ITLB levels that cause page walks",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts store misses in all DTLB levels that cause a completed page walk (4K page size). The page walk can end with or without a fault.",
|
||||
"EventCode": "0x85",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x2",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_4K",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (4K)",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts store misses in all DTLB levels that cause a completed page walk (2M and 4M page sizes). The page walk can end with or without a fault.",
|
||||
"EventCode": "0x85",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x4",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_2M_4M",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (2M/4M)",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts store misses in all DTLB levels that cause a completed page walk (1G page size). The page walk can end with or without a fault.",
|
||||
"EventCode": "0x85",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x8",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_1G",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Store miss in all TLB levels causes a page walk that completes. (1G)",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of cycles while PMH is busy with the page walk.",
|
||||
"EventCode": "0x85",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x10",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "ITLB_MISSES.WALK_DURATION",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Cycles when PMH is busy with page walks",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x85",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x20",
|
||||
"EventName": "ITLB_MISSES.STLB_HIT_4K",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Core misses that miss the DTLB and hit the STLB (4K).",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x85",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x40",
|
||||
"EventName": "ITLB_MISSES.STLB_HIT_2M",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Code misses that miss the DTLB and hit the STLB (2M).",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of flushes of the big or small ITLB pages. Counting include both TLB Flush (covering all sets) and TLB Set Clear (set-specific).",
|
||||
"EventCode": "0xAE",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "ITLB.ITLB_FLUSH",
|
||||
"SampleAfterValue": "100007",
|
||||
"BriefDescription": "Flushing of the Instruction TLB (ITLB) pages, includes 4k/2M/4M pages.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xBC",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x11",
|
||||
"Errata": "BDM69, BDM98",
|
||||
"EventName": "PAGE_WALKER_LOADS.DTLB_L1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of DTLB page walker hits in the L1+FB.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xBC",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x21",
|
||||
"Errata": "BDM69, BDM98",
|
||||
"EventName": "PAGE_WALKER_LOADS.ITLB_L1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of ITLB page walker hits in the L1+FB.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xBC",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x12",
|
||||
"Errata": "BDM69, BDM98",
|
||||
"EventName": "PAGE_WALKER_LOADS.DTLB_L2",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of DTLB page walker hits in the L2.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xBC",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x22",
|
||||
"Errata": "BDM69, BDM98",
|
||||
"EventName": "PAGE_WALKER_LOADS.ITLB_L2",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of ITLB page walker hits in the L2.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xBC",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x14",
|
||||
"Errata": "BDM69, BDM98",
|
||||
"EventName": "PAGE_WALKER_LOADS.DTLB_L3",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of DTLB page walker hits in the L3 + XSNP.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xBC",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x24",
|
||||
"Errata": "BDM69, BDM98",
|
||||
"EventName": "PAGE_WALKER_LOADS.ITLB_L3",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of ITLB page walker hits in the L3 + XSNP.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xBC",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x18",
|
||||
"Errata": "BDM69, BDM98",
|
||||
"EventName": "PAGE_WALKER_LOADS.DTLB_MEMORY",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Number of DTLB page walker hits in Memory.",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of DTLB flush attempts of the thread-specific entries.",
|
||||
"EventCode": "0xBD",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x1",
|
||||
"EventName": "TLB_FLUSH.DTLB_THREAD",
|
||||
"SampleAfterValue": "100007",
|
||||
"BriefDescription": "DTLB flush attempts of the thread-specific entries",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "This event counts the number of any STLB flush attempts (such as entire, VPID, PCID, InvPage, CR3 write, and so on).",
|
||||
"EventCode": "0xBD",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x20",
|
||||
"EventName": "TLB_FLUSH.STLB_ANY",
|
||||
"SampleAfterValue": "100007",
|
||||
"BriefDescription": "STLB flush attempts",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0xe",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Demand load Miss in all translation lookaside buffer (TLB) levels causes a page walk that completes of any page size.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x60",
|
||||
"EventName": "DTLB_LOAD_MISSES.STLB_HIT",
|
||||
"SampleAfterValue": "2000003",
|
||||
"BriefDescription": "Load operations that miss the first DTLB level but hit the second and do not cause page walks.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0xe",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Store misses in all DTLB levels that cause completed page walks.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x60",
|
||||
"EventName": "DTLB_STORE_MISSES.STLB_HIT",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Store operations that miss the first TLB level but hit the second and do not cause page walks.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x85",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0xe",
|
||||
"Errata": "BDM69",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Misses in all ITLB levels that cause completed page walks.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x85",
|
||||
"Counter": "0,1,2,3",
|
||||
"UMask": "0x60",
|
||||
"EventName": "ITLB_MISSES.STLB_HIT",
|
||||
"SampleAfterValue": "100003",
|
||||
"BriefDescription": "Operations that miss the first ITLB level but hit the second and do not cause any page walks.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
}
|
||||
]
|
774
tools/perf/pmu-events/arch/x86/broadwellde/cache.json
Normal file
774
tools/perf/pmu-events/arch/x86/broadwellde/cache.json
Normal file
@ -0,0 +1,774 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0x21",
|
||||
"BriefDescription": "Demand Data Read miss L2, no rejects",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.DEMAND_DATA_RD_MISS",
|
||||
"PublicDescription": "This event counts the number of demand Data Read requests that miss L2 cache. Only not rejected loads are counted.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0x41",
|
||||
"BriefDescription": "Demand Data Read requests that hit L2 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.DEMAND_DATA_RD_HIT",
|
||||
"PublicDescription": "This event counts the number of demand Data Read requests that hit L2 cache. Only not rejected loads are counted.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0x30",
|
||||
"BriefDescription": "L2 prefetch requests that miss L2 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.L2_PF_MISS",
|
||||
"PublicDescription": "This event counts the number of requests from the L2 hardware prefetchers that miss L2 cache.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0x50",
|
||||
"BriefDescription": "L2 prefetch requests that hit L2 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.L2_PF_HIT",
|
||||
"PublicDescription": "This event counts the number of requests from the L2 hardware prefetchers that hit L2 cache. L3 prefetch new types.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0xe1",
|
||||
"BriefDescription": "Demand Data Read requests",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.ALL_DEMAND_DATA_RD",
|
||||
"PublicDescription": "This event counts the number of demand Data Read requests (including requests from L1D hardware prefetchers). These loads may hit or miss L2 cache. Only non rejected loads are counted.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0xe2",
|
||||
"BriefDescription": "RFO requests to L2 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.ALL_RFO",
|
||||
"PublicDescription": "This event counts the total number of RFO (read for ownership) requests to L2 cache. L2 RFO requests include both L1D demand RFO misses as well as L1D RFO prefetches.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0xe4",
|
||||
"BriefDescription": "L2 code requests",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.ALL_CODE_RD",
|
||||
"PublicDescription": "This event counts the total number of L2 code requests.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0xf8",
|
||||
"BriefDescription": "Requests from L2 hardware prefetchers",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.ALL_PF",
|
||||
"PublicDescription": "This event counts the total number of requests from the L2 hardware prefetchers.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x27",
|
||||
"UMask": "0x50",
|
||||
"BriefDescription": "Not rejected writebacks that hit L2 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_DEMAND_RQSTS.WB_HIT",
|
||||
"PublicDescription": "This event counts the number of WB requests that hit L2 cache.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"UMask": "0x41",
|
||||
"BriefDescription": "Core-originated cacheable demand requests missed L3",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "LONGEST_LAT_CACHE.MISS",
|
||||
"PublicDescription": "This event counts core-originated cacheable demand requests that miss the last level cache (LLC). Demand requests include loads, RFOs, and hardware prefetches from L1D, and instruction fetches from IFU.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2E",
|
||||
"UMask": "0x4f",
|
||||
"BriefDescription": "Core-originated cacheable demand requests that refer to L3",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "LONGEST_LAT_CACHE.REFERENCE",
|
||||
"PublicDescription": "This event counts core-originated cacheable demand requests that refer to the last level cache (LLC). Demand requests include loads, RFOs, and hardware prefetches from L1D, and instruction fetches from IFU.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x48",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "L1D miss oustandings duration in cycles",
|
||||
"Counter": "2",
|
||||
"EventName": "L1D_PEND_MISS.PENDING",
|
||||
"PublicDescription": "This event counts duration of L1D miss outstanding, that is each cycle number of Fill Buffers (FB) outstanding required by Demand Reads. FB either is held by demand loads, or it is held by non-demand loads and gets hit at least once by demand. The valid outstanding interval is defined until the FB deallocation by one of the following ways: from FB allocation, if FB is allocated by demand; from the demand Hit FB, if it is allocated by hardware or software prefetch.\nNote: In the L1D, a Demand Read contains cacheable or noncacheable demand loads, including ones causing cache-line splits and reads due to page walks resulted from any request type.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "2"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x48",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles with L1D load Misses outstanding.",
|
||||
"Counter": "2",
|
||||
"EventName": "L1D_PEND_MISS.PENDING_CYCLES",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "This event counts duration of L1D miss outstanding in cycles.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "2"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x51",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "L1D data line replacements",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L1D.REPLACEMENT",
|
||||
"PublicDescription": "This event counts L1D data line replacements including opportunistic replacements, and replacements that require stall-for-replace or block-for-replace.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x60",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Offcore outstanding Demand Data Read transactions in uncore queue.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_DATA_RD",
|
||||
"Errata": "BDM76",
|
||||
"PublicDescription": "This event counts the number of offcore outstanding Demand Data Read transactions in the super queue (SQ) every cycle. A transaction is considered to be in the Offcore outstanding state between L2 miss and transaction completion sent to requestor. See the corresponding Umask under OFFCORE_REQUESTS.\nNote: A prefetch promoted to Demand is counted from the promotion point.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x60",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Offcore outstanding code reads transactions in SuperQueue (SQ), queue to uncore, every cycle",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_CODE_RD",
|
||||
"Errata": "BDM76",
|
||||
"PublicDescription": "This event counts the number of offcore outstanding Code Reads transactions in the super queue every cycle. The \"Offcore outstanding\" state of the transaction lasts from the L2 miss until the sending transaction completion to requestor (SQ deallocation). See the corresponding Umask under OFFCORE_REQUESTS.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x60",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Offcore outstanding RFO store transactions in SuperQueue (SQ), queue to uncore",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_RFO",
|
||||
"Errata": "BDM76",
|
||||
"PublicDescription": "This event counts the number of offcore outstanding RFO (store) transactions in the super queue (SQ) every cycle. A transaction is considered to be in the Offcore outstanding state between L2 miss and transaction completion sent to requestor (SQ de-allocation). See corresponding Umask under OFFCORE_REQUESTS.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x60",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Offcore outstanding cacheable Core Data Read transactions in SuperQueue (SQ), queue to uncore",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS_OUTSTANDING.ALL_DATA_RD",
|
||||
"Errata": "BDM76",
|
||||
"PublicDescription": "This event counts the number of offcore outstanding cacheable Core Data Read transactions in the super queue every cycle. A transaction is considered to be in the Offcore outstanding state between L2 miss and transaction completion sent to requestor (SQ de-allocation). See corresponding Umask under OFFCORE_REQUESTS.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x60",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles when offcore outstanding Demand Data Read transactions are present in SuperQueue (SQ), queue to uncore",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DEMAND_DATA_RD",
|
||||
"CounterMask": "1",
|
||||
"Errata": "BDM76",
|
||||
"PublicDescription": "This event counts cycles when offcore outstanding Demand Data Read transactions are present in the super queue (SQ). A transaction is considered to be in the Offcore outstanding state between L2 miss and transaction completion sent to requestor (SQ de-allocation).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x60",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Cycles when offcore outstanding cacheable Core Data Read transactions are present in SuperQueue (SQ), queue to uncore",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DATA_RD",
|
||||
"CounterMask": "1",
|
||||
"Errata": "BDM76",
|
||||
"PublicDescription": "This event counts cycles when offcore outstanding cacheable Core Data Read transactions are present in the super queue. A transaction is considered to be in the Offcore outstanding state between L2 miss and transaction completion sent to requestor (SQ de-allocation). See corresponding Umask under OFFCORE_REQUESTS.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x60",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Offcore outstanding demand rfo reads transactions in SuperQueue (SQ), queue to uncore, every cycle",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DEMAND_RFO",
|
||||
"CounterMask": "1",
|
||||
"Errata": "BDM76",
|
||||
"PublicDescription": "This event counts the number of offcore outstanding demand rfo Reads transactions in the super queue every cycle. The \"Offcore outstanding\" state of the transaction lasts from the L2 miss until the sending transaction completion to requestor (SQ deallocation). See the corresponding Umask under OFFCORE_REQUESTS.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x63",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Cycles when L1D is locked",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "LOCK_CYCLES.CACHE_LOCK_DURATION",
|
||||
"PublicDescription": "This event counts the number of cycles when the L1D is locked. It is a superset of the 0x1 mask (BUS_LOCK_CLOCKS.BUS_LOCK_DURATION).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB0",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Demand Data Read requests sent to uncore",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS.DEMAND_DATA_RD",
|
||||
"PublicDescription": "This event counts the Demand Data Read requests sent to uncore. Use it in conjunction with OFFCORE_REQUESTS_OUTSTANDING to determine average latency in the uncore.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB0",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Cacheable and noncachaeble code read requests",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS.DEMAND_CODE_RD",
|
||||
"PublicDescription": "This event counts both cacheable and noncachaeble code read requests.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB0",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Demand RFO requests including regular RFOs, locks, ItoM",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS.DEMAND_RFO",
|
||||
"PublicDescription": "This event counts the demand RFO (read for ownership) requests including regular RFOs, locks, ItoM.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB0",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Demand and prefetch data reads",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS.ALL_DATA_RD",
|
||||
"PublicDescription": "This event counts the demand and prefetch data reads. All Core Data Reads include cacheable \"Demands\" and L2 prefetchers (not L3 prefetchers). Counting also covers reads due to page walks resulted from any request type.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xb2",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Offcore requests buffer cannot take more entries for this thread core.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS_BUFFER.SQ_FULL",
|
||||
"PublicDescription": "This event counts the number of cases when the offcore requests buffer cannot take more entries for the core. This can happen when the superqueue does not contain eligible entries, or when L1D writeback pending FIFO requests is full.\nNote: Writeback pending FIFO has six entries.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD0",
|
||||
"UMask": "0x11",
|
||||
"BriefDescription": "Retired load uops that miss the STLB.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_UOPS_RETIRED.STLB_MISS_LOADS",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts load uops with true STLB miss retired to the architected path. True STLB miss is an uop triggering page walk that gets completed without blocks, and later gets retired. This page walk can end up with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD0",
|
||||
"UMask": "0x12",
|
||||
"BriefDescription": "Retired store uops that miss the STLB.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_UOPS_RETIRED.STLB_MISS_STORES",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts store uops with true STLB miss retired to the architected path. True STLB miss is an uop triggering page walk that gets completed without blocks, and later gets retired. This page walk can end up with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"L1_Hit_Indication": "1",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD0",
|
||||
"UMask": "0x21",
|
||||
"BriefDescription": "Retired load uops with locked access.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_UOPS_RETIRED.LOCK_LOADS",
|
||||
"Errata": "BDM35",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts load uops with locked access retired to the architected path.",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD0",
|
||||
"UMask": "0x41",
|
||||
"BriefDescription": "Retired load uops that split across a cacheline boundary.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_UOPS_RETIRED.SPLIT_LOADS",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts line-splitted load uops retired to the architected path. A line split is across 64B cache-line which includes a page split (4K).",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD0",
|
||||
"UMask": "0x42",
|
||||
"BriefDescription": "Retired store uops that split across a cacheline boundary.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_UOPS_RETIRED.SPLIT_STORES",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts line-splitted store uops retired to the architected path. A line split is across 64B cache-line which includes a page split (4K).",
|
||||
"SampleAfterValue": "100003",
|
||||
"L1_Hit_Indication": "1",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD0",
|
||||
"UMask": "0x81",
|
||||
"BriefDescription": "All retired load uops.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_UOPS_RETIRED.ALL_LOADS",
|
||||
"PublicDescription": "This event counts load uops retired to the architected path with a filter on bits 0 and 1 applied.\nNote: This event counts AVX-256bit load/store double-pump memory uops as a single uop at retirement. This event also counts SW prefetches.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD0",
|
||||
"UMask": "0x82",
|
||||
"BriefDescription": "All retired store uops.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_UOPS_RETIRED.ALL_STORES",
|
||||
"PublicDescription": "This event counts store uops retired to the architected path with a filter on bits 0 and 1 applied.\nNote: This event counts AVX-256bit load/store double-pump memory uops as a single uop at retirement.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"L1_Hit_Indication": "1",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD1",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired load uops with L1 cache hits as data sources.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_RETIRED.L1_HIT",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts retired load uops which data sources were hits in the nearest-level (L1) cache.\nNote: Only two data-sources of L1/FB are applicable for AVX-256bit even though the corresponding AVX load could be serviced by a deeper level in the memory hierarchy. Data source is reported for the Low-half load. This event also counts SW prefetches independent of the actual data source.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD1",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Retired load uops with L2 cache hits as data sources.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_RETIRED.L2_HIT",
|
||||
"Errata": "BDM35",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts retired load uops which data sources were hits in the mid-level (L2) cache.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD1",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Retired load uops which data sources were data hits in L3 without snoops required.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_RETIRED.L3_HIT",
|
||||
"Errata": "BDM100",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts retired load uops which data sources were data hits in the last-level (L3) cache without snoops required.",
|
||||
"SampleAfterValue": "50021",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD1",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Retired load uops misses in L1 cache as data sources.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_RETIRED.L1_MISS",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts retired load uops which data sources were misses in the nearest-level (L1) cache. Counting excludes unknown and UC data source.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD1",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Miss in mid-level (L2) cache. Excludes Unknown data-source.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_RETIRED.L2_MISS",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts retired load uops which data sources were misses in the mid-level (L2) cache. Counting excludes unknown and UC data source.",
|
||||
"SampleAfterValue": "50021",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD1",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Miss in last-level (L3) cache. Excludes Unknown data-source.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_RETIRED.L3_MISS",
|
||||
"Errata": "BDM100, BDE70",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD1",
|
||||
"UMask": "0x40",
|
||||
"BriefDescription": "Retired load uops which data sources were load uops missed L1 but hit FB due to preceding miss to the same cache line with data not ready.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_RETIRED.HIT_LFB",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts retired load uops which data sources were load uops missed L1 but hit a fill buffer due to a preceding miss to the same cache line with the data not ready.\nNote: Only two data-sources of L1/FB are applicable for AVX-256bit even though the corresponding AVX load could be serviced by a deeper level in the memory hierarchy. Data source is reported for the Low-half load.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD2",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired load uops which data sources were L3 hit and cross-core snoop missed in on-pkg core cache.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_L3_HIT_RETIRED.XSNP_MISS",
|
||||
"Errata": "BDM100",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts retired load uops which data sources were L3 Hit and a cross-core snoop missed in the on-pkg core cache.",
|
||||
"SampleAfterValue": "20011",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD2",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Retired load uops which data sources were L3 and cross-core snoop hits in on-pkg core cache.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_L3_HIT_RETIRED.XSNP_HIT",
|
||||
"Errata": "BDM100",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts retired load uops which data sources were L3 hit and a cross-core snoop hit in the on-pkg core cache.",
|
||||
"SampleAfterValue": "20011",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD2",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Retired load uops which data sources were HitM responses from shared L3.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_L3_HIT_RETIRED.XSNP_HITM",
|
||||
"Errata": "BDM100",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts retired load uops which data sources were HitM responses from a core on same socket (shared L3).",
|
||||
"SampleAfterValue": "20011",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD2",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Retired load uops which data sources were hits in L3 without snoops required.",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_L3_HIT_RETIRED.XSNP_NONE",
|
||||
"Errata": "BDM100",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts retired load uops which data sources were hits in the last-level (L3) cache without snoops required.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xD3",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Data from local DRAM either Snoop not needed or Snoop Miss (RspI)",
|
||||
"Data_LA": "1",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MEM_LOAD_UOPS_L3_MISS_RETIRED.LOCAL_DRAM",
|
||||
"Errata": "BDE70, BDM100",
|
||||
"PublicDescription": "Retired load uop whose Data Source was: local DRAM either Snoop not needed or Snoop Miss (RspI).",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF0",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Demand Data Read requests that access L2 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_TRANS.DEMAND_DATA_RD",
|
||||
"PublicDescription": "This event counts Demand Data Read requests that access L2 cache, including rejects.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF0",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "RFO requests that access L2 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_TRANS.RFO",
|
||||
"PublicDescription": "This event counts Read for Ownership (RFO) requests that access L2 cache.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF0",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "L2 cache accesses when fetching instructions",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_TRANS.CODE_RD",
|
||||
"PublicDescription": "This event counts the number of L2 cache accesses when fetching instructions.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF0",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "L2 or L3 HW prefetches that access L2 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_TRANS.ALL_PF",
|
||||
"PublicDescription": "This event counts L2 or L3 HW prefetches that access L2 cache including rejects.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF0",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "L1D writebacks that access L2 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_TRANS.L1D_WB",
|
||||
"PublicDescription": "This event counts L1D writebacks that access L2 cache.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF0",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "L2 fill requests that access L2 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_TRANS.L2_FILL",
|
||||
"PublicDescription": "This event counts L2 fill requests that access L2 cache.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF0",
|
||||
"UMask": "0x40",
|
||||
"BriefDescription": "L2 writebacks that access L2 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_TRANS.L2_WB",
|
||||
"PublicDescription": "This event counts L2 writebacks that access L2 cache.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF0",
|
||||
"UMask": "0x80",
|
||||
"BriefDescription": "Transactions accessing L2 pipe",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_TRANS.ALL_REQUESTS",
|
||||
"PublicDescription": "This event counts transactions that access the L2 pipe including snoops, pagewalks, and so on.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF1",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "L2 cache lines in I state filling L2",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_LINES_IN.I",
|
||||
"PublicDescription": "This event counts the number of L2 cache lines in the Invalidate state filling the L2. Counting does not cover rejects.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF1",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "L2 cache lines in S state filling L2",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_LINES_IN.S",
|
||||
"PublicDescription": "This event counts the number of L2 cache lines in the Shared state filling the L2. Counting does not cover rejects.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF1",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "L2 cache lines in E state filling L2",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_LINES_IN.E",
|
||||
"PublicDescription": "This event counts the number of L2 cache lines in the Exclusive state filling the L2. Counting does not cover rejects.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF1",
|
||||
"UMask": "0x7",
|
||||
"BriefDescription": "L2 cache lines filling L2",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_LINES_IN.ALL",
|
||||
"PublicDescription": "This event counts the number of L2 cache lines filling the L2. Counting does not cover rejects.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xF2",
|
||||
"UMask": "0x5",
|
||||
"BriefDescription": "Clean L2 cache lines evicted by demand.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_LINES_OUT.DEMAND_CLEAN",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xf4",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Split locks in SQ",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "SQ_MISC.SPLIT_LOCK",
|
||||
"PublicDescription": "This event counts the number of split locks in the super queue.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0x42",
|
||||
"BriefDescription": "RFO requests that hit L2 cache.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.RFO_HIT",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0x22",
|
||||
"BriefDescription": "RFO requests that miss L2 cache.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.RFO_MISS",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0x44",
|
||||
"BriefDescription": "L2 cache hits when fetching instructions, code reads.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.CODE_RD_HIT",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0x24",
|
||||
"BriefDescription": "L2 cache misses when fetching instructions.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.CODE_RD_MISS",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0x27",
|
||||
"BriefDescription": "Demand requests that miss L2 cache.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.ALL_DEMAND_MISS",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0xe7",
|
||||
"BriefDescription": "Demand requests to L2 cache.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.ALL_DEMAND_REFERENCES",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0x3f",
|
||||
"BriefDescription": "All requests that miss L2 cache.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.MISS",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x24",
|
||||
"UMask": "0xff",
|
||||
"BriefDescription": "All L2 requests.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L2_RQSTS.REFERENCES",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xB7, 0xBB",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Offcore response can be programmed only with a specific pair of event select and counter MSR, and with specific event codes and predefine mask bit value in a dedicated MSR to specify attributes of the offcore transaction.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_RESPONSE",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x60",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles with at least 6 offcore outstanding Demand Data Read transactions in uncore queue.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_DATA_RD_GE_6",
|
||||
"CounterMask": "6",
|
||||
"Errata": "BDM76",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x48",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles with L1D load Misses outstanding from any thread on physical core.",
|
||||
"Counter": "2",
|
||||
"EventName": "L1D_PEND_MISS.PENDING_CYCLES_ANY",
|
||||
"AnyThread": "1",
|
||||
"CounterMask": "1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "2"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x48",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Cycles a demand request was blocked due to Fill Buffers inavailability.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "L1D_PEND_MISS.FB_FULL",
|
||||
"CounterMask": "1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
}
|
||||
]
|
171
tools/perf/pmu-events/arch/x86/broadwellde/floating-point.json
Normal file
171
tools/perf/pmu-events/arch/x86/broadwellde/floating-point.json
Normal file
@ -0,0 +1,171 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0xC1",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Number of transitions from AVX-256 to legacy SSE when penalty applicable.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OTHER_ASSISTS.AVX_TO_SSE",
|
||||
"Errata": "BDM30",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of transitions from AVX-256 to legacy SSE when penalty is applicable.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC1",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Number of transitions from SSE to AVX-256 when penalty applicable.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "OTHER_ASSISTS.SSE_TO_AVX",
|
||||
"Errata": "BDM30",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of transitions from legacy SSE to AVX-256 when penalty is applicable.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar double precision floating-point instructions retired. Each count represents 1 computation. Applies to SSE* and AVX* scalar double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar single precision floating-point instructions retired. Each count represents 1 computation. Applies to SSE* and AVX* scalar single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Number of SSE/AVX computational 128-bit packed double precision floating-point instructions retired. Each count represents 2 computations. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Number of SSE/AVX computational 128-bit packed single precision floating-point instructions retired. Each count represents 4 computations. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Number of SSE/AVX computational 256-bit packed double precision floating-point instructions retired. Each count represents 4 computations. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCA",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Number of X87 assists due to output value.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ASSIST.X87_OUTPUT",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of x87 floating point (FP) micro-code assist (numeric overflow/underflow, inexact result) when the output value (destination register) is invalid.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCA",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Number of X87 assists due to input value.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ASSIST.X87_INPUT",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts x87 floating point (FP) micro-code assist (invalid operation, denormal operand, SNaN operand) when the input value (one of the source operands to an FP instruction) is invalid.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCA",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Number of SIMD FP assists due to Output values",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ASSIST.SIMD_OUTPUT",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts the number of SSE* floating point (FP) micro-code assist (numeric overflow/underflow) when the output value (destination register) is invalid. Counting covers only cases involving penalties that require micro-code assist intervention.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCA",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Number of SIMD FP assists due to input values",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ASSIST.SIMD_INPUT",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts any input SSE* FP assist - invalid operation, denormal operand, dividing by zero, SNaN operand. Counting includes only cases involving penalties that required micro-code assist intervention.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCA",
|
||||
"UMask": "0x1e",
|
||||
"BriefDescription": "Cycles with any input/output SSE or FP assist",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ASSIST.ANY",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "This event counts cycles with any input and output SSE or x87 FP assist. If an input and output assist are detected on the same cycle the event increments by 1.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc7",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Number of SSE/AVX computational 256-bit packed single precision floating-point instructions retired. Each count represents 8 computations. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x3",
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar floating-point instructions retired. Applies to SSE* and AVX* scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RSQRT RCP SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x3c",
|
||||
"BriefDescription": "Number of SSE/AVX computational packed floating-point instructions retired. Applies to SSE* and AVX*, packed, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RSQRT RCP SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.PACKED",
|
||||
"SampleAfterValue": "2000004",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x2a",
|
||||
"BriefDescription": "Number of SSE/AVX computational single precision floating-point instructions retired. Applies to SSE* and AVX*scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element. ?.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SINGLE",
|
||||
"SampleAfterValue": "2000005",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x15",
|
||||
"BriefDescription": "Number of SSE/AVX computational double precision floating-point instructions retired. Applies to SSE* and AVX*scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element. ?.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.DOUBLE",
|
||||
"SampleAfterValue": "2000006",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
}
|
||||
]
|
286
tools/perf/pmu-events/arch/x86/broadwellde/frontend.json
Normal file
286
tools/perf/pmu-events/arch/x86/broadwellde/frontend.json
Normal file
@ -0,0 +1,286 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Instruction Decode Queue (IDQ) empty cycles",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.EMPTY",
|
||||
"PublicDescription": "This counts the number of cycles that the instruction decoder queue is empty and can indicate that the application may be bound in the front end. It does not determine whether there are uops being delivered to the Alloc stage since uops can be delivered by bypass skipping the Instruction Decode Queue (IDQ) when it is empty.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from MITE path",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MITE_UOPS",
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.DSB_UOPS",
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Uops initiated by Decode Stream Buffer (DSB) that are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_DSB_UOPS",
|
||||
"PublicDescription": "This event counts the number of uops initiated by Decode Stream Buffer (DSB) that are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_MITE_UOPS",
|
||||
"PublicDescription": "This event counts the number of uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x30",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_UOPS",
|
||||
"PublicDescription": "This event counts the total number of uops delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may \"bypass\" the IDQ. Uops maybe initiated by Decode Stream Buffer (DSB) or MITE.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x30",
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_CYCLES",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequenser (MS) is busy. Counting includes uops that may \"bypass\" the IDQ. Uops maybe initiated by Decode Stream Buffer (DSB) or MITE.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from MITE path",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MITE_CYCLES",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from Decode Stream Buffer (DSB) path",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.DSB_CYCLES",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "This event counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Cycles when uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_DSB_CYCLES",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "This event counts cycles during which uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EdgeDetect": "1",
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Deliveries to Instruction Decode Queue (IDQ) initiated by Decode Stream Buffer (DSB) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_DSB_OCCUR",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "This event counts the number of deliveries to Instruction Decode Queue (IDQ) initiated by Decode Stream Buffer (DSB) while the Microcode Sequencer (MS) is busy. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x18",
|
||||
"BriefDescription": "Cycles Decode Stream Buffer (DSB) is delivering 4 Uops",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.ALL_DSB_CYCLES_4_UOPS",
|
||||
"CounterMask": "4",
|
||||
"PublicDescription": "This event counts the number of cycles 4 uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x18",
|
||||
"BriefDescription": "Cycles Decode Stream Buffer (DSB) is delivering any Uop",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.ALL_DSB_CYCLES_ANY_UOPS",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "This event counts the number of cycles uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may \"bypass\" the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x24",
|
||||
"BriefDescription": "Cycles MITE is delivering 4 Uops",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.ALL_MITE_CYCLES_4_UOPS",
|
||||
"CounterMask": "4",
|
||||
"PublicDescription": "This event counts the number of cycles 4 uops were delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x24",
|
||||
"BriefDescription": "Cycles MITE is delivering any Uop",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.ALL_MITE_CYCLES_ANY_UOPS",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "This event counts the number of cycles uops were delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x3c",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from MITE path",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MITE_ALL_UOPS",
|
||||
"PublicDescription": "This event counts the number of uops delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may \"bypass\" the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x80",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Number of Instruction Cache, Streaming Buffer and Victim Cache Reads. both cacheable and noncacheable, including UC fetches",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ICACHE.HIT",
|
||||
"PublicDescription": "This event counts the number of both cacheable and noncacheable Instruction Cache, Streaming Buffer and Victim Cache Reads including UC fetches.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x80",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Number of Instruction Cache, Streaming Buffer and Victim Cache Misses. Includes Uncacheable accesses.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ICACHE.MISSES",
|
||||
"PublicDescription": "This event counts the number of instruction cache, streaming buffer and victim cache misses. Counting includes UC accesses.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x80",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Cycles where a code fetch is stalled due to L1 instruction-cache miss.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ICACHE.IFDATA_STALL",
|
||||
"PublicDescription": "This event counts cycles during which the demand fetch waits for data (wfdM104H) from L2 or iSB (opportunistic hit).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Uops not delivered to Resource Allocation Table (RAT) per thread when backend of the machine is not stalled",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CORE",
|
||||
"PublicDescription": "This event counts the number of uops not delivered to Resource Allocation Table (RAT) per thread adding ?4 ? x? when Resource Allocation Table (RAT) is not stalled and Instruction Decode Queue (IDQ) delivers x uops to Resource Allocation Table (RAT) (where x belongs to {0,1,2,3}). Counting does not cover cases when:\n a. IDQ-Resource Allocation Table (RAT) pipe serves the other thread;\n b. Resource Allocation Table (RAT) is stalled for the thread (including uop drops and clear BE conditions); \n c. Instruction Decode Queue (IDQ) delivers four uops.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles per thread when 4 or more uops are not delivered to Resource Allocation Table (RAT) when backend of the machine is not stalled",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE",
|
||||
"CounterMask": "4",
|
||||
"PublicDescription": "This event counts, on the per-thread basis, cycles when no uops are delivered to Resource Allocation Table (RAT). IDQ_Uops_Not_Delivered.core =4.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles per thread when 3 or more uops are not delivered to Resource Allocation Table (RAT) when backend of the machine is not stalled",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_1_UOP_DELIV.CORE",
|
||||
"CounterMask": "3",
|
||||
"PublicDescription": "This event counts, on the per-thread basis, cycles when less than 1 uop is delivered to Resource Allocation Table (RAT). IDQ_Uops_Not_Delivered.core >=3.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles with less than 2 uops delivered by the front end.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_2_UOP_DELIV.CORE",
|
||||
"CounterMask": "2",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles with less than 3 uops delivered by the front end.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_3_UOP_DELIV.CORE",
|
||||
"CounterMask": "1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"Invert": "1",
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Counts cycles FE delivered 4 uops or Resource Allocation Table (RAT) was stalling FE.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_FE_WAS_OK",
|
||||
"CounterMask": "1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xAB",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Decode Stream Buffer (DSB)-to-MITE switch true penalty cycles.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DSB2MITE_SWITCHES.PENALTY_CYCLES",
|
||||
"PublicDescription": "This event counts Decode Stream Buffer (DSB)-to-MITE switch true penalty cycles. These cycles do not include uops routed through because of the switch itself, for example, when Instruction Decode Queue (IDQ) pre-allocation is unavailable, or Instruction Decode Queue (IDQ) is full. SBD-to-MITE switch true penalty cycles happen after the merge mux (MM) receives Decode Stream Buffer (DSB) Sync-indication until receiving the first MITE uop. \nMM is placed before Instruction Decode Queue (IDQ) to merge uops being fed from the MITE and Decode Stream Buffer (DSB) paths. Decode Stream Buffer (DSB) inserts the Sync-indication whenever a Decode Stream Buffer (DSB)-to-MITE switch occurs.\nPenalty: A Decode Stream Buffer (DSB) hit followed by a Decode Stream Buffer (DSB) miss can cost up to six cycles in which no uops are delivered to the IDQ. Most often, such switches from the Decode Stream Buffer (DSB) to the legacy pipeline cost 0?2 cycles.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EdgeDetect": "1",
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x30",
|
||||
"BriefDescription": "Number of switches from DSB (Decode Stream Buffer) or MITE (legacy decode pipeline) to the Microcode Sequencer.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_SWITCHES",
|
||||
"CounterMask": "1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
}
|
||||
]
|
433
tools/perf/pmu-events/arch/x86/broadwellde/memory.json
Normal file
433
tools/perf/pmu-events/arch/x86/broadwellde/memory.json
Normal file
@ -0,0 +1,433 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0x05",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Speculative cache line split load uops dispatched to L1 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MISALIGN_MEM_REF.LOADS",
|
||||
"PublicDescription": "This event counts speculative cache-line split load uops dispatched to the L1 cache.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x05",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Speculative cache line split STA uops dispatched to L1 cache",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MISALIGN_MEM_REF.STORES",
|
||||
"PublicDescription": "This event counts speculative cache line split store-address (STA) uops dispatched to the L1 cache.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x54",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Number of times a TSX line had a cache conflict",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_MEM.ABORT_CONFLICT",
|
||||
"PublicDescription": "Number of times a TSX line had a cache conflict.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x54",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Number of times a TSX Abort was triggered due to an evicted line caused by a transaction overflow",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_MEM.ABORT_CAPACITY_WRITE",
|
||||
"PublicDescription": "Number of times a TSX Abort was triggered due to an evicted line caused by a transaction overflow.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x54",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Number of times a TSX Abort was triggered due to a non-release/commit store to lock",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_MEM.ABORT_HLE_STORE_TO_ELIDED_LOCK",
|
||||
"PublicDescription": "Number of times a TSX Abort was triggered due to a non-release/commit store to lock.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x54",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Number of times a TSX Abort was triggered due to commit but Lock Buffer not empty",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_MEM.ABORT_HLE_ELISION_BUFFER_NOT_EMPTY",
|
||||
"PublicDescription": "Number of times a TSX Abort was triggered due to commit but Lock Buffer not empty.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x54",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Number of times a TSX Abort was triggered due to release/commit but data and address mismatch",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_MEM.ABORT_HLE_ELISION_BUFFER_MISMATCH",
|
||||
"PublicDescription": "Number of times a TSX Abort was triggered due to release/commit but data and address mismatch.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x54",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Number of times a TSX Abort was triggered due to attempting an unsupported alignment from Lock Buffer",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_MEM.ABORT_HLE_ELISION_BUFFER_UNSUPPORTED_ALIGNMENT",
|
||||
"PublicDescription": "Number of times a TSX Abort was triggered due to attempting an unsupported alignment from Lock Buffer.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x54",
|
||||
"UMask": "0x40",
|
||||
"BriefDescription": "Number of times we could not allocate Lock Buffer",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_MEM.HLE_ELISION_BUFFER_FULL",
|
||||
"PublicDescription": "Number of times we could not allocate Lock Buffer.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5d",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Counts the number of times a class of instructions that may cause a transactional abort was executed. Since this is the count of execution, it may not always cause a transactional abort.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_EXEC.MISC1",
|
||||
"PublicDescription": "Unfriendly TSX abort triggered by a flowmarker.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5d",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Counts the number of times a class of instructions (e.g., vzeroupper) that may cause a transactional abort was executed inside a transactional region",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_EXEC.MISC2",
|
||||
"PublicDescription": "Unfriendly TSX abort triggered by a vzeroupper instruction.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5d",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Counts the number of times an instruction execution caused the transactional nest count supported to be exceeded",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_EXEC.MISC3",
|
||||
"PublicDescription": "Unfriendly TSX abort triggered by a nest count that is too deep.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5d",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Counts the number of times a XBEGIN instruction was executed inside an HLE transactional region.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_EXEC.MISC4",
|
||||
"PublicDescription": "RTM region detected inside HLE.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5d",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Counts the number of times an HLE XACQUIRE instruction was executed inside an RTM transactional region.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "TX_EXEC.MISC5",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC3",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Counts the number of machine clears due to memory order conflicts.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "MACHINE_CLEARS.MEMORY_ORDERING",
|
||||
"PublicDescription": "This event counts the number of memory ordering Machine Clears detected. Memory Ordering Machine Clears can result from one of the following:\n1. memory disambiguation,\n2. external snoop, or\n3. cross SMT-HW-thread snoop (stores) hitting load buffer.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc8",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Number of times we entered an HLE region; does not count nested transactions",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "HLE_RETIRED.START",
|
||||
"PublicDescription": "Number of times we entered an HLE region\n does not count nested transactions.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc8",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Number of times HLE commit succeeded",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "HLE_RETIRED.COMMIT",
|
||||
"PublicDescription": "Number of times HLE commit succeeded.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc8",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Number of times HLE abort was triggered",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "HLE_RETIRED.ABORTED",
|
||||
"PublicDescription": "Number of times HLE abort was triggered.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc8",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Number of times an HLE execution aborted due to various memory events (e.g., read/write capacity and conflicts).",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "HLE_RETIRED.ABORTED_MISC1",
|
||||
"PublicDescription": "Number of times an HLE abort was attributed to a Memory condition (See TSX_Memory event for additional details).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc8",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Number of times an HLE execution aborted due to uncommon conditions",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "HLE_RETIRED.ABORTED_MISC2",
|
||||
"PublicDescription": "Number of times the TSX watchdog signaled an HLE abort.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc8",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Number of times an HLE execution aborted due to HLE-unfriendly instructions",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "HLE_RETIRED.ABORTED_MISC3",
|
||||
"PublicDescription": "Number of times a disallowed operation caused an HLE abort.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc8",
|
||||
"UMask": "0x40",
|
||||
"BriefDescription": "Number of times an HLE execution aborted due to incompatible memory type",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "HLE_RETIRED.ABORTED_MISC4",
|
||||
"PublicDescription": "Number of times HLE caused a fault.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc8",
|
||||
"UMask": "0x80",
|
||||
"BriefDescription": "Number of times an HLE execution aborted due to none of the previous 4 categories (e.g. interrupts)",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "HLE_RETIRED.ABORTED_MISC5",
|
||||
"PublicDescription": "Number of times HLE aborted and was not due to the abort conditions in subevents 3-6.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc9",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Number of times we entered an RTM region; does not count nested transactions",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "RTM_RETIRED.START",
|
||||
"PublicDescription": "Number of times we entered an RTM region\n does not count nested transactions.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc9",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Number of times RTM commit succeeded",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "RTM_RETIRED.COMMIT",
|
||||
"PublicDescription": "Number of times RTM commit succeeded.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc9",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Number of times RTM abort was triggered",
|
||||
"PEBS": "1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "RTM_RETIRED.ABORTED",
|
||||
"PublicDescription": "Number of times RTM abort was triggered .",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc9",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Number of times an RTM execution aborted due to various memory events (e.g. read/write capacity and conflicts)",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "RTM_RETIRED.ABORTED_MISC1",
|
||||
"PublicDescription": "Number of times an RTM abort was attributed to a Memory condition (See TSX_Memory event for additional details).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc9",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Number of times an RTM execution aborted due to various memory events (e.g., read/write capacity and conflicts).",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "RTM_RETIRED.ABORTED_MISC2",
|
||||
"PublicDescription": "Number of times the TSX watchdog signaled an RTM abort.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc9",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Number of times an RTM execution aborted due to HLE-unfriendly instructions",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "RTM_RETIRED.ABORTED_MISC3",
|
||||
"PublicDescription": "Number of times a disallowed operation caused an RTM abort.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc9",
|
||||
"UMask": "0x40",
|
||||
"BriefDescription": "Number of times an RTM execution aborted due to incompatible memory type",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "RTM_RETIRED.ABORTED_MISC4",
|
||||
"PublicDescription": "Number of times a RTM caused a fault.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xc9",
|
||||
"UMask": "0x80",
|
||||
"BriefDescription": "Number of times an RTM execution aborted due to none of the previous 4 categories (e.g. interrupt)",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "RTM_RETIRED.ABORTED_MISC5",
|
||||
"PublicDescription": "Number of times RTM aborted and was not due to the abort conditions in subevents 3-6.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCD",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Loads with latency value being above 4",
|
||||
"PEBS": "2",
|
||||
"MSRValue": "0x4",
|
||||
"Counter": "3",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_4",
|
||||
"MSRIndex": "0x3F6",
|
||||
"Errata": "BDM100, BDM35",
|
||||
"PublicDescription": "This event counts loads with latency value being above four.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCD",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Loads with latency value being above 8",
|
||||
"PEBS": "2",
|
||||
"MSRValue": "0x8",
|
||||
"Counter": "3",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_8",
|
||||
"MSRIndex": "0x3F6",
|
||||
"Errata": "BDM100, BDM35",
|
||||
"PublicDescription": "This event counts loads with latency value being above eight.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "50021",
|
||||
"CounterHTOff": "3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCD",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Loads with latency value being above 16",
|
||||
"PEBS": "2",
|
||||
"MSRValue": "0x10",
|
||||
"Counter": "3",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_16",
|
||||
"MSRIndex": "0x3F6",
|
||||
"Errata": "BDM100, BDM35",
|
||||
"PublicDescription": "This event counts loads with latency value being above 16.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "20011",
|
||||
"CounterHTOff": "3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCD",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Loads with latency value being above 32",
|
||||
"PEBS": "2",
|
||||
"MSRValue": "0x20",
|
||||
"Counter": "3",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_32",
|
||||
"MSRIndex": "0x3F6",
|
||||
"Errata": "BDM100, BDM35",
|
||||
"PublicDescription": "This event counts loads with latency value being above 32.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCD",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Loads with latency value being above 64",
|
||||
"PEBS": "2",
|
||||
"MSRValue": "0x40",
|
||||
"Counter": "3",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_64",
|
||||
"MSRIndex": "0x3F6",
|
||||
"Errata": "BDM100, BDM35",
|
||||
"PublicDescription": "This event counts loads with latency value being above 64.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "2003",
|
||||
"CounterHTOff": "3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCD",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Loads with latency value being above 128",
|
||||
"PEBS": "2",
|
||||
"MSRValue": "0x80",
|
||||
"Counter": "3",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_128",
|
||||
"MSRIndex": "0x3F6",
|
||||
"Errata": "BDM100, BDM35",
|
||||
"PublicDescription": "This event counts loads with latency value being above 128.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "1009",
|
||||
"CounterHTOff": "3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCD",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Loads with latency value being above 256",
|
||||
"PEBS": "2",
|
||||
"MSRValue": "0x100",
|
||||
"Counter": "3",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_256",
|
||||
"MSRIndex": "0x3F6",
|
||||
"Errata": "BDM100, BDM35",
|
||||
"PublicDescription": "This event counts loads with latency value being above 256.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "503",
|
||||
"CounterHTOff": "3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCD",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Loads with latency value being above 512",
|
||||
"PEBS": "2",
|
||||
"MSRValue": "0x200",
|
||||
"Counter": "3",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_512",
|
||||
"MSRIndex": "0x3F6",
|
||||
"Errata": "BDM100, BDM35",
|
||||
"PublicDescription": "This event counts loads with latency value being above 512.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "101",
|
||||
"CounterHTOff": "3"
|
||||
}
|
||||
]
|
44
tools/perf/pmu-events/arch/x86/broadwellde/other.json
Normal file
44
tools/perf/pmu-events/arch/x86/broadwellde/other.json
Normal file
@ -0,0 +1,44 @@
|
||||
[
|
||||
{
|
||||
"EventCode": "0x5C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Unhalted core cycles when the thread is in ring 0",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CPL_CYCLES.RING0",
|
||||
"PublicDescription": "This event counts the unhalted core cycles during which the thread is in the ring 0 privileged mode.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x5C",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Unhalted core cycles when thread is in rings 1, 2, or 3",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CPL_CYCLES.RING123",
|
||||
"PublicDescription": "This event counts unhalted core cycles during which the thread is in rings 1, 2, or 3.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EdgeDetect": "1",
|
||||
"EventCode": "0x5C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Number of intervals between processor halts while thread is in ring 0",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CPL_CYCLES.RING0_TRANS",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "This event counts when there is a transition from ring 1,2 or 3 to ring0.",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x63",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles when L1 and L2 are locked due to UC or split lock",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "LOCK_CYCLES.SPLIT_LOCK_UC_LOCK_DURATION",
|
||||
"PublicDescription": "This event counts cycles in which the L1 and L2 are locked due to a UC lock or split lock. A lock is asserted in case of locked memory access, due to noncacheable memory, locked operation that spans two cache lines, or a page walk from the noncacheable page table. L1D and L2 locks have a very high performance penalty and it is highly recommended to avoid such access.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
}
|
||||
]
|
1417
tools/perf/pmu-events/arch/x86/broadwellde/pipeline.json
Normal file
1417
tools/perf/pmu-events/arch/x86/broadwellde/pipeline.json
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user