aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMatt Macy <mmacy@FreeBSD.org>2018-06-04 02:05:48 +0000
committerMatt Macy <mmacy@FreeBSD.org>2018-06-04 02:05:48 +0000
commit07d80fd8dc996a84b1f135dc11c6a4b07de6b12b (patch)
tree5f5838ed23dff81ae5b9e3a16c17b2021b12beae /lib
parent5de96e33d68b091cd1c8d682799606e2a3d8f6fa (diff)
downloadsrc-07d80fd8dc996a84b1f135dc11c6a4b07de6b12b.tar.gz
src-07d80fd8dc996a84b1f135dc11c6a4b07de6b12b.zip
hwpmc: ABI fixes
- increase pmc cpuid field from 8 to 12 bits - add cpuid version string to initialize entry in the log so that filter can identify which counter index an event name maps to - GC unused config flags - make fixed counter assignment more robust as well as the changes needed to be properly identified for filter
Notes
Notes: svn path=/head/; revision=334596
Diffstat (limited to 'lib')
-rw-r--r--lib/libpmc/libpmc_pmu_util.c52
-rw-r--r--lib/libpmc/pmclog.c2
-rw-r--r--lib/libpmc/pmclog.h1
3 files changed, 23 insertions, 32 deletions
diff --git a/lib/libpmc/libpmc_pmu_util.c b/lib/libpmc/libpmc_pmu_util.c
index 344bba12e6de..84128171e9eb 100644
--- a/lib/libpmc/libpmc_pmu_util.c
+++ b/lib/libpmc/libpmc_pmu_util.c
@@ -69,13 +69,14 @@ static struct pmu_alias pmu_alias_table[] = {
{NULL, NULL},
};
-static const char *fixed_mode_cntrs[] = {
- "inst_retired.any",
- "cpu_clk_unhalted.thread",
- "cpu_clk_unhalted.thread_any",
- "cpu_clk_unhalted.ref_tsc",
- NULL
-};
+/*
+ * The Intel fixed mode counters are:
+ * "inst_retired.any",
+ * "cpu_clk_unhalted.thread",
+ * "cpu_clk_unhalted.thread_any",
+ * "cpu_clk_unhalted.ref_tsc",
+ *
+ */
static const char *
pmu_alias_get(const char *name)
@@ -95,7 +96,7 @@ struct pmu_event_desc {
uint32_t ped_frontend;
uint32_t ped_ldlat;
uint32_t ped_config1;
- uint8_t ped_umask;
+ int16_t ped_umask;
uint8_t ped_cmask;
uint8_t ped_any;
uint8_t ped_inv;
@@ -168,6 +169,7 @@ pmu_parse_event(struct pmu_event_desc *ped, const char *eventin)
return (ENOMEM);
r = event;
bzero(ped, sizeof(*ped));
+ ped->ped_umask = -1;
while ((kvp = strsep(&event, ",")) != NULL) {
key = strsep(&kvp, "=");
if (key == NULL)
@@ -341,7 +343,6 @@ pmc_pmu_pmcallocate(const char *event_name, struct pmc_op_pmcallocate *pm)
const struct pmu_event *pe;
struct pmu_event_desc ped;
struct pmc_md_iap_op_pmcallocate *iap;
- struct pmc_md_iaf_op_pmcallocate *iaf;
int idx, isfixed;
iap = &pm->pm_md.pm_iap;
@@ -358,35 +359,22 @@ pmc_pmu_pmcallocate(const char *event_name, struct pmc_op_pmcallocate *pm)
if (pmu_parse_event(&ped, pe->event))
return (ENOENT);
- for (idx = 0; fixed_mode_cntrs[idx] != NULL; idx++)
- if (strcmp(fixed_mode_cntrs[idx], event_name) == 0)
- isfixed = 1;
- if (isfixed) {
- iaf = &pm->pm_md.pm_iaf;
- pm->pm_class = PMC_CLASS_IAF;
- if (strcasestr(pe->desc, "retired") != NULL)
- pm->pm_ev = PMC_EV_IAF_INSTR_RETIRED_ANY;
- else if (strcasestr(pe->desc, "core") != NULL ||
- strcasestr(pe->desc, "unhalted"))
- pm->pm_ev = PMC_EV_IAF_CPU_CLK_UNHALTED_CORE;
- else if (strcasestr(pe->desc, "ref") != NULL)
- pm->pm_ev = PMC_EV_IAF_CPU_CLK_UNHALTED_REF;
- iaf->pm_iaf_flags |= (IAF_USR | IAF_OS);
- if (ped.ped_any)
- iaf->pm_iaf_flags |= IAF_ANY;
- if (pm->pm_caps & PMC_CAP_INTERRUPT)
- iaf->pm_iaf_flags |= IAF_PMI;
- return (0);
- } else if (strcasestr(event_name, "UNC_") == event_name ||
- strcasestr(event_name, "uncore") != NULL) {
+
+ if (strcasestr(event_name, "UNC_") == event_name ||
+ strcasestr(event_name, "uncore") != NULL) {
pm->pm_class = PMC_CLASS_UCP;
- } else {
pm->pm_caps |= PMC_CAP_QUALIFIER;
+ } else if ((ped.ped_umask == -1) ||
+ (ped.ped_event == 0x0 && ped.ped_umask == 0x3)) {
+ pm->pm_class = PMC_CLASS_IAF;
+ } else {
pm->pm_class = PMC_CLASS_IAP;
+ pm->pm_caps |= PMC_CAP_QUALIFIER;
}
pm->pm_ev = idx;
iap->pm_iap_config |= IAP_EVSEL(ped.ped_event);
- iap->pm_iap_config |= IAP_UMASK(ped.ped_umask);
+ if (ped.ped_umask > 0)
+ iap->pm_iap_config |= IAP_UMASK(ped.ped_umask);
iap->pm_iap_config |= IAP_CMASK(ped.ped_cmask);
iap->pm_iap_rsp = ped.ped_offcore_rsp;
diff --git a/lib/libpmc/pmclog.c b/lib/libpmc/pmclog.c
index 9867431cb472..8000fa856a79 100644
--- a/lib/libpmc/pmclog.c
+++ b/lib/libpmc/pmclog.c
@@ -348,6 +348,8 @@ pmclog_get_event(void *cookie, char **data, ssize_t *len,
case PMCLOG_TYPE_INITIALIZE:
PMCLOG_READ32(le,ev->pl_u.pl_i.pl_version);
PMCLOG_READ32(le,ev->pl_u.pl_i.pl_arch);
+ PMCLOG_READ32(le, noop);
+ PMCLOG_READSTRING(le, ev->pl_u.pl_i.pl_cpuid, PMC_CPUID_LEN);
ps->ps_version = ev->pl_u.pl_i.pl_version;
ps->ps_arch = ev->pl_u.pl_i.pl_arch;
ps->ps_initialized = 1;
diff --git a/lib/libpmc/pmclog.h b/lib/libpmc/pmclog.h
index a6b4d84a1104..72f6432d9a6f 100644
--- a/lib/libpmc/pmclog.h
+++ b/lib/libpmc/pmclog.h
@@ -64,6 +64,7 @@ struct pmclog_ev_closelog {
struct pmclog_ev_initialize {
uint32_t pl_version;
uint32_t pl_arch;
+ char pl_cpuid[PATH_MAX];
};
struct pmclog_ev_map_in {