summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--components/dfs/src/dfs.c4
-rw-r--r--components/lwp/lwp_futex.c4
-rw-r--r--components/lwp/lwp_pmutex.c4
-rw-r--r--components/lwp/lwp_sys_socket.h97
-rw-r--r--components/lwp/lwp_syscall.c658
-rw-r--r--components/lwp/lwp_syscall.h89
-rw-r--r--components/lwp/syscall_generic.h (renamed from components/lwp/syscall_data.h)27
-rw-r--r--include/rtdef.h2
8 files changed, 465 insertions, 420 deletions
diff --git a/components/dfs/src/dfs.c b/components/dfs/src/dfs.c
index 5ec2c7bab9..e2928f5e1b 100644
--- a/components/dfs/src/dfs.c
+++ b/components/dfs/src/dfs.c
@@ -374,7 +374,7 @@ void fd_release(int fd)
fdt_fd_release(fdt, fd);
}
-int sys_dup(int oldfd)
+rt_err_t sys_dup(int oldfd)
{
int newfd = -1;
struct dfs_fdtable *fdt = NULL;
@@ -466,7 +466,7 @@ int fd_is_open(const char *pathname)
return -1;
}
-int sys_dup2(int oldfd, int newfd)
+rt_err_t sys_dup2(int oldfd, int newfd)
{
struct dfs_fdtable *fdt = NULL;
int ret = 0;
diff --git a/components/lwp/lwp_futex.c b/components/lwp/lwp_futex.c
index 06462baf61..49fe13861c 100644
--- a/components/lwp/lwp_futex.c
+++ b/components/lwp/lwp_futex.c
@@ -174,7 +174,9 @@ void futex_wake(struct rt_futex *futex, int number)
rt_schedule();
}
-int sys_futex(int *uaddr, int op, int val, const struct timespec *timeout,
+#include <syscall_generic.h>
+
+sysret_t sys_futex(int *uaddr, int op, int val, const struct timespec *timeout,
int *uaddr2, int val3)
{
struct rt_lwp *lwp = RT_NULL;
diff --git a/components/lwp/lwp_pmutex.c b/components/lwp/lwp_pmutex.c
index d9fd2bc58f..c3772378e2 100644
--- a/components/lwp/lwp_pmutex.c
+++ b/components/lwp/lwp_pmutex.c
@@ -418,7 +418,9 @@ static int _pthread_mutex_destroy(void *umutex)
return 0;
}
-int sys_pmutex(void *umutex, int op, void *arg)
+#include <syscall_generic.h>
+
+sysret_t sys_pmutex(void *umutex, int op, void *arg)
{
int ret = -EINVAL;
diff --git a/components/lwp/lwp_sys_socket.h b/components/lwp/lwp_sys_socket.h
new file mode 100644
index 0000000000..ea73082c31
--- /dev/null
+++ b/components/lwp/lwp_sys_socket.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2023-03-13 RT-Thread Export as header
+ */
+#ifndef __LWP_SYS_SOCKET_H__
+#define __LWP_SYS_SOCKET_H__
+
+/* socket levels */
+#define INTF_SOL_SOCKET 1
+#define IMPL_SOL_SOCKET 0xFFF
+
+#define INTF_IPPROTO_IP 0
+#define IMPL_IPPROTO_IP 0
+
+#define INTF_IPPROTO_TCP 6
+#define IMPL_IPPROTO_TCP 6
+
+#define INTF_IPPROTO_IPV6 41
+#define IMPL_IPPROTO_IPV6 41
+
+/* SOL_SOCKET option names */
+#define INTF_SO_BROADCAST 6
+#define INTF_SO_KEEPALIVE 9
+#define INTF_SO_REUSEADDR 2
+#define INTF_SO_TYPE 3
+#define INTF_SO_ERROR 4
+#define INTF_SO_SNDTIMEO 21
+#define INTF_SO_RCVTIMEO 20
+#define INTF_SO_RCVBUF 8
+#define INTF_SO_LINGER 13
+#define INTF_SO_NO_CHECK 11
+#define INTF_SO_ACCEPTCONN 30
+#define INTF_SO_DONTROUTE 5
+#define INTF_SO_OOBINLINE 10
+#define INTF_SO_REUSEPORT 15
+#define INTF_SO_SNDBUF 7
+#define INTF_SO_SNDLOWAT 19
+#define INTF_SO_RCVLOWAT 18
+
+#define IMPL_SO_BROADCAST 0x0020
+#define IMPL_SO_KEEPALIVE 0x0008
+#define IMPL_SO_REUSEADDR 0x0004
+#define IMPL_SO_TYPE 0x1008
+#define IMPL_SO_ERROR 0x1007
+#define IMPL_SO_SNDTIMEO 0x1005
+#define IMPL_SO_RCVTIMEO 0x1006
+#define IMPL_SO_RCVBUF 0x1002
+#define IMPL_SO_LINGER 0x0080
+#define IMPL_SO_NO_CHECK 0x100a
+#define IMPL_SO_ACCEPTCONN 0x0002
+#define IMPL_SO_DONTROUTE 0x0010
+#define IMPL_SO_OOBINLINE 0x0100
+#define IMPL_SO_REUSEPORT 0x0200
+#define IMPL_SO_SNDBUF 0x1001
+#define IMPL_SO_SNDLOWAT 0x1003
+#define IMPL_SO_RCVLOWAT 0x1004
+
+/* IPPROTO_IP option names */
+#define INTF_IP_TTL 2
+#define INTF_IP_TOS 1
+#define INTF_IP_MULTICAST_TTL 33
+#define INTF_IP_MULTICAST_IF 32
+#define INTF_IP_MULTICAST_LOOP 34
+#define INTF_IP_ADD_MEMBERSHIP 35
+#define INTF_IP_DROP_MEMBERSHIP 36
+
+#define IMPL_IP_TTL 2
+#define IMPL_IP_TOS 1
+#define IMPL_IP_MULTICAST_TTL 5
+#define IMPL_IP_MULTICAST_IF 6
+#define IMPL_IP_MULTICAST_LOOP 7
+#define IMPL_IP_ADD_MEMBERSHIP 3
+#define IMPL_IP_DROP_MEMBERSHIP 4
+
+/* IPPROTO_TCP option names */
+#define INTF_TCP_NODELAY 1
+#define INTF_TCP_KEEPALIVE 9
+#define INTF_TCP_KEEPIDLE 4
+#define INTF_TCP_KEEPINTVL 5
+#define INTF_TCP_KEEPCNT 6
+
+#define IMPL_TCP_NODELAY 0x01
+#define IMPL_TCP_KEEPALIVE 0x02
+#define IMPL_TCP_KEEPIDLE 0x03
+#define IMPL_TCP_KEEPINTVL 0x04
+#define IMPL_TCP_KEEPCNT 0x05
+
+/* IPPROTO_IPV6 option names */
+#define INTF_IPV6_V6ONLY 26
+#define IMPL_IPV6_V6ONLY 27
+
+#endif /* __LWP_SYS_SOCKET_H__ */
diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c
index 276f7c18b1..9c42ccf0fd 100644
--- a/components/lwp/lwp_syscall.c
+++ b/components/lwp/lwp_syscall.c
@@ -10,6 +10,7 @@
* 2021-02-06 lizhirui fix some bugs
* 2021-02-12 lizhirui add 64-bit support for sys_brk
* 2021-02-20 lizhirui fix some warnings
+ * 2023-03-13 WangXiaoyao Format & fix syscall return value
*/
#define _GNU_SOURCE
/* RT-Thread System call */
@@ -20,6 +21,12 @@
#include <string.h>
#include <stdint.h>
+#define DBG_TAG "SYSCALL"
+#define DBG_LVL DBG_INFO
+#include <rtdbg.h>
+
+#include "syscall_generic.h"
+
#include <lwp.h>
#ifdef ARCH_MM_MMU
#include <lwp_user_mm.h>
@@ -38,39 +45,36 @@
#include <sys/statfs.h> /* statfs() */
#endif
-#include "syscall_data.h"
#include "mqueue.h"
+#ifdef RT_USING_SAL
+ #include <netdev_ipaddr.h>
+ #include <netdev.h>
+
+ #include <sal_netdb.h>
+ #include <sal_socket.h>
+ #include <sys/socket.h>
+
+#endif /* RT_USING_SAL */
+
#if (defined(RT_USING_SAL) && defined(SAL_USING_POSIX))
-#include <sys/socket.h>
+ #include <sys/socket.h>
-#define SYSCALL_NET(f) f
+ #define SYSCALL_NET(f) f
#else
-#define SYSCALL_NET(f) SYSCALL_SIGN(sys_notimpl)
-#endif
+ #define SYSCALL_NET(f) SYSCALL_SIGN(sys_notimpl)
+#endif /* (defined(RT_USING_SAL) && defined(SAL_USING_POSIX)) */
#if defined(RT_USING_DFS) && defined(ARCH_MM_MMU)
-#define SYSCALL_USPACE(f) f
+ #define SYSCALL_USPACE(f) f
#else
-#define SYSCALL_USPACE(f) SYSCALL_SIGN(sys_notimpl)
-#endif
-
-#define DBG_TAG "SYSCALL"
-#define DBG_LVL DBG_INFO
-#include <rtdbg.h>
-
-#ifdef RT_USING_SAL
-#include <netdev_ipaddr.h>
-#include <netdev.h>
-
-#include <sal_netdb.h>
-#include <sal_socket.h>
-#include <sys/socket.h>
-#endif /* RT_USING_SAL */
+ #define SYSCALL_USPACE(f) SYSCALL_SIGN(sys_notimpl)
+#endif /* defined(RT_USING_DFS) && defined(ARCH_MM_MMU) */
#include <tty.h>
#include "lwp_ipc_internal.h"
#include <sched.h>
+
#ifndef GRND_NONBLOCK
#define GRND_NONBLOCK 0x0001
#endif /* GRND_NONBLOCK */
@@ -81,281 +85,192 @@
#ifndef RT_USING_POSIX_TIMER
#error "No definition RT_USING_POSIX_TIMER"
-#endif
+#endif /* RT_USING_POSIX_TIMER */
+
#ifndef RT_USING_POSIX_CLOCK
#error "No definition RT_USING_POSIX_CLOCK"
-#endif
+#endif /* RT_USING_POSIX_CLOCK */
-#define SET_ERRNO(no) rt_set_errno(-(no))
-#define GET_ERRNO() ((rt_get_errno() > 0) ? (-rt_get_errno()) : rt_get_errno())
struct musl_sockaddr
{
uint16_t sa_family;
char sa_data[14];
};
-int sys_dup(int oldfd);
-int sys_dup2(int oldfd, int new);
void lwp_cleanup(struct rt_thread *tid);
#ifdef ARCH_MM_MMU
-#define ALLOC_KERNEL_STACK_SIZE 5120
+ #define ALLOC_KERNEL_STACK_SIZE 5120
-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);
-}
+ static void *kmem_get(size_t size)
+ {
+ return rt_malloc(size);
+ }
-static void kmem_put(void *kptr)
-{
- rt_free(kptr);
-}
-#else
-#define ALLOC_KERNEL_STACK_SIZE 1536
-#define ALLOC_KERNEL_STACK_SIZE_MIN 1024
-#define ALLOC_KERNEL_STACK_SIZE_MAX 4096
+ static void kmem_put(void *kptr)
+ {
+ rt_free(kptr);
+ }
+#else /* ARCH_MM_MMU */
+ #define ALLOC_KERNEL_STACK_SIZE 1536
+ #define ALLOC_KERNEL_STACK_SIZE_MIN 1024
+ #define ALLOC_KERNEL_STACK_SIZE_MAX 4096
-extern void set_user_context(void *stack);
+ extern void set_user_context(void *stack);
#endif /* ARCH_MM_MMU */
-/* The same socket option is defined differently in the user interfaces and the
- * implementation. The options should be converted in the kernel. */
-
-/* socket levels */
-#define INTF_SOL_SOCKET 1
-#define IMPL_SOL_SOCKET 0xFFF
-
-#define INTF_IPPROTO_IP 0
-#define IMPL_IPPROTO_IP 0
-
-#define INTF_IPPROTO_TCP 6
-#define IMPL_IPPROTO_TCP 6
-
-#define INTF_IPPROTO_IPV6 41
-#define IMPL_IPPROTO_IPV6 41
-
-/* SOL_SOCKET option names */
-#define INTF_SO_BROADCAST 6
-#define INTF_SO_KEEPALIVE 9
-#define INTF_SO_REUSEADDR 2
-#define INTF_SO_TYPE 3
-#define INTF_SO_ERROR 4
-#define INTF_SO_SNDTIMEO 21
-#define INTF_SO_RCVTIMEO 20
-#define INTF_SO_RCVBUF 8
-#define INTF_SO_LINGER 13
-#define INTF_SO_NO_CHECK 11
-#define INTF_SO_ACCEPTCONN 30
-#define INTF_SO_DONTROUTE 5
-#define INTF_SO_OOBINLINE 10
-#define INTF_SO_REUSEPORT 15
-#define INTF_SO_SNDBUF 7
-#define INTF_SO_SNDLOWAT 19
-#define INTF_SO_RCVLOWAT 18
-
-#define IMPL_SO_BROADCAST 0x0020
-#define IMPL_SO_KEEPALIVE 0x0008
-#define IMPL_SO_REUSEADDR 0x0004
-#define IMPL_SO_TYPE 0x1008
-#define IMPL_SO_ERROR 0x1007
-#define IMPL_SO_SNDTIMEO 0x1005
-#define IMPL_SO_RCVTIMEO 0x1006
-#define IMPL_SO_RCVBUF 0x1002
-#define IMPL_SO_LINGER 0x0080
-#define IMPL_SO_NO_CHECK 0x100a
-#define IMPL_SO_ACCEPTCONN 0x0002
-#define IMPL_SO_DONTROUTE 0x0010
-#define IMPL_SO_OOBINLINE 0x0100
-#define IMPL_SO_REUSEPORT 0x0200
-#define IMPL_SO_SNDBUF 0x1001
-#define IMPL_SO_SNDLOWAT 0x1003
-#define IMPL_SO_RCVLOWAT 0x1004
-
-/* IPPROTO_IP option names */
-#define INTF_IP_TTL 2
-#define INTF_IP_TOS 1
-#define INTF_IP_MULTICAST_TTL 33
-#define INTF_IP_MULTICAST_IF 32
-#define INTF_IP_MULTICAST_LOOP 34
-#define INTF_IP_ADD_MEMBERSHIP 35
-#define INTF_IP_DROP_MEMBERSHIP 36
-
-#define IMPL_IP_TTL 2
-#define IMPL_IP_TOS 1
-#define IMPL_IP_MULTICAST_TTL 5
-#define IMPL_IP_MULTICAST_IF 6
-#define IMPL_IP_MULTICAST_LOOP 7
-#define IMPL_IP_ADD_MEMBERSHIP 3
-#define IMPL_IP_DROP_MEMBERSHIP 4
-
-/* IPPROTO_TCP option names */
-#define INTF_TCP_NODELAY 1
-#define INTF_TCP_KEEPALIVE 9
-#define INTF_TCP_KEEPIDLE 4
-#define INTF_TCP_KEEPINTVL 5
-#define INTF_TCP_KEEPCNT 6
-
-#define IMPL_TCP_NODELAY 0x01
-#define IMPL_TCP_KEEPALIVE 0x02
-#define IMPL_TCP_KEEPIDLE 0x03
-#define IMPL_TCP_KEEPINTVL 0x04
-#define IMPL_TCP_KEEPCNT 0x05
-
-/* IPPROTO_IPV6 option names */
-#define INTF_IPV6_V6ONLY 26
-#define IMPL_IPV6_V6ONLY 27
-
#ifdef RT_USING_SAL
-static void convert_sockopt(int *level, int *optname)
-{
- if (*level == INTF_SOL_SOCKET)
- {
- *level = IMPL_SOL_SOCKET;
+ /* The same socket option is defined differently in the user interfaces and the
+ * implementation. The options should be converted in the kernel. */
+ #include "lwp_sys_socket.h"
- switch (*optname)
+ static void convert_sockopt(int *level, int *optname)
+ {
+ if (*level == INTF_SOL_SOCKET)
{
- case INTF_SO_REUSEADDR:
- *optname = IMPL_SO_REUSEADDR;
- break;
- case INTF_SO_KEEPALIVE:
- *optname = IMPL_SO_KEEPALIVE;
- break;
- case INTF_SO_BROADCAST:
- *optname = IMPL_SO_BROADCAST;
- break;
- case INTF_SO_ACCEPTCONN:
- *optname = IMPL_SO_ACCEPTCONN;
- break;
- case INTF_SO_DONTROUTE:
- *optname = IMPL_SO_DONTROUTE;
- break;
- case INTF_SO_LINGER:
- *optname = IMPL_SO_LINGER;
- break;
- case INTF_SO_OOBINLINE:
- *optname = IMPL_SO_OOBINLINE;
- break;
- case INTF_SO_REUSEPORT:
- *optname = IMPL_SO_REUSEPORT;
- break;
- case INTF_SO_SNDBUF:
- *optname = IMPL_SO_SNDBUF;
- break;
- case INTF_SO_RCVBUF:
- *optname = IMPL_SO_RCVBUF;
- break;
- case INTF_SO_SNDLOWAT:
- *optname = IMPL_SO_SNDLOWAT;
- break;
- case INTF_SO_RCVLOWAT:
- *optname = IMPL_SO_RCVLOWAT;
- break;
- case INTF_SO_SNDTIMEO:
- *optname = IMPL_SO_SNDTIMEO;
- break;
- case INTF_SO_RCVTIMEO:
- *optname = IMPL_SO_RCVTIMEO;
- break;
- case INTF_SO_ERROR:
- *optname = IMPL_SO_ERROR;
- break;
- case INTF_SO_TYPE:
- *optname = IMPL_SO_TYPE;
- break;
- case INTF_SO_NO_CHECK:
- *optname = IMPL_SO_NO_CHECK;
- break;
+ *level = IMPL_SOL_SOCKET;
- /*
- * SO_DONTLINGER (*level = ((int)(~SO_LINGER))),
- * SO_USELOOPBACK (*level = 0x0040) and
- * SO_CONTIMEO (*level = 0x1009) are not supported for now.
- */
- default:
- *optname = 0;
- break;
- }
- return;
- }
+ switch (*optname)
+ {
+ case INTF_SO_REUSEADDR:
+ *optname = IMPL_SO_REUSEADDR;
+ break;
+ case INTF_SO_KEEPALIVE:
+ *optname = IMPL_SO_KEEPALIVE;
+ break;
+ case INTF_SO_BROADCAST:
+ *optname = IMPL_SO_BROADCAST;
+ break;
+ case INTF_SO_ACCEPTCONN:
+ *optname = IMPL_SO_ACCEPTCONN;
+ break;
+ case INTF_SO_DONTROUTE:
+ *optname = IMPL_SO_DONTROUTE;
+ break;
+ case INTF_SO_LINGER:
+ *optname = IMPL_SO_LINGER;
+ break;
+ case INTF_SO_OOBINLINE:
+ *optname = IMPL_SO_OOBINLINE;
+ break;
+ case INTF_SO_REUSEPORT:
+ *optname = IMPL_SO_REUSEPORT;
+ break;
+ case INTF_SO_SNDBUF:
+ *optname = IMPL_SO_SNDBUF;
+ break;
+ case INTF_SO_RCVBUF:
+ *optname = IMPL_SO_RCVBUF;
+ break;
+ case INTF_SO_SNDLOWAT:
+ *optname = IMPL_SO_SNDLOWAT;
+ break;
+ case INTF_SO_RCVLOWAT:
+ *optname = IMPL_SO_RCVLOWAT;
+ break;
+ case INTF_SO_SNDTIMEO:
+ *optname = IMPL_SO_SNDTIMEO;
+ break;
+ case INTF_SO_RCVTIMEO:
+ *optname = IMPL_SO_RCVTIMEO;
+ break;
+ case INTF_SO_ERROR:
+ *optname = IMPL_SO_ERROR;
+ break;
+ case INTF_SO_TYPE:
+ *optname = IMPL_SO_TYPE;
+ break;
+ case INTF_SO_NO_CHECK:
+ *optname = IMPL_SO_NO_CHECK;
+ break;
- if (*level == INTF_IPPROTO_IP)
- {
- *level = IMPL_IPPROTO_IP;
+ /*
+ * SO_DONTLINGER (*level = ((int)(~SO_LINGER))),
+ * SO_USELOOPBACK (*level = 0x0040) and
+ * SO_CONTIMEO (*level = 0x1009) are not supported for now.
+ */
+ default:
+ *optname = 0;
+ break;
+ }
+ return;
+ }
- switch (*optname)
+ if (*level == INTF_IPPROTO_IP)
{
- case INTF_IP_TTL:
- *optname = IMPL_IP_TTL;
- break;
- case INTF_IP_TOS:
- *optname = IMPL_IP_TOS;
- break;
- case INTF_IP_MULTICAST_TTL:
- *optname = IMPL_IP_MULTICAST_TTL;
- break;
- case INTF_IP_MULTICAST_IF:
- *optname = IMPL_IP_MULTICAST_IF;
- break;
- case INTF_IP_MULTICAST_LOOP:
- *optname = IMPL_IP_MULTICAST_LOOP;
- break;
- case INTF_IP_ADD_MEMBERSHIP:
- *optname = IMPL_IP_ADD_MEMBERSHIP;
- break;
- case INTF_IP_DROP_MEMBERSHIP:
- *optname = IMPL_IP_DROP_MEMBERSHIP;
- break;
- default:
- break;
- }
- }
+ *level = IMPL_IPPROTO_IP;
- if (*level == INTF_IPPROTO_TCP)
- {
- *level = IMPL_IPPROTO_TCP;
+ switch (*optname)
+ {
+ case INTF_IP_TTL:
+ *optname = IMPL_IP_TTL;
+ break;
+ case INTF_IP_TOS:
+ *optname = IMPL_IP_TOS;
+ break;
+ case INTF_IP_MULTICAST_TTL:
+ *optname = IMPL_IP_MULTICAST_TTL;
+ break;
+ case INTF_IP_MULTICAST_IF:
+ *optname = IMPL_IP_MULTICAST_IF;
+ break;
+ case INTF_IP_MULTICAST_LOOP:
+ *optname = IMPL_IP_MULTICAST_LOOP;
+ break;
+ case INTF_IP_ADD_MEMBERSHIP:
+ *optname = IMPL_IP_ADD_MEMBERSHIP;
+ break;
+ case INTF_IP_DROP_MEMBERSHIP:
+ *optname = IMPL_IP_DROP_MEMBERSHIP;
+ break;
+ default:
+ break;
+ }
+ }
- switch (*optname)
+ if (*level == INTF_IPPROTO_TCP)
{
- case INTF_TCP_NODELAY:
- *optname = IMPL_TCP_NODELAY;
- break;
- case INTF_TCP_KEEPALIVE:
- *optname = IMPL_TCP_KEEPALIVE;
- break;
- case INTF_TCP_KEEPIDLE:
- *optname = IMPL_TCP_KEEPIDLE;
- break;
- case INTF_TCP_KEEPINTVL:
- *optname = IMPL_TCP_KEEPINTVL;
- break;
- case INTF_TCP_KEEPCNT:
- *optname = IMPL_TCP_KEEPCNT;
- break;
- default:
- break;
- }
- return;
- }
+ *level = IMPL_IPPROTO_TCP;
- if (*level == INTF_IPPROTO_IPV6)
- {
- *level = IMPL_IPPROTO_IPV6;
+ switch (*optname)
+ {
+ case INTF_TCP_NODELAY:
+ *optname = IMPL_TCP_NODELAY;
+ break;
+ case INTF_TCP_KEEPALIVE:
+ *optname = IMPL_TCP_KEEPALIVE;
+ break;
+ case INTF_TCP_KEEPIDLE:
+ *optname = IMPL_TCP_KEEPIDLE;
+ break;
+ case INTF_TCP_KEEPINTVL:
+ *optname = IMPL_TCP_KEEPINTVL;
+ break;
+ case INTF_TCP_KEEPCNT:
+ *optname = IMPL_TCP_KEEPCNT;
+ break;
+ default:
+ break;
+ }
+ return;
+ }
- switch (*optname)
+ if (*level == INTF_IPPROTO_IPV6)
{
- case INTF_IPV6_V6ONLY:
- *optname = IMPL_IPV6_V6ONLY;
- break;
- default:
- break;
+ *level = IMPL_IPPROTO_IPV6;
+
+ switch (*optname)
+ {
+ case INTF_IPV6_V6ONLY:
+ *optname = IMPL_IPV6_V6ONLY;
+ break;
+ default:
+ break;
+ }
+ return;
}
- return;
- }
-}
+ }
#endif /* RT_USING_SAL */
#if defined(RT_USING_LWIP) || defined(SAL_USING_UNET)
@@ -558,7 +473,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, ...)
+sysret_t sys_open(const char *name, int flag, ...)
{
#ifdef ARCH_MM_MMU
int ret = -1;
@@ -603,20 +518,20 @@ int sys_open(const char *name, int flag, ...)
}
/* syscall: "close" ret: "int" args: "int" */
-int sys_close(int fd)
+sysret_t sys_close(int fd)
{
int ret = close(fd);
return (ret < 0 ? GET_ERRNO() : ret);
}
/* syscall: "ioctl" ret: "int" args: "int" "u_long" "..." */
-int sys_ioctl(int fd, unsigned long cmd, void* data)
+sysret_t sys_ioctl(int fd, unsigned long cmd, void* data)
{
int ret = ioctl(fd, cmd, data);
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_fstat(int file, struct stat *buf)
+sysret_t sys_fstat(int file, struct stat *buf)
{
#ifdef ARCH_MM_MMU
int ret = -1;
@@ -743,7 +658,7 @@ static void dfs2musl_events(short *events)
*events = result_e;
}
-int sys_poll(struct pollfd *fds, nfds_t nfds, int timeout)
+sysret_t sys_poll(struct pollfd *fds, nfds_t nfds, int timeout)
{
int ret = -1;
int i = 0;
@@ -804,7 +719,7 @@ int sys_poll(struct pollfd *fds, nfds_t nfds, int timeout)
#endif /* ARCH_MM_MMU */
}
-int sys_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
+sysret_t sys_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
{
#ifdef ARCH_MM_MMU
int ret = -1;
@@ -908,7 +823,7 @@ quit:
#endif
}
-int sys_unlink(const char *pathname)
+sysret_t sys_unlink(const char *pathname)
{
#ifdef ARCH_MM_MMU
int ret = -1;
@@ -951,7 +866,7 @@ int sys_unlink(const char *pathname)
}
/* syscall: "nanosleep" ret: "int" args: "const struct timespec *" "struct timespec *" */
-int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
+sysret_t sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
{
int ret = 0;
dbg_log(DBG_LOG, "sys_nanosleep\n");
@@ -982,7 +897,7 @@ 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)
+sysret_t sys_gettimeofday(struct timeval *tp, struct timezone *tzp)
{
#ifdef ARCH_MM_MMU
struct timeval t_k;
@@ -1014,30 +929,30 @@ int sys_gettimeofday(struct timeval *tp, struct timezone *tzp)
return 0;
}
-int sys_settimeofday(const struct timeval *tv, const struct timezone *tzp)
+sysret_t sys_settimeofday(const struct timeval *tv, const struct timezone *tzp)
{
return 0;
}
-int sys_exec(char *filename, int argc, char **argv, char **envp)
+sysret_t sys_exec(char *filename, int argc, char **argv, char **envp)
{
return lwp_execve(filename, 0, argc, argv, envp);
}
-int sys_kill(int pid, int sig)
+sysret_t sys_kill(int pid, int sig)
{
int ret = 0;
ret = lwp_kill(pid, sig);
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_getpid(void)
+sysret_t sys_getpid(void)
{
return lwp_getpid();
}
/* syscall: "getpriority" ret: "int" args: "int" "id_t" */
-int sys_getpriority(int which, id_t who)
+sysret_t sys_getpriority(int which, id_t who)
{
if (which == PRIO_PROCESS)
{
@@ -1054,7 +969,7 @@ int sys_getpriority(int which, id_t who)
}
/* syscall: "setpriority" ret: "int" args: "int" "id_t" "int" */
-int sys_setpriority(int which, id_t who, int prio)
+sysret_t sys_setpriority(int which, id_t who, int prio)
{
if (which == PRIO_PROCESS)
{
@@ -1136,7 +1051,7 @@ void *sys_mmap2(void *addr, size_t length, int prot,
return lwp_mmap2(addr, length, prot, flags, fd, pgoffset);
}
-int sys_munmap(void *addr, size_t length)
+sysret_t sys_munmap(void *addr, size_t length)
{
return lwp_munmap(addr);
}
@@ -1147,7 +1062,7 @@ void *sys_mremap(void *old_address, size_t old_size,
return (void *)-1;
}
-int sys_madvise(void *addr, size_t len, int behav)
+sysret_t sys_madvise(void *addr, size_t len, int behav)
{
return -ENOSYS;
}
@@ -1343,27 +1258,31 @@ rt_err_t sys_timer_create(clockid_t clockid, struct sigevent *restrict sevp, tim
memset(&sevp_k, 0, sizeof(sevp_k));
/* musl passes `struct ksigevent` to kernel, we shoule only get size of that bytes */
- lwp_get_from_user(&sevp_k, (void *)sevp, sizeof(struct ksigevent));
+ if (!lwp_get_from_user(&sevp_k, (void *)sevp, sizeof(struct ksigevent)))
+ {
+ return -EINVAL;
+ }
}
- lwp_get_from_user(&timerid_k, (void *)timerid, sizeof(timerid_k));
/* to protect unsafe implementation in current rt-smart toolchain */
RT_ASSERT(((struct ksigevent *)sevp)->sigev_tid == *(int *)(&sevp_k.sigev_notify_function));
- ret = timer_create(clockid, &sevp_k, &timerid_k);
+ ret = _SYS_WRAP(timer_create(clockid, &sevp_k, &timerid_k));
/* ID should not extend 32-bits size for libc */
RT_ASSERT((rt_ubase_t)timerid_k < UINT32_MAX);
utimer = (rt_ubase_t)timerid_k;
- if (ret != -RT_ERROR){
- lwp_put_to_user(sevp, (void *)&sevp_k, sizeof(struct ksigevent));
- lwp_put_to_user(timerid, (void *)&utimer, sizeof(utimer));
+ if (ret != -RT_ERROR)
+ {
+ if (!lwp_put_to_user(sevp, (void *)&sevp_k, sizeof(struct ksigevent)) ||
+ !lwp_put_to_user(timerid, (void *)&utimer, sizeof(utimer)))
+ ret = -EINVAL;
}
#else
- ret = timer_create(clockid, sevp, timerid);
+ ret = _SYS_WRAP(timer_create(clockid, sevp, timerid));
#endif
- return (ret < 0 ? GET_ERRNO() : ret);
+ return ret;
}
rt_err_t sys_timer_delete(timer_t timerid)
@@ -1739,7 +1658,7 @@ static int lwp_copy_files(struct rt_lwp *dst, struct rt_lwp *src)
return -RT_ERROR;
}
-int _sys_fork(void)
+sysret_t _sys_fork(void)
{
rt_base_t level;
int tid = 0;
@@ -1906,12 +1825,12 @@ size_t lwp_user_strlen(const char *s, int *err)
/* arm needs to wrap fork/clone call to preserved lr & caller saved regs */
-rt_weak int sys_fork(void)
+rt_weak sysret_t sys_fork(void)
{
return _sys_fork();
}
-rt_weak int sys_vfork(void)
+rt_weak sysret_t sys_vfork(void)
{
return sys_fork();
}
@@ -2232,7 +2151,7 @@ quit:
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_execve(const char *path, char *const argv[], char *const envp[])
+sysret_t sys_execve(const char *path, char *const argv[], char *const envp[])
{
int ret = -1;
int argc = 0;
@@ -2531,7 +2450,7 @@ rt_thread_t sys_thread_self(void)
/* sys channel */
-int sys_channel_open(const char *name, int flags)
+sysret_t sys_channel_open(const char *name, int flags)
{
return lwp_channel_open(FDT_TYPE_LWP, name, flags);
}
@@ -2598,7 +2517,7 @@ static int sys_log_enable(int argc, char** argv)
}
MSH_CMD_EXPORT_ALIAS(sys_log_enable, sys_log, sys_log 1(enable)/0(disable));
-int sys_log(const char* log, int size)
+sysret_t sys_log(const char* log, int size)
{
rt_device_t console = rt_console_get_device();
@@ -2610,7 +2529,7 @@ int sys_log(const char* log, int size)
return 0;
}
-int sys_stat(const char *file, struct stat *buf)
+sysret_t sys_stat(const char *file, struct stat *buf)
{
int ret = 0;
int err;
@@ -2644,7 +2563,7 @@ int sys_stat(const char *file, struct stat *buf)
}
copy_path[copy_len] = '\0';
- ret = stat(copy_path, &statbuff);
+ ret = _SYS_WRAP(stat(copy_path, &statbuff));
rt_free(copy_path);
if (ret == 0)
@@ -2652,10 +2571,10 @@ int sys_stat(const char *file, struct stat *buf)
lwp_put_to_user(buf, &statbuff, sizeof statbuff);
}
- return (ret < 0 ? GET_ERRNO() : ret);
+ return ret;
}
-int sys_notimpl(void)
+sysret_t sys_notimpl(void)
{
return -ENOSYS;
}
@@ -2671,12 +2590,12 @@ void sys_hw_interrupt_enable(uint32_t level)
}
#ifdef ARCH_MM_MMU
-int sys_shmget(size_t key, size_t size, int create)
+sysret_t sys_shmget(size_t key, size_t size, int create)
{
return lwp_shmget(key, size, create);
}
-int sys_shmrm(int id)
+sysret_t sys_shmrm(int id)
{
return lwp_shmrm(id);
}
@@ -2686,7 +2605,7 @@ void* sys_shmat(int id, void* shm_vaddr)
return lwp_shmat(id, shm_vaddr);
}
-int sys_shmdt(void* shm_vaddr)
+sysret_t sys_shmdt(void* shm_vaddr)
{
return lwp_shmdt(shm_vaddr);
}
@@ -2709,7 +2628,7 @@ void *sys_shm_retain(void *mem)
return lwp_shm_retain(mem);
}
-int sys_shm_free(void *mem)
+sysret_t sys_shm_free(void *mem)
{
if (!lwp_user_accessable(mem, sizeof (void *)))
{
@@ -2763,7 +2682,7 @@ rt_ssize_t sys_device_write(rt_device_t dev, rt_off_t pos, const void *buffer, r
#ifdef RT_USING_SAL
/* network interfaces */
-int sys_accept(int socket, struct musl_sockaddr *addr, socklen_t *addrlen)
+sysret_t sys_accept(int socket, struct musl_sockaddr *addr, socklen_t *addrlen)
{
int ret = -1;
struct sockaddr ksa;
@@ -2807,7 +2726,7 @@ int sys_accept(int socket, struct musl_sockaddr *addr, socklen_t *addrlen)
return ret;
}
-int sys_bind(int socket, const struct musl_sockaddr *name, socklen_t namelen)
+sysret_t sys_bind(int socket, const struct musl_sockaddr *name, socklen_t namelen)
{
struct sockaddr sa;
struct musl_sockaddr kname;
@@ -2831,12 +2750,12 @@ int sys_bind(int socket, const struct musl_sockaddr *name, socklen_t namelen)
return bind(socket, &sa, namelen);
}
-int sys_shutdown(int socket, int how)
+sysret_t sys_shutdown(int socket, int how)
{
return shutdown(socket, how);
}
-int sys_getpeername (int socket, struct musl_sockaddr *name, socklen_t *namelen)
+sysret_t sys_getpeername(int socket, struct musl_sockaddr *name, socklen_t *namelen)
{
int ret = -1;
struct sockaddr sa;
@@ -2880,7 +2799,7 @@ int sys_getpeername (int socket, struct musl_sockaddr *name, socklen_t *namelen)
return ret;
}
-int sys_getsockname (int socket, struct musl_sockaddr *name, socklen_t *namelen)
+sysret_t sys_getsockname(int socket, struct musl_sockaddr *name, socklen_t *namelen)
{
int ret = -1;
struct sockaddr sa;
@@ -2922,7 +2841,7 @@ int sys_getsockname (int socket, struct musl_sockaddr *name, socklen_t *namelen)
return ret;
}
-int sys_getsockopt(int socket, int level, int optname, void *optval, socklen_t *optlen)
+sysret_t sys_getsockopt(int socket, int level, int optname, void *optval, socklen_t *optlen)
{
int ret;
convert_sockopt(&level, &optname);
@@ -2931,7 +2850,7 @@ int sys_getsockopt(int socket, int level, int optname, void *optval, socklen_t *
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_setsockopt(int socket, int level, int optname, const void *optval, socklen_t optlen)
+sysret_t sys_setsockopt(int socket, int level, int optname, const void *optval, socklen_t optlen)
{
int ret;
convert_sockopt(&level, &optname);
@@ -2939,7 +2858,7 @@ int sys_setsockopt(int socket, int level, int optname, const void *optval, sockl
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_connect(int socket, const struct musl_sockaddr *name, socklen_t namelen)
+sysret_t sys_connect(int socket, const struct musl_sockaddr *name, socklen_t namelen)
{
int ret;
struct sockaddr sa;
@@ -2965,7 +2884,7 @@ int sys_connect(int socket, const struct musl_sockaddr *name, socklen_t namelen)
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_listen(int socket, int backlog)
+sysret_t sys_listen(int socket, int backlog)
{
return listen(socket, backlog);
}
@@ -3003,7 +2922,7 @@ static int netflags_muslc_2_lwip(int flags)
return flgs;
}
-int sys_recvfrom(int socket, void *mem, size_t len, int flags,
+sysret_t sys_recvfrom(int socket, void *mem, size_t len, int flags,
struct musl_sockaddr *from, socklen_t *fromlen)
{
int flgs = 0;
@@ -3077,7 +2996,7 @@ int sys_recvfrom(int socket, void *mem, size_t len, int flags,
#endif
}
-int sys_recv(int socket, void *mem, size_t len, int flags)
+sysret_t sys_recv(int socket, void *mem, size_t len, int flags)
{
int flgs = 0;
int ret;
@@ -3087,7 +3006,7 @@ int sys_recv(int socket, void *mem, size_t len, int flags)
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_sendto(int socket, const void *dataptr, size_t size, int flags,
+sysret_t sys_sendto(int socket, const void *dataptr, size_t size, int flags,
const struct musl_sockaddr *to, socklen_t tolen)
{
int flgs = 0;
@@ -3153,7 +3072,7 @@ int sys_sendto(int socket, const void *dataptr, size_t size, int flags,
#endif
}
-int sys_send(int socket, const void *dataptr, size_t size, int flags)
+sysret_t sys_send(int socket, const void *dataptr, size_t size, int flags)
{
int ret;
int flgs = 0;
@@ -3163,7 +3082,7 @@ int sys_send(int socket, const void *dataptr, size_t size, int flags)
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_socket(int domain, int type, int protocol)
+sysret_t sys_socket(int domain, int type, int protocol)
{
int fd = -1;
int nonblock = 0;
@@ -3192,7 +3111,7 @@ out:
return (fd < 0 ? GET_ERRNO() : fd);
}
-int sys_closesocket(int socket)
+sysret_t sys_closesocket(int socket)
{
return closesocket(socket);
}
@@ -3221,7 +3140,7 @@ struct k_sigaction {
unsigned mask[2];
};
-int sys_sigaction(int sig, const struct k_sigaction *act,
+sysret_t sys_sigaction(int sig, const struct k_sigaction *act,
struct k_sigaction *oact, size_t sigsetsize)
{
int ret = -RT_EINVAL;
@@ -3279,7 +3198,7 @@ out:
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size)
+sysret_t sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size)
{
int ret = -1;
lwp_sigset_t *pnewset = RT_NULL, *poldset = RT_NULL;
@@ -3346,7 +3265,7 @@ int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size
return (ret < 0 ? -EFAULT: ret);
}
-int sys_tkill(int tid, int sig)
+sysret_t sys_tkill(int tid, int sig)
{
#ifdef ARCH_MM_MMU
rt_base_t level;
@@ -3363,7 +3282,7 @@ int sys_tkill(int tid, int sig)
#endif
}
-int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset, size_t size)
+sysret_t sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset, size_t size)
{
int ret = -1;
lwp_sigset_t *pnewset = RT_NULL, *poldset = RT_NULL;
@@ -3431,7 +3350,7 @@ int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *os
}
#ifndef ARCH_MM_MMU
-int sys_lwp_sighandler_set(int sig, lwp_sighandler_t func)
+sysret_t sys_lwp_sighandler_set(int sig, lwp_sighandler_t func)
{
if (!lwp_user_accessable((void *)func, sizeof(lwp_sighandler_t)))
{
@@ -3442,7 +3361,7 @@ int sys_lwp_sighandler_set(int sig, lwp_sighandler_t func)
return 0;
}
-int sys_thread_sighandler_set(int sig, lwp_sighandler_t func)
+sysret_t sys_thread_sighandler_set(int sig, lwp_sighandler_t func)
{
if (!lwp_user_accessable((void *)func, sizeof(lwp_sighandler_t)))
{
@@ -3454,7 +3373,7 @@ int sys_thread_sighandler_set(int sig, lwp_sighandler_t func)
}
#endif /* not defined ARCH_MM_MMU */
-int32_t sys_waitpid(int32_t pid, int *status, int options)
+sysret_t sys_waitpid(int32_t pid, int *status, int options)
{
int ret = -1;
#ifdef ARCH_MM_MMU
@@ -3491,7 +3410,7 @@ struct musl_addrinfo
struct musl_addrinfo *ai_next;
};
-int sys_getaddrinfo(const char *nodename,
+sysret_t sys_getaddrinfo(const char *nodename,
const char *servname,
const struct musl_addrinfo *hints,
struct musl_addrinfo *res)
@@ -3617,7 +3536,7 @@ exit:
}
#define HOSTENT_BUFSZ 512
-int sys_gethostbyname2_r(const char *name, int af, struct hostent *ret,
+sysret_t sys_gethostbyname2_r(const char *name, int af, struct hostent *ret,
char *buf, size_t buflen,
struct hostent **result, int *err)
{
@@ -3741,7 +3660,7 @@ char *sys_getcwd(char *buf, size_t size)
return (char *)strlen(buf);
}
-int sys_chdir(const char *path)
+sysret_t sys_chdir(const char *path)
{
#ifdef ARCH_MM_MMU
int err = 0;
@@ -3759,7 +3678,7 @@ int sys_chdir(const char *path)
#endif
}
-int sys_mkdir(const char *path, mode_t mode)
+sysret_t sys_mkdir(const char *path, mode_t mode)
{
#ifdef ARCH_MM_MMU
int err = 0;
@@ -3777,7 +3696,7 @@ int sys_mkdir(const char *path, mode_t mode)
#endif
}
-int sys_rmdir(const char *path)
+sysret_t sys_rmdir(const char *path)
{
#ifdef ARCH_MM_MMU
int err = 0;
@@ -3798,6 +3717,7 @@ int sys_rmdir(const char *path)
#ifdef RT_USING_MUSL
typedef uint64_t ino_t;
#endif
+
struct libc_dirent {
ino_t d_ino;
off_t d_off;
@@ -3805,7 +3725,8 @@ struct libc_dirent {
unsigned char d_type;
char d_name[256];
};
-int sys_getdents(int fd, struct libc_dirent *dirp, size_t nbytes)
+
+sysret_t sys_getdents(int fd, struct libc_dirent *dirp, size_t nbytes)
{
int ret = -1;
struct dfs_fd *dfs_fd;
@@ -3861,8 +3782,9 @@ rt_err_t sys_get_errno(void)
{
return rt_get_errno();
}
+
#ifdef ARCH_MM_MMU
-int sys_set_thread_area(void *p)
+sysret_t sys_set_thread_area(void *p)
{
rt_thread_t thread;
@@ -3873,7 +3795,7 @@ int sys_set_thread_area(void *p)
return 0;
}
-int sys_set_tid_address(int *tidptr)
+sysret_t sys_set_tid_address(int *tidptr)
{
rt_thread_t thread;
@@ -3889,12 +3811,12 @@ int sys_set_tid_address(int *tidptr)
}
#endif /* ARCH_MM_MMU */
-int sys_gettid(void)
+sysret_t sys_gettid(void)
{
return rt_thread_self()->tid;
}
-int sys_access(const char *filename, int mode)
+sysret_t sys_access(const char *filename, int mode)
{
int ret = 0;
#ifdef ARCH_MM_MMU
@@ -3935,7 +3857,7 @@ int sys_access(const char *filename, int mode)
#endif
}
-int sys_pipe(int fd[2])
+sysret_t sys_pipe(int fd[2])
{
int ret;
if (!lwp_user_accessable((void *)fd, sizeof(int[2])))
@@ -3946,7 +3868,7 @@ int sys_pipe(int fd[2])
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_clock_settime(clockid_t clk, const struct timespec *ts)
+sysret_t sys_clock_settime(clockid_t clk, const struct timespec *ts)
{
int ret = 0;
#ifdef ARCH_MM_MMU
@@ -3984,7 +3906,7 @@ int sys_clock_settime(clockid_t clk, const struct timespec *ts)
#endif
}
-int sys_clock_gettime(clockid_t clk, struct timespec *ts)
+sysret_t sys_clock_gettime(clockid_t clk, struct timespec *ts)
{
int ret = 0;
#ifdef ARCH_MM_MMU
@@ -4024,7 +3946,7 @@ int sys_clock_gettime(clockid_t clk, struct timespec *ts)
#endif
}
-int sys_clock_nanosleep(clockid_t clk, int flags, const struct timespec *rqtp, struct timespec *rmtp)
+sysret_t sys_clock_nanosleep(clockid_t clk, int flags, const struct timespec *rqtp, struct timespec *rmtp)
{
int ret = 0;
dbg_log(DBG_LOG, "sys_nanosleep\n");
@@ -4054,7 +3976,7 @@ int sys_clock_nanosleep(clockid_t clk, int flags, const struct timespec *rqtp, s
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_clock_getres(clockid_t clk, struct timespec *ts)
+sysret_t sys_clock_getres(clockid_t clk, struct timespec *ts)
{
int ret = 0;
#ifdef ARCH_MM_MMU
@@ -4080,7 +4002,7 @@ int sys_clock_getres(clockid_t clk, struct timespec *ts)
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_rename(const char *oldpath, const char *newpath)
+sysret_t sys_rename(const char *oldpath, const char *newpath)
{
int ret = -1;
#ifdef ARCH_MM_MMU
@@ -4120,7 +4042,7 @@ struct rlimit {
#define RLIMIT_MEMLOCK 8
#define RLIMIT_AS 9
-int sys_prlimit64(pid_t pid,
+sysret_t sys_prlimit64(pid_t pid,
unsigned int resource,
const struct rlimit *new_rlim,
struct rlimit *old_rlim)
@@ -4128,7 +4050,7 @@ int sys_prlimit64(pid_t pid,
return -ENOSYS;
}
-int sys_getrlimit(unsigned int resource, unsigned long rlim[2])
+sysret_t sys_getrlimit(unsigned int resource, unsigned long rlim[2])
{
int ret = -1;
@@ -4156,19 +4078,19 @@ int sys_getrlimit(unsigned int resource, unsigned long rlim[2])
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_setrlimit(unsigned int resource, struct rlimit *rlim)
+sysret_t sys_setrlimit(unsigned int resource, struct rlimit *rlim)
{
return -ENOSYS;
}
-int sys_setsid(void)
+sysret_t sys_setsid(void)
{
int ret = 0;
ret = setsid();
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_getrandom(void *buf, size_t buflen, unsigned int flags)
+sysret_t sys_getrandom(void *buf, size_t buflen, unsigned int flags)
{
int ret = -1;
int count = 0;
@@ -4294,7 +4216,7 @@ ssize_t sys_readlink(char* path, char *buf, size_t bufsz)
return bufsz;
}
-int sys_setaffinity(pid_t pid, size_t size, void *set)
+sysret_t sys_setaffinity(pid_t pid, size_t size, void *set)
{
if (!lwp_user_accessable(set, sizeof(cpu_set_t)))
{
@@ -4310,7 +4232,7 @@ int sys_setaffinity(pid_t pid, size_t size, void *set)
return -1;
}
-int sys_sched_setparam(pid_t pid, void *param)
+sysret_t sys_sched_setparam(pid_t pid, void *param)
{
struct sched_param *sched_param = (struct sched_param *)param;
struct rt_lwp *lwp = NULL;
@@ -4336,7 +4258,7 @@ int sys_sched_setparam(pid_t pid, void *param)
return ret;
}
-int sys_sched_getparam(pid_t pid, void *param)
+sysret_t sys_sched_getparam(pid_t pid, void *param)
{
struct sched_param *sched_param = (struct sched_param *)param;
struct rt_lwp *lwp = NULL;
@@ -4363,27 +4285,27 @@ int sys_sched_getparam(pid_t pid, void *param)
return ret;
}
-int sys_sched_get_priority_max(int policy)
+sysret_t sys_sched_get_priority_max(int policy)
{
if(policy < 0)
{
- rt_set_errno(EINVAL);
+ SET_ERRNO(EINVAL);
return -rt_get_errno();
}
return RT_THREAD_PRIORITY_MAX;
}
-int sys_sched_get_priority_min(int policy)
+sysret_t sys_sched_get_priority_min(int policy)
{
if(policy < 0)
{
- rt_set_errno(EINVAL);
+ SET_ERRNO(EINVAL);
return -rt_get_errno();
}
return 0;
}
-int sys_sched_setscheduler(int tid, int policy, void *param)
+sysret_t sys_sched_setscheduler(int tid, int policy, void *param)
{
struct sched_param *sched_param = (struct sched_param *)param;
rt_thread_t thread = lwp_tid_get_thread(tid);
@@ -4396,7 +4318,7 @@ int sys_sched_setscheduler(int tid, int policy, void *param)
return 0;
}
-int sys_sched_getscheduler(int tid, int *policy, void *param)
+sysret_t sys_sched_getscheduler(int tid, int *policy, void *param)
{
struct sched_param *sched_param = (struct sched_param *)param;
rt_thread_t thread = lwp_tid_get_thread(tid);
@@ -4409,7 +4331,7 @@ int sys_sched_getscheduler(int tid, int *policy, void *param)
return 0;
}
-int sys_fsync(int fd)
+sysret_t sys_fsync(int fd)
{
int res = fsync(fd);
if (res < 0)
@@ -4455,7 +4377,7 @@ mqd_t sys_mq_open(const char *name, int flags, mode_t mode, struct mq_attr *attr
return mqdes;
}
-int sys_mq_unlink(const char *name)
+sysret_t sys_mq_unlink(const char *name)
{
int ret = 0;
#ifdef ARCH_MM_MMU
@@ -4487,7 +4409,7 @@ int sys_mq_unlink(const char *name)
#endif
}
-int sys_mq_timedsend(mqd_t mqd, const char *msg, size_t len, unsigned prio, const struct timespec *at)
+sysret_t sys_mq_timedsend(mqd_t mqd, const char *msg, size_t len, unsigned prio, const struct timespec *at)
{
int ret = 0;
#ifdef ARCH_MM_MMU
@@ -4519,7 +4441,7 @@ int sys_mq_timedsend(mqd_t mqd, const char *msg, size_t len, unsigned prio, cons
#endif
}
-int sys_mq_timedreceive(mqd_t mqd, char *restrict msg, size_t len, unsigned *restrict prio, const struct timespec *restrict at)
+sysret_t sys_mq_timedreceive(mqd_t mqd, char *restrict msg, size_t len, unsigned *restrict prio, const struct timespec *restrict at)
{
int ret = 0;
#ifdef ARCH_MM_MMU
@@ -4555,7 +4477,7 @@ int sys_mq_timedreceive(mqd_t mqd, char *restrict msg, size_t len, unsigned *res
#endif
}
-int sys_mq_notify(mqd_t mqd, const struct sigevent *sev)
+sysret_t sys_mq_notify(mqd_t mqd, const struct sigevent *sev)
{
int ret = 0;
#ifdef ARCH_MM_MMU
@@ -4568,7 +4490,7 @@ int sys_mq_notify(mqd_t mqd, const struct sigevent *sev)
return (ret < 0 ? GET_ERRNO() : ret);
}
-int sys_mq_getsetattr(mqd_t mqd, const struct mq_attr *restrict new, struct mq_attr *restrict old)
+sysret_t sys_mq_getsetattr(mqd_t mqd, const struct mq_attr *restrict new, struct mq_attr *restrict old)
{
int ret = 0;
#ifdef ARCH_MM_MMU
@@ -4613,7 +4535,7 @@ int sys_mq_getsetattr(mqd_t mqd, const struct mq_attr *restrict new, struct mq_a
#endif
}
-int sys_mq_close(mqd_t mqd)
+sysret_t sys_mq_close(mqd_t mqd)
{
int ret = 0;
#ifdef ARCH_MM_MMU
@@ -4624,7 +4546,7 @@ int sys_mq_close(mqd_t mqd)
return (ret < 0 ? GET_ERRNO() : ret);
}
-const static void* func_table[] =
+const static struct rt_syscall_def func_table[] =
{
SYSCALL_SIGN(sys_exit), /* 01 */
SYSCALL_SIGN(sys_read),
@@ -4846,9 +4768,9 @@ const void *lwp_get_sys_api(rt_uint32_t number)
else
{
number -= 1;
- if (number < sizeof(func_table) / sizeof(func_table[0]) / 2)
+ if (number < sizeof(func_table) / sizeof(func_table[0]))
{
- func = func_table[number << 1];
+ func = func_table[number].func;
}
}
@@ -4866,12 +4788,12 @@ const char *lwp_get_syscall_name(rt_uint32_t number)
else
{
number -= 1;
- if (number < sizeof(func_table) / sizeof(func_table[0]) / 2)
+ if (number < sizeof(func_table) / sizeof(func_table[0]))
{
- name = (char*)func_table[(number << 1) + 1];
+ name = (char*)func_table[number].name;
}
}
// skip sys_
- return name + 4;
+ return name;
}
diff --git a/components/lwp/lwp_syscall.h b/components/lwp/lwp_syscall.h
index 3b4e0f7ac1..d7b684c3ad 100644
--- a/components/lwp/lwp_syscall.h
+++ b/components/lwp/lwp_syscall.h
@@ -11,6 +11,8 @@
#ifndef __LWP_SYSCALL_H__
#define __LWP_SYSCALL_H__
+#include <syscall_generic.h>
+
#include <stdint.h>
#include <rtthread.h>
#include <dfs_file.h>
@@ -46,55 +48,64 @@ void sys_exit(int value);
ssize_t sys_read(int fd, void *buf, size_t nbyte);
ssize_t sys_write(int fd, const void *buf, size_t nbyte);
off_t sys_lseek(int fd, off_t offset, int whence);
-int sys_open(const char *name, int mode, ...);
-int sys_close(int fd);
-int sys_ioctl(int fd, unsigned long cmd, void* data);
-int sys_fstat(int file, struct stat *buf);
-int sys_poll(struct pollfd *fds, nfds_t nfds, int timeout);
-int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
-int sys_gettimeofday(struct timeval *tp, struct timezone *tzp);
-int sys_settimeofday(const struct timeval *tv, const struct timezone *tzp);
-int sys_exec(char *filename, int argc, char **argv, char **envp);
-int sys_kill(int pid, int sig);
-int sys_getpid(void);
-int sys_getpriority(int which, id_t who);
-int sys_setpriority(int which, id_t who, int prio);
+sysret_t sys_open(const char *name, int mode, ...);
+sysret_t sys_close(int fd);
+sysret_t sys_ioctl(int fd, unsigned long cmd, void* data);
+sysret_t sys_fstat(int file, struct stat *buf);
+sysret_t sys_poll(struct pollfd *fds, nfds_t nfds, int timeout);
+sysret_t sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
+sysret_t sys_gettimeofday(struct timeval *tp, struct timezone *tzp);
+sysret_t sys_settimeofday(const struct timeval *tv, const struct timezone *tzp);
+sysret_t sys_exec(char *filename, int argc, char **argv, char **envp);
+sysret_t sys_kill(int pid, int sig);
+sysret_t sys_getpid(void);
+sysret_t sys_getpriority(int which, id_t who);
+sysret_t sys_setpriority(int which, id_t who, int prio);
rt_sem_t sys_sem_create(const char *name, rt_uint32_t value, rt_uint8_t flag);
-rt_err_t sys_sem_delete(rt_sem_t sem);
-rt_err_t sys_sem_take(rt_sem_t sem, rt_int32_t time);
-rt_err_t sys_sem_release(rt_sem_t sem);
+sysret_t sys_sem_delete(rt_sem_t sem);
+sysret_t sys_sem_take(rt_sem_t sem, rt_int32_t time);
+sysret_t sys_sem_release(rt_sem_t sem);
rt_mutex_t sys_mutex_create(const char *name, rt_uint8_t flag);
-rt_err_t sys_mutex_delete(rt_mutex_t mutex);
-rt_err_t sys_mutex_take(rt_mutex_t mutex, rt_int32_t time);
-rt_err_t sys_mutex_release(rt_mutex_t mutex);
+sysret_t sys_mutex_delete(rt_mutex_t mutex);
+sysret_t sys_mutex_take(rt_mutex_t mutex, rt_int32_t time);
+sysret_t sys_mutex_release(rt_mutex_t mutex);
rt_event_t sys_event_create(const char *name, rt_uint8_t flag);
-rt_err_t sys_event_delete(rt_event_t event);
-rt_err_t sys_event_send(rt_event_t event, rt_uint32_t set);
-rt_err_t sys_event_recv(rt_event_t event, rt_uint32_t set, rt_uint8_t opt, rt_int32_t timeout, rt_uint32_t *recved);
+sysret_t sys_event_delete(rt_event_t event);
+sysret_t sys_event_send(rt_event_t event, rt_uint32_t set);
+sysret_t sys_event_recv(rt_event_t event, rt_uint32_t set, rt_uint8_t opt, rt_int32_t timeout, rt_uint32_t *recved);
rt_mailbox_t sys_mb_create(const char *name, rt_size_t size, rt_uint8_t flag);
-rt_err_t sys_mb_delete(rt_mailbox_t mb);
-rt_err_t sys_mb_send(rt_mailbox_t mb, rt_ubase_t value);
-rt_err_t sys_mb_send_wait(rt_mailbox_t mb, rt_ubase_t value, rt_int32_t timeout);
-rt_err_t sys_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout);
+sysret_t sys_mb_delete(rt_mailbox_t mb);
+sysret_t sys_mb_send(rt_mailbox_t mb, rt_ubase_t value);
+sysret_t sys_mb_send_wait(rt_mailbox_t mb, rt_ubase_t value, rt_int32_t timeout);
+sysret_t sys_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout);
rt_mq_t sys_mq_create(const char *name, rt_size_t msg_size, rt_size_t max_msgs, rt_uint8_t flag);
-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);
-rt_err_t sys_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size);
-rt_err_t sys_mq_recv(rt_mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout);
+sysret_t sys_mq_delete(rt_mq_t mq);
+sysret_t sys_mq_send(rt_mq_t mq, void *buffer, rt_size_t size);
+sysret_t sys_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size);
+sysret_t sys_mq_recv(rt_mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout);
rt_thread_t sys_thread_create(void *arg[]);
-rt_err_t sys_thread_delete(rt_thread_t thread);
-rt_err_t sys_thread_startup(rt_thread_t thread);
+sysret_t sys_thread_delete(rt_thread_t thread);
+sysret_t sys_thread_startup(rt_thread_t thread);
rt_thread_t sys_thread_self(void);
-int sys_channel_open(const char *name, int flags);
-rt_err_t sys_channel_close(int fd);
-rt_err_t sys_channel_send(int fd, rt_channel_msg_t data);
-rt_err_t sys_channel_send_recv(int fd, rt_channel_msg_t data, rt_channel_msg_t data_ret);
-rt_err_t sys_channel_reply(int fd, rt_channel_msg_t data);
-rt_err_t sys_channel_recv(int fd, rt_channel_msg_t data);
+sysret_t sys_channel_open(const char *name, int flags);
+sysret_t sys_channel_close(int fd);
+sysret_t sys_channel_send(int fd, rt_channel_msg_t data);
+sysret_t sys_channel_send_recv(int fd, rt_channel_msg_t data, rt_channel_msg_t data_ret);
+sysret_t sys_channel_reply(int fd, rt_channel_msg_t data);
+sysret_t sys_channel_recv(int fd, rt_channel_msg_t data);
void sys_enter_critical(void);
void sys_exit_critical(void);
-int sys_log(const char* log, int size);
+sysret_t sys_dup(int oldfd);
+sysret_t sys_dup2(int oldfd, int new);
+
+sysret_t sys_log(const char* log, int size);
+
+#ifdef ARCH_MM_MMU
+sysret_t sys_futex(int *uaddr, int op, int val, const struct timespec *timeout, int *uaddr2, int val3);
+sysret_t sys_pmutex(void *umutex, int op, void *arg);
+sysret_t sys_cacheflush(void *addr, int len, int cache);
+#endif /* ARCH_MM_MMU */
#ifdef __cplusplus
}
diff --git a/components/lwp/syscall_data.h b/components/lwp/syscall_generic.h
index 7c700e0dd0..04b93e5fb8 100644
--- a/components/lwp/syscall_data.h
+++ b/components/lwp/syscall_generic.h
@@ -6,12 +6,21 @@
* Change Logs:
* Date Author Notes
* 2022-11-10 RT-Thread The first version
+ * 2023-03-13 WangXiaoyao syscall metadata as structure
*/
#ifndef __SYSCALL_DATA_H__
#define __SYSCALL_DATA_H__
#include <rtthread.h>
+typedef long sysret_t;
+
+struct rt_syscall_def
+{
+ void *func;
+ char *name;
+};
+
/**
* @brief signature for syscall, used to locate syscall metadata.
*
@@ -20,13 +29,15 @@
* which increases system booting time. We signature a pointer
* just below each syscall entry in syscall table to make it
* easy to locate every syscall's metadata by using syscall id.
- *
- * TODO Currently this adds a dummy pointer to syscall name.
- * After adding metadata of every syscalls in front of their definition,
- * this should be replaced by a pointer to that structure
*/
-#define SYSCALL_SIGN(func) \
- (void *)func, \
- RT_STRINGIFY(func)
+#define SYSCALL_SIGN(func) { \
+ (void *)(func), \
+ &RT_STRINGIFY(func)[4], \
+}
+
+#define SET_ERRNO(no) rt_set_errno(-(no))
+#define GET_ERRNO() ({int _errno = rt_get_errno(); _errno > 0 ? -_errno : _errno;})
+
+#define _SYS_WRAP(func) ({int _ret = func; _ret < 0 ? GET_ERRNO() : _ret;})
-#endif /* __SYSCALL_DATA_H__ */ \ No newline at end of file
+#endif /* __SYSCALL_DATA_H__ */
diff --git a/include/rtdef.h b/include/rtdef.h
index e72f9226fa..eda6f4ba2d 100644
--- a/include/rtdef.h
+++ b/include/rtdef.h
@@ -188,7 +188,7 @@ typedef __gnuc_va_list va_list;
#define va_end(v) __builtin_va_end(v)
#define va_arg(v,l) __builtin_va_arg(v,l)
#endif /* RT_USING_LIBC */
-#define __RT_STRINGIFY(x...) #x
+#define __RT_STRINGIFY(x...) (#x)
#define RT_STRINGIFY(x...) __RT_STRINGIFY(x)
#define rt_section(x) __attribute__((section(x)))
#define rt_used __attribute__((used))