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);
 }
 
 /****************************************************************************