summaryrefslogtreecommitdiff
path: root/components/lwp
diff options
context:
space:
mode:
authorgeniusgogo <[email protected]>2023-08-08 00:22:14 +0800
committerGitHub <[email protected]>2023-08-07 12:22:14 -0400
commit4d20416b2f62cbb6c98e88223d6a0d1638b7f1c0 (patch)
tree6cb74da348244a1b1584d08faf9e02294d92d139 /components/lwp
parent7e7b303dd475f71c3301fb494f7622fe0295435e (diff)
update components & lwp. (#7888)
Diffstat (limited to 'components/lwp')
-rw-r--r--components/lwp/lwp.c14
-rw-r--r--components/lwp/lwp.h4
-rw-r--r--components/lwp/lwp_ipc.c1
-rw-r--r--components/lwp/lwp_pid.c5
-rw-r--r--components/lwp/lwp_sys_socket.h39
-rw-r--r--components/lwp/lwp_syscall.c183
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);
+ }
}
}