This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push: new 807304f arch/risc-v: Rework riscv_get_newintctx 807304f is described below commit 807304f2835e4d70eb2581b15b447582ad009aea Author: Huang Qi <huang...@xiaomi.com> AuthorDate: Thu Mar 17 12:49:25 2022 +0800 arch/risc-v: Rework riscv_get_newintctx Some fields of mstatus were marked as Reserved Writes Preserve Values, Reads Ignore Values (WPRI), so we must keep its origin value with addition flags. Signed-off-by: Huang Qi <huang...@xiaomi.com> --- arch/risc-v/src/bl602/bl602_irq.c | 8 +++++--- arch/risc-v/src/c906/c906_irq.c | 8 +++++--- arch/risc-v/src/common/riscv_internal.h | 2 +- arch/risc-v/src/esp32c3/esp32c3_irq.c | 7 +++++-- arch/risc-v/src/fe310/fe310_irq.c | 6 ++++-- arch/risc-v/src/k210/k210_irq.c | 6 ++++-- arch/risc-v/src/litex/litex_irq.c | 6 ++++-- arch/risc-v/src/mpfs/mpfs_irq.c | 8 +++++--- arch/risc-v/src/qemu-rv/qemu_rv_irq.c | 10 ++++++++-- arch/risc-v/src/rv32m1/rv32m1_irq.c | 6 ++++-- 10 files changed, 45 insertions(+), 22 deletions(-) diff --git a/arch/risc-v/src/bl602/bl602_irq.c b/arch/risc-v/src/bl602/bl602_irq.c index 02b612b..0a0a7e3 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 f753e5d..feb9168 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 719d00f..206423b 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 303d72f..27a8e56 100644 --- a/arch/risc-v/src/esp32c3/esp32c3_irq.c +++ b/arch/risc-v/src/esp32c3/esp32c3_irq.c @@ -35,6 +35,7 @@ #include <arch/irq.h> #include <arch/csr.h> +#include <stdint.h> #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 c5d4804..7397a57 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 79abac3..b6143e5 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 3f9319d..fa12ac0 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 723d7fa..e914961 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 bed45b9..55cdfc1 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 241465a..2b410d7 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); } /****************************************************************************