|
@@ -1392,6 +1392,46 @@ static struct attribute_group x86_pmu_events_group = {
|
|
|
.attrs = events_attr,
|
|
|
};
|
|
|
|
|
|
+ssize_t x86_event_sysfs_show(char *page, u64 config)
|
|
|
+{
|
|
|
+ u64 event = (config & ARCH_PERFMON_EVENTSEL_EVENT);
|
|
|
+ u64 umask = (config & ARCH_PERFMON_EVENTSEL_UMASK) >> 8;
|
|
|
+ u64 cmask = (config & ARCH_PERFMON_EVENTSEL_CMASK) >> 24;
|
|
|
+ bool edge = (config & ARCH_PERFMON_EVENTSEL_EDGE);
|
|
|
+ bool pc = (config & ARCH_PERFMON_EVENTSEL_PIN_CONTROL);
|
|
|
+ bool any = (config & ARCH_PERFMON_EVENTSEL_ANY);
|
|
|
+ bool inv = (config & ARCH_PERFMON_EVENTSEL_INV);
|
|
|
+ ssize_t ret;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We have whole page size to spend and just little data
|
|
|
+ * to write, so we can safely use sprintf.
|
|
|
+ */
|
|
|
+ ret = sprintf(page, "event=0x%02llx", event);
|
|
|
+
|
|
|
+ if (umask)
|
|
|
+ ret += sprintf(page + ret, ",umask=0x%02llx", umask);
|
|
|
+
|
|
|
+ if (edge)
|
|
|
+ ret += sprintf(page + ret, ",edge");
|
|
|
+
|
|
|
+ if (pc)
|
|
|
+ ret += sprintf(page + ret, ",pc");
|
|
|
+
|
|
|
+ if (any)
|
|
|
+ ret += sprintf(page + ret, ",any");
|
|
|
+
|
|
|
+ if (inv)
|
|
|
+ ret += sprintf(page + ret, ",inv");
|
|
|
+
|
|
|
+ if (cmask)
|
|
|
+ ret += sprintf(page + ret, ",cmask=0x%02llx", cmask);
|
|
|
+
|
|
|
+ ret += sprintf(page + ret, "\n");
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static int __init init_hw_perf_events(void)
|
|
|
{
|
|
|
struct x86_pmu_quirk *quirk;
|