summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorNick Hu <nick.hu@sifive.com>2023-01-17 11:14:28 +0300
committerAnup Patel <anup@brainfault.org>2023-02-08 08:09:21 +0300
commit84d15f4f529c92d3f32fbc570c02f7d40e9e70cb (patch)
tree64289a8185500e0b15f662baefefa8b4b216923f /lib
parent8050081f68b2b66f8937b15a6753ec6408c2fdee (diff)
downloadopensbi-84d15f4f529c92d3f32fbc570c02f7d40e9e70cb.tar.xz
lib: sbi_hsm: Use csr_set to restore the MIP
If we use the csr_write to restore the MIP, we may clear the SEIP. In generic behavior of QEMU, if the pending bits of PLIC are set and we clear the SEIP, the QEMU may not set it back immediately. It may cause the interrupts won't be handled anymore until the new interrupts arrived and QEMU set the bits back. Signed-off-by: Nick Hu <nick.hu@sifive.com> Signed-off-by: Jim Shu <jim.shu@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/sbi/sbi_hsm.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
index d4cce4a..8499bb1 100644
--- a/lib/sbi/sbi_hsm.c
+++ b/lib/sbi/sbi_hsm.c
@@ -357,7 +357,7 @@ static void __sbi_hsm_suspend_non_ret_restore(struct sbi_scratch *scratch)
hart_data_offset);
csr_write(CSR_MIE, hdata->saved_mie);
- csr_write(CSR_MIP, (hdata->saved_mip & (MIP_SSIP | MIP_STIP)));
+ csr_set(CSR_MIP, (hdata->saved_mip & (MIP_SSIP | MIP_STIP)));
}
void sbi_hsm_hart_resume_start(struct sbi_scratch *scratch)