Просмотр исходного кода

!384 riscv64添加clone支持以及cpp应用程序支持
Merge pull request !384 from 胡自成/smart-d1

bernard 4 лет назад
Родитель
Сommit
ba36f95678

+ 94 - 38
bsp/qemu-virt64-riscv/.config

@@ -72,6 +72,7 @@ CONFIG_ARCH_CPU_64BIT=y
 CONFIG_RT_USING_CACHE=y
 # CONFIG_RT_USING_CPU_FFS is not set
 # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_MM_MMU=y
 CONFIG_RT_USING_USERSPACE=y
 CONFIG_KERNEL_VADDR_START=0x150000000
 CONFIG_PV_OFFSET=0
@@ -96,6 +97,7 @@ CONFIG_RT_MAIN_THREAD_PRIORITY=10
 #
 CONFIG_RT_USING_FINSH=y
 CONFIG_RT_USING_MSH=y
+CONFIG_FINSH_USING_MSH=y
 CONFIG_FINSH_THREAD_NAME="tshell"
 CONFIG_FINSH_USING_HISTORY=y
 CONFIG_FINSH_HISTORY_LINES=5
@@ -129,6 +131,7 @@ CONFIG_RT_USING_DFS_ROMFS=y
 # Device Drivers
 #
 CONFIG_RT_USING_DEVICE_IPC=y
+CONFIG_RT_UNAMED_PIPE_NUMBER=64
 CONFIG_RT_PIPE_BUFSZ=512
 # CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
 CONFIG_RT_USING_SERIAL=y
@@ -173,6 +176,7 @@ CONFIG_RT_USING_PIN=y
 CONFIG_RT_USING_LIBC=y
 # CONFIG_RT_USING_NEWLIB is not set
 CONFIG_RT_USING_MUSL=y
+# CONFIG_RT_USING_MLIB is not set
 # CONFIG_RT_USING_PTHREADS is not set
 CONFIG_RT_USING_POSIX=y
 # CONFIG_RT_USING_POSIX_MMAP is not set
@@ -221,11 +225,10 @@ CONFIG_RT_USING_POSIX_CLOCKTIME=y
 CONFIG_RT_USING_LWP=y
 CONFIG_RT_LWP_MAX_NR=30
 CONFIG_LWP_TASK_STACK_SIZE=16384
-# CONFIG_RT_USING_GDBSERVER is not set
 CONFIG_RT_CH_MSG_MAX_NR=1024
-CONFIG_RT_LWP_SHM_MAX_NR=64
 CONFIG_LWP_CONSOLE_INPUT_BUFFER_SIZE=1024
 CONFIG_LWP_TID_MAX_NR=64
+CONFIG_RT_LWP_SHM_MAX_NR=64
 # CONFIG_LWP_UNIX98_PTY is not set
 
 #
@@ -275,6 +278,7 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_AT_DEVICE is not set
 # CONFIG_PKG_USING_ATSRV_SOCKET is not set
 # CONFIG_PKG_USING_WIZNET is not set
+# CONFIG_PKG_USING_ZB_COORDINATOR is not set
 
 #
 # IoT Cloud
@@ -315,6 +319,12 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_AGILE_MODBUS is not set
 # CONFIG_PKG_USING_AGILE_FTP is not set
 # CONFIG_PKG_USING_EMBEDDEDPROTO is not set
+# CONFIG_PKG_USING_RT_LINK_HW is not set
+# CONFIG_PKG_USING_LORA_PKT_FWD is not set
+# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set
+# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set
+# CONFIG_PKG_USING_HM is not set
+# CONFIG_PKG_USING_SMALL_MODBUS is not set
 
 #
 # security packages
@@ -331,10 +341,17 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_LUA is not set
 # CONFIG_PKG_USING_JERRYSCRIPT is not set
 # CONFIG_PKG_USING_MICROPYTHON is not set
+# CONFIG_PKG_USING_PIKASCRIPT is not set
 
 #
 # multimedia packages
 #
+
+#
+# LVGL: powerful and easy-to-use embedded GUI library
+#
+# CONFIG_PKG_USING_LITTLEVGL2RTT is not set
+# CONFIG_PKG_USING_LVGL is not set
 # CONFIG_PKG_USING_OPENMV is not set
 # CONFIG_PKG_USING_MUPDF is not set
 # CONFIG_PKG_USING_STEMWIN is not set
@@ -344,6 +361,16 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_HELIX is not set
 # CONFIG_PKG_USING_AZUREGUIX is not set
 # CONFIG_PKG_USING_TOUCHGFX2RTT is not set
+# CONFIG_PKG_USING_NUEMWIN is not set
+# CONFIG_PKG_USING_MP3PLAYER is not set
+# CONFIG_PKG_USING_TINYJPEG is not set
+# CONFIG_PKG_USING_UGUI is not set
+
+#
+# u8g2: a monochrome graphic library
+#
+# CONFIG_PKG_USING_U8G2_OFFICIAL is not set
+# CONFIG_PKG_USING_U8G2 is not set
 
 #
 # tools packages
@@ -352,6 +379,7 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_EASYFLASH is not set
 # CONFIG_PKG_USING_EASYLOGGER is not set
 # CONFIG_PKG_USING_SYSTEMVIEW is not set
+# CONFIG_PKG_USING_SEGGER_RTT is not set
 # CONFIG_PKG_USING_RDB is not set
 # CONFIG_PKG_USING_QRCODE is not set
 # CONFIG_PKG_USING_ULOG_EASYFLASH is not set
@@ -385,10 +413,36 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_MEM_SANDBOX is not set
 # CONFIG_PKG_USING_SOLAR_TERMS is not set
 # CONFIG_PKG_USING_GAN_ZHI is not set
+# CONFIG_PKG_USING_FDT is not set
 
 #
 # system packages
 #
+
+#
+# acceleration: Assembly language or algorithmic acceleration packages
+#
+# CONFIG_PKG_USING_RT_MEMCPY_CM is not set
+# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set
+# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set
+# CONFIG_PKG_USING_QFPLIB_M3 is not set
+
+#
+# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard
+#
+# CONFIG_PKG_USING_CMSIS_5 is not set
+# CONFIG_PKG_USING_CMSIS_5_AUX is not set
+# CONFIG_PKG_USING_CMSIS_RTOS2 is not set
+
+#
+# Micrium: Micrium software products porting for RT-Thread
+#
+# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set
+# CONFIG_PKG_USING_UCOSII_WRAPPER is not set
+# CONFIG_PKG_USING_UC_CRC is not set
+# CONFIG_PKG_USING_UC_CLK is not set
+# CONFIG_PKG_USING_UC_COMMON is not set
+# CONFIG_PKG_USING_UC_MODBUS is not set
 # CONFIG_PKG_USING_GUIENGINE is not set
 # CONFIG_PKG_USING_CAIRO is not set
 # CONFIG_PKG_USING_PIXMAN is not set
@@ -397,8 +451,6 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_FLASHDB is not set
 # CONFIG_PKG_USING_SQLITE is not set
 # CONFIG_PKG_USING_RTI is not set
-# CONFIG_PKG_USING_LITTLEVGL2RTT is not set
-# CONFIG_PKG_USING_CMSIS is not set
 # CONFIG_PKG_USING_DFS_YAFFS is not set
 # CONFIG_PKG_USING_LITTLEFS is not set
 # CONFIG_PKG_USING_DFS_JFFS2 is not set
@@ -413,26 +465,16 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_RAMDISK is not set
 # CONFIG_PKG_USING_MININI is not set
 # CONFIG_PKG_USING_QBOOT is not set
-
-#
-# Micrium: Micrium software products porting for RT-Thread
-#
-# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set
-# CONFIG_PKG_USING_UCOSII_WRAPPER is not set
-# CONFIG_PKG_USING_UC_CRC is not set
-# CONFIG_PKG_USING_UC_CLK is not set
-# CONFIG_PKG_USING_UC_COMMON is not set
-# CONFIG_PKG_USING_UC_MODBUS is not set
 # CONFIG_PKG_USING_PPOOL is not set
 # CONFIG_PKG_USING_OPENAMP is not set
 # CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set
-# CONFIG_PKG_USING_RT_MEMCPY_CM is not set
-# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set
-# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set
-# CONFIG_PKG_USING_QFPLIB_M3 is not set
 # CONFIG_PKG_USING_LPM is not set
 # CONFIG_PKG_USING_TLSF is not set
 # CONFIG_PKG_USING_EVENT_RECORDER is not set
+# CONFIG_PKG_USING_ARM_2D is not set
+# CONFIG_PKG_USING_WCWIDTH is not set
+# CONFIG_PKG_USING_MCUBOOT is not set
+# CONFIG_PKG_USING_TINYUSB is not set
 
 #
 # peripheral libraries and drivers
@@ -444,7 +486,6 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_AS7341 is not set
 # CONFIG_PKG_USING_STM32_SDIO is not set
 # CONFIG_PKG_USING_ICM20608 is not set
-# CONFIG_PKG_USING_U8G2 is not set
 # CONFIG_PKG_USING_BUTTON is not set
 # CONFIG_PKG_USING_PCF8574 is not set
 # CONFIG_PKG_USING_SX12XX is not set
@@ -457,7 +498,6 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_WM_LIBRARIES is not set
 # CONFIG_PKG_USING_KENDRYTE_SDK is not set
 # CONFIG_PKG_USING_INFRARED is not set
-# CONFIG_PKG_USING_ROSSERIAL is not set
 # CONFIG_PKG_USING_AGILE_BUTTON is not set
 # CONFIG_PKG_USING_AGILE_LED is not set
 # CONFIG_PKG_USING_AT24CXX is not set
@@ -501,6 +541,17 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_LIBNFC is not set
 # CONFIG_PKG_USING_MFOC is not set
 # CONFIG_PKG_USING_TMC51XX is not set
+# CONFIG_PKG_USING_TCA9534 is not set
+# CONFIG_PKG_USING_KOBUKI is not set
+# CONFIG_PKG_USING_ROSSERIAL is not set
+# CONFIG_PKG_USING_MICRO_ROS is not set
+# CONFIG_PKG_USING_MCP23008 is not set
+# CONFIG_PKG_USING_BLUETRUM_SDK is not set
+# CONFIG_PKG_USING_MISAKA_AT24CXX is not set
+# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set
+# CONFIG_PKG_USING_BL_MCU_SDK is not set
+# CONFIG_PKG_USING_SOFT_SERIAL is not set
+# CONFIG_PKG_USING_MB85RS16 is not set
 
 #
 # AI packages
@@ -518,6 +569,27 @@ CONFIG_LWP_TID_MAX_NR=64
 #
 # miscellaneous packages
 #
+
+#
+# samples: kernel and components samples
+#
+# CONFIG_PKG_USING_KERNEL_SAMPLES is not set
+# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set
+# CONFIG_PKG_USING_NETWORK_SAMPLES is not set
+# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set
+
+#
+# entertainment: terminal games and other interesting software packages
+#
+# CONFIG_PKG_USING_CMATRIX is not set
+# CONFIG_PKG_USING_SL is not set
+# CONFIG_PKG_USING_CAL is not set
+# CONFIG_PKG_USING_ACLOCK is not set
+# CONFIG_PKG_USING_THREES is not set
+# CONFIG_PKG_USING_2048 is not set
+# CONFIG_PKG_USING_SNAKE is not set
+# CONFIG_PKG_USING_TETRIS is not set
+# CONFIG_PKG_USING_DONUT is not set
 # CONFIG_PKG_USING_LIBCSV is not set
 # CONFIG_PKG_USING_OPTPARSE is not set
 # CONFIG_PKG_USING_FASTLZ is not set
@@ -528,20 +600,13 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
 # CONFIG_PKG_USING_CANFESTIVAL is not set
 # CONFIG_PKG_USING_ZLIB is not set
+# CONFIG_PKG_USING_MINIZIP is not set
 # CONFIG_PKG_USING_DSTR is not set
 # CONFIG_PKG_USING_TINYFRAME is not set
 # CONFIG_PKG_USING_KENDRYTE_DEMO is not set
 # CONFIG_PKG_USING_DIGITALCTRL is not set
 # CONFIG_PKG_USING_UPACKER is not set
 # CONFIG_PKG_USING_UPARAM is not set
-
-#
-# samples: kernel and components samples
-#
-# CONFIG_PKG_USING_KERNEL_SAMPLES is not set
-# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set
-# CONFIG_PKG_USING_NETWORK_SAMPLES is not set
-# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set
 # CONFIG_PKG_USING_HELLO is not set
 # CONFIG_PKG_USING_VI is not set
 # CONFIG_PKG_USING_KI is not set
@@ -549,20 +614,11 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_VT100 is not set
 # CONFIG_PKG_USING_UKAL is not set
 # CONFIG_PKG_USING_CRCLIB is not set
-
-#
-# entertainment: terminal games and other interesting software packages
-#
-# CONFIG_PKG_USING_THREES is not set
-# CONFIG_PKG_USING_2048 is not set
-# CONFIG_PKG_USING_SNAKE is not set
-# CONFIG_PKG_USING_TETRIS is not set
-# CONFIG_PKG_USING_DONUT is not set
-# CONFIG_PKG_USING_ACLOCK is not set
 # CONFIG_PKG_USING_LWGPS is not set
 # CONFIG_PKG_USING_STATE_MACHINE is not set
 # CONFIG_PKG_USING_MCURSES is not set
 # CONFIG_PKG_USING_COWSAY is not set
+# CONFIG_PKG_USING_TERMBOX is not set
 CONFIG_BOARD_virt=y
 
 #

+ 1 - 0
bsp/qemu-virt64-riscv/Kconfig

@@ -24,6 +24,7 @@ config BOARD_virt
     select RT_USING_COMPONENTS_INIT
     select RT_USING_USER_MAIN
     select RT_USING_CACHE
+    select ARCH_MM_MMU
     default y
 
 config RT_USING_USERSPACE

+ 14 - 2
bsp/qemu-virt64-riscv/rtconfig.h

@@ -45,6 +45,7 @@
 #define RT_VER_NUM 0x50000
 #define ARCH_CPU_64BIT
 #define RT_USING_CACHE
+#define ARCH_MM_MMU
 #define RT_USING_USERSPACE
 #define KERNEL_VADDR_START 0x150000000
 #define PV_OFFSET 0
@@ -65,6 +66,7 @@
 
 #define RT_USING_FINSH
 #define RT_USING_MSH
+#define FINSH_USING_MSH
 #define FINSH_THREAD_NAME "tshell"
 #define FINSH_USING_HISTORY
 #define FINSH_HISTORY_LINES 5
@@ -88,6 +90,7 @@
 /* Device Drivers */
 
 #define RT_USING_DEVICE_IPC
+#define RT_UNAMED_PIPE_NUMBER 64
 #define RT_PIPE_BUFSZ 512
 #define RT_USING_SERIAL
 #define RT_SERIAL_USING_DMA
@@ -127,9 +130,9 @@
 #define RT_LWP_MAX_NR 30
 #define LWP_TASK_STACK_SIZE 16384
 #define RT_CH_MSG_MAX_NR 1024
-#define RT_LWP_SHM_MAX_NR 64
 #define LWP_CONSOLE_INPUT_BUFFER_SIZE 1024
 #define LWP_TID_MAX_NR 64
+#define RT_LWP_SHM_MAX_NR 64
 
 /* RT-Thread online packages */
 
@@ -155,12 +158,22 @@
 
 /* multimedia packages */
 
+/* LVGL: powerful and easy-to-use embedded GUI library */
+
+
+/* u8g2: a monochrome graphic library */
+
 
 /* tools packages */
 
 
 /* system packages */
 
+/* acceleration: Assembly language or algorithmic acceleration packages */
+
+
+/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */
+
 
 /* Micrium: Micrium software products porting for RT-Thread */
 
@@ -173,7 +186,6 @@
 
 /* miscellaneous packages */
 
-
 /* samples: kernel and components samples */
 
 

+ 82 - 1
components/lwp/arch/risc-v/rv64/lwp_arch.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
  *
  * SPDX-License-Identifier: Apache-2.0
  *
@@ -25,6 +25,10 @@
 #include <lwp_user_mm.h>
 #include <lwp_arch.h>
 
+#include <stack.h>
+#include <cpuport.h>
+#include <encoding.h>
+
 extern size_t MMUTable[];
 
 int arch_expand_user_stack(void *addr)
@@ -130,4 +134,81 @@ void arch_user_space_vtable_free(struct rt_lwp *lwp)
     }
 }
 
+long _sys_clone(void *arg[]);
+long sys_clone(void *arg[])
+{
+    return _sys_clone(arg);
+}
+
+/**
+ * set exec context for fork/clone.
+ */
+void lwp_set_thread_context(void *exit_addr, void *new_thread_stack, void *user_stack, void **thread_sp)
+{
+    struct rt_hw_stack_frame *syscall_frame;
+    struct rt_hw_stack_frame *thread_frame;
+
+    rt_uint8_t *stk;
+    rt_uint8_t *syscall_stk;
+
+    stk = (rt_uint8_t *)new_thread_stack;
+    /* reserve syscall context, all the registers are copyed from parent */
+    stk -= CTX_REG_NR * REGBYTES;
+    syscall_stk = stk;
+
+    syscall_frame = (struct rt_hw_stack_frame *)stk;
+
+    /* modify user sp */
+    syscall_frame->user_sp_exc_stack = (rt_ubase_t)user_stack;
+
+    /* skip ecall */
+    syscall_frame->epc += 4;
+
+    /* child return value is 0 */
+    syscall_frame->a0 = 0;
+    syscall_frame->a1 = 0;
+
+    /* build temp thread context */
+    stk -= sizeof(struct rt_hw_stack_frame);
+
+    thread_frame = (struct rt_hw_stack_frame *)stk;
+
+    int i;
+    for (i = 0; i < sizeof(struct rt_hw_stack_frame) / sizeof(rt_ubase_t); i++)
+    {
+        ((rt_ubase_t *)thread_frame)[i] = 0xdeadbeaf;
+    }
+
+    /* set pc for thread */
+    thread_frame->epc     = (rt_ubase_t)exit_addr;
+
+    /* set old exception mode as supervisor, because in kernel */
+    thread_frame->sstatus = read_csr(sstatus) | SSTATUS_SPP;
+
+    /* set stack as syscall stack */
+    thread_frame->user_sp_exc_stack = (rt_ubase_t)syscall_stk;
+
+    /* save new stack top */
+    *thread_sp = (void *)stk;
+
+    /**
+     * The stack for child thread:
+     *
+     * +------------------------+ --> kernel stack top
+     * | syscall stack          |
+     * |                        |
+     * | @sp                    | --> `user_stack`
+     * | @epc                   | --> user ecall addr + 4 (skip ecall)
+     * | @a0&a1                 | --> 0 (for child return 0)
+     * |                        |
+     * +------------------------+ --> temp thread stack top
+     * | temp thread stack      |           ^
+     * |                        |           |
+     * | @sp                    | ---------/
+     * | @epc                   | --> `exit_addr` (sys_clone_exit/sys_fork_exit)
+     * |                        |
+     * +------------------------+ --> thread sp
+     */
+}
+
 #endif

+ 1 - 1
components/lwp/arch/risc-v/rv64/lwp_arch.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006-2020, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
  *
  * SPDX-License-Identifier: Apache-2.0
  *

+ 3 - 13
components/lwp/arch/risc-v/rv64/lwp_gcc.S

@@ -50,13 +50,6 @@ lwp_user_thread_entry:
     mv a0, s0//args
     sret//enter user mode
 
-/*
-int lwp_set_thread_context(void *new_thread_stack, void *origin_thread_stack, void *user_stack, void **thread_sp, int tid);
-*/
-.global lwp_set_thread_context
-lwp_set_thread_context:
-    ret//don't support this temporarily
-
 .global ret_to_user
 ret_to_user:
     call lwp_signal_check
@@ -140,8 +133,8 @@ user_do_signal:
     SAVE_ALL
     //ensure original user sp correct
     mv t0, sp
-    addi t0, t0, 33 * REGBYTES
-    STORE t0, 33 * REGBYTES(sp)
+    addi t0, t0, CTX_REG_NR * REGBYTES
+    STORE t0, CTX_REG_NR * REGBYTES(sp)
     OPEN_INTERRUPT
     mv s0, sp
     la t0, lwp_sigreturn//t0 = src
@@ -227,11 +220,8 @@ sys_vfork:
     jal _sys_fork
 sys_fork_exit:
     j syscall_exit
-
-.global sys_clone
+    
 .global sys_clone_exit
-sys_clone:
-    jal _sys_clone
 sys_clone_exit:
     j syscall_exit
 

+ 1 - 1
components/lwp/arch/risc-v/rv64/reloc.c

@@ -105,4 +105,4 @@ void lwp_elf_reloc(void *text_start, void *rel_dyn_start, size_t rel_dyn_size, v
         }
     }
 }
-#endif
+#endif

+ 10 - 1
components/lwp/lwp_pmutex.c

@@ -189,7 +189,7 @@ static int _pthread_mutex_lock_timeout(void *umutex, struct timespec *timeout)
     {
         rt_mutex_release(&_pmutex_lock);
         rt_set_errno(EINVAL);
-        return -RT_EINVAL;
+        return -RT_ENOMEM;  /* umutex not recored in kernel */
     }
 
     rt_mutex_release(&_pmutex_lock);
@@ -273,6 +273,15 @@ int sys_pmutex(void *umutex, int op, void *arg)
             break;
         case PMUTEX_LOCK:
             ret = _pthread_mutex_lock_timeout(umutex, (struct timespec*)arg);
+            if (ret == -RT_ENOMEM)
+            {
+                /* lock not init, try init it and lock again. */
+                ret = _pthread_mutex_init(umutex);
+                if (ret == RT_EOK)
+                {
+                    ret = _pthread_mutex_lock_timeout(umutex, (struct timespec*)arg);
+                }
+            }
             break;
         case PMUTEX_UNLOCK:
             ret = _pthread_mutex_unlock(umutex);

+ 13 - 0
libcpu/risc-v/t-head/c906/cpuport.h

@@ -22,6 +22,19 @@
 // error here, not portable
 #endif
 
+/* 33 general register */
+#define CTX_GENERAL_REG_NR  33
+
+#ifdef ENABLE_FPU
+/* 32 fpu register */
+#define CTX_FPU_REG_NR  32
+#else
+#define CTX_FPU_REG_NR  0
+#endif
+
+/* all context registers */
+#define CTX_REG_NR  (CTX_GENERAL_REG_NR + CTX_FPU_REG_NR)
+
 #ifndef __ASSEMBLY__
 rt_inline void rt_hw_dsb()
 {

+ 4 - 4
libcpu/risc-v/t-head/c906/interrupt_gcc.S

@@ -71,9 +71,9 @@ __restore_sp_from_tcb_interrupt:
 __move_stack_context_interrupt:
     mv t1, sp//src
     mv sp, t0//switch stack
-    addi sp, sp, -33 * REGBYTES
+    addi sp, sp, -CTX_REG_NR * REGBYTES
     //copy context
-    li s0, 33//cnt
+    li s0, CTX_REG_NR//cnt
     mv t2, sp//dst
 
 copy_context_loop_interrupt:
@@ -121,9 +121,9 @@ __restore_sp_from_tcb:
 __move_stack_context:
     mv t1, sp//src
     mv sp, t0//switch stack
-    addi sp, sp, -33 * REGBYTES
+    addi sp, sp, -CTX_REG_NR * REGBYTES
     //copy context
-    li s0, 33//cnt
+    li s0, CTX_REG_NR//cnt
     mv t2, sp//dst
 
 copy_context_loop:

+ 1 - 1
libcpu/risc-v/t-head/c906/stack.h

@@ -49,7 +49,7 @@ struct rt_hw_stack_frame
     rt_ubase_t t6;         /* x31 - t6     - temporary register 6                */
     rt_ubase_t user_sp_exc_stack;    /* sscratch - user mode sp/exception stack  */
 #ifdef ENABLE_FPU
-    rt_ubase_t f[32];      /* f0~f31 */
+    rt_ubase_t f[CTX_FPU_REG_NR];      /* f0~f31 */
 #endif
 };
 

+ 3 - 4
libcpu/risc-v/t-head/c906/stackframe.h

@@ -54,7 +54,7 @@
 .macro SAVE_ALL
 #ifdef ENABLE_FPU
     /* save float registers */
-    addi sp, sp, -32 * REGBYTES
+    addi sp, sp, -CTX_FPU_REG_NR * REGBYTES
 
     li  t0, SSTATUS_FS
     csrs sstatus, t0
@@ -101,8 +101,7 @@
 #endif /* ENABLE_FPU */
 
     /* save general registers */
-    addi sp, sp, -33 * REGBYTES
-
+    addi sp, sp, -CTX_GENERAL_REG_NR * REGBYTES
     STORE x1,   1 * REGBYTES(sp)
 
     csrr  x1, sstatus
@@ -189,7 +188,7 @@
 #ifdef ENABLE_FPU
     /* restore float register  */
     mv t2, sp
-    addi t2, t2, 33 * REGBYTES   /* skip all normal reg */
+    addi t2, t2, CTX_GENERAL_REG_NR * REGBYTES   /* skip all normal reg */
 
     li  t0, SSTATUS_FS
     csrs sstatus, t0

+ 1 - 1
libcpu/risc-v/virt64/cache.c

@@ -81,4 +81,4 @@ rt_base_t rt_hw_cpu_dcache_status()
 int sys_cacheflush(void *addr, int size, int cache)
 {
     return 0;
-}
+}

+ 3 - 3
libcpu/risc-v/virt64/cpuport.c

@@ -20,17 +20,17 @@
 
 /**
  * @brief from thread used interrupt context switch
- * 
+ *
  */
 volatile rt_ubase_t  rt_interrupt_from_thread = 0;
 /**
  * @brief to thread used interrupt context switch
- * 
+ *
  */
 volatile rt_ubase_t  rt_interrupt_to_thread   = 0;
 /**
  * @brief flag to indicate context switch in interrupt or not
- * 
+ *
  */
 volatile rt_ubase_t rt_thread_switch_interrupt_flag = 0;
 

+ 5 - 2
libcpu/risc-v/virt64/cpuport.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
  *
  * SPDX-License-Identifier: Apache-2.0
  *
@@ -22,6 +22,9 @@
 // error here, not portable
 #endif
 
+/* 33 normal register */
+#define CTX_REG_NR  33
+
 #ifndef __ASSEMBLY__
 rt_inline void rt_hw_dsb()
 {
@@ -43,4 +46,4 @@ rt_inline void rt_hw_isb()
 #endif
 #ifdef RISCV_U_MODE
 #define RISCV_USER_ENTRY 0xFFFFFFE000000000ULL
-#endif
+#endif

+ 4 - 4
libcpu/risc-v/virt64/interrupt_gcc.S

@@ -71,9 +71,9 @@ __restore_sp_from_tcb_interrupt:
 __move_stack_context_interrupt:
     mv t1, sp//src
     mv sp, t0//switch stack
-    addi sp, sp, -33 * REGBYTES
+    addi sp, sp, -CTX_REG_NR * REGBYTES
     //copy context
-    li s0, 33//cnt
+    li s0, CTX_REG_NR//cnt
     mv t2, sp//dst
 
 copy_context_loop_interrupt:
@@ -121,9 +121,9 @@ __restore_sp_from_tcb:
 __move_stack_context:
     mv t1, sp//src
     mv sp, t0//switch stack
-    addi sp, sp, -33 * REGBYTES
+    addi sp, sp, -CTX_REG_NR * REGBYTES
     //copy context
-    li s0, 33//cnt
+    li s0, CTX_REG_NR//cnt
     mv t2, sp//dst
 
 copy_context_loop:

+ 9 - 9
libcpu/risc-v/virt64/mmu.c

@@ -78,7 +78,7 @@ int rt_hw_mmu_map_init(rt_mmu_info *mmu_info,void *v_address,rt_size_t size,rt_s
     for(l1_off = va_s;l1_off <= va_e;l1_off++)
     {
         size_t v = vtable[l1_off];
-        
+
         if(v)
         {
             rt_hw_interrupt_enable(level);
@@ -209,7 +209,7 @@ static rt_size_t find_vaddr(rt_mmu_info *mmu_info,rt_size_t pages)
     return 0;
 }
 
-//check whether the range of virtual address are free 
+//check whether the range of virtual address are free
 static int check_vaddr(rt_mmu_info *mmu_info,void *va,rt_size_t pages)
 {
     rt_size_t loop_va = __UMASKVALUE((rt_size_t)va,PAGE_OFFSET_MASK);
@@ -379,13 +379,13 @@ static int __rt_hw_mmu_map(rt_mmu_info *mmu_info,void *v_addr,void *p_addr,rt_si
                 return -1;
             }
         }
-        
+
         RT_ASSERT(!PTE_USED(*(mmu_l3 + l3_off)));
         ref_cnt = mmu_l3 + __SIZE(VPN0_BIT);
         (*ref_cnt)++;
         *(mmu_l3 + l3_off) = COMBINEPTE((rt_size_t)loop_pa,PAGE_DEFAULT_ATTR_LEAF);
         rt_hw_cpu_dcache_clean(mmu_l3 + l3_off,sizeof(*(mmu_l3 + l3_off)));
-        
+
         loop_va += PAGE_SIZE;
         loop_pa += PAGE_SIZE;
     }
@@ -519,7 +519,7 @@ void *_rt_hw_mmu_map_auto(rt_mmu_info *mmu_info,void *v_addr,rt_size_t size,rt_s
     if(v_addr)
     {
         vaddr = __UMASKVALUE((rt_size_t)v_addr,PAGE_OFFSET_MASK);
-        
+
         if(check_vaddr(mmu_info,(void *)vaddr,pages) != 0)
         {
             return 0;
@@ -581,7 +581,7 @@ void *rt_hw_mmu_map_auto(rt_mmu_info *mmu_info,void *v_addr,rt_size_t size,rt_si
 void rt_hw_mmu_unmap(rt_mmu_info *mmu_info,void *v_addr,rt_size_t size)
 {
     rt_base_t level;
-    
+
     level = rt_hw_interrupt_disable();
     _rt_hw_mmu_unmap(mmu_info,v_addr,size);
     rt_hw_interrupt_enable(level);
@@ -603,12 +603,12 @@ void *_rt_hw_mmu_v2p(rt_mmu_info *mmu_info,void *v_addr)
     }
 
     mmu_l1 = ((rt_size_t *)mmu_info -> vtable) + l1_off;
-    
+
     if(PTE_USED(*mmu_l1))
     {
         RT_ASSERT(!PAGE_IS_LEAF(*mmu_l1));
         mmu_l2 = (rt_size_t *)PPN_TO_VPN(GET_PADDR(*mmu_l1),mmu_info -> pv_off);
-        
+
         if(PTE_USED(*(mmu_l2 + l2_off)))
         {
             RT_ASSERT(!PAGE_IS_LEAF(*(mmu_l2 + l2_off)));
@@ -634,4 +634,4 @@ void *rt_hw_mmu_v2p(rt_mmu_info *mmu_info,void *v_addr)
     ret = _rt_hw_mmu_v2p(mmu_info,v_addr);
     rt_hw_interrupt_enable(level);
     return ret;
-}
+}

+ 1 - 1
libcpu/risc-v/virt64/mmu.h

@@ -54,4 +54,4 @@ void rt_hw_mmu_unmap(rt_mmu_info *mmu_info,void *v_addr,rt_size_t size);
 void *_rt_hw_mmu_v2p(rt_mmu_info *mmu_info,void *v_addr);
 void *rt_hw_mmu_v2p(rt_mmu_info *mmu_info,void *v_addr);
 
-#endif
+#endif

+ 5 - 5
libcpu/risc-v/virt64/page.c

@@ -44,7 +44,7 @@ static rt_size_t page_nr;
 
 static struct page *page_list[ADDRESS_WIDTH_BITS];
 
-//get the correct page_list index according the actual size 
+//get the correct page_list index according the actual size
 rt_size_t rt_page_bits(rt_size_t size)
 {
     rt_base_t bit;
@@ -169,7 +169,7 @@ void rt_page_ref_inc(void *addr, uint32_t size_bits)
 static void page_insert(struct page *p,rt_size_t size_bits)
 {
     PAGE_VALID(p);
-    
+
     p -> next = page_list[size_bits];
 
     if(p -> next)
@@ -350,7 +350,7 @@ void rt_page_init(rt_region_t reg)
 
     rt_size_t nr = PAGE_SIZE / sizeof(struct page);
     rt_size_t total = (reg.end - reg.start) >> PAGE_OFFSET_BIT;
-    
+
     /*
         equation:cell((total - mnr) / nr) = mnr
         let total - mnr = knr + p(k is integer,0 <= p < nr)
@@ -400,8 +400,8 @@ void rt_page_init(rt_region_t reg)
         {
             size_bits = align_bits;
         }
-        
+
         _pages_free(addr_to_page((void *)reg.start),size_bits - PAGE_OFFSET_BIT);
         reg.start += (1U << size_bits);
     }
-}
+}

+ 1 - 1
libcpu/risc-v/virt64/page.h

@@ -25,4 +25,4 @@ void rt_pageinfo_dump();
 void rt_page_get_info(size_t *total_nr, size_t *free_nr);
 void rt_page_init(rt_region_t reg);
 
-#endif
+#endif

+ 1 - 1
libcpu/risc-v/virt64/riscv.h

@@ -26,4 +26,4 @@
 #define __ALIGNUP(value,bit) (((value) + __MASK(bit)) & __UMASK(bit))
 #define __ALIGNDOWN(value,bit) ((value) & __UMASK(bit))
 
-#endif
+#endif

+ 25 - 25
libcpu/risc-v/virt64/riscv_io.h

@@ -70,40 +70,40 @@
 
     /* clang-format off */
 
-    #define __io_rbr()		do {} while (0)
-    #define __io_rar()		do {} while (0)
-    #define __io_rbw()		do {} while (0)
-    #define __io_raw()		do {} while (0)
+    #define __io_rbr()      do {} while (0)
+    #define __io_rar()      do {} while (0)
+    #define __io_rbw()      do {} while (0)
+    #define __io_raw()      do {} while (0)
 
-    #define readb_relaxed(c)	({ rt_uint8_t  __v; __io_rbr(); __v = __raw_readb(c); __io_rar(); __v; })
-    #define readw_relaxed(c)	({ rt_uint16_t __v; __io_rbr(); __v = __raw_readw(c); __io_rar(); __v; })
-    #define readl_relaxed(c)	({ rt_uint32_t __v; __io_rbr(); __v = __raw_readl(c); __io_rar(); __v; })
+    #define readb_relaxed(c)    ({ rt_uint8_t  __v; __io_rbr(); __v = __raw_readb(c); __io_rar(); __v; })
+    #define readw_relaxed(c)    ({ rt_uint16_t __v; __io_rbr(); __v = __raw_readw(c); __io_rar(); __v; })
+    #define readl_relaxed(c)    ({ rt_uint32_t __v; __io_rbr(); __v = __raw_readl(c); __io_rar(); __v; })
 
-    #define writeb_relaxed(v,c)	({ __io_rbw(); __raw_writeb((v),(c)); __io_raw(); })
-    #define writew_relaxed(v,c)	({ __io_rbw(); __raw_writew((v),(c)); __io_raw(); })
-    #define writel_relaxed(v,c)	({ __io_rbw(); __raw_writel((v),(c)); __io_raw(); })
+    #define writeb_relaxed(v,c) ({ __io_rbw(); __raw_writeb((v),(c)); __io_raw(); })
+    #define writew_relaxed(v,c) ({ __io_rbw(); __raw_writew((v),(c)); __io_raw(); })
+    #define writel_relaxed(v,c) ({ __io_rbw(); __raw_writel((v),(c)); __io_raw(); })
 
     #if __riscv_xlen != 32
-    #define readq_relaxed(c)	({ rt_uint64_t __v; __io_rbr(); __v = __raw_readq(c); __io_rar(); __v; })
-    #define writeq_relaxed(v,c)	({ __io_rbw(); __raw_writeq((v),(c)); __io_raw(); })
+    #define readq_relaxed(c)    ({ rt_uint64_t __v; __io_rbr(); __v = __raw_readq(c); __io_rar(); __v; })
+    #define writeq_relaxed(v,c) ({ __io_rbw(); __raw_writeq((v),(c)); __io_raw(); })
     #endif
 
-    #define __io_br()	do {} while (0)
-    #define __io_ar()	__asm__ __volatile__ ("fence i,r" : : : "memory");
-    #define __io_bw()	__asm__ __volatile__ ("fence w,o" : : : "memory");
-    #define __io_aw()	do {} while (0)
+    #define __io_br()   do {} while (0)
+    #define __io_ar()   __asm__ __volatile__ ("fence i,r" : : : "memory");
+    #define __io_bw()   __asm__ __volatile__ ("fence w,o" : : : "memory");
+    #define __io_aw()   do {} while (0)
 
-    #define readb(c)	({ rt_uint8_t  __v; __io_br(); __v = __raw_readb(c); __io_ar(); __v; })
-    #define readw(c)	({ rt_uint16_t __v; __io_br(); __v = __raw_readw(c); __io_ar(); __v; })
-    #define readl(c)	({ rt_uint32_t __v; __io_br(); __v = __raw_readl(c); __io_ar(); __v; })
+    #define readb(c)    ({ rt_uint8_t  __v; __io_br(); __v = __raw_readb(c); __io_ar(); __v; })
+    #define readw(c)    ({ rt_uint16_t __v; __io_br(); __v = __raw_readw(c); __io_ar(); __v; })
+    #define readl(c)    ({ rt_uint32_t __v; __io_br(); __v = __raw_readl(c); __io_ar(); __v; })
 
-    #define writeb(v,c)	({ __io_bw(); __raw_writeb((v),(c)); __io_aw(); })
-    #define writew(v,c)	({ __io_bw(); __raw_writew((v),(c)); __io_aw(); })
-    #define writel(v,c)	({ __io_bw(); __raw_writel((v),(c)); __io_aw(); })
+    #define writeb(v,c) ({ __io_bw(); __raw_writeb((v),(c)); __io_aw(); })
+    #define writew(v,c) ({ __io_bw(); __raw_writew((v),(c)); __io_aw(); })
+    #define writel(v,c) ({ __io_bw(); __raw_writel((v),(c)); __io_aw(); })
 
     #if __riscv_xlen != 32
-    #define readq(c)	({ rt_uint64_t __v; __io_br(); __v = __raw_readq(c); __io_ar(); __v; })
-    #define writeq(v,c)	({ __io_bw(); __raw_writeq((v),(c)); __io_aw(); })
+    #define readq(c)    ({ rt_uint64_t __v; __io_br(); __v = __raw_readq(c); __io_ar(); __v; })
+    #define writeq(v,c) ({ __io_bw(); __raw_writeq((v),(c)); __io_aw(); })
     #endif
 
-#endif
+#endif

+ 1 - 1
libcpu/risc-v/virt64/riscv_mmu.c

@@ -34,4 +34,4 @@ void mmu_enable_user_page_access()
 void mmu_disable_user_page_access()
 {
     clear_csr(sstatus,SSTATUS_PUM);
-}
+}

+ 1 - 1
libcpu/risc-v/virt64/riscv_mmu.h

@@ -69,4 +69,4 @@ void mmu_set_pagetable(rt_ubase_t addr);
 void mmu_enable_user_page_access();
 void mmu_disable_user_page_access();
 
-#endif
+#endif

+ 3 - 3
libcpu/risc-v/virt64/stackframe.h

@@ -15,7 +15,7 @@
 #include "cpuport.h"
 
 .macro SAVE_ALL
-    addi sp, sp, -33 * REGBYTES
+    addi sp, sp, -CTX_REG_NR * REGBYTES
 
     STORE x1,   1 * REGBYTES(sp)
 
@@ -98,7 +98,7 @@
     LOAD x30, 30 * REGBYTES(sp)
     LOAD x31, 31 * REGBYTES(sp)
 
-    addi sp,  sp, 33 * REGBYTES
+    addi sp,  sp, CTX_REG_NR * REGBYTES
 .endm
 
 .macro RESTORE_ALL
@@ -160,4 +160,4 @@
     csrci sstatus, 2
 .endm
 
-#endif
+#endif

+ 9 - 9
libcpu/risc-v/virt64/syscall_c.c

@@ -43,17 +43,17 @@ void syscall_handler(struct rt_hw_stack_frame *regs)
         while(1);
     }
 
-	syscallfunc_t syscallfunc = (syscallfunc_t)lwp_get_sys_api(regs -> a7);
-	
-	if(syscallfunc == RT_NULL)
-	{
-		rt_kprintf("unsupported syscall!\n");
+    syscallfunc_t syscallfunc = (syscallfunc_t)lwp_get_sys_api(regs -> a7);
+
+    if(syscallfunc == RT_NULL)
+    {
+        rt_kprintf("unsupported syscall!\n");
         while(1);
-	}
+    }
 
     LOG_I("\033[36msyscall id = %d,arg0 = 0x%p,arg1 = 0x%p,arg2 = 0x%p,arg3 = 0x%p,arg4 = 0x%p,arg5 = 0x%p,arg6 = 0x%p\n\033[37m",regs -> a7,regs -> a0,regs -> a1,regs -> a2,regs -> a3,regs -> a4,regs -> a5,regs -> a6);
     regs -> a0 = syscallfunc(regs -> a0,regs -> a1,regs -> a2,regs -> a3,regs -> a4,regs -> a5,regs -> a6);
-	regs -> a7 = 0;
-	regs -> epc += 4;//skip ecall instruction
+    regs -> a7 = 0;
+    regs -> epc += 4;//skip ecall instruction
     LOG_I("\033[36msyscall deal ok,ret = 0x%p\n\033[37m",regs -> a0);
-}
+}

+ 1 - 1
libcpu/risc-v/virt64/tick.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
  *
  * SPDX-License-Identifier: Apache-2.0
  *

+ 1 - 1
libcpu/risc-v/virt64/tick.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2021, RT-Thread Development Team
  *
  * SPDX-License-Identifier: Apache-2.0
  *