mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-11-22 19:01:33 +00:00
lib: sbi: sbi_pmu: added checks for ctr_idx in match
Previously, in sbi_pmu_ctr_cfg_match() function, ctr_idx was used immediately after pmu_ctr_find_fw() or pmu_ctr_find_hw() calls. In first case, array index was (ctr_idx - num_hw_ctrs), in second - ctr_idx. But pmu_ctr_find_fw() and pmu_ctr_find_hw() functions can return negative value, in which case writing in arrays with such indexes would corrupt sbi_pmu_hart_state structure. To avoid this situation, direct ctr_idx value check added. Signed-off-by: Alexander Chuprunov <alexander.chuprunov@syntacore.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20250918090706.2217603-4-alexander.chuprunov@syntacore.com Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
committed by
Anup Patel
parent
63aacbd782
commit
ac16c6b604
@@ -830,7 +830,7 @@ static int pmu_ctr_find_fw(struct sbi_pmu_hart_state *phs,
|
|||||||
cidx = i + cbase;
|
cidx = i + cbase;
|
||||||
if (cidx < num_hw_ctrs || total_ctrs <= cidx)
|
if (cidx < num_hw_ctrs || total_ctrs <= cidx)
|
||||||
continue;
|
continue;
|
||||||
if (phs->active_events[i] != SBI_PMU_EVENT_IDX_INVALID)
|
if (phs->active_events[cidx] != SBI_PMU_EVENT_IDX_INVALID)
|
||||||
continue;
|
continue;
|
||||||
if (SBI_PMU_FW_PLATFORM == event_code &&
|
if (SBI_PMU_FW_PLATFORM == event_code &&
|
||||||
pmu_dev && pmu_dev->fw_counter_match_encoding) {
|
pmu_dev && pmu_dev->fw_counter_match_encoding) {
|
||||||
@@ -840,7 +840,7 @@ static int pmu_ctr_find_fw(struct sbi_pmu_hart_state *phs,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return i;
|
return cidx;
|
||||||
}
|
}
|
||||||
|
|
||||||
return SBI_ENOTSUPP;
|
return SBI_ENOTSUPP;
|
||||||
@@ -886,13 +886,14 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base, unsigned long cidx_mask,
|
|||||||
/* Any firmware counter can be used track any firmware event */
|
/* Any firmware counter can be used track any firmware event */
|
||||||
ctr_idx = pmu_ctr_find_fw(phs, cidx_base, cidx_mask,
|
ctr_idx = pmu_ctr_find_fw(phs, cidx_base, cidx_mask,
|
||||||
event_code, event_data);
|
event_code, event_data);
|
||||||
if (event_code == SBI_PMU_FW_PLATFORM)
|
if ((event_code == SBI_PMU_FW_PLATFORM) && (ctr_idx >= num_hw_ctrs))
|
||||||
phs->fw_counters_data[ctr_idx - num_hw_ctrs] =
|
phs->fw_counters_data[ctr_idx - num_hw_ctrs] =
|
||||||
event_data;
|
event_data;
|
||||||
} else {
|
} else {
|
||||||
ctr_idx = pmu_ctr_find_hw(phs, cidx_base, cidx_mask, flags,
|
ctr_idx = pmu_ctr_find_hw(phs, cidx_base, cidx_mask, flags,
|
||||||
event_idx, event_data);
|
event_idx, event_data);
|
||||||
phs->hw_counters_data[ctr_idx] = event_data;
|
if (ctr_idx >= 0)
|
||||||
|
phs->hw_counters_data[ctr_idx] = event_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctr_idx < 0)
|
if (ctr_idx < 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user