static int amd_pmu_hw_config(struct perf_event *event) { int ret = x86_pmu_hw_config(event); if (ret) return ret; if (has_branch_stack(event)) return -EOPNOTSUPP; if (event->attr.exclude_host && event->attr.exclude_guest) 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; event->hw.config |= event->attr.config & AMD64_RAW_EVENT_MASK; return 0; }
static int amd_pmu_hw_config(struct perf_event *event) { int ret = x86_pmu_hw_config(event); if (ret) return ret; if (has_branch_stack(event)) return -EOPNOTSUPP; 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; event->hw.config |= event->attr.config & AMD64_RAW_EVENT_MASK; return 0; }
static int amd_pmu_hw_config(struct perf_event *event) { int ret = x86_pmu_hw_config(event); if (ret) return ret; if (event->attr.type != PERF_TYPE_RAW) return 0; event->hw.config |= event->attr.config & AMD64_RAW_EVENT_MASK; return 0; }