diff --git a/arch/risc-v/src/bl602/bl602_irq.c b/arch/risc-v/src/bl602/bl602_irq.c index 02b612be44d..0a0a7e334dc 100644 --- a/arch/risc-v/src/bl602/bl602_irq.c +++ b/arch/risc-v/src/bl602/bl602_irq.c @@ -171,16 +171,18 @@ void up_enable_irq(int irq) * ****************************************************************************/ -uint32_t riscv_get_newintctx(void) +uintptr_t riscv_get_newintctx(void) { /* Set machine previous privilege mode to machine mode. * Also set machine previous interrupt enable */ + uintptr_t mstatus = READ_CSR(mstatus); + #ifdef CONFIG_ARCH_FPU - return (MSTATUS_FS_INIT | MSTATUS_MPPM | MSTATUS_MPIE); + return (mstatus | MSTATUS_FS_INIT | MSTATUS_MPPM | MSTATUS_MPIE); #else - return (MSTATUS_MPPM | MSTATUS_MPIE); + return (mstatus | MSTATUS_MPPM | MSTATUS_MPIE); #endif } diff --git a/arch/risc-v/src/c906/c906_irq.c b/arch/risc-v/src/c906/c906_irq.c index f753e5d0071..feb91687556 100644 --- a/arch/risc-v/src/c906/c906_irq.c +++ b/arch/risc-v/src/c906/c906_irq.c @@ -202,7 +202,7 @@ void up_enable_irq(int irq) * ****************************************************************************/ -uint32_t riscv_get_newintctx(void) +uintptr_t riscv_get_newintctx(void) { /* Set machine previous privilege mode to machine mode. Reegardless of * how NuttX is configured and of what kind of thread is being started. @@ -212,10 +212,12 @@ uint32_t riscv_get_newintctx(void) * user code. Also set machine previous interrupt enable. */ + uintptr_t mstatus = READ_CSR(mstatus); + #ifdef CONFIG_ARCH_FPU - return (MSTATUS_FS_INIT | MSTATUS_MPPM | MSTATUS_MPIE); + return (mstatus | MSTATUS_FS_INIT | MSTATUS_MPPM | MSTATUS_MPIE); #else - return (MSTATUS_MPPM | MSTATUS_MPIE); + return (mstatus | MSTATUS_MPPM | MSTATUS_MPIE); #endif } diff --git a/arch/risc-v/src/common/riscv_internal.h b/arch/risc-v/src/common/riscv_internal.h index 719d00f9fc4..206423b0d24 100644 --- a/arch/risc-v/src/common/riscv_internal.h +++ b/arch/risc-v/src/common/riscv_internal.h @@ -197,7 +197,7 @@ void riscv_copyfullstate(uintptr_t *dest, uintptr_t *src); void riscv_sigdeliver(void); int riscv_swint(int irq, void *context, void *arg); -uint32_t riscv_get_newintctx(void); +uintptr_t riscv_get_newintctx(void); #ifdef CONFIG_ARCH_FPU void riscv_savefpu(uintptr_t *regs); diff --git a/arch/risc-v/src/esp32c3/esp32c3_irq.c b/arch/risc-v/src/esp32c3/esp32c3_irq.c index 303d72fa730..27a8e56d8f3 100644 --- a/arch/risc-v/src/esp32c3/esp32c3_irq.c +++ b/arch/risc-v/src/esp32c3/esp32c3_irq.c @@ -35,6 +35,7 @@ #include #include +#include #include "riscv_internal.h" #include "hardware/esp32c3_interrupt.h" @@ -141,13 +142,15 @@ void up_irqinitialize(void) * ****************************************************************************/ -uint32_t riscv_get_newintctx(void) +uintptr_t riscv_get_newintctx(void) { /* Set machine previous privilege mode to machine mode. * Also set machine previous interrupt enable */ - return (MSTATUS_MPPM | MSTATUS_MPIE); + uintptr_t mstatus = READ_CSR(mstatus); + + return (mstatus | MSTATUS_MPPM | MSTATUS_MPIE); } /**************************************************************************** diff --git a/arch/risc-v/src/fe310/fe310_irq.c b/arch/risc-v/src/fe310/fe310_irq.c index c5d48043894..7397a576dbe 100644 --- a/arch/risc-v/src/fe310/fe310_irq.c +++ b/arch/risc-v/src/fe310/fe310_irq.c @@ -173,13 +173,15 @@ void up_enable_irq(int irq) * ****************************************************************************/ -uint32_t riscv_get_newintctx(void) +uintptr_t riscv_get_newintctx(void) { /* Set machine previous privilege mode to machine mode. * Also set machine previous interrupt enable */ - return (MSTATUS_MPPM | MSTATUS_MPIE); + uintptr_t mstatus = READ_CSR(mstatus); + + return (mstatus | MSTATUS_MPPM | MSTATUS_MPIE); } /**************************************************************************** diff --git a/arch/risc-v/src/k210/k210_irq.c b/arch/risc-v/src/k210/k210_irq.c index 79abac3c9b4..b6143e52594 100644 --- a/arch/risc-v/src/k210/k210_irq.c +++ b/arch/risc-v/src/k210/k210_irq.c @@ -218,7 +218,7 @@ void up_enable_irq(int irq) * ****************************************************************************/ -uint32_t riscv_get_newintctx(void) +uintptr_t riscv_get_newintctx(void) { /* Set machine previous privilege mode to machine mode. Reegardless of * how NuttX is configured and of what kind of thread is being started. @@ -228,7 +228,9 @@ uint32_t riscv_get_newintctx(void) * user code. Also set machine previous interrupt enable. */ - return (MSTATUS_MPPM | MSTATUS_MPIE); + uintptr_t mstatus = READ_CSR(mstatus); + + return (mstatus | MSTATUS_MPPM | MSTATUS_MPIE); } /**************************************************************************** diff --git a/arch/risc-v/src/litex/litex_irq.c b/arch/risc-v/src/litex/litex_irq.c index 3f9319da7cd..fa12ac0055e 100644 --- a/arch/risc-v/src/litex/litex_irq.c +++ b/arch/risc-v/src/litex/litex_irq.c @@ -179,13 +179,15 @@ void up_enable_irq(int irq) * ****************************************************************************/ -uint32_t riscv_get_newintctx(void) +uintptr_t riscv_get_newintctx(void) { /* Set machine previous privilege mode to machine mode. * Also set machine previous interrupt enable */ - return (MSTATUS_MPPM | MSTATUS_MPIE); + uintptr_t mstatus = READ_CSR(mstatus); + + return (mstatus | MSTATUS_MPPM | MSTATUS_MPIE); } /**************************************************************************** diff --git a/arch/risc-v/src/mpfs/mpfs_irq.c b/arch/risc-v/src/mpfs/mpfs_irq.c index 723d7fa09b5..e9149613430 100755 --- a/arch/risc-v/src/mpfs/mpfs_irq.c +++ b/arch/risc-v/src/mpfs/mpfs_irq.c @@ -270,7 +270,7 @@ void up_enable_irq(int irq) * ****************************************************************************/ -uint32_t riscv_get_newintctx(void) +uintptr_t riscv_get_newintctx(void) { /* Set machine previous privilege mode to machine mode. Reegardless of * how NuttX is configured and of what kind of thread is being started. @@ -280,10 +280,12 @@ uint32_t riscv_get_newintctx(void) * user code. Also set machine previous interrupt enable. */ + uintptr_t mstatus = READ_CSR(mstatus); + #ifdef CONFIG_ARCH_FPU - return (MSTATUS_FS_INIT | MSTATUS_MPPM | MSTATUS_MPIE); + return (mstatus | MSTATUS_FS_INIT | MSTATUS_MPPM | MSTATUS_MPIE); #else - return (MSTATUS_MPPM | MSTATUS_MPIE); + return (mstatus | MSTATUS_MPPM | MSTATUS_MPIE); #endif } diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c index bed45b901f6..55cdfc1ef69 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_irq.c +++ b/arch/risc-v/src/qemu-rv/qemu_rv_irq.c @@ -214,12 +214,18 @@ irqstate_t up_irq_enable(void) * ****************************************************************************/ -uint32_t riscv_get_newintctx(void) +uintptr_t riscv_get_newintctx(void) { /* Set machine previous privilege mode to machine mode. * Also set machine previous interrupt enable * Note: In qemu, FPU is always exist even if don't use F|D ISA extension */ - return (MSTATUS_MPPM | MSTATUS_MPIE | MSTATUS_FS_INIT); + uintptr_t mstatus = READ_CSR(mstatus); + +#ifdef CONFIG_ARCH_FPU + return (mstatus | MSTATUS_MPPM | MSTATUS_MPIE | MSTATUS_FS_INIT); +#else + return (mstatus | MSTATUS_MPPM | MSTATUS_MPIE); +#endif } diff --git a/arch/risc-v/src/rv32m1/rv32m1_irq.c b/arch/risc-v/src/rv32m1/rv32m1_irq.c index 241465a478a..2b410d75af5 100644 --- a/arch/risc-v/src/rv32m1/rv32m1_irq.c +++ b/arch/risc-v/src/rv32m1/rv32m1_irq.c @@ -221,13 +221,15 @@ void up_enable_irq(int irq) * ****************************************************************************/ -uint32_t riscv_get_newintctx(void) +uintptr_t riscv_get_newintctx(void) { /* Set machine previous privilege mode to machine mode. * Also set machine previous interrupt enable */ - return (MSTATUS_MPPM | MSTATUS_MPIE); + uintptr_t mstatus = READ_CSR(mstatus); + + return (mstatus | MSTATUS_MPPM | MSTATUS_MPIE); } /****************************************************************************