[PATCH 2/2] lib: sbi_ipi: Return error for invalid hartids
Xiang W
wxjstz at 126.com
Mon Mar 17 03:27:10 PDT 2025
在 2025-03-17一的 09:45 +0100,Andrew Jones写道:
> On Mon, Mar 17, 2025 at 12:56:59PM +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;
> > > + }
> > > +
> > > /* 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;
> > If hmask is equal to 0 and hbase is equal to -1, count will be 0.
> > This will always return SBI_EINVAL. Need to add some code to skip
> > this case
>
> Wrong, again, and this time for two reasons. This code is in an
> 'hbase != -1' block (as can be seen a few lines above). Also, if count
> were to equal 0 (which it can't, due to the early out added above), then
> the weight of target_mask would also be 0, which means we would never
> return SBI_EINVAL, as that would require 0 != 0 to be true.
pardon me!
Xiang
> drew
More information about the opensbi
mailing list