[U-Boot] [PATCH 1/3] riscv: Add kconfig option to run u-boot in S-mode

Anup Patel anup at brainfault.org
Tue Nov 20 09:14:17 UTC 2018


This patch adds kconfig option RISCV_SMODE to run u-boot in
S-mode. When this opition is enabled we use s<xyz> CSRs instead
of m<xyz> CSRs.

It is important to note that there is no equivalent S-mode CSR
for misa and mhartid CSRs so we expect M-mode runtime firmware
(BBL or equivalent) to emulate misa and mhartid CSR read.

Eventually, we will have patches to avoid accessing misa and
mhartid from S-mode.

Signed-off-by: Anup Patel <anup at brainfault.org>
---
 arch/riscv/Kconfig     |  6 ++++++
 arch/riscv/cpu/start.S | 31 +++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 168ca3de7c..0ee3bcc3c5 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -37,6 +37,12 @@ config CPU_RISCV_64
 
 endchoice
 
+config RISCV_SMODE
+	bool "Run in S-Mode"
+	default n
+	help
+	  Enable this option to build an U-Boot for RISC-V S-Mode
+
 config 32BIT
 	bool
 
diff --git a/arch/riscv/cpu/start.S b/arch/riscv/cpu/start.S
index 7cd7755190..669d3bde92 100644
--- a/arch/riscv/cpu/start.S
+++ b/arch/riscv/cpu/start.S
@@ -47,9 +47,15 @@ handle_reset:
 	li t0, CONFIG_SYS_SDRAM_BASE
 	SREG a2, 0(t0)
 	la t0, trap_entry
+#ifdef CONFIG_RISCV_SMODE
+	csrw stvec, t0
+	csrwi sstatus, 0
+	csrwi sie, 0
+#else
 	csrw mtvec, t0
 	csrwi mstatus, 0
 	csrwi mie, 0
+#endif
 
 /*
  * Do CPU critical regs init only at reboot,
@@ -171,7 +177,11 @@ fix_rela_dyn:
 */
 	la t0, trap_entry
 	add t0, t0, t6
+#ifdef CONFIG_RISCV_SMODE
+	csrw stvec, t0
+#else
 	csrw mtvec, t0
+#endif
 
 clear_bss:
 	la t0, __bss_start		/* t0 <- rel __bss_start in FLASH */
@@ -241,17 +251,34 @@ trap_entry:
 	SREG x29, 29*REGBYTES(sp)
 	SREG x30, 30*REGBYTES(sp)
 	SREG x31, 31*REGBYTES(sp)
+#ifdef CONFIG_RISCV_SMODE
+	csrr a0, scause
+	csrr a1, sepc
+#else
 	csrr a0, mcause
 	csrr a1, mepc
+#endif
 	mv a2, sp
 	jal handle_trap
+#ifdef CONFIG_RISCV_SMODE
+	csrw sepc, a0
+#else
 	csrw mepc, a0
+#endif
 
+#ifdef CONFIG_RISCV_SMODE
+/*
+ * Remain in S-mode after sret
+ */
+	li t0, SSTATUS_SPP
+	csrs sstatus, t0
+#else
 /*
  * Remain in M-mode after mret
  */
 	li t0, MSTATUS_MPP
 	csrs mstatus, t0
+#endif
 	LREG x1, 1*REGBYTES(sp)
 	LREG x2, 2*REGBYTES(sp)
 	LREG x3, 3*REGBYTES(sp)
@@ -284,7 +311,11 @@ trap_entry:
 	LREG x30, 30*REGBYTES(sp)
 	LREG x31, 31*REGBYTES(sp)
 	addi sp, sp, 32*REGBYTES
+#ifdef CONFIG_RISCV_SMODE
+	sret
+#else
 	mret
+#endif
 
 #ifdef CONFIG_INIT_CRITICAL
 cpu_init_crit:
-- 
2.17.1



More information about the U-Boot mailing list