[PATCH 2/2] lib: sbi_ipi: Return error for invalid hartids
Andrew Jones
ajones at ventanamicro.com
Sat Mar 15 03:50:27 PDT 2025
On Sat, Mar 15, 2025 at 12:19:30PM +0800, Xiang W wrote:
> 在 2025-03-14五的 17:30 +0100,Andrew Jones写道:
> > sbi_send_ipi() should return SBI_ERR_INVALID_PARAM if even one hartid
> > constructed from hart_mask_base and hart_mask, is not valid.
> >
> > Signed-off-by: Andrew Jones <ajones at ventanamicro.com>
> > ---
> > lib/sbi/sbi_ipi.c | 9 +++++++++
> > 1 file changed, 9 insertions(+)
> >
> > diff --git a/lib/sbi/sbi_ipi.c b/lib/sbi/sbi_ipi.c
> > index 52898d302376..2de459b089ff 100644
> > --- a/lib/sbi/sbi_ipi.c
> > +++ b/lib/sbi/sbi_ipi.c
> > @@ -116,6 +116,11 @@ int sbi_ipi_send_many(ulong hmask, ulong hbase, u32 event, void *data)
> > struct sbi_domain *dom = sbi_domain_thishart_ptr();
> > struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
> >
> > + if (hmask == 0 && hbase != -1UL) {
> > + /* Nothing to do, but it's not an error either. */
> > + return 0;
> > + }
> > +
> A modification here would change the original intent of the function.
> lib/sbi/sbi_system.c#L72 will eventually call sbi_ipi_send_many(0, -1, ...)
How could the above condition affect that call where hbase == -1? This
condition explicitly checks that hbase != -1.
> for sending ipi interrupts to all harts, this modification breaks
> sbi_system_reset
Is that an assertion based on a failed test? Because it looks like it
should still work to me.
(kvm-unit-tests SBI testing also tests IPI broadcast, and it's still
passing.)
drew
>
> Regards,
> Xiang W
> > /* Find the target harts */
> > rc = sbi_hsm_hart_interruptible_mask(dom, &target_mask);
> > if (rc)
> > @@ -123,6 +128,7 @@ int sbi_ipi_send_many(ulong hmask, ulong hbase, u32 event, void *data)
> >
> > if (hbase != -1UL) {
> > struct sbi_hartmask tmp_mask = { 0 };
> > + int count = sbi_popcount(hmask);
> >
> > for (i = hbase; hmask; i++, hmask >>= 1) {
> > if (hmask & 1UL)
> > @@ -130,6 +136,9 @@ int sbi_ipi_send_many(ulong hmask, ulong hbase, u32 event, void *data)
> > }
> >
> > sbi_hartmask_and(&target_mask, &target_mask, &tmp_mask);
> > +
> > + if (sbi_hartmask_weight(&target_mask) != count)
> > + return SBI_EINVAL;
> > }
> >
> > /* Send IPIs */
> > --
> > 2.48.1
> >
>
More information about the opensbi
mailing list