You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/03/17 07:44:46 UTC
[incubator-nuttx] branch master updated: arch/risc-v: Rework riscv_get_newintctx
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 <hu...@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 <hu...@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);
}
/****************************************************************************