aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMitchell Horne <mhorne@FreeBSD.org>2021-05-27 20:02:04 +0000
committerMitchell Horne <mhorne@FreeBSD.org>2021-06-30 19:47:18 +0000
commit28dd6730a5d6bc73aca4c015c0ff875a9def25ac (patch)
tree0032bfcbb575cbcdff33392d62172256cb513ab9 /lib
parent8cc3815f02be9fa2a96e47713ad989e6d787e12a (diff)
Diffstat (limited to 'lib')
-rw-r--r--lib/libpmc/libpmc_pmu_util.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/libpmc/libpmc_pmu_util.c b/lib/libpmc/libpmc_pmu_util.c
index 81320a3dc954..d33abdb50acc 100644
--- a/lib/libpmc/libpmc_pmu_util.c
+++ b/lib/libpmc/libpmc_pmu_util.c
@@ -2,6 +2,10 @@
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2018, Matthew Macy
+ * Copyright (c) 2021, The FreeBSD Foundation
+ *
+ * Portions of this software were developed by Mitchell Horne
+ * under sponsorship from the FreeBSD Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -139,6 +143,24 @@ pmu_alias_get(const char *name)
return (name);
}
+#elif defined(__aarch64__)
+
+static struct pmu_alias pmu_armv8_alias_table[] = {
+ {NULL, NULL},
+};
+
+static const char *
+pmu_alias_get(const char *name)
+{
+ struct pmu_alias *pa;
+
+ for (pa = pmu_armv8_alias_table; pa->pa_alias != NULL; pa++)
+ if (strcasecmp(name, pa->pa_alias) == 0)
+ return (pa->pa_name);
+
+ return (name);
+}
+
#else
static const char *
@@ -549,6 +571,28 @@ pmc_pmu_pmcallocate(const char *event_name, struct pmc_op_pmcallocate *pm)
return (pmc_pmu_amd_pmcallocate(event_name, pm, &ped));
}
+#elif defined(__aarch64__)
+
+int
+pmc_pmu_pmcallocate(const char *event_name, struct pmc_op_pmcallocate *pm)
+{
+ const struct pmu_event *pe;
+ int idx = -1;
+
+ event_name = pmu_alias_get(event_name);
+ if ((pe = pmu_event_get(NULL, event_name, &idx)) == NULL)
+ return (ENOENT);
+ if (pe->event == NULL)
+ return (ENOENT);
+
+ assert(idx >= 0);
+ pm->pm_md.pm_md_flags |= PM_MD_RAW_EVENT;
+ pm->pm_class = PMC_CLASS_ARMV8;
+ pm->pm_caps |= (PMC_CAP_READ | PMC_CAP_WRITE);
+
+ return (0);
+}
+
#else
int