From 4194432f07cb9ec29205a2212013152da2a017d0 Mon Sep 17 00:00:00 2001 From: wuzhonghui Date: Fri, 5 Nov 2021 17:12:35 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BF=AE=E6=94=B9=E3=80=91lwp=20?= =?UTF-8?q?=E5=9C=A8=E6=B2=A1=E6=9C=89=E8=99=9A=E6=8B=9F=E5=86=85=E5=AD=98?= =?UTF-8?q?=E4=B8=8A=E7=9A=84=E5=AE=9E=E7=8E=B0=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/dfs/filesystems/romfs/dfs_romfs.c | 23 +- components/dfs/include/dfs_file.h | 2 +- components/libc/compilers/newlib/SConscript | 3 +- components/lwp/Kconfig | 100 ++-- components/lwp/SConscript | 9 +- components/lwp/arch/aarch64/common/reloc.c | 2 +- .../lwp/arch/aarch64/cortex-a/lwp_arch.c | 2 +- .../lwp/arch/aarch64/cortex-a/lwp_arch.h | 2 +- components/lwp/arch/arm/common/reloc.c | 4 +- components/lwp/arch/arm/cortex-a/lwp_arch.c | 2 +- components/lwp/arch/arm/cortex-a/lwp_arch.h | 3 +- components/lwp/arch/risc-v/rv64/lwp_arch.c | 2 +- components/lwp/arch/risc-v/rv64/lwp_arch.h | 2 +- components/lwp/arch/risc-v/rv64/reloc.c | 4 +- components/lwp/arch/x86/i386/lwp_arch.c | 4 +- components/lwp/arch/x86/i386/lwp_arch.h | 4 +- components/lwp/arch/x86/i386/reloc.c | 4 +- components/lwp/ioremap.c | 6 +- components/lwp/lwp.c | 202 ++++++-- components/lwp/lwp.h | 25 +- components/lwp/lwp_avl.c | 19 + components/lwp/lwp_avl.h | 3 + components/lwp/lwp_futex.c | 2 +- components/lwp/lwp_mm_area.c | 2 +- components/lwp/lwp_mm_area.h | 2 +- components/lwp/lwp_pid.c | 38 +- components/lwp/lwp_pmutex.c | 2 +- components/lwp/lwp_shm.c | 2 +- components/lwp/lwp_signal.c | 20 + components/lwp/lwp_signal.h | 3 + components/lwp/lwp_syscall.c | 440 ++++++++++++++---- components/lwp/lwp_tid.c | 2 +- components/lwp/lwp_user_mm.c | 2 +- components/lwp/lwp_user_mm.h | 2 +- include/rtdef.h | 5 +- libcpu/Kconfig | 8 +- libcpu/aarch64/common/interrupt.c | 2 +- libcpu/aarch64/common/mmu.c | 12 +- libcpu/aarch64/common/mmu.h | 2 +- libcpu/aarch64/common/page.c | 2 +- libcpu/aarch64/common/page.h | 2 +- libcpu/arm/cortex-a/backtrace.c | 4 +- libcpu/arm/cortex-a/context_gcc.S | 16 +- libcpu/arm/cortex-a/interrupt.c | 2 +- libcpu/arm/cortex-a/mmu.c | 30 +- libcpu/arm/cortex-a/mmu.h | 4 +- libcpu/arm/cortex-a/page.c | 2 +- libcpu/arm/cortex-a/page.h | 2 +- libcpu/arm/cortex-a/start_gcc.S | 18 +- libcpu/arm/cortex-a/trap.c | 2 +- libcpu/arm/cortex-a/vector_gcc.S | 2 +- libcpu/mips/gs264/mmu.c | 16 +- libcpu/mips/gs264/mmu.h | 4 +- libcpu/risc-v/t-head/c906/context_gcc.S | 4 +- libcpu/risc-v/t-head/c906/interrupt_gcc.S | 4 +- libcpu/risc-v/t-head/c906/trap.c | 6 +- libcpu/risc-v/virt64/context_gcc.S | 4 +- libcpu/risc-v/virt64/interrupt_gcc.S | 4 +- libcpu/x86/i386/cpuport.c | 8 +- libcpu/x86/i386/gate.c | 4 +- libcpu/x86/i386/interrupt_gcc.S | 4 +- libcpu/x86/i386/mmu.c | 20 +- libcpu/x86/i386/mmu.h | 4 +- libcpu/x86/i386/page.c | 4 +- libcpu/x86/i386/syscall_c.c | 4 +- src/cpu.c | 4 +- src/mem.c | 5 +- src/scheduler.c | 17 + 68 files changed, 840 insertions(+), 335 deletions(-) diff --git a/components/dfs/filesystems/romfs/dfs_romfs.c b/components/dfs/filesystems/romfs/dfs_romfs.c index fba97e5ef0..27a513591b 100644 --- a/components/dfs/filesystems/romfs/dfs_romfs.c +++ b/components/dfs/filesystems/romfs/dfs_romfs.c @@ -34,7 +34,28 @@ int dfs_romfs_unmount(struct dfs_filesystem *fs) int dfs_romfs_ioctl(struct dfs_fd *file, int cmd, void *args) { - return -EIO; + int ret = RT_EOK; + struct romfs_dirent *dirent; + + dirent = (struct romfs_dirent *)file->fnode->data; + RT_ASSERT(dirent != NULL); + + switch (cmd) + { + case RT_FIOGETADDR: + { + *(rt_uint32_t*)args = (rt_uint32_t)dirent->data; + break; + } + case RT_FIOFTRUNCATE: + { + break; + } + default: + ret = -RT_EINVAL; + break; + } + return ret; } rt_inline int check_dirent(struct romfs_dirent *dirent) diff --git a/components/dfs/include/dfs_file.h b/components/dfs/include/dfs_file.h index af82a1e179..8106ace885 100644 --- a/components/dfs/include/dfs_file.h +++ b/components/dfs/include/dfs_file.h @@ -82,7 +82,7 @@ int dfs_file_ftruncate(struct dfs_fd *fd, off_t length); /* 0x5254 is just a magic number to make these relatively unique ("RT") */ #define RT_FIOFTRUNCATE 0x52540000U -#define RT_FIOGETXIPADDR 0x52540001U +#define RT_FIOGETADDR 0x52540001U #ifdef __cplusplus } diff --git a/components/libc/compilers/newlib/SConscript b/components/libc/compilers/newlib/SConscript index a5e45a29ae..581408d4c2 100644 --- a/components/libc/compilers/newlib/SConscript +++ b/components/libc/compilers/newlib/SConscript @@ -18,10 +18,9 @@ if rtconfig.PLATFORM == 'gcc' and GetDepend('RT_USING_LIBC'): # musl libc is used as a software library. src = [] LIBS = [] - elif not GetDepend('RT_USING_NEWLIB'): + elif GetDepend('RT_USING_NEWLIB'): # RT_USING_NEWLIB is defined already CPPPATH = [cwd] - CPPDEFINES = ['RT_USING_NEWLIB'] group = DefineGroup('newlib', src, depend = ['RT_USING_LIBC'], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES, LIBS = LIBS) diff --git a/components/lwp/Kconfig b/components/lwp/Kconfig index da5ca2a190..4a2029ed5c 100644 --- a/components/lwp/Kconfig +++ b/components/lwp/Kconfig @@ -1,5 +1,5 @@ -config RT_USING_LWP - bool "Using light-weight process" +menuconfig RT_USING_LWP + bool "light-weight process" select RT_USING_DFS select RT_USING_LIBC select RT_USING_POSIX_CLOCKTIME @@ -12,53 +12,67 @@ if RT_USING_LWP config RT_LWP_MAX_NR int "The max number of light-weight process" default 30 -endif -config LWP_TASK_STACK_SIZE - int "The lwp thread kernel stack size" - default 16384 - depends on RT_USING_LWP + config LWP_TASK_STACK_SIZE + int "The lwp thread kernel stack size" + default 16384 -config RT_CH_MSG_MAX_NR - int "The maximum number of channel messages" - default 1024 - depends on RT_USING_LWP + config RT_CH_MSG_MAX_NR + int "The maximum number of channel messages" + default 1024 -config RT_LWP_SHM_MAX_NR - int "The maximum number of shared memory" - default 64 - depends on RT_USING_LWP + config LWP_CONSOLE_INPUT_BUFFER_SIZE + int "The input buffer size of lwp console device" + default 1024 -config LWP_CONSOLE_INPUT_BUFFER_SIZE - int "The input buffer size of lwp console device" - default 1024 - depends on RT_USING_LWP + config LWP_TID_MAX_NR + int "The maximum number of lwp thread id" + default 64 -config LWP_TID_MAX_NR - int "The maximum number of lwp thread id" - default 64 - depends on RT_USING_LWP + config RT_LWP_HAS_VM + bool + depends on ARCH_ARM_ARM9 || ARCH_ARM_CORTEX_A || ARCH_RISCV64 + select RT_USING_VIRTUAL_MEMORY + default y -config LWP_UNIX98_PTY - bool "The unix98 PTY support" - default n - depends on RT_USING_LWP + if RT_LWP_HAS_VM + config RT_LWP_SHM_MAX_NR + int "The maximum number of shared memory" + default 64 + endif + + if !RT_LWP_HAS_VM + config RT_LWP_USING_MPU + bool "Enable mpu to protect process" + depends on ARCH_ARM_CORTEX_M + default y + + if RT_LWP_USING_MPU + config RT_LWP_MPU_MAX_NR + int "The maximum number of mpu region" + default 2 + endif -config LWP_PTY_INPUT_BFSZ - int "The unix98 PTY input buffer size" - default 1024 - depends on RT_USING_LWP - depends on LWP_UNIX98_PTY + config RT_LWP_USING_SHM + bool "Enable shared memory" + default y + endif -config LWP_PTY_PTS_SIZE - int "The unix98 PTY device max num" - default 3 - depends on RT_USING_LWP - depends on LWP_UNIX98_PTY + config LWP_UNIX98_PTY + bool "The unix98 PTY support" + default n -config LWP_PTY_USING_DEBUG - bool "The unix98 PTY debug output" - default n - depends on RT_USING_LWP - depends on LWP_UNIX98_PTY - + if LWP_UNIX98_PTY + config LWP_PTY_INPUT_BFSZ + int "The unix98 PTY input buffer size" + default 1024 + + config LWP_PTY_PTS_SIZE + int "The unix98 PTY device max num" + default 3 + + config LWP_PTY_USING_DEBUG + bool "The unix98 PTY debug output" + default n + endif +endif diff --git a/components/lwp/SConscript b/components/lwp/SConscript index 7dedd1389c..ce725be57d 100644 --- a/components/lwp/SConscript +++ b/components/lwp/SConscript @@ -1,5 +1,6 @@ Import('rtconfig') from building import * +import os cwd = GetCurrentDir() src = [] @@ -30,10 +31,14 @@ if platform in platform_file.keys(): # support platforms if arch in support_arch.keys() and cpu in support_arch[arch]: asm_path = 'arch/' + arch + '/' + cpu + '/*_' + platform_file[platform] arch_common = 'arch/' + arch + '/' + 'common/*.c' - src += Glob('*.c') + Glob(asm_path) + Glob(arch_common) + if not GetDepend('RT_USING_VIRTUAL_MEMORY'): + excluded_files = ['ioremap.c', 'lwp_futex.c', 'lwp_mm_area.c', 'lwp_pmutex.c', 'lwp_shm.c', 'lwp_user_mm.c'] + src += [f for f in Glob('*.c') if os.path.basename(str(f)) not in excluded_files] + Glob(asm_path) + Glob(arch_common) + else: + src += Glob('*.c') + Glob(asm_path) + Glob(arch_common) src += Glob('arch/' + arch + '/' + cpu + '/*.c') CPPPATH = [cwd] - CPPPATH += ['arch/' + arch + '/' + cpu] + CPPPATH += [cwd + '/arch/' + arch + '/' + cpu] group = DefineGroup('lwP', src, depend = ['RT_USING_LWP'], CPPPATH = CPPPATH) diff --git a/components/lwp/arch/aarch64/common/reloc.c b/components/lwp/arch/aarch64/common/reloc.c index 2ad00c9d01..554dcfe78e 100644 --- a/components/lwp/arch/aarch64/common/reloc.c +++ b/components/lwp/arch/aarch64/common/reloc.c @@ -2,7 +2,7 @@ #include #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include #endif diff --git a/components/lwp/arch/aarch64/cortex-a/lwp_arch.c b/components/lwp/arch/aarch64/cortex-a/lwp_arch.c index c5f4cebdb9..90ba8de048 100644 --- a/components/lwp/arch/aarch64/cortex-a/lwp_arch.c +++ b/components/lwp/arch/aarch64/cortex-a/lwp_arch.c @@ -11,7 +11,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include diff --git a/components/lwp/arch/aarch64/cortex-a/lwp_arch.h b/components/lwp/arch/aarch64/cortex-a/lwp_arch.h index 06e3cfd77a..49877d4957 100644 --- a/components/lwp/arch/aarch64/cortex-a/lwp_arch.h +++ b/components/lwp/arch/aarch64/cortex-a/lwp_arch.h @@ -13,7 +13,7 @@ #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #define USER_VADDR_TOP 0x0001000000000000UL #define USER_HEAP_VEND 0x0000ffffB0000000UL diff --git a/components/lwp/arch/arm/common/reloc.c b/components/lwp/arch/arm/common/reloc.c index d3fae5fc13..3e86f7b8e4 100644 --- a/components/lwp/arch/arm/common/reloc.c +++ b/components/lwp/arch/arm/common/reloc.c @@ -2,7 +2,7 @@ #include #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include #endif @@ -17,7 +17,7 @@ typedef struct Elf32_Half st_shndx; } Elf32_sym; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void lwp_elf_reloc(rt_mmu_info *m_info, void *text_start, void *rel_dyn_start, size_t rel_dyn_size, void *got_start, size_t got_size, Elf32_sym *dynsym) { size_t rel_off; diff --git a/components/lwp/arch/arm/cortex-a/lwp_arch.c b/components/lwp/arch/arm/cortex-a/lwp_arch.c index 0d0d0cf39f..b987478c57 100644 --- a/components/lwp/arch/arm/cortex-a/lwp_arch.c +++ b/components/lwp/arch/arm/cortex-a/lwp_arch.c @@ -11,7 +11,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include diff --git a/components/lwp/arch/arm/cortex-a/lwp_arch.h b/components/lwp/arch/arm/cortex-a/lwp_arch.h index 90b2ded273..f66d9b2ff4 100644 --- a/components/lwp/arch/arm/cortex-a/lwp_arch.h +++ b/components/lwp/arch/arm/cortex-a/lwp_arch.h @@ -12,7 +12,8 @@ #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY +#include "mmu.h" #define USER_VADDR_TOP 0xC0000000UL #define USER_HEAP_VEND 0xB0000000UL diff --git a/components/lwp/arch/risc-v/rv64/lwp_arch.c b/components/lwp/arch/risc-v/rv64/lwp_arch.c index 4739b58ee0..ec530867e1 100644 --- a/components/lwp/arch/risc-v/rv64/lwp_arch.c +++ b/components/lwp/arch/risc-v/rv64/lwp_arch.c @@ -17,7 +17,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include diff --git a/components/lwp/arch/risc-v/rv64/lwp_arch.h b/components/lwp/arch/risc-v/rv64/lwp_arch.h index 39e7671686..566abedf50 100644 --- a/components/lwp/arch/risc-v/rv64/lwp_arch.h +++ b/components/lwp/arch/risc-v/rv64/lwp_arch.h @@ -12,7 +12,7 @@ #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #define USER_HEAP_VADDR 0x300000000UL #define USER_HEAP_VEND 0xffffffffffff0000UL diff --git a/components/lwp/arch/risc-v/rv64/reloc.c b/components/lwp/arch/risc-v/rv64/reloc.c index b1afda1f76..6dedcf06dc 100644 --- a/components/lwp/arch/risc-v/rv64/reloc.c +++ b/components/lwp/arch/risc-v/rv64/reloc.c @@ -2,7 +2,7 @@ #include #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include #endif @@ -17,7 +17,7 @@ typedef struct Elf64_Half st_shndx; } Elf64_sym; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void lwp_elf_reloc(rt_mmu_info *m_info, void *text_start, void *rel_dyn_start, size_t rel_dyn_size, void *got_start, size_t got_size, Elf64_sym *dynsym) { size_t rel_off; diff --git a/components/lwp/arch/x86/i386/lwp_arch.c b/components/lwp/arch/x86/i386/lwp_arch.c index 5682059559..869156ddf4 100644 --- a/components/lwp/arch/x86/i386/lwp_arch.c +++ b/components/lwp/arch/x86/i386/lwp_arch.c @@ -13,7 +13,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include @@ -368,4 +368,4 @@ void lwp_signal_do_return(rt_hw_stack_frame_t *frame) } #endif /* RT_USING_SIGNALS */ -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ diff --git a/components/lwp/arch/x86/i386/lwp_arch.h b/components/lwp/arch/x86/i386/lwp_arch.h index 74049be6d0..a5b055787c 100644 --- a/components/lwp/arch/x86/i386/lwp_arch.h +++ b/components/lwp/arch/x86/i386/lwp_arch.h @@ -14,7 +14,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #define USER_VADDR_TOP 0xFFFFF000UL #define USER_HEAP_VEND 0xE0000000UL #define USER_HEAP_VADDR 0x90000000UL @@ -49,6 +49,6 @@ rt_inline unsigned long ffz(unsigned long x) } #endif -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ #endif /*LWP_ARCH_H__*/ diff --git a/components/lwp/arch/x86/i386/reloc.c b/components/lwp/arch/x86/i386/reloc.c index 598638461d..12bbca3372 100644 --- a/components/lwp/arch/x86/i386/reloc.c +++ b/components/lwp/arch/x86/i386/reloc.c @@ -12,7 +12,7 @@ #include #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include #endif @@ -27,7 +27,7 @@ typedef struct Elf32_Half st_shndx; } Elf32_sym; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void lwp_elf_reloc(rt_mmu_info *m_info, void *text_start, void *rel_dyn_start, size_t rel_dyn_size, void *got_start, size_t got_size, Elf32_sym *dynsym) { diff --git a/components/lwp/ioremap.c b/components/lwp/ioremap.c index 2d0b564ded..c379d949f8 100644 --- a/components/lwp/ioremap.c +++ b/components/lwp/ioremap.c @@ -10,14 +10,14 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include #endif #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY static struct lwp_avl_struct *k_map_area; extern rt_mmu_info mmu_info; @@ -105,7 +105,7 @@ void *rt_ioremap_cached(void *paddr, size_t size) void rt_iounmap(volatile void *vaddr) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY rt_base_t level; struct lwp_avl_struct *ma_avl_node; diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index d89fb7d92a..16a4391a17 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -23,13 +23,12 @@ #endif #include "lwp.h" -#include "lwp_arch.h" #define DBG_TAG "LWP" #define DBG_LVL DBG_WARNING #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #ifdef RT_USING_GDBSERVER #include #include @@ -39,7 +38,9 @@ #include #endif +#ifdef RT_USING_VIRTUAL_MEMORY static const char elf_magic[] = {0x7f, 'E', 'L', 'F'}; +#endif #ifdef DFS_USING_WORKDIR extern char working_directory[]; #endif @@ -110,14 +111,25 @@ void lwp_set_kernel_sp(uint32_t *sp) uint32_t *lwp_get_kernel_sp(void) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY return (uint32_t *)rt_thread_self()->sp; #else - return (uint32_t *)rt_thread_self()->kernel_sp; + uint32_t* kernel_sp; + extern rt_uint32_t rt_interrupt_from_thread; + extern rt_uint32_t rt_thread_switch_interrupt_flag; + if (rt_thread_switch_interrupt_flag) + { + kernel_sp = (uint32_t *)((rt_thread_t)rt_container_of(rt_interrupt_from_thread, struct rt_thread, sp))->kernel_sp; + } + else + { + kernel_sp = (uint32_t *)rt_thread_self()->kernel_sp; + } + return kernel_sp; #endif } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **argv, char **envp) { int size = sizeof(size_t) * 5; /* store argc, argv, envp, aux, NULL */ @@ -217,13 +229,17 @@ struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **argv, char #else static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **argv, char **envp) { +#ifdef RT_USING_VIRTUAL_MEMORY int size = sizeof(int) * 5; /* store argc, argv, envp, aux, NULL */ + struct process_aux *aux; +#else + int size = sizeof(int) * 4; /* store argc, argv, envp, NULL */ +#endif /* RT_USING_VIRTUAL_MEMORY */ int *args; char *str; char **new_argve; int i; int len; - struct process_aux *aux; for (i = 0; i < argc; i++) { @@ -242,6 +258,7 @@ static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **arg } } +#ifdef RT_USING_VIRTUAL_MEMORY /* for aux */ size += sizeof(struct process_aux); @@ -253,6 +270,14 @@ static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **arg /* argc, argv[], 0, envp[], 0 */ str = (char *)((size_t)args + (argc + 2 + i + 1 + AUX_ARRAY_ITEMS_NR * 2 + 1) * sizeof(int)); +#else + args = (int *)rt_malloc(size); + if (args == RT_NULL) + { + return RT_NULL; + } + str = (char*)((int)args + (argc + 2 + i + 1) * sizeof(int)); +#endif /* RT_USING_VIRTUAL_MEMORY */ new_argve = (char **)&args[1]; args[0] = argc; @@ -281,7 +306,7 @@ static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **arg } new_argve[i] = 0; } - +#ifdef RT_USING_VIRTUAL_MEMORY /* aux */ aux = (struct process_aux *)(new_argve + i); aux->item[0].key = AT_EXECFN; @@ -292,9 +317,16 @@ static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **arg lwp->args = args; return aux; +#else + lwp->args = args; + lwp->args_length = size; + + return (struct process_aux *)(new_argve + i); +#endif /* RT_USING_VIRTUAL_MEMORY */ } #endif +#ifdef RT_USING_VIRTUAL_MEMORY #define check_off(voff, vlen) \ do \ { \ @@ -348,13 +380,13 @@ typedef struct Elf_Half st_shndx; } Elf_sym; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void lwp_elf_reloc(rt_mmu_info *m_info, void *text_start, void *rel_dyn_start, size_t rel_dyn_size, void *got_start, size_t got_size, Elf_sym *dynsym); #else void lwp_elf_reloc(void *text_start, void *rel_dyn_start, size_t rel_dyn_size, void *got_start, size_t got_size, Elf_sym *dynsym); #endif -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY struct map_range { void *start; @@ -471,13 +503,11 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str size_t rel_dyn_size = 0; size_t dynsym_off = 0; size_t dynsym_size = 0; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY struct map_range user_area[2] = {{NULL, 0}, {NULL, 0}}; /* 0 is text, 1 is data */ void *pa, *va; void *va_self; -#endif -#ifdef RT_USING_USERSPACE rt_mmu_info *m_info = &lwp->mmu_info; #endif @@ -517,7 +547,7 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str } if ((eheader.e_type != ET_DYN) -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY && (eheader.e_type != ET_EXEC) #endif ) @@ -526,7 +556,7 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str return -RT_ERROR; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY { off = eheader.e_phoff; for (i = 0; i < eheader.e_phnum; i++, off += sizeof pheader) @@ -561,7 +591,7 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str off = eheader.e_phoff; process_header_size = eheader.e_phnum * sizeof pheader; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (process_header_size > ARCH_PAGE_SIZE - sizeof(char[16])) { return -RT_ERROR; @@ -584,12 +614,12 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str lseek(fd, off, SEEK_SET); read_len = load_fread(process_header, 1, process_header_size, fd); check_read(read_len, process_header_size); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, process_header, process_header_size); #endif aux->item[1].key = AT_PAGESZ; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY aux->item[1].value = ARCH_PAGE_SIZE; #else aux->item[1].value = RT_MM_PAGE_SIZE; @@ -598,7 +628,7 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str { uint32_t random_value = rt_tick_get(); uint8_t *random; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY uint8_t *krandom; random = (uint8_t *)(USER_VADDR_TOP - ARCH_PAGE_SIZE - sizeof(char[16])); @@ -613,7 +643,7 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str aux->item[2].value = (size_t)random; } aux->item[3].key = AT_PHDR; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY aux->item[3].value = (size_t)va; #else aux->item[3].value = (size_t)process_header; @@ -622,7 +652,7 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str aux->item[4].value = eheader.e_phnum; aux->item[5].key = AT_PHENT; aux->item[5].value = sizeof pheader; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, aux, sizeof *aux); #endif } @@ -631,7 +661,7 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str { load_off = (size_t)load_addr; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY else { /* map user */ @@ -783,7 +813,7 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str check_off(pheader.p_offset, len); lseek(fd, pheader.p_offset, SEEK_SET); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY { uint32_t size = pheader.p_filesz; size_t tmp_len = 0; @@ -810,7 +840,7 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str if (pheader.p_filesz < pheader.p_memsz) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY uint32_t size = pheader.p_memsz - pheader.p_filesz; uint32_t size_s; uint32_t off; @@ -897,7 +927,7 @@ static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, str read_len = load_fread(dynsym, 1, dynsym_size, fd); check_read(read_len, dynsym_size); } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY lwp_elf_reloc(m_info, (void *)load_off, rel_dyn_start, rel_dyn_size, got_start, got_size, dynsym); #else lwp_elf_reloc((void *)load_off, rel_dyn_start, rel_dyn_size, got_start, got_size, dynsym); @@ -924,11 +954,13 @@ _exit: } return result; } +#endif /* RT_USING_VIRTUAL_MEMORY */ int lwp_load(const char *filename, struct rt_lwp *lwp, uint8_t *load_addr, size_t addr_size, struct process_aux *aux); RT_WEAK int lwp_load(const char *filename, struct rt_lwp *lwp, uint8_t *load_addr, size_t addr_size, struct process_aux *aux) { +#ifdef RT_USING_VIRTUAL_MEMORY uint8_t *ptr; int ret = -1; int len; @@ -980,6 +1012,84 @@ out: close(fd); } return ret; +#else + const char *process_name = RT_NULL; + int ret = -1; + int fd = 0; + + /* check file name */ + RT_ASSERT(filename != RT_NULL); + /* check lwp control block */ + RT_ASSERT(lwp != RT_NULL); + + /* copy file name to process name */ + process_name = strrchr(filename, '/'); + process_name = process_name? process_name + 1: filename; + rt_strncpy(lwp->cmd, process_name, RT_NAME_MAX); + + if ((fd = open(filename, O_RDONLY)) == RT_NULL) + { + LOG_E("exec file (%s) find error!", filename); + goto out; + } + if (ioctl(fd, RT_FIOGETADDR, &lwp->text_entry) != RT_EOK) + { + LOG_E("get text addr error!", filename); + goto out; + } + lwp->text_size = lseek(fd, 0, SEEK_END); + close(fd); + + lwp->data_size = ((struct lwp_app_head*)lwp->text_entry)->ram_size; +#ifdef RT_LWP_USING_MPU + struct stat buf; + + if (stat(filename, &buf) != 0) + { + goto out; + } + if (rt_lwp_map_user(lwp, lwp->text_entry, buf.st_size, RT_MPU_ATT_READ) == RT_NULL) + { + goto out; + } + { + int i; + int argc; + char **argv; + void *new_args; + char *args_offset; + lwp->data_entry = rt_lwp_alloc_user(lwp, lwp->data_size + lwp->args_length, RT_MPU_ATT_FULL); + if (lwp->data_entry == RT_NULL) + { + rt_free(lwp->args); + rt_lwp_umap_user(lwp, lwp->text_entry, buf.st_size); + LOG_E("malloc for data section failed!", lwp->text_entry); + goto out; + } + + argc = *(uint32_t*)(lwp->args); + argv = (char **)(lwp->args) + 1; + new_args = (void *)((uint32_t)lwp->data_entry + lwp->data_size); + args_offset = (char *)((uint32_t)new_args - (uint32_t)lwp->args); + for (i=0; iargs, lwp->args_length); + rt_free(lwp->args); + lwp->args = new_args; + } +#else + lwp->data_entry = (void*)rt_malloc_align(lwp->data_size, 8); +#endif /* RT_LWP_USING_MPU */ + + LOG_I("lwp->text_entry = 0x%p size:%d", lwp->text_entry, buf.st_size); + LOG_I("lwp->data_entry = 0x%p size:%d", lwp->data_entry, lwp->data_size); + + ret = 0; +out: + return ret; +#endif /* RT_USING_VIRTUAL_MEMORY */ } void lwp_cleanup(struct rt_thread *tid) @@ -994,13 +1104,6 @@ void lwp_cleanup(struct rt_thread *tid) LOG_I("cleanup thread: %s, stack_addr: %08X", tid->name, tid->stack_addr); -#ifndef RT_USING_USERSPACE - if (tid->user_stack != RT_NULL) - { - rt_free(tid->user_stack); - } -#endif - level = rt_hw_interrupt_disable(); lwp = (struct rt_lwp *)tid->lwp; @@ -1054,7 +1157,11 @@ static void lwp_thread_entry(void *parameter) } #endif +#ifdef RT_USING_VIRTUAL_MEMORY lwp_user_entry(lwp->args, lwp->text_entry, (void *)USER_STACK_VEND, tid->stack_addr + tid->stack_size); +#else + lwp_user_entry(lwp->args, lwp->text_entry, lwp->data_entry, (void *)((uint32_t)lwp->data_entry + lwp->data_size)); +#endif /* RT_USING_VIRTUAL_MEMORY */ } struct rt_lwp *lwp_self(void) @@ -1104,7 +1211,7 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp) lwp_ref_dec(lwp); return -ENOMEM; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (lwp_user_space_init(lwp) != 0) { lwp_tid_put(tid); @@ -1127,24 +1234,37 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp) } result = lwp_load(filename, lwp, RT_NULL, 0, aux); +#ifdef RT_USING_VIRTUAL_MEMORY if (result == 1) { /* dynmaic */ lwp_unmap_user(lwp, (void *)(USER_VADDR_TOP - ARCH_PAGE_SIZE)); result = load_ldso(lwp, filename, argv, envp); } +#endif /* RT_USING_VIRTUAL_MEMORY */ if (result == RT_EOK) { rt_thread_t thread = RT_NULL; + rt_uint32_t priority = 25, tick = 200; lwp_copy_stdio_fdt(lwp); /* obtain the base name */ thread_name = strrchr(filename, '/'); thread_name = thread_name ? thread_name + 1 : filename; - +#ifndef RT_USING_VIRTUAL_MEMORY + struct lwp_app_head *app_head = lwp->text_entry; + if (app_head->priority) + { + priority = app_head->priority; + } + if (app_head->tick) + { + tick = app_head->tick; + } +#endif /* not defined RT_USING_VIRTUAL_MEMORY */ thread = rt_thread_create(thread_name, lwp_thread_entry, RT_NULL, - LWP_TASK_STACK_SIZE, 25, 200); + LWP_TASK_STACK_SIZE, priority, tick); if (thread != RT_NULL) { struct rt_lwp *self_lwp; @@ -1163,6 +1283,18 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp) lwp->parent = self_lwp; } thread->lwp = lwp; +#ifndef RT_USING_VIRTUAL_MEMORY + struct lwp_app_head *app_head = (struct lwp_app_head*)lwp->text_entry; + thread->user_stack = app_head->stack_offset ? + (void *)(app_head->stack_offset - + app_head->data_offset + + lwp->data_entry) : RT_NULL; + thread->user_stack_size = app_head->stack_size; + /* init data area */ + rt_memset(lwp->data_entry, 0, lwp->data_size); + /* init user stack */ + rt_memset(thread->user_stack, '#', thread->user_stack_size); +#endif /* not defined RT_USING_VIRTUAL_MEMORY */ rt_list_insert_after(&lwp->t_grp, &thread->sibling); #ifdef RT_USING_GDBSERVER @@ -1201,6 +1333,7 @@ pid_t exec(char *filename, int argc, char **argv) } #endif +#ifdef RT_USING_VIRTUAL_MEMORY void lwp_user_setting_save(rt_thread_t thread) { if (thread) @@ -1240,3 +1373,4 @@ void lwp_user_setting_restore(rt_thread_t thread) } #endif } +#endif /* RT_USING_VIRTUAL_MEMORY */ diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h index cf31ee1767..b42c62ce53 100644 --- a/components/lwp/lwp.h +++ b/components/lwp/lwp.h @@ -27,16 +27,19 @@ #include "lwp_ipc.h" #include "lwp_signal.h" #include "lwp_syscall.h" +#include "lwp_avl.h" +#include "lwp_arch.h" -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include "lwp_shm.h" #include "mmu.h" #include "page.h" -#include "lwp_arch.h" #endif +#ifdef RT_USING_MUSL #include +#endif #ifdef __cplusplus extern "C" { @@ -49,11 +52,13 @@ extern "C" { #define LWP_ARG_MAX 8 +#ifdef RT_USING_MUSL typedef int32_t pid_t; +#endif /* RT_USING_MUSL */ struct rt_lwp { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY rt_mmu_info mmu_info; struct lwp_avl_struct *map_area; size_t end_heap; @@ -74,12 +79,10 @@ struct rt_lwp uint32_t text_size; void *data_entry; uint32_t data_size; -#ifndef RT_USING_USERSPACE - size_t load_off; -#endif int ref; void *args; + uint32_t args_length; pid_t pid; rt_list_t t_grp; struct dfs_fdtable fdt; @@ -92,6 +95,12 @@ struct rt_lwp rt_uint32_t signal_in_process; lwp_sighandler_t signal_handler[_LWP_NSIG]; +#ifndef RT_USING_VIRTUAL_MEMORY +#ifdef RT_LWP_USING_MPU + struct rt_mpu_info mpu_info; +#endif +#endif /* RT_USING_VIRTUAL_MEMORY */ + struct lwp_avl_struct *object_root; struct rt_mutex object_mutex; struct rt_user_context user_ctx; @@ -132,13 +141,13 @@ void lwp_tid_set_thread(int tid, rt_thread_t thread); size_t lwp_user_strlen(const char *s, int *err); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void lwp_mmu_switch(struct rt_thread *thread); #endif void lwp_user_setting_save(rt_thread_t thread); void lwp_user_setting_restore(rt_thread_t thread); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY struct __pthread { /* Part 1 -- these fields may be external or * * internal (accessed via asm) ABI. Do not change. */ diff --git a/components/lwp/lwp_avl.c b/components/lwp/lwp_avl.c index 08022fd45b..534622e6c5 100644 --- a/components/lwp/lwp_avl.c +++ b/components/lwp/lwp_avl.c @@ -207,3 +207,22 @@ int lwp_avl_traversal(struct lwp_avl_struct *ptree, int (*fun)(struct lwp_avl_st } return ret; } + +#ifndef RT_USING_VIRTUAL_MEMORY +struct lwp_avl_struct* lwp_map_find_first(struct lwp_avl_struct* ptree) +{ + if (ptree == AVL_EMPTY) + { + return (struct lwp_avl_struct *)0; + } + while (1) + { + if (!ptree->avl_left) + { + break; + } + ptree = ptree->avl_left; + } + return ptree; +} +#endif /* RT_USING_VIRTUAL_MEMORY */ diff --git a/components/lwp/lwp_avl.h b/components/lwp/lwp_avl.h index f8d0ee1b89..e3c99f8b6a 100644 --- a/components/lwp/lwp_avl.h +++ b/components/lwp/lwp_avl.h @@ -37,6 +37,9 @@ void lwp_avl_remove(struct lwp_avl_struct * node_to_delete, struct lwp_avl_struc void lwp_avl_insert (struct lwp_avl_struct * new_node, struct lwp_avl_struct ** ptree); struct lwp_avl_struct* lwp_avl_find(avl_key_t key, struct lwp_avl_struct* ptree); int lwp_avl_traversal(struct lwp_avl_struct* ptree, int (*fun)(struct lwp_avl_struct*, void *), void *arg); +#ifndef RT_USING_VIRTUAL_MEMORY +struct lwp_avl_struct* lwp_map_find_first(struct lwp_avl_struct* ptree); +#endif /* RT_USING_VIRTUAL_MEMORY */ #ifdef __cplusplus } diff --git a/components/lwp/lwp_futex.c b/components/lwp/lwp_futex.c index 44c798f31b..3cad49c278 100644 --- a/components/lwp/lwp_futex.c +++ b/components/lwp/lwp_futex.c @@ -10,7 +10,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #endif #include "clock_time.h" diff --git a/components/lwp/lwp_mm_area.c b/components/lwp/lwp_mm_area.c index 08ecf0684a..9ad7fffe4a 100644 --- a/components/lwp/lwp_mm_area.c +++ b/components/lwp/lwp_mm_area.c @@ -9,7 +9,7 @@ */ #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include int lwp_map_area_insert(struct lwp_avl_struct **avl_tree, size_t addr, size_t size, int ma_type) diff --git a/components/lwp/lwp_mm_area.h b/components/lwp/lwp_mm_area.h index 555a03ce48..b97446b58d 100644 --- a/components/lwp/lwp_mm_area.h +++ b/components/lwp/lwp_mm_area.h @@ -15,7 +15,7 @@ #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #ifdef __cplusplus extern "C" { diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index 811fd7861c..5ac6392d86 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -17,7 +17,7 @@ #include "lwp_pid.h" #include "lwp_console.h" -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include "lwp_user_mm.h" #ifdef RT_USING_GDBSERVER @@ -360,9 +360,12 @@ void lwp_free(struct rt_lwp* lwp) lwp->finish = 1; if (lwp->args != RT_NULL) { -#ifndef RT_USING_USERSPACE +#ifndef RT_USING_VIRTUAL_MEMORY + lwp->args_length = RT_NULL; +#ifndef RT_LWP_USING_MPU rt_free(lwp->args); -#endif +#endif /* not defined RT_LWP_USING_MPU */ +#endif /* RT_USING_VIRTUAL_MEMORY */ lwp->args = RT_NULL; } @@ -380,7 +383,16 @@ void lwp_free(struct rt_lwp* lwp) /* free data section */ if (lwp->data_entry != RT_NULL) { +#ifdef RT_USING_VIRTUAL_MEMORY rt_free_align(lwp->data_entry); +#else +#ifdef RT_LWP_USING_MPU + rt_lwp_umap_user(lwp, lwp->text_entry, 0); + rt_lwp_free_user(lwp, lwp->data_entry, lwp->data_size); +#else + rt_free_align(lwp->data_entry); +#endif /* RT_LWP_USING_MPU */ +#endif /* RT_USING_VIRTUAL_MEMORY */ lwp->data_entry = RT_NULL; } @@ -390,18 +402,14 @@ void lwp_free(struct rt_lwp* lwp) if (lwp->text_entry) { LOG_D("lwp text free: %p", lwp->text_entry); -#ifndef RT_USING_USERSPACE -#ifdef RT_USING_CACHE - rt_free_align((void*)lwp->load_off); -#else - rt_free((void*)lwp->load_off); -#endif -#endif +#ifndef RT_USING_VIRTUAL_MEMORY + rt_free((void*)lwp->text_entry); +#endif /* not defined RT_USING_VIRTUAL_MEMORY */ lwp->text_entry = RT_NULL; } } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY lwp_unmap_user_space(lwp); #endif @@ -493,7 +501,13 @@ void lwp_ref_dec(struct rt_lwp *lwp) memset(&msg, 0, sizeof msg); rt_raw_channel_send(gdb_get_server_channel(), &msg); } -#endif +#endif /* RT_USING_GDBSERVER */ + +#ifndef RT_USING_VIRTUAL_MEMORY +#ifdef RT_LWP_USING_SHM + lwp_shm_lwp_free(lwp); +#endif /* RT_LWP_USING_SHM */ +#endif /* not defined RT_USING_VIRTUAL_MEMORY */ lwp_free(lwp); } } diff --git a/components/lwp/lwp_pmutex.c b/components/lwp/lwp_pmutex.c index a11b24c986..dd8cec1831 100644 --- a/components/lwp/lwp_pmutex.c +++ b/components/lwp/lwp_pmutex.c @@ -10,7 +10,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #endif #include "clock_time.h" diff --git a/components/lwp/lwp_shm.c b/components/lwp/lwp_shm.c index 5312c049ef..bb37e16002 100644 --- a/components/lwp/lwp_shm.c +++ b/components/lwp/lwp_shm.c @@ -10,7 +10,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include diff --git a/components/lwp/lwp_signal.c b/components/lwp/lwp_signal.c index 33eb0d6a77..70ca305a7f 100644 --- a/components/lwp/lwp_signal.c +++ b/components/lwp/lwp_signal.c @@ -286,6 +286,13 @@ lwp_sighandler_t lwp_sighandler_get(int sig) } level = rt_hw_interrupt_disable(); thread = rt_thread_self(); +#ifndef RT_USING_VIRTUAL_MEMORY + if (thread->signal_in_process) + { + func = thread->signal_handler[sig - 1]; + goto out; + } +#endif lwp = (struct rt_lwp*)thread->lwp; func = lwp->signal_handler[sig - 1]; @@ -324,6 +331,19 @@ void lwp_sighandler_set(int sig, lwp_sighandler_t func) rt_hw_interrupt_enable(level); } +#ifndef RT_USING_VIRTUAL_MEMORY +void lwp_thread_sighandler_set(int sig, lwp_sighandler_t func) +{ + rt_base_t level; + + if (sig == 0 || sig > _LWP_NSIG) + return; + level = rt_hw_interrupt_disable(); + rt_thread_self()->signal_handler[sig - 1] = func; + rt_hw_interrupt_enable(level); +} +#endif + int lwp_sigaction(int sig, const struct lwp_sigaction *act, struct lwp_sigaction *oact, size_t sigsetsize) { diff --git a/components/lwp/lwp_signal.h b/components/lwp/lwp_signal.h index 310e437886..06fc8037a8 100644 --- a/components/lwp/lwp_signal.h +++ b/components/lwp/lwp_signal.h @@ -22,6 +22,9 @@ int lwp_signal_backup(void *user_sp, void *user_pc, void* user_flag); struct rt_user_context *lwp_signal_restore(void); lwp_sighandler_t lwp_sighandler_get(int sig); void lwp_sighandler_set(int sig, lwp_sighandler_t func); +#ifndef RT_USING_VIRTUAL_MEMORY +void lwp_thread_sighandler_set(int sig, lwp_sighandler_t func); +#endif int lwp_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset); int lwp_sigaction(int sig, const struct lwp_sigaction *act, struct lwp_sigaction * oact, size_t sigsetsize); int lwp_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset); diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 3265940c2a..b6a919e790 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -17,7 +17,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include #endif @@ -36,7 +36,7 @@ #define SYSCALL_NET(f) ((void *)sys_notimpl) #endif -#if defined(RT_USING_DFS) && defined(RT_USING_USERSPACE) +#if defined(RT_USING_DFS) && defined(RT_USING_VIRTUAL_MEMORY) #define SYSCALL_USPACE(f) ((void *)(f)) #else #define SYSCALL_USPACE(f) ((void *)sys_notimpl) @@ -57,8 +57,6 @@ #include #include "lwp_ipc_internal.h" -#define ALLOC_KERNEL_STACK_SIZE 5120 - #define SET_ERRNO(no) rt_set_errno(-(no)) #define GET_ERRNO() ((rt_get_errno() > 0) ? (-rt_get_errno()) : rt_get_errno()) struct musl_sockaddr @@ -67,10 +65,17 @@ struct musl_sockaddr char sa_data[14]; }; -extern void lwp_user_thread_entry(void *args, const void *text, void *ustack, void *user_stack); - +int sys_dup(int oldfd); +int sys_dup2(int oldfd, int new); void lwp_cleanup(struct rt_thread *tid); -#ifdef RT_USING_USERSPACE + +#ifdef RT_USING_VIRTUAL_MEMORY +#define ALLOC_KERNEL_STACK_SIZE 5120 + +extern void lwp_user_thread_entry(void *args, const void *text, void *ustack, void *user_stack); +int sys_futex(int *uaddr, int op, int val, void *timeout, void *uaddr2, int val3); +int sys_pmutex(void *umutex, int op, void *arg); +int sys_cacheflush(void *addr, int len, int cache); static void *kmem_get(size_t size) { return rt_malloc(size); @@ -80,9 +85,14 @@ static void kmem_put(void *kptr) { rt_free(kptr); } -#endif +#else +#define ALLOC_KERNEL_STACK_SIZE 1536 +#define ALLOC_KERNEL_STACK_SIZE_MIN 1024 +#define ALLOC_KERNEL_STACK_SIZE_MAX 4096 -int sys_futex(int *uaddr, int op, int val, void *timeout, void *uaddr2, int val3); +extern void lwp_user_entry(void *args, const void *text, void *data, void *user_stack); +extern void set_user_context(void *stack); +#endif /* RT_USING_VIRTUAL_MEMORY */ /* The same socket option is defined differently in the user interfaces and the * implementation. The options should be converted in the kernel. */ @@ -352,7 +362,12 @@ static void lwp_user_thread(void *parameter) user_stack = (rt_size_t)tid->user_stack + tid->user_stack_size; user_stack &= ~7; //align 8 +#ifdef RT_USING_VIRTUAL_MEMORY lwp_user_thread_entry(parameter, tid->user_entry, (void *)user_stack, tid->stack_addr + tid->stack_size); +#else + set_user_context((void*)user_stack); + lwp_user_entry(parameter, tid->user_entry, ((struct rt_lwp *)tid->lwp)->data_entry, (void*)user_stack); +#endif /* RT_USING_VIRTUAL_MEMORY */ } /* thread/process */ @@ -368,6 +383,7 @@ void sys_exit(int value) lwp = (struct rt_lwp *)tid->lwp; level = rt_hw_interrupt_disable(); +#ifdef RT_USING_VIRTUAL_MEMORY if (tid->clear_child_tid) { int t = 0; @@ -377,11 +393,25 @@ void sys_exit(int value) lwp_put_to_user(clear_child_tid, &t, sizeof t); sys_futex(tid->clear_child_tid, FUTEX_WAKE, 1, RT_NULL, RT_NULL, 0); } +#endif /* RT_USING_VIRTUAL_MEMORY */ main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling); if (main_thread == tid) { lwp_terminate(lwp); +#ifdef RT_USING_VIRTUAL_MEMORY lwp_wait_subthread_exit(); +#else + rt_thread_t sub_thread; + rt_list_t *list; + + /* delete all subthread */ + while ((list = tid->sibling.prev) != &lwp->t_grp) + { + sub_thread = rt_list_entry(list, struct rt_thread, sibling); + rt_list_remove(&sub_thread->sibling); + rt_thread_delete(sub_thread); + } +#endif /* RT_USING_VIRTUAL_MEMORY */ lwp->lwp_ret = value; } @@ -401,7 +431,7 @@ void sys_exit_group(int status) /* syscall: "read" ret: "ssize_t" args: "int" "void *" "size_t" */ ssize_t sys_read(int fd, void *buf, size_t nbyte) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *kmem = RT_NULL; ssize_t ret = -1; @@ -430,6 +460,10 @@ ssize_t sys_read(int fd, void *buf, size_t nbyte) kmem_put(kmem); return (ret < 0 ? GET_ERRNO() : ret); #else + if (!lwp_user_accessable((void *)buf, nbyte)) + { + return -EFAULT; + } ssize_t ret = read(fd, buf, nbyte); return (ret < 0 ? GET_ERRNO() : ret); #endif @@ -438,7 +472,7 @@ ssize_t sys_read(int fd, void *buf, size_t nbyte) /* syscall: "write" ret: "ssize_t" args: "int" "const void *" "size_t" */ ssize_t sys_write(int fd, const void *buf, size_t nbyte) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *kmem = RT_NULL; ssize_t ret = -1; @@ -464,6 +498,10 @@ ssize_t sys_write(int fd, const void *buf, size_t nbyte) kmem_put(kmem); return (ret < 0 ? GET_ERRNO() : ret); #else + if (!lwp_user_accessable((void *)buf, nbyte)) + { + return -EFAULT; + } ssize_t ret = write(fd, buf, nbyte); return (ret < 0 ? GET_ERRNO() : ret); #endif @@ -479,7 +517,7 @@ off_t sys_lseek(int fd, off_t offset, int whence) /* syscall: "open" ret: "int" args: "const char *" "int" "..." */ int sys_open(const char *name, int flag, ...) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY int ret = -1; rt_size_t len = 0; char *kname = RT_NULL; @@ -507,6 +545,10 @@ int sys_open(const char *name, int flag, ...) kmem_put(kname); return (ret < 0 ? GET_ERRNO() : ret); #else + if (!lwp_user_accessable((void *)name, 1)) + { + return -EFAULT; + } int ret = open(name, flag, 0); return (ret < 0 ? GET_ERRNO() : ret); #endif @@ -528,7 +570,7 @@ int sys_ioctl(int fd, unsigned long cmd, void* data) int sys_fstat(int file, struct stat *buf) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY int ret = -1; struct stat statbuff; @@ -551,11 +593,15 @@ int sys_fstat(int file, struct stat *buf) return (ret < 0 ? GET_ERRNO() : ret); } #else + if (!lwp_user_accessable((void *)buf, sizeof(struct stat))) + { + return -EFAULT; + } int ret = fstat(file, buf); return (ret < 0 ? GET_ERRNO() : ret); #endif } - +#ifdef RT_USING_VIRTUAL_MEMORY /* DFS and lwip definitions */ #define IMPL_POLLIN (0x01) @@ -647,12 +693,13 @@ static void dfs2musl_events(short *events) *events = result_e; } +#endif /* RT_USING_VIRTUAL_MEMORY */ int sys_poll(struct pollfd *fds, nfds_t nfds, int timeout) { int ret = -1; +#ifdef RT_USING_VIRTUAL_MEMORY int i = 0; -#ifdef RT_USING_USERSPACE struct pollfd *kfds = RT_NULL; if (!lwp_user_accessable((void *)fds, nfds * sizeof *fds)) @@ -683,29 +730,20 @@ int sys_poll(struct pollfd *fds, nfds_t nfds, int timeout) } kmem_put(kfds); - return ret; #else - for (i = 0; i < nfds; i++) + if (!lwp_user_accessable((void *)fds, nfds * sizeof *fds)) { - musl2dfs_events(&fds->events); + return -EFAULT; } ret = poll(fds, nfds, timeout); - if (ret > 0) - { - for (i = 0; i < nfds; i++) - { - dfs2musl_events(&fds->revents); - } - } - +#endif /* RT_USING_VIRTUAL_MEMORY */ return ret; -#endif } int sys_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { -#ifdef RT_USING_USERSPACE int ret = -1; +#ifdef RT_USING_VIRTUAL_MEMORY fd_set *kreadfds = RT_NULL, *kwritefds = RT_NULL, *kexceptfds = RT_NULL; if (readfds) @@ -782,7 +820,18 @@ quit: } return (ret < 0 ? GET_ERRNO() : ret); #else - int ret; + if (!lwp_user_accessable((void *)readfds, sizeof *readfds)) + { + return -EFAULT; + } + if (!lwp_user_accessable((void *)writefds, sizeof *writefds)) + { + return -EFAULT; + } + if (!lwp_user_accessable((void *)exceptfds, sizeof *exceptfds)) + { + return -EFAULT; + } ret = select(nfds, readfds, writefds, exceptfds, timeout); return (ret < 0 ? GET_ERRNO() : ret); #endif @@ -790,7 +839,7 @@ quit: int sys_unlink(const char *pathname) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY int ret = -1; rt_size_t len = 0; char *kname = RT_NULL; @@ -830,7 +879,7 @@ int sys_unlink(const char *pathname) int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp) { rt_tick_t tick; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY struct timespec rqtp_k; struct timespec rmtp_k; @@ -863,11 +912,21 @@ int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp) #else dbg_log(DBG_LOG, "sys_nanosleep\n"); + if (!lwp_user_accessable((void *)rqtp, sizeof *rqtp)) + { + return -EFAULT; + } + tick = rqtp->tv_sec * RT_TICK_PER_SECOND + ((uint64_t)rqtp->tv_nsec * RT_TICK_PER_SECOND) / 1000000000; rt_thread_delay(tick); if (rmtp) { + if (!lwp_user_accessable((void *)rmtp, sizeof *rmtp)) + { + return -EFAULT; + } + tick = rt_tick_get() - tick; /* get the passed time */ rmtp->tv_sec = tick / RT_TICK_PER_SECOND; @@ -881,9 +940,9 @@ int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp) /* syscall: "gettimeofday" ret: "int" args: "struct timeval *" "struct timezone *" */ int sys_gettimeofday(struct timeval *tp, struct timezone *tzp) { +#ifdef RT_USING_VIRTUAL_MEMORY struct timeval t_k; -#ifdef RT_USING_USERSPACE if (tp) { if (!lwp_user_accessable((void *)tp, sizeof *tp)) @@ -899,6 +958,10 @@ int sys_gettimeofday(struct timeval *tp, struct timezone *tzp) #else if (tp) { + if (!lwp_user_accessable((void *)tp, sizeof *tp)) + { + return -EFAULT; + } tp->tv_sec = rt_tick_get() / RT_TICK_PER_SECOND; tp->tv_usec = (rt_tick_get() % RT_TICK_PER_SECOND) * (1000000 / RT_TICK_PER_SECOND); } @@ -1026,7 +1089,7 @@ rt_err_t sys_mutex_release(rt_mutex_t mutex) return rt_mutex_release(mutex); } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY /* memory allocation */ extern rt_base_t lwp_brk(void *addr); rt_base_t sys_brk(void *addr) @@ -1076,6 +1139,10 @@ rt_err_t sys_event_recv(rt_event_t event, rt_int32_t timeout, rt_uint32_t *recved) { + if (!lwp_user_accessable((void *)recved, sizeof(rt_uint32_t *))) + { + return -EFAULT; + } return rt_event_recv(event, set, opt, timeout, recved); } @@ -1109,6 +1176,10 @@ rt_err_t sys_mb_send_wait(rt_mailbox_t mb, rt_err_t sys_mb_recv(rt_mailbox_t mb, rt_uint32_t *value, rt_int32_t timeout) { + if (!lwp_user_accessable((void *)value, sizeof(rt_uint32_t *))) + { + return -EFAULT; + } return rt_mb_recv(mb, (rt_ubase_t *)value, timeout); } @@ -1133,11 +1204,19 @@ rt_err_t sys_mq_delete(rt_mq_t mq) rt_err_t sys_mq_send(rt_mq_t mq, void *buffer, rt_size_t size) { + if (!lwp_user_accessable((void *)buffer, size)) + { + return -EFAULT; + } return rt_mq_send(mq, buffer, size); } rt_err_t sys_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size) { + if (!lwp_user_accessable((void *)buffer, size)) + { + return -EFAULT; + } return rt_mq_urgent(mq, buffer, size); } @@ -1146,6 +1225,10 @@ rt_err_t sys_mq_recv(rt_mq_t mq, rt_size_t size, rt_int32_t timeout) { + if (!lwp_user_accessable((void *)buffer, size)) + { + return -EFAULT; + } return rt_mq_recv(mq, buffer, size, timeout); } @@ -1199,11 +1282,9 @@ rt_thread_t sys_thread_create(void *arg[]) lwp = rt_thread_self()->lwp; lwp_ref_inc(lwp); -#ifdef RT_USING_USERSPACE + +#ifdef RT_USING_VIRTUAL_MEMORY user_stack = lwp_map_user(lwp, 0, (size_t)arg[3], 0); -#else - user_stack = (void *)RT_KERNEL_MALLOC((uint32_t)arg[3]); -#endif if (!user_stack) { goto fail; @@ -1227,6 +1308,41 @@ rt_thread_t sys_thread_create(void *arg[]) thread->user_entry = (void (*)(void *))arg[1]; thread->user_stack = (void *)user_stack; thread->user_stack_size = (rt_size_t)arg[3]; +#else + rt_uint32_t kstack_size = (rt_uint32_t)arg[7]; + if (kstack_size < ALLOC_KERNEL_STACK_SIZE_MIN) + { + /* When kstack size is 0, the default size of the kernel stack is used */ + kstack_size = kstack_size ? ALLOC_KERNEL_STACK_SIZE_MIN : ALLOC_KERNEL_STACK_SIZE; + } + else if (kstack_size > ALLOC_KERNEL_STACK_SIZE_MAX) + { + kstack_size = ALLOC_KERNEL_STACK_SIZE_MAX; + } + + user_stack = (void *)arg[3]; + if ((!user_stack) || ((rt_uint32_t)arg[6] == RT_NULL)) + { + goto fail; + } + + if ((tid = lwp_tid_get()) == 0) + { + goto fail; + } + + thread = rt_thread_create((const char *)arg[0], lwp_user_thread, (void *)arg[2], kstack_size, (rt_uint8_t)(size_t)arg[5], (rt_uint32_t)arg[6]); + if (!thread) + { + goto fail; + } + thread->cleanup = lwp_cleanup; + thread->user_entry = (void (*)(void *))arg[1]; + thread->user_stack = (void *)user_stack; + thread->user_stack_size = (uint32_t)arg[4]; + rt_memset(thread->user_stack, '#', thread->user_stack_size); +#endif /* RT_USING_VIRTUAL_MEMORY */ + thread->lwp = (void*)lwp; thread->tid = tid; lwp_tid_set_thread(tid, thread); @@ -1239,19 +1355,13 @@ rt_thread_t sys_thread_create(void *arg[]) fail: lwp_tid_put(tid); -#ifndef RT_USING_USERSPACE - if (user_stack) - { - RT_KERNEL_FREE(user_stack); - } -#endif if (lwp) { lwp_ref_dec(lwp); } return RT_NULL; } - +#ifdef RT_USING_VIRTUAL_MEMORY #define CLONE_VM 0x00000100 #define CLONE_FS 0x00000200 #define CLONE_FILES 0x00000400 @@ -1410,7 +1520,7 @@ static int _copy_process(struct rt_lwp *dest_lwp, struct rt_lwp *src_lwp) static void lwp_struct_copy(struct rt_lwp *dst, struct rt_lwp *src) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY dst->end_heap = src->end_heap; #endif dst->lwp_type = src->lwp_type; @@ -2161,7 +2271,7 @@ int sys_execve(const char *path, char *const argv[], char *const envp[]) rt_pages_free(page, 0); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY _swap_lwp_data(lwp, new_lwp, rt_mmu_info, mmu_info); _swap_lwp_data(lwp, new_lwp, struct lwp_avl_struct *, map_area); _swap_lwp_data(lwp, new_lwp, size_t, end_heap); @@ -2205,10 +2315,31 @@ quit: } return (ret < 0 ? GET_ERRNO() : ret); } +#endif /* RT_USING_VIRTUAL_MEMORY */ rt_err_t sys_thread_delete(rt_thread_t thread) { +#ifdef RT_USING_VIRTUAL_MEMORY return rt_thread_delete(thread); +#else + rt_err_t ret = 0; + + if(thread->type != RT_Object_Class_Thread) + { + ret = -EINVAL; + goto __exit; + } + + ret = rt_thread_delete(thread); + + if (rt_thread_self() == thread) + { + rt_schedule(); + } + +__exit: + return ret; +#endif } rt_err_t sys_thread_startup(rt_thread_t thread) @@ -2326,7 +2457,7 @@ void sys_hw_interrupt_enable(uint32_t level) rt_hw_interrupt_enable(level); } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY int sys_shmget(size_t key, size_t size, int create) { return lwp_shmget(key, size, create); @@ -2346,6 +2477,34 @@ int sys_shmdt(void* shm_vaddr) { return lwp_shmdt(shm_vaddr); } +#elif defined RT_LWP_USING_SHM +void *sys_shm_alloc(int size) +{ + if (size < 0) + { + return RT_NULL; + } + return lwp_shm_alloc((rt_size_t)size); +} + +void *sys_shm_retain(void *mem) +{ + if (!lwp_user_accessable(mem, sizeof (void *))) + { + return RT_NULL; + } + return lwp_shm_retain(mem); +} + +int sys_shm_free(void *mem) +{ + if (!lwp_user_accessable(mem, sizeof (void *))) + { + return -EFAULT; + } + lwp_shm_free(mem); + return 0; +} #endif /* device interfaces */ @@ -2619,13 +2778,13 @@ int sys_recvfrom(int socket, void *mem, size_t len, int flags, struct musl_sockaddr *from, socklen_t *fromlen) { int flgs = 0; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY int ret = -1; void *kmem = RT_NULL; #endif flgs = netflags_muslc_2_lwip(flags); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (!len) { return -EINVAL; @@ -2697,13 +2856,13 @@ int sys_sendto(int socket, const void *dataptr, size_t size, int flags, const struct musl_sockaddr *to, socklen_t tolen) { int flgs = 0; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY int ret = -1; void *kmem = RT_NULL; #endif flgs = netflags_muslc_2_lwip(flags); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (!size) { return -EINVAL; @@ -2866,6 +3025,7 @@ int sys_sigaction(int sig, const struct k_sigaction *act, } ret = lwp_sigaction(sig, pkact, pkoact, sigsetsize); +#ifdef RT_USING_VIRTUAL_MEMORY if (ret == 0 && oact) { lwp_put_to_user(&oact->handler, &pkoact->__sa_handler._sa_handler, sizeof(void (*)(int))); @@ -2873,6 +3033,7 @@ int sys_sigaction(int sig, const struct k_sigaction *act, lwp_put_to_user(&oact->flags, &pkoact->sa_flags, sizeof(int)); lwp_put_to_user(&oact->restorer, &pkoact->sa_restorer, sizeof(void (*)(void))); } +#endif /* RT_USING_VIRTUAL_MEMORY */ out: return (ret < 0 ? GET_ERRNO() : ret); } @@ -2880,8 +3041,10 @@ out: int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size) { int ret = -1; - lwp_sigset_t newset, *pnewset = RT_NULL; - lwp_sigset_t oldset, *poldset = RT_NULL; + lwp_sigset_t *pnewset = RT_NULL, *poldset = RT_NULL; +#ifdef RT_USING_VIRTUAL_MEMORY + lwp_sigset_t newset, oldset; +#endif /* RT_USING_VIRTUAL_MEMORY*/ if (!size) { @@ -2897,22 +3060,39 @@ int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size } if (oset) { +#ifdef RT_USING_VIRTUAL_MEMORY if (!lwp_user_accessable((void *)oset, size)) { return -EFAULT; } poldset = &oldset; +#else + if (!lwp_user_accessable((void *)oset, size)) + { + return -EFAULT; + } + poldset = (lwp_sigset_t *)oset; +#endif } if (sigset) { +#ifdef RT_USING_VIRTUAL_MEMORY if (!lwp_user_accessable((void *)sigset, size)) { return -EFAULT; } lwp_get_from_user(&newset, (void *)sigset, size); pnewset = &newset; +#else + if (!lwp_user_accessable((void *)sigset, size)) + { + return -EFAULT; + } + pnewset = (lwp_sigset_t *)sigset; +#endif /* RT_USING_VIRTUAL_MEMORY */ } ret = lwp_sigprocmask(how, pnewset, poldset); +#ifdef RT_USING_VIRTUAL_MEMORY if (ret < 0) { return ret; @@ -2921,11 +3101,13 @@ int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size { lwp_put_to_user(oset, poldset, size); } +#endif /* RT_USING_VIRTUAL_MEMORY */ return (ret < 0 ? -EFAULT: ret); } int sys_tkill(int tid, int sig) { +#ifdef RT_USING_VIRTUAL_MEMORY rt_base_t level; rt_thread_t thread; int ret; @@ -2935,13 +3117,18 @@ int sys_tkill(int tid, int sig) ret = lwp_thread_kill(thread, sig); rt_hw_interrupt_enable(level); return ret; +#else + return lwp_thread_kill((rt_thread_t)tid, sig); +#endif } int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset, size_t size) { int ret = -1; - lwp_sigset_t newset, *pnewset = RT_NULL; - lwp_sigset_t oldset, *poldset = RT_NULL; + lwp_sigset_t *pnewset = RT_NULL, *poldset = RT_NULL; +#ifdef RT_USING_VIRTUAL_MEMORY + lwp_sigset_t newset, oldset; +#endif /* RT_USING_VIRTUAL_MEMORY */ if (!size) { @@ -2957,19 +3144,23 @@ int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *os } if (oset) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (!lwp_user_accessable((void *)oset, size)) { return -EFAULT; } poldset = &oldset; #else + if (!lwp_user_accessable((void *)oset, size)) + { + return -EFAULT; + } poldset = oset; #endif } if (sigset) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (!lwp_user_accessable((void *)sigset, size)) { return -EFAULT; @@ -2977,7 +3168,11 @@ int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *os lwp_get_from_user(&newset, (void *)sigset, sizeof(lwp_sigset_t)); pnewset = &newset; #else - pnewset = sigset; + if (!lwp_user_accessable((void *)sigset, size)) + { + return -EFAULT; + } + pnewset = (lwp_sigset_t *)sigset; #endif } ret = lwp_thread_sigprocmask(how, pnewset, poldset); @@ -2985,7 +3180,7 @@ int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *os { return ret; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (oset) { lwp_put_to_user(oset, poldset, sizeof(lwp_sigset_t)); @@ -2994,20 +3189,47 @@ int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *os return (ret < 0 ? -EFAULT: ret); } +#ifndef RT_USING_VIRTUAL_MEMORY +int sys_lwp_sighandler_set(int sig, lwp_sighandler_t func) +{ + if (!lwp_user_accessable((void *)func, sizeof(lwp_sighandler_t))) + { + return -EFAULT; + } + + lwp_sighandler_set(sig, func); + return 0; +} + +int sys_thread_sighandler_set(int sig, lwp_sighandler_t func) +{ + if (!lwp_user_accessable((void *)func, sizeof(lwp_sighandler_t))) + { + return -EFAULT; + } + + lwp_thread_sighandler_set(sig, func); + return 0; +} +#endif /* not defined RT_USING_VIRTUAL_MEMORY */ + int32_t sys_waitpid(int32_t pid, int *status, int options) { int ret = -1; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (!lwp_user_accessable((void *)status, sizeof(int))) { return -EFAULT; - ret = -1; } else { ret = waitpid(pid, status, options); } #else + if (!lwp_user_accessable((void *)status, sizeof(int))) + { + return -EFAULT; + } ret = waitpid(pid, status, options); #endif return ret; @@ -3038,11 +3260,11 @@ int sys_getaddrinfo(const char *nodename, char *k_nodename = NULL; char *k_servname = NULL; struct addrinfo *k_hints = NULL; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY int err; #endif -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (!lwp_user_accessable((void *)res, sizeof(*res))) { SET_ERRNO(EFAULT); @@ -3051,7 +3273,7 @@ int sys_getaddrinfo(const char *nodename, #endif if (nodename) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY lwp_user_strlen(nodename, &err); if (err) { @@ -3068,7 +3290,7 @@ int sys_getaddrinfo(const char *nodename, } if (servname) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY lwp_user_strlen(servname, &err); if (err) { @@ -3086,7 +3308,7 @@ int sys_getaddrinfo(const char *nodename, if (hints) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (!lwp_user_accessable((void *)hints, sizeof(*hints))) { SET_ERRNO(EFAULT); @@ -3161,7 +3383,7 @@ int sys_gethostbyname2_r(const char *name, int af, struct hostent *ret, char *k_name = NULL; int a_err = 0; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (!lwp_user_accessable((void *)err, sizeof(*err))) { SET_ERRNO(EFAULT); @@ -3259,12 +3481,11 @@ __exit: char *sys_getcwd(char *buf, size_t size) { -#ifdef RT_USING_USERSPACE if (!lwp_user_accessable((void *)buf, size)) { return RT_NULL; } -#endif + getcwd(buf, size); return (char *)strlen(buf); @@ -3272,7 +3493,7 @@ char *sys_getcwd(char *buf, size_t size) int sys_chdir(const char *path) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY int err = 0; lwp_user_strlen(path, &err); @@ -3290,7 +3511,7 @@ int sys_chdir(const char *path) int sys_mkdir(const char *path, mode_t mode) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY int err = 0; lwp_user_strlen(path, &err); @@ -3308,7 +3529,7 @@ int sys_mkdir(const char *path, mode_t mode) int sys_rmdir(const char *path) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY int err = 0; lwp_user_strlen(path, &err); @@ -3324,7 +3545,9 @@ int sys_rmdir(const char *path) #endif } +#ifdef RT_USING_MUSL typedef uint64_t ino_t; +#endif struct libc_dirent { ino_t d_ino; off_t d_off; @@ -3340,12 +3563,10 @@ int sys_getdents(int fd, struct libc_dirent *dirp, size_t nbytes) size_t rtt_nbytes = 0; struct dirent *rtt_dirp; -#ifdef RT_USING_USERSPACE if (!lwp_user_accessable((void *)dirp, sizeof(struct libc_dirent))) { return -EFAULT; } -#endif if (cnt == 0) { @@ -3381,7 +3602,7 @@ rt_err_t sys_get_errno(void) { return rt_get_errno(); } - +#ifdef RT_USING_VIRTUAL_MEMORY int sys_set_thread_area(void *p) { rt_thread_t thread; @@ -3397,16 +3618,16 @@ int sys_set_tid_address(int *tidptr) { rt_thread_t thread; -#ifdef RT_USING_USERSPACE if (!lwp_user_accessable((void *)tidptr, sizeof(int))) { return -EFAULT; } -#endif + thread = rt_thread_self(); thread->clear_child_tid = tidptr; return thread->tid; } +#endif /* RT_USING_VIRTUAL_MEMORY */ int sys_gettid(void) { @@ -3416,7 +3637,7 @@ int sys_gettid(void) int sys_access(const char *filename, int mode) { int ret = 0; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY rt_size_t len = 0; char *kname = RT_NULL; int a_err = 0; @@ -3474,7 +3695,7 @@ int sys_clock_settime(clockid_t clk, const struct timespec *ts) return -ENODEV; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY size_t size = sizeof(struct timespec); struct timespec *kts = NULL; @@ -3494,6 +3715,10 @@ int sys_clock_settime(clockid_t clk, const struct timespec *ts) kmem_put(kts); #else + if (!lwp_user_accessable((void *)ts, sizeof(struct timespec))) + { + return -EFAULT; + } now = ts->tv_sec; #endif return rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now); @@ -3512,7 +3737,7 @@ int sys_clock_gettime(clockid_t clk, struct timespec *ts) } ret = rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &now); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY size_t size = sizeof(struct timespec); struct timespec *kts = NULL; @@ -3533,6 +3758,10 @@ int sys_clock_gettime(clockid_t clk, struct timespec *ts) kmem_put(kts); #else + if (!lwp_user_accessable((void *)ts, sizeof(struct timespec))) + { + return -EFAULT; + } ts->tv_sec = now; ts->tv_nsec = 0; #endif @@ -3541,7 +3770,7 @@ int sys_clock_gettime(clockid_t clk, struct timespec *ts) int sys_clock_getres(clockid_t clk, struct timespec *ts) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY struct timespec kts; size_t size = sizeof(struct timespec); @@ -3554,22 +3783,21 @@ int sys_clock_getres(clockid_t clk, struct timespec *ts) kts.tv_nsec = 0; lwp_put_to_user(ts, &kts, size); #else + if (!lwp_user_accessable((void *)ts, sizeof(struct timespec))) + { + return -EFAULT; + } + ts->tv_sec = 1; ts->tv_nsec = 0; #endif return 0; } -int sys_futex(int *uaddr, int op, int val, void *timeout, void *uaddr2, int val3); -int sys_pmutex(void *umutex, int op, void *arg); - -int sys_dup(int oldfd); -int sys_dup2(int oldfd, int new); - int sys_rename(const char *oldpath, const char *newpath) { int ret = -1; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY int err; lwp_user_strlen(oldpath, &err); @@ -3647,8 +3875,6 @@ int sys_setrlimit(unsigned int resource, struct rlimit *rlim) return -ENOSYS; } -int sys_cacheflush(void *addr, int len, int cache); - const static void* func_table[] = { (void *)sys_exit, /* 01 */ @@ -3706,12 +3932,19 @@ const static void* func_table[] = SYSCALL_USPACE(sys_brk), SYSCALL_USPACE(sys_mmap2), SYSCALL_USPACE(sys_munmap), - +#ifdef RT_USING_VIRTUAL_MEMORY SYSCALL_USPACE(sys_shmget), /* 55 */ SYSCALL_USPACE(sys_shmrm), SYSCALL_USPACE(sys_shmat), SYSCALL_USPACE(sys_shmdt), - +#else +#ifdef RT_LWP_USING_SHM + (void *)sys_shm_alloc, /* 55 */ + (void *)sys_shm_free, + (void *)sys_shm_retain, + (void *)sys_notimpl, +#endif /* RT_LWP_USING_SHM */ +#endif /* RT_USING_VIRTUAL_MEMORY */ (void *)sys_device_init, (void *)sys_device_register, /* 60 */ (void *)sys_device_control, @@ -3772,9 +4005,15 @@ const static void* func_table[] = (void *)sys_sigprocmask, (void *)sys_tkill, /* 105 */ (void *)sys_thread_sigprocmask, +#ifdef RT_USING_VIRTUAL_MEMORY (void *)sys_cacheflush, (void *)sys_notimpl, (void *)sys_notimpl, +#else + (void *)sys_notimpl, + (void *)sys_lwp_sighandler_set, + (void *)sys_thread_sighandler_set, +#endif (void *)sys_waitpid, /* 110 */ (void *)sys_timer_create, @@ -3789,22 +4028,27 @@ const static void* func_table[] = (void *)sys_rmdir, /* 120 */ (void *)sys_getdents, (void *)sys_get_errno, +#ifdef RT_USING_VIRTUAL_MEMORY (void *)sys_set_thread_area, (void *)sys_set_tid_address, +#else + (void *)sys_notimpl, + (void *)sys_notimpl, +#endif (void *)sys_access, /* 125 */ (void *)sys_pipe, (void *)sys_clock_settime, (void *)sys_clock_gettime, (void *)sys_clock_getres, - (void *)sys_clone, /* 130 */ - (void *)sys_futex, - (void *)sys_pmutex, + SYSCALL_USPACE(sys_clone), /* 130 */ + SYSCALL_USPACE(sys_futex), + SYSCALL_USPACE(sys_pmutex), (void *)sys_dup, (void *)sys_dup2, (void *)sys_rename, /* 135 */ - (void *)sys_fork, - (void *)sys_execve, - (void *)sys_vfork, + SYSCALL_USPACE(sys_fork), + SYSCALL_USPACE(sys_execve), + SYSCALL_USPACE(sys_vfork), (void *)sys_gettid, (void *)sys_prlimit64, /* 140 */ (void *)sys_getrlimit, diff --git a/components/lwp/lwp_tid.c b/components/lwp/lwp_tid.c index 3caa9207d5..004b445386 100644 --- a/components/lwp/lwp_tid.c +++ b/components/lwp/lwp_tid.c @@ -13,7 +13,7 @@ #include "lwp.h" -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include "lwp_user_mm.h" #ifdef RT_USING_GDBSERVER diff --git a/components/lwp/lwp_user_mm.c b/components/lwp/lwp_user_mm.c index c71f16a9c3..8e5f5bcf57 100644 --- a/components/lwp/lwp_user_mm.c +++ b/components/lwp/lwp_user_mm.c @@ -15,7 +15,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include diff --git a/components/lwp/lwp_user_mm.h b/components/lwp/lwp_user_mm.h index 07cb27e722..3f9f7f5065 100644 --- a/components/lwp/lwp_user_mm.h +++ b/components/lwp/lwp_user_mm.h @@ -14,7 +14,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include diff --git a/include/rtdef.h b/include/rtdef.h index 260bb45b7b..d895fcc4fb 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -737,11 +737,14 @@ struct rt_thread lwp_sigset_t signal_mask; int signal_mask_bak; rt_uint32_t signal_in_process; +#ifndef RT_USING_VIRTUAL_MEMORY + lwp_sighandler_t signal_handler[32]; +#endif struct rt_user_context user_ctx; struct rt_wakeup wakeup; /**< wakeup data */ int exit_request; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #ifdef RT_USING_GDBSERVER int step_exec; int debug_attach_req; diff --git a/libcpu/Kconfig b/libcpu/Kconfig index 1557401cb1..568ea21fb6 100644 --- a/libcpu/Kconfig +++ b/libcpu/Kconfig @@ -55,20 +55,20 @@ config ARCH_ARM_MMU select RT_USING_CACHE depends on ARCH_ARM -config RT_USING_USERSPACE - bool "Isolated user space" +config RT_USING_VIRTUAL_MEMORY + bool "Enable virtual memory unit" default n depends on ARCH_ARM_MMU config KERNEL_VADDR_START hex "The virtural address of kernel start" default 0xc0000000 - depends on RT_USING_USERSPACE + depends on RT_USING_VIRTUAL_MEMORY config PV_OFFSET hex "The offset of kernel physical address and virtural address" default 0 - depends on RT_USING_USERSPACE + depends on RT_USING_VIRTUAL_MEMORY config RT_IOREMAP_LATE bool "Support to create IO mapping in the kernel address space after system initlalization." diff --git a/libcpu/aarch64/common/interrupt.c b/libcpu/aarch64/common/interrupt.c index 71f48db366..46968cbe7e 100644 --- a/libcpu/aarch64/common/interrupt.c +++ b/libcpu/aarch64/common/interrupt.c @@ -94,7 +94,7 @@ void rt_hw_interrupt_init(void) rt_memset(isr_table, 0x00, sizeof(isr_table)); /* initialize ARM GIC */ -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY gic_dist_base = (rt_uint64_t)rt_hw_mmu_map(&mmu_info, 0, (void*)platform_get_gic_dist_base(), 0x2000, MMU_MAP_K_DEVICE); gic_cpu_base = (rt_uint64_t)rt_hw_mmu_map(&mmu_info, 0, (void*)platform_get_gic_cpu_base(), 0x1000, MMU_MAP_K_DEVICE); #else diff --git a/libcpu/aarch64/common/mmu.c b/libcpu/aarch64/common/mmu.c index 8ba903d526..5c30f4c65e 100644 --- a/libcpu/aarch64/common/mmu.c +++ b/libcpu/aarch64/common/mmu.c @@ -15,7 +15,7 @@ #include "cp15.h" #include "mmu.h" -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include "page.h" #endif @@ -548,7 +548,7 @@ static size_t find_vaddr(rt_mmu_info *mmu_info, int pages) return 0; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY static int check_vaddr(rt_mmu_info *mmu_info, void *va, int pages) { size_t loop_va; @@ -627,7 +627,7 @@ static void rt_hw_cpu_tlb_invalidate(void) __asm__ volatile("tlbi vmalle1\n dsb sy\n isb sy\n"); } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *_rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr) { size_t pa_s, pa_e; @@ -698,7 +698,7 @@ void *_rt_hw_mmu_map(rt_mmu_info *mmu_info, void* p_addr, size_t size, size_t at } #endif -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY static int __rt_hw_mmu_map_auto(rt_mmu_info *mmu_info, void* v_addr, size_t npages, size_t attr) { size_t loop_va = (size_t)v_addr & ~ARCH_PAGE_MASK; @@ -794,7 +794,7 @@ void _rt_hw_mmu_unmap(rt_mmu_info *mmu_info, void* v_addr, size_t size) rt_hw_cpu_tlb_invalidate(); } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr) { void *ret; @@ -887,7 +887,7 @@ void *rt_hw_mmu_v2p(rt_mmu_info *mmu_info, void* v_addr) return ret; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void rt_hw_mmu_setup_early(unsigned long *tbl0, unsigned long *tbl1, unsigned long size, unsigned long pv_off) { int ret; diff --git a/libcpu/aarch64/common/mmu.h b/libcpu/aarch64/common/mmu.h index abc159e521..54c41acbe3 100644 --- a/libcpu/aarch64/common/mmu.h +++ b/libcpu/aarch64/common/mmu.h @@ -123,7 +123,7 @@ void rt_hw_mmu_setup(struct mem_desc *mdesc, int desc_nr); int rt_hw_mmu_map_init(rt_mmu_info *mmu_info, void* v_address, size_t size, size_t *vtable, size_t pv_off); int rt_hw_mmu_ioremap_init(rt_mmu_info *mmu_info, void* v_address, size_t size); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr); void *rt_hw_mmu_map_auto(rt_mmu_info *mmu_info, void *v_addr, size_t size, size_t attr); #else diff --git a/libcpu/aarch64/common/page.c b/libcpu/aarch64/common/page.c index d3c3779f81..3e21c30347 100644 --- a/libcpu/aarch64/common/page.c +++ b/libcpu/aarch64/common/page.c @@ -12,7 +12,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include diff --git a/libcpu/aarch64/common/page.h b/libcpu/aarch64/common/page.h index 8b65299d91..54f11353df 100644 --- a/libcpu/aarch64/common/page.h +++ b/libcpu/aarch64/common/page.h @@ -11,7 +11,7 @@ #ifndef __PAGE_H__ #define __PAGE_H__ -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY typedef struct tag_region { diff --git a/libcpu/arm/cortex-a/backtrace.c b/libcpu/arm/cortex-a/backtrace.c index 1d4d444aa9..630a01e573 100644 --- a/libcpu/arm/cortex-a/backtrace.c +++ b/libcpu/arm/cortex-a/backtrace.c @@ -17,7 +17,7 @@ #define DBG_LVL DBG_INFO #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include #include @@ -522,7 +522,7 @@ void rt_unwind(struct rt_hw_exp_stack *regs, unsigned int pc_adj) e_regs.ARM_sp = regs->sp; e_regs.ARM_lr = regs->lr; e_regs.ARM_pc = regs->pc - pc_adj; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (!lwp_user_accessable((void *)e_regs.ARM_pc, sizeof (void *))) { e_regs.ARM_pc = regs->lr - sizeof(void *); diff --git a/libcpu/arm/cortex-a/context_gcc.S b/libcpu/arm/cortex-a/context_gcc.S index 38008facdc..ddd41888ac 100644 --- a/libcpu/arm/cortex-a/context_gcc.S +++ b/libcpu/arm/cortex-a/context_gcc.S @@ -45,12 +45,12 @@ rt_hw_context_switch_to: #ifdef RT_USING_SMP mov r0, r1 bl rt_cpus_lock_status_restore -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY bl rt_thread_self bl lwp_user_setting_restore #endif #else -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY bl rt_thread_self mov r4, r0 bl lwp_mmu_switch @@ -108,12 +108,12 @@ rt_hw_context_switch: #ifdef RT_USING_SMP mov r0, r2 bl rt_cpus_lock_status_restore -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY bl rt_thread_self bl lwp_user_setting_restore #endif #else -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY bl rt_thread_self mov r4, r0 bl lwp_mmu_switch @@ -151,7 +151,7 @@ rt_hw_context_switch_interrupt: */ #ifdef RT_USING_LWP push {r0 - r3, lr} -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY bl rt_thread_self bl lwp_user_setting_save #endif @@ -161,11 +161,11 @@ rt_hw_context_switch_interrupt: ldr sp, [r2] mov r0, r3 -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY mov r4, r0 #endif bl rt_cpus_lock_status_restore -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY mov r0, r4 bl lwp_user_setting_restore #endif @@ -187,7 +187,7 @@ rt_hw_context_switch_interrupt: str r0, [r3] mov r3, #1 @ set rt_thread_switch_interrupt_flag to 1 str r3, [ip] -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY push {r1, lr} mov r0, r2 bl lwp_user_setting_save diff --git a/libcpu/arm/cortex-a/interrupt.c b/libcpu/arm/cortex-a/interrupt.c index a93d816d21..ff792e6ece 100644 --- a/libcpu/arm/cortex-a/interrupt.c +++ b/libcpu/arm/cortex-a/interrupt.c @@ -94,7 +94,7 @@ void rt_hw_interrupt_init(void) rt_memset(isr_table, 0x00, sizeof(isr_table)); /* initialize ARM GIC */ -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY gic_dist_base = (uint32_t)rt_hw_mmu_map(&mmu_info, 0, (void*)platform_get_gic_dist_base(), 0x2000, MMU_MAP_K_RW); gic_cpu_base = (uint32_t)rt_hw_mmu_map(&mmu_info, 0, (void*)platform_get_gic_cpu_base(), 0x1000, MMU_MAP_K_RW); #else diff --git a/libcpu/arm/cortex-a/mmu.c b/libcpu/arm/cortex-a/mmu.c index ea2cadae6f..999419ccc2 100644 --- a/libcpu/arm/cortex-a/mmu.c +++ b/libcpu/arm/cortex-a/mmu.c @@ -15,7 +15,7 @@ #include "cp15.h" #include "mmu.h" -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include "page.h" #endif @@ -248,7 +248,7 @@ int rt_hw_mmu_ioremap_init(rt_mmu_info *mmu_info, void* v_address, size_t size) size_t l1_off; size_t *mmu_l1, *mmu_l2; size_t sections; -#ifndef RT_USING_USERSPACE +#ifndef RT_USING_VIRTUAL_MEMORY size_t *ref_cnt; #endif @@ -276,7 +276,7 @@ int rt_hw_mmu_ioremap_init(rt_mmu_info *mmu_info, void* v_address, size_t size) mmu_l1 = (size_t*)mmu_info->vtable + l1_off; RT_ASSERT((*mmu_l1 & ARCH_MMU_USED_MASK) == 0); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY mmu_l2 = (size_t*)rt_pages_alloc(0); #else mmu_l2 = (size_t*)rt_malloc_align(ARCH_PAGE_TBL_SIZE * 2, ARCH_PAGE_TBL_SIZE); @@ -297,7 +297,7 @@ int rt_hw_mmu_ioremap_init(rt_mmu_info *mmu_info, void* v_address, size_t size) return -1; } -#ifndef RT_USING_USERSPACE +#ifndef RT_USING_VIRTUAL_MEMORY ref_cnt = mmu_l2 + (ARCH_SECTION_SIZE / ARCH_PAGE_SIZE); *ref_cnt = 1; #endif @@ -371,7 +371,7 @@ static size_t find_vaddr(rt_mmu_info *mmu_info, int pages) return 0; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY static int check_vaddr(rt_mmu_info *mmu_info, void *va, int pages) { size_t loop_va = (size_t)va & ~ARCH_PAGE_MASK; @@ -424,7 +424,7 @@ static void __rt_hw_mmu_unmap(rt_mmu_info *mmu_info, void* v_addr, size_t npages size_t loop_va = (size_t)v_addr & ~ARCH_PAGE_MASK; size_t l1_off, l2_off; size_t *mmu_l1, *mmu_l2; -#ifndef RT_USING_USERSPACE +#ifndef RT_USING_VIRTUAL_MEMORY size_t *ref_cnt; #endif @@ -459,7 +459,7 @@ static void __rt_hw_mmu_unmap(rt_mmu_info *mmu_info, void* v_addr, size_t npages /* cache maintain */ rt_hw_cpu_dcache_clean(mmu_l2 + l2_off, 4); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY if (rt_pages_free(mmu_l2, 0)) { *mmu_l1 = 0; @@ -488,7 +488,7 @@ static int __rt_hw_mmu_map(rt_mmu_info *mmu_info, void* v_addr, void* p_addr, si size_t loop_pa = (size_t)p_addr & ~ARCH_PAGE_MASK; size_t l1_off, l2_off; size_t *mmu_l1, *mmu_l2; -#ifndef RT_USING_USERSPACE +#ifndef RT_USING_VIRTUAL_MEMORY size_t *ref_cnt; #endif @@ -506,13 +506,13 @@ static int __rt_hw_mmu_map(rt_mmu_info *mmu_info, void* v_addr, void* p_addr, si if (*mmu_l1 & ARCH_MMU_USED_MASK) { mmu_l2 = (size_t *)((*mmu_l1 & ~ARCH_PAGE_TBL_MASK) - mmu_info->pv_off); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY rt_page_ref_inc(mmu_l2, 0); #endif } else { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY mmu_l2 = (size_t*)rt_pages_alloc(0); #else mmu_l2 = (size_t*)rt_malloc_align(ARCH_PAGE_TBL_SIZE * 2, ARCH_PAGE_TBL_SIZE); @@ -535,7 +535,7 @@ static int __rt_hw_mmu_map(rt_mmu_info *mmu_info, void* v_addr, void* p_addr, si } } -#ifndef RT_USING_USERSPACE +#ifndef RT_USING_VIRTUAL_MEMORY ref_cnt = mmu_l2 + (ARCH_SECTION_SIZE / ARCH_PAGE_SIZE); (*ref_cnt)++; #endif @@ -555,7 +555,7 @@ static void rt_hw_cpu_tlb_invalidate(void) asm volatile ("mcr p15, 0, r0, c8, c7, 0\ndsb\nisb" ::: "memory"); } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *_rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr) { size_t pa_s, pa_e; @@ -626,7 +626,7 @@ void *_rt_hw_mmu_map(rt_mmu_info *mmu_info, void* p_addr, size_t size, size_t at } #endif -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY static int __rt_hw_mmu_map_auto(rt_mmu_info *mmu_info, void* v_addr, size_t npages, size_t attr) { size_t loop_va = (size_t)v_addr & ~ARCH_PAGE_MASK; @@ -753,7 +753,7 @@ void _rt_hw_mmu_unmap(rt_mmu_info *mmu_info, void* v_addr, size_t size) rt_hw_cpu_tlb_invalidate(); } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr) { void *ret; @@ -850,7 +850,7 @@ void *rt_hw_mmu_v2p(rt_mmu_info *mmu_info, void* v_addr) return ret; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void init_mm_setup(unsigned int *mtbl, unsigned int size, unsigned int pv_off) { unsigned int va; diff --git a/libcpu/arm/cortex-a/mmu.h b/libcpu/arm/cortex-a/mmu.h index d5288d8ab1..cc4c77aabf 100644 --- a/libcpu/arm/cortex-a/mmu.h +++ b/libcpu/arm/cortex-a/mmu.h @@ -19,7 +19,7 @@ #define SHAREDEVICE (1<<2) /* shared device */ #define STRONGORDER (0<<2) /* strong ordered */ #define XN (1<<4) /* eXecute Never */ -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #define AP_RW (1<<10) /* supervisor=RW, user=No */ #define AP_RO ((1<<10) |(1 << 15)) /* supervisor=RW, user=No */ #else @@ -98,7 +98,7 @@ typedef struct int rt_hw_mmu_map_init(rt_mmu_info *mmu_info, void* v_address, size_t size, size_t *vtable, size_t pv_off); int rt_hw_mmu_ioremap_init(rt_mmu_info *mmu_info, void* v_address, size_t size); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr); void *rt_hw_mmu_map_auto(rt_mmu_info *mmu_info, void *v_addr, size_t size, size_t attr); #else diff --git a/libcpu/arm/cortex-a/page.c b/libcpu/arm/cortex-a/page.c index f7e4ca2135..7c0f164280 100644 --- a/libcpu/arm/cortex-a/page.c +++ b/libcpu/arm/cortex-a/page.c @@ -12,7 +12,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include diff --git a/libcpu/arm/cortex-a/page.h b/libcpu/arm/cortex-a/page.h index 24c6356d39..2b8f76f6c3 100644 --- a/libcpu/arm/cortex-a/page.h +++ b/libcpu/arm/cortex-a/page.h @@ -11,7 +11,7 @@ #ifndef __PAGE_H__ #define __PAGE_H__ -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY typedef struct tag_region { diff --git a/libcpu/arm/cortex-a/start_gcc.S b/libcpu/arm/cortex-a/start_gcc.S index 32e1065d19..873db50651 100644 --- a/libcpu/arm/cortex-a/start_gcc.S +++ b/libcpu/arm/cortex-a/start_gcc.S @@ -43,7 +43,7 @@ stack_start: .endr stack_top: -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY .data .align 14 init_mtbl: @@ -122,7 +122,7 @@ continue: dsb isb -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY ldr r5, =PV_OFFSET mov r7, #0x100000 @@ -194,7 +194,7 @@ bss_loop: ldr r1, [r1] bl rt_hw_init_mmu_table -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY ldr r0, =MMUTable /* vaddr */ add r0, r5 /* to paddr */ bl switch_mmu @@ -252,7 +252,7 @@ stack_setup: msr cpsr_c, #Mode_SVC|I_Bit|F_Bit bx lr -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY .align 2 .global enable_mmu enable_mmu: @@ -476,7 +476,7 @@ rt_hw_context_switch_interrupt_do: ldr sp, [r6] /* get new task's stack pointer */ bl rt_thread_self -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY mov r4, r0 bl lwp_mmu_switch mov r0, r4 @@ -570,7 +570,7 @@ vector_undef: .globl vector_pabt vector_pabt: push_svc_reg -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY /* cp Mode_ABT stack to SVC */ sub sp, sp, #17 * 4 /* Sizeof(struct rt_hw_exp_stack) */ mov lr, r0 @@ -598,7 +598,7 @@ vector_pabt: .globl vector_dabt vector_dabt: push_svc_reg -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY /* cp Mode_ABT stack to SVC */ sub sp, sp, #17 * 4 /* Sizeof(struct rt_hw_exp_stack) */ mov lr, r0 @@ -637,7 +637,7 @@ rt_clz: .global rt_secondary_cpu_entry rt_secondary_cpu_entry: -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY ldr r5, =PV_OFFSET ldr lr, =after_enable_mmu2 @@ -681,7 +681,7 @@ after_enable_mmu2: ldr sp, =abt_stack_2_limit /* initialize the mmu table and enable mmu */ -#ifndef RT_USING_USERSPACE +#ifndef RT_USING_VIRTUAL_MEMORY bl rt_hw_mmu_init #endif diff --git a/libcpu/arm/cortex-a/trap.c b/libcpu/arm/cortex-a/trap.c index 706f809e5f..92802dc13a 100644 --- a/libcpu/arm/cortex-a/trap.c +++ b/libcpu/arm/cortex-a/trap.c @@ -163,7 +163,7 @@ void rt_hw_show_register(struct rt_hw_exp_stack *regs) rt_kprintf("fp :0x%08x ip :0x%08x\n", regs->fp, regs->ip); rt_kprintf("sp :0x%08x lr :0x%08x pc :0x%08x\n", regs->sp, regs->lr, regs->pc); rt_kprintf("cpsr:0x%08x\n", regs->cpsr); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY { uint32_t v; asm volatile ("MRC p15, 0, %0, c5, c0, 0":"=r"(v)); diff --git a/libcpu/arm/cortex-a/vector_gcc.S b/libcpu/arm/cortex-a/vector_gcc.S index eb872db71f..98d8b07823 100644 --- a/libcpu/arm/cortex-a/vector_gcc.S +++ b/libcpu/arm/cortex-a/vector_gcc.S @@ -15,7 +15,7 @@ .globl system_vectors system_vectors: -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY b _reset #else ldr pc, _vector_reset diff --git a/libcpu/mips/gs264/mmu.c b/libcpu/mips/gs264/mmu.c index b5bedace50..b5ad2136d2 100644 --- a/libcpu/mips/gs264/mmu.c +++ b/libcpu/mips/gs264/mmu.c @@ -318,7 +318,7 @@ static size_t find_vaddr(rt_mmu_info *mmu_info, int pages) return 0; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY static int check_vaddr(rt_mmu_info *mmu_info, void *va, int pages) { size_t loop_va = (size_t)va & ~ARCH_PAGE_MASK; @@ -397,7 +397,7 @@ static void __rt_hw_mmu_unmap(rt_mmu_info *mmu_info, void* v_addr, size_t npages (*ref_cnt)--; if (!*ref_cnt) { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY rt_pages_free(mmu_l2, 0); #else rt_free_align(mmu_l2); @@ -437,7 +437,7 @@ static int __rt_hw_mmu_map(rt_mmu_info *mmu_info, void* v_addr, void* p_addr, si } else { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY mmu_l2 = (size_t*)rt_pages_alloc(0); #else mmu_l2 = (size_t*)rt_malloc_align(ARCH_PAGE_TBL_SIZE * 2, ARCH_PAGE_TBL_SIZE); @@ -479,7 +479,7 @@ static void rt_hw_cpu_tlb_invalidate(void) mmu_clear_itlb(); } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *_rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr) { size_t pa_s, pa_e; @@ -550,7 +550,7 @@ void *_rt_hw_mmu_map(rt_mmu_info *mmu_info, void* p_addr, size_t size, size_t at } #endif -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY static int __rt_hw_mmu_map_auto(rt_mmu_info *mmu_info, void* v_addr, size_t npages, size_t attr) { size_t loop_va = (size_t)v_addr & ~ARCH_PAGE_MASK; @@ -694,7 +694,7 @@ void *rt_hw_kernel_phys_to_virt(void *p_addr, size_t size) { void *v_addr = 0; - #ifdef RT_USING_USERSPACE + #ifdef RT_USING_VIRTUAL_MEMORY extern rt_mmu_info mmu_info; v_addr = rt_hw_mmu_map(&mmu_info, 0, p_addr, size, MMU_MAP_K_RW); #else @@ -704,7 +704,7 @@ void *rt_hw_kernel_phys_to_virt(void *p_addr, size_t size) return v_addr; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr) { void *ret; @@ -801,7 +801,7 @@ void *rt_hw_mmu_v2p(rt_mmu_info *mmu_info, void* v_addr) return ret; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void init_mm_setup(unsigned int *mtbl, unsigned int size, unsigned int pv_off) { unsigned int va; diff --git a/libcpu/mips/gs264/mmu.h b/libcpu/mips/gs264/mmu.h index 2472bf975f..cd651f4651 100644 --- a/libcpu/mips/gs264/mmu.h +++ b/libcpu/mips/gs264/mmu.h @@ -20,7 +20,7 @@ #define SHAREDEVICE (1<<2) /* shared device */ #define STRONGORDER (0<<2) /* strong ordered */ #define XN (1<<4) /* execute Never */ -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #define AP_RW (1<<10) /* supervisor=RW, user=No */ #define AP_RO ((1<<10) |(1 << 15)) /* supervisor=RW, user=No */ #else @@ -98,7 +98,7 @@ void *mmu_table_get(); void switch_mmu(void *mmu_table); int rt_hw_mmu_map_init(rt_mmu_info *mmu_info, void* v_address, size_t size, size_t *vtable, size_t pv_off); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr); void *rt_hw_mmu_map_auto(rt_mmu_info *mmu_info, void *v_addr, size_t size, size_t attr); #else diff --git a/libcpu/risc-v/t-head/c906/context_gcc.S b/libcpu/risc-v/t-head/c906/context_gcc.S index d121eac67d..a48d4d073a 100644 --- a/libcpu/risc-v/t-head/c906/context_gcc.S +++ b/libcpu/risc-v/t-head/c906/context_gcc.S @@ -21,7 +21,7 @@ rt_hw_context_switch_to: la s0, rt_current_thread LOAD s1, (s0) - #ifdef RT_USING_USERSPACE + #ifdef RT_USING_VIRTUAL_MEMORY mv a0, s1 jal lwp_mmu_switch #endif @@ -54,7 +54,7 @@ rt_hw_context_switch: la s0, rt_current_thread LOAD s1, (s0) - #ifdef RT_USING_USERSPACE + #ifdef RT_USING_VIRTUAL_MEMORY mv a0, s1 jal lwp_mmu_switch #endif diff --git a/libcpu/risc-v/t-head/c906/interrupt_gcc.S b/libcpu/risc-v/t-head/c906/interrupt_gcc.S index f21e03ec7f..562443e4a1 100644 --- a/libcpu/risc-v/t-head/c906/interrupt_gcc.S +++ b/libcpu/risc-v/t-head/c906/interrupt_gcc.S @@ -92,7 +92,7 @@ copy_context_loop_interrupt: LOAD s1, 0(s0) LOAD sp, 0(s1) - #ifdef RT_USING_USERSPACE + #ifdef RT_USING_VIRTUAL_MEMORY mv a0, s1 jal rt_thread_sp_to_thread jal lwp_mmu_switch @@ -146,7 +146,7 @@ copy_context_loop: .global syscall_exit syscall_exit: - #if defined(RT_USING_USERSPACE) && defined(RT_USING_SIGNALS) + #if defined(RT_USING_VIRTUAL_MEMORY) && defined(RT_USING_SIGNALS) LOAD s0, 2 * REGBYTES(sp) andi s0, s0, 0x100 bnez s0, dont_ret_to_user diff --git a/libcpu/risc-v/t-head/c906/trap.c b/libcpu/risc-v/t-head/c906/trap.c index 24dcb1edb0..5a4d7a3f1d 100644 --- a/libcpu/risc-v/t-head/c906/trap.c +++ b/libcpu/risc-v/t-head/c906/trap.c @@ -26,7 +26,7 @@ #include "rt_interrupt.h" #include "plic.h" -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include "riscv_mmu.h" #include "mmu.h" #include "page.h" @@ -144,7 +144,7 @@ void dump_regs(struct rt_hw_stack_frame *regs) rt_size_t satp_v = read_csr(satp); rt_kprintf("satp = 0x%p\n",satp_v); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY rt_kprintf("\tCurrent Page Table(Physical) = 0x%p\n",__MASKVALUE(satp_v,__MASK(44)) << PAGE_OFFSET_BIT); rt_kprintf("\tCurrent ASID = 0x%p\n",__MASKVALUE(satp_v >> 44,__MASK(16)) << PAGE_OFFSET_BIT); #endif @@ -273,7 +273,7 @@ void handle_trap(rt_size_t scause,rt_size_t stval,rt_size_t sepc,struct rt_hw_st } else { -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY /* page fault */ if (id == EP_LOAD_PAGE_FAULT || id == EP_STORE_PAGE_FAULT) diff --git a/libcpu/risc-v/virt64/context_gcc.S b/libcpu/risc-v/virt64/context_gcc.S index d121eac67d..a48d4d073a 100644 --- a/libcpu/risc-v/virt64/context_gcc.S +++ b/libcpu/risc-v/virt64/context_gcc.S @@ -21,7 +21,7 @@ rt_hw_context_switch_to: la s0, rt_current_thread LOAD s1, (s0) - #ifdef RT_USING_USERSPACE + #ifdef RT_USING_VIRTUAL_MEMORY mv a0, s1 jal lwp_mmu_switch #endif @@ -54,7 +54,7 @@ rt_hw_context_switch: la s0, rt_current_thread LOAD s1, (s0) - #ifdef RT_USING_USERSPACE + #ifdef RT_USING_VIRTUAL_MEMORY mv a0, s1 jal lwp_mmu_switch #endif diff --git a/libcpu/risc-v/virt64/interrupt_gcc.S b/libcpu/risc-v/virt64/interrupt_gcc.S index 311c17b0be..12f1c8a626 100644 --- a/libcpu/risc-v/virt64/interrupt_gcc.S +++ b/libcpu/risc-v/virt64/interrupt_gcc.S @@ -92,7 +92,7 @@ copy_context_loop_interrupt: LOAD s1, 0(s0) LOAD sp, 0(s1) - #ifdef RT_USING_USERSPACE + #ifdef RT_USING_VIRTUAL_MEMORY mv a0, s1 jal rt_thread_sp_to_thread jal lwp_mmu_switch @@ -146,7 +146,7 @@ copy_context_loop: .global syscall_exit syscall_exit: - #if defined(RT_USING_USERSPACE) && defined(RT_USING_SIGNALS) + #if defined(RT_USING_VIRTUAL_MEMORY) && defined(RT_USING_SIGNALS) LOAD s0, 2 * REGBYTES(sp) andi s0, s0, 0x100 bnez s0, error diff --git a/libcpu/x86/i386/cpuport.c b/libcpu/x86/i386/cpuport.c index 98e55fa6f3..5e3785fd5b 100644 --- a/libcpu/x86/i386/cpuport.c +++ b/libcpu/x86/i386/cpuport.c @@ -82,7 +82,7 @@ void rt_hw_context_switch_to(rt_ubase_t to) { rt_thread_t to_thread = rt_thread_sp_to_thread((void *)to); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY /** * update kernel esp0 as to thread's kernel stack, to make sure process can't * get the correct kernel stack from tss esp0 when interrupt occur in user mode. @@ -90,7 +90,7 @@ void rt_hw_context_switch_to(rt_ubase_t to) rt_ubase_t stacktop = (rt_ubase_t)(to_thread->stack_addr + to_thread->stack_size); rt_hw_tss_set_kstacktop(stacktop); lwp_mmu_switch(to_thread); /* switch mmu before switch context */ -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ rt_hw_context_switch_to_real(to); } @@ -103,7 +103,7 @@ void rt_hw_context_switch(rt_ubase_t from, rt_ubase_t to) lwp_user_setting_save(from_thread); #endif /* RT_USING_LWP */ -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY /** * update kernel esp0 as to thread's kernel stack, to make sure process can't * get the correct kernel stack from tss esp0 when interrupt occur in user mode. @@ -111,7 +111,7 @@ void rt_hw_context_switch(rt_ubase_t from, rt_ubase_t to) rt_ubase_t stacktop = (rt_ubase_t)(to_thread->stack_addr + to_thread->stack_size); rt_hw_tss_set_kstacktop(stacktop); lwp_mmu_switch(to_thread); /* switch mmu before switch context */ -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ rt_hw_context_switch_real(from, to); diff --git a/libcpu/x86/i386/gate.c b/libcpu/x86/i386/gate.c index 59536ddfe9..7f3a131565 100644 --- a/libcpu/x86/i386/gate.c +++ b/libcpu/x86/i386/gate.c @@ -146,10 +146,10 @@ void rt_hw_gate_init(void) gate_set(IDT_OFF2PTR(idt, IRQ_INTR_BASE+14), rt_hw_intr_entry0x2e, KERNEL_CODE_SEL, DA_386_INTR_GATE, DA_GATE_DPL0); gate_set(IDT_OFF2PTR(idt, IRQ_INTR_BASE+15), rt_hw_intr_entry0x2f, KERNEL_CODE_SEL, DA_386_INTR_GATE, DA_GATE_DPL0); /* 系统调用处理中断 */ -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY extern void hw_syscall_entry(void); gate_set(IDT_OFF2PTR(idt, SYSCALL_INTR_BASE), hw_syscall_entry, KERNEL_CODE_SEL, DA_386_INTR_GATE, DA_GATE_DPL3); -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ extern void load_new_idt(rt_ubase_t size, rt_ubase_t idtr); load_new_idt(IDT_LIMIT, IDT_VADDR); diff --git a/libcpu/x86/i386/interrupt_gcc.S b/libcpu/x86/i386/interrupt_gcc.S index ddc70ccf9c..9430c9ca1f 100644 --- a/libcpu/x86/i386/interrupt_gcc.S +++ b/libcpu/x86/i386/interrupt_gcc.S @@ -186,7 +186,7 @@ rt_hw_intr_thread_switch: movl $rt_hw_intr_exit, %eax jmp *%eax -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY .extern rt_hw_syscall_dispath @@ -232,7 +232,7 @@ hw_syscall_entry: .global syscall_exit syscall_exit: -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ .global rt_hw_intr_exit rt_hw_intr_exit: addl $4, %esp // skip intr no diff --git a/libcpu/x86/i386/mmu.c b/libcpu/x86/i386/mmu.c index c333e35cad..63decefeab 100644 --- a/libcpu/x86/i386/mmu.c +++ b/libcpu/x86/i386/mmu.c @@ -18,15 +18,15 @@ #include "cache.h" #include "i386.h" -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include "page.h" -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ // #define RT_DEBUG_MMU_X86 static void __rt_hw_mmu_unmap(rt_mmu_info *mmu_info,void *v_addr,rt_size_t npages); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *_rt_hw_mmu_map(rt_mmu_info *mmu_info,void *v_addr,void *p_addr,rt_size_t size,rt_size_t attr); void *_rt_hw_mmu_map_auto(rt_mmu_info *mmu_info,void *v_addr,rt_size_t size,rt_size_t attr); #else @@ -208,7 +208,7 @@ static int __rt_hw_mmu_map(rt_mmu_info *mmu_info,void *v_addr,void *p_addr,rt_si return 0; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY //check whether the range of virtual address are free static int check_vaddr(rt_mmu_info *mmu_info,void *va,rt_size_t pages) { @@ -250,7 +250,7 @@ static int check_vaddr(rt_mmu_info *mmu_info,void *va,rt_size_t pages) return 0; } -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ //find a range of free virtual address specified by pages static size_t find_vaddr(rt_mmu_info *mmu_info, int pages) @@ -294,7 +294,7 @@ static size_t find_vaddr(rt_mmu_info *mmu_info, int pages) return 0; } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *_rt_hw_mmu_map(rt_mmu_info *mmu_info,void *v_addr,void *p_addr,rt_size_t size,rt_size_t attr) { rt_size_t pa_s,pa_e; @@ -372,9 +372,9 @@ void *_rt_hw_mmu_map(rt_mmu_info *mmu_info, void* p_addr, size_t size, size_t at } return 0; } -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY static int __rt_hw_mmu_map_auto(rt_mmu_info *mmu_info,void *v_addr,rt_size_t npages,rt_size_t attr) { rt_size_t loop_va = __UMASKVALUE((rt_size_t)v_addr, PAGE_OFFSET_MASK); @@ -471,7 +471,7 @@ void *_rt_hw_mmu_map_auto(rt_mmu_info *mmu_info,void *v_addr,rt_size_t size,rt_s } return 0; } -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ /** * unmap page on v_addr, free page if unmapped, further more, if page table empty, need free it. @@ -535,7 +535,7 @@ void _rt_hw_mmu_unmap(rt_mmu_info *mmu_info,void *v_addr,rt_size_t size) rt_hw_cpu_tlb_invalidate(); } -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY /** * map vaddr in vtable with size and attr, this need a phy addr * diff --git a/libcpu/x86/i386/mmu.h b/libcpu/x86/i386/mmu.h index 2f704e4c43..4b084be478 100644 --- a/libcpu/x86/i386/mmu.h +++ b/libcpu/x86/i386/mmu.h @@ -132,12 +132,12 @@ void switch_mmu(void *mmu_table); int rt_hw_mmu_map_init(rt_mmu_info *mmu_info,void *v_address,rt_size_t size,rt_size_t *vtable,rt_size_t pv_off); void rt_hw_mmu_kernel_map_init(rt_mmu_info *mmu_info,rt_size_t vaddr_start,rt_size_t size); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY void *rt_hw_mmu_map(rt_mmu_info *mmu_info,void *v_addr,void *p_addr,rt_size_t size,rt_size_t attr); void *rt_hw_mmu_map_auto(rt_mmu_info *mmu_info,void *v_addr,rt_size_t size,rt_size_t attr); #else void *rt_hw_mmu_map(rt_mmu_info *mmu_info, void* p_addr, size_t size, size_t attr); -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ 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); diff --git a/libcpu/x86/i386/page.c b/libcpu/x86/i386/page.c index 487b835bd7..71c65c5012 100644 --- a/libcpu/x86/i386/page.c +++ b/libcpu/x86/i386/page.c @@ -14,7 +14,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include "page.h" #include "mmu.h" @@ -486,4 +486,4 @@ void rt_page_init(rt_region_t reg) rt_pages_alloc(0); } -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ diff --git a/libcpu/x86/i386/syscall_c.c b/libcpu/x86/i386/syscall_c.c index 332fb6fa96..f95cfb3587 100644 --- a/libcpu/x86/i386/syscall_c.c +++ b/libcpu/x86/i386/syscall_c.c @@ -17,7 +17,7 @@ //#define DBG_LEVEL DBG_INFO #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #include @@ -91,4 +91,4 @@ void rt_hw_syscall_dispath(struct rt_hw_stack_frame *frame) LOG_I("\033[36msyscall deal ok,ret = 0x%p\n\033[37m",frame->eax); } -#endif /* RT_USING_USERSPACE */ +#endif /* RT_USING_VIRTUAL_MEMORY */ diff --git a/src/cpu.c b/src/cpu.c index d253275c33..c4fefe332e 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -10,7 +10,7 @@ #include #include -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY #include #endif @@ -200,7 +200,7 @@ void rt_cpus_lock_status_restore(struct rt_thread *thread) { struct rt_cpu* pcpu = rt_cpu_self(); -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY lwp_mmu_switch(thread); #endif pcpu->current_thread = thread; diff --git a/src/mem.c b/src/mem.c index 971e04dbd8..d21eb250ba 100644 --- a/src/mem.c +++ b/src/mem.c @@ -632,17 +632,16 @@ void rt_memory_info(rt_uint32_t *total, #ifdef RT_USING_LWP #include -#else +#endif #ifndef ARCH_PAGE_SIZE #define ARCH_PAGE_SIZE 0 -#endif #endif void list_mem(void) { size_t total_pages = 0, free_pages = 0; -#ifdef RT_USING_USERSPACE +#ifdef RT_USING_VIRTUAL_MEMORY rt_page_get_info(&total_pages, &free_pages); #endif diff --git a/src/scheduler.c b/src/scheduler.c index 56fba09d03..d0141e56dd 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -33,6 +33,10 @@ #include #include +#ifdef RT_USING_LWP +#include +#endif /* RT_USING_LWP */ + rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]; rt_uint32_t rt_thread_ready_priority_group; #if RT_THREAD_PRIORITY_MAX > 32 @@ -82,6 +86,19 @@ static void _rt_scheduler_stack_check(struct rt_thread *thread) { RT_ASSERT(thread != RT_NULL); +#ifdef RT_USING_LWP +#ifndef RT_USING_VIRTUAL_MEMORY + struct rt_lwp *lwp = thread ? (struct rt_lwp *)thread->lwp : 0; + + /* if stack pointer locate in user data section skip stack check. */ + if (lwp && ((rt_uint32_t)thread->sp > (rt_uint32_t)lwp->data_entry && + (rt_uint32_t)thread->sp <= (rt_uint32_t)lwp->data_entry + (rt_uint32_t)lwp->data_size)) + { + return; + } +#endif /* not defined RT_USING_VIRTUAL_MEMORY */ +#endif /* RT_USING_LWP */ + #if defined(ARCH_CPU_STACK_GROWS_UPWARD) if (*((rt_uint8_t *)((rt_ubase_t)thread->stack_addr + thread->stack_size - 1)) != '#' || #else -- Gitee