Module Name: src Committed By: martin Date: Tue Aug 1 17:34:33 UTC 2023
Modified Files: src/sys/dev/tprof [netbsd-9]: tprof.c tprof_x86_amd.c tprof_x86_intel.c src/usr.sbin/tprof [netbsd-9]: tprof.8 tprof_analyze.c src/usr.sbin/tprof/arch [netbsd-9]: tprof_x86.c Log Message: Pull up the following revisions, requested by msaitoh in ticket #1697: usr.sbin/tprof/tprof.8 1.16,1.22,1.25,1.29 via patch usr.sbin/tprof/tprof_analyze.c 1.4 usr.sbin/tprof/arch/tprof_x86.c 1.13-1.19 sys/dev/tprof/tprof.c 1.23 via patch sys/dev/tprof/tprof_x86_amd.c 1.7-1.8 via patch sys/dev/tprof/tprof_x86_intel.c 1.8 via patch - Add AMD family 19h (zen3 and zen4) support. - Add Intel Comet Lake support. - Add support for Intel Skylake-X and Cascade Lake. - Print the path that we failed to open on error. - Use lowercase consistently for hexadecimal numbers. - KNF To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.14.6.1 src/sys/dev/tprof/tprof.c cvs rdiff -u -r1.4.2.1 -r1.4.2.2 src/sys/dev/tprof/tprof_x86_amd.c cvs rdiff -u -r1.3.2.1 -r1.3.2.2 src/sys/dev/tprof/tprof_x86_intel.c cvs rdiff -u -r1.14.2.1 -r1.14.2.2 src/usr.sbin/tprof/tprof.8 cvs rdiff -u -r1.3 -r1.3.6.1 src/usr.sbin/tprof/tprof_analyze.c cvs rdiff -u -r1.8.4.2 -r1.8.4.3 src/usr.sbin/tprof/arch/tprof_x86.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/tprof/tprof.c diff -u src/sys/dev/tprof/tprof.c:1.14 src/sys/dev/tprof/tprof.c:1.14.6.1 --- src/sys/dev/tprof/tprof.c:1.14 Fri Jul 13 07:56:29 2018 +++ src/sys/dev/tprof/tprof.c Tue Aug 1 17:34:33 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: tprof.c,v 1.14 2018/07/13 07:56:29 maxv Exp $ */ +/* $NetBSD: tprof.c,v 1.14.6.1 2023/08/01 17:34:33 martin Exp $ */ /*- * Copyright (c)2008,2009,2010 YAMAMOTO Takashi, @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tprof.c,v 1.14 2018/07/13 07:56:29 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tprof.c,v 1.14.6.1 2023/08/01 17:34:33 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -178,7 +178,7 @@ tprof_worker(struct work *wk, void *dumm KASSERT(dummy == NULL); /* - * get a per cpu buffer. + * Get a per cpu buffer. */ buf = tprof_buf_refresh(); @@ -208,12 +208,11 @@ tprof_worker(struct work *wk, void *dumm tprof_stat.ts_dropbuf++; } mutex_exit(&tprof_lock); - if (buf) { + if (buf) tprof_buf_free(buf); - } - if (!shouldstop) { + + if (!shouldstop) callout_schedule(&c->c_callout, hz); - } } static void @@ -239,9 +238,9 @@ tprof_stop1(void) tprof_buf_t *old; old = tprof_buf_switch(c, NULL); - if (old != NULL) { + if (old != NULL) tprof_buf_free(old); - } + callout_destroy(&c->c_callout); } workqueue_destroy(tprof_wq); @@ -256,9 +255,8 @@ tprof_getinfo(struct tprof_info *info) memset(info, 0, sizeof(*info)); info->ti_version = TPROF_VERSION; - if ((tb = tprof_backend) != NULL) { + if ((tb = tprof_backend) != NULL) info->ti_ident = tb->tb_ops->tbo_ident(); - } } static int @@ -351,9 +349,9 @@ tprof_stop(void) mutex_enter(&tprof_lock); tprof_running = false; cv_broadcast(&tprof_reader_cv); - while (tprof_nworker > 0) { + while (tprof_nworker > 0) cv_wait(&tprof_cv, &tprof_lock); - } + mutex_exit(&tprof_lock); tprof_stop1(); @@ -451,9 +449,8 @@ tprof_backend_register(const char *name, { tprof_backend_t *tb; - if (vers != TPROF_BACKEND_VERSION) { + if (vers != TPROF_BACKEND_VERSION) return EINVAL; - } mutex_enter(&tprof_startstop_lock); tb = tprof_backend_lookup(name); @@ -504,9 +501,8 @@ tprof_backend_unregister(const char *nam return EBUSY; } #if 1 /* XXX for now */ - if (tprof_backend == tb) { + if (tprof_backend == tb) tprof_backend = NULL; - } #endif LIST_REMOVE(tb, tb_list); mutex_exit(&tprof_startstop_lock); @@ -522,9 +518,9 @@ static int tprof_open(dev_t dev, int flags, int type, struct lwp *l) { - if (minor(dev) != 0) { + if (minor(dev) != 0) return EXDEV; - } + mutex_enter(&tprof_lock); if (tprof_owner != NULL) { mutex_exit(&tprof_lock); @@ -566,7 +562,7 @@ tprof_read(dev_t dev, struct uio *uio, i mutex_enter(&tprof_reader_lock); while (uio->uio_resid > 0 && error == 0) { /* - * take the first buffer from the list. + * Take the first buffer from the list. */ mutex_enter(&tprof_lock); buf = STAILQ_FIRST(&tprof_list); @@ -588,7 +584,7 @@ tprof_read(dev_t dev, struct uio *uio, i mutex_exit(&tprof_lock); /* - * copy it out. + * Copy it out. */ bytes = MIN(buf->b_used * sizeof(tprof_sample_t) - tprof_reader_offset, uio->uio_resid); @@ -599,7 +595,7 @@ tprof_read(dev_t dev, struct uio *uio, i tprof_reader_offset += done; /* - * if we didn't consume the whole buffer, + * If we didn't consume the whole buffer, * put it back to the list. */ if (tprof_reader_offset < @@ -676,7 +672,7 @@ void tprofattach(int nunits) { - /* nothing */ + /* Nothing */ } MODULE(MODULE_CLASS_DRIVER, tprof, NULL); Index: src/sys/dev/tprof/tprof_x86_amd.c diff -u src/sys/dev/tprof/tprof_x86_amd.c:1.4.2.1 src/sys/dev/tprof/tprof_x86_amd.c:1.4.2.2 --- src/sys/dev/tprof/tprof_x86_amd.c:1.4.2.1 Sat Oct 12 14:34:45 2019 +++ src/sys/dev/tprof/tprof_x86_amd.c Tue Aug 1 17:34:33 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: tprof_x86_amd.c,v 1.4.2.1 2019/10/12 14:34:45 martin Exp $ */ +/* $NetBSD: tprof_x86_amd.c,v 1.4.2.2 2023/08/01 17:34:33 martin Exp $ */ /* * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -56,7 +56,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tprof_x86_amd.c,v 1.4.2.1 2019/10/12 14:34:45 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tprof_x86_amd.c,v 1.4.2.2 2023/08/01 17:34:33 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -166,7 +166,7 @@ tprof_amd_nmi(const struct trapframe *tf return 0; } - /* record a sample */ + /* Record a sample */ #if defined(__x86_64__) tfi.tfi_pc = tf->tf_rip; #else @@ -199,14 +199,14 @@ tprof_amd_ident(void) { struct cpu_info *ci = curcpu(); - if (cpu_vendor != CPUVENDOR_AMD) { + if (cpu_vendor != CPUVENDOR_AMD) return TPROF_IDENT_NONE; - } switch (CPUID_TO_FAMILY(ci->ci_signature)) { case 0x10: case 0x15: case 0x17: + case 0x19: return TPROF_IDENT_AMD_GENERIC; } @@ -218,9 +218,8 @@ tprof_amd_start(const tprof_param_t *par { uint64_t xc; - if (tprof_amd_ident() == TPROF_IDENT_NONE) { + if (tprof_amd_ident() == TPROF_IDENT_NONE) return ENOTSUP; - } KASSERT(amd_nmi_handle == NULL); amd_nmi_handle = nmi_establish(tprof_amd_nmi, NULL); Index: src/sys/dev/tprof/tprof_x86_intel.c diff -u src/sys/dev/tprof/tprof_x86_intel.c:1.3.2.1 src/sys/dev/tprof/tprof_x86_intel.c:1.3.2.2 --- src/sys/dev/tprof/tprof_x86_intel.c:1.3.2.1 Sat Oct 15 10:20:32 2022 +++ src/sys/dev/tprof/tprof_x86_intel.c Tue Aug 1 17:34:33 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: tprof_x86_intel.c,v 1.3.2.1 2022/10/15 10:20:32 martin Exp $ */ +/* $NetBSD: tprof_x86_intel.c,v 1.3.2.2 2023/08/01 17:34:33 martin Exp $ */ /* * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -56,7 +56,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tprof_x86_intel.c,v 1.3.2.1 2022/10/15 10:20:32 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tprof_x86_intel.c,v 1.3.2.2 2023/08/01 17:34:33 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -145,7 +145,7 @@ tprof_intel_nmi(const struct trapframe * return 0; } - /* record a sample */ + /* Record a sample */ #if defined(__x86_64__) tfi.tfi_pc = tf->tf_rip; #else @@ -154,10 +154,10 @@ tprof_intel_nmi(const struct trapframe * tfi.tfi_inkernel = tfi.tfi_pc >= VM_MIN_KERNEL_ADDRESS; tprof_sample(NULL, &tfi); - /* reset counter */ + /* Reset counter */ wrmsr(MSR_PERFCTR0, counter_reset_val); - /* unmask PMI */ + /* Unmask PMI */ pcint = lapic_readreg(LAPIC_LVT_PCINT); KASSERT((pcint & LAPIC_LVT_MASKED) != 0); lapic_writereg(LAPIC_LVT_PCINT, pcint & ~LAPIC_LVT_MASKED); @@ -183,20 +183,18 @@ tprof_intel_ident(void) { uint32_t descs[4]; - if (cpu_vendor != CPUVENDOR_INTEL) { + if (cpu_vendor != CPUVENDOR_INTEL) return TPROF_IDENT_NONE; - } - if (cpuid_level < 0x0A) { + if (cpuid_level < 0x0a) return TPROF_IDENT_NONE; - } - x86_cpuid(0x0A, descs); - if ((descs[0] & CPUID_PERF_VERSION) == 0) { + + x86_cpuid(0x0a, descs); + if ((descs[0] & CPUID_PERF_VERSION) == 0) return TPROF_IDENT_NONE; - } - if ((descs[0] & CPUID_PERF_NGPPC) == 0) { + + if ((descs[0] & CPUID_PERF_NGPPC) == 0) return TPROF_IDENT_NONE; - } counter_bitwidth = __SHIFTOUT(descs[0], CPUID_PERF_NBWGPPC); @@ -208,9 +206,8 @@ tprof_intel_start(const tprof_param_t *p { uint64_t xc; - if (tprof_intel_ident() == TPROF_IDENT_NONE) { + if (tprof_intel_ident() == TPROF_IDENT_NONE) return ENOTSUP; - } KASSERT(intel_nmi_handle == NULL); intel_nmi_handle = nmi_establish(tprof_intel_nmi, NULL); Index: src/usr.sbin/tprof/tprof.8 diff -u src/usr.sbin/tprof/tprof.8:1.14.2.1 src/usr.sbin/tprof/tprof.8:1.14.2.2 --- src/usr.sbin/tprof/tprof.8:1.14.2.1 Sat Oct 12 14:34:45 2019 +++ src/usr.sbin/tprof/tprof.8 Tue Aug 1 17:34:32 2023 @@ -1,4 +1,4 @@ -.\" $NetBSD: tprof.8,v 1.14.2.1 2019/10/12 14:34:45 martin Exp $ +.\" $NetBSD: tprof.8,v 1.14.2.2 2023/08/01 17:34:32 martin Exp $ .\" .\" Copyright (c)2011 YAMAMOTO Takashi, .\" All rights reserved. @@ -24,7 +24,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd October 11, 2019 +.Dd April 10, 2023 .Dt TPROF 8 .Os .Sh NAME @@ -37,7 +37,9 @@ .Sh DESCRIPTION The .Nm -tool can be used to monitor hardware events (PMCs) during the execution of +tool can be used to monitor hardware events +.Tn ( PMC Ns s ) +during the execution of certain commands. .Pp The @@ -48,7 +50,7 @@ keeps recording samples from the kernel and reports statistics to the standard error. .Pp The -.Nm tprof +.Xr tprof 4 pseudo driver and a suitable backend should be loaded beforehand. .Pp The @@ -134,9 +136,11 @@ x86 AMD Family 15h .It x86 AMD Family 17h .It +x86 AMD Family 19h +.It x86 Intel Generic (all Intel CPUs) .It -x86 Intel Skylake/Kabylake +x86 Intel Skylake, Kabylake and Cometlake .It x86 Intel Silvermont/Airmont .It @@ -148,7 +152,7 @@ x86 Intel Goldmont Plus The .Nm utility reports the following statistics about the activities of the -.Nm tprof +.Xr tprof 4 pseudo driver. .Bl -tag -width dropbuf_samples .It sample Index: src/usr.sbin/tprof/tprof_analyze.c diff -u src/usr.sbin/tprof/tprof_analyze.c:1.3 src/usr.sbin/tprof/tprof_analyze.c:1.3.6.1 --- src/usr.sbin/tprof/tprof_analyze.c:1.3 Sat Jul 14 07:54:04 2018 +++ src/usr.sbin/tprof/tprof_analyze.c Tue Aug 1 17:34:32 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: tprof_analyze.c,v 1.3 2018/07/14 07:54:04 maxv Exp $ */ +/* $NetBSD: tprof_analyze.c,v 1.3.6.1 2023/08/01 17:34:32 martin Exp $ */ /* * Copyright (c) 2010,2011,2012 YAMAMOTO Takashi, @@ -28,7 +28,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: tprof_analyze.c,v 1.3 2018/07/14 07:54:04 maxv Exp $"); +__RCSID("$NetBSD: tprof_analyze.c,v 1.3.6.1 2023/08/01 17:34:32 martin Exp $"); #endif /* not lint */ #include <assert.h> @@ -112,7 +112,7 @@ ksymload(void) fd = open(_PATH_KSYMS, O_RDONLY); if (fd == -1) { - err(EXIT_FAILURE, "open"); + err(EXIT_FAILURE, "open " _PATH_KSYMS); } if (elf_version(EV_CURRENT) == EV_NONE) { goto elffail; Index: src/usr.sbin/tprof/arch/tprof_x86.c diff -u src/usr.sbin/tprof/arch/tprof_x86.c:1.8.4.2 src/usr.sbin/tprof/arch/tprof_x86.c:1.8.4.3 --- src/usr.sbin/tprof/arch/tprof_x86.c:1.8.4.2 Sat Oct 15 10:20:32 2022 +++ src/usr.sbin/tprof/arch/tprof_x86.c Tue Aug 1 17:34:32 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: tprof_x86.c,v 1.8.4.2 2022/10/15 10:20:32 martin Exp $ */ +/* $NetBSD: tprof_x86.c,v 1.8.4.3 2023/08/01 17:34:32 martin Exp $ */ /* * Copyright (c) 2018-2019 The NetBSD Foundation, Inc. @@ -60,7 +60,8 @@ struct event_table { static struct event_table *cpuevents = NULL; -static void x86_cpuid(unsigned int *eax, unsigned int *ebx, +static void +x86_cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { asm volatile("cpuid" @@ -71,21 +72,21 @@ static void x86_cpuid(unsigned int *eax, : "0" (*eax), "2" (*ecx)); } -/* -------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------- */ /* * Intel Architectural Version 1. */ static struct name_to_event intel_arch1_names[] = { /* Event Name - Event Select - UMask */ - { "unhalted-core-cycles", 0x3C, 0x00, true }, - { "instruction-retired", 0xC0, 0x00, true }, - { "unhalted-reference-cycles", 0x3C, 0x01, true }, - { "llc-reference", 0x2E, 0x4F, true }, - { "llc-misses", 0x2E, 0x41, true }, - { "branch-instruction-retired", 0xC4, 0x00, true }, - { "branch-misses-retired", 0xC5, 0x00, true }, - { "topdown-slots", 0xA4, 0x01, true }, + { "unhalted-core-cycles", 0x3c, 0x00, true }, + { "instruction-retired", 0xc0, 0x00, true }, + { "unhalted-reference-cycles", 0x3c, 0x01, true }, + { "llc-reference", 0x2e, 0x4f, true }, + { "llc-misses", 0x2e, 0x41, true }, + { "branch-instruction-retired", 0xc4, 0x00, true }, + { "branch-misses-retired", 0xc5, 0x00, true }, + { "topdown-slots", 0xa4, 0x01, true }, }; static struct event_table intel_arch1 = { @@ -103,7 +104,7 @@ init_intel_arch1(void) struct event_table *table; size_t i; - eax = 0x0A; + eax = 0x0a; ebx = 0; ecx = 0; edx = 0; @@ -150,53 +151,53 @@ static struct name_to_event intel_silver { "PAGE_WALKS.D_SIDE_CYCLES", 0x05, 0x01, true }, { "PAGE_WALKS.I_SIDE_CYCLES", 0x05, 0x02, true }, { "PAGE_WALKS.WALKS", 0x05, 0x03, true }, - { "LONGEST_LAT_CACHE.MISS", 0x2E, 0x41, true }, - { "LONGEST_LAT_CACHE.REFERENCE", 0x2E, 0x4F, true }, + { "LONGEST_LAT_CACHE.MISS", 0x2e, 0x41, true }, + { "LONGEST_LAT_CACHE.REFERENCE", 0x2e, 0x4f, true }, { "L2_REJECT_XQ.ALL", 0x30, 0x00, true }, { "CORE_REJECT_L2Q.ALL", 0x31, 0x00, true }, - { "CPU_CLK_UNHALTED.CORE_P", 0x3C, 0x00, true }, - { "CPU_CLK_UNHALTED.REF_P", 0x3C, 0x01, true }, + { "CPU_CLK_UNHALTED.CORE_P", 0x3c, 0x00, true }, + { "CPU_CLK_UNHALTED.REF_P", 0x3c, 0x01, true }, { "ICACHE.HIT", 0x80, 0x01, true }, { "ICACHE.MISSES", 0x80, 0x02, true }, { "ICACHE.ACCESSES", 0x80, 0x03, true }, - { "OFFCORE_RESPONSE_0", 0xB7, 0x01, true }, - { "OFFCORE_RESPONSE_1", 0xB7, 0x02, true }, - { "INST_RETIRED.ANY_P", 0xC0, 0x00, true }, - { "UOPS_RETIRED.MS", 0xC2, 0x01, true }, - { "UOPS_RETIRED.ALL", 0xC2, 0x10, true }, - { "MACHINE_CLEARS.SMC", 0xC3, 0x01, true }, - { "MACHINE_CLEARS.MEMORY_ORDERING", 0xC3, 0x02, true }, - { "MACHINE_CLEARS.FP_ASSIST", 0xC3, 0x04, true }, - { "MACHINE_CLEARS.ALL", 0xC3, 0x08, true }, - { "BR_INST_RETIRED.ALL_BRANCHES", 0xC4, 0x00, true }, - { "BR_INST_RETIRED.JCC", 0xC4, 0x7E, true }, - { "BR_INST_RETIRED.FAR_BRANCH", 0xC4, 0xBF, true }, - { "BR_INST_RETIRED.NON_RETURN_IND", 0xC4, 0xEB, true }, - { "BR_INST_RETIRED.RETURN", 0xC4, 0xF7, true }, - { "BR_INST_RETIRED.CALL", 0xC4, 0xF9, true }, - { "BR_INST_RETIRED.IND_CALL", 0xC4, 0xFB, true }, - { "BR_INST_RETIRED.REL_CALL", 0xC4, 0xFD, true }, - { "BR_INST_RETIRED.TAKEN_JCC", 0xC4, 0xFE, true }, - { "BR_MISP_RETIRED.ALL_BRANCHES", 0xC5, 0x00, true }, - { "BR_MISP_RETIRED.JCC", 0xC5, 0x7E, true }, - { "BR_MISP_RETIRED.FAR", 0xC5, 0xBF, true }, - { "BR_MISP_RETIRED.NON_RETURN_IND", 0xC5, 0xEB, true }, - { "BR_MISP_RETIRED.RETURN", 0xC5, 0xF7, true }, - { "BR_MISP_RETIRED.CALL", 0xC5, 0xF9, true }, - { "BR_MISP_RETIRED.IND_CALL", 0xC5, 0xFB, true }, - { "BR_MISP_RETIRED.REL_CALL", 0xC5, 0xFD, true }, - { "BR_MISP_RETIRED.TAKEN_JCC", 0xC5, 0xFE, true }, - { "NO_ALLOC_CYCLES.ROB_FULL", 0xCA, 0x01, true }, - { "NO_ALLOC_CYCLES.RAT_STALL", 0xCA, 0x20, true }, - { "NO_ALLOC_CYCLES.ALL", 0xCA, 0x3F, true }, - { "NO_ALLOC_CYCLES.NOT_DELIVERED", 0xCA, 0x50, true }, - { "RS_FULL_STALL.MEC", 0xCB, 0x01, true }, - { "RS_FULL_STALL.ALL", 0xCB, 0x1F, true }, - { "CYCLES_DIV_BUSY.ANY", 0xCD, 0x01, true }, - { "BACLEARS.ALL", 0xE6, 0x01, true }, - { "BACLEARS.RETURN", 0xE6, 0x08, true }, - { "BACLEARS.COND", 0xE6, 0x10, true }, - { "MS_DECODED.MS_ENTRY", 0xE7, 0x01, true }, + { "OFFCORE_RESPONSE_0", 0xb7, 0x01, true }, + { "OFFCORE_RESPONSE_1", 0xb7, 0x02, true }, + { "INST_RETIRED.ANY_P", 0xc0, 0x00, true }, + { "UOPS_RETIRED.MS", 0xc2, 0x01, true }, + { "UOPS_RETIRED.ALL", 0xc2, 0x10, true }, + { "MACHINE_CLEARS.SMC", 0xc3, 0x01, true }, + { "MACHINE_CLEARS.MEMORY_ORDERING", 0xc3, 0x02, true }, + { "MACHINE_CLEARS.FP_ASSIST", 0xc3, 0x04, true }, + { "MACHINE_CLEARS.ALL", 0xc3, 0x08, true }, + { "BR_INST_RETIRED.ALL_BRANCHES", 0xc4, 0x00, true }, + { "BR_INST_RETIRED.JCC", 0xc4, 0x7e, true }, + { "BR_INST_RETIRED.FAR_BRANCH", 0xc4, 0xbf, true }, + { "BR_INST_RETIRED.NON_RETURN_IND", 0xc4, 0xeb, true }, + { "BR_INST_RETIRED.RETURN", 0xc4, 0xf7, true }, + { "BR_INST_RETIRED.CALL", 0xc4, 0xf9, true }, + { "BR_INST_RETIRED.IND_CALL", 0xc4, 0xfb, true }, + { "BR_INST_RETIRED.REL_CALL", 0xc4, 0xfd, true }, + { "BR_INST_RETIRED.TAKEN_JCC", 0xc4, 0xfe, true }, + { "BR_MISP_RETIRED.ALL_BRANCHES", 0xc5, 0x00, true }, + { "BR_MISP_RETIRED.JCC", 0xc5, 0x7e, true }, + { "BR_MISP_RETIRED.FAR", 0xc5, 0xbf, true }, + { "BR_MISP_RETIRED.NON_RETURN_IND", 0xc5, 0xeb, true }, + { "BR_MISP_RETIRED.RETURN", 0xc5, 0xf7, true }, + { "BR_MISP_RETIRED.CALL", 0xc5, 0xf9, true }, + { "BR_MISP_RETIRED.IND_CALL", 0xc5, 0xfb, true }, + { "BR_MISP_RETIRED.REL_CALL", 0xc5, 0xfd, true }, + { "BR_MISP_RETIRED.TAKEN_JCC", 0xc5, 0xfe, true }, + { "NO_ALLOC_CYCLES.ROB_FULL", 0xca, 0x01, true }, + { "NO_ALLOC_CYCLES.RAT_STALL", 0xca, 0x20, true }, + { "NO_ALLOC_CYCLES.ALL", 0xca, 0x3f, true }, + { "NO_ALLOC_CYCLES.NOT_DELIVERED", 0xca, 0x50, true }, + { "RS_FULL_STALL.MEC", 0xcb, 0x01, true }, + { "RS_FULL_STALL.ALL", 0xcb, 0x1f, true }, + { "CYCLES_DIV_BUSY.ANY", 0xcd, 0x01, true }, + { "BACLEARS.ALL", 0xe6, 0x01, true }, + { "BACLEARS.RETURN", 0xe6, 0x08, true }, + { "BACLEARS.COND", 0xe6, 0x10, true }, + { "MS_DECODED.MS_ENTRY", 0xe7, 0x01, true }, }; static struct event_table intel_silvermont_airmont = { @@ -226,15 +227,15 @@ static struct name_to_event intel_goldmo { "PAGE_WALKS.D_SIDE_CYCLES", 0x05, 0x01, true }, { "PAGE_WALKS.I_SIDE_CYCLES", 0x05, 0x02, true }, { "PAGE_WALKS.CYCLES", 0x05, 0x03, true }, - { "UOPS_ISSUED.ANY", 0x0E, 0x00, true }, + { "UOPS_ISSUED.ANY", 0x0e, 0x00, true }, { "MISALIGN_MEM_REF.LOAD_PAGE_SPLIT", 0x13, 0x02, true }, { "MISALIGN_MEM_REF.STORE_PAGE_SPLIT", 0x13, 0x04, true }, - { "LONGEST_LAT_CACHE.REFERENCE", 0x2E, 0x4F, true }, - { "LONGEST_LAT_CACHE.MISS", 0x2E, 0x41, true }, + { "LONGEST_LAT_CACHE.REFERENCE", 0x2e, 0x4f, true }, + { "LONGEST_LAT_CACHE.MISS", 0x2e, 0x41, true }, { "L2_REJECT_XQ.ALL", 0x30, 0x00, true }, { "CORE_REJECT_L2Q.ALL", 0x31, 0x00, true }, - { "CPU_CLK_UNHALTED.CORE_P", 0x3C, 0x00, true }, - { "CPU_CLK_UNHALTED.REF", 0x3C, 0x01, true }, + { "CPU_CLK_UNHALTED.CORE_P", 0x3c, 0x00, true }, + { "CPU_CLK_UNHALTED.REF", 0x3c, 0x01, true }, { "DL1.DIRTY_EVICTION", 0x51, 0x01, true }, { "ICACHE.HIT", 0x80, 0x01, true }, { "ICACHE.MISSES", 0x80, 0x02, true }, @@ -243,66 +244,66 @@ static struct name_to_event intel_goldmo { "FETCH_STALL.ALL", 0x86, 0x00, true }, { "FETCH_STALL.ITLB_FILL_PENDING_CYCLES", 0x86, 0x01, true }, { "FETCH_STALL.ICACHE_FILL_PENDING_CYCLES", 0x86, 0x02, true }, - { "UOPS_NOT_DELIVERED.ANY", 0x9C, 0x00, true }, - { "OFFCORE_RESPONSE.0", 0xB7, 0x01, true }, - { "OFFCORE_RESPONSE.1", 0xB7, 0x02, true }, - { "INST_RETIRED.ANY_P", 0xC0, 0x00, true }, - { "UOPS_RETIRED.ANY", 0xC2, 0x00, true }, - { "UOPS_RETIRED.MS", 0xC2, 0x01, true }, - { "UOPS_RETIRED.FPDIV", 0xC2, 0x08, true }, - { "UOPS_RETIRED.IDIV", 0xC2, 0x10, true }, - { "MACHINE_CLEARS.SMC", 0xC3, 0x01, true }, - { "MACHINE_CLEARS.MEMORY_ORDERING", 0xC3, 0x02, true }, - { "MACHINE_CLEARS.FP_ASSIST", 0xC3, 0x04, true }, - { "MACHINE_CLEARS.DISAMBIGUATION", 0xC3, 0x08, true }, - { "MACHINE_CLEARS.ALL", 0xC3, 0x00, true }, - { "BR_INST_RETIRED.ALL_BRANCHES", 0xC4, 0x00, true }, - { "BR_INST_RETIRED.JCC", 0xC4, 0x7E, true }, - { "BR_INST_RETIRED.ALL_TAKEN_BRANCHES", 0xC4, 0x80, true }, - { "BR_INST_RETIRED.TAKEN_JCC", 0xC4, 0xFE, true }, - { "BR_INST_RETIRED.CALL", 0xC4, 0xF9, true }, - { "BR_INST_RETIRED.REL_CALL", 0xC4, 0xFD, true }, - { "BR_INST_RETIRED.IND_CALL", 0xC4, 0xFB, true }, - { "BR_INST_RETIRED.RETURN", 0xC4, 0xF7, true }, - { "BR_INST_RETIRED.NON_RETURN_IND", 0xC4, 0xEB, true }, - { "BR_INST_RETIRED.FAR_BRANCH", 0xC4, 0xBF, true }, - { "BR_MISP_RETIRED.ALL_BRANCHES", 0xC5, 0x00, true }, - { "BR_MISP_RETIRED.JCC", 0xC5, 0x7E, true }, - { "BR_MISP_RETIRED.TAKEN_JCC", 0xC5, 0xFE, true }, - { "BR_MISP_RETIRED.IND_CALL", 0xC5, 0xFB, true }, - { "BR_MISP_RETIRED.RETURN", 0xC5, 0xF7, true }, - { "BR_MISP_RETIRED.NON_RETURN_IND", 0xC5, 0xEB, true }, - { "ISSUE_SLOTS_NOT_CONSUMED.RESOURCE_FULL", 0xCA, 0x01, true }, - { "ISSUE_SLOTS_NOT_CONSUMED.RECOVERY", 0xCA, 0x02, true }, - { "ISSUE_SLOTS_NOT_CONSUMED.ANY", 0xCA, 0x00, true }, - { "HW_INTERRUPTS.RECEIVED", 0xCB, 0x01, true }, - { "HW_INTERRUPTS.MASKED", 0xCB, 0x02, true }, - { "HW_INTERRUPTS.PENDING_AND_MASKED", 0xCB, 0x04, true }, - { "CYCLES_DIV_BUSY.ALL", 0xCD, 0x00, true }, - { "CYCLES_DIV_BUSY.IDIV", 0xCD, 0x01, true }, - { "CYCLES_DIV_BUSY.FPDIV", 0xCD, 0x02, true }, - { "MEM_UOPS_RETIRED.ALL_LOADS", 0xD0, 0x81, true }, - { "MEM_UOPS_RETIRED.ALL_STORES", 0xD0, 0x82, true }, - { "MEM_UOPS_RETIRED.ALL", 0xD0, 0x83, true }, - { "MEM_UOPS_RETIRED.DTLB_MISS_LOADS", 0xD0, 0x11, true }, - { "MEM_UOPS_RETIRED.DTLB_MISS_STORES", 0xD0, 0x12, true }, - { "MEM_UOPS_RETIRED.DTLB_MISS", 0xD0, 0x13, true }, - { "MEM_UOPS_RETIRED.LOCK_LOADS", 0xD0, 0x21, true }, - { "MEM_UOPS_RETIRED.SPLIT_LOADS", 0xD0, 0x41, true }, - { "MEM_UOPS_RETIRED.SPLIT_STORES", 0xD0, 0x42, true }, - { "MEM_UOPS_RETIRED.SPLIT", 0xD0, 0x43, true }, - { "MEM_LOAD_UOPS_RETIRED.L1_HIT", 0xD1, 0x01, true }, - { "MEM_LOAD_UOPS_RETIRED.L1_MISS", 0xD1, 0x08, true }, - { "MEM_LOAD_UOPS_RETIRED.L2_HIT", 0xD1, 0x02, true }, - { "MEM_LOAD_UOPS_RETIRED.L2_MISS", 0xD1, 0x10, true }, - { "MEM_LOAD_UOPS_RETIRED.HITM", 0xD1, 0x20, true }, - { "MEM_LOAD_UOPS_RETIRED.WCB_HIT", 0xD1, 0x40, true }, - { "MEM_LOAD_UOPS_RETIRED.DRAM_HIT", 0xD1, 0x80, true }, - { "BACLEARS.ALL", 0xE6, 0x01, true }, - { "BACLEARS.RETURN", 0xE6, 0x08, true }, - { "BACLEAR.CONDS", 0xE6, 0x10, true }, - { "MS_DECODED.MS_ENTRY", 0xE7, 0x01, true }, - { "DECODED_RESTRICTION.PREDECODE_WRONG", 0xE9, 0x01, true }, + { "UOPS_NOT_DELIVERED.ANY", 0x9c, 0x00, true }, + { "OFFCORE_RESPONSE.0", 0xb7, 0x01, true }, + { "OFFCORE_RESPONSE.1", 0xb7, 0x02, true }, + { "INST_RETIRED.ANY_P", 0xc0, 0x00, true }, + { "UOPS_RETIRED.ANY", 0xc2, 0x00, true }, + { "UOPS_RETIRED.MS", 0xc2, 0x01, true }, + { "UOPS_RETIRED.FPDIV", 0xc2, 0x08, true }, + { "UOPS_RETIRED.IDIV", 0xc2, 0x10, true }, + { "MACHINE_CLEARS.SMC", 0xc3, 0x01, true }, + { "MACHINE_CLEARS.MEMORY_ORDERING", 0xc3, 0x02, true }, + { "MACHINE_CLEARS.FP_ASSIST", 0xc3, 0x04, true }, + { "MACHINE_CLEARS.DISAMBIGUATION", 0xc3, 0x08, true }, + { "MACHINE_CLEARS.ALL", 0xc3, 0x00, true }, + { "BR_INST_RETIRED.ALL_BRANCHES", 0xc4, 0x00, true }, + { "BR_INST_RETIRED.JCC", 0xc4, 0x7e, true }, + { "BR_INST_RETIRED.ALL_TAKEN_BRANCHES", 0xc4, 0x80, true }, + { "BR_INST_RETIRED.TAKEN_JCC", 0xc4, 0xfe, true }, + { "BR_INST_RETIRED.CALL", 0xc4, 0xf9, true }, + { "BR_INST_RETIRED.REL_CALL", 0xc4, 0xfd, true }, + { "BR_INST_RETIRED.IND_CALL", 0xc4, 0xfb, true }, + { "BR_INST_RETIRED.RETURN", 0xc4, 0xf7, true }, + { "BR_INST_RETIRED.NON_RETURN_IND", 0xc4, 0xeb, true }, + { "BR_INST_RETIRED.FAR_BRANCH", 0xc4, 0xbf, true }, + { "BR_MISP_RETIRED.ALL_BRANCHES", 0xc5, 0x00, true }, + { "BR_MISP_RETIRED.JCC", 0xc5, 0x7e, true }, + { "BR_MISP_RETIRED.TAKEN_JCC", 0xc5, 0xfe, true }, + { "BR_MISP_RETIRED.IND_CALL", 0xc5, 0xfb, true }, + { "BR_MISP_RETIRED.RETURN", 0xc5, 0xf7, true }, + { "BR_MISP_RETIRED.NON_RETURN_IND", 0xc5, 0xeb, true }, + { "ISSUE_SLOTS_NOT_CONSUMED.RESOURCE_FULL", 0xca, 0x01, true }, + { "ISSUE_SLOTS_NOT_CONSUMED.RECOVERY", 0xca, 0x02, true }, + { "ISSUE_SLOTS_NOT_CONSUMED.ANY", 0xca, 0x00, true }, + { "HW_INTERRUPTS.RECEIVED", 0xcb, 0x01, true }, + { "HW_INTERRUPTS.MASKED", 0xcb, 0x02, true }, + { "HW_INTERRUPTS.PENDING_AND_MASKED", 0xcb, 0x04, true }, + { "CYCLES_DIV_BUSY.ALL", 0xcd, 0x00, true }, + { "CYCLES_DIV_BUSY.IDIV", 0xcd, 0x01, true }, + { "CYCLES_DIV_BUSY.FPDIV", 0xcd, 0x02, true }, + { "MEM_UOPS_RETIRED.ALL_LOADS", 0xd0, 0x81, true }, + { "MEM_UOPS_RETIRED.ALL_STORES", 0xd0, 0x82, true }, + { "MEM_UOPS_RETIRED.ALL", 0xd0, 0x83, true }, + { "MEM_UOPS_RETIRED.DTLB_MISS_LOADS", 0xd0, 0x11, true }, + { "MEM_UOPS_RETIRED.DTLB_MISS_STORES", 0xd0, 0x12, true }, + { "MEM_UOPS_RETIRED.DTLB_MISS", 0xd0, 0x13, true }, + { "MEM_UOPS_RETIRED.LOCK_LOADS", 0xd0, 0x21, true }, + { "MEM_UOPS_RETIRED.SPLIT_LOADS", 0xd0, 0x41, true }, + { "MEM_UOPS_RETIRED.SPLIT_STORES", 0xd0, 0x42, true }, + { "MEM_UOPS_RETIRED.SPLIT", 0xd0, 0x43, true }, + { "MEM_LOAD_UOPS_RETIRED.L1_HIT", 0xd1, 0x01, true }, + { "MEM_LOAD_UOPS_RETIRED.L1_MISS", 0xd1, 0x08, true }, + { "MEM_LOAD_UOPS_RETIRED.L2_HIT", 0xd1, 0x02, true }, + { "MEM_LOAD_UOPS_RETIRED.L2_MISS", 0xd1, 0x10, true }, + { "MEM_LOAD_UOPS_RETIRED.HITM", 0xd1, 0x20, true }, + { "MEM_LOAD_UOPS_RETIRED.WCB_HIT", 0xd1, 0x40, true }, + { "MEM_LOAD_UOPS_RETIRED.DRAM_HIT", 0xd1, 0x80, true }, + { "BACLEARS.ALL", 0xe6, 0x01, true }, + { "BACLEARS.RETURN", 0xe6, 0x08, true }, + { "BACLEAR.CONDS", 0xe6, 0x10, true }, + { "MS_DECODED.MS_ENTRY", 0xe7, 0x01, true }, + { "DECODED_RESTRICTION.PREDECODE_WRONG", 0xe9, 0x01, true }, }; static struct event_table intel_goldmont = { @@ -333,13 +334,13 @@ static struct name_to_event intel_goldmo { "DTLB_STORE_MISSES.WALK_COMPLETED_2M_4M", 0x49, 0x04, true }, { "DTLB_STORE_MISSES.WALK_COMPLETED_1GB", 0x49, 0x08, true }, { "DTLB_STORE_MISSES.WALK_PENDING", 0x49, 0x10, true }, - { "EPT.WALK_PENDING", 0x4F, 0x10, true }, + { "EPT.WALK_PENDING", 0x4f, 0x10, true }, { "ITLB_MISSES.WALK_COMPLETED_4K", 0x85, 0x08, true }, { "ITLB_MISSES.WALK_COMPLETED_2M_4M", 0x85, 0x04, true }, { "ITLB_MISSES.WALK_COMPLETED_1GB", 0x85, 0x08, true }, { "ITLB_MISSES.WALK_PENDING", 0x85, 0x10, true }, - { "TLB_FLUSHES.STLB_ANY", 0xBD, 0x20, true }, - { "MACHINE_CLEARS.PAGE_FAULT", 0xC3, 0x20, true }, + { "TLB_FLUSHES.STLB_ANY", 0xbd, 0x20, true }, + { "MACHINE_CLEARS.PAGE_FAULT", 0xc3, 0x20, true }, }; static struct event_table intel_goldmontplus = { @@ -374,142 +375,143 @@ init_intel_goldmontplus(void) */ static struct name_to_event intel_skylake_kabylake_names[] = { /* Event Name - Event Select - UMask */ - { "LD_BLOCKS.STORE_FORWARD", 0x03, 0x02, true }, - { "LD_BLOCKS.NO_SR", 0x03, 0x08, true }, - { "LD_BLOCKS_PARTIAL.ADDRESS_ALIAS", 0x07, 0x01, true }, - { "DTLB_LOAD_MISSES.MISS_CAUSES_A_WALK", 0x08, 0x01, true }, - { "DTLB_LOAD_MISSES.WALK_COMPLETED_4K", 0x08, 0x02, true }, - { "DTLB_LOAD_MISSES.WALK_COMPLETED_2M_4M", 0x08, 0x04, true }, - { "DTLB_LOAD_MISSES.WALK_COMPLETED_1G", 0x08, 0x08, true }, - { "DTLB_LOAD_MISSES.WALK_COMPLETED", 0x08, 0x0E, true }, - { "DTLB_LOAD_MISSES.WALK_PENDING", 0x08, 0x10, true }, - { "DTLB_LOAD_MISSES.STLB_HIT", 0x08, 0x20, true }, - { "INT_MISC.RECOVERY_CYCLES", 0x0D, 0x01, true }, - { "INT_MISC.CLEAR_RESTEER_CYCLES", 0x0D, 0x80, true }, - { "UOPS_ISSUED.ANY", 0x0E, 0x01, true }, - { "UOPS_ISSUED.VECTOR_WIDTH_MISMATCH", 0x0E, 0x02, true }, - { "UOPS_ISSUED.SLOW_LEA", 0x0E, 0x20, true }, - { "L2_RQSTS.DEMAND_DATA_RD_MISS", 0x24, 0x21, true }, - { "L2_RQSTS.RFO_MISS", 0x24, 0x22, true }, - { "L2_RQSTS.CODE_RD_MISS", 0x24, 0x24, true }, - { "L2_RQSTS.ALL_DEMAND_MISS", 0x24, 0x27, true }, - { "L2_RQSTS.PF_MISS", 0x24, 0x38, true }, - { "L2_RQSTS.MISS", 0x24, 0x3F, true }, - { "L2_RQSTS.DEMAND_DATA_RD_HIT", 0x24, 0x41, true }, - { "L2_RQSTS.RFO_HIT", 0x24, 0x42, true }, - { "L2_RQSTS.CODE_RD_HIT", 0x24, 0x44, true }, - { "L2_RQSTS.PF_HIT", 0x24, 0xD8, true }, - { "L2_RQSTS.ALL_DEMAND_DATA_RD", 0x24, 0xE1, true }, - { "L2_RQSTS.ALL_RFO", 0x24, 0xE2, true }, - { "L2_RQSTS.ALL_CODE_RD", 0x24, 0xE4, true }, - { "L2_RQSTS.ALL_DEMAND_REFERENCES", 0x24, 0xE7, true }, - { "L2_RQSTS.ALL_PF", 0x24, 0xF8, true }, - { "L2_RQSTS.REFERENCES", 0x24, 0xFF, true }, - { "SW_PREFETCH_ACCESS.NTA", 0x32, 0x01, true }, - { "SW_PREFETCH_ACCESS.T0", 0x32, 0x02, true }, - { "SW_PREFETCH_ACCESS.T1_T2", 0x32, 0x04, true }, - { "SW_PREFETCH_ACCESS.PREFETCHW", 0x32, 0x08, true }, - { "CPU_CLK_THREAD_UNHALTED.ONE_THREAD_ACTIVE", 0x3C, 0x02, true }, - { "CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE", 0x3C, 0x02, true }, - { "L1D_PEND_MISS.PENDING", 0x48, 0x01, true }, - { "L1D_PEND_MISS.FB_FULL", 0x48, 0x02, true }, - { "DTLB_STORE_MISSES.MISS_CAUSES_A_WALK", 0x49, 0x01, true }, - { "DTLB_STORE_MISSES.WALK_COMPLETED_4K", 0x49, 0x02, true }, - { "DTLB_STORE_MISSES.WALK_COMPLETED_2M_4M", 0x49, 0x04, true }, - { "DTLB_STORE_MISSES.WALK_COMPLETED_1G", 0x49, 0x08, true }, - { "DTLB_STORE_MISSES.WALK_COMPLETED", 0x49, 0x0E, true }, - { "DTLB_STORE_MISSES.WALK_PENDING", 0x49, 0x10, true }, - { "DTLB_STORE_MISSES.STLB_HIT", 0x49, 0x20, true }, - { "LOAD_HIT_PRE.SW_PF", 0x4C, 0x01, true }, - { "EPT.WALK_PENDING", 0x4F, 0x10, true }, - { "L1D.REPLACEMENT", 0x51, 0x01, true }, - { "RS_EVENTS.EMPTY_CYCLES", 0x5E, 0x01, true }, - { "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_DATA_RD", 0x60, 0x01, true }, - { "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_CODE_RD", 0x60, 0x02, true }, - { "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_RFO", 0x60, 0x04, true }, - { "OFFCORE_REQUESTS_OUTSTANDING.ALL_DATA_RD", 0x60, 0x08, true }, - { "OFFCORE_REQUESTS_OUTSTANDING.L3_MISS_DEMAND_DATA_RD", 0x60, 0x10, true }, - { "IDQ.MITE_UOPS", 0x79, 0x04, true }, - { "IDQ.DSB_UOPS", 0x79, 0x08, true }, - { "IDQ.MS_MITE_UOPS", 0x79, 0x20, true }, - { "IDQ.MS_UOPS", 0x79, 0x30, true }, - { "ICACHE_16B.IFDATA_STALL", 0x80, 0x04, true }, - { "ICACHE_64B.IFTAG_HIT", 0x83, 0x01, true }, - { "ICACHE_64B.IFTAG_MISS", 0x83, 0x02, true }, - { "ICACHE_64B.IFTAG_STALL", 0x83, 0x04, true }, - { "ITLB_MISSES.MISS_CAUSES_A_WALK", 0x85, 0x01, true }, - { "ITLB_MISSES.WALK_COMPLETED_4K", 0x85, 0x02, true }, - { "ITLB_MISSES.WALK_COMPLETED_2M_4M", 0x85, 0x04, true }, - { "ITLB_MISSES.WALK_COMPLETED_1G", 0x85, 0x08, true }, - { "ITLB_MISSES.WALK_COMPLETED", 0x85, 0x0E, true }, - { "ITLB_MISSES.WALK_PENDING", 0x85, 0x10, true }, - { "ITLB_MISSES.STLB_HIT", 0x85, 0x20, true }, - { "ILD_STALL.LCP", 0x87, 0x01, true }, - { "IDQ_UOPS_NOT_DELIVERED.CORE", 0x9C, 0x01, true }, - { "RESOURCE_STALLS.ANY", 0xA2, 0x01, true }, - { "RESOURCE_STALLS.SB", 0xA2, 0x08, true }, - { "EXE_ACTIVITY.EXE_BOUND_0_PORTS", 0xA6, 0x01, true }, - { "EXE_ACTIVITY.1_PORTS_UTIL", 0xA6, 0x02, true }, - { "EXE_ACTIVITY.2_PORTS_UTIL", 0xA6, 0x04, true }, - { "EXE_ACTIVITY.3_PORTS_UTIL", 0xA6, 0x08, true }, - { "EXE_ACTIVITY.4_PORTS_UTIL", 0xA6, 0x10, true }, - { "EXE_ACTIVITY.BOUND_ON_STORES", 0xA6, 0x40, true }, - { "LSD.UOPS", 0xA8, 0x01, true }, - { "DSB2MITE_SWITCHES.PENALTY_CYCLES", 0xAB, 0x02, true }, - { "ITLB.ITLB_FLUSH", 0xAE, 0x01, true }, - { "OFFCORE_REQUESTS.DEMAND_DATA_RD", 0xB0, 0x01, true }, - { "OFFCORE_REQUESTS.DEMAND_CODE_RD", 0xB0, 0x02, true }, - { "OFFCORE_REQUESTS.DEMAND_RFO", 0xB0, 0x04, true }, - { "OFFCORE_REQUESTS.ALL_DATA_RD", 0xB0, 0x08, true }, - { "OFFCORE_REQUESTS.L3_MISS_DEMAND_DATA_RD", 0xB0, 0x10, true }, - { "OFFCORE_REQUESTS.ALL_REQUESTS", 0xB0, 0x80, true }, - { "UOPS_EXECUTED.THREAD", 0xB1, 0x01, true }, - { "UOPS_EXECUTED.CORE", 0xB1, 0x02, true }, - { "UOPS_EXECUTED.X87", 0xB1, 0x10, true }, - { "OFFCORE_REQUESTS_BUFFER.SQ_FULL", 0xB2, 0x01, true }, - { "TLB_FLUSH.DTLB_THREAD", 0xBD, 0x01, true }, - { "TLB_FLUSH.STLB_ANY", 0xBD, 0x20, true }, - { "INST_RETIRED.PREC_DIST", 0xC0, 0x01, true }, - { "OTHER_ASSISTS.ANY", 0xC1, 0x3F, true }, - { "UOPS_RETIRED.RETIRE_SLOTS", 0xC2, 0x02, true }, - { "MACHINE_CLEARS.MEMORY_ORDERING", 0xC3, 0x02, true }, - { "MACHINE_CLEARS.SMC", 0xC3, 0x04, true }, - { "BR_INST_RETIRED.CONDITIONAL", 0xC4, 0x01, true }, - { "BR_INST_RETIRED.NEAR_CALL", 0xC4, 0x02, true }, - { "BR_INST_RETIRED.NEAR_RETURN", 0xC4, 0x08, true }, - { "BR_INST_RETIRED.NOT_TAKEN", 0xC4, 0x10, true }, - { "BR_INST_RETIRED.NEAR_TAKEN", 0xC4, 0x20, true }, - { "BR_INST_RETIRED.FAR_BRANCH", 0xC4, 0x40, true }, - { "BR_MISP_RETIRED.CONDITIONAL", 0xC5, 0x01, true }, - { "BR_MISP_RETIRED.NEAR_CALL", 0xC5, 0x02, true }, - { "BR_MISP_RETIRED.NEAR_TAKEN", 0xC5, 0x20, true }, - { "HW_INTERRUPTS.RECEIVED", 0xCB, 0x01, true }, - { "MEM_INST_RETIRED.STLB_MISS_LOADS", 0xD0, 0x11, true }, - { "MEM_INST_RETIRED.STLB_MISS_STORES", 0xD0, 0x12, true }, - { "MEM_INST_RETIRED.LOCK_LOADS", 0xD0, 0x21, true }, - { "MEM_INST_RETIRED.SPLIT_LOADS", 0xD0, 0x41, true }, - { "MEM_INST_RETIRED.SPLIT_STORES", 0xD0, 0x42, true }, - { "MEM_INST_RETIRED.ALL_LOADS", 0xD0, 0x81, true }, - { "MEM_INST_RETIRED.ALL_STORES", 0xD0, 0x82, true }, - { "MEM_LOAD_RETIRED.L1_HIT", 0xD1, 0x01, true }, - { "MEM_LOAD_RETIRED.L2_HIT", 0xD1, 0x02, true }, - { "MEM_LOAD_RETIRED.L3_HIT", 0xD1, 0x04, true }, - { "MEM_LOAD_RETIRED.L1_MISS", 0xD1, 0x08, true }, - { "MEM_LOAD_RETIRED.L2_MISS", 0xD1, 0x10, true }, - { "MEM_LOAD_RETIRED.L3_MISS", 0xD1, 0x20, true }, - { "MEM_LOAD_RETIRED.FB_HIT", 0xD1, 0x40, true }, - { "MEM_LOAD_L3_HIT_RETIRED.XSNP_MISS", 0xD2, 0x01, true }, - { "MEM_LOAD_L3_HIT_RETIRED.XSNP_HIT", 0xD2, 0x02, true }, - { "MEM_LOAD_L3_HIT_RETIRED.XSNP_HITM", 0xD2, 0x04, true }, - { "MEM_LOAD_L3_HIT_RETIRED.XSNP_NONE", 0xD2, 0x08, true }, - { "MEM_LOAD_MISC_RETIRED.UC", 0xD4, 0x04, true }, - { "BACLEARS.ANY", 0xE6, 0x01, true }, - { "L2_TRANS.L2_WB", 0xF0, 0x40, true }, - { "L2_LINES_IN.ALL", 0xF1, 0x1F, true }, - { "L2_LINES_OUT.SILENT", 0xF2, 0x01, true }, - { "L2_LINES_OUT.NON_SILENT", 0xF2, 0x02, true }, - { "L2_LINES_OUT.USELESS_HWPF", 0xF2, 0x04, true }, - { "SQ_MISC.SPLIT_LOCK", 0xF4, 0x10, true }, + { "LD_BLOCKS.STORE_FORWARD", 0x03, 0x02, true }, + { "LD_BLOCKS.NO_SR", 0x03, 0x08, true }, + { "LD_BLOCKS_PARTIAL.ADDRESS_ALIAS", 0x07, 0x01, true }, + { "DTLB_LOAD_MISSES.MISS_CAUSES_A_WALK", 0x08, 0x01, true }, + { "DTLB_LOAD_MISSES.WALK_COMPLETED_4K", 0x08, 0x02, true }, + { "DTLB_LOAD_MISSES.WALK_COMPLETED_2M_4M", 0x08, 0x04, true }, + { "DTLB_LOAD_MISSES.WALK_COMPLETED_1G", 0x08, 0x08, true }, + { "DTLB_LOAD_MISSES.WALK_COMPLETED", 0x08, 0x0e, true }, + { "DTLB_LOAD_MISSES.WALK_PENDING", 0x08, 0x10, true }, + { "DTLB_LOAD_MISSES.STLB_HIT", 0x08, 0x20, true }, + { "INT_MISC.RECOVERY_CYCLES", 0x0d, 0x01, true }, + { "INT_MISC.CLEAR_RESTEER_CYCLES", 0x0d, 0x80, true }, + { "UOPS_ISSUED.ANY", 0x0e, 0x01, true }, + { "UOPS_ISSUED.VECTOR_WIDTH_MISMATCH", 0x0e, 0x02, true }, + { "UOPS_ISSUED.SLOW_LEA", 0x0e, 0x20, true }, + { "L2_RQSTS.DEMAND_DATA_RD_MISS", 0x24, 0x21, true }, + { "L2_RQSTS.RFO_MISS", 0x24, 0x22, true }, + { "L2_RQSTS.CODE_RD_MISS", 0x24, 0x24, true }, + { "L2_RQSTS.ALL_DEMAND_MISS", 0x24, 0x27, true }, + { "L2_RQSTS.PF_MISS", 0x24, 0x38, true }, + { "L2_RQSTS.MISS", 0x24, 0x3f, true }, + { "L2_RQSTS.DEMAND_DATA_RD_HIT", 0x24, 0x41, true }, + { "L2_RQSTS.RFO_HIT", 0x24, 0x42, true }, + { "L2_RQSTS.CODE_RD_HIT", 0x24, 0x44, true }, + { "L2_RQSTS.PF_HIT", 0x24, 0xd8, true }, + { "L2_RQSTS.ALL_DEMAND_DATA_RD", 0x24, 0xe1, true }, + { "L2_RQSTS.ALL_RFO", 0x24, 0xe2, true }, + { "L2_RQSTS.ALL_CODE_RD", 0x24, 0xe4, true }, + { "L2_RQSTS.ALL_DEMAND_REFERENCES", 0x24, 0xe7, true }, + { "L2_RQSTS.ALL_PF", 0x24, 0xf8, true }, + { "L2_RQSTS.REFERENCES", 0x24, 0xff, true }, + { "SW_PREFETCH_ACCESS.NTA", 0x32, 0x01, true }, + { "SW_PREFETCH_ACCESS.T0", 0x32, 0x02, true }, + { "SW_PREFETCH_ACCESS.T1_T2", 0x32, 0x04, true }, + { "SW_PREFETCH_ACCESS.PREFETCHW", 0x32, 0x08, true }, + { "CPU_CLK_THREAD_UNHALTED.ONE_THREAD_ACTIVE", 0x3c, 0x02, true }, + { "CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE", 0x3c, 0x02, true }, + { "L1D_PEND_MISS.PENDING", 0x48, 0x01, true }, + { "L1D_PEND_MISS.FB_FULL", 0x48, 0x02, true }, + { "DTLB_STORE_MISSES.MISS_CAUSES_A_WALK", 0x49, 0x01, true }, + { "DTLB_STORE_MISSES.WALK_COMPLETED_4K", 0x49, 0x02, true }, + { "DTLB_STORE_MISSES.WALK_COMPLETED_2M_4M", 0x49, 0x04, true }, + { "DTLB_STORE_MISSES.WALK_COMPLETED_1G", 0x49, 0x08, true }, + { "DTLB_STORE_MISSES.WALK_COMPLETED", 0x49, 0x0e, true }, + { "DTLB_STORE_MISSES.WALK_PENDING", 0x49, 0x10, true }, + { "DTLB_STORE_MISSES.STLB_HIT", 0x49, 0x20, true }, + { "LOAD_HIT_PRE.SW_PF", 0x4c, 0x01, true }, + { "EPT.WALK_PENDING", 0x4f, 0x10, true }, + { "L1D.REPLACEMENT", 0x51, 0x01, true }, + { "RS_EVENTS.EMPTY_CYCLES", 0x5e, 0x01, true }, + { "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_DATA_RD", 0x60, 0x01, true }, + { "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_CODE_RD", 0x60, 0x02, true }, + { "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_RFO", 0x60, 0x04, true }, + { "OFFCORE_REQUESTS_OUTSTANDING.ALL_DATA_RD", 0x60, 0x08, true }, + { "OFFCORE_REQUESTS_OUTSTANDING.L3_MISS_DEMAND_DATA_RD", + 0x60, 0x10, true }, + { "IDQ.MITE_UOPS", 0x79, 0x04, true }, + { "IDQ.DSB_UOPS", 0x79, 0x08, true }, + { "IDQ.MS_MITE_UOPS", 0x79, 0x20, true }, + { "IDQ.MS_UOPS", 0x79, 0x30, true }, + { "ICACHE_16B.IFDATA_STALL", 0x80, 0x04, true }, + { "ICACHE_64B.IFTAG_HIT", 0x83, 0x01, true }, + { "ICACHE_64B.IFTAG_MISS", 0x83, 0x02, true }, + { "ICACHE_64B.IFTAG_STALL", 0x83, 0x04, true }, + { "ITLB_MISSES.MISS_CAUSES_A_WALK", 0x85, 0x01, true }, + { "ITLB_MISSES.WALK_COMPLETED_4K", 0x85, 0x02, true }, + { "ITLB_MISSES.WALK_COMPLETED_2M_4M", 0x85, 0x04, true }, + { "ITLB_MISSES.WALK_COMPLETED_1G", 0x85, 0x08, true }, + { "ITLB_MISSES.WALK_COMPLETED", 0x85, 0x0e, true }, + { "ITLB_MISSES.WALK_PENDING", 0x85, 0x10, true }, + { "ITLB_MISSES.STLB_HIT", 0x85, 0x20, true }, + { "ILD_STALL.LCP", 0x87, 0x01, true }, + { "IDQ_UOPS_NOT_DELIVERED.CORE", 0x9c, 0x01, true }, + { "RESOURCE_STALLS.ANY", 0xa2, 0x01, true }, + { "RESOURCE_STALLS.SB", 0xa2, 0x08, true }, + { "EXE_ACTIVITY.EXE_BOUND_0_PORTS", 0xa6, 0x01, true }, + { "EXE_ACTIVITY.1_PORTS_UTIL", 0xa6, 0x02, true }, + { "EXE_ACTIVITY.2_PORTS_UTIL", 0xa6, 0x04, true }, + { "EXE_ACTIVITY.3_PORTS_UTIL", 0xa6, 0x08, true }, + { "EXE_ACTIVITY.4_PORTS_UTIL", 0xa6, 0x10, true }, + { "EXE_ACTIVITY.BOUND_ON_STORES", 0xa6, 0x40, true }, + { "LSD.UOPS", 0xa8, 0x01, true }, + { "DSB2MITE_SWITCHES.PENALTY_CYCLES", 0xab, 0x02, true }, + { "ITLB.ITLB_FLUSH", 0xae, 0x01, true }, + { "OFFCORE_REQUESTS.DEMAND_DATA_RD", 0xb0, 0x01, true }, + { "OFFCORE_REQUESTS.DEMAND_CODE_RD", 0xb0, 0x02, true }, + { "OFFCORE_REQUESTS.DEMAND_RFO", 0xb0, 0x04, true }, + { "OFFCORE_REQUESTS.ALL_DATA_RD", 0xb0, 0x08, true }, + { "OFFCORE_REQUESTS.L3_MISS_DEMAND_DATA_RD", 0xb0, 0x10, true }, + { "OFFCORE_REQUESTS.ALL_REQUESTS", 0xb0, 0x80, true }, + { "UOPS_EXECUTED.THREAD", 0xb1, 0x01, true }, + { "UOPS_EXECUTED.CORE", 0xb1, 0x02, true }, + { "UOPS_EXECUTED.X87", 0xb1, 0x10, true }, + { "OFFCORE_REQUESTS_BUFFER.SQ_FULL", 0xb2, 0x01, true }, + { "TLB_FLUSH.DTLB_THREAD", 0xbd, 0x01, true }, + { "TLB_FLUSH.STLB_ANY", 0xbd, 0x20, true }, + { "INST_RETIRED.PREC_DIST", 0xc0, 0x01, true }, + { "OTHER_ASSISTS.ANY", 0xc1, 0x3f, true }, + { "UOPS_RETIRED.RETIRE_SLOTS", 0xc2, 0x02, true }, + { "MACHINE_CLEARS.MEMORY_ORDERING", 0xc3, 0x02, true }, + { "MACHINE_CLEARS.SMC", 0xc3, 0x04, true }, + { "BR_INST_RETIRED.CONDITIONAL", 0xc4, 0x01, true }, + { "BR_INST_RETIRED.NEAR_CALL", 0xc4, 0x02, true }, + { "BR_INST_RETIRED.NEAR_RETURN", 0xc4, 0x08, true }, + { "BR_INST_RETIRED.NOT_TAKEN", 0xc4, 0x10, true }, + { "BR_INST_RETIRED.NEAR_TAKEN", 0xc4, 0x20, true }, + { "BR_INST_RETIRED.FAR_BRANCH", 0xc4, 0x40, true }, + { "BR_MISP_RETIRED.CONDITIONAL", 0xc5, 0x01, true }, + { "BR_MISP_RETIRED.NEAR_CALL", 0xc5, 0x02, true }, + { "BR_MISP_RETIRED.NEAR_TAKEN", 0xc5, 0x20, true }, + { "HW_INTERRUPTS.RECEIVED", 0xcb, 0x01, true }, + { "MEM_INST_RETIRED.STLB_MISS_LOADS", 0xd0, 0x11, true }, + { "MEM_INST_RETIRED.STLB_MISS_STORES", 0xd0, 0x12, true }, + { "MEM_INST_RETIRED.LOCK_LOADS", 0xd0, 0x21, true }, + { "MEM_INST_RETIRED.SPLIT_LOADS", 0xd0, 0x41, true }, + { "MEM_INST_RETIRED.SPLIT_STORES", 0xd0, 0x42, true }, + { "MEM_INST_RETIRED.ALL_LOADS", 0xd0, 0x81, true }, + { "MEM_INST_RETIRED.ALL_STORES", 0xd0, 0x82, true }, + { "MEM_LOAD_RETIRED.L1_HIT", 0xd1, 0x01, true }, + { "MEM_LOAD_RETIRED.L2_HIT", 0xd1, 0x02, true }, + { "MEM_LOAD_RETIRED.L3_HIT", 0xd1, 0x04, true }, + { "MEM_LOAD_RETIRED.L1_MISS", 0xd1, 0x08, true }, + { "MEM_LOAD_RETIRED.L2_MISS", 0xd1, 0x10, true }, + { "MEM_LOAD_RETIRED.L3_MISS", 0xd1, 0x20, true }, + { "MEM_LOAD_RETIRED.FB_HIT", 0xd1, 0x40, true }, + { "MEM_LOAD_L3_HIT_RETIRED.XSNP_MISS", 0xd2, 0x01, true }, + { "MEM_LOAD_L3_HIT_RETIRED.XSNP_HIT", 0xd2, 0x02, true }, + { "MEM_LOAD_L3_HIT_RETIRED.XSNP_HITM", 0xd2, 0x04, true }, + { "MEM_LOAD_L3_HIT_RETIRED.XSNP_NONE", 0xd2, 0x08, true }, + { "MEM_LOAD_MISC_RETIRED.UC", 0xd4, 0x04, true }, + { "BACLEARS.ANY", 0xe6, 0x01, true }, + { "L2_TRANS.L2_WB", 0xf0, 0x40, true }, + { "L2_LINES_IN.ALL", 0xf1, 0x1f, true }, + { "L2_LINES_OUT.SILENT", 0xf2, 0x01, true }, + { "L2_LINES_OUT.NON_SILENT", 0xf2, 0x02, true }, + { "L2_LINES_OUT.USELESS_HWPF", 0xf2, 0x04, true }, + { "SQ_MISC.SPLIT_LOCK", 0xf4, 0x10, true }, }; static struct event_table intel_skylake_kabylake = { @@ -523,14 +525,280 @@ static struct event_table intel_skylake_ static struct event_table * init_intel_skylake_kabylake(void) { + return &intel_skylake_kabylake; } +/* + * Intel Skylake-X (and Cascade Lake). + */ +static struct name_to_event intel_skylake_x_names[] = { + { "INST_RETIRED.ANY", 0x00, 0x01, true }, + { "CPU_CLK_UNHALTED.THREAD", 0x00, 0x02, true }, + { "CPU_CLK_UNHALTED.REF_TSC", 0x00, 0x03, true }, + { "LD_BLOCKS.STORE_FORWARD", 0x03, 0x02, true }, + { "LD_BLOCKS.NO_SR", 0x03, 0x08, true }, + { "LD_BLOCKS_PARTIAL.ADDRESS_ALIAS", 0x07, 0x01, true }, + { "DTLB_LOAD_MISSES.MISS_CAUSES_A_WALK", 0x08, 0x01, true }, + { "DTLB_LOAD_MISSES.WALK_COMPLETED_4K", 0x08, 0x02, true }, + { "DTLB_LOAD_MISSES.WALK_COMPLETED_2M_4M", 0x08, 0x04, true }, + { "DTLB_LOAD_MISSES.WALK_COMPLETED_1G", 0x08, 0x08, true }, + { "DTLB_LOAD_MISSES.WALK_COMPLETED", 0x08, 0x0E, true }, + { "DTLB_LOAD_MISSES.WALK_PENDING", 0x08, 0x10, true }, + { "DTLB_LOAD_MISSES.STLB_HIT", 0x08, 0x20, true }, + { "INT_MISC.RECOVERY_CYCLES", 0x0D, 0x01, true }, + { "INT_MISC.CLEAR_RESTEER_CYCLES", 0x0D, 0x80, true }, + { "UOPS_ISSUED.ANY", 0x0E, 0x01, true }, + { "UOPS_ISSUED.VECTOR_WIDTH_MISMATCH", 0x0E, 0x02, true }, + { "UOPS_ISSUED.SLOW_LEA", 0x0E, 0x20, true }, + { "ARITH.DIVIDER_ACTIVE", 0x14, 0x01, true }, + { "L2_RQSTS.DEMAND_DATA_RD_MISS", 0x24, 0x21, true }, + { "L2_RQSTS.RFO_MISS", 0x24, 0x22, true }, + { "L2_RQSTS.CODE_RD_MISS", 0x24, 0x24, true }, + { "L2_RQSTS.ALL_DEMAND_MISS", 0x24, 0x27, true }, + { "L2_RQSTS.PF_MISS", 0x24, 0x38, true }, + { "L2_RQSTS.MISS", 0x24, 0x3F, true }, + { "L2_RQSTS.DEMAND_DATA_RD_HIT", 0x24, 0x41, true }, + { "L2_RQSTS.RFO_HIT", 0x24, 0x42, true }, + { "L2_RQSTS.CODE_RD_HIT", 0x24, 0x44, true }, + { "L2_RQSTS.PF_HIT", 0x24, 0xD8, true }, + { "L2_RQSTS.ALL_DEMAND_DATA_RD", 0x24, 0xE1, true }, + { "L2_RQSTS.ALL_RFO", 0x24, 0xE2, true }, + { "L2_RQSTS.ALL_CODE_RD", 0x24, 0xE4, true }, + { "L2_RQSTS.ALL_DEMAND_REFERENCES", 0x24, 0xE7, true }, + { "L2_RQSTS.ALL_PF", 0x24, 0xF8, true }, + { "L2_RQSTS.REFERENCES All L2", 0x24, 0xFF, true }, + { "CORE_POWER.LVL0_TURBO_LICENSE", 0x28, 0x07, true }, + { "CORE_POWER.LVL1_TURBO_LICENSE", 0x28, 0x18, true }, + { "CORE_POWER.LVL2_TURBO_LICENSE", 0x28, 0x20, true }, + { "CORE_POWER.THROTTLE", 0x28, 0x40, true }, + { "LONGEST_LAT_CACHE.MISS", 0x2E, 0x41, true }, + { "LONGEST_LAT_CACHE.REFERENCE", 0x2E, 0x4F, true }, + { "CPU_CLK_UNHALTED.THREAD_P", 0x3C, 0x00, true }, + { "CPU_CLK_THREAD_UNHALTED.REF_XCLK", 0x3C, 0x01, true }, + { "CPU_CLK_THREAD_UNHALTED.ONE_THREAD_ACTIVE", 0x3C, 0x02, true }, + { "L1D_PEND_MISS.PENDING", 0x48, 0x01, true }, + { "L1D_PEND_MISS.FB_FULL", 0x48, 0x02, true }, + { "DTLB_STORE_MISSES.MISS_CAUSES_A_WALK", 0x49, 0x01, true }, + { "DTLB_STORE_MISSES.WALK_COMPLETED_4K", 0x49, 0x02, true }, + { "DTLB_STORE_MISSES.WALK_COMPLETED_2M_4M", 0x49, 0x04, true }, + { "DTLB_STORE_MISSES.WALK_COMPLETED_1G", 0x49, 0x08, true }, + { "DTLB_STORE_MISSES.WALK_COMPLETED", 0x49, 0x0E, true }, + { "DTLB_STORE_MISSES.WALK_PENDING", 0x49, 0x10, true }, + { "DTLB_STORE_MISSES.STLB_HIT", 0x49, 0x20, true }, + { "LOAD_HIT_PRE.SW_PF", 0x4C, 0x01, true }, + { "EPT.WALK_PENDING", 0x4F, 0x10, true }, + { "L1D.REPLACEMENT", 0x51, 0x01, true }, + { "TX_MEM.ABORT_CONFLICT", 0x54, 0x01, true }, + { "TX_MEM.ABORT_CAPACITY", 0x54, 0x02, true }, + { "TX_MEM.ABORT_HLE_STORE_TO_ELIDED_LOCK", 0x54, 0x04, true }, + { "TX_MEM.ABORT_HLE_ELISION_BUFFER_NOT_EMPTY", 0x54, 0x08, true }, + { "TX_MEM.ABORT_HLE_ELISION_BUFFER_MISMATCH", 0x54, 0x10, true }, + { "TX_MEM.ABORT_HLE_ELISION_BUFFER_UNSUPPORTED_ALIGNMENT", + 0x54, 0x20, true }, + { "TX_MEM.HLE_ELISION_BUFFER_FULL", 0x54, 0x40, true }, + { "TX_EXEC.MISC1", 0x5D, 0x01, true }, + { "TX_EXEC.MISC2", 0x5D, 0x02, true }, + { "TX_EXEC.MISC3", 0x5D, 0x04, true }, + { "TX_EXEC.MISC4", 0x5D, 0x08, true }, + { "TX_EXEC.MISC5", 0x5D, 0x10, true }, + { "RS_EVENTS.EMPTY_CYCLES", 0x5E, 0x01, true }, + { "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_DATA_RD", + 0x60, 0x01, true }, + { "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_CODE_RD", + 0x60, 0x02, true }, + { "OFFCORE_REQUESTS_OUTSTANDING.DEMAND_RFO", 0x60, 0x04, true }, + { "OFFCORE_REQUESTS_OUTSTANDING.ALL_DATA_RD", 0x60, 0x08, true }, + { "OFFCORE_REQUESTS_OUTSTANDING.L3_MISS_DEMAND_DATA_RD", + 0x60, 0x10, true }, + { "IDQ.MITE_UOPS", 0x79, 0x04, true }, + { "IDQ.DSB_UOPS", 0x79, 0x08, true }, + { "IDQ.MS_DSB_CYCLES", 0x79, 0x10, true }, + { "IDQ.ALL_DSB_CYCLES_4_UOPS", 0x79, 0x18, true }, + { "IDQ.MS_MITE_UOPS", 0x79, 0x20, true }, + { "IDQ.ALL_MITE_CYCLES_4_UOPS", 0x79, 0x24, true }, + { "IDQ.MS_CYCLES", 0x79, 0x30, true }, + { "ICACHE_16B.IFDATA_STALL", 0x80, 0x04, true }, + { "ICACHE_64B.IFTAG_HIT", 0x83, 0x01, true }, + { "ICACHE_64B.IFTAG_MISS", 0x83, 0x02, true }, + { "ICACHE_64B.IFTAG_STALL", 0x83, 0x04, true }, + { "ITLB_MISSES.MISS_CAUSES_A_WALK", 0x85, 0x01, true }, + { "ITLB_MISSES.WALK_COMPLETED_4K", 0x85, 0x02, true }, + { "ITLB_MISSES.WALK_COMPLETED_2M_4M", 0x85, 0x04, true }, + { "ITLB_MISSES.WALK_COMPLETED_1G", 0x85, 0x08, true }, + { "ITLB_MISSES.WALK_COMPLETED", 0x85, 0x0E, true }, + { "ITLB_MISSES.WALK_PENDING", 0x85, 0x10, true }, + { "ITLB_MISSES.STLB_HIT", 0x85, 0x20, true }, + { "ILD_STALL.LCP", 0x87, 0x01, true }, + { "IDQ_UOPS_NOT_DELIVERED.CORE", 0x9C, 0x01, true }, + { "UOPS_DISPATCHED_PORT.PORT_0", 0xa1, 0x01, true }, + { "UOPS_DISPATCHED_PORT.PORT_1", 0xa1, 0x02, true }, + { "UOPS_DISPATCHED_PORT.PORT_2", 0xa1, 0x04, true }, + { "UOPS_DISPATCHED_PORT.PORT_3", 0xa1, 0x08, true }, + { "UOPS_DISPATCHED_PORT.PORT_4", 0xa1, 0x10, true }, + { "UOPS_DISPATCHED_PORT.PORT_5", 0xa1, 0x20, true }, + { "UOPS_DISPATCHED_PORT.PORT_6", 0xa1, 0x40, true }, + { "UOPS_DISPATCHED_PORT.PORT_7", 0xa1, 0x80, true }, + { "RESOURCE_STALLS.ANY", 0xa2, 0x01, true }, + { "RESOURCE_STALLS.SB", 0xa2, 0x08, true }, + { "CYCLE_ACTIVITY.CYCLES_L2_MISS", 0xa3, 0x01, true }, + { "CYCLE_ACTIVITY.CYCLES_L3_MISS", 0xa3, 0x02, true }, + { "CYCLE_ACTIVITY.STALLS_TOTAL", 0xa3, 0x04, true }, + { "CYCLE_ACTIVITY.STALLS_L2_MISS", 0xa3, 0x05, true }, + { "CYCLE_ACTIVITY.STALLS_L3_MISS", 0xa3, 0x06, true }, + { "CYCLE_ACTIVITY.CYCLES_L1D_MISS", 0xa3, 0x08, true }, + { "CYCLE_ACTIVITY.STALLS_L1D_MISS", 0xa3, 0x0C, true }, + { "CYCLE_ACTIVITY.CYCLES_MEM_ANY", 0xa3, 0x10, true }, + { "CYCLE_ACTIVITY.STALLS_MEM_ANY", 0xa3, 0x14, true }, + { "EXE_ACTIVITY.EXE_BOUND_0_PORTS", 0xa6, 0x01, true }, + { "EXE_ACTIVITY.1_PORTS_UTIL", 0xa6, 0x02, true }, + { "EXE_ACTIVITY.2_PORTS_UTIL", 0xa6, 0x04, true }, + { "EXE_ACTIVITY.3_PORTS_UTIL", 0xa6, 0x08, true }, + { "EXE_ACTIVITY.4_PORTS_UTIL", 0xa6, 0x10, true }, + { "EXE_ACTIVITY.BOUND_ON_STORES", 0xa6, 0x40, true }, + { "LSD.UOPS", 0xa8, 0x01, true }, + { "DSB2MITE_SWITCHES.PENALTY_CYCLES", 0xaB, 0x02, true }, + { "ITLB.ITLB_FLUSH", 0xaE, 0x01, true }, + { "OFFCORE_REQUESTS.DEMAND_DATA_RD", 0xb0, 0x01, true }, + { "OFFCORE_REQUESTS.DEMAND_CODE_RD", 0xb0, 0x02, true }, + { "OFFCORE_REQUESTS.DEMAND_RFO", 0xb0, 0x04, true }, + { "OFFCORE_REQUESTS.ALL_DATA_RD", 0xb0, 0x08, true }, + { "OFFCORE_REQUESTS.L3_MISS_DEMAND_DATA_RD", 0xb0, 0x10, true }, + { "OFFCORE_REQUESTS.ALL_REQUESTS", 0xb0, 0x80, true }, + { "UOPS_EXECUTED.THREAD", 0xb1, 0x01, true }, + { "UOPS_EXECUTED.CORE", 0xb1, 0x02, true }, + { "UOPS_EXECUTED.X87", 0xb1, 0x10, true }, + { "OFFCORE_REQUESTS_BUFFER.SQ_FULL", 0xb2, 0x01, true }, + { "TLB_FLUSH.DTLB_THREAD", 0xbD, 0x01, true }, + { "TLB_FLUSH.STLB_ANY", 0xbD, 0x20, true }, + { "INST_RETIRED.ANY_P", 0xc0, 0x00, true }, + { "INST_RETIRED.PREC_DIST", 0xc0, 0x01, true }, + { "OTHER_ASSISTS.ANY", 0xc1, 0x3F, true }, + { "UOPS_RETIRED.STALL_CYCLES", 0xc2, 0x01, true }, + { "UOPS_RETIRED.RETIRE_SLOTS", 0xc2, 0x02, true }, + { "MACHINE_CLEARS.COUNT", 0xc3, 0x01, true }, + { "MACHINE_CLEARS.MEMORY_ORDERING", 0xc3, 0x02, true }, + { "MACHINE_CLEARS.SMC", 0xc3, 0x04, true }, + { "BR_INST_RETIRED.ALL_BRANCHES", 0xc4, 0x00, true }, + { "BR_INST_RETIRED.CONDITIONAL", 0xc4, 0x01, true }, + { "BR_INST_RETIRED.NEAR_CALL", 0xc4, 0x02, true }, + { "BR_INST_RETIRED.NEAR_RETURN", 0xc4, 0x08, true }, + { "BR_INST_RETIRED.NOT_TAKEN", 0xc4, 0x10, true }, + { "BR_INST_RETIRED.NEAR_TAKEN", 0xc4, 0x20, true }, + { "BR_INST_RETIRED.FAR_BRANCH", 0xc4, 0x40, true }, + { "BR_MISP_RETIRED.ALL_BRANCHES", 0xc5, 0x00, true }, + { "BR_MISP_RETIRED.CONDITIONAL", 0xc5, 0x01, true }, + { "BR_MISP_RETIRED.NEAR_CALL", 0xc5, 0x02, true }, + { "BR_MISP_RETIRED.NEAR_TAKEN", 0xc5, 0x20, true }, + { "FRONTEND_RETIRED.DSB_MISS", 0xc6, 0x01, true }, + { "FP_ARITH_INST_RETIRED.SCALAR_DOUBLE", 0xc7, 0x01, true }, + { "FP_ARITH_INST_RETIRED.SCALAR_SINGLE", 0xc7, 0x02, true }, + { "FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE", 0xc7, 0x04, true }, + { "FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE", 0xc7, 0x08, true }, + { "FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE", 0xc7, 0x10, true }, + { "FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE", 0xc7, 0x20, true }, + { "FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE", 0xc7, 0x40, true }, + { "FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE", 0xc7, 0x80, true }, + { "HLE_RETIRED.START", 0xc8, 0x01, true }, + { "HLE_RETIRED.COMMIT", 0xc8, 0x02, true }, + { "HLE_RETIRED.ABORTED", 0xc8, 0x04, true }, + { "HLE_RETIRED.ABORTED_MEM", 0xc8, 0x08, true }, + { "HLE_RETIRED.ABORTED_TIMER", 0xc8, 0x10, true }, + { "HLE_RETIRED.ABORTED_UNFRIENDLY", 0xc8, 0x20, true }, + { "HLE_RETIRED.ABORTED_MEMTYPE", 0xc8, 0x40, true }, + { "HLE_RETIRED.ABORTED_EVENTS", 0xc8, 0x80, true }, + { "RTM_RETIRED.START", 0xc9, 0x01, true }, + { "RTM_RETIRED.COMMIT", 0xc9, 0x02, true }, + { "RTM_RETIRED.ABORTED", 0xc9, 0x04, true }, + { "RTM_RETIRED.ABORTED_MEM", 0xc9, 0x08, true }, + { "RTM_RETIRED.ABORTED_TIMER", 0xc9, 0x10, true }, + { "RTM_RETIRED.ABORTED_UNFRIENDLY", 0xc9, 0x20, true }, + { "RTM_RETIRED.ABORTED_MEMTYPE", 0xc9, 0x40, true }, + { "RTM_RETIRED.ABORTED_EVENTS", 0xc9, 0x80, true }, + { "FP_ASSIST.ANY", 0xca, 0x1e, true }, + { "HW_INTERRUPTS.RECEIVED", 0xcb, 0x01, true }, + { "ROB_MISC_EVENTS.LBR_INSERTS", 0xcc, 0x20, true }, + { "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_4", 0xcd, 0x01, true }, + { "MEM_INST_RETIRED.STLB_MISS_LOADS", 0xd0, 0x11, true }, + { "MEM_INST_RETIRED.STLB_MISS_STORES", 0xd0, 0x12, true }, + { "MEM_INST_RETIRED.LOCK_LOADS", 0xd0, 0x21, true }, + { "MEM_INST_RETIRED.SPLIT_LOADS", 0xd0, 0x41, true }, + { "MEM_INST_RETIRED.SPLIT_STORES", 0xd0, 0x42, true }, + { "MEM_INST_RETIRED.ALL_LOADS", 0xd0, 0x81, true }, + { "MEM_INST_RETIRED.ALL_STORES", 0xd0, 0x82, true }, + { "MEM_LOAD_RETIRED.L1_HIT", 0xd1, 0x01, true }, + { "MEM_LOAD_RETIRED.L2_HIT", 0xd1, 0x02, true }, + { "MEM_LOAD_RETIRED.L3_HIT", 0xd1, 0x04, true }, + { "MEM_LOAD_RETIRED.L1_MISS", 0xd1, 0x08, true }, + { "MEM_LOAD_RETIRED.L2_MISS", 0xd1, 0x10, true }, + { "MEM_LOAD_RETIRED.L3_MISS", 0xd1, 0x20, true }, + { "MEM_LOAD_RETIRED.FB_HIT", 0xd1, 0x40, true }, + { "MEM_LOAD_L3_HIT_RETIRED.XSNP_MISS", 0xd2, 0x01, true }, + { "MEM_LOAD_L3_HIT_RETIRED.XSNP_HIT", 0xd2, 0x02, true }, + { "MEM_LOAD_L3_HIT_RETIRED.XSNP_HITM", 0xd2, 0x04, true }, + { "MEM_LOAD_L3_HIT_RETIRED.XSNP_NONE", 0xd2, 0x08, true }, + { "MEM_LOAD_L3_MISS_RETIRED.LOCAL_DRAM", 0xd3, 0x01, true }, + { "MEM_LOAD_L3_MISS_RETIRED.REMOTE_DRAM", 0xd3, 0x02, true }, + { "MEM_LOAD_L3_MISS_RETIRED.REMOTE_HITM", 0xd3, 0x04, true }, + { "MEM_LOAD_L3_MISS_RETIRED.REMOTE_FWD", 0xd3, 0x08, true }, + { "MEM_LOAD_MISC_RETIRED.UC", 0xd4, 0x04, true }, + { "BACLEARS.ANY", 0xe6, 0x01, true }, + { "L2_TRANS.L2_WB", 0xf0, 0x40, true }, + { "L2_LINES_IN.ALL", 0xf1, 0x1f, true }, + { "L2_LINES_OUT.SILENT", 0xf2, 0x01, true }, + { "L2_LINES_OUT.NON_SILENT", 0xf2, 0x02, true }, + { "L2_LINES_OUT.USELESS_PREF", 0xf2, 0x04, true }, + { "SQ_MISC.SPLIT_LOCK", 0xf4, 0x10, true }, + { "IDI_MISC.WB_UPGRADE", 0xfe, 0x02, true }, + { "IDI_MISC.WB_DOWNGRADE", 0xfe, 0x04, true }, +}; + +static struct event_table intel_skylake_x = { + .tablename = "Intel Skylake-X", + .names = intel_skylake_x_names, + .nevents = sizeof(intel_skylake_x_names) / + sizeof(struct name_to_event), + .next = NULL +}; + +static struct event_table * +init_intel_skylake_x(void) +{ + + return &intel_skylake_x; +} + +/* + * Intel Cascade Lake. + */ +static struct name_to_event intel_cascadelake_names[] = { + { "MEM_LOAD_RETIRED.LOCAL_PMM", 0xd1, 0x80, true }, + { "MEM_LOAD_L3_MISS_RETIRED.REMOTE_PMM", 0xd3, 0x10, true }, +}; + +static struct event_table intel_cascadelake = { + .tablename = "Intel Cascade Lake", + .names = intel_cascadelake_names, + .nevents = sizeof(intel_cascadelake_names) / + sizeof(struct name_to_event), + .next = NULL +}; + +static struct event_table * +init_intel_cascadelake(void) +{ + + intel_skylake_x.next = &intel_cascadelake; + + return &intel_skylake_x; +} + static struct event_table * init_intel_generic(void) { unsigned int eax, ebx, ecx, edx; struct event_table *table; + uint8_t stepping; /* * The kernel made sure the Architectural Version 1 PMCs were @@ -551,33 +819,44 @@ init_intel_generic(void) if (CPUID_TO_FAMILY(eax) == 6) { switch (CPUID_TO_MODEL(eax)) { case 0x37: /* Silvermont (Bay Trail) */ - case 0x4A: /* Silvermont (Tangier) */ - case 0x4C: /* Airmont (Braswell, Cherry Trail) */ - case 0x4D: /* Silvermont (Avoton, Rangeley) */ - case 0x5A: /* Silvermont (Anniedale) */ - case 0x5D: /* Silvermont (SoFIA) */ + case 0x4a: /* Silvermont (Tangier) */ + case 0x4c: /* Airmont (Braswell, Cherry Trail) */ + case 0x4d: /* Silvermont (Avoton, Rangeley) */ + case 0x5a: /* Silvermont (Anniedale) */ + case 0x5d: /* Silvermont (SoFIA) */ table->next = init_intel_silvermont_airmont(); break; - case 0x5C: /* Goldmont (Apollo Lake) */ - case 0x5F: /* Goldmont (Denverton) */ + case 0x5c: /* Goldmont (Apollo Lake) */ + case 0x5f: /* Goldmont (Denverton) */ table->next = init_intel_goldmont(); break; - case 0x7A: /* Goldmont Plus (Gemini Lake) */ + case 0x7a: /* Goldmont Plus (Gemini Lake) */ table->next = init_intel_goldmontplus(); break; - case 0x4E: /* Skylake */ - case 0x5E: /* Skylake */ - case 0x8E: /* Kabylake */ - case 0x9E: /* Kabylake */ + case 0x4e: /* Skylake */ + case 0x5e: /* Skylake */ + case 0x8e: /* Kaby Lake */ + case 0x9e: /* Kaby Lake */ + case 0xa5: /* Comet Lake */ + case 0xa6: /* Comet Lake */ table->next = init_intel_skylake_kabylake(); break; + + case 0x55: /* Skylake-X, Cascade Lake */ + stepping = CPUID_TO_STEPPING(eax); + if (stepping <= 4) + table->next = init_intel_skylake_x(); + else + table->next = init_intel_cascadelake(); + break; + } } return table; } -/* -------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------- */ /* * AMD Family 10h @@ -611,10 +890,10 @@ static struct name_to_event amd_f10h_nam { "l1cache-writeback-exclusive",0x44, 0x04, true }, { "l1cache-writeback-owner", 0x44, 0x08, true }, { "l1cache-writeback-modified", 0x44, 0x10, true }, - { "l1DTLB-hit-all", 0x4D, 0x07, true }, - { "l1DTLB-hit-4Kpage", 0x4D, 0x01, true }, - { "l1DTLB-hit-2Mpage", 0x4D, 0x02, true }, - { "l1DTLB-hit-1Gpage", 0x4D, 0x04, true }, + { "l1DTLB-hit-all", 0x4d, 0x07, true }, + { "l1DTLB-hit-4Kpage", 0x4d, 0x01, true }, + { "l1DTLB-hit-2Mpage", 0x4d, 0x02, true }, + { "l1DTLB-hit-1Gpage", 0x4d, 0x04, true }, { "l1DTLB-miss-all", 0x45, 0x07, true }, { "l1DTLB-miss-4Kpage", 0x45, 0x01, true }, { "l1DTLB-miss-2Mpage", 0x45, 0x02, true }, @@ -633,26 +912,26 @@ static struct name_to_event amd_f10h_nam { "ins-refill-l2", 0x82, 0x00, true }, { "ins-refill-sys", 0x83, 0x00, true }, { "ins-fetch-stall", 0x87, 0x00, true }, - { "ins-retired", 0xC0, 0x00, true }, - { "ins-empty", 0xD0, 0x00, true }, - { "ops-retired", 0xC1, 0x00, true }, - { "branch-retired", 0xC2, 0x00, true }, - { "branch-miss-retired", 0xC3, 0x00, true }, - { "branch-taken-retired", 0xC4, 0x00, true }, - { "branch-taken-miss-retired", 0xC5, 0x00, true }, - { "branch-far-retired", 0xC6, 0x00, true }, - { "branch-resync-retired", 0xC7, 0x00, true }, - { "branch-near-retired", 0xC8, 0x00, true }, - { "branch-near-miss-retired", 0xC9, 0x00, true }, - { "branch-indirect-miss-retired", 0xCA, 0x00, true }, - { "int-hw", 0xCF, 0x00, true }, - { "int-cycles-masked", 0xCD, 0x00, true }, - { "int-cycles-masked-pending", 0xCE, 0x00, true }, - { "fpu-exceptions", 0xDB, 0x00, true }, - { "break-match0", 0xDC, 0x00, true }, - { "break-match1", 0xDD, 0x00, true }, - { "break-match2", 0xDE, 0x00, true }, - { "break-match3", 0xDF, 0x00, true }, + { "ins-retired", 0xc0, 0x00, true }, + { "ins-empty", 0xd0, 0x00, true }, + { "ops-retired", 0xc1, 0x00, true }, + { "branch-retired", 0xc2, 0x00, true }, + { "branch-miss-retired", 0xc3, 0x00, true }, + { "branch-taken-retired", 0xc4, 0x00, true }, + { "branch-taken-miss-retired", 0xc5, 0x00, true }, + { "branch-far-retired", 0xc6, 0x00, true }, + { "branch-resync-retired", 0xc7, 0x00, true }, + { "branch-near-retired", 0xc8, 0x00, true }, + { "branch-near-miss-retired", 0xc9, 0x00, true }, + { "branch-indirect-miss-retired", 0xca, 0x00, true }, + { "int-hw", 0xcf, 0x00, true }, + { "int-cycles-masked", 0xcd, 0x00, true }, + { "int-cycles-masked-pending", 0xce, 0x00, true }, + { "fpu-exceptions", 0xdb, 0x00, true }, + { "break-match0", 0xdc, 0x00, true }, + { "break-match1", 0xdd, 0x00, true }, + { "break-match2", 0xde, 0x00, true }, + { "break-match3", 0xdf, 0x00, true }, }; static struct event_table amd_f10h = { @@ -794,31 +1073,31 @@ static struct name_to_event amd_f17h_nam { "IcCacheFillL2", 0x82, 0x00, true }, { "IcCacheFillSys", 0x83, 0x00, true }, { "IcFetchStall", 0x87, __BITS(2,0), true }, - { "IcCacheInval", 0x8C, __BITS(1,0), true }, + { "IcCacheInval", 0x8c, __BITS(1,0), true }, { "BpL1TlbMissL2Hit", 0x84, 0x00, true }, { "BpL1TlbMissL2Miss", 0x85, 0x00, true }, { "BpSnpReSync", 0x86, 0x00, true }, - { "BpL1BTBCorrect", 0x8A, 0x00, true }, - { "BpL2BTBCorrect", 0x8B, 0x00, true }, + { "BpL1BTBCorrect", 0x8a, 0x00, true }, + { "BpL2BTBCorrect", 0x8b, 0x00, true }, { "BpTlbRel", 0x99, 0x00, true }, - { "ExRetInstr", 0xC0, 0x00, true }, - { "ExRetCops", 0xC1, 0x00, true }, - { "ExRetBrn", 0xC2, 0x00, true }, - { "ExRetBrnMisp", 0xC3, 0x00, true }, - { "ExRetBrnTkn", 0xC4, 0x00, true }, - { "ExRetBrnTknMisp", 0xC5, 0x00, true }, - { "ExRetBrnFar", 0xC6, 0x00, true }, - { "ExRetBrnResync", 0xC7, 0x00, true }, - { "ExRetBrnIndMisp", 0xCA, 0x00, true }, - { "ExRetNearRet", 0xC8, 0x00, true }, - { "ExRetNearRetMispred", 0xC9, 0x00, true }, - { "ExRetMmxFpInstr@X87", 0xCB, __BIT(0), true }, - { "ExRetMmxFpInstr@Mmx", 0xCB, __BIT(1), true }, - { "ExRetMmxFpInstr@Sse", 0xCB, __BIT(2), true }, - { "ExRetCond", 0xD1, 0x00, true }, - { "ExRetCondMisp", 0xD2, 0x00, true }, - { "ExDivBusy", 0xD3, 0x00, true }, - { "ExDivCount", 0xD4, 0x00, true }, + { "ExRetInstr", 0xc0, 0x00, true }, + { "ExRetCops", 0xc1, 0x00, true }, + { "ExRetBrn", 0xc2, 0x00, true }, + { "ExRetBrnMisp", 0xc3, 0x00, true }, + { "ExRetBrnTkn", 0xc4, 0x00, true }, + { "ExRetBrnTknMisp", 0xc5, 0x00, true }, + { "ExRetBrnFar", 0xc6, 0x00, true }, + { "ExRetBrnResync", 0xc7, 0x00, true }, + { "ExRetBrnIndMisp", 0xca, 0x00, true }, + { "ExRetNearRet", 0xc8, 0x00, true }, + { "ExRetNearRetMispred", 0xc9, 0x00, true }, + { "ExRetMmxFpInstr@X87", 0xcb, __BIT(0), true }, + { "ExRetMmxFpInstr@Mmx", 0xcb, __BIT(1), true }, + { "ExRetMmxFpInstr@Sse", 0xcb, __BIT(2), true }, + { "ExRetCond", 0xd1, 0x00, true }, + { "ExRetCondMisp", 0xd2, 0x00, true }, + { "ExDivBusy", 0xd3, 0x00, true }, + { "ExDivCount", 0xd4, 0x00, true }, }; static struct event_table amd_f17h = { @@ -829,6 +1108,186 @@ static struct event_table amd_f17h = { .next = NULL }; +/* + * AMD Family 19h + * From PPR: + * - f19h model 01h B1 (zen3) + * - f19h model 11h B1 (zen4) + * - f19h model 21h B1 (zen3) + * - f19h model 51h A1 (zen3) + */ +static struct name_to_event amd_f19h_names[] = { + /* Model 1x only */ + { "FpRetx87FpOps", 0x02, __BITS(2,0), true }, + + /* Only model 1x has bit 4 */ + { "FpRetSseAvxOps", 0x03, __BITS(4,0), true }, + + { "FpRetiredSerOps", 0x05, __BITS(3,0), true }, + + /* Model 1x only */ + { "FpOpsRetiredByWidth", 0x08, __BITS(5,0), true }, + { "FpOpsRetiredByType", 0x0a, __BITS(7,0), true }, + { "SseAvxOpsRetired", 0x0b, __BITS(7,0), true }, + { "FpPackOpsRetired", 0x0c, __BITS(7,0), true }, + { "PackedIntOpType", 0x0d, __BITS(7,0), true }, + + { "FpDispFaults", 0x0e, __BITS(3,0), true }, + { "LsBadStatus2", 0x24, __BIT(1), true }, + { "LsLocks", 0x25, __BIT(0), true }, + { "LsRetClClush", 0x26, 0x00, true }, + { "LsRetCpuid", 0x27, 0x00, true }, + { "LsDispatch", 0x29, __BITS(2,0), true }, + { "LsSmiRx", 0x2b, 0x00, true }, + { "LsIntTaken", 0x2c, 0x00, true }, + { "LsSTLF", 0x35, 0x00, true }, + { "LsStCommitCancel2", 0x37, __BIT(0), true }, + { "LsMabAlloc-ls", 0x41, 0x3f, true }, + { "LsMabAlloc-hp", 0x41, 0x40, true }, + { "LsMabAlloc-all", 0x41, 0x7f, true }, + { "LsDmndFillsFromSys", 0x43, 0x5f, true }, + + /* Only model 1x has bit 7 */ + { "LsAnyFillsFromSys", 0x44, 0xdf, true }, + + { "LsL1DTlbMiss", 0x45, __BITS(7,0), true }, + { "LsMisalLoads-MA64", 0x47, __BIT(0), true }, + { "LsMisalLoads-MA4K", 0x47, __BIT(1), true }, + { "LsMisalLoads-all", 0x47, __BITS(1,0), true }, + { "LsPrefInstrDisp", 0x4b, __BITS(2,0), true }, + { "LsInefSwPref", 0x52, __BITS(1,0), true }, + + /* Only model 1x has bit 7 */ + { "LsSwPfDcFills", 0x59, 0xdf, true }, + { "LsHwPfDcFills", 0x5a, 0xdf, true }, + + { "LsAllocMabCount", 0x5f, 0x00, true }, + { "LsNotHaltedCyc", 0x76, 0x00, true }, + + /* Model 0x, 1x and 2x only */ + { "LsTlbFlush", 0x78, 0xff, true }, + + /* Model 1x only */ + { "LsNotHaltedP0Cyc", 0x120, __BIT(0), true }, + + { "IcCacheFillL2", 0x82, 0x00, true }, + { "IcCacheFillSys", 0x83, 0x00, true }, + { "BpL1TlbMissL2TlbHit", 0x84, 0x00, true }, + { "BpL1TlbMissL2TlbMiss-IF4K", 0x85, __BIT(0), true }, + { "BpL1TlbMissL2TlbMiss-IF2M", 0x85, __BIT(1), true }, + { "BpL1TlbMissL2TlbMiss-IF1G", 0x85, __BIT(2), true }, + { "BpL1TlbMissL2TlbMiss-Coalesced4K", 0x85, __BIT(3), true }, + { "BpL1TlbMissL2TlbMiss-all", 0x85, __BITS(3,0), true }, + + { "BpL2BTBCorrect", 0x8b, 0x00, true }, + { "BpDynIndPred", 0x8e, 0x00, true }, + { "BpDeReDirect", 0x91, 0x00, true }, + { "BpL1TlbFetchHit-IF4K", 0x94, __BIT(0), true }, + { "BpL1TlbFetchHit-IF2M", 0x94, __BIT(1), true }, + { "BpL1TlbFetchHit-IF1G", 0x94, __BIT(2), true }, + { "BpL1TlbFetchHit-all", 0x94, __BITS(2,0), true }, + + /* Model 1x only */ + { "ResyncsOrNcRedirects", 0x96, 0x00, true }, + + { "IcTagHitMiss-hit", 0x18e, 0x07, true }, + { "IcTagHitMiss-miss", 0x18e, 0x18, true }, + { "IcTagHitMiss-all", 0x18e, 0x1f, true }, + { "OpCacheHitMiss-hit", 0x28f, 0x03, true }, + { "OpCacheHitMiss-miss", 0x28f, 0x04, true }, + { "OpCacheHitMiss-all", 0x28f, 0x07, true }, + { "DeOpQueueEmpty", 0xa9, 0x00, true }, + + /* + * Model 0x and 1x only. + * Only model 1x has bit 2. + */ + { "DeSrcOpDisp", 0xaa, __BITS(2,0), true }, + + { "DeDisOpsFromDecoder-Fp-Ibs", 0xab, 0x04, true }, + { "DeDisOpsFromDecoder-Int-Ibs", 0xab, 0x08, true }, + + /* Model 0x, 2x and newer */ + { "DeDisOpsFromDecoder-Fp-Ret", 0xab, 0x84, true }, + { "DeDisOpsFromDecoder-Int-Ret", 0xab, 0x88, true }, + + { "DeDisDispatchTokenStalls1", 0xae, 0xf7, true }, + { "DeDisDispatchTokenStalls2", 0xaf, 0x2f, true }, + + /* Model 1x only */ + { "DeNoDispatchPerSolt-empty", 0x1a0, 0x01, true }, + { "DeNoDispatchPerSolt-backend", 0x1a0, 0x1e, true }, + { "DeNoDispatchPerSolt-otherSMT", 0x1a0, 0x60, true }, + { "DeAdditionalResourceStalls", 0x1a2, 0x30, true }, + + { "ExRetInstr", 0xc0, 0x00, true }, + { "ExRetCops", 0xc1, 0x00, true }, + { "ExRetBrn", 0xc2, 0x00, true }, + { "ExRetBrnMisp", 0xc3, 0x00, true }, + { "ExRetBrnTkn", 0xc4, 0x00, true }, + { "ExRetBrnTknMisp", 0xc5, 0x00, true }, + { "ExRetBrnFar", 0xc6, 0x00, true }, + { "ExRetBrnIndMisp", 0xca, 0x00, true }, + { "ExRetNearRet", 0xc8, 0x00, true }, + { "ExRetNearRetMispred", 0xc9, 0x00, true }, + { "ExRetMmxFpInstr@X87", 0xcb, __BIT(0), true }, + { "ExRetMmxFpInstr@Mmx", 0xcb, __BIT(1), true }, + { "ExRetMmxFpInstr@Sse", 0xcb, __BIT(2), true }, + { "ExRetIndBrchInstr", 0xcc, 0x00, true }, + { "ExRetCond", 0xd1, 0x00, true }, + { "ExDivBusy", 0xd3, 0x00, true }, + { "ExDivCount", 0xd4, 0x00, true }, + + /* Model 1x only */ + { "ExDivCount-LoadAndALU", 0xd6, 0x1f, true }, + { "ExDivCount-Load", 0xd6, 0xbf, true }, + { "ExRetUcodeInstr", 0x1c1, 0x00, true }, + { "ExRetUcodeOps", 0x1c2, 0x00, true }, + + { "ExRetMsprdBrnchInstrDirMsmtch", 0x1c7, 0x00, true }, + + /* Model 1x only */ + { "ExRetUncondBrnchInstrMspred", 0x1c8, 0x00, true }, + { "ExRetUncondBrnchInstr", 0x1c8, 0x00, true }, + + { "ExTaggedIbsOps", 0x1cf, __BITS(2,0), true }, + { "ExRetFusedInstr", 0x1d0, 0x00, true }, + + /* Only model 1x has bit 0 */ + { "L2RequestG1", 0x60, __BITS(7,1), true }, + + { "L2CacheReqStart", 0x64, __BITS(7,0), true }, + { "L2PfHitL2-L2", 0x70, __BITS(4,0), true }, + { "L2PfHitL2-L1", 0x70, __BITS(7,5), true }, + { "L2PfHitL2-all", 0x70, __BITS(7,0), true }, + { "L2PfMissL2HitL3-L2", 0x71, __BITS(4,0), true }, + { "L2PfMissL2HitL3-L1", 0x71, __BITS(7,5), true }, + { "L2PfMIssL2HitL3-all", 0x71, __BITS(7,0), true }, + { "L2PfMissL2L3-L2", 0x72, __BITS(4,0), true }, + { "L2PfMissL2L3-L1", 0x72, __BITS(7,5), true }, + { "L2PfMIssL2L3-all", 0x72, __BITS(7,0), true }, + + { "L3LookupState-L3Miss", 0x04, __BIT(0), true }, + { "L3LookupState-L3Hit", 0x04, __BITS(7,1), true }, + { "L3LookupState-all", 0x04, __BITS(7,0), true }, + + /* Model 0x, 2x and newer */ + { "XiSysFillLatency", 0x90, 0x00, true }, + { "XiCcxSdpReq1", 0x9a, 0x00, true }, + + /* Model 1x only */ + { "XiSampledLatency", 0xac, 0x00, true }, + { "XiSampledLatencyRequests", 0xad, 0x00, true }, +}; + +static struct event_table amd_f19h = { + .tablename = "AMD Family 19h", + .names = amd_f19h_names, + .nevents = sizeof(amd_f19h_names) / + sizeof(struct name_to_event), + .next = NULL +}; + static struct event_table * init_amd_generic(void) { @@ -847,16 +1306,19 @@ init_amd_generic(void) return &amd_f15h; case 0x17: return &amd_f17h; + case 0x19: + return &amd_f19h; } return NULL; } -/* -------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------- */ int tprof_event_init(uint32_t ident) { + switch (ident) { case TPROF_IDENT_NONE: return -1; @@ -882,14 +1344,14 @@ recursive_event_list(struct event_table printf("\t%s\n", table->names[i].name); } - if (table->next != NULL) { + if (table->next != NULL) recursive_event_list(table->next); - } } void tprof_event_list(void) { + recursive_event_list(cpuevents); } @@ -909,15 +1371,15 @@ recursive_event_lookup(struct event_tabl } } - if (table->next != NULL) { + if (table->next != NULL) recursive_event_lookup(table->next, name, param); - } else { + else errx(EXIT_FAILURE, "event '%s' unknown", name); - } } void tprof_event_lookup(const char *name, struct tprof_param *param) { + recursive_event_lookup(cpuevents, name, param); }