|
@@ -138,6 +138,19 @@ static int amd_pmu_hw_config(struct perf_event *event)
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
+ if (event->attr.exclude_host && event->attr.exclude_guest)
|
|
|
+ /*
|
|
|
+ * When HO == GO == 1 the hardware treats that as GO == HO == 0
|
|
|
+ * and will count in both modes. We don't want to count in that
|
|
|
+ * case so we emulate no-counting by setting US = OS = 0.
|
|
|
+ */
|
|
|
+ event->hw.config &= ~(ARCH_PERFMON_EVENTSEL_USR |
|
|
|
+ ARCH_PERFMON_EVENTSEL_OS);
|
|
|
+ else if (event->attr.exclude_host)
|
|
|
+ event->hw.config |= AMD_PERFMON_EVENTSEL_GUESTONLY;
|
|
|
+ else if (event->attr.exclude_guest)
|
|
|
+ event->hw.config |= AMD_PERFMON_EVENTSEL_HOSTONLY;
|
|
|
+
|
|
|
if (event->attr.type != PERF_TYPE_RAW)
|
|
|
return 0;
|
|
|
|