aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/cpu/perf_event.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/cpu/perf_event.c')
-rw-r--r--arch/x86/kernel/cpu/perf_event.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
index 39737a678a86..8a1fa23452d6 100644
--- a/arch/x86/kernel/cpu/perf_event.c
+++ b/arch/x86/kernel/cpu/perf_event.c
@@ -1392,6 +1392,46 @@ static struct attribute_group x86_pmu_events_group = {
1392 .attrs = events_attr, 1392 .attrs = events_attr,
1393}; 1393};
1394 1394
1395ssize_t x86_event_sysfs_show(char *page, u64 config)
1396{
1397 u64 event = (config & ARCH_PERFMON_EVENTSEL_EVENT);
1398 u64 umask = (config & ARCH_PERFMON_EVENTSEL_UMASK) >> 8;
1399 u64 cmask = (config & ARCH_PERFMON_EVENTSEL_CMASK) >> 24;
1400 bool edge = (config & ARCH_PERFMON_EVENTSEL_EDGE);
1401 bool pc = (config & ARCH_PERFMON_EVENTSEL_PIN_CONTROL);
1402 bool any = (config & ARCH_PERFMON_EVENTSEL_ANY);
1403 bool inv = (config & ARCH_PERFMON_EVENTSEL_INV);
1404 ssize_t ret;
1405
1406 /*
1407 * We have whole page size to spend and just little data
1408 * to write, so we can safely use sprintf.
1409 */
1410 ret = sprintf(page, "event=0x%02llx", event);
1411
1412 if (umask)
1413 ret += sprintf(page + ret, ",umask=0x%02llx", umask);
1414
1415 if (edge)
1416 ret += sprintf(page + ret, ",edge");
1417
1418 if (pc)
1419 ret += sprintf(page + ret, ",pc");
1420
1421 if (any)
1422 ret += sprintf(page + ret, ",any");
1423
1424 if (inv)
1425 ret += sprintf(page + ret, ",inv");
1426
1427 if (cmask)
1428 ret += sprintf(page + ret, ",cmask=0x%02llx", cmask);
1429
1430 ret += sprintf(page + ret, "\n");
1431
1432 return ret;
1433}
1434
1395static int __init init_hw_perf_events(void) 1435static int __init init_hw_perf_events(void)
1396{ 1436{
1397 struct x86_pmu_quirk *quirk; 1437 struct x86_pmu_quirk *quirk;