From 63e09ad3f77218e34fb6cc1df88bedde9b9f38cb Mon Sep 17 00:00:00 2001 From: Xiang W Date: Thu, 21 Dec 2023 09:44:27 +0800 Subject: [PATCH] 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 Reviewed-by: Anup Patel --- lib/sbi/sbi_system.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/sbi/sbi_system.c b/lib/sbi/sbi_system.c index d1fa3495..e9302721 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);