|
@@ -107,7 +107,12 @@ armpmu_map_cache_event(const unsigned (*cache_map)
|
|
|
static int
|
|
|
armpmu_map_event(const unsigned (*event_map)[PERF_COUNT_HW_MAX], u64 config)
|
|
|
{
|
|
|
- int mapping = (*event_map)[config];
|
|
|
+ int mapping;
|
|
|
+
|
|
|
+ if (config >= PERF_COUNT_HW_MAX)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ mapping = (*event_map)[config];
|
|
|
return mapping == HW_OP_UNSUPPORTED ? -ENOENT : mapping;
|
|
|
}
|
|
|
|
|
@@ -317,6 +322,9 @@ validate_event(struct pmu_hw_events *hw_events,
|
|
|
struct hw_perf_event fake_event = event->hw;
|
|
|
struct pmu *leader_pmu = event->group_leader->pmu;
|
|
|
|
|
|
+ if (is_software_event(event))
|
|
|
+ return 1;
|
|
|
+
|
|
|
if (event->pmu != leader_pmu || event->state <= PERF_EVENT_STATE_OFF)
|
|
|
return 1;
|
|
|
|