Browse Source

[libcpu][rv64] add clone support

jasonhu 4 years ago
parent
commit
36ea60a527

+ 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 */
 
 

+ 81 - 0
components/lwp/arch/risc-v/rv64/lwp_arch.c

@@ -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)
     }
 }
 
+extern 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

+ 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
 

+ 3 - 0
libcpu/risc-v/virt64/cpuport.h

@@ -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()
 {

+ 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:

+ 2 - 2
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