[v1 2/2] lib: sbi_pmu: Fix the counter info function
Atish Kumar Patra
atishp at rivosinc.com
Wed Dec 6 00:54:00 PST 2023
On Tue, Dec 5, 2023 at 11:46 PM Xiang W <wxjstz at 126.com> wrote:
>
> 在 2023-12-05星期二的 17:08 -0800,Atish Patra写道:
> > The counter info should only return valid hardware counters for the ones
> > set in the counter mask. Otherwise, it will report incorrect number of
> > hardware counters to the supervisor if the platform has discontiguous
> > counters.
> >
> > Fixes: c744ed77b18c ("lib: sbi_pmu: Enable noncontigous hpm event and counters")
> >
> > Signed-off-by: Atish Patra <atishp at rivosinc.com>
> > ---
> > lib/sbi/sbi_pmu.c | 3 +++
> > 1 file changed, 3 insertions(+)
> >
> > diff --git a/lib/sbi/sbi_pmu.c b/lib/sbi/sbi_pmu.c
> > index 185068bb1f43..ac5ae0af7da4 100644
> > --- a/lib/sbi/sbi_pmu.c
> > +++ b/lib/sbi/sbi_pmu.c
> > @@ -885,6 +885,7 @@ int sbi_pmu_ctr_get_info(uint32_t cidx, unsigned long *ctr_info)
> > int width;
> > union sbi_pmu_ctr_info cinfo = {0};
> > struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
> > + unsigned long counter_mask = (unsigned long)sbi_hart_mhpm_mask(scratch) | 0x5;
> >
> > /* Sanity check. Counter1 is not mapped at all */
> > if (cidx >= total_ctrs || cidx == 1)
> Because counter_mask does not contain counter1, the cidx==1 check can be removed here.
>
Yes. Thanks for pointing it out. Will send it a v2.
> Regards,
> Xiang W
>
> > @@ -892,6 +893,8 @@ int sbi_pmu_ctr_get_info(uint32_t cidx, unsigned long *ctr_info)
> >
> > /* We have 31 HW counters with 31 being the last index(MHPMCOUNTER31) */
> > if (cidx < num_hw_ctrs) {
> > + if (!(__test_bit(cidx, &counter_mask)))
> > + return SBI_EINVAL;
> > cinfo.type = SBI_PMU_CTR_TYPE_HW;
> > cinfo.csr = CSR_CYCLE + cidx;
> > /* mcycle & minstret are always 64 bit */
> > --
> > 2.34.1
> >
> >
>
More information about the opensbi
mailing list