aboutsummaryrefslogtreecommitdiff
path: root/src/arch/riscv/virtual_memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/riscv/virtual_memory.c')
-rw-r--r--src/arch/riscv/virtual_memory.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/arch/riscv/virtual_memory.c b/src/arch/riscv/virtual_memory.c
index 26a0169335..aceb72eebd 100644
--- a/src/arch/riscv/virtual_memory.c
+++ b/src/arch/riscv/virtual_memory.c
@@ -292,12 +292,21 @@ void initVirtualMemory(void) {
void mstatus_init(void)
{
uintptr_t ms = 0;
+
ms = INSERT_FIELD(ms, MSTATUS_FS, 3);
ms = INSERT_FIELD(ms, MSTATUS_XS, 3);
write_csr(mstatus, ms);
- clear_csr(mip, MIP_MSIP);
- set_csr(mie, MIP_MSIP);
+ // clear any pending timer interrupts.
+ clear_csr(mip, MIP_STIP | MIP_SSIP);
+
+ // enable machine and supervisor timer and
+ // all other supervisor interrupts.
+ set_csr(mie, MIP_MTIP | MIP_STIP | MIP_SSIP);
+
+ // Delegate supervisor timer and other interrupts
+ // to supervisor mode.
+ set_csr(mideleg, MIP_STIP | MIP_SSIP);
set_csr(medeleg, delegate);