|
@@ -12,6 +12,8 @@
|
|
|
#include "pmu.h"
|
|
#include "pmu.h"
|
|
|
#include "parse-events.h"
|
|
#include "parse-events.h"
|
|
|
#include "cpumap.h"
|
|
#include "cpumap.h"
|
|
|
|
|
+#include "header.h"
|
|
|
|
|
+#include "pmu-events/pmu-events.h"
|
|
|
|
|
|
|
|
struct perf_pmu_format {
|
|
struct perf_pmu_format {
|
|
|
char *name;
|
|
char *name;
|
|
@@ -473,6 +475,61 @@ static struct cpu_map *pmu_cpumask(const char *name)
|
|
|
return cpus;
|
|
return cpus;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/*
|
|
|
|
|
+ * Return the CPU id as a raw string.
|
|
|
|
|
+ *
|
|
|
|
|
+ * Each architecture should provide a more precise id string that
|
|
|
|
|
+ * can be use to match the architecture's "mapfile".
|
|
|
|
|
+ */
|
|
|
|
|
+char * __weak get_cpuid_str(void)
|
|
|
|
|
+{
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/*
|
|
|
|
|
+ * From the pmu_events_map, find the table of PMU events that corresponds
|
|
|
|
|
+ * to the current running CPU. Then, add all PMU events from that table
|
|
|
|
|
+ * as aliases.
|
|
|
|
|
+ */
|
|
|
|
|
+static void pmu_add_cpu_aliases(struct list_head *head)
|
|
|
|
|
+{
|
|
|
|
|
+ int i;
|
|
|
|
|
+ struct pmu_events_map *map;
|
|
|
|
|
+ struct pmu_event *pe;
|
|
|
|
|
+ char *cpuid;
|
|
|
|
|
+
|
|
|
|
|
+ cpuid = get_cpuid_str();
|
|
|
|
|
+ if (!cpuid)
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
|
|
+ i = 0;
|
|
|
|
|
+ while (1) {
|
|
|
|
|
+ map = &pmu_events_map[i++];
|
|
|
|
|
+ if (!map->table)
|
|
|
|
|
+ goto out;
|
|
|
|
|
+
|
|
|
|
|
+ if (!strcmp(map->cpuid, cpuid))
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Found a matching PMU events table. Create aliases
|
|
|
|
|
+ */
|
|
|
|
|
+ i = 0;
|
|
|
|
|
+ while (1) {
|
|
|
|
|
+ pe = &map->table[i++];
|
|
|
|
|
+ if (!pe->name)
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ /* need type casts to override 'const' */
|
|
|
|
|
+ __perf_pmu__new_alias(head, NULL, (char *)pe->name,
|
|
|
|
|
+ (char *)pe->desc, (char *)pe->event);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+out:
|
|
|
|
|
+ free(cpuid);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
struct perf_event_attr * __weak
|
|
struct perf_event_attr * __weak
|
|
|
perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused)
|
|
perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused)
|
|
|
{
|
|
{
|
|
@@ -497,6 +554,9 @@ static struct perf_pmu *pmu_lookup(const char *name)
|
|
|
if (pmu_aliases(name, &aliases))
|
|
if (pmu_aliases(name, &aliases))
|
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
+ if (!strcmp(name, "cpu"))
|
|
|
|
|
+ pmu_add_cpu_aliases(&aliases);
|
|
|
|
|
+
|
|
|
if (pmu_type(name, &type))
|
|
if (pmu_type(name, &type))
|
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|