[PATCH 2/2] lib: sbi: Fix cidx_base check when SBI_PMU_CFG_FLAG_SKIP_MATCH is set
Atish Patra
atishp at atishpatra.org
Mon Apr 3 17:44:25 PDT 2023
On Mon, Mar 20, 2023 at 3:41 PM Alexandre Ghiti <alexghiti at rivosinc.com> wrote:
>
> When SBI_PMU_CFG_FLAG_SKIP_MATCH is set, cidx_base is used to represent
> the counter index to match, so make sure we don't return an error in
> this case.
>
Reading the spec again, it says
"the SBI implementation will unconditionally select the first counter
from the set of counters specified by the counter_idx_base and
counter_idx_mask"
Technically, a caller can pass a non-zero valid counter mask with the
counter base being really a base. Correct ?
so we should check cbase+ sbi_ffs against total_ctrs
We also need to choose that value instead of cbase while selecting the ctr_idx.
> Signed-off-by: Alexandre Ghiti <alexghiti at rivosinc.com>
> ---
> lib/sbi/sbi_pmu.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/lib/sbi/sbi_pmu.c b/lib/sbi/sbi_pmu.c
> index 2176cc7..ffdbe65 100644
> --- a/lib/sbi/sbi_pmu.c
> +++ b/lib/sbi/sbi_pmu.c
> @@ -722,8 +722,16 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base, unsigned long cidx_mask,
> u32 event_code, hartid = current_hartid();
> int event_type;
>
> - /* Do a basic sanity check of counter base & mask */
> - if ((cidx_base + sbi_fls(cidx_mask)) >= total_ctrs)
> + /*
> + * Do a basic sanity check of counter base & mask but not when
> + * flags has the skip match bit set since cidx_base has a
> + * different meaning there.
> + */
> + if ((flags & SBI_PMU_CFG_FLAG_SKIP_MATCH) && cidx_base > total_ctrs)
> + return SBI_EINVAL;
> +
> + if (!(flags & SBI_PMU_CFG_FLAG_SKIP_MATCH) &&
> + ((cidx_base + sbi_fls(cidx_mask)) >= total_ctrs))
> return SBI_EINVAL;
>
> event_type = pmu_event_validate(event_idx, event_data);
> --
> 2.37.2
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
--
Regards,
Atish
More information about the opensbi
mailing list