Message ID | 20201210140313.258739-4-damien.lemoal@wdc.com |
---|---|
State | Superseded |
Headers | show |
Series | RISC-V Kendryte K210 support improvements | expand |
On Thu, 10 Dec 2020 06:02:54 PST (-0800), Damien Le Moal wrote: > When running is M-Mode (no MMU config), MPIE does not get set. This > results in all syscalls being executed with interrupts disabled as > handle_exception never sets SR_IE as it always sees SR_PIE being > cleared. Fix this by always force enabling interrupts in > handle_syscall when CONFIG_RISCV_M_MODE is enabled. > > Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com> > --- > arch/riscv/kernel/entry.S | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S > index 524d918f3601..080eb8d78589 100644 > --- a/arch/riscv/kernel/entry.S > +++ b/arch/riscv/kernel/entry.S > @@ -155,6 +155,15 @@ skip_context_tracking: > tail do_trap_unknown > > handle_syscall: > +#ifdef CONFIG_RISCV_M_MODE > + /* > + * When running is M-Mode (no MMU config), MPIE does not get set. > + * As a result, we need to force enable interrupts here because > + * handle_exception did not do set SR_IE as it always sees SR_PIE > + * being cleared. > + */ > + csrs CSR_STATUS, SR_IE > +#endif > #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING) > /* Recover a0 - a7 for system calls */ > REG_L a0, PT_A0(sp) Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S index 524d918f3601..080eb8d78589 100644 --- a/arch/riscv/kernel/entry.S +++ b/arch/riscv/kernel/entry.S @@ -155,6 +155,15 @@ skip_context_tracking: tail do_trap_unknown handle_syscall: +#ifdef CONFIG_RISCV_M_MODE + /* + * When running is M-Mode (no MMU config), MPIE does not get set. + * As a result, we need to force enable interrupts here because + * handle_exception did not do set SR_IE as it always sees SR_PIE + * being cleared. + */ + csrs CSR_STATUS, SR_IE +#endif #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING) /* Recover a0 - a7 for system calls */ REG_L a0, PT_A0(sp)
When running is M-Mode (no MMU config), MPIE does not get set. This results in all syscalls being executed with interrupts disabled as handle_exception never sets SR_IE as it always sees SR_PIE being cleared. Fix this by always force enabling interrupts in handle_syscall when CONFIG_RISCV_M_MODE is enabled. Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com> --- arch/riscv/kernel/entry.S | 9 +++++++++ 1 file changed, 9 insertions(+)