mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-24 15:31:22 +01:00
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>
This commit is contained in:
@@ -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 */
|
/* Send HALT IPI to every hart other than the current hart */
|
||||||
while (!sbi_hsm_hart_interruptible_mask(dom, hbase, &hmask)) {
|
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));
|
hmask &= ~(1UL << (cur_hartid - hbase));
|
||||||
if (hmask)
|
if (hmask)
|
||||||
sbi_ipi_send_halt(hmask, hbase);
|
sbi_ipi_send_halt(hmask, hbase);
|
||||||
|
Reference in New Issue
Block a user