diff options
author | Matt Macy <mmacy@FreeBSD.org> | 2018-06-04 02:05:48 +0000 |
---|---|---|
committer | Matt Macy <mmacy@FreeBSD.org> | 2018-06-04 02:05:48 +0000 |
commit | 07d80fd8dc996a84b1f135dc11c6a4b07de6b12b (patch) | |
tree | 5f5838ed23dff81ae5b9e3a16c17b2021b12beae /lib | |
parent | 5de96e33d68b091cd1c8d682799606e2a3d8f6fa (diff) | |
download | src-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.c | 52 | ||||
-rw-r--r-- | lib/libpmc/pmclog.c | 2 | ||||
-rw-r--r-- | lib/libpmc/pmclog.h | 1 |
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 { |