diff options
author | Xiang W <wxjstz@126.com> | 2023-12-21 09:44:27 +0800 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2023-12-26 21:28:34 +0530 |
commit | 63e09ad3f77218e34fb6cc1df88bedde9b9f38cb (patch) | |
tree | d56b502a37ae31da89a0c3c4e475172b0816294c | |
parent | 2b80b92f028aa3726c6488eaaefddbdec43c5b54 (diff) | |
download | opensbi-63e09ad3f77218e34fb6cc1df88bedde9b9f38cb.zip opensbi-63e09ad3f77218e34fb6cc1df88bedde9b9f38cb.tar.gz opensbi-63e09ad3f77218e34fb6cc1df88bedde9b9f38cb.tar.bz2 |
lib: sbi: Fix shift bug in sbi_system_reset
There is a problem with judging whether the current hart belongs to
hmask. If cur_hartid minus hbase is greater than BITS_PER_LONG, the
previous hmask will also have a bit cleared incorrectly, which will
cause some harts to lose ipi.
Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
-rw-r--r-- | lib/sbi/sbi_system.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/lib/sbi/sbi_system.c b/lib/sbi/sbi_system.c index d1fa349..e930272 100644 --- a/lib/sbi/sbi_system.c +++ b/lib/sbi/sbi_system.c @@ -72,7 +72,8 @@ void __noreturn sbi_system_reset(u32 reset_type, u32 reset_reason) /* Send HALT IPI to every hart other than the current hart */ while (!sbi_hsm_hart_interruptible_mask(dom, hbase, &hmask)) { - if (hbase <= cur_hartid) + if ((hbase <= cur_hartid) + && (cur_hartid < hbase + BITS_PER_LONG)) hmask &= ~(1UL << (cur_hartid - hbase)); if (hmask) sbi_ipi_send_halt(hmask, hbase); |