perf/x86: Add hardware events translations for Intel cpus
Add support for Intel processors to display 'events' sysfs directory (/sys/devices/cpu/events/) with hw event translations: # ls /sys/devices/cpu/events/ branch-instructions branch-misses bus-cycles cache-misses cache-references cpu-cycles instructions ref-cycles stalled-cycles-backend stalled-cycles-frontend Suggested-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> Cc: Paul Mackerras <paulus@samba.org> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Stephane Eranian <eranian@google.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1349873598-12583-4-git-send-email-jolsa@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
@@ -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;
|
||||
|
Reference in New Issue
Block a user