diff options
Diffstat (limited to 'gprofng/src')
-rw-r--r-- | gprofng/src/DbeSession.cc | 2 | ||||
-rw-r--r-- | gprofng/src/Disasm.cc | 2 | ||||
-rw-r--r-- | gprofng/src/Experiment.cc | 2 | ||||
-rw-r--r-- | gprofng/src/checks.cc | 4 | ||||
-rw-r--r-- | gprofng/src/collctrl.cc | 105 | ||||
-rw-r--r-- | gprofng/src/collctrl.h | 10 | ||||
-rw-r--r-- | gprofng/src/dbe_types.h | 3 | ||||
-rw-r--r-- | gprofng/src/envsets.cc | 2 | ||||
-rw-r--r-- | gprofng/src/gp-collect-app.cc | 83 | ||||
-rw-r--r-- | gprofng/src/hwc_arm64_amcc.h | 182 | ||||
-rw-r--r-- | gprofng/src/hwc_intel_icelake.h | 1171 |
11 files changed, 1425 insertions, 141 deletions
diff --git a/gprofng/src/DbeSession.cc b/gprofng/src/DbeSession.cc index 2032909..a6808d8 100644 --- a/gprofng/src/DbeSession.cc +++ b/gprofng/src/DbeSession.cc @@ -94,6 +94,8 @@ Platform_t DbeSession::platform = Sparc; #elif ARCH(Aarch64) Aarch64; +#elif ARCH(RISCV) + RISCV; #else // ARCH(Intel) Intel; #endif diff --git a/gprofng/src/Disasm.cc b/gprofng/src/Disasm.cc index 1396e4f..e41bf67 100644 --- a/gprofng/src/Disasm.cc +++ b/gprofng/src/Disasm.cc @@ -208,6 +208,7 @@ Disasm::disasm_open () case Amd64: need_swap_endian = (DbeSession::platform == Sparc); break; + case RISCV: case Sparcv8plus: case Sparcv9: case Sparc: @@ -246,6 +247,7 @@ Disasm::disasm_open () dis_info.arch = bfd_arch_i386; dis_info.mach = bfd_mach_x86_64; break; + case RISCV: case Sparcv8plus: case Sparcv9: case Sparc: diff --git a/gprofng/src/Experiment.cc b/gprofng/src/Experiment.cc index 02a24eb..a1f78fc 100644 --- a/gprofng/src/Experiment.cc +++ b/gprofng/src/Experiment.cc @@ -542,6 +542,8 @@ Experiment::ExperimentHandler::startElement (char*, char*, char *qName, Attribut exp->platform = Intel; else if (strcmp (str, "aarch64") == 0) exp->platform = Aarch64; + else if (strcmp (str, "riscv64") == 0) + exp->platform = RISCV; else exp->platform = Sparc; exp->need_swap_endian = (DbeSession::platform == Sparc) ? diff --git a/gprofng/src/checks.cc b/gprofng/src/checks.cc index 8392bbe..4fe850d 100644 --- a/gprofng/src/checks.cc +++ b/gprofng/src/checks.cc @@ -332,6 +332,10 @@ collect::check_executable_arch (Elf *elf) case EM_AARCH64: is_64 = true; break; +#elif ARCH(RISCV) + case EM_RISCV: + is_64 = true; + break; #endif default: return EXEC_ELF_ARCH; diff --git a/gprofng/src/collctrl.cc b/gprofng/src/collctrl.cc index 7c0219b..95324fb 100644 --- a/gprofng/src/collctrl.cc +++ b/gprofng/src/collctrl.cc @@ -77,7 +77,7 @@ read_int (char *from) { char *val = strchr (from, ':'); if (val) - return atoi (val + 1); + return (int) strtol (val + 1, NULL, 0); return 0; } @@ -91,6 +91,9 @@ read_cpuinfo () #if defined(__aarch64__) asm volatile("mrs %0, cntfrq_el0" : "=r" (cpu_info.cpu_clk_freq)); +#elif defined(__riscv) + // Set 1000 MHz for minimal support RISC-V, will fix with a better method to get cpu clock frequency. + cpu_info.cpu_clk_freq = 1000; #endif // Read /proc/cpuinfo to get CPU info and clock rate @@ -106,7 +109,8 @@ read_cpuinfo () cpu_info.cpu_clk_freq = read_int (temp + 9); else if (strncmp (temp, "cpu family", 10) == 0) cpu_info.cpu_family = read_int (temp + 10); - else if (strncmp (temp, "vendor_id", 9) == 0) + else if (strncmp (temp, "vendor_id", 9) == 0 + || strncmp (temp, "mvendorid", 9) == 0) { if (cpu_info.cpu_vendorstr == NULL) read_str (temp + 9, &cpu_info.cpu_vendorstr); @@ -126,7 +130,11 @@ read_cpuinfo () fclose (procf); } if (cpu_info.cpu_vendorstr == NULL) +#if defined(__aarch64__) + cpu_info.cpu_vendorstr = strdup (AARCH64_VENDORSTR_ARM); +#else cpu_info.cpu_vendorstr = GTXT ("Unknown processor"); +#endif if (cpu_info.cpu_modelstr == NULL) cpu_info.cpu_modelstr = GTXT ("Unknown cpu model"); return &cpu_info; @@ -224,8 +232,7 @@ Coll_Ctrl::Coll_Ctrl (int _interactive, bool _defHWC, bool _kernelHWC) synctrace_enabled = 0; synctrace_thresh = -1; synctrace_scope = 0; - heaptrace_enabled = 0; - heaptrace_checkenabled = 0; + heaptrace_mode = NULL; iotrace_enabled = 0; count_enabled = 0; Iflag = 0; @@ -297,8 +304,7 @@ Coll_Ctrl::Coll_Ctrl (Coll_Ctrl * cc) synctrace_enabled = cc->synctrace_enabled; synctrace_thresh = cc->synctrace_thresh; synctrace_scope = cc->synctrace_scope; - heaptrace_enabled = cc->heaptrace_enabled; - heaptrace_checkenabled = cc->heaptrace_checkenabled; + heaptrace_mode = dbe_strdup(cc->heaptrace_mode); iotrace_enabled = cc->iotrace_enabled; count_enabled = cc->count_enabled; Iflag = cc->Iflag; @@ -362,6 +368,7 @@ Coll_Ctrl::~Coll_Ctrl () free (hwc_string); free (project_home); free (java_path); + free (heaptrace_mode); hwcprof_enabled_cnt = 0; } @@ -449,7 +456,7 @@ Coll_Ctrl::check_consistency () if (count_enabled != 0 && ((clkprof_default != 1 && clkprof_enabled != 0) || hwcprof_enabled_cnt != 0 || synctrace_enabled != 0 - || heaptrace_enabled != 0 || iotrace_enabled != 0)) + || heaptrace_mode != NULL || iotrace_enabled != 0)) return strdup (GTXT ("Count data cannot be collected along with any other data.\n")); /* if count data, various other options are not allowed */ @@ -475,12 +482,12 @@ Coll_Ctrl::check_expt (char **warn) if (ret != NULL) /* something is wrong, return the error */ return ret; /* check for heaptrace and java -- warn that it covers native allocations only */ - if (heaptrace_enabled == 1 && java_mode == 1 && java_default == 0) + if (heaptrace_mode != NULL && java_mode == 1 && java_default == 0) *warn = strdup (GTXT ("Note: Heap profiling will only trace native allocations, not Java allocations.\n")); /* if no profiling data selected, warn the user */ if (clkprof_enabled == 0 && hwcprof_enabled_cnt == 0 && synctrace_enabled == 0 - && heaptrace_enabled == 0 && iotrace_enabled == 0 && count_enabled == 0) + && heaptrace_mode == NULL && iotrace_enabled == 0 && count_enabled == 0) *warn = strdup (GTXT ("Warning: No function level data requested; only statistics will be collected.\n\n")); build_data_desc (); @@ -561,15 +568,8 @@ Coll_Ctrl::show (int i) sb.appendf ("\t %u. %s\n", ii + 1, hwc_hwcentry_specd_string (ctrbuf, sizeof (ctrbuf), &hwctr[ii])); } - if (heaptrace_enabled != 0) - { - if (heaptrace_checkenabled == 0) - sb.append (GTXT ("\theap tracing enabled, no checking\n")); - else if (heaptrace_checkenabled == 1) - sb.append (GTXT ("\theap tracing enabled, over/underrun checking\n")); - else - sb.append (GTXT ("\theap tracing enabled, over/underrun checking and pattern storing\n")); - } + if (heaptrace_mode != NULL) + sb.append (GTXT ("\theap tracing enabled\n")); if (iotrace_enabled != 0) sb.append (GTXT ("\tI/O tracing enabled\n")); switch (count_enabled) @@ -709,10 +709,10 @@ Coll_Ctrl::get_collect_args () } *p++ = sb.toString (); } - if (heaptrace_enabled != 0) + if (heaptrace_mode != NULL) { *p++ = strdup ("-H"); - *p++ = strdup ("on"); + *p++ = strdup (heaptrace_mode); } if (iotrace_enabled != 0) { @@ -1045,39 +1045,40 @@ Coll_Ctrl::set_heaptrace (const char *string) { if (opened == 1) return strdup (GTXT ("Experiment is active; command ignored.\n")); + free(heaptrace_mode); + heaptrace_mode = NULL; // Same as "off" + if (string != NULL && strcmp (string, "off") == 0) + return NULL; + if (string == NULL || strlen (string) == 0 || strcmp (string, "on") == 0) + heaptrace_mode = strdup ("on"); + else if (isdigit (*string)) { - heaptrace_enabled = 1; - char *ret = check_consistency (); - if (ret != NULL) + char *s; + unsigned long long n = strtoull (string, &s, 0); + if (*s == '-' && isdigit (s[1])) { - heaptrace_enabled = 0; - return ret; + unsigned long long n1 = strtoull (s + 1, &s, 0); + if (n1 < n) + return dbe_sprintf ( + GTXT ("Incorrect range in heap trace parameter '%s'\n"), string); } - return NULL; - } - if (strcmp (string, "off") == 0) - { - heaptrace_enabled = 0; - return NULL; - } -#if 0 - if (strcmp (string, "check") == 0) - { - /* set to check for over/underruns */ - heaptrace_checkenabled = 1; - heaptrace_enabled = 1; - return NULL; + if (*s != 0) + return dbe_sprintf ( + GTXT ("Incorrect range in heap trace parameter '%s'\n"), string); + heaptrace_mode = strdup (string); } - if (strcmp (string, "clear") == 0) + else + return dbe_sprintf (GTXT ("Unrecognized heap tracing parameter `%s'\n"), + string); + char *ret = check_consistency (); + if (ret != NULL) { - /* set to check for over/underruns, and store patterns */ - heaptrace_checkenabled = 2; - heaptrace_enabled = 1; - return NULL; + free (heaptrace_mode); + heaptrace_mode = NULL; + return ret; } -#endif - return dbe_sprintf (GTXT ("Unrecognized heap tracing parameter `%s'\n"), string); + return NULL; } char * @@ -1672,8 +1673,8 @@ Coll_Ctrl::build_data_desc () sb.appendf ("p:%d;", clkprof_timer); if (synctrace_enabled == 1) sb.appendf ("s:%d,%d;", synctrace_thresh, synctrace_scope); - if (heaptrace_enabled == 1) - sb.appendf ("H:%d;", heaptrace_checkenabled); + if (heaptrace_mode != NULL && strcmp (heaptrace_mode, "off") != 0) + sb.appendf ("H:%s;", heaptrace_mode); if (iotrace_enabled == 1) sb.append ("i:;"); if (hwcprof_enabled_cnt > 0) @@ -1688,8 +1689,9 @@ Coll_Ctrl::build_data_desc () min_time = h->min_time_default; if (ii > 0) sb.append (','); - sb.appendf ("%d:%d:%lld:%s:%s:%lld:%d:m%lld:%d:%d:0x%x", + sb.appendf ("%d:%d:%lld:%lld:%s:%s:%lld:%d:m%lld:%d:%d:0x%x", h->use_perf_event_type, h->type, (long long) h->config, + (long long) h->config1, strcmp (h->name, h->int_name) ? h->name : "", h->int_name, (long long) h->reg_num, h->val, (long long) min_time, ii, /*tag*/ h->timecvt, h->memop); @@ -2830,7 +2832,7 @@ Coll_Ctrl::get (char * control) } if (!strncmp (control, ipc_str_heaptrace, len)) { - if ((heaptrace_enabled == 0)) + if (heaptrace_mode == NULL) return strdup (ipc_str_off); return strdup (ipc_str_on); } @@ -3015,7 +3017,8 @@ Coll_Ctrl::unset (char * control) } if (!strncmp (control, ipc_str_heaptrace, len)) { - heaptrace_enabled = 0; + free (heaptrace_mode); + heaptrace_mode = NULL; return NULL; } if (!strncmp (control, ipc_str_iotrace, len)) diff --git a/gprofng/src/collctrl.h b/gprofng/src/collctrl.h index a416474..788df7a 100644 --- a/gprofng/src/collctrl.h +++ b/gprofng/src/collctrl.h @@ -101,8 +101,7 @@ public: /* set the parameters for heap tracing */ char *set_heaptrace(const char *); - int get_heaptrace_mode() { return heaptrace_enabled; }; - int get_heaptrace_checkmode() { return heaptrace_checkenabled; }; + char *get_heaptrace_mode() { return heaptrace_mode; }; /* set the parameters for I/O tracing */ char *set_iotrace(const char *); @@ -342,12 +341,7 @@ private: /* definitions in data_pckts.h */ int synctrace_scope; - int heaptrace_enabled; /* T if heap tracing */ - /* if 0 no checking; - * if 1, check for over- and under-write - * if 2, also set patterns in malloc'd and free'd areas - */ - int heaptrace_checkenabled; + char *heaptrace_mode; /* NULL, or on, or off, or range */ int iotrace_enabled; /* T if I/O tracing */ /* count controls */ diff --git a/gprofng/src/dbe_types.h b/gprofng/src/dbe_types.h index dd97adc..430922a 100644 --- a/gprofng/src/dbe_types.h +++ b/gprofng/src/dbe_types.h @@ -42,7 +42,8 @@ enum Platform_t Sparcv8plus, Java, Amd64, - Aarch64 + Aarch64, + RISCV }; enum WSize_t diff --git a/gprofng/src/envsets.cc b/gprofng/src/envsets.cc index 9cef745..70510fb 100644 --- a/gprofng/src/envsets.cc +++ b/gprofng/src/envsets.cc @@ -107,7 +107,7 @@ collect::putenv_libcollector_ld_preloads () // for those data types that get extra libs LD_PRELOAD'd, add them if (cc->get_synctrace_mode () != 0) add_ld_preload ("libgp-sync.so"); - if (cc->get_heaptrace_mode () != 0) + if (cc->get_heaptrace_mode () != NULL) add_ld_preload ("libgp-heap.so"); if (cc->get_iotrace_mode () != 0) add_ld_preload ("libgp-iotrace.so"); diff --git a/gprofng/src/gp-collect-app.cc b/gprofng/src/gp-collect-app.cc index 5a3653f..c80c1b0 100644 --- a/gprofng/src/gp-collect-app.cc +++ b/gprofng/src/gp-collect-app.cc @@ -1403,7 +1403,7 @@ collect::usage () end of this long list. */ printf ( GTXT ( - "Usage: gprofng collect app [OPTION(S)] TARGET [TARGET_ARGUMENTS]\n")), + "Usage: gprofng collect app [OPTION(S)] TARGET [TARGET_ARGUMENTS]\n")); /* ------------------------------------------------------------------------------- @@ -1481,7 +1481,8 @@ collect::usage () " \"n\" selects native/Pthreads, \"j\" selects Java, and \"nj\" selects both;\n" " the default is \"-s off\".\n" "\n" - " -H {off|on} disable (off), or enable (on) heap tracing; the default is \"-H off\".\n" + " -H {off|on|N1[-N2]} disable (off), or enable (on) heap tracing, or\n" + " specify the heap data collection range. The default is \"-H off\".\n" "\n" " -i {off|on} disable (off), or enable (on) I/O tracing; the default is \"-i off\".\n" "\n" @@ -1494,84 +1495,6 @@ collect::usage () "See also:\n" "\n" "gprofng(1), gp-archive(1), gp-display-html(1), gp-display-src(1), gp-display-text(1)\n")); -/* - char *s = dbe_sprintf (GTXT ("Usage: %s <args> target <target-args>\n"), - whoami); - writeStr (usage_fd, s); - free (s); - writeStr (usage_fd, GTXT (" -p {lo|on|hi|off|<value>}\tspecify clock-profiling\n")); - writeStr (usage_fd, GTXT ("\t`lo' per-thread rate of ~10 samples/second\n")); - writeStr (usage_fd, GTXT ("\t`on' per-thread rate of ~100 samples/second (default)\n")); - writeStr (usage_fd, GTXT ("\t`hi' per-thread rate of ~1000 samples/second\n")); - writeStr (usage_fd, GTXT ("\t`off' disable clock profiling\n")); - writeStr (usage_fd, GTXT ("\t<value> specify profile timer period in millisec.\n")); - s = dbe_sprintf (GTXT ("\t\t\tRange on this system is from %.3f to %.3f millisec.\n\t\t\tResolution is %.3f millisec.\n"), - (double) cc->get_clk_min () / 1000., - (double) cc->get_clk_max () / 1000., - (double) cc->get_clk_res () / 1000.); - writeStr (usage_fd, s); - free (s); - writeStr (usage_fd, GTXT (" -h <ctr_def>...[,<ctr_n_def>]\tspecify HW counter profiling\n")); - s = dbe_sprintf (GTXT ("\tto see the supported HW counters on this machine, run \"%s -h\" with no other arguments\n"), - whoami); - writeStr (usage_fd, s); - free (s); - writeStr (usage_fd, GTXT (" -s <threshold>[,<scope>]\tspecify synchronization wait tracing\n")); - writeStr (usage_fd, GTXT ("\t<scope> is \"j\" for tracing Java-APIs, \"n\" for tracing native-APIs, or \"nj\" for tracing both\n")); - writeStr (usage_fd, GTXT (" -H {on|off}\tspecify heap tracing\n")); - writeStr (usage_fd, GTXT (" -i {on|off}\tspecify I/O tracing\n")); - writeStr (usage_fd, GTXT (" -N <lib>\tspecify library to exclude count from instrumentation (requires -c also)\n")); - writeStr (usage_fd, GTXT (" \tmultiple -N arguments can be provided\n")); - writeStr (usage_fd, GTXT (" -j {on|off|path}\tspecify Java profiling\n")); - writeStr (usage_fd, GTXT (" -J <java-args>\tspecify arguments to Java for Java profiling\n")); - writeStr (usage_fd, GTXT (" -t <duration>\tspecify time over which to record data\n")); - writeStr (usage_fd, GTXT (" -n\tdry run -- don't run target or collect performance data\n")); - writeStr (usage_fd, GTXT (" -y <signal>[,r]\tspecify delayed initialization and pause/resume signal\n")); - writeStr (usage_fd, GTXT ("\tWhen set, the target starts in paused mode;\n\t if the optional r is provided, it starts in resumed mode\n")); - writeStr (usage_fd, GTXT (" -F {on|off|=<regex>}\tspecify following descendant processes\n")); - writeStr (usage_fd, GTXT (" -a {on|ldobjects|src|usedldobjects|usedsrc|off}\tspecify archiving of binaries and other files;\n")); - writeStr (usage_fd, GTXT (" -S {on|off|<seconds>}\t Set the interval for periodic sampling of process-wide resource utilization\n")); - writeStr (usage_fd, GTXT (" -l <signal>\tspecify signal that will trigger a sample of process-wide resource utilization\n")); - writeStr (usage_fd, GTXT (" -o <expt>\tspecify experiment name\n")); - writeStr (usage_fd, GTXT (" --verbose\tprint expanded log of processing\n")); - writeStr (usage_fd, GTXT (" -C <label>\tspecify comment label (up to 10 may appear)\n")); - writeStr (usage_fd, GTXT (" -V|--version\tprint version number and exit\n")); -*/ - /* don't document this feature */ - // writeStr (usage_fd, GTXT(" -Z\tPreload mem.so, and launch target [no experiment]\n") ); -/* - writeStr (usage_fd, GTXT ("\n See the gp-collect(1) man page for more information\n")); -*/ - -#if 0 - /* print an extended usage message */ - /* find a Java for Java profiling, set Java on to check Java */ - find_java (); - cc->set_java_mode (NTXT ("on")); - - /* check for variable-clock rate */ - unsigned char mode = COL_CPUFREQ_NONE; - get_cpu_frequency (&mode); - if (mode != COL_CPUFREQ_NONE) - writeStr (usage_fd, GTXT ("NOTE: system has variable clock frequency, which may cause variable program run times.\n")); - - /* show the experiment that would be run */ - writeStr (usage_fd, GTXT ("\n Default experiment:\n")); - char *ccret = cc->setup_experiment (); - if (ccret != NULL) - { - writeStr (usage_fd, ccret); - free (ccret); - exit (1); - } - cc->delete_expt (); - ccret = cc->show (1); - if (ccret != NULL) - { - writeStr (usage_fd, ccret); - free (ccret); - } -#endif } void diff --git a/gprofng/src/hwc_arm64_amcc.h b/gprofng/src/hwc_arm64_amcc.h new file mode 100644 index 0000000..5d86c6b --- /dev/null +++ b/gprofng/src/hwc_arm64_amcc.h @@ -0,0 +1,182 @@ +/* Copyright (C) 2024 Free Software Foundation, Inc. + Contributed by Oracle. + + This file is part of GNU Binutils. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _HWC_ARM64_AMCC_H +#define _HWC_ARM64_AMCC_H + +#define I(nm, event, mtr) INIT_HWC(nm, mtr, (event), PERF_TYPE_RAW) + +static Hwcentry arm64_amcc_list[] = { + HWC_GENERIC +/* branch: */ + { I("br_immed_spec", 0x78, + STXT("Branch speculatively executed, immediate branch")) }, + { I("br_indirect_spec", 0x7a, + STXT("Branch speculatively executed, indirect branch")) }, + { I("br_mis_pred", 0x10, STXT("Branch mispredicted")) }, + { I("br_pred", 0x12, STXT("Predictable branch")) }, + { I("br_return_spec", 0x79, + STXT("Branch speculatively executed, procedure return")) }, +/* bus: */ + { I("bus_access", 0x19, STXT("Attributable Bus access")) }, + { I("bus_access_normal", 0x64, STXT("Bus access, Normal")) }, + { I("bus_access_not_shared", 0x63, + STXT("Bus access, not Normal, Cacheable, Shareable")) }, + { I("bus_access_periph", 0x65, STXT("Bus access, peripheral")) }, + { I("bus_access_shared", 0x62, + STXT("Bus access, Normal, Cacheable, Shareable")) }, +/* cache: */ + { I("btb_mis_pred", 0x102, STXT("BTB misprediction")) }, + { I("dtb_miss", 0x104, STXT("DTB miss")) }, + { I("itb_miss", 0x103, STXT("ITB miss")) }, + { I("l1_stage2_tlb_refill", 0x111, STXT("L1 stage 2 TLB refill")) }, + { I("l1d_cache", 0x4, STXT("Level 1 data cache access")) }, + { I("l1d_cache_inval", 0x48, STXT("L1D cache invalidate")) }, + { I("l1d_cache_late_miss", 0x105, STXT("L1D cache late miss")) }, + { I("l1d_cache_prefetch", 0x106, STXT("L1D cache prefetch")) }, + { I("l1d_cache_refill", 0x3, STXT("Level 1 data cache refill")) }, + { I("l1d_tlb", 0x25, STXT("L1D TLB access")) }, + { I("l1d_tlb_refill", 0x5, STXT("Attributable Level 1 data TLB refill")) }, + { I("l1i_cache", 0x14, + STXT("Attributable Level 1 instruction cache access")) }, + { I("l1i_cache_refill", 0x1, STXT("Level 1 instruction cache refill")) }, + { I("l1i_tlb", 0x26, STXT("Attributable Level 1 instruction TLB access")) }, + { I("l1i_tlb_refill", 0x2, + STXT("Attributable Level 1 instruction TLB refill")) }, + { I("l2d_cache", 0x16, STXT("Level 2 data cache access")) }, + { I("l2d_cache_inval", 0x58, STXT("L2D cache invalidate")) }, + { I("l2d_cache_prefetch", 0x107, STXT("L2D cache prefetch")) }, + { I("l2d_cache_rd", 0x50, STXT("L2D cache access, read")) }, + { I("l2d_cache_refill", 0x17, STXT("Level 2 data refill")) }, + { I("l2d_cache_refill_rd", 0x52, STXT("L2D cache refill, read")) }, + { I("l2d_cache_refill_wr", 0x53, STXT("L2D cache refill, write")) }, + { I("l2d_cache_wb", 0x18, + STXT("Attributable Level 2 data cache write-back")) }, + { I("l2d_cache_wb_clean", 0x57, + STXT("L2D cache Write-Back, cleaning and coherency")) }, + { I("l2d_cache_wb_victim", 0x56, STXT("L2D cache Write-Back, victim")) }, + { I("l2d_cache_wr", 0x51, STXT("L2D cache access, write")) }, + { I("l2d_tlb_access", 0x34, STXT("L2D TLB access")) }, + { I("l2i_tlb_access", 0x35, STXT("L2I TLB access")) }, + { I("page_walk_l0_stage1_hit", 0x112, STXT("Page walk, L0 stage-1 hit")) }, + { I("page_walk_l1_stage1_hit", 0x113, STXT("Page walk, L1 stage-1 hit")) }, + { I("page_walk_l1_stage2_hit", 0x115, STXT("Page walk, L1 stage-2 hit")) }, + { I("page_walk_l2_stage1_hit", 0x114, STXT("Page walk, L2 stage-1 hit")) }, + { I("page_walk_l2_stage2_hit", 0x116, STXT("Page walk, L2 stage-2 hit")) }, +/* clock: */ + { I("cpu_cycles", 0x11, STXT("Cycle")) }, + { I("fsu_clock_off_cycles", 0x101, STXT("FSU clocking gated off cycle")) }, + { I("wait_cycles", 0x110, STXT("Wait state cycle")) }, +/* core imp def: */ + { I("bus_access_rd", 0x60, STXT("Bus access read")) }, + { I("bus_access_wr", 0x61, STXT("Bus access write")) }, + { I("l1d_cache_rd", 0x40, STXT("L1D cache access, read")) }, + { I("l1d_cache_refill_rd", 0x42, STXT("L1D cache refill, read")) }, + { I("l1d_cache_refill_wr", 0x43, STXT("L1D cache refill, write")) }, + { I("l1d_cache_wr", 0x41, STXT("L1D cache access, write")) }, + { I("l1d_tlb_rd", 0x4e, STXT("L1D tlb access, read")) }, + { I("l1d_tlb_refill_rd", 0x4c, STXT("L1D tlb refill, read")) }, + { I("l1d_tlb_refill_wr", 0x4d, STXT("L1D tlb refill, write")) }, + { I("l1d_tlb_wr", 0x4f, STXT("L1D tlb access, write")) }, +/* exception: */ + { I("exc_dabort", 0x84, STXT("Exception taken, Data Abort and SError")) }, + { I("exc_fiq", 0x87, STXT("Exception taken, FIQ")) }, + { I("exc_hvc", 0x8a, STXT("Exception taken, Hypervisor Call")) }, + { I("exc_irq", 0x86, STXT("Exception taken, IRQ")) }, + { I("exc_pabort", 0x83, STXT("Exception taken, Instruction Abort")) }, + { I("exc_return", 0xa, + STXT("Instruction architecturally executed, condition check pass, exception" + " return")) }, + { I("exc_svc", 0x82, STXT("Exception taken, Supervisor Call")) }, + { I("exc_taken", 0x9, STXT("Exception taken")) }, + { I("exc_trap_dabort", 0x8c, + STXT("Exception taken, Data Abort or SError not taken locally")) }, + { I("exc_trap_fiq", 0x8f, STXT("Exception taken, FIQ not taken locally")) }, + { I("exc_trap_irq", 0x8e, STXT("Exception taken, IRQ not taken locally")) }, + { I("exc_trap_other", 0x8d, + STXT("Exception taken, Other traps not taken locally")) }, + { I("exc_trap_pabort", 0x8b, + STXT("Exception taken, Instruction Abort not taken locally")) }, + { I("exc_undef", 0x81, STXT("Exception taken, Other synchronous")) }, +/* instruction: */ + { I("ase_spec", 0x74, + STXT("Operation speculatively executed, Advanced SIMD instruction")) }, + { I("br_mis_pred_retired", 0x22, + STXT("Instruction architecturally executed, mispredicted branch")) }, + { I("br_retired", 0x21, + STXT("Instruction architecturally executed, branch")) }, + { I("cid_write_retired", 0xb, STXT("Write to CONTEXTIDR")) }, + { I("crypto_spec", 0x77, + STXT("Operation speculatively executed, Cryptographic instruction")) }, + { I("dmb_spec", 0x7e, STXT("Barrier speculatively executed, DMB")) }, + { I("dp_spec", 0x73, + STXT("Operation speculatively executed, integer data processing")) }, + { I("dsb_spec", 0x7d, STXT("Barrier speculatively executed, DSB")) }, + { I("inst_retired", 0x8, STXT("Instruction architecturally executed")) }, + { I("inst_spec", 0x1b, STXT("Operation speculatively executed")) }, + { I("isb_spec", 0x7c, STXT("Barrier speculatively executed, ISB")) }, + { I("ld_spec", 0x70, STXT("Operation speculatively executed, load")) }, + { I("ldst_spec", 0x72, + STXT("Operation speculatively executed, load or store")) }, + { I("nop_spec", 0x100, STXT("Speculatively executed, NOP")) }, + { I("pc_write_spec", 0x76, + STXT("Operation speculatively executed, software change of the PC")) }, + { I("rc_ld_spec", 0x90, + STXT("Release consistency operation speculatively executed, Load-Acquire")) }, + { I("rc_st_spec", 0x91, + STXT("Release consistency operation speculatively executed, Store-Release")) }, + { I("st_spec", 0x71, STXT("Operation speculatively executed, store")) }, + { I("sw_incr", 0, STXT("Software increment")) }, + { I("ttbr_write_retired", 0x1c, + STXT("Instruction architecturally executed, Condition code check pass, write" + " to TTBR")) }, + { I("vfp_spec", 0x75, + STXT("Operation speculatively executed, floating-point instruction")) }, +/* intrinsic: */ + { I("ldrex_spec", 0x6c, + STXT("Exclusive operation speculatively executed, LDREX or LDX")) }, + { I("strex_fail_spec", 0x6e, + STXT("Exclusive operation speculatively executed, STREX or STX fail")) }, + { I("strex_pass_spec", 0x6d, + STXT("Exclusive operation speculatively executed, STREX or STX pass")) }, + { I("strex_spec", 0x6f, + STXT("Exclusive operation speculatively executed, STREX or STX")) }, +/* memory: */ + { I("mem_access", 0x13, STXT("Data memory access")) }, + { I("mem_access_rd", 0x66, STXT("Data memory access, read")) }, + { I("mem_access_wr", 0x67, STXT("Data memory access, write")) }, + { I("memory_error", 0x1a, STXT("Local memory error")) }, + { I("unaligned_ld_spec", 0x68, STXT("Unaligned access, read")) }, + { I("unaligned_ldst_spec", 0x6a, STXT("Unaligned access")) }, + { I("unaligned_st_spec", 0x69, STXT("Unaligned access, write")) }, +/* pipeline: */ + { I("bx_stall", 0x10c, STXT("BX stalled")) }, + { I("decode_stall", 0x108, STXT("Decode starved")) }, + { I("dispatch_stall", 0x109, STXT("Dispatch stalled")) }, + { I("fx_stall", 0x10f, STXT("FX stalled")) }, + { I("ixa_stall", 0x10a, STXT("IXA stalled")) }, + { I("ixb_stall", 0x10b, STXT("IXB stalled")) }, + { I("lx_stall", 0x10d, STXT("LX stalled")) }, + { I("sx_stall", 0x10e, STXT("SX stalled")) }, + { NULL, NULL, 0, NULL } +}; + +#undef I +#endif diff --git a/gprofng/src/hwc_intel_icelake.h b/gprofng/src/hwc_intel_icelake.h new file mode 100644 index 0000000..46f4ac5 --- /dev/null +++ b/gprofng/src/hwc_intel_icelake.h @@ -0,0 +1,1171 @@ +/* Copyright (C) 2024 Free Software Foundation, Inc. + Contributed by Oracle. + + This file is part of GNU Binutils. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _HWC_INTEL_ICELAKE_H +#define _HWC_INTEL_ICELAKE_H + +#define SH(val, n) (((unsigned long long) (val)) << n) +#define I(nm, event, umask, edge, cmask, inv, \ + offcore_rsp, ldlat, frontend, period, mtr) \ + INIT_HWC(nm, mtr, SH(event, 0) | SH(umask, 8) | SH(edge, 18) \ + | SH(cmask, 24) | SH(inv, 23), PERF_TYPE_RAW), \ + .config1 = SH(offcore_rsp, 0) | SH(ldlat, 0) | SH(frontend, 0), \ + .val = period + +static Hwcentry intelIcelakeList[] = { + HWC_GENERIC + +/* cache: */ + { I("l1d.replacement", 0x51, 0x1, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts the number of cache lines replaced in L1 data cache")) }, + { I("l1d_pend_miss.fb_full", 0x48, 0x2, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Number of cycles a demand request has waited due to L1D Fill Buffer" + " (FB) unavailability")) }, + { I("l1d_pend_miss.fb_full_periods", 0x48, 0x2, 0x1, 0x1, 0, 0, 0, 0, 0xf4243, + STXT("Number of phases a demand request has waited due to L1D Fill Buffer" + " (FB) unavailability")) }, + { I("l1d_pend_miss.l2_stall", 0x48, 0x4, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Number of cycles a demand request has waited due to L1D due to lack of" + " L2 resources")) }, + { I("l1d_pend_miss.pending", 0x48, 0x1, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Number of L1D misses that are outstanding")) }, + { I("l1d_pend_miss.pending_cycles", 0x48, 0x1, 0, 0x1, 0, 0, 0, 0, 0xf4243, + STXT("Cycles with L1D load Misses outstanding")) }, + { I("l2_lines_in.all", 0xf1, 0x1f, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("L2 cache lines filling L2")) }, + { I("l2_lines_out.non_silent", 0xf2, 0x2, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Cache lines that are evicted by L2 cache when triggered by an L2 cache" + " fill")) }, + { I("l2_lines_out.silent", 0xf2, 0x1, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Non-modified cache lines that are silently dropped by L2 cache when" + " triggered by an L2 cache fill")) }, + { I("l2_rqsts.all_code_rd", 0x24, 0xe4, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("L2 code requests")) }, + { I("l2_rqsts.all_demand_data_rd", 0x24, 0xe1, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Demand Data Read requests")) }, + { I("l2_rqsts.all_demand_miss", 0x24, 0x27, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Demand requests that miss L2 cache")) }, + { I("l2_rqsts.all_rfo", 0x24, 0xe2, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("RFO requests to L2 cache")) }, + { I("l2_rqsts.code_rd_hit", 0x24, 0xc4, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("L2 cache hits when fetching instructions, code reads")) }, + { I("l2_rqsts.code_rd_miss", 0x24, 0x24, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("L2 cache misses when fetching instructions")) }, + { I("l2_rqsts.demand_data_rd_hit", 0x24, 0xc1, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Demand Data Read requests that hit L2 cache")) }, + { I("l2_rqsts.demand_data_rd_miss", 0x24, 0x21, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Demand Data Read miss L2, no rejects")) }, + { I("l2_rqsts.rfo_hit", 0x24, 0xc2, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("RFO requests that hit L2 cache")) }, + { I("l2_rqsts.rfo_miss", 0x24, 0x22, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("RFO requests that miss L2 cache")) }, + { I("l2_rqsts.swpf_hit", 0x24, 0xc8, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("SW prefetch requests that hit L2 cache")) }, + { I("l2_rqsts.swpf_miss", 0x24, 0x28, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("SW prefetch requests that miss L2 cache")) }, + { I("l2_trans.l2_wb", 0xf0, 0x40, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("L2 writebacks that access L2 cache")) }, + { I("longest_lat_cache.miss", 0x2e, 0x41, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Core-originated cacheable requests that missed L3 (Except hardware" + " prefetches to the L3)")) }, + { I("longest_lat_cache.reference", 0x2e, 0x4f, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Core-originated cacheable requests that refer to L3 (Except hardware" + " prefetches to the L3)")) }, + { I("mem_inst_retired.all_loads", 0xd0, 0x81, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Retired load instructions Supports address when precise (Precise" + " event)")) }, + { I("mem_inst_retired.all_stores", 0xd0, 0x82, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Retired store instructions Supports address when precise (Precise" + " event)")) }, + { I("mem_inst_retired.any", 0xd0, 0x83, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("All retired memory instructions Supports address when precise (Precise" + " event)")) }, + { I("mem_inst_retired.lock_loads", 0xd0, 0x21, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("Retired load instructions with locked access Supports address when" + " precise (Precise event)")) }, + { I("mem_inst_retired.split_loads", 0xd0, 0x41, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Retired load instructions that split across a cacheline boundary" + " Supports address when precise (Precise event)")) }, + { I("mem_inst_retired.split_stores", 0xd0, 0x42, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Retired store instructions that split across a cacheline boundary" + " Supports address when precise (Precise event)")) }, + { I("mem_inst_retired.stlb_miss_loads", 0xd0, 0x11, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Retired load instructions that miss the STLB Supports address when" + " precise (Precise event)")) }, + { I("mem_inst_retired.stlb_miss_stores", 0xd0, 0x12, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Retired store instructions that miss the STLB Supports address when" + " precise (Precise event)")) }, + { I("mem_load_l3_hit_retired.xsnp_fwd", 0xd2, 0x4, 0, 0, 0, 0, 0, 0, 0x4e2b, + STXT("Retired load instructions whose data sources were HitM responses from" + " shared L3 Supports address when precise (Precise event)")) }, + { I("mem_load_l3_hit_retired.xsnp_miss", 0xd2, 0x1, 0, 0, 0, 0, 0, 0, 0x4e2b, + STXT("Retired load instructions whose data sources were L3 hit and" + " cross-core snoop missed in on-pkg core cache Supports address when" + " precise (Precise event)")) }, + { I("mem_load_l3_hit_retired.xsnp_no_fwd", 0xd2, 0x2, 0, 0, 0, 0, 0, 0, 0x4e2b, + STXT("Retired load instructions whose data sources were L3 and cross-core" + " snoop hits in on-pkg core cache Supports address when precise (Precise" + " event)")) }, + { I("mem_load_l3_hit_retired.xsnp_none", 0xd2, 0x8, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Retired load instructions whose data sources were hits in L3 without" + " snoops required Supports address when precise (Precise event)")) }, + { I("mem_load_l3_miss_retired.local_dram", 0xd3, 0x1, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("Retired load instructions which data sources missed L3 but serviced" + " from local dram Supports address when precise (Precise event)")) }, + { I("mem_load_l3_miss_retired.remote_dram", 0xd3, 0x2, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("Retired load instructions which data sources missed L3 but serviced" + " from remote dram Supports address when precise (Precise event)")) }, + { I("mem_load_l3_miss_retired.remote_fwd", 0xd3, 0x8, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("Retired load instructions whose data sources was forwarded from a" + " remote cache Supports address when precise (Precise event)")) }, + { I("mem_load_l3_miss_retired.remote_hitm", 0xd3, 0x4, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("Retired load instructions whose data sources was remote HITM Supports" + " address when precise (Precise event)")) }, + { I("mem_load_l3_miss_retired.remote_pmm", 0xd3, 0x10, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("Retired load instructions with remote Intel(R) Optane(TM) DC" + " persistent memory as the data source where the data request missed all" + " caches Supports address when precise (Precise event)")) }, + { I("mem_load_misc_retired.uc", 0xd4, 0x4, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("Retired instructions with at least 1 uncacheable load or Bus Lock" + " Supports address when precise (Precise event)")) }, + { I("mem_load_retired.fb_hit", 0xd1, 0x40, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("Number of completed demand load requests that missed the L1, but hit" + " the FB(fill buffer), because a preceding miss to the same cacheline" + " initiated the line to be brought into L1, but data is not yet ready in" + " L1 Supports address when precise (Precise event)")) }, + { I("mem_load_retired.l1_hit", 0xd1, 0x1, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Retired load instructions with L1 cache hits as data sources Supports" + " address when precise (Precise event)")) }, + { I("mem_load_retired.l1_miss", 0xd1, 0x8, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Retired load instructions missed L1 cache as data sources Supports" + " address when precise (Precise event)")) }, + { I("mem_load_retired.l2_hit", 0xd1, 0x2, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Retired load instructions with L2 cache hits as data sources Supports" + " address when precise (Precise event)")) }, + { I("mem_load_retired.l2_miss", 0xd1, 0x10, 0, 0, 0, 0, 0, 0, 0x186b5, + STXT("Retired load instructions missed L2 cache as data sources Supports" + " address when precise (Precise event)")) }, + { I("mem_load_retired.l3_hit", 0xd1, 0x4, 0, 0, 0, 0, 0, 0, 0x186b5, + STXT("Retired load instructions with L3 cache hits as data sources Supports" + " address when precise (Precise event)")) }, + { I("mem_load_retired.l3_miss", 0xd1, 0x20, 0, 0, 0, 0, 0, 0, 0xc365, + STXT("Retired load instructions missed L3 cache as data sources Supports" + " address when precise (Precise event)")) }, + { I("mem_load_retired.local_pmm", 0xd1, 0x80, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Retired load instructions with local Intel(R) Optane(TM) DC persistent" + " memory as the data source where the data request missed all caches" + " Supports address when precise (Precise event)")) }, + { I("ocr.demand_code_rd.l3_hit", 0xb7, 0x1, 0, 0, 0, 0x3f803c0004, 0, 0, 0x186a3, + STXT("Counts demand instruction fetches and L1 instruction cache prefetches" + " that hit in the L3 or were snooped from another core's caches on the" + " same socket")) }, + { I("ocr.demand_code_rd.l3_hit.snoop_hitm", 0xb7, 0x1, 0, 0, 0, 0x10003c0004, 0, 0, 0x186a3, + STXT("Counts demand instruction fetches and L1 instruction cache prefetches" + " that resulted in a snoop hit a modified line in another core's caches" + " which forwarded the data")) }, + { I("ocr.demand_code_rd.snc_cache.hit_with_fwd", 0xb7, 0x1, 0, 0, 0, 0x808000004, 0, 0, 0x186a3, + STXT("Counts demand instruction fetches and L1 instruction cache prefetches" + " that either hit a non-modified line in a distant L3 Cache or were" + " snooped from a distant core's L1/L2 caches on this socket when the" + " system is in SNC (sub-NUMA cluster) mode")) }, + { I("ocr.demand_code_rd.snc_cache.hitm", 0xb7, 0x1, 0, 0, 0, 0x1008000004, 0, 0, 0x186a3, + STXT("Counts demand instruction fetches and L1 instruction cache prefetches" + " that hit a modified line in a distant L3 Cache or were snooped from a" + " distant core's L1/L2 caches on this socket when the system is in SNC" + " (sub-NUMA cluster) mode")) }, + { I("ocr.demand_data_rd.l3_hit", 0xb7, 0x1, 0, 0, 0, 0x3f803c0001, 0, 0, 0x186a3, + STXT("Counts demand data reads that hit in the L3 or were snooped from" + " another core's caches on the same socket")) }, + { I("ocr.demand_data_rd.l3_hit.snoop_hit_no_fwd", 0xb7, 0x1, 0, 0, 0, 0x4003c0001, 0, 0, 0x186a3, + STXT("Counts demand data reads that resulted in a snoop that hit in another" + " core, which did not forward the data")) }, + { I("ocr.demand_data_rd.l3_hit.snoop_hit_with_fwd", 0xb7, 0x1, 0, 0, 0, 0x8003c0001, 0, 0, 0x186a3, + STXT("Counts demand data reads that resulted in a snoop hit in another" + " core's caches which forwarded the unmodified data to the requesting" + " core")) }, + { I("ocr.demand_data_rd.l3_hit.snoop_hitm", 0xb7, 0x1, 0, 0, 0, 0x10003c0001, 0, 0, 0x186a3, + STXT("Counts demand data reads that resulted in a snoop hit a modified line" + " in another core's caches which forwarded the data")) }, + { I("ocr.demand_data_rd.remote_cache.snoop_hit_with_fwd", 0xb7, 0x1, 0, 0, 0, 0x830000001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were supplied by a cache on a remote" + " socket where a snoop hit in another core's caches which forwarded the" + " unmodified data to the requesting core")) }, + { I("ocr.demand_data_rd.remote_cache.snoop_hitm", 0xb7, 0x1, 0, 0, 0, 0x1030000001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were supplied by a cache on a remote" + " socket where a snoop hit a modified line in another core's caches" + " which forwarded the data")) }, + { I("ocr.demand_data_rd.snc_cache.hit_with_fwd", 0xb7, 0x1, 0, 0, 0, 0x808000001, 0, 0, 0x186a3, + STXT("Counts demand data reads that either hit a non-modified line in a" + " distant L3 Cache or were snooped from a distant core's L1/L2 caches on" + " this socket when the system is in SNC (sub-NUMA cluster) mode")) }, + { I("ocr.demand_data_rd.snc_cache.hitm", 0xb7, 0x1, 0, 0, 0, 0x1008000001, 0, 0, 0x186a3, + STXT("Counts demand data reads that hit a modified line in a distant L3" + " Cache or were snooped from a distant core's L1/L2 caches on this" + " socket when the system is in SNC (sub-NUMA cluster) mode")) }, + { I("ocr.demand_rfo.l3_hit", 0xb7, 0x1, 0, 0, 0, 0x3f803c0002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that hit in the L3 or" + " were snooped from another core's caches on the same socket")) }, + { I("ocr.demand_rfo.l3_hit.snoop_hitm", 0xb7, 0x1, 0, 0, 0, 0x10003c0002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that resulted in a" + " snoop hit a modified line in another core's caches which forwarded the" + " data")) }, + { I("ocr.demand_rfo.snc_cache.hit_with_fwd", 0xb7, 0x1, 0, 0, 0, 0x808000002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that either hit a" + " non-modified line in a distant L3 Cache or were snooped from a distant" + " core's L1/L2 caches on this socket when the system is in SNC (sub-NUMA" + " cluster) mode")) }, + { I("ocr.demand_rfo.snc_cache.hitm", 0xb7, 0x1, 0, 0, 0, 0x1008000002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that hit a modified" + " line in a distant L3 Cache or were snooped from a distant core's L1/L2" + " caches on this socket when the system is in SNC (sub-NUMA cluster)" + " mode")) }, + { I("ocr.hwpf_l1d_and_swpf.l3_hit", 0xb7, 0x1, 0, 0, 0, 0x3f803c0400, 0, 0, 0x186a3, + STXT("Counts L1 data cache prefetch requests and software prefetches (except" + " PREFETCHW) that hit in the L3 or were snooped from another core's" + " caches on the same socket")) }, + { I("ocr.hwpf_l3.l3_hit", 0xb7, 0x1, 0, 0, 0, 0x80082380, 0, 0, 0x186a3, + STXT("Counts hardware prefetches to the L3 only that hit in the L3 or were" + " snooped from another core's caches on the same socket")) }, + { I("ocr.prefetches.l3_hit", 0xb7, 0x1, 0, 0, 0, 0x3f803c27f0, 0, 0, 0x186a3, + STXT("Counts hardware and software prefetches to all cache levels that hit" + " in the L3 or were snooped from another core's caches on the same" + " socket")) }, + { I("ocr.reads_to_core.l3_hit", 0xb7, 0x1, 0, 0, 0, 0x3f003c0477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that hit in the" + " L3 or were snooped from another core's caches on the same socket")) }, + { I("ocr.reads_to_core.l3_hit.snoop_hit_no_fwd", 0xb7, 0x1, 0, 0, 0, 0x4003c0477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that resulted in" + " a snoop that hit in another core, which did not forward the data")) }, + { I("ocr.reads_to_core.l3_hit.snoop_hit_with_fwd", 0xb7, 0x1, 0, 0, 0, 0x8003c0477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that resulted in" + " a snoop hit in another core's caches which forwarded the unmodified" + " data to the requesting core")) }, + { I("ocr.reads_to_core.l3_hit.snoop_hitm", 0xb7, 0x1, 0, 0, 0, 0x10003c0477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that resulted in" + " a snoop hit a modified line in another core's caches which forwarded" + " the data")) }, + { I("ocr.reads_to_core.remote_cache.snoop_fwd", 0xb7, 0x1, 0, 0, 0, 0x1830000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by a cache on a remote socket where a snoop was sent and data" + " was returned (Modified or Not Modified)")) }, + { I("ocr.reads_to_core.remote_cache.snoop_hit_with_fwd", 0xb7, 0x1, 0, 0, 0, 0x830000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by a cache on a remote socket where a snoop hit in another" + " core's caches which forwarded the unmodified data to the requesting" + " core")) }, + { I("ocr.reads_to_core.remote_cache.snoop_hitm", 0xb7, 0x1, 0, 0, 0, 0x1030000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by a cache on a remote socket where a snoop hit a modified" + " line in another core's caches which forwarded the data")) }, + { I("ocr.reads_to_core.snc_cache.hit_with_fwd", 0xb7, 0x1, 0, 0, 0, 0x808000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that either hit a" + " non-modified line in a distant L3 Cache or were snooped from a distant" + " core's L1/L2 caches on this socket when the system is in SNC (sub-NUMA" + " cluster) mode")) }, + { I("ocr.reads_to_core.snc_cache.hitm", 0xb7, 0x1, 0, 0, 0, 0x1008000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that hit a" + " modified line in a distant L3 Cache or were snooped from a distant" + " core's L1/L2 caches on this socket when the system is in SNC (sub-NUMA" + " cluster) mode")) }, + { I("ocr.streaming_wr.l3_hit", 0xb7, 0x1, 0, 0, 0, 0x80080800, 0, 0, 0x186a3, + STXT("Counts streaming stores that hit in the L3 or were snooped from" + " another core's caches on the same socket")) }, + { I("offcore_requests.all_data_rd", 0xb0, 0x8, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Demand and prefetch data reads")) }, + { I("offcore_requests.all_requests", 0xb0, 0x80, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts memory transactions sent to the uncore")) }, + { I("offcore_requests.demand_code_rd", 0xb0, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts cacheable and non-cacheable code reads to the core")) }, + { I("offcore_requests.demand_data_rd", 0xb0, 0x1, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Demand Data Read requests sent to uncore")) }, + { I("offcore_requests.demand_rfo", 0xb0, 0x4, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Demand RFO requests including regular RFOs, locks, ItoM")) }, + { I("offcore_requests_outstanding.all_data_rd", 0x60, 0x8, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("For every cycle, increments by the number of outstanding data read" + " requests pending")) }, + { I("offcore_requests_outstanding.cycles_with_data_rd", 0x60, 0x8, 0, 0x1, 0, 0, 0, 0, 0xf4243, + STXT("Cycles where at least 1 outstanding data read request is pending")) }, + { I("offcore_requests_outstanding.cycles_with_demand_code_rd", 0x60, 0x2, 0, 0x1, 0, 0, 0, 0, 0xf4243, + STXT("Cycles with outstanding code read requests pending")) }, + { I("offcore_requests_outstanding.cycles_with_demand_rfo", 0x60, 0x4, 0, 0x1, 0, 0, 0, 0, 0xf4243, + STXT("Cycles where at least 1 outstanding Demand RFO request is pending")) }, + { I("offcore_requests_outstanding.demand_code_rd", 0x60, 0x2, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("For every cycle, increments by the number of outstanding code read" + " requests pending")) }, + { I("offcore_requests_outstanding.demand_data_rd", 0x60, 0x1, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("For every cycle, increments by the number of outstanding demand data" + " read requests pending")) }, + { I("sq_misc.bus_lock", 0xf4, 0x10, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts bus locks, accounts for cache line split locks and UC locks")) }, + { I("sq_misc.sq_full", 0xf4, 0x4, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Cycles the queue waiting for offcore responses is full")) }, + { I("sw_prefetch_access.nta", 0x32, 0x1, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of PREFETCHNTA instructions executed")) }, + { I("sw_prefetch_access.prefetchw", 0x32, 0x8, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of PREFETCHW instructions executed")) }, + { I("sw_prefetch_access.t0", 0x32, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of PREFETCHT0 instructions executed")) }, + { I("sw_prefetch_access.t1_t2", 0x32, 0x4, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of PREFETCHT1 or PREFETCHT2 instructions executed")) }, +/* floating point: */ + { I("assists.fp", 0xc1, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts all microcode FP assists")) }, + { I("fp_arith_inst_retired.128b_packed_double", 0xc7, 0x4, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts number of SSE/AVX computational 128-bit packed double precision" + " floating-point instructions retired; some instructions will count" + " twice as noted below. Each count represents 2 computation operations," + " one for each element. Applies to SSE* and AVX* packed double precision" + " floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX" + " SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice" + " as they perform 2 calculations per element")) }, + { I("fp_arith_inst_retired.128b_packed_single", 0xc7, 0x8, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of SSE/AVX computational 128-bit packed single precision" + " floating-point instructions retired; some instructions will count" + " twice as noted below. Each count represents 4 computation operations," + " one for each element. Applies to SSE* and AVX* packed single precision" + " floating-point instructions: ADD SUB MUL DIV MIN MAX RCP14 RSQRT14" + " SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice" + " as they perform 2 calculations per element")) }, + { I("fp_arith_inst_retired.256b_packed_double", 0xc7, 0x10, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts number of SSE/AVX computational 256-bit packed double precision" + " floating-point instructions retired; some instructions will count" + " twice as noted below. Each count represents 4 computation operations," + " one for each element. Applies to SSE* and AVX* packed double precision" + " floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX" + " SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they" + " perform 2 calculations per element")) }, + { I("fp_arith_inst_retired.256b_packed_single", 0xc7, 0x20, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts number of SSE/AVX computational 256-bit packed single precision" + " floating-point instructions retired; some instructions will count" + " twice as noted below. Each count represents 8 computation operations," + " one for each element. Applies to SSE* and AVX* packed single precision" + " floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX" + " SQRT RSQRT RCP DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions" + " count twice as they perform 2 calculations per element")) }, + { I("fp_arith_inst_retired.4_flops", 0xc7, 0x18, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of SSE/AVX computational 128-bit packed single and 256-bit" + " packed double precision FP instructions retired; some instructions" + " will count twice as noted below. Each count represents 2 or/and 4" + " computation operations, 1 for each element. Applies to SSE* and AVX*" + " packed single precision and packed double precision FP instructions:" + " ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP" + " FM(N)ADD/SUB. DPP and FM(N)ADD/SUB count twice as they perform 2" + " calculations per element")) }, + { I("fp_arith_inst_retired.512b_packed_double", 0xc7, 0x40, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts number of SSE/AVX computational 512-bit packed double precision" + " floating-point instructions retired; some instructions will count" + " twice as noted below. Each count represents 8 computation operations," + " one for each element. Applies to SSE* and AVX* packed double precision" + " floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT14" + " RCP14 FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they" + " perform 2 calculations per element")) }, + { I("fp_arith_inst_retired.512b_packed_single", 0xc7, 0x80, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts number of SSE/AVX computational 512-bit packed single precision" + " floating-point instructions retired; some instructions will count" + " twice as noted below. Each count represents 16 computation operations," + " one for each element. Applies to SSE* and AVX* packed single precision" + " floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT14" + " RCP14 FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they" + " perform 2 calculations per element")) }, + { I("fp_arith_inst_retired.8_flops", 0xc7, 0x60, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of SSE/AVX computational 256-bit packed single precision and" + " 512-bit packed double precision FP instructions retired; some" + " instructions will count twice as noted below. Each count represents 8" + " computation operations, 1 for each element. Applies to SSE* and AVX*" + " packed single precision and double precision FP instructions: ADD SUB" + " HADD HSUB SUBADD MUL DIV MIN MAX SQRT RSQRT RSQRT14 RCP RCP14 DPP" + " FM(N)ADD/SUB. DPP and FM(N)ADD/SUB count twice as they perform 2" + " calculations per element")) }, + { I("fp_arith_inst_retired.scalar", 0xc7, 0x3, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Number of SSE/AVX computational scalar floating-point instructions" + " retired; some instructions will count twice as noted below. Applies to" + " SSE* and AVX* scalar, double and single precision floating-point: ADD" + " SUB MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and" + " FM(N)ADD/SUB instructions count twice as they perform multiple" + " calculations per element")) }, + { I("fp_arith_inst_retired.scalar_double", 0xc7, 0x1, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts number of SSE/AVX computational scalar double precision" + " floating-point instructions retired; some instructions will count" + " twice as noted below. Each count represents 1 computational operation." + " 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 2 calculations per element")) }, + { I("fp_arith_inst_retired.scalar_single", 0xc7, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts number of SSE/AVX computational scalar single precision" + " floating-point instructions retired; some instructions will count" + " twice as noted below. Each count represents 1 computational operation." + " Applies to SSE* and AVX* scalar single precision floating-point" + " instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT RCP FM(N)ADD/SUB." + " FM(N)ADD/SUB instructions count twice as they perform 2 calculations" + " per element")) }, + { I("fp_arith_inst_retired.vector", 0xc7, 0xfc, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Number of any Vector retired FP arithmetic instructions")) }, +/* frontend: */ + { I("baclears.any", 0xe6, 0x1, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts the total number when the front end is resteered, mainly when" + " the BPU cannot provide a correct prediction and this is corrected by" + " other branch handling mechanisms at the front end")) }, + { I("decode.lcp", 0x87, 0x1, 0, 0, 0, 0, 0, 0, 0x7a129, + STXT("Stalls caused by changing prefix length of the instruction. [This" + " event is alias to ILD_STALL.LCP]")) }, + { I("dsb2mite_switches.count", 0xab, 0x2, 0x1, 0x1, 0, 0, 0, 0, 0x186a3, + STXT("Decode Stream Buffer (DSB)-to-MITE transitions count")) }, + { I("dsb2mite_switches.penalty_cycles", 0xab, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("DSB-to-MITE switch true penalty cycles")) }, + { I("frontend_retired.any_dsb_miss", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x1, 0x186a7, + STXT("Retired Instructions who experienced DSB miss (Precise event)")) }, + { I("frontend_retired.dsb_miss", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x11, 0x186a7, + STXT("Retired Instructions who experienced a critical DSB miss (Precise" + " event)")) }, + { I("frontend_retired.itlb_miss", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x14, 0x186a7, + STXT("Retired Instructions who experienced iTLB true miss (Precise event)")) }, + { I("frontend_retired.l1i_miss", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x12, 0x186a7, + STXT("Retired Instructions who experienced Instruction L1 Cache true miss" + " (Precise event)")) }, + { I("frontend_retired.l2_miss", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x13, 0x186a7, + STXT("Retired Instructions who experienced Instruction L2 Cache true miss" + " (Precise event)")) }, + { I("frontend_retired.latency_ge_1", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x500106, 0x186a7, + STXT("Retired instructions after front-end starvation of at least 1 cycle" + " (Precise event)")) }, + { I("frontend_retired.latency_ge_128", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x508006, 0x186a7, + STXT("Retired instructions that are fetched after an interval where the" + " front-end delivered no uops for a period of 128 cycles which was not" + " interrupted by a back-end stall (Precise event)")) }, + { I("frontend_retired.latency_ge_16", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x501006, 0x186a7, + STXT("Retired instructions that are fetched after an interval where the" + " front-end delivered no uops for a period of 16 cycles which was not" + " interrupted by a back-end stall (Precise event)")) }, + { I("frontend_retired.latency_ge_2", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x500206, 0x186a7, + STXT("Retired instructions after front-end starvation of at least 2 cycles" + " (Precise event)")) }, + { I("frontend_retired.latency_ge_256", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x510006, 0x186a7, + STXT("Retired instructions that are fetched after an interval where the" + " front-end delivered no uops for a period of 256 cycles which was not" + " interrupted by a back-end stall (Precise event)")) }, + { I("frontend_retired.latency_ge_2_bubbles_ge_1", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x100206, 0x186a7, + STXT("Retired instructions that are fetched after an interval where the" + " front-end had at least 1 bubble-slot for a period of 2 cycles which" + " was not interrupted by a back-end stall (Precise event)")) }, + { I("frontend_retired.latency_ge_32", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x502006, 0x186a7, + STXT("Retired instructions that are fetched after an interval where the" + " front-end delivered no uops for a period of 32 cycles which was not" + " interrupted by a back-end stall (Precise event)")) }, + { I("frontend_retired.latency_ge_4", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x500406, 0x186a7, + STXT("Retired instructions that are fetched after an interval where the" + " front-end delivered no uops for a period of 4 cycles which was not" + " interrupted by a back-end stall (Precise event)")) }, + { I("frontend_retired.latency_ge_512", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x520006, 0x186a7, + STXT("Retired instructions that are fetched after an interval where the" + " front-end delivered no uops for a period of 512 cycles which was not" + " interrupted by a back-end stall (Precise event)")) }, + { I("frontend_retired.latency_ge_64", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x504006, 0x186a7, + STXT("Retired instructions that are fetched after an interval where the" + " front-end delivered no uops for a period of 64 cycles which was not" + " interrupted by a back-end stall (Precise event)")) }, + { I("frontend_retired.latency_ge_8", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x500806, 0x186a7, + STXT("Retired instructions that are fetched after an interval where the" + " front-end delivered no uops for a period of 8 cycles which was not" + " interrupted by a back-end stall (Precise event)")) }, + { I("frontend_retired.stlb_miss", 0xc6, 0x1, 0, 0, 0, 0, 0, 0x15, 0x186a7, + STXT("Retired Instructions who experienced STLB (2nd level TLB) true miss" + " (Precise event)")) }, + { I("icache_16b.ifdata_stall", 0x80, 0x4, 0, 0, 0, 0, 0, 0, 0x7a129, + STXT("Cycles where a code fetch is stalled due to L1 instruction cache miss." + " [This event is alias to ICACHE_DATA.STALLS]")) }, + { I("icache_64b.iftag_hit", 0x83, 0x1, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Instruction fetch tag lookups that hit in the instruction cache (L1I)." + " Counts at 64-byte cache-line granularity")) }, + { I("icache_64b.iftag_miss", 0x83, 0x2, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Instruction fetch tag lookups that miss in the instruction cache" + " (L1I). Counts at 64-byte cache-line granularity")) }, + { I("icache_64b.iftag_stall", 0x83, 0x4, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Cycles where a code fetch is stalled due to L1 instruction cache tag" + " miss. [This event is alias to ICACHE_TAG.STALLS]")) }, + { I("icache_data.stalls", 0x80, 0x4, 0, 0, 0, 0, 0, 0, 0x7a129, + STXT("Cycles where a code fetch is stalled due to L1 instruction cache miss." + " [This event is alias to ICACHE_16B.IFDATA_STALL]")) }, + { I("icache_tag.stalls", 0x83, 0x4, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Cycles where a code fetch is stalled due to L1 instruction cache tag" + " miss. [This event is alias to ICACHE_64B.IFTAG_STALL]")) }, + { I("idq.dsb_cycles_any", 0x79, 0x8, 0, 0x1, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles Decode Stream Buffer (DSB) is delivering any Uop")) }, + { I("idq.dsb_cycles_ok", 0x79, 0x8, 0, 0x5, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles DSB is delivering optimal number of Uops")) }, + { I("idq.dsb_uops", 0x79, 0x8, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Uops delivered to Instruction Decode Queue (IDQ) from the Decode" + " Stream Buffer (DSB) path")) }, + { I("idq.mite_cycles_any", 0x79, 0x4, 0, 0x1, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles MITE is delivering any Uop")) }, + { I("idq.mite_cycles_ok", 0x79, 0x4, 0, 0x5, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles MITE is delivering optimal number of Uops")) }, + { I("idq.mite_uops", 0x79, 0x4, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Uops delivered to Instruction Decode Queue (IDQ) from MITE path")) }, + { I("idq.ms_switches", 0x79, 0x30, 0x1, 0x1, 0, 0, 0, 0, 0x186a3, + STXT("Number of switches from DSB or MITE to the MS")) }, + { I("idq.ms_uops", 0x79, 0x30, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Uops delivered to IDQ while MS is busy")) }, + { I("idq_uops_not_delivered.core", 0x9c, 0x1, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Uops not delivered by IDQ when backend of the machine is not stalled")) }, + { I("idq_uops_not_delivered.cycles_0_uops_deliv.core", 0x9c, 0x1, 0, 0x5, 0, 0, 0, 0, 0xf4243, + STXT("Cycles when no uops are not delivered by the IDQ when backend of the" + " machine is not stalled")) }, + { I("idq_uops_not_delivered.cycles_fe_was_ok", 0x9c, 0x1, 0, 0x1, 0x1, 0, 0, 0, 0xf4243, + STXT("Cycles when optimal number of uops was delivered to the back-end when" + " the back-end is not stalled")) }, +/* memory: */ + { I("cycle_activity.stalls_l3_miss", 0xa3, 0x6, 0, 0x6, 0, 0, 0, 0, 0xf4243, + STXT("Execution stalls while L3 cache miss demand load is outstanding")) }, + { I("machine_clears.memory_ordering", 0xc3, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of machine clears due to memory ordering conflicts")) }, + { I("mem_trans_retired.load_latency_gt_128", 0xcd, 0x1, 0, 0, 0, 0, 0x80, 0, 0x3f1, + STXT("Counts randomly selected loads when the latency from first dispatch to" + " completion is greater than 128 cycles Supports address when precise" + " (Must be precise)")) }, + { I("mem_trans_retired.load_latency_gt_16", 0xcd, 0x1, 0, 0, 0, 0, 0x10, 0, 0x4e2b, + STXT("Counts randomly selected loads when the latency from first dispatch to" + " completion is greater than 16 cycles Supports address when precise" + " (Must be precise)")) }, + { I("mem_trans_retired.load_latency_gt_256", 0xcd, 0x1, 0, 0, 0, 0, 0x100, 0, 0x1f7, + STXT("Counts randomly selected loads when the latency from first dispatch to" + " completion is greater than 256 cycles Supports address when precise" + " (Must be precise)")) }, + { I("mem_trans_retired.load_latency_gt_32", 0xcd, 0x1, 0, 0, 0, 0, 0x20, 0, 0x186a7, + STXT("Counts randomly selected loads when the latency from first dispatch to" + " completion is greater than 32 cycles Supports address when precise" + " (Must be precise)")) }, + { I("mem_trans_retired.load_latency_gt_4", 0xcd, 0x1, 0, 0, 0, 0, 0x4, 0, 0x186a3, + STXT("Counts randomly selected loads when the latency from first dispatch to" + " completion is greater than 4 cycles Supports address when precise" + " (Must be precise)")) }, + { I("mem_trans_retired.load_latency_gt_512", 0xcd, 0x1, 0, 0, 0, 0, 0x200, 0, 0x65, + STXT("Counts randomly selected loads when the latency from first dispatch to" + " completion is greater than 512 cycles Supports address when precise" + " (Must be precise)")) }, + { I("mem_trans_retired.load_latency_gt_64", 0xcd, 0x1, 0, 0, 0, 0, 0x40, 0, 0x7d3, + STXT("Counts randomly selected loads when the latency from first dispatch to" + " completion is greater than 64 cycles Supports address when precise" + " (Must be precise)")) }, + { I("mem_trans_retired.load_latency_gt_8", 0xcd, 0x1, 0, 0, 0, 0, 0x8, 0, 0xc365, + STXT("Counts randomly selected loads when the latency from first dispatch to" + " completion is greater than 8 cycles Supports address when precise" + " (Must be precise)")) }, + { I("ocr.demand_code_rd.l3_miss", 0xb7, 0x1, 0, 0, 0, 0x3fbfc00004, 0, 0, 0x186a3, + STXT("Counts demand instruction fetches and L1 instruction cache prefetches" + " that were not supplied by the local socket's L1, L2, or L3 caches")) }, + { I("ocr.demand_code_rd.l3_miss_local", 0xb7, 0x1, 0, 0, 0, 0x3f84400004, 0, 0, 0x186a3, + STXT("Counts demand instruction fetches and L1 instruction cache prefetches" + " that were not supplied by the local socket's L1, L2, or L3 caches and" + " the cacheline is homed locally")) }, + { I("ocr.demand_data_rd.l3_miss", 0xb7, 0x1, 0, 0, 0, 0x3fbfc00001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were not supplied by the local socket's" + " L1, L2, or L3 caches")) }, + { I("ocr.demand_data_rd.l3_miss_local", 0xb7, 0x1, 0, 0, 0, 0x3f84400001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were not supplied by the local socket's" + " L1, L2, or L3 caches and the cacheline is homed locally")) }, + { I("ocr.demand_rfo.l3_miss", 0xb7, 0x1, 0, 0, 0, 0x3f3fc00002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that were not supplied" + " by the local socket's L1, L2, or L3 caches")) }, + { I("ocr.demand_rfo.l3_miss_local", 0xb7, 0x1, 0, 0, 0, 0x3f04400002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that were not supplied" + " by the local socket's L1, L2, or L3 caches and were supplied by the" + " local socket")) }, + { I("ocr.hwpf_l1d_and_swpf.l3_miss", 0xb7, 0x1, 0, 0, 0, 0x3fbfc00400, 0, 0, 0x186a3, + STXT("Counts L1 data cache prefetch requests and software prefetches (except" + " PREFETCHW) that were not supplied by the local socket's L1, L2, or L3" + " caches")) }, + { I("ocr.hwpf_l1d_and_swpf.l3_miss_local", 0xb7, 0x1, 0, 0, 0, 0x3f84400400, 0, 0, 0x186a3, + STXT("Counts L1 data cache prefetch requests and software prefetches (except" + " PREFETCHW) that were not supplied by the local socket's L1, L2, or L3" + " caches and the cacheline is homed locally")) }, + { I("ocr.hwpf_l3.l3_miss", 0xb7, 0x1, 0, 0, 0, 0x94002380, 0, 0, 0x186a3, + STXT("Counts hardware prefetches to the L3 only that missed the local" + " socket's L1, L2, and L3 caches")) }, + { I("ocr.hwpf_l3.l3_miss_local", 0xb7, 0x1, 0, 0, 0, 0x84002380, 0, 0, 0x186a3, + STXT("Counts hardware prefetches to the L3 only that were not supplied by" + " the local socket's L1, L2, or L3 caches and the cacheline is homed" + " locally")) }, + { I("ocr.itom.l3_miss_local", 0xb7, 0x1, 0, 0, 0, 0x84000002, 0, 0, 0x186a3, + STXT("Counts full cacheline writes (ItoM) that were not supplied by the" + " local socket's L1, L2, or L3 caches and the cacheline is homed locally")) }, + { I("ocr.other.l3_miss", 0xb7, 0x1, 0, 0, 0, 0x3fbfc08000, 0, 0, 0x186a3, + STXT("Counts miscellaneous requests, such as I/O and un-cacheable accesses" + " that were not supplied by the local socket's L1, L2, or L3 caches")) }, + { I("ocr.other.l3_miss_local", 0xb7, 0x1, 0, 0, 0, 0x3f84408000, 0, 0, 0x186a3, + STXT("Counts miscellaneous requests, such as I/O and un-cacheable accesses" + " that were not supplied by the local socket's L1, L2, or L3 caches and" + " the cacheline is homed locally")) }, + { I("ocr.prefetches.l3_miss_local", 0xb7, 0x1, 0, 0, 0, 0x3f844027f0, 0, 0, 0x186a3, + STXT("Counts hardware and software prefetches to all cache levels that were" + " not supplied by the local socket's L1, L2, or L3 caches and the" + " cacheline is homed locally")) }, + { I("ocr.reads_to_core.l3_miss", 0xb7, 0x1, 0, 0, 0, 0x3f3fc00477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were not" + " supplied by the local socket's L1, L2, or L3 caches")) }, + { I("ocr.reads_to_core.l3_miss_local", 0xb7, 0x1, 0, 0, 0, 0x3f04400477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were not" + " supplied by the local socket's L1, L2, or L3 caches and were supplied" + " by the local socket")) }, + { I("ocr.reads_to_core.l3_miss_local_socket", 0xb7, 0x1, 0, 0, 0, 0x70cc00477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that missed the" + " L3 Cache and were supplied by the local socket (DRAM or PMM), whether" + " or not in Sub NUMA Cluster(SNC) Mode. In SNC Mode counts PMM or DRAM" + " accesses that are controlled by the close or distant SNC Cluster")) }, + { I("ocr.streaming_wr.l3_miss", 0xb7, 0x1, 0, 0, 0, 0x94000800, 0, 0, 0x186a3, + STXT("Counts streaming stores that missed the local socket's L1, L2, and L3" + " caches")) }, + { I("ocr.streaming_wr.l3_miss_local", 0xb7, 0x1, 0, 0, 0, 0x84000800, 0, 0, 0x186a3, + STXT("Counts streaming stores that were not supplied by the local socket's" + " L1, L2, or L3 caches and the cacheline is homed locally")) }, + { I("offcore_requests.l3_miss_demand_data_rd", 0xb0, 0x10, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts demand data read requests that miss the L3 cache")) }, + { I("offcore_requests_outstanding.cycles_with_l3_miss_demand_data_rd", 0x60, 0x10, 0, 0x1, 0, 0, 0, 0, 0xf4243, + STXT("Cycles where at least one demand data read request known to have" + " missed the L3 cache is pending")) }, + { I("offcore_requests_outstanding.l3_miss_demand_data_rd_ge_6", 0x60, 0x10, 0, 0x6, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles where the core is waiting on at least 6 outstanding demand data" + " read requests known to have missed the L3 cache")) }, + { I("rtm_retired.aborted", 0xc9, 0x4, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of times an RTM execution aborted")) }, + { I("rtm_retired.aborted_events", 0xc9, 0x80, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of times an RTM execution aborted due to none of the previous 4" + " categories (e.g. interrupt)")) }, + { I("rtm_retired.aborted_mem", 0xc9, 0x8, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of times an RTM execution aborted due to various memory events" + " (e.g. read/write capacity and conflicts)")) }, + { I("rtm_retired.aborted_memtype", 0xc9, 0x40, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of times an RTM execution aborted due to incompatible memory" + " type")) }, + { I("rtm_retired.aborted_unfriendly", 0xc9, 0x20, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of times an RTM execution aborted due to HLE-unfriendly" + " instructions")) }, + { I("rtm_retired.commit", 0xc9, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of times an RTM execution successfully committed")) }, + { I("rtm_retired.start", 0xc9, 0x1, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of times an RTM execution started")) }, + { I("tx_exec.misc2", 0x5d, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts the number of times a class of instructions that may cause a" + " transactional abort was executed inside a transactional region")) }, + { I("tx_exec.misc3", 0x5d, 0x4, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of times an instruction execution caused the transactional nest" + " count supported to be exceeded")) }, + { I("tx_mem.abort_capacity_read", 0x54, 0x80, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Speculatively counts the number of TSX aborts due to a data capacity" + " limitation for transactional reads")) }, + { I("tx_mem.abort_capacity_write", 0x54, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Speculatively counts the number of TSX aborts due to a data capacity" + " limitation for transactional writes")) }, + { I("tx_mem.abort_conflict", 0x54, 0x1, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of times a transactional abort was signaled due to a data" + " conflict on a transactionally accessed address")) }, +/* other: */ + { I("core_power.lvl0_turbo_license", 0x28, 0x7, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Core cycles where the core was running in a manner where Turbo may be" + " clipped to the Non-AVX turbo schedule")) }, + { I("core_power.lvl1_turbo_license", 0x28, 0x18, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Core cycles where the core was running in a manner where Turbo may be" + " clipped to the AVX2 turbo schedule")) }, + { I("core_power.lvl2_turbo_license", 0x28, 0x20, 0, 0, 0, 0, 0, 0, 0x30d43, + STXT("Core cycles where the core was running in a manner where Turbo may be" + " clipped to the AVX512 turbo schedule")) }, + { I("core_snoop_response.i_fwd_fe", 0xef, 0x20, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Hit snoop reply with data, line invalidated")) }, + { I("core_snoop_response.i_fwd_m", 0xef, 0x10, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("HitM snoop reply with data, line invalidated")) }, + { I("core_snoop_response.i_hit_fse", 0xef, 0x2, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Hit snoop reply without sending the data, line invalidated")) }, + { I("core_snoop_response.miss", 0xef, 0x1, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Line not found snoop reply")) }, + { I("core_snoop_response.s_fwd_fe", 0xef, 0x40, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Hit snoop reply with data, line kept in Shared state")) }, + { I("core_snoop_response.s_fwd_m", 0xef, 0x8, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("HitM snoop reply with data, line kept in Shared state")) }, + { I("core_snoop_response.s_hit_fse", 0xef, 0x4, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Hit snoop reply without sending the data, line kept in Shared state")) }, + { I("ocr.demand_code_rd.any_response", 0xb7, 0x1, 0, 0, 0, 0x10004, 0, 0, 0x186a3, + STXT("Counts demand instruction fetches and L1 instruction cache prefetches" + " that have any type of response")) }, + { I("ocr.demand_code_rd.dram", 0xb7, 0x1, 0, 0, 0, 0x73c000004, 0, 0, 0x186a3, + STXT("Counts demand instruction fetches and L1 instruction cache prefetches" + " that were supplied by DRAM")) }, + { I("ocr.demand_code_rd.local_dram", 0xb7, 0x1, 0, 0, 0, 0x104000004, 0, 0, 0x186a3, + STXT("Counts demand instruction fetches and L1 instruction cache prefetches" + " that were supplied by DRAM attached to this socket, unless in Sub NUMA" + " Cluster(SNC) Mode. In SNC Mode counts only those DRAM accesses that" + " are controlled by the close SNC Cluster")) }, + { I("ocr.demand_code_rd.snc_dram", 0xb7, 0x1, 0, 0, 0, 0x708000004, 0, 0, 0x186a3, + STXT("Counts demand instruction fetches and L1 instruction cache prefetches" + " that were supplied by DRAM on a distant memory controller of this" + " socket when the system is in SNC (sub-NUMA cluster) mode")) }, + { I("ocr.demand_data_rd.any_response", 0xb7, 0x1, 0, 0, 0, 0x10001, 0, 0, 0x186a3, + STXT("Counts demand data reads that have any type of response")) }, + { I("ocr.demand_data_rd.dram", 0xb7, 0x1, 0, 0, 0, 0x73c000001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were supplied by DRAM")) }, + { I("ocr.demand_data_rd.local_dram", 0xb7, 0x1, 0, 0, 0, 0x104000001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were supplied by DRAM attached to this" + " socket, unless in Sub NUMA Cluster(SNC) Mode. In SNC Mode counts only" + " those DRAM accesses that are controlled by the close SNC Cluster")) }, + { I("ocr.demand_data_rd.local_pmm", 0xb7, 0x1, 0, 0, 0, 0x100400001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were supplied by PMM attached to this" + " socket, unless in Sub NUMA Cluster(SNC) Mode. In SNC Mode counts only" + " those PMM accesses that are controlled by the close SNC Cluster")) }, + { I("ocr.demand_data_rd.pmm", 0xb7, 0x1, 0, 0, 0, 0x703c00001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were supplied by PMM")) }, + { I("ocr.demand_data_rd.remote_dram", 0xb7, 0x1, 0, 0, 0, 0x730000001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were supplied by DRAM attached to" + " another socket")) }, + { I("ocr.demand_data_rd.remote_pmm", 0xb7, 0x1, 0, 0, 0, 0x703000001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were supplied by PMM attached to another" + " socket")) }, + { I("ocr.demand_data_rd.snc_dram", 0xb7, 0x1, 0, 0, 0, 0x708000001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were supplied by DRAM on a distant" + " memory controller of this socket when the system is in SNC (sub-NUMA" + " cluster) mode")) }, + { I("ocr.demand_data_rd.snc_pmm", 0xb7, 0x1, 0, 0, 0, 0x700800001, 0, 0, 0x186a3, + STXT("Counts demand data reads that were supplied by PMM on a distant memory" + " controller of this socket when the system is in SNC (sub-NUMA cluster)" + " mode")) }, + { I("ocr.demand_rfo.any_response", 0xb7, 0x1, 0, 0, 0, 0x3f3ffc0002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that have any type of" + " response")) }, + { I("ocr.demand_rfo.dram", 0xb7, 0x1, 0, 0, 0, 0x73c000002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that were supplied by" + " DRAM")) }, + { I("ocr.demand_rfo.local_dram", 0xb7, 0x1, 0, 0, 0, 0x104000002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that were supplied by" + " DRAM attached to this socket, unless in Sub NUMA Cluster(SNC) Mode. In" + " SNC Mode counts only those DRAM accesses that are controlled by the" + " close SNC Cluster")) }, + { I("ocr.demand_rfo.local_pmm", 0xb7, 0x1, 0, 0, 0, 0x100400002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that were supplied by" + " PMM attached to this socket, unless in Sub NUMA Cluster(SNC) Mode. In" + " SNC Mode counts only those PMM accesses that are controlled by the" + " close SNC Cluster")) }, + { I("ocr.demand_rfo.pmm", 0xb7, 0x1, 0, 0, 0, 0x703c00002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that were supplied by" + " PMM")) }, + { I("ocr.demand_rfo.remote_pmm", 0xb7, 0x1, 0, 0, 0, 0x703000002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that were supplied by" + " PMM attached to another socket")) }, + { I("ocr.demand_rfo.snc_dram", 0xb7, 0x1, 0, 0, 0, 0x708000002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that were supplied by" + " DRAM on a distant memory controller of this socket when the system is" + " in SNC (sub-NUMA cluster) mode")) }, + { I("ocr.demand_rfo.snc_pmm", 0xb7, 0x1, 0, 0, 0, 0x700800002, 0, 0, 0x186a3, + STXT("Counts demand reads for ownership (RFO) requests and software" + " prefetches for exclusive ownership (PREFETCHW) that were supplied by" + " PMM on a distant memory controller of this socket when the system is" + " in SNC (sub-NUMA cluster) mode")) }, + { I("ocr.hwpf_l1d_and_swpf.dram", 0xb7, 0x1, 0, 0, 0, 0x73c000400, 0, 0, 0x186a3, + STXT("Counts L1 data cache prefetch requests and software prefetches (except" + " PREFETCHW) that were supplied by DRAM")) }, + { I("ocr.hwpf_l1d_and_swpf.local_dram", 0xb7, 0x1, 0, 0, 0, 0x104000400, 0, 0, 0x186a3, + STXT("Counts L1 data cache prefetch requests and software prefetches (except" + " PREFETCHW) that were supplied by DRAM attached to this socket, unless" + " in Sub NUMA Cluster(SNC) Mode. In SNC Mode counts only those DRAM" + " accesses that are controlled by the close SNC Cluster")) }, + { I("ocr.hwpf_l2.any_response", 0xb7, 0x1, 0, 0, 0, 0x10070, 0, 0, 0x186a3, + STXT("Counts hardware prefetch (which bring data to L2) that have any type" + " of response")) }, + { I("ocr.hwpf_l3.any_response", 0xb7, 0x1, 0, 0, 0, 0x12380, 0, 0, 0x186a3, + STXT("Counts hardware prefetches to the L3 only that have any type of" + " response")) }, + { I("ocr.hwpf_l3.remote", 0xb7, 0x1, 0, 0, 0, 0x90002380, 0, 0, 0x186a3, + STXT("Counts hardware prefetches to the L3 only that were not supplied by" + " the local socket's L1, L2, or L3 caches and the cacheline was homed in" + " a remote socket")) }, + { I("ocr.itom.remote", 0xb7, 0x1, 0, 0, 0, 0x90000002, 0, 0, 0x186a3, + STXT("Counts full cacheline writes (ItoM) that were not supplied by the" + " local socket's L1, L2, or L3 caches and the cacheline was homed in a" + " remote socket")) }, + { I("ocr.other.any_response", 0xb7, 0x1, 0, 0, 0, 0x18000, 0, 0, 0x186a3, + STXT("Counts miscellaneous requests, such as I/O and un-cacheable accesses" + " that have any type of response")) }, + { I("ocr.reads_to_core.any_response", 0xb7, 0x1, 0, 0, 0, 0x3f3ffc0477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that have any" + " type of response")) }, + { I("ocr.reads_to_core.dram", 0xb7, 0x1, 0, 0, 0, 0x73c000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by DRAM")) }, + { I("ocr.reads_to_core.local_dram", 0xb7, 0x1, 0, 0, 0, 0x104000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by DRAM attached to this socket, unless in Sub NUMA" + " Cluster(SNC) Mode. In SNC Mode counts only those DRAM accesses that" + " are controlled by the close SNC Cluster")) }, + { I("ocr.reads_to_core.local_pmm", 0xb7, 0x1, 0, 0, 0, 0x100400477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by PMM attached to this socket, unless in Sub NUMA" + " Cluster(SNC) Mode. In SNC Mode counts only those PMM accesses that are" + " controlled by the close SNC Cluster")) }, + { I("ocr.reads_to_core.local_socket_dram", 0xb7, 0x1, 0, 0, 0, 0x70c000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by DRAM attached to this socket, whether or not in Sub NUMA" + " Cluster(SNC) Mode. In SNC Mode counts DRAM accesses that are" + " controlled by the close or distant SNC Cluster")) }, + { I("ocr.reads_to_core.local_socket_pmm", 0xb7, 0x1, 0, 0, 0, 0x700c00477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by PMM attached to this socket, whether or not in Sub NUMA" + " Cluster(SNC) Mode. In SNC Mode counts PMM accesses that are controlled" + " by the close or distant SNC Cluster")) }, + { I("ocr.reads_to_core.remote", 0xb7, 0x1, 0, 0, 0, 0x3f33000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were not" + " supplied by the local socket's L1, L2, or L3 caches and were supplied" + " by a remote socket")) }, + { I("ocr.reads_to_core.remote_dram", 0xb7, 0x1, 0, 0, 0, 0x730000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by DRAM attached to another socket")) }, + { I("ocr.reads_to_core.remote_memory", 0xb7, 0x1, 0, 0, 0, 0x731800477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by DRAM or PMM attached to another socket")) }, + { I("ocr.reads_to_core.remote_pmm", 0xb7, 0x1, 0, 0, 0, 0x703000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by PMM attached to another socket")) }, + { I("ocr.reads_to_core.snc_dram", 0xb7, 0x1, 0, 0, 0, 0x708000477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by DRAM on a distant memory controller of this socket when" + " the system is in SNC (sub-NUMA cluster) mode")) }, + { I("ocr.reads_to_core.snc_pmm", 0xb7, 0x1, 0, 0, 0, 0x700800477, 0, 0, 0x186a3, + STXT("Counts all (cacheable) data read, code read and RFO requests including" + " demands and prefetches to the core caches (L1 or L2) that were" + " supplied by PMM on a distant memory controller of this socket when the" + " system is in SNC (sub-NUMA cluster) mode")) }, + { I("ocr.streaming_wr.any_response", 0xb7, 0x1, 0, 0, 0, 0x10800, 0, 0, 0x186a3, + STXT("Counts streaming stores that have any type of response")) }, + { I("ocr.write_estimate.memory", 0xb7, 0x1, 0, 0, 0, 0xfbff80822, 0, 0, 0x186a3, + STXT("Counts Demand RFOs, ItoM's, PREFECTHW's, Hardware RFO Prefetches to" + " the L1/L2 and Streaming stores that likely resulted in a store to" + " Memory (DRAM or PMM)")) }, +/* pipeline: */ + { I("arith.divider_active", 0x14, 0x9, 0, 0x1, 0, 0, 0, 0, 0xf4243, + STXT("Cycles when divide unit is busy executing divide or square root" + " operations")) }, + { I("assists.any", 0xc1, 0x7, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of occurrences where a microcode assist is invoked by hardware")) }, + { I("br_inst_retired.all_branches", 0xc4, 0, 0, 0, 0, 0, 0, 0, 0x61a89, + STXT("All branch instructions retired (Precise event)")) }, + { I("br_inst_retired.cond", 0xc4, 0x11, 0, 0, 0, 0, 0, 0, 0x61a89, + STXT("Conditional branch instructions retired (Precise event)")) }, + { I("br_inst_retired.cond_ntaken", 0xc4, 0x10, 0, 0, 0, 0, 0, 0, 0x61a89, + STXT("Not taken branch instructions retired (Precise event)")) }, + { I("br_inst_retired.cond_taken", 0xc4, 0x1, 0, 0, 0, 0, 0, 0, 0x61a89, + STXT("Taken conditional branch instructions retired (Precise event)")) }, + { I("br_inst_retired.far_branch", 0xc4, 0x40, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("Far branch instructions retired (Precise event)")) }, + { I("br_inst_retired.indirect", 0xc4, 0x80, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Indirect near branch instructions retired (excluding returns) (Precise" + " event)")) }, + { I("br_inst_retired.near_call", 0xc4, 0x2, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("Direct and indirect near call instructions retired (Precise event)")) }, + { I("br_inst_retired.near_return", 0xc4, 0x8, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("Return instructions retired (Precise event)")) }, + { I("br_inst_retired.near_taken", 0xc4, 0x20, 0, 0, 0, 0, 0, 0, 0x61a89, + STXT("Taken branch instructions retired (Precise event)")) }, + { I("br_misp_retired.all_branches", 0xc5, 0, 0, 0, 0, 0, 0, 0, 0xc365, + STXT("All mispredicted branch instructions retired (Precise event)")) }, + { I("br_misp_retired.cond", 0xc5, 0x11, 0, 0, 0, 0, 0, 0, 0xc365, + STXT("Mispredicted conditional branch instructions retired (Precise event)")) }, + { I("br_misp_retired.cond_ntaken", 0xc5, 0x10, 0, 0, 0, 0, 0, 0, 0xc365, + STXT("Mispredicted non-taken conditional branch instructions retired" + " (Precise event)")) }, + { I("br_misp_retired.cond_taken", 0xc5, 0x1, 0, 0, 0, 0, 0, 0, 0xc365, + STXT("number of branch instructions retired that were mispredicted and taken" + " (Precise event)")) }, + { I("br_misp_retired.indirect", 0xc5, 0x80, 0, 0, 0, 0, 0, 0, 0xc365, + STXT("All miss-predicted indirect branch instructions retired (excluding" + " RETs. TSX aborts is considered indirect branch) (Precise event)")) }, + { I("br_misp_retired.indirect_call", 0xc5, 0x2, 0, 0, 0, 0, 0, 0, 0xc365, + STXT("Mispredicted indirect CALL instructions retired (Precise event)")) }, + { I("br_misp_retired.near_taken", 0xc5, 0x20, 0, 0, 0, 0, 0, 0, 0xc365, + STXT("Number of near branch instructions retired that were mispredicted and" + " taken (Precise event)")) }, + { I("br_misp_retired.ret", 0xc5, 0x8, 0, 0, 0, 0, 0, 0, 0xc365, + STXT("This event counts the number of mispredicted ret instructions retired." + " Non PEBS (Precise event)")) }, + { I("cpu_clk_unhalted.distributed", 0xec, 0x2, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Cycle counts are evenly distributed between active threads in the Core")) }, + { I("cpu_clk_unhalted.one_thread_active", 0x3c, 0x2, 0, 0, 0, 0, 0, 0, 0x61ab, + STXT("Core crystal clock cycles when this thread is unhalted and the other" + " thread is halted")) }, + { I("cpu_clk_unhalted.ref_distributed", 0x3c, 0x8, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Core crystal clock cycles. Cycle counts are evenly distributed between" + " active threads in the Core")) }, + { I("cpu_clk_unhalted.ref_tsc", 0, 0x3, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Reference cycles when the core is not in halt state")) }, + { I("cpu_clk_unhalted.ref_xclk", 0x3c, 0x1, 0, 0, 0, 0, 0, 0, 0x61ab, + STXT("Core crystal clock cycles when the thread is unhalted")) }, + { I("cpu_clk_unhalted.thread", 0x3c, 0, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Core cycles when the thread is not in halt state")) }, + { I("cpu_clk_unhalted.thread_p", 0x3c, 0, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Thread cycles when thread is not in halt state")) }, + { I("cycle_activity.cycles_l1d_miss", 0xa3, 0x8, 0, 0x8, 0, 0, 0, 0, 0xf4243, + STXT("Cycles while L1 cache miss demand load is outstanding")) }, + { I("cycle_activity.cycles_l2_miss", 0xa3, 0x1, 0, 0x1, 0, 0, 0, 0, 0xf4243, + STXT("Cycles while L2 cache miss demand load is outstanding")) }, + { I("cycle_activity.cycles_mem_any", 0xa3, 0x10, 0, 0x10, 0, 0, 0, 0, 0xf4243, + STXT("Cycles while memory subsystem has an outstanding load")) }, + { I("cycle_activity.stalls_l1d_miss", 0xa3, 0xc, 0, 0xc, 0, 0, 0, 0, 0xf4243, + STXT("Execution stalls while L1 cache miss demand load is outstanding")) }, + { I("cycle_activity.stalls_l2_miss", 0xa3, 0x5, 0, 0x5, 0, 0, 0, 0, 0xf4243, + STXT("Execution stalls while L2 cache miss demand load is outstanding")) }, + { I("cycle_activity.stalls_mem_any", 0xa3, 0x14, 0, 0x14, 0, 0, 0, 0, 0xf4243, + STXT("Execution stalls while memory subsystem has an outstanding load")) }, + { I("cycle_activity.stalls_total", 0xa3, 0x4, 0, 0x4, 0, 0, 0, 0, 0xf4243, + STXT("Total execution stalls")) }, + { I("exe_activity.1_ports_util", 0xa6, 0x2, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles total of 1 uop is executed on all ports and Reservation Station" + " was not empty")) }, + { I("exe_activity.2_ports_util", 0xa6, 0x4, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles total of 2 uops are executed on all ports and Reservation" + " Station was not empty")) }, + { I("exe_activity.3_ports_util", 0xa6, 0x8, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles total of 3 uops are executed on all ports and Reservation" + " Station was not empty")) }, + { I("exe_activity.4_ports_util", 0xa6, 0x10, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles total of 4 uops are executed on all ports and Reservation" + " Station was not empty")) }, + { I("exe_activity.bound_on_stores", 0xa6, 0x40, 0, 0x2, 0, 0, 0, 0, 0xf4243, + STXT("Cycles where the Store Buffer was full and no loads caused an" + " execution stall")) }, + { I("ild_stall.lcp", 0x87, 0x1, 0, 0, 0, 0, 0, 0, 0x7a129, + STXT("Stalls caused by changing prefix length of the instruction. [This" + " event is alias to DECODE.LCP]")) }, + { I("inst_decoded.decoders", 0x55, 0x1, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Instruction decoders utilized in a cycle")) }, + { I("inst_retired.any", 0xc0, 0, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Number of instructions retired. Fixed Counter - architectural event" + " (Precise event)")) }, + { I("inst_retired.any_p", 0xc0, 0, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Number of instructions retired. General Counter - architectural event" + " (Precise event)")) }, + { I("inst_retired.nop", 0xc0, 0x2, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Number of all retired NOP instructions (Precise event)")) }, + { I("inst_retired.prec_dist", 0, 0x1, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Precise instruction retired event with a reduced effect of PEBS shadow" + " in IP distribution (Precise event)")) }, + { I("int_misc.all_recovery_cycles", 0xd, 0x3, 0, 0x1, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles the Backend cluster is recovering after a miss-speculation or a" + " Store Buffer or Load Buffer drain stall")) }, + { I("int_misc.clear_resteer_cycles", 0xd, 0x80, 0, 0, 0, 0, 0, 0, 0x7a129, + STXT("Counts cycles after recovery from a branch misprediction or machine" + " clear till the first uop is issued from the resteered path")) }, + { I("int_misc.clears_count", 0xd, 0x1, 0x1, 0x1, 0, 0, 0, 0, 0x7a129, + STXT("Clears speculative count")) }, + { I("int_misc.recovery_cycles", 0xd, 0x1, 0, 0, 0, 0, 0, 0, 0x7a129, + STXT("Core cycles the allocator was stalled due to recovery from earlier" + " clear event for this thread")) }, + { I("int_misc.uop_dropping", 0xd, 0x10, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("TMA slots where uops got dropped")) }, + { I("ld_blocks.no_sr", 0x3, 0x8, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("The number of times that split load operations are temporarily blocked" + " because all resources for handling the split accesses are in use")) }, + { I("ld_blocks.store_forward", 0x3, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Loads blocked due to overlapping with a preceding store that cannot be" + " forwarded")) }, + { I("ld_blocks_partial.address_alias", 0x7, 0x1, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("False dependencies due to partial compare on address")) }, + { I("load_hit_prefetch.swpf", 0x4c, 0x1, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts the number of demand load dispatches that hit L1D fill buffer" + " (FB) allocated for software prefetch")) }, + { I("lsd.cycles_active", 0xa8, 0x1, 0, 0x1, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles Uops delivered by the LSD, but didn't come from the decoder")) }, + { I("lsd.cycles_ok", 0xa8, 0x1, 0, 0x5, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles optimal number of Uops delivered by the LSD, but did not come" + " from the decoder")) }, + { I("lsd.uops", 0xa8, 0x1, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Number of Uops delivered by the LSD")) }, + { I("machine_clears.count", 0xc3, 0x1, 0x1, 0x1, 0, 0, 0, 0, 0x186a3, + STXT("Number of machine clears (nukes) of any type")) }, + { I("machine_clears.smc", 0xc3, 0x4, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Self-modifying code (SMC) detected")) }, + { I("misc_retired.lbr_inserts", 0xcc, 0x20, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Increments whenever there is an update to the LBR array")) }, + { I("misc_retired.pause_inst", 0xcc, 0x40, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of retired PAUSE instructions. This event is not supported on" + " first SKL and KBL products")) }, + { I("resource_stalls.sb", 0xa2, 0x8, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Cycles stalled due to no store buffers available. (not including" + " draining form sync)")) }, + { I("resource_stalls.scoreboard", 0xa2, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Counts cycles where the pipeline is stalled due to serializing" + " operations")) }, + { I("rs_events.empty_cycles", 0x5e, 0x1, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Cycles when Reservation Station (RS) is empty for the thread")) }, + { I("rs_events.empty_end", 0x5e, 0x1, 0x1, 0x1, 0x1, 0, 0, 0, 0x186a3, + STXT("Counts end of periods where the Reservation Station (RS) was empty")) }, + { I("topdown.backend_bound_slots", 0xa4, 0x2, 0, 0, 0, 0, 0, 0, 0x989683, + STXT("TMA slots where no uops were being issued due to lack of back-end" + " resources")) }, + { I("topdown.slots", 0, 0x4, 0, 0, 0, 0, 0, 0, 0x989683, + STXT("TMA slots available for an unhalted logical processor. Fixed counter -" + " architectural event")) }, + { I("topdown.slots_p", 0xa4, 0x1, 0, 0, 0, 0, 0, 0, 0x989683, + STXT("TMA slots available for an unhalted logical processor. General counter" + " - architectural event")) }, + { I("uops_decoded.dec0", 0x56, 0x1, 0, 0, 0, 0, 0, 0, 0xf4243, + STXT("Number of uops decoded out of instructions exclusively fetched by" + " decoder 0")) }, + { I("uops_dispatched.port_0", 0xa1, 0x1, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Number of uops executed on port 0")) }, + { I("uops_dispatched.port_1", 0xa1, 0x2, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Number of uops executed on port 1")) }, + { I("uops_dispatched.port_2_3", 0xa1, 0x4, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Number of uops executed on port 2 and 3")) }, + { I("uops_dispatched.port_4_9", 0xa1, 0x10, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Number of uops executed on port 4 and 9")) }, + { I("uops_dispatched.port_5", 0xa1, 0x20, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Number of uops executed on port 5")) }, + { I("uops_dispatched.port_6", 0xa1, 0x40, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Number of uops executed on port 6")) }, + { I("uops_dispatched.port_7_8", 0xa1, 0x80, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Number of uops executed on port 7 and 8")) }, + { I("uops_executed.core_cycles_ge_1", 0xb1, 0x2, 0, 0x1, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles at least 1 micro-op is executed from any thread on physical" + " core")) }, + { I("uops_executed.core_cycles_ge_2", 0xb1, 0x2, 0, 0x2, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles at least 2 micro-op is executed from any thread on physical" + " core")) }, + { I("uops_executed.core_cycles_ge_3", 0xb1, 0x2, 0, 0x3, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles at least 3 micro-op is executed from any thread on physical" + " core")) }, + { I("uops_executed.core_cycles_ge_4", 0xb1, 0x2, 0, 0x4, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles at least 4 micro-op is executed from any thread on physical" + " core")) }, + { I("uops_executed.cycles_ge_1", 0xb1, 0x1, 0, 0x1, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles where at least 1 uop was executed per-thread")) }, + { I("uops_executed.cycles_ge_2", 0xb1, 0x1, 0, 0x2, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles where at least 2 uops were executed per-thread")) }, + { I("uops_executed.cycles_ge_3", 0xb1, 0x1, 0, 0x3, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles where at least 3 uops were executed per-thread")) }, + { I("uops_executed.cycles_ge_4", 0xb1, 0x1, 0, 0x4, 0, 0, 0, 0, 0x1e8483, + STXT("Cycles where at least 4 uops were executed per-thread")) }, + { I("uops_executed.stall_cycles", 0xb1, 0x1, 0, 0x1, 0x1, 0, 0, 0, 0x1e8483, + STXT("Counts number of cycles no uops were dispatched to be executed on this" + " thread")) }, + { I("uops_executed.thread", 0xb1, 0x1, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Counts the number of uops to be executed per-thread each cycle")) }, + { I("uops_executed.x87", 0xb1, 0x10, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Counts the number of x87 uops dispatched")) }, + { I("uops_issued.any", 0xe, 0x1, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Uops that RAT issues to RS")) }, + { I("uops_issued.stall_cycles", 0xe, 0x1, 0, 0x1, 0x1, 0, 0, 0, 0xf4243, + STXT("Cycles when RAT does not issue Uops to RS for the thread")) }, + { I("uops_issued.vector_width_mismatch", 0xe, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Uops inserted at issue-stage in order to preserve upper bits of vector" + " registers")) }, + { I("uops_retired.slots", 0xc2, 0x2, 0, 0, 0, 0, 0, 0, 0x1e8483, + STXT("Retirement slots used")) }, + { I("uops_retired.stall_cycles", 0xc2, 0x2, 0, 0x1, 0x1, 0, 0, 0, 0xf4243, + STXT("Cycles without actually retired uops")) }, + { I("uops_retired.total_cycles", 0xc2, 0x2, 0, 0xa, 0x1, 0, 0, 0, 0xf4243, + STXT("Cycles with less than 10 actually retired uops")) }, +/* virtual memory: */ + { I("dtlb_load_misses.stlb_hit", 0x8, 0x20, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Loads that miss the DTLB and hit the STLB")) }, + { I("dtlb_load_misses.walk_active", 0x8, 0x10, 0, 0x1, 0, 0, 0, 0, 0x186a3, + STXT("Cycles when at least one PMH is busy with a page walk for a demand" + " load")) }, + { I("dtlb_load_misses.walk_completed", 0x8, 0xe, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Load miss in all TLB levels causes a page walk that completes. (All" + " page sizes)")) }, + { I("dtlb_load_misses.walk_completed_1g", 0x8, 0x8, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Page walks completed due to a demand data load to a 1G page")) }, + { I("dtlb_load_misses.walk_completed_2m_4m", 0x8, 0x4, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Page walks completed due to a demand data load to a 2M/4M page")) }, + { I("dtlb_load_misses.walk_completed_4k", 0x8, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Page walks completed due to a demand data load to a 4K page")) }, + { I("dtlb_load_misses.walk_pending", 0x8, 0x10, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of page walks outstanding for a demand load in the PMH each" + " cycle")) }, + { I("dtlb_store_misses.stlb_hit", 0x49, 0x20, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Stores that miss the DTLB and hit the STLB")) }, + { I("dtlb_store_misses.walk_active", 0x49, 0x10, 0, 0x1, 0, 0, 0, 0, 0x186a3, + STXT("Cycles when at least one PMH is busy with a page walk for a store")) }, + { I("dtlb_store_misses.walk_completed", 0x49, 0xe, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Store misses in all TLB levels causes a page walk that completes. (All" + " page sizes)")) }, + { I("dtlb_store_misses.walk_completed_1g", 0x49, 0x8, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Page walks completed due to a demand data store to a 1G page")) }, + { I("dtlb_store_misses.walk_completed_2m_4m", 0x49, 0x4, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Page walks completed due to a demand data store to a 2M/4M page")) }, + { I("dtlb_store_misses.walk_completed_4k", 0x49, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Page walks completed due to a demand data store to a 4K page")) }, + { I("dtlb_store_misses.walk_pending", 0x49, 0x10, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of page walks outstanding for a store in the PMH each cycle")) }, + { I("itlb_misses.stlb_hit", 0x85, 0x20, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Instruction fetch requests that miss the ITLB and hit the STLB")) }, + { I("itlb_misses.walk_active", 0x85, 0x10, 0, 0x1, 0, 0, 0, 0, 0x186a3, + STXT("Cycles when at least one PMH is busy with a page walk for code" + " (instruction fetch) request")) }, + { I("itlb_misses.walk_completed", 0x85, 0xe, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Code miss in all TLB levels causes a page walk that completes. (All" + " page sizes)")) }, + { I("itlb_misses.walk_completed_2m_4m", 0x85, 0x4, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Code miss in all TLB levels causes a page walk that completes. (2M/4M)")) }, + { I("itlb_misses.walk_completed_4k", 0x85, 0x2, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Code miss in all TLB levels causes a page walk that completes. (4K)")) }, + { I("itlb_misses.walk_pending", 0x85, 0x10, 0, 0, 0, 0, 0, 0, 0x186a3, + STXT("Number of page walks outstanding for an outstanding code request in" + " the PMH each cycle")) }, + { I("tlb_flush.dtlb_thread", 0xbd, 0x1, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("DTLB flush attempts of the thread-specific entries")) }, + { I("tlb_flush.stlb_any", 0xbd, 0x20, 0, 0, 0, 0, 0, 0, 0x186a7, + STXT("STLB flush attempts")) }, + { NULL, NULL, 0, NULL } +}; + +#undef SH +#undef I +#endif |