|
@@ -877,15 +877,24 @@ static int armv8pmu_set_event_filter(struct hw_perf_event *event,
|
|
|
|
|
|
if (attr->exclude_idle)
|
|
|
return -EPERM;
|
|
|
- if (is_kernel_in_hyp_mode() &&
|
|
|
- attr->exclude_kernel != attr->exclude_hv)
|
|
|
- return -EINVAL;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If we're running in hyp mode, then we *are* the hypervisor.
|
|
|
+ * Therefore we ignore exclude_hv in this configuration, since
|
|
|
+ * there's no hypervisor to sample anyway. This is consistent
|
|
|
+ * with other architectures (x86 and Power).
|
|
|
+ */
|
|
|
+ if (is_kernel_in_hyp_mode()) {
|
|
|
+ if (!attr->exclude_kernel)
|
|
|
+ config_base |= ARMV8_PMU_INCLUDE_EL2;
|
|
|
+ } else {
|
|
|
+ if (attr->exclude_kernel)
|
|
|
+ config_base |= ARMV8_PMU_EXCLUDE_EL1;
|
|
|
+ if (!attr->exclude_hv)
|
|
|
+ config_base |= ARMV8_PMU_INCLUDE_EL2;
|
|
|
+ }
|
|
|
if (attr->exclude_user)
|
|
|
config_base |= ARMV8_PMU_EXCLUDE_EL0;
|
|
|
- if (!is_kernel_in_hyp_mode() && attr->exclude_kernel)
|
|
|
- config_base |= ARMV8_PMU_EXCLUDE_EL1;
|
|
|
- if (!attr->exclude_hv)
|
|
|
- config_base |= ARMV8_PMU_INCLUDE_EL2;
|
|
|
|
|
|
/*
|
|
|
* Install the filter into config_base as this is used to
|