On Tue, Jul 2, 2024 at 7:12 PM Dapeng Mi <dapeng1.mi@xxxxxxxxxxxxxxx> wrote: > > Current PMU code deosn't check whether PMU fixed counter number is > larger than pre-defined fixed events. If so, it would cause memory > access out of range. > > So add assert to warn this invalid case. > > Reviewed-by: Mingwei Zhang <mizhang@xxxxxxxxxx> > Signed-off-by: Dapeng Mi <dapeng1.mi@xxxxxxxxxxxxxxx> > --- > x86/pmu.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/x86/pmu.c b/x86/pmu.c > index b4de2680..3e0bf3a2 100644 > --- a/x86/pmu.c > +++ b/x86/pmu.c > @@ -113,8 +113,12 @@ static struct pmu_event* get_counter_event(pmu_counter_t *cnt) > for (i = 0; i < gp_events_size; i++) > if (gp_events[i].unit_sel == (cnt->config & 0xffff)) > return &gp_events[i]; > - } else > - return &fixed_events[cnt->ctr - MSR_CORE_PERF_FIXED_CTR0]; > + } else { > + unsigned int idx = cnt->ctr - MSR_CORE_PERF_FIXED_CTR0; > + > + assert(idx < ARRAY_SIZE(fixed_events)); Won't this assertion result in a failure on bare metal, for CPUs supporting fixed counter 3? > + return &fixed_events[idx]; > + } > > return (void*)0; > } > @@ -740,6 +744,8 @@ int main(int ac, char **av) > printf("Fixed counters: %d\n", pmu.nr_fixed_counters); > printf("Fixed counter width: %d\n", pmu.fixed_counter_width); > > + assert(pmu.nr_fixed_counters <= ARRAY_SIZE(fixed_events)); > + And this one as well? > apic_write(APIC_LVTPC, PMI_VECTOR); > > check_counters(); > -- > 2.40.1 >