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

update qemu-virt-rv64 bsp,modify lwp userspace bound check

update qemu-virt-rv64 bsp,modify lwp userspace bound check
lizhirui 4 лет назад
Родитель
Сommit
3ebfb364cc

+ 53 - 14
bsp/qemu-virt-rv64/.config

@@ -67,7 +67,7 @@ CONFIG_RT_USING_DEVICE=y
 CONFIG_RT_USING_CONSOLE=y
 CONFIG_RT_CONSOLEBUF_SIZE=256
 CONFIG_RT_CONSOLE_DEVICE_NAME="uart"
-CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_VER_NUM=0x50000
 CONFIG_ARCH_CPU_64BIT=y
 CONFIG_RT_USING_CACHE=y
 # CONFIG_RT_USING_CPU_FFS is not set
@@ -95,6 +95,7 @@ CONFIG_RT_MAIN_THREAD_PRIORITY=10
 # Command shell
 #
 CONFIG_RT_USING_FINSH=y
+CONFIG_RT_USING_MSH=y
 CONFIG_FINSH_THREAD_NAME="tshell"
 CONFIG_FINSH_USING_HISTORY=y
 CONFIG_FINSH_HISTORY_LINES=5
@@ -105,9 +106,6 @@ CONFIG_FINSH_THREAD_PRIORITY=20
 CONFIG_FINSH_THREAD_STACK_SIZE=4096
 CONFIG_FINSH_CMD_SIZE=80
 # CONFIG_FINSH_USING_AUTH is not set
-CONFIG_FINSH_USING_MSH=y
-CONFIG_FINSH_USING_MSH_DEFAULT=y
-CONFIG_FINSH_USING_MSH_ONLY=y
 CONFIG_FINSH_ARG_MAX=10
 
 #
@@ -219,13 +217,16 @@ CONFIG_RT_USING_POSIX_CLOCKTIME=y
 # CONFIG_RT_USING_RYM is not set
 # CONFIG_RT_USING_ULOG is not set
 # CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_RT_LINK is not set
 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_LWP_UNIX98_PTY is not set
 
 #
 # RT-Thread online packages
@@ -294,8 +295,6 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_LIBRWS is not set
 # CONFIG_PKG_USING_TCPSERVER is not set
 # CONFIG_PKG_USING_PROTOBUF_C is not set
-# CONFIG_PKG_USING_ONNX_PARSER is not set
-# CONFIG_PKG_USING_ONNX_BACKEND is not set
 # CONFIG_PKG_USING_DLT645 is not set
 # CONFIG_PKG_USING_QXWZ is not set
 # CONFIG_PKG_USING_SMTP_CLIENT is not set
@@ -310,6 +309,12 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_BTSTACK is not set
 # CONFIG_PKG_USING_LORAWAN_ED_STACK is not set
 # CONFIG_PKG_USING_WAYZ_IOTKIT is not set
+# CONFIG_PKG_USING_MAVLINK is not set
+# CONFIG_PKG_USING_RAPIDJSON is not set
+# CONFIG_PKG_USING_BSAL is not set
+# CONFIG_PKG_USING_AGILE_MODBUS is not set
+# CONFIG_PKG_USING_AGILE_FTP is not set
+# CONFIG_PKG_USING_EMBEDDEDPROTO is not set
 
 #
 # security packages
@@ -335,6 +340,7 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_STEMWIN is not set
 # CONFIG_PKG_USING_WAVPLAYER is not set
 # CONFIG_PKG_USING_TJPGD is not set
+# CONFIG_PKG_USING_PDFGEN is not set
 # CONFIG_PKG_USING_HELIX is not set
 # CONFIG_PKG_USING_AZUREGUIX is not set
 # CONFIG_PKG_USING_TOUCHGFX2RTT is not set
@@ -368,6 +374,17 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_VCONSOLE is not set
 # CONFIG_PKG_USING_KDB is not set
 # CONFIG_PKG_USING_WAMR is not set
+# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set
+# CONFIG_PKG_USING_LWLOG is not set
+# CONFIG_PKG_USING_ANV_TRACE is not set
+# CONFIG_PKG_USING_ANV_MEMLEAK is not set
+# CONFIG_PKG_USING_ANV_TESTSUIT is not set
+# CONFIG_PKG_USING_ANV_BENCH is not set
+# CONFIG_PKG_USING_DEVMEM is not set
+# CONFIG_PKG_USING_REGEX is not set
+# CONFIG_PKG_USING_MEM_SANDBOX is not set
+# CONFIG_PKG_USING_SOLAR_TERMS is not set
+# CONFIG_PKG_USING_GAN_ZHI is not set
 
 #
 # system packages
@@ -375,7 +392,6 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_GUIENGINE is not set
 # CONFIG_PKG_USING_CAIRO is not set
 # CONFIG_PKG_USING_PIXMAN is not set
-# CONFIG_PKG_USING_LWEXT4 is not set
 # CONFIG_PKG_USING_PARTITION is not set
 # CONFIG_PKG_USING_FAL is not set
 # CONFIG_PKG_USING_FLASHDB is not set
@@ -385,6 +401,9 @@ CONFIG_LWP_TID_MAX_NR=64
 # 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
+# CONFIG_PKG_USING_DFS_UFFS is not set
+# CONFIG_PKG_USING_LWEXT4 is not set
 # CONFIG_PKG_USING_THREAD_POOL is not set
 # CONFIG_PKG_USING_ROBOTS is not set
 # CONFIG_PKG_USING_EV is not set
@@ -406,11 +425,14 @@ CONFIG_LWP_TID_MAX_NR=64
 # 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_PRINTF 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
 
 #
 # peripheral libraries and drivers
@@ -474,6 +496,24 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_VIRTUAL_SENSOR is not set
 # CONFIG_PKG_USING_VDEVICE is not set
 # CONFIG_PKG_USING_SGM706 is not set
+# CONFIG_PKG_USING_STM32WB55_SDK is not set
+# CONFIG_PKG_USING_RDA58XX is not set
+# CONFIG_PKG_USING_LIBNFC is not set
+# CONFIG_PKG_USING_MFOC is not set
+# CONFIG_PKG_USING_TMC51XX is not set
+
+#
+# AI packages
+#
+# CONFIG_PKG_USING_LIBANN is not set
+# CONFIG_PKG_USING_NNOM is not set
+# CONFIG_PKG_USING_ONNX_BACKEND is not set
+# CONFIG_PKG_USING_ONNX_PARSER is not set
+# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set
+# CONFIG_PKG_USING_ELAPACK is not set
+# CONFIG_PKG_USING_ULAPACK is not set
+# CONFIG_PKG_USING_QUEST is not set
+# CONFIG_PKG_USING_NAXOS is not set
 
 #
 # miscellaneous packages
@@ -505,25 +545,24 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_HELLO is not set
 # CONFIG_PKG_USING_VI is not set
 # CONFIG_PKG_USING_KI is not set
-# CONFIG_PKG_USING_NNOM is not set
-# CONFIG_PKG_USING_LIBANN is not set
-# CONFIG_PKG_USING_ELAPACK is not set
 # CONFIG_PKG_USING_ARMv7M_DWT is not set
 # CONFIG_PKG_USING_VT100 is not set
-# CONFIG_PKG_USING_ULAPACK is not set
 # CONFIG_PKG_USING_UKAL is not set
 # CONFIG_PKG_USING_CRCLIB is not set
 
 #
-# games: games run on RT-Thread console
+# 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_TENSORFLOWLITEMICRO 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_BOARD_virt=y
 
 #

+ 2 - 0
bsp/qemu-virt-rv64/.gitignore

@@ -0,0 +1,2 @@
+mnt.c
+romfs_data.c

+ 7 - 5
bsp/qemu-virt-rv64/rtconfig.h

@@ -42,7 +42,7 @@
 #define RT_USING_CONSOLE
 #define RT_CONSOLEBUF_SIZE 256
 #define RT_CONSOLE_DEVICE_NAME "uart"
-#define RT_VER_NUM 0x40003
+#define RT_VER_NUM 0x50000
 #define ARCH_CPU_64BIT
 #define RT_USING_CACHE
 #define RT_USING_USERSPACE
@@ -64,6 +64,7 @@
 /* Command shell */
 
 #define RT_USING_FINSH
+#define RT_USING_MSH
 #define FINSH_THREAD_NAME "tshell"
 #define FINSH_USING_HISTORY
 #define FINSH_HISTORY_LINES 5
@@ -72,9 +73,6 @@
 #define FINSH_THREAD_PRIORITY 20
 #define FINSH_THREAD_STACK_SIZE 4096
 #define FINSH_CMD_SIZE 80
-#define FINSH_USING_MSH
-#define FINSH_USING_MSH_DEFAULT
-#define FINSH_USING_MSH_ONLY
 #define FINSH_ARG_MAX 10
 
 /* Device virtual file system */
@@ -127,6 +125,7 @@
 
 #define RT_USING_LWP
 #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
@@ -169,13 +168,16 @@
 /* peripheral libraries and drivers */
 
 
+/* AI packages */
+
+
 /* miscellaneous packages */
 
 
 /* samples: kernel and components samples */
 
 
-/* games: games run on RT-Thread console */
+/* entertainment: terminal games and other interesting software packages */
 
 #define BOARD_virt
 

+ 2 - 2
bsp/qemu-virt-rv64/rtconfig.py

@@ -15,7 +15,7 @@ if os.getenv('RTT_CC'):
 
 if  CROSS_TOOL == 'gcc':
     PLATFORM    = 'gcc'
-    EXEC_PATH   = r'/opt/riscv64-unknown-elf-gcc-8.3.0-2020.04.1-x86_64-linux-ubuntu14/bin'
+    EXEC_PATH   = r'/home/lizhirui/workspace/riscv64-toolchains/bin'
 else:
     print('Please make sure your toolchains is GNU GCC!')
     exit(0)
@@ -38,7 +38,7 @@ if PLATFORM == 'gcc':
     OBJDUMP = PREFIX + 'objdump'
     OBJCPY  = PREFIX + 'objcopy'
 
-    DEVICE  = ' -mcmodel=medany -march=rv64imafdc -mabi=lp64d'
+    DEVICE  = ' -mcmodel=medany -march=rv64imafdc -mabi=lp64'
     CFLAGS  = DEVICE + ' -fvar-tracking -ffreestanding -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -nostdinc '
     AFLAGS  = ' -c' + DEVICE + ' -x assembler-with-cpp'
     LFLAGS  = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,_start -T link.lds -lc -lm '

+ 4 - 3
components/lwp/arch/risc-v/virt64/lwp_arch.h

@@ -14,13 +14,14 @@
 
 #ifdef RT_USING_USERSPACE
 
-#define USER_VADDR_TOP    0x150000000UL
 #define USER_HEAP_VADDR   0x300000000UL
+#define USER_HEAP_VEND 0xffffffffffff0000UL
 #define USER_STACK_VSTART 0x270000000UL
 #define USER_STACK_VEND   USER_HEAP_VADDR
-#define LDSO_LOAD_VADDR   0x200000000UL
 #define USER_VADDR_START  0x100000000UL
-#define USER_LOAD_VADDR   USER_VADDR_START
+#define USER_VADDR_TOP 0xfffffffffffff000UL
+#define USER_LOAD_VADDR 0x200000000
+#define LDSO_LOAD_VADDR 0x200000000
 
 #define MMU_MAP_U_RWCB 0
 #define MMU_MAP_U_RW 0

+ 20 - 73
components/lwp/arch/risc-v/virt64/lwp_gcc.S

@@ -12,6 +12,7 @@
 
 #include "rtconfig.h"
 
+#define __ASSEMBLY__
 #include "cpuport.h"
 #include "encoding.h"
 #include "stackframe.h"
@@ -212,76 +213,22 @@ lwp_set_thread_area:
     mv tp, a0
     ret
 
-/*
-.globl rt_cpu_get_thread_idr
-rt_cpu_get_thread_idr:
-    mrc p15, 0, r0, c13, c0, 3
-    bx lr
-
-.global lwp_set_thread_area
-lwp_set_thread_area:
-.globl rt_cpu_set_thread_idr
-rt_cpu_set_thread_idr:
-    mcr p15, 0, r0, c13, c0, 3
-    bx lr
-
-// kuser suppurt
-    .macro  kuser_pad, sym, size
-    .if (. - \sym) & 3
-    .rept   4 - (. - \sym) & 3
-    .byte   0
-    .endr
-    .endif
-    .rept   (\size - (. - \sym)) / 4
-    .word   0xe7fddef1
-    .endr
-    .endm
-
-.align  5
-.globl  __kuser_helper_start
-__kuser_helper_start:
-__kuser_cmpxchg64:              @ 0xffff0f60
-    stmfd   sp!, {r4, r5, r6, lr}
-    ldmia   r0, {r4, r5}            @ load old val
-    ldmia   r1, {r6, lr}            @ load new val
-1:  ldmia   r2, {r0, r1}            @ load current val
-    eors    r3, r0, r4          @ compare with oldval (1)
-    eorseq  r3, r1, r5          @ compare with oldval (2)
-2:  stmiaeq r2, {r6, lr}            @ store newval if eq
-    rsbs    r0, r3, #0          @ set return val and C flag
-    ldmfd   sp!, {r4, r5, r6, pc}
-
-    kuser_pad __kuser_cmpxchg64, 64
-
-__kuser_memory_barrier:             @ 0xffff0fa0
-    dmb
-    mov pc, lr
-
-    kuser_pad __kuser_memory_barrier, 32
-
-__kuser_cmpxchg:                @ 0xffff0fc0
-1:  ldr r3, [r2]            @ load current val
-    subs    r3, r3, r0          @ compare with oldval
-2:  streq   r1, [r2]            @ store newval if eq
-    rsbs    r0, r3, #0          @ set return val and C flag
-    mov pc, lr
-
-kuser_pad __kuser_cmpxchg, 32
-
-__kuser_get_tls:                @ 0xffff0fe0
-    mrc p15, 0, r0, c13, c0, 3  @ 0xffff0fe8 hardware TLS code
-    mov pc, lr
-    ldr r0, [pc, #(16 - 8)] @ read TLS, set in kuser_get_tls_init
-
-    kuser_pad __kuser_get_tls, 16
-
-    .rep    3
-    .word   0           @ 0xffff0ff0 software TLS value, then
-    .endr               @ pad up to __kuser_helper_version
-
-__kuser_helper_version:             @ 0xffff0ffc
-    .word   ((__kuser_helper_end - __kuser_helper_start) >> 5)
-
-    .globl  __kuser_helper_end
-__kuser_helper_end:
-*/
+.global sys_fork
+.global sys_vfork
+.global sys_fork_exit
+sys_fork:
+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
+
+.global lwp_exec_user
+lwp_exec_user:
+    ret//don't support

+ 7 - 4
components/lwp/lwp_user_mm.c

@@ -9,6 +9,7 @@
  * 2021-02-06     lizhirui     fixed fixed vtable size problem
  * 2021-02-12     lizhirui     add 64-bit support for lwp_brk
  * 2021-02-19     lizhirui     add riscv64 support for lwp_user_accessable and lwp_get_from_user
+ * 2021-06-07     lizhirui     modify user space bound check
  */
 
 #include <rtthread.h>
@@ -404,12 +405,11 @@ size_t lwp_get_from_user(void *dst, void *src, size_t size)
     rt_mmu_info *m_info = RT_NULL;
 
     /* check src */
-#ifdef ARCH_RISCV64
-    if(src < (void *)USER_VADDR_START)
+
+    if (src < (void *)USER_VADDR_START)
     {
         return 0;
     }
-#else
     if (src >= (void *)USER_VADDR_TOP)
     {
         return 0;
@@ -418,7 +418,6 @@ size_t lwp_get_from_user(void *dst, void *src, size_t size)
     {
         return 0;
     }
-#endif
 
     lwp = lwp_self();
     if (!lwp)
@@ -436,6 +435,10 @@ size_t lwp_put_to_user(void *dst, void *src, size_t size)
     rt_mmu_info *m_info = RT_NULL;
 
     /* check dst */
+    if (dst < (void *)USER_VADDR_START)
+    {
+        return 0;
+    }
     if (dst >= (void *)USER_VADDR_TOP)
     {
         return 0;

+ 5 - 0
libcpu/risc-v/virt64/cache.c

@@ -74,6 +74,11 @@ rt_base_t rt_hw_cpu_icache_status()
 }
 
 rt_base_t rt_hw_cpu_dcache_status()
+{
+    return 0;
+}
+
+int sys_cacheflush(void *addr, int size, int cache)
 {
     return 0;
 }

+ 1 - 0
libcpu/risc-v/virt64/context_gcc.S

@@ -10,6 +10,7 @@
  * 2021/02/02     lizhirui     Add userspace support
  */
 
+#define __ASSEMBLY__
 #include "cpuport.h"
 #include "stackframe.h"
 

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

@@ -86,7 +86,7 @@ rt_uint8_t *rt_hw_stack_init(void       *tentry,
  * #endif
  */
 #ifndef RT_USING_SMP
-void rt_hw_context_switch_interrupt(rt_ubase_t from, rt_ubase_t to)
+void rt_hw_context_switch_interrupt(rt_ubase_t from, rt_ubase_t to, rt_thread_t from_thread, rt_thread_t to_thread)
 {
     if (rt_thread_switch_interrupt_flag == 0)
         rt_interrupt_from_thread = from;

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

@@ -22,6 +22,24 @@
 // error here, not portable
 #endif
 
+#ifndef __ASSEMBLY__
+rt_inline void rt_hw_dsb()
+{
+    asm volatile("fence":::"memory");
+}
+
+rt_inline void rt_hw_dmb()
+{
+    asm volatile("fence":::"memory");
+}
+
+rt_inline void rt_hw_isb()
+{
+    asm volatile("fence.i":::"memory");
+}
+
+#endif
+
 #endif
 #ifdef RISCV_U_MODE
 #define RISCV_USER_ENTRY 0xFFFFFFE000000000ULL

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

@@ -10,6 +10,7 @@
  * 2021/02/02     lizhirui     Add userspace support
  */
 
+#define __ASSEMBLY__
 #include "cpuport.h"
 #include "encoding.h"
 #include "stackframe.h"
@@ -142,6 +143,9 @@ copy_context_loop:
     call syscall_handler
     CLOSE_INTERRUPT
 
+.global syscall_exit
+syscall_exit:
+
     #if defined(RT_USING_USERSPACE) && defined(RT_USING_SIGNALS)
         LOAD s0, 2 * REGBYTES(sp)
         andi s0, s0, 0x100

+ 7 - 0
libcpu/risc-v/virt64/riscv_mmu.h

@@ -58,6 +58,13 @@
 
 #define mmu_flush_tlb() do{asm volatile("sfence.vma x0,x0");}while(0)
 
+//compatible to rt-smart new version
+#define MMU_MAP_K_DEVICE (PAGE_ATTR_RWX | PTE_V | PTE_G)
+#define MMU_MAP_K_RWCB (PAGE_ATTR_RWX | PTE_V | PTE_G)
+#define ARCH_PAGE_SIZE PAGE_SIZE
+#define ARCH_PAGE_MASK (ARCH_PAGE_SIZE - 1)
+#define ARCH_PAGE_SHIFT PAGE_OFFSET_BIT
+
 void mmu_set_pagetable(rt_ubase_t addr);
 void mmu_enable_user_page_access();
 void mmu_disable_user_page_access();

+ 1 - 0
libcpu/risc-v/virt64/startup_gcc.S

@@ -11,6 +11,7 @@
  */
 
 #define SSTATUS_FS      0x00006000U /* initial state of FPU, clear to disable */
+#define __ASSEMBLY__
 #include <cpuport.h>
 
   .global	_start