aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorXiang W <wxjstz@126.com>2023-12-21 09:44:27 +0800
committerAnup Patel <anup@brainfault.org>2023-12-26 21:28:34 +0530
commit63e09ad3f77218e34fb6cc1df88bedde9b9f38cb (patch)
treed56b502a37ae31da89a0c3c4e475172b0816294c /lib
parent2b80b92f028aa3726c6488eaaefddbdec43c5b54 (diff)
downloadopensbi-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>
Diffstat (limited to 'lib')
-rw-r--r--lib/sbi/sbi_system.c3
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);