From c686e13d78d314bbbe07445c573054485df67b6f Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Sat, 16 Jan 2021 10:40:58 +0800 Subject: [PATCH 1/7] add thread clone support --- components/lwp/Kconfig | 5 + components/lwp/arch/arm/cortex-a/lwp_gcc.S | 29 +++ components/lwp/lwp.c | 2 + components/lwp/lwp.h | 5 + components/lwp/lwp_syscall.c | 231 ++++++++++++++++++--- components/lwp/lwp_tid.c | 89 ++++++++ include/rtdef.h | 2 + 7 files changed, 329 insertions(+), 34 deletions(-) create mode 100644 components/lwp/lwp_tid.c diff --git a/components/lwp/Kconfig b/components/lwp/Kconfig index 609dabd37e..1532a2202e 100644 --- a/components/lwp/Kconfig +++ b/components/lwp/Kconfig @@ -32,3 +32,8 @@ 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 + depends on RT_USING_LWP diff --git a/components/lwp/arch/arm/cortex-a/lwp_gcc.S b/components/lwp/arch/arm/cortex-a/lwp_gcc.S index cad967fa04..370c5b0d92 100644 --- a/components/lwp/arch/arm/cortex-a/lwp_gcc.S +++ b/components/lwp/arch/arm/cortex-a/lwp_gcc.S @@ -62,6 +62,35 @@ set_user_context: cps #Mode_SVC mov pc, lr +/* +int lwp_set_thread_context(void *new_thread_stack, void *origin_thread_stack, void *user_stack, void **thread_sp, int tid); +*/ +.global lwp_set_thread_context +lwp_set_thread_context: + sub r12, r1, sp /* origin, r12 = origin sp offset */ + sub r0, r0, r12 /* new sp */ + stmfd r0!, {lr} + stmfd r0!, {lr} + stmfd r0!, {r12} + sub r12, sp, fp /* new, r1 = origin fp offset */ + sub r1, r0, r12 + add r1, #12 /* new fp */ + stmfd r0!, {r1} /* fp */ + stmfd r0!, {r1 - r10} + mov r12, #0 + stmfd r0!, {r12} /* new thread return value */ + mrs r1, cpsr + stmfd r0!, {r1} /* spsr */ + mov r1, #0 + stmfd r0!, {r1} /* now user lr is 0 */ + stmfd r0!, {r2} /* user sp */ +#ifdef RT_USING_FPU + stmfd r0!, {r1} /* not use fpu */ +#endif + str r0, [r3] + ldr r0, [sp] + mov pc, lr + /* * void SVC_Handler(void); */ diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index 7d7cd3db89..dd8d4101df 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -739,6 +739,7 @@ void lwp_cleanup(struct rt_thread *tid) level = rt_hw_interrupt_disable(); lwp = (struct rt_lwp *)tid->lwp; + lwp_tid_put(tid->tid); rt_list_remove(&tid->sibling); lwp_ref_dec(lwp); rt_hw_interrupt_enable(level); @@ -870,6 +871,7 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp) { struct rt_lwp *lwp_self; + tid->tid = 0; LOG_D("lwp kernel => (0x%08x, 0x%08x)\n", (rt_uint32_t)tid->stack_addr, (rt_uint32_t)tid->stack_addr + tid->stack_size); level = rt_hw_interrupt_disable(); lwp_self = (struct rt_lwp *)rt_thread_self()->lwp; diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h index 29a139b658..3c5fa7b9ee 100644 --- a/components/lwp/lwp.h +++ b/components/lwp/lwp.h @@ -116,6 +116,11 @@ void lwp_set_thread_area(void *p); void* rt_cpu_get_thread_idr(void); void rt_cpu_set_thread_idr(void *p); +int lwp_tid_get(void); +void lwp_tid_put(int tid); +rt_thread_t lwp_tid_get_thread(int tid); +void lwp_tid_set_thread(int tid, rt_thread_t thread); + #ifdef RT_USING_USERSPACE void lwp_mmu_switch(struct rt_thread *thread); #endif diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 962525e871..9fa51b235d 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -76,6 +76,8 @@ static void kmem_put(void *kptr) } #endif +int sys_futex(int *uaddr, int op, int val, void *timeout, void *uaddr2, int val3); + /* The same socket option is defined differently in the user interfaces and the * implementation. The options should be converted in the kernel. */ @@ -343,7 +345,7 @@ static void lwp_user_thread(void *parameter) user_stack &= ~7; //align 8 set_user_context((void*)user_stack); - lwp_user_entry(parameter, tid->user_entry, lwp->data_entry, (void*)user_stack); + lwp_user_entry(parameter, tid->user_entry, lwp->data_entry, RT_NULL); } /* thread/process */ @@ -359,6 +361,14 @@ void sys_exit(int value) lwp = (struct rt_lwp*)tid->lwp; level = rt_hw_interrupt_disable(); + if (tid->clear_child_tid) + { + int t = 0; + int *clear_child_tid = tid->clear_child_tid; + + tid->clear_child_tid = RT_NULL; + lwp_put_to_user(clear_child_tid, &t, sizeof t); + } main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling); if (main_thread == tid) { @@ -1135,7 +1145,7 @@ rt_thread_t sys_thread_create(void *arg[]) rt_base_t level; void *user_stack = 0; struct rt_lwp *lwp = 0; - rt_thread_t tid; + rt_thread_t thread; lwp = rt_thread_self()->lwp; lwp_ref_inc(lwp); @@ -1147,30 +1157,31 @@ rt_thread_t sys_thread_create(void *arg[]) if (!user_stack) { rt_set_errno(EINVAL); - return RT_NULL; + goto fail; } - tid = rt_thread_create((const char*)arg[0], + thread = rt_thread_create((const char*)arg[0], lwp_user_thread, (void*)arg[2], ALLOC_KERNEL_STACK_SIZE, (rt_uint8_t)(size_t)arg[4], (rt_uint32_t)arg[5]); - if (!tid) + if (!thread) { goto fail; } - tid->cleanup = lwp_cleanup; - tid->user_entry = (void (*)(void *))arg[1]; - tid->user_stack = (void *)user_stack; - tid->user_stack_size = (uint32_t)arg[3]; - tid->lwp = (void*)lwp; + thread->cleanup = lwp_cleanup; + thread->user_entry = (void (*)(void *))arg[1]; + thread->user_stack = (void *)user_stack; + thread->user_stack_size = (uint32_t)arg[3]; + thread->lwp = (void*)lwp; + thread->tid = 0; level = rt_hw_interrupt_disable(); - rt_list_insert_after(&lwp->t_grp, &tid->sibling); + rt_list_insert_after(&lwp->t_grp, &thread->sibling); rt_hw_interrupt_enable(level); - return tid; + return thread; fail: #ifndef RT_USING_USERSPACE @@ -1186,6 +1197,154 @@ fail: return RT_NULL; } +#define CLONE_VM 0x00000100 +#define CLONE_FS 0x00000200 +#define CLONE_FILES 0x00000400 +#define CLONE_SIGHAND 0x00000800 +#define CLONE_PTRACE 0x00002000 +#define CLONE_VFORK 0x00004000 +#define CLONE_PARENT 0x00008000 +#define CLONE_THREAD 0x00010000 +#define CLONE_NEWNS 0x00020000 +#define CLONE_SYSVSEM 0x00040000 +#define CLONE_SETTLS 0x00080000 +#define CLONE_PARENT_SETTID 0x00100000 +#define CLONE_CHILD_CLEARTID 0x00200000 +#define CLONE_DETACHED 0x00400000 +#define CLONE_UNTRACED 0x00800000 +#define CLONE_CHILD_SETTID 0x01000000 +#define CLONE_NEWCGROUP 0x02000000 +#define CLONE_NEWUTS 0x04000000 +#define CLONE_NEWIPC 0x08000000 +#define CLONE_NEWUSER 0x10000000 +#define CLONE_NEWPID 0x20000000 +#define CLONE_NEWNET 0x40000000 +#define CLONE_IO 0x80000000 + +/* arg[] -> flags + * stack + * new_tid + * tls + * set_clear_tid_address + * quit_func + * start_args + * */ +#define SYS_CLONE_ARGS_NR 7 +int lwp_set_thread_context(void *new_thread_stack, void *origin_thread_stack, void *user_stack, void **thread_sp, int tid); +long sys_clone(void *arg[]) +{ + rt_base_t level; + struct rt_lwp *lwp = 0; + rt_thread_t thread = RT_NULL; + rt_thread_t self = RT_NULL; + int tid = -1; + + unsigned long flags = 0; + void *user_stack = RT_NULL; + int *new_tid = RT_NULL; + void *tls = RT_NULL; + /* + musl call flags (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND + | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS + | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID | CLONE_DETACHED); + */ + + /* check args */ + if (!lwp_user_accessable(arg, sizeof(void *[SYS_CLONE_ARGS_NR]))) + { + rt_set_errno(EINVAL); + return -1; + } + + flags = (unsigned long)(size_t)arg[0]; + if ((flags & (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_THREAD | CLONE_SYSVSEM)) + != (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_THREAD | CLONE_SYSVSEM)) + { + rt_set_errno(EINVAL); + return -1; + } + + user_stack = arg[1]; + new_tid = (int *)arg[2]; + tls = (void *)arg[3]; + + if ((flags & CLONE_PARENT_SETTID) == CLONE_PARENT_SETTID) + { + if (!lwp_user_accessable(new_tid, sizeof(int))) + { + rt_set_errno(EINVAL); + return -1; + } + } + + self = rt_thread_self(); + lwp = self->lwp; + lwp_ref_inc(lwp); + if (!user_stack) + { + rt_set_errno(EINVAL); + goto fail; + } + if ((tid = lwp_tid_get()) == -1) + { + rt_set_errno(ENOMEM); + goto fail; + } + thread = rt_thread_create((const char*)"pthread", + RT_NULL, + RT_NULL, + ALLOC_KERNEL_STACK_SIZE, + self->init_priority, + self->init_tick); + if (!thread) + { + goto fail; + } + + thread->cleanup = lwp_cleanup; + thread->user_entry = RT_NULL; + thread->user_stack = RT_NULL; + thread->user_stack_size = 0; + thread->lwp = (void*)lwp; + thread->tid = tid; + + if ((flags & CLONE_SETTLS) == CLONE_SETTLS) + { + thread->thread_idr = tls; + } + if ((flags & CLONE_PARENT_SETTID) == CLONE_PARENT_SETTID) + { + *new_tid = (int)(tid); + } + if ((flags & CLONE_CHILD_CLEARTID) == CLONE_CHILD_CLEARTID) + { + thread->clear_child_tid = (int*)arg[4]; + } + + level = rt_hw_interrupt_disable(); + rt_list_insert_after(&lwp->t_grp, &thread->sibling); + rt_hw_interrupt_enable(level); + + /* copy origin stack */ + rt_memcpy(thread->stack_addr, self->stack_addr, ALLOC_KERNEL_STACK_SIZE); + lwp_tid_set_thread(tid, thread); + tid = lwp_set_thread_context((void*)((char*)thread->stack_addr + ALLOC_KERNEL_STACK_SIZE), + (void*)((char*)self->stack_addr + ALLOC_KERNEL_STACK_SIZE), user_stack, &thread->sp, tid); + if (tid) + { + rt_thread_startup(thread); + } + return (long)tid; + +fail: + lwp_tid_put(tid); + if (lwp) + { + lwp_ref_dec(lwp); + } + return -1; +} + rt_err_t sys_thread_delete(rt_thread_t thread) { return rt_thread_delete(thread); @@ -2206,7 +2365,10 @@ int sys_set_thread_area(void *p) long sys_set_tid_address(int *tidptr) { - return 0; + rt_thread_t thread = rt_thread_self(); + + thread->clear_child_tid = tidptr; + return thread->tid; } int sys_access(const char *filename, int mode) @@ -2400,47 +2562,47 @@ const static void* func_table[] = SYSCALL_USPACE(sys_mmap2), SYSCALL_USPACE(sys_munmap), - SYSCALL_USPACE(sys_shmget), + SYSCALL_USPACE(sys_shmget), /* 55 */ SYSCALL_USPACE(sys_shmrm), SYSCALL_USPACE(sys_shmat), SYSCALL_USPACE(sys_shmdt), (void *)sys_device_init, - (void *)sys_device_register, + (void *)sys_device_register, /* 60 */ (void *)sys_device_control, (void *)sys_device_find, (void *)sys_device_open, (void *)sys_device_close, - (void *)sys_device_read, + (void *)sys_device_read, /* 65 */ (void *)sys_device_write, (void *)sys_stat, (void *)sys_thread_find, SYSCALL_NET(sys_accept), - SYSCALL_NET(sys_bind), + SYSCALL_NET(sys_bind), /* 70 */ SYSCALL_NET(sys_shutdown), SYSCALL_NET(sys_getpeername), SYSCALL_NET(sys_getsockname), SYSCALL_NET(sys_getsockopt), - SYSCALL_NET(sys_setsockopt), + SYSCALL_NET(sys_setsockopt), /* 75 */ SYSCALL_NET(sys_connect), SYSCALL_NET(sys_listen), SYSCALL_NET(sys_recv), SYSCALL_NET(sys_recvfrom), - SYSCALL_NET(sys_send), + SYSCALL_NET(sys_send), /* 80 */ SYSCALL_NET(sys_sendto), SYSCALL_NET(sys_socket), SYSCALL_NET(sys_closesocket), SYSCALL_NET(sys_getaddrinfo), - SYSCALL_NET(sys_gethostbyname2_r), + SYSCALL_NET(sys_gethostbyname2_r), /* 85 */ (void *)sys_notimpl, //(void *)network, (void *)sys_notimpl, //(void *)network, (void *)sys_notimpl, //(void *)network, (void *)sys_notimpl, //(void *)network, - (void *)sys_notimpl, //(void *)network, + (void *)sys_notimpl, //(void *)network, /* 90 */ (void *)sys_notimpl, //(void *)network, (void *)sys_notimpl, //(void *)network, (void *)sys_notimpl, //(void *)network, @@ -2451,44 +2613,45 @@ const static void* func_table[] = (void *)sys_notimpl, #endif - (void *)sys_notimpl, //(void *)sys_hw_interrupt_disable, + (void *)sys_notimpl, //(void *)sys_hw_interrupt_disable, /* 95 */ (void *)sys_notimpl, //(void *)sys_hw_interrupt_enable, (void *)sys_tick_get, (void *)sys_exit_group, (void *)sys_notimpl, //(void *)rt_delayed_work_init, - (void *)sys_notimpl, //(void *)rt_work_submit, + (void *)sys_notimpl, //(void *)rt_work_submit, /* 100 */ (void *)sys_notimpl, //(void *)rt_wqueue_wakeup, (void *)sys_thread_mdelay, - (void*)sys_sigaction, - (void*)sys_sigprocmask, - (void*)sys_thread_kill, - (void*)sys_thread_sighandler_set, - (void*)sys_thread_sigprocmask, - (void*)sys_notimpl, - (void*)sys_notimpl, - (void*)sys_waitpid, + (void *)sys_sigaction, + (void *)sys_sigprocmask, + (void *)sys_thread_kill, /* 105 */ + (void *)sys_thread_sighandler_set, + (void *)sys_thread_sigprocmask, + (void *)sys_notimpl, + (void *)sys_notimpl, + (void *)sys_waitpid, /* 110 */ (void *)sys_timer_create, (void *)sys_timer_delete, (void *)sys_timer_start, (void *)sys_timer_stop, - (void *)sys_timer_control, + (void *)sys_timer_control, /* 115 */ (void *)sys_getcwd, (void *)sys_chdir, (void *)sys_unlink, (void *)sys_mkdir, - (void *)sys_rmdir, + (void *)sys_rmdir, /* 120 */ (void *)sys_getdents, (void *)sys_get_errno, (void *)sys_set_thread_area, (void *)sys_set_tid_address, - (void *)sys_access, + (void *)sys_access, /* 125 */ (void *)sys_pipe, (void *)sys_clock_settime, (void *)sys_clock_gettime, (void *)sys_clock_getres, + (void *)sys_clone, /* 130 */ }; const void *lwp_get_sys_api(rt_uint32_t number) diff --git a/components/lwp/lwp_tid.c b/components/lwp/lwp_tid.c new file mode 100644 index 0000000000..8ecf90f5f1 --- /dev/null +++ b/components/lwp/lwp_tid.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-01-15 shaojinchun first version + */ + +#include +#include + +#include "lwp.h" + +#ifdef RT_USING_USERSPACE +#include "lwp_user_mm.h" + +#ifdef RT_USING_GDBSERVER +#include +#include +#endif + +#endif + +#define DBG_TAG "LWP_TID" +#define DBG_LVL DBG_INFO +#include + +static rt_thread_t lwp_tid_ary[LWP_TID_MAX_NR + 1]; +static rt_thread_t *lwp_tid_free_head = RT_NULL; +static int lwp_tid_ary_alloced = 1; /* 0 保留 */ + +int lwp_tid_get(void) +{ + int ret = 0; + rt_base_t level = rt_hw_interrupt_disable(); + rt_thread_t *p = lwp_tid_free_head; + + if (p) + { + lwp_tid_free_head = (rt_thread_t*)*p; + } + else if (lwp_tid_ary_alloced < LWP_TID_MAX_NR) + { + p = lwp_tid_ary + lwp_tid_ary_alloced; + lwp_tid_ary_alloced++; + } + if (p) + { + *p = RT_NULL; + ret = p - lwp_tid_ary; + } + rt_hw_interrupt_enable(level); + return ret; +} + +void lwp_tid_put(int tid) +{ + rt_thread_t *p = RT_NULL; + rt_base_t level = rt_hw_interrupt_disable(); + + if (tid > 0 && tid < LWP_TID_MAX_NR) + { + p = lwp_tid_ary + tid; + *p = (rt_thread_t)lwp_tid_free_head; + lwp_tid_free_head = p; + } + rt_hw_interrupt_enable(level); +} + +rt_thread_t lwp_tid_get_thread(int tid) +{ + rt_thread_t thread = RT_NULL; + + if (tid > 0 && tid < LWP_TID_MAX_NR) + { + thread = lwp_tid_free_head[tid]; + } + return thread; +} + +void lwp_tid_set_thread(int tid, rt_thread_t thread) +{ + if (tid > 0 && tid < LWP_TID_MAX_NR) + { + lwp_tid_ary[tid] = thread; + } +} diff --git a/include/rtdef.h b/include/rtdef.h index 542a586ee1..079db2ccf1 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -734,6 +734,8 @@ struct rt_thread int debug_suspend; struct rt_hw_exp_stack *regs; void * thread_idr; /** lwp thread indicator */ + int tid; + int *clear_child_tid; #endif #endif -- Gitee From 5256733d1f4a794ee3a63594c4d73132538f1018 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Mon, 18 Jan 2021 16:56:03 +0800 Subject: [PATCH 2/7] add futex support --- components/libc/time/SConscript | 5 +- components/libc/time/clock_time.h | 2 + components/lwp/lwp.c | 26 ++-- components/lwp/lwp.h | 4 + components/lwp/lwp_futex.c | 218 ++++++++++++++++++++++++++++++ components/lwp/lwp_syscall.c | 26 +++- 6 files changed, 265 insertions(+), 16 deletions(-) create mode 100644 components/lwp/lwp_futex.c diff --git a/components/libc/time/SConscript b/components/libc/time/SConscript index 4ecd5d24bc..a3b74c6158 100644 --- a/components/libc/time/SConscript +++ b/components/libc/time/SConscript @@ -6,7 +6,10 @@ cwd = GetCurrentDir() src = Glob('*.c') + Glob('*.cpp') CPPPATH = [cwd] +#group = DefineGroup('pthreads', src, +# depend = ['RT_USING_PTHREADS'], CPPPATH = CPPPATH) + group = DefineGroup('pthreads', src, - depend = ['RT_USING_PTHREADS'], CPPPATH = CPPPATH) + depend = [''], CPPPATH = CPPPATH) Return('group') diff --git a/components/libc/time/clock_time.h b/components/libc/time/clock_time.h index 16b2306f4b..0909d79613 100644 --- a/components/libc/time/clock_time.h +++ b/components/libc/time/clock_time.h @@ -45,6 +45,8 @@ int clock_getres (clockid_t clockid, struct timespec *res); int clock_gettime (clockid_t clockid, struct timespec *tp); int clock_settime (clockid_t clockid, const struct timespec *tp); +int clock_time_to_tick(const struct timespec *time); + #ifdef __cplusplus } #endif diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index dd8d4101df..fc199e7ec8 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -821,6 +821,7 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp) char *argv_last = argv[argc - 1]; int bg = 0; struct process_aux *aux; + int tid = 0; if (filename == RT_NULL) return -RT_ERROR; @@ -834,9 +835,15 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp) } LOG_D("lwp malloc : %p, size: %d!", lwp, sizeof(struct rt_lwp)); + if ((tid = lwp_tid_get()) == 0) + { + lwp_ref_dec(lwp); + return -ENOMEM; + } #ifdef RT_USING_USERSPACE if (lwp_user_space_init(lwp) != 0) { + lwp_tid_put(tid); lwp_ref_dec(lwp); return -ENOMEM; } @@ -850,6 +857,7 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp) if ((aux = lwp_argscopy(lwp, argc, argv, envp)) == RT_NULL) { + lwp_tid_put(tid); lwp_ref_dec(lwp); return -ENOMEM; } @@ -857,7 +865,7 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp) result = lwp_load(filename, lwp, RT_NULL, 0, aux); if (result == RT_EOK) { - rt_thread_t tid; + rt_thread_t thread = RT_NULL; lwp_copy_stdio_fdt(lwp); @@ -865,14 +873,15 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp) thread_name = strrchr(filename, '/'); thread_name = thread_name ? thread_name + 1 : filename; - tid = rt_thread_create(thread_name, lwp_thread_entry, RT_NULL, + thread = rt_thread_create(thread_name, lwp_thread_entry, RT_NULL, 1024 * 4, 25, 200); - if (tid != RT_NULL) + if (thread != RT_NULL) { struct rt_lwp *lwp_self; - tid->tid = 0; - LOG_D("lwp kernel => (0x%08x, 0x%08x)\n", (rt_uint32_t)tid->stack_addr, (rt_uint32_t)tid->stack_addr + tid->stack_size); + thread->tid = tid; + lwp_tid_set_thread(tid, thread); + LOG_D("lwp kernel => (0x%08x, 0x%08x)\n", (rt_uint32_t)thread->stack_addr, (rt_uint32_t)thread->stack_addr + thread->stack_size); level = rt_hw_interrupt_disable(); lwp_self = (struct rt_lwp *)rt_thread_self()->lwp; if (lwp_self) @@ -882,8 +891,8 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp) lwp_self->first_child = lwp; lwp->parent = lwp_self; } - tid->lwp = lwp; - rt_list_insert_after(&lwp->t_grp, &tid->sibling); + thread->lwp = lwp; + rt_list_insert_after(&lwp->t_grp, &thread->sibling); #ifdef RT_USING_GDBSERVER if (debug) @@ -898,11 +907,12 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp) } rt_hw_interrupt_enable(level); - rt_thread_startup(tid); + rt_thread_startup(thread); return lwp_to_pid(lwp); } } + lwp_tid_put(tid); lwp_ref_dec(lwp); return -RT_ERROR; diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h index 3c5fa7b9ee..12842e6bc6 100644 --- a/components/lwp/lwp.h +++ b/components/lwp/lwp.h @@ -169,6 +169,10 @@ struct __pthread { }; #endif +/* for futex op */ +#define FUTEX_WAIT 0 +#define FUTEX_WAKE 1 + #ifdef __cplusplus } #endif diff --git a/components/lwp/lwp_futex.c b/components/lwp/lwp_futex.c new file mode 100644 index 0000000000..0f0bd1da3f --- /dev/null +++ b/components/lwp/lwp_futex.c @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021/01/02 bernard the first version + */ + +#include +#include +#ifdef RT_USING_USERSPACE +#include +#endif +#include "clock_time.h" + +struct rt_futex +{ + int *uaddr; + + rt_list_t list; + struct rt_lwp *lwp; + rt_list_t waiting_thread; +}; +static rt_list_t _futex_list = RT_LIST_OBJECT_INIT(_futex_list); + +struct rt_futex* futex_create(int *uaddr, struct rt_lwp *lwp) +{ + struct rt_futex *futex = RT_NULL; + + futex = (struct rt_futex *)rt_malloc(sizeof(struct rt_futex)); + if (futex) + { + futex->uaddr = uaddr; + futex->lwp = lwp; + + rt_list_init(&(futex->list)); + rt_list_init(&(futex->waiting_thread)); + + /* insert into futex list */ + rt_list_insert_before(&_futex_list, &(futex->list)); + } + return futex; +} + +void futex_destory(struct rt_futex *futex) +{ + rt_base_t level = 0; + + if (futex) + { + level = rt_hw_interrupt_disable(); + /* remove futex from list */ + rt_list_remove(&(futex->list)); + rt_hw_interrupt_enable(level); + + /* wakeup all threads in suspending list */ + + /* release object */ + rt_free(futex); + } + + return ; +} + +static struct rt_futex* futex_get(void *uaddr, struct rt_lwp *lwp) +{ + rt_base_t level = 0; + struct rt_futex *futex = RT_NULL; + rt_list_t *node; + + level = rt_hw_interrupt_disable(); + + rt_list_for_each(node, &_futex_list) + { + futex = rt_list_entry(node, struct rt_futex, list); + + if (futex->uaddr == uaddr && futex->lwp == lwp) break; + } + rt_hw_interrupt_enable(level); + + /* no this futex in the list */ + if (node == &_futex_list) futex = RT_NULL; + + return futex; +} + +int futex_wait(struct rt_futex *futex, int value, const struct timespec *timeout) +{ + rt_base_t level = 0; + rt_err_t ret = -RT_EINTR; + + level = rt_hw_interrupt_disable(); + if (*(futex->uaddr) == value) + { + rt_thread_t thread = rt_thread_self(); + + ret = rt_thread_suspend_with_flag(thread, RT_INTERRUPTIBLE); + + if (ret < 0) + { + rt_hw_interrupt_enable(level); + rt_set_errno(EINTR); + return ret; + } + + /* add into waiting thread list */ + rt_list_insert_before(&(futex->waiting_thread), &(thread->tlist)); + + /* with timeout */ + if (timeout) + { + rt_int32_t time = clock_time_to_tick(timeout); + + /* start the timer of thread */ + rt_timer_control(&(thread->thread_timer), + RT_TIMER_CTRL_SET_TIME, + &time); + rt_timer_start(&(thread->thread_timer)); + } + rt_hw_interrupt_enable(level); + + /* do schedule */ + rt_schedule(); + + ret = thread->error; + /* check errno */ + } + else + { + rt_hw_interrupt_enable(level); + rt_set_errno(EAGAIN); + } + + return ret; +} + +void futex_wake(struct rt_futex *futex, int number) +{ + rt_base_t level = 0; + + level = rt_hw_interrupt_disable(); + while (!rt_list_isempty(&(futex->waiting_thread)) && number) + { + rt_thread_t thread; + + thread = rt_list_entry(futex->waiting_thread.next, struct rt_thread, tlist); + /* remove from waiting list */ + rt_list_remove(&(thread->list)); + + thread->error = RT_EOK; + /* resume the suspended thread */ + rt_thread_resume(thread); + + number --; + } + rt_hw_interrupt_enable(level); + + /* do schedule */ + rt_schedule(); +} + +int sys_futex(int *uaddr, int op, int val, const struct timespec *timeout, + int *uaddr2, int val3) +{ + rt_base_t level = 0; + struct rt_futex *futex = RT_NULL; + struct rt_lwp *lwp = lwp_self(); + int ret = 0; + + if (!lwp_user_accessable(uaddr, sizeof(int))) + { + rt_set_errno(EINVAL); + return -RT_EINVAL; + } + if (timeout) + { + if (!lwp_user_accessable((void *)timeout, sizeof(struct timespec))) + { + rt_set_errno(EINVAL); + return -RT_EINVAL; + } + } + + level = rt_hw_interrupt_disable(); + futex = futex_get(uaddr, lwp); + if (futex == RT_NULL) + { + /* create a futex according to this uaddr */ + futex = futex_create(uaddr, lwp); + if (futex == RT_NULL) + { + rt_hw_interrupt_enable(level); + rt_set_errno(ENOMEM); + return -RT_ENOMEM; + } + } + rt_hw_interrupt_enable(level); + + switch (op) + { + case FUTEX_WAIT: + ret = futex_wait(futex, val, timeout); + break; + + case FUTEX_WAKE: + futex_wake(futex, val); + break; + + default: + rt_set_errno(ENOSYS); + ret = -ENOSYS; + break; + } + + return ret; +} diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 9fa51b235d..2f361448d8 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -368,6 +368,7 @@ void sys_exit(int value) tid->clear_child_tid = RT_NULL; lwp_put_to_user(clear_child_tid, &t, sizeof t); + sys_futex(tid->clear_child_tid, FUTEX_WAKE, 1, RT_NULL, RT_NULL, 0); } main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling); if (main_thread == tid) @@ -1142,10 +1143,11 @@ void *lwp_map_user(struct rt_lwp *lwp, void *map_va, size_t map_size); rt_thread_t sys_thread_create(void *arg[]) { - rt_base_t level; + rt_base_t level = 0; void *user_stack = 0; struct rt_lwp *lwp = 0; - rt_thread_t thread; + rt_thread_t thread = RT_NULL; + int tid = 0; lwp = rt_thread_self()->lwp; lwp_ref_inc(lwp); @@ -1159,6 +1161,11 @@ rt_thread_t sys_thread_create(void *arg[]) rt_set_errno(EINVAL); goto fail; } + if ((tid = lwp_tid_get()) == 0) + { + rt_set_errno(ENOMEM); + goto fail; + } thread = rt_thread_create((const char*)arg[0], lwp_user_thread, (void*)arg[2], @@ -1175,7 +1182,8 @@ rt_thread_t sys_thread_create(void *arg[]) thread->user_stack = (void *)user_stack; thread->user_stack_size = (uint32_t)arg[3]; thread->lwp = (void*)lwp; - thread->tid = 0; + thread->tid = tid; + lwp_tid_set_thread(tid, thread); level = rt_hw_interrupt_disable(); rt_list_insert_after(&lwp->t_grp, &thread->sibling); @@ -1184,6 +1192,7 @@ rt_thread_t sys_thread_create(void *arg[]) return thread; fail: + lwp_tid_put(tid); #ifndef RT_USING_USERSPACE if (user_stack) { @@ -1233,11 +1242,11 @@ fail: int lwp_set_thread_context(void *new_thread_stack, void *origin_thread_stack, void *user_stack, void **thread_sp, int tid); long sys_clone(void *arg[]) { - rt_base_t level; + rt_base_t level = 0; struct rt_lwp *lwp = 0; rt_thread_t thread = RT_NULL; rt_thread_t self = RT_NULL; - int tid = -1; + int tid = 0; unsigned long flags = 0; void *user_stack = RT_NULL; @@ -1285,7 +1294,7 @@ long sys_clone(void *arg[]) rt_set_errno(EINVAL); goto fail; } - if ((tid = lwp_tid_get()) == -1) + if ((tid = lwp_tid_get()) == 0) { rt_set_errno(ENOMEM); goto fail; @@ -2363,7 +2372,7 @@ int sys_set_thread_area(void *p) return 0; } -long sys_set_tid_address(int *tidptr) +int sys_set_tid_address(int *tidptr) { rt_thread_t thread = rt_thread_self(); @@ -2504,6 +2513,8 @@ int sys_clock_getres(clockid_t clk, struct timespec *ts) return 0; } +int sys_futex(int *uaddr, int op, int val, void *timeout, void *uaddr2, int val3); + const static void* func_table[] = { (void*)sys_exit, /* 01 */ @@ -2652,6 +2663,7 @@ const static void* func_table[] = (void *)sys_clock_gettime, (void *)sys_clock_getres, (void *)sys_clone, /* 130 */ + (void *)sys_futex, }; const void *lwp_get_sys_api(rt_uint32_t number) -- Gitee From 8540d5df0e33f780cc0755f36bcd04968bd04c63 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Wed, 20 Jan 2021 08:37:09 +0800 Subject: [PATCH 3/7] =?UTF-8?q?futex=E5=AF=B9=E8=B1=A1=E9=93=BE=E8=A1=A8?= =?UTF-8?q?=E8=BD=AC=E8=87=B3lwp=E7=BB=93=E6=9E=84=E4=BD=93=E5=86=85?= =?UTF-8?q?=E9=83=A8=EF=BC=8C=E5=B9=B6=E5=AE=9E=E7=8E=B0=E5=85=B6=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E8=87=AA=E5=8A=A8=E9=87=8A=E6=94=BE=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp.h | 5 ++ components/lwp/lwp_custom_object.c | 62 +++++++++++++++++++ components/lwp/lwp_futex.c | 98 ++++++++++++++++++------------ components/lwp/lwp_pid.c | 4 ++ include/rtdef.h | 3 +- 5 files changed, 133 insertions(+), 39 deletions(-) create mode 100644 components/lwp/lwp_custom_object.c diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h index 12842e6bc6..b78f128fcc 100644 --- a/components/lwp/lwp.h +++ b/components/lwp/lwp.h @@ -92,6 +92,7 @@ struct rt_lwp struct rt_wqueue wait_queue; /*for console */ + rt_list_t futex_list; #ifdef RT_USING_GDBSERVER int debug; uint32_t bak_first_ins; @@ -173,6 +174,10 @@ struct __pthread { #define FUTEX_WAIT 0 #define FUTEX_WAKE 1 +/* custom object */ +struct rt_object *lwp_custom_object_create(struct rt_lwp *lwp, void *data, void (*data_destroy)(void *)); +void lwp_custom_object_destroy(struct rt_object *obj); + #ifdef __cplusplus } #endif diff --git a/components/lwp/lwp_custom_object.c b/components/lwp/lwp_custom_object.c new file mode 100644 index 0000000000..08756c2bd1 --- /dev/null +++ b/components/lwp/lwp_custom_object.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021/01/19 shaojinchun the first version + */ + +#include +#include + +struct lwp_custom_object +{ + struct rt_object parent; + void (*destroy)(void *); + void *data; +}; + +struct rt_object *lwp_custom_object_create(struct rt_lwp *lwp, void *data, void (*data_destroy)(void *)) +{ + rt_base_t level = 0; + struct lwp_custom_object *cobj = RT_NULL; + + if (!lwp) + { + return RT_NULL; + } + cobj = (struct lwp_custom_object *)rt_malloc(sizeof *cobj); + if (!cobj) + { + return RT_NULL; + } + cobj->destroy = data_destroy; + cobj->data = data; + cobj->parent.type = RT_Object_Class_Custom; + rt_list_init(&cobj->parent.lwp_obj_list); + level = rt_hw_interrupt_disable(); + rt_list_insert_after(&lwp->object_list, &cobj->parent.lwp_obj_list); + rt_hw_interrupt_enable(level); + return (struct rt_object *)cobj; +} + +void lwp_custom_object_destroy(struct rt_object *obj) +{ + rt_base_t level = 0; + struct lwp_custom_object *cobj = (struct lwp_custom_object *)obj; + + if (!obj || obj->type != RT_Object_Class_Custom) + { + return; + } + level = rt_hw_interrupt_disable(); + rt_list_remove(&cobj->parent.lwp_obj_list); + rt_hw_interrupt_enable(level); + if (cobj->destroy) + { + cobj->destroy(cobj->data); + } + rt_free(cobj); +} diff --git a/components/lwp/lwp_futex.c b/components/lwp/lwp_futex.c index 0f0bd1da3f..bca53a29ec 100644 --- a/components/lwp/lwp_futex.c +++ b/components/lwp/lwp_futex.c @@ -18,35 +18,23 @@ struct rt_futex { int *uaddr; - rt_list_t list; - struct rt_lwp *lwp; rt_list_t waiting_thread; }; -static rt_list_t _futex_list = RT_LIST_OBJECT_INIT(_futex_list); -struct rt_futex* futex_create(int *uaddr, struct rt_lwp *lwp) -{ - struct rt_futex *futex = RT_NULL; +static struct rt_mutex _futex_lock; - futex = (struct rt_futex *)rt_malloc(sizeof(struct rt_futex)); - if (futex) - { - futex->uaddr = uaddr; - futex->lwp = lwp; - - rt_list_init(&(futex->list)); - rt_list_init(&(futex->waiting_thread)); - - /* insert into futex list */ - rt_list_insert_before(&_futex_list, &(futex->list)); - } - return futex; +static int futex_system_init(void) +{ + rt_mutex_init(&_futex_lock, "futexList", RT_IPC_FLAG_FIFO); + return 0; } +INIT_PREV_EXPORT(futex_system_init); -void futex_destory(struct rt_futex *futex) +void futex_destory(void *data) { rt_base_t level = 0; + struct rt_futex *futex = (struct rt_futex *)data; if (futex) { @@ -55,8 +43,6 @@ void futex_destory(struct rt_futex *futex) rt_list_remove(&(futex->list)); rt_hw_interrupt_enable(level); - /* wakeup all threads in suspending list */ - /* release object */ rt_free(futex); } @@ -64,24 +50,50 @@ void futex_destory(struct rt_futex *futex) return ; } +struct rt_futex* futex_create(int *uaddr, struct rt_lwp *lwp) +{ + struct rt_futex *futex = RT_NULL; + struct rt_object *obj = RT_NULL; + + if (!lwp) + { + return RT_NULL; + } + futex = (struct rt_futex *)rt_malloc(sizeof(struct rt_futex)); + if (!futex) + { + return RT_NULL; + } + obj = lwp_custom_object_create(lwp, (void *)futex, futex_destory); + if (!obj) + { + rt_free(futex); + return RT_NULL; + } + + futex->uaddr = uaddr; + rt_list_init(&(futex->list)); + rt_list_init(&(futex->waiting_thread)); + + /* insert into futex list */ + rt_list_insert_before(&lwp->futex_list, &(futex->list)); + return futex; +} + static struct rt_futex* futex_get(void *uaddr, struct rt_lwp *lwp) { - rt_base_t level = 0; struct rt_futex *futex = RT_NULL; rt_list_t *node; - level = rt_hw_interrupt_disable(); - - rt_list_for_each(node, &_futex_list) + rt_list_for_each(node, &lwp->futex_list) { futex = rt_list_entry(node, struct rt_futex, list); - if (futex->uaddr == uaddr && futex->lwp == lwp) break; + if (futex->uaddr == uaddr) break; } - rt_hw_interrupt_enable(level); /* no this futex in the list */ - if (node == &_futex_list) futex = RT_NULL; + if (node == &lwp->futex_list) futex = RT_NULL; return futex; } @@ -91,15 +103,16 @@ int futex_wait(struct rt_futex *futex, int value, const struct timespec *timeout rt_base_t level = 0; rt_err_t ret = -RT_EINTR; - level = rt_hw_interrupt_disable(); if (*(futex->uaddr) == value) { rt_thread_t thread = rt_thread_self(); + level = rt_hw_interrupt_disable(); ret = rt_thread_suspend_with_flag(thread, RT_INTERRUPTIBLE); if (ret < 0) { + rt_mutex_release(&_futex_lock); rt_hw_interrupt_enable(level); rt_set_errno(EINTR); return ret; @@ -119,6 +132,7 @@ int futex_wait(struct rt_futex *futex, int value, const struct timespec *timeout &time); rt_timer_start(&(thread->thread_timer)); } + rt_mutex_release(&_futex_lock); rt_hw_interrupt_enable(level); /* do schedule */ @@ -129,7 +143,6 @@ int futex_wait(struct rt_futex *futex, int value, const struct timespec *timeout } else { - rt_hw_interrupt_enable(level); rt_set_errno(EAGAIN); } @@ -138,9 +151,8 @@ int futex_wait(struct rt_futex *futex, int value, const struct timespec *timeout void futex_wake(struct rt_futex *futex, int number) { - rt_base_t level = 0; + rt_base_t level = rt_hw_interrupt_disable(); - level = rt_hw_interrupt_disable(); while (!rt_list_isempty(&(futex->waiting_thread)) && number) { rt_thread_t thread; @@ -155,6 +167,7 @@ void futex_wake(struct rt_futex *futex, int number) number --; } + rt_mutex_release(&_futex_lock); rt_hw_interrupt_enable(level); /* do schedule */ @@ -164,10 +177,10 @@ void futex_wake(struct rt_futex *futex, int number) int sys_futex(int *uaddr, int op, int val, const struct timespec *timeout, int *uaddr2, int val3) { - rt_base_t level = 0; + struct rt_lwp *lwp = RT_NULL; struct rt_futex *futex = RT_NULL; - struct rt_lwp *lwp = lwp_self(); int ret = 0; + rt_err_t lock_ret = 0; if (!lwp_user_accessable(uaddr, sizeof(int))) { @@ -183,7 +196,14 @@ int sys_futex(int *uaddr, int op, int val, const struct timespec *timeout, } } - level = rt_hw_interrupt_disable(); + lock_ret = rt_mutex_take_interruptible(&_futex_lock, RT_WAITING_FOREVER); + if (lock_ret != RT_EOK) + { + rt_set_errno(EAGAIN); + return -RT_EINTR; + } + + lwp = lwp_self(); futex = futex_get(uaddr, lwp); if (futex == RT_NULL) { @@ -191,24 +211,26 @@ int sys_futex(int *uaddr, int op, int val, const struct timespec *timeout, futex = futex_create(uaddr, lwp); if (futex == RT_NULL) { - rt_hw_interrupt_enable(level); + rt_mutex_release(&_futex_lock); rt_set_errno(ENOMEM); return -RT_ENOMEM; } } - rt_hw_interrupt_enable(level); switch (op) { case FUTEX_WAIT: ret = futex_wait(futex, val, timeout); + /* _futex_lock is released by futex_wait */ break; case FUTEX_WAKE: futex_wake(futex, val); + /* _futex_lock is released by futex_wake */ break; default: + rt_mutex_release(&_futex_lock); rt_set_errno(ENOSYS); ret = -ENOSYS; break; diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index e13c6f33aa..5fe7416258 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -111,6 +111,7 @@ struct rt_lwp* lwp_new(void) pid_struct.pidmap[i] = lwp; rt_list_init(&lwp->t_grp); rt_list_init(&lwp->object_list); + rt_list_init(&lwp->futex_list); rt_wqueue_init(&lwp->wait_queue); lwp->ref = 1; @@ -168,6 +169,9 @@ static void lwp_user_obj_free(struct rt_lwp *lwp) break; case RT_Object_Class_Channel: break; + case RT_Object_Class_Custom: + lwp_custom_object_destroy(object); + break; default: LOG_E("input object type(%d) error", object->type); break; diff --git a/include/rtdef.h b/include/rtdef.h index 079db2ccf1..c25723b745 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -404,7 +404,8 @@ enum rt_object_class_type RT_Object_Class_Timer = 0x0a, /**< The object is a timer. */ RT_Object_Class_Module = 0x0b, /**< The object is a module. */ RT_Object_Class_Channel = 0x0c, /**< The object is a channel */ - RT_Object_Class_Unknown = 0x0d, /**< The object is unknown. */ + RT_Object_Class_Custom = 0x0d, /**< The object is a custom object */ + RT_Object_Class_Unknown = 0x0e, /**< The object is unknown. */ RT_Object_Class_Static = 0x80 /**< The object is a static object. */ }; -- Gitee From 4a66d71d35b1d8745c07947487b167a8c30d71bd Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Wed, 20 Jan 2021 08:38:12 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=8D=E5=BA=94?= =?UTF-8?q?=E8=BF=9B=E5=85=A5git=E4=BB=93=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ bsp/qemu-vexpress-a9/applications/romfs.c | 16 ---------------- bsp/qemu-vexpress-a9/gdb.init | 3 --- 3 files changed, 3 insertions(+), 19 deletions(-) delete mode 100644 bsp/qemu-vexpress-a9/applications/romfs.c delete mode 100644 bsp/qemu-vexpress-a9/gdb.init diff --git a/.gitignore b/.gitignore index 2f02054dcb..c11f346312 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,6 @@ ncscope.* #ctag files tags +#romfs data +romfs.c +cromfs.c diff --git a/bsp/qemu-vexpress-a9/applications/romfs.c b/bsp/qemu-vexpress-a9/applications/romfs.c deleted file mode 100644 index c28ba8ea7f..0000000000 --- a/bsp/qemu-vexpress-a9/applications/romfs.c +++ /dev/null @@ -1,16 +0,0 @@ -/* Generated by mkromfs. Edit with caution. */ -#include -#include - - - - - -static const struct romfs_dirent _romfs_root[] = { - {ROMFS_DIRENT_DIR, "etc", RT_NULL, 0}, - {ROMFS_DIRENT_DIR, "mnt", RT_NULL, 0} -}; - -const struct romfs_dirent romfs_root = { - ROMFS_DIRENT_DIR, "/", (rt_uint8_t *)_romfs_root, sizeof(_romfs_root)/sizeof(_romfs_root[0]) -}; diff --git a/bsp/qemu-vexpress-a9/gdb.init b/bsp/qemu-vexpress-a9/gdb.init deleted file mode 100644 index b16f519fc6..0000000000 --- a/bsp/qemu-vexpress-a9/gdb.init +++ /dev/null @@ -1,3 +0,0 @@ -target remote localhost:1234 -b *0x100010 -add-symbol-file ../../../userapps/gnu-apps/wget/wget-1.20/src/wget 0x100000 -- Gitee From e2e1b0e19219e5b0596409c2e52e943574751fc9 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Wed, 20 Jan 2021 08:59:34 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=86LWP=5FTID=5FMAX=5FNR=E9=80=89=E9=A1=B9=E7=9A=84qemu?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/qemu-vexpress-a9/.config | 13 ++++++++++++- bsp/qemu-vexpress-a9/rtconfig.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/bsp/qemu-vexpress-a9/.config b/bsp/qemu-vexpress-a9/.config index 3a3fa62497..aa5987defd 100644 --- a/bsp/qemu-vexpress-a9/.config +++ b/bsp/qemu-vexpress-a9/.config @@ -172,6 +172,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_ADC is not set # CONFIG_RT_USING_DAC is not set # CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set CONFIG_RT_USING_RANDOM=y # CONFIG_RT_USING_PWM is not set CONFIG_RT_USING_MTD_NOR=y @@ -337,6 +338,7 @@ CONFIG_RT_LWP_MAX_NR=30 CONFIG_RT_CH_MSG_MAX_NR=1024 CONFIG_RT_LWP_SHM_MAX_NR=64 CONFIG_LWP_CONSOLE_INPUT_BUFFER_SIZE=1024 +CONFIG_LWP_TID_MAX_NR=64 # # RT-Thread online packages @@ -420,6 +422,7 @@ CONFIG_LWP_CONSOLE_INPUT_BUFFER_SIZE=1024 # CONFIG_PKG_USING_PDULIB is not set # CONFIG_PKG_USING_BTSTACK is not set # CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set # # security packages @@ -472,6 +475,8 @@ CONFIG_LWP_CONSOLE_INPUT_BUFFER_SIZE=1024 # CONFIG_PKG_USING_UMCN is not set # CONFIG_PKG_USING_LWRB2RTT is not set # CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set # # system packages @@ -510,6 +515,7 @@ CONFIG_LWP_CONSOLE_INPUT_BUFFER_SIZE=1024 # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set # CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set # # peripheral libraries and drivers @@ -567,6 +573,9 @@ CONFIG_LWP_CONSOLE_INPUT_BUFFER_SIZE=1024 # CONFIG_PKG_USING_SSD1306 is not set # CONFIG_PKG_USING_QKEY is not set # CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set # # miscellaneous packages @@ -576,6 +585,7 @@ CONFIG_LWP_CONSOLE_INPUT_BUFFER_SIZE=1024 # CONFIG_PKG_USING_FASTLZ is not set # CONFIG_PKG_USING_MINILZO is not set # CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set # CONFIG_PKG_USING_MULTIBUTTON is not set # CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set # CONFIG_PKG_USING_CANFESTIVAL is not set @@ -654,9 +664,10 @@ CONFIG_LWP_CONSOLE_INPUT_BUFFER_SIZE=1024 # CONFIG_PKG_USING_EMQ is not set # CONFIG_PKG_USING_CFGM is not set # CONFIG_PKG_USING_RT_CMSIS_DAP is not set -# CONFIG_PKG_USING_VIRTUAL_DEVICE is not set # CONFIG_PKG_USING_SMODULE is not set # CONFIG_PKG_USING_SNFD is not set +# CONFIG_PKG_USING_UDBD is not set +# CONFIG_PKG_USING_BENCHMARK is not set CONFIG_SOC_VEXPRESS_A9=y CONFIG_RT_USING_UART0=y CONFIG_RT_USING_UART1=y diff --git a/bsp/qemu-vexpress-a9/rtconfig.h b/bsp/qemu-vexpress-a9/rtconfig.h index c429182d6c..00373d25e7 100644 --- a/bsp/qemu-vexpress-a9/rtconfig.h +++ b/bsp/qemu-vexpress-a9/rtconfig.h @@ -232,6 +232,7 @@ #define RT_CH_MSG_MAX_NR 1024 #define RT_LWP_SHM_MAX_NR 64 #define LWP_CONSOLE_INPUT_BUFFER_SIZE 1024 +#define LWP_TID_MAX_NR 64 /* RT-Thread online packages */ -- Gitee From 04a27757526270f030a4b27d1dd073b22e03a8f1 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Wed, 20 Jan 2021 09:31:53 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E6=B6=88=E9=99=A4=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp_futex.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/lwp/lwp_futex.c b/components/lwp/lwp_futex.c index bca53a29ec..8b32abde53 100644 --- a/components/lwp/lwp_futex.c +++ b/components/lwp/lwp_futex.c @@ -83,7 +83,7 @@ struct rt_futex* futex_create(int *uaddr, struct rt_lwp *lwp) static struct rt_futex* futex_get(void *uaddr, struct rt_lwp *lwp) { struct rt_futex *futex = RT_NULL; - rt_list_t *node; + rt_list_t *node = RT_NULL; rt_list_for_each(node, &lwp->futex_list) { -- Gitee From 7b76d73ed6a64d5be97a6308c5893823e5faec44 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Wed, 20 Jan 2021 11:08:08 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=B8=8D=E5=AE=9A?= =?UTF-8?q?=E4=B9=89RT=5FUSING=5FSIGNALS=E6=97=B6=E7=9A=84=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/rtdef.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/rtdef.h b/include/rtdef.h index c25723b745..c7424b9700 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -496,6 +496,13 @@ typedef void (*rt_sighandler_t)(int signo); typedef siginfo_t rt_siginfo_t; #define RT_SIG_MAX 32 + +#else + +#ifdef RT_USING_LWP +#include +#endif + #endif /**@}*/ -- Gitee