diff --git a/arch/risc-v/src/common/riscv_getnewintctx.c b/arch/risc-v/src/common/riscv_getnewintctx.c index f1fa4cf3de..2588ff2841 100644 --- a/arch/risc-v/src/common/riscv_getnewintctx.c +++ b/arch/risc-v/src/common/riscv_getnewintctx.c @@ -70,3 +70,12 @@ uintptr_t riscv_get_newintctx(void) #endif ); } + +void riscv_set_idleintctx(void) +{ + /* Set SUM for idle process if needed */ + +#ifdef CONFIG_ARCH_USE_MMU + SET_CSR(CSR_STATUS, STATUS_SUM); +#endif +} diff --git a/arch/risc-v/src/common/riscv_initialstate.c b/arch/risc-v/src/common/riscv_initialstate.c index 3c2b5f00e7..802c2103d7 100644 --- a/arch/risc-v/src/common/riscv_initialstate.c +++ b/arch/risc-v/src/common/riscv_initialstate.c @@ -78,6 +78,10 @@ void up_initial_state(struct tcb_s *tcb) riscv_stack_color(tcb->stack_alloc_ptr, 0); #endif /* CONFIG_STACK_COLORATION */ + + /* Set idle process' initial interrupt context */ + + riscv_set_idleintctx(); return; } diff --git a/arch/risc-v/src/common/riscv_internal.h b/arch/risc-v/src/common/riscv_internal.h index fbfa3f12fa..a6602b06aa 100644 --- a/arch/risc-v/src/common/riscv_internal.h +++ b/arch/risc-v/src/common/riscv_internal.h @@ -200,6 +200,7 @@ void riscv_copystate(uintptr_t *dest, uintptr_t *src); void riscv_sigdeliver(void); int riscv_swint(int irq, void *context, void *arg); uintptr_t riscv_get_newintctx(void); +void riscv_set_idleintctx(void); void riscv_exception_attach(void); #ifdef CONFIG_ARCH_FPU