diff options
| author | geniusgogo <[email protected]> | 2023-08-08 00:22:14 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-08-07 12:22:14 -0400 |
| commit | 4d20416b2f62cbb6c98e88223d6a0d1638b7f1c0 (patch) | |
| tree | 6cb74da348244a1b1584d08faf9e02294d92d139 /components/lwp | |
| parent | 7e7b303dd475f71c3301fb494f7622fe0295435e (diff) | |
update components & lwp. (#7888)
Diffstat (limited to 'components/lwp')
| -rw-r--r-- | components/lwp/lwp.c | 14 | ||||
| -rw-r--r-- | components/lwp/lwp.h | 4 | ||||
| -rw-r--r-- | components/lwp/lwp_ipc.c | 1 | ||||
| -rw-r--r-- | components/lwp/lwp_pid.c | 5 | ||||
| -rw-r--r-- | components/lwp/lwp_sys_socket.h | 39 | ||||
| -rw-r--r-- | components/lwp/lwp_syscall.c | 183 |
6 files changed, 231 insertions, 15 deletions
diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index c27f4ca172..96ebdd866c 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -1403,3 +1403,17 @@ void lwp_user_setting_restore(rt_thread_t thread) } } #endif /* ARCH_MM_MMU */ + +void lwp_uthread_ctx_save(void *ctx) +{ + rt_thread_t thread; + thread = rt_thread_self(); + thread->user_ctx.ctx = ctx; +} + +void lwp_uthread_ctx_restore(void) +{ + rt_thread_t thread; + thread = rt_thread_self(); + thread->user_ctx.ctx = RT_NULL; +} diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h index 2924a99c81..841ce7725e 100644 --- a/components/lwp/lwp.h +++ b/components/lwp/lwp.h @@ -164,6 +164,10 @@ void lwp_aspace_switch(struct rt_thread *thread); #endif void lwp_user_setting_save(rt_thread_t thread); void lwp_user_setting_restore(rt_thread_t thread); + +void lwp_uthread_ctx_save(void *ctx); +void lwp_uthread_ctx_restore(void); + int lwp_setaffinity(pid_t pid, int cpu); /* ctime lwp API */ diff --git a/components/lwp/lwp_ipc.c b/components/lwp/lwp_ipc.c index a4b560e264..60e216565c 100644 --- a/components/lwp/lwp_ipc.c +++ b/components/lwp/lwp_ipc.c @@ -980,6 +980,7 @@ int lwp_channel_open(int fdt_type, const char *name, int flags) { /* initialize vnode */ dfs_vnode_init(d->vnode, FT_USER, &channel_fops); + d->flags = O_RDWR; /* set flags as read and write */ /* set socket to the data of dfs_file */ d->vnode->data = (void *)ch; diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index 82185adf34..79f4e2ec0f 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -106,6 +106,11 @@ static void lwp_pid_put(pid_t pid) rt_base_t level; struct lwp_avl_struct *p; + if (pid == 0) + { + return; + } + level = rt_hw_interrupt_disable(); p = lwp_avl_find(pid, lwp_pid_root); if (p) diff --git a/components/lwp/lwp_sys_socket.h b/components/lwp/lwp_sys_socket.h index ea73082c31..527d5ebbe8 100644 --- a/components/lwp/lwp_sys_socket.h +++ b/components/lwp/lwp_sys_socket.h @@ -94,4 +94,43 @@ #define INTF_IPV6_V6ONLY 26 #define IMPL_IPV6_V6ONLY 27 +struct musl_sockaddr +{ + uint16_t sa_family; + char sa_data[14]; +}; + +struct musl_ifmap { + unsigned long int mem_start; + unsigned long int mem_end; + unsigned short int base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct musl_ifreq +{ + union + { +#define IFNAMSIZ 16 + char ifrn_name[IFNAMSIZ]; + } ifr_ifrn; + union + { + struct musl_sockaddr ifru_addr; + struct musl_sockaddr ifru_dstaddr; + struct musl_sockaddr ifru_broadaddr; + struct musl_sockaddr ifru_netmask; + struct musl_sockaddr ifru_hwaddr; + short int ifru_flags; + int ifru_ivalue; + int ifru_mtu; + struct musl_ifmap ifru_map; + char ifru_slave[IFNAMSIZ]; + char ifru_newname[IFNAMSIZ]; + char *ifru_data; + } ifr_ifru; +}; + #endif /* __LWP_SYS_SOCKET_H__ */ diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index bffd951a56..547d333f48 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -103,12 +103,6 @@ #error "No definition RT_USING_POSIX_CLOCK" #endif /* RT_USING_POSIX_CLOCK */ -struct musl_sockaddr -{ - uint16_t sa_family; - char sa_data[14]; -}; - void lwp_cleanup(struct rt_thread *tid); #ifdef ARCH_MM_MMU @@ -551,7 +545,7 @@ sysret_t sys_open(const char *name, int flag, ...) #endif } -/* syscall: "open" ret: "int" args: "const char *" "mode_t" "mode" */ +/* syscall: "openat" ret: "int" args: "const char *" "mode_t" "mode" */ sysret_t sys_openat(int dirfd, const char *name, int flag, mode_t mode) { #ifdef ARCH_MM_MMU @@ -4684,6 +4678,12 @@ sysret_t sys_sched_setparam(pid_t pid, void *param) return ret; } +sysret_t sys_sched_yield(void) +{ + rt_thread_yield(); + return 0; +} + sysret_t sys_sched_getparam(pid_t pid, void *param) { struct sched_param *sched_param = (struct sched_param *)param; @@ -5378,7 +5378,154 @@ sysret_t sys_epoll_pwait(int fd, return (ret < 0 ? GET_ERRNO() : ret); } -static const struct rt_syscall_def func_table[] = +sysret_t sys_chmod(const char *fileName, mode_t mode) +{ + char *copy_fileName; + size_t len_fileName, copy_len_fileName; + int err_fileName; +#ifdef RT_USING_DFS_V2 + struct dfs_attr attr; + attr.st_mode = mode; +#endif + int ret = 0; + + len_fileName = lwp_user_strlen(fileName, &err_fileName); + if (err_fileName) + { + return -EFAULT; + } + + copy_fileName = (char*)rt_malloc(len_fileName + 1); + if (!copy_fileName) + { + return -ENOMEM; + } + + copy_len_fileName = lwp_get_from_user(copy_fileName, (void *)fileName, len_fileName); + copy_fileName[copy_len_fileName] = '\0'; +#ifdef RT_USING_DFS_V2 + ret = dfs_file_setattr(copy_fileName, &attr); +#else + SET_ERRNO(EFAULT); +#endif + rt_free(copy_fileName); + + return (ret < 0 ? GET_ERRNO() : ret); +} + +sysret_t sys_reboot(int magic) +{ + rt_hw_cpu_reset(); + + return 0; +} + +ssize_t sys_pread64(int fd, void *buf, int size, off_t offset) +#ifdef RT_USING_DFS_V2 +{ + ssize_t pread(int fd, void *buf, size_t len, off_t offset); +#ifdef ARCH_MM_MMU + ssize_t ret = -1; + void *kmem = RT_NULL; + + if (!size) + { + return -EINVAL; + } + + if (!lwp_user_accessable((void *)buf, size)) + { + return -EFAULT; + } + kmem = kmem_get(size); + if (!kmem) + { + return -ENOMEM; + } + + ret = pread(fd, kmem, size, offset); + if (ret > 0) + { + lwp_put_to_user(buf, kmem, ret); + } + + if (ret < 0) + { + ret = GET_ERRNO(); + } + + kmem_put(kmem); + + return ret; +#else + if (!lwp_user_accessable((void *)buf, size)) + { + return -EFAULT; + } + + ssize_t ret = pread(fd, kmem, size, offset); + return (ret < 0 ? GET_ERRNO() : ret); +#endif +} +#else +{ + ssize_t ret = -ENOSYS; + return (ret < 0 ? GET_ERRNO() : ret); +} +#endif + +ssize_t sys_pwrite64(int fd, void *buf, int size, off_t offset) +#ifdef RT_USING_DFS_V2 +{ + ssize_t pwrite(int fd, const void *buf, size_t len, off_t offset); +#ifdef ARCH_MM_MMU + ssize_t ret = -1; + void *kmem = RT_NULL; + + if (!size) + { + return -EINVAL; + } + + if (!lwp_user_accessable((void *)buf, size)) + { + return -EFAULT; + } + kmem = kmem_get(size); + if (!kmem) + { + return -ENOMEM; + } + + lwp_get_from_user(kmem, (void *)buf, size); + + ret = pwrite(fd, kmem, size, offset); + if (ret < 0) + { + ret = GET_ERRNO(); + } + + kmem_put(kmem); + + return ret; +#else + if (!lwp_user_accessable((void *)buf, size)) + { + return -EFAULT; + } + + ssize_t ret = pwrite(fd, kmem, size, offset); + return (ret < 0 ? GET_ERRNO() : ret); +#endif +} +#else +{ + ssize_t ret = -ENOSYS; + return (ret < 0 ? GET_ERRNO() : ret); +} +#endif + +const static struct rt_syscall_def func_table[] = { SYSCALL_SIGN(sys_exit), /* 01 */ SYSCALL_SIGN(sys_read), @@ -5600,11 +5747,11 @@ static const struct rt_syscall_def func_table[] = SYSCALL_SIGN(sys_symlink), SYSCALL_SIGN(sys_getaffinity), /* 180 */ SYSCALL_SIGN(sys_sysinfo), - SYSCALL_SIGN(sys_notimpl), - SYSCALL_SIGN(sys_notimpl), - SYSCALL_SIGN(sys_notimpl), - SYSCALL_SIGN(sys_notimpl), /* 185 */ - SYSCALL_SIGN(sys_notimpl), + SYSCALL_SIGN(sys_chmod), + SYSCALL_SIGN(sys_reboot), + SYSCALL_SIGN(sys_sched_yield), + SYSCALL_SIGN(sys_pread64), /* 185 */ + SYSCALL_SIGN(sys_pwrite64), SYSCALL_SIGN(sys_sigpending), SYSCALL_SIGN(sys_sigtimedwait), SYSCALL_SIGN(sys_notimpl), @@ -5632,7 +5779,10 @@ const void *lwp_get_sys_api(rt_uint32_t number) } else { - LOG_I("Unimplement syscall %d", number); + if (__sys_log_enable) + { + LOG_I("Unimplement syscall %d", number); + } } } @@ -5656,7 +5806,10 @@ const char *lwp_get_syscall_name(rt_uint32_t number) } else { - LOG_I("Unimplement syscall %d", number); + if (__sys_log_enable) + { + LOG_I("Unimplement syscall %d", number); + } } } |
