xiaoxiang781216 commented on a change in pull request #5782: URL: https://github.com/apache/incubator-nuttx/pull/5782#discussion_r834451712
########## File path: arch/risc-v/src/common/riscv_assert.c ########## @@ -338,6 +338,10 @@ static void riscv_dumpstate(void) else { riscv_saveusercontext(rtcb->xcp.regs); + + /* riscv_saveusercontext modifies the local context (a0), restore it */ + + rtcb = running_task(); Review comment: toolchain will save rtcb before inovke riscv_saveusercontext if it is still used later? ########## File path: arch/risc-v/src/common/riscv_swint.c ########## @@ -196,12 +229,14 @@ int riscv_swint(int irq, void *context, void *arg) * save register space references in the saved A1 and return. */ +#ifndef CONFIG_ARCH_USE_S_MODE Review comment: let's use one pair of #ifndef/#endif to guard all special syscall? ########## File path: arch/risc-v/include/syscall.h ########## @@ -391,6 +396,64 @@ static inline uintptr_t sys_call6(unsigned int nbr, uintptr_t parm1, return r0; } +#ifdef CONFIG_ARCH_USE_S_MODE + +/* In S-mode the kernel cannot ecall to itself, because ecall will raise + * privileges to M-mode, which is not what we want. Instead, use the syscall + * trampoline to do the same. + */ + +static inline uintptr_t ksys_call3(unsigned int nbr, uintptr_t parm1, + uintptr_t parm2, uintptr_t parm3) +{ + register long r0 asm("a0") = (long)(nbr); + register long r1 asm("a1") = (long)(parm1); + register long r2 asm("a2") = (long)(parm2); + register long r3 asm("a3") = (long)(parm3); + + asm volatile + ( + " addi sp, sp, -16\n" /* Make room */ + " sd ra, 0(sp)\n" /* Save ra */ + " jal ra, riscv_syscall_dispatch\n" /* Dispatch (modifies ra) */ + " ld ra, 0(sp)\n" /* Restore ra */ + " addi sp, sp, 16\n" /* Restore sp */ + :: "r"(r0), "r"(r1), "r"(r2), "r"(r3) + : "memory" + ); + + asm volatile("nop" : "=r"(r0)); + + return r0; +} + +static inline uintptr_t ksys_call4(unsigned int nbr, uintptr_t parm1, Review comment: remove too ########## File path: arch/risc-v/include/mode.h ########## @@ -0,0 +1,91 @@ +/**************************************************************************** + * arch/risc-v/include/mode.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_RISC_V_INCLUDE_MODE_H +#define __ARCH_RISC_V_INCLUDE_MODE_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <arch/csr.h> + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifdef CONFIG_ARCH_USE_S_MODE + +/* CSR definitions */ + +# define CSR_STATUS sstatus /* Global status register */ +# define CSR_EPC sepc /* Exception program counter */ +# define CSR_IE sie /* Interrupt enable register */ + +/* In status register */ + +# define STATUS_IE SSTATUS_SIE /* Global interrupt enable */ +# define STATUS_PIE SSTATUS_SPIE /* Previous interrupt enable */ +# define STATUS_PPP SSTATUS_SPPS /* Previous privilege */ +# define STATUS_SUM SSTATUS_SUM /* Access to user memory */ + +/* Interrupt bits */ + +# define IE_EIE SIE_SEIE /* External interrupt enable */ +# define IE_SIE SIE_SSIE /* Software interrupt enable */ +# define IE_TIE SIE_STIE /* Timer interrupt enable */ + +/* External, timer and software interrupt */ + +# define RISCV_IRQ_EXT RISCV_IRQ_SEXT /* PLIC IRQ */ Review comment: and irq to irq.h too, so we don't need special mode.h header file ########## File path: arch/risc-v/src/mpfs/Make.defs ########## @@ -34,6 +34,14 @@ CMN_CSRCS += riscv_mdelay.c riscv_udelay.c riscv_copyfullstate.c CMN_CSRCS += riscv_idle.c riscv_tcbinfo.c riscv_getnewintctx.c CMN_CSRCS += riscv_cpuindex.c +# If the NuttX kernel runs in S-mode + +ifeq ($(CONFIG_ARCH_USE_S_MODE),y) +CMN_ASRCS += riscv_exception_macros.S riscv_machine_trap.S riscv_context.S Review comment: don't need add riscv_exception_macros.S and riscv_machine_trap.S doesn't exist? it's better to add a defconfig which eanble S mode, so we can catch the compiler issue. ########## File path: arch/risc-v/include/mode.h ########## @@ -0,0 +1,91 @@ +/**************************************************************************** + * arch/risc-v/include/mode.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_RISC_V_INCLUDE_MODE_H +#define __ARCH_RISC_V_INCLUDE_MODE_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <arch/csr.h> + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifdef CONFIG_ARCH_USE_S_MODE + +/* CSR definitions */ + +# define CSR_STATUS sstatus /* Global status register */ Review comment: should we move the general CSR definition to csr.h ########## File path: arch/risc-v/include/syscall.h ########## @@ -128,6 +130,8 @@ /* Context switching system calls *******************************************/ +#ifndef CONFIG_ARCH_USE_S_MODE Review comment: let's move all context switch macro to riscv_internal.h ########## File path: arch/risc-v/include/syscall.h ########## @@ -391,6 +396,64 @@ static inline uintptr_t sys_call6(unsigned int nbr, uintptr_t parm1, return r0; } +#ifdef CONFIG_ARCH_USE_S_MODE + +/* In S-mode the kernel cannot ecall to itself, because ecall will raise + * privileges to M-mode, which is not what we want. Instead, use the syscall + * trampoline to do the same. + */ + +static inline uintptr_t ksys_call3(unsigned int nbr, uintptr_t parm1, Review comment: remove nobody call ksys_call3/ksys_call4 now? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@nuttx.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org