diff --git a/Documentation/NuttxUserGuide.html b/Documentation/NuttxUserGuide.html index 701398f4ec8..61a5521f224 100644 --- a/Documentation/NuttxUserGuide.html +++ b/Documentation/NuttxUserGuide.html @@ -8598,11 +8598,7 @@ interface of the same name.

2.10.2.4 poll.h

diff --git a/fs/vfs/fs_ioctl.c b/fs/vfs/fs_ioctl.c index 3ea13d9679a..b55c9ed940f 100644 --- a/fs/vfs/fs_ioctl.c +++ b/fs/vfs/fs_ioctl.c @@ -59,7 +59,7 @@ ****************************************************************************/ /**************************************************************************** - * Name: file_ioctl + * Name: file_ioctl and file_vioctl * * Description: * Perform device specific operations. @@ -67,7 +67,7 @@ * Input Parameters: * file File structure instance * req The ioctl command - * arg The argument of the ioctl cmd + * ap The argument of the ioctl cmd * * Returned Value: * Returns a non-negative number on success; A negated errno value is @@ -76,7 +76,7 @@ * ****************************************************************************/ -int file_ioctl(FAR struct file *filep, int req, unsigned long arg) +int file_vioctl(FAR struct file *filep, int req, va_list ap) { FAR struct inode *inode; @@ -99,11 +99,25 @@ int file_ioctl(FAR struct file *filep, int req, unsigned long arg) /* Yes on both accounts. Let the driver perform the ioctl command */ - return (int)inode->u.i_ops->ioctl(filep, req, arg); + return inode->u.i_ops->ioctl(filep, req, va_arg(ap, unsigned long)); +} + +int file_ioctl(FAR struct file *filep, int req, ...) +{ + va_list ap; + int ret; + + /* Let file_vioctl() do the real work. */ + + va_start(ap, req); + ret = file_vioctl(filep, req, ap); + va_end(ap); + + return ret; } /**************************************************************************** - * Name: nx_ioctl + * Name: nx_ioctl and nx_vioctl * * Description: * nx_ioctl() is similar to the standard 'ioctl' interface except that is @@ -119,9 +133,10 @@ int file_ioctl(FAR struct file *filep, int req, unsigned long arg) * ****************************************************************************/ -int nx_ioctl(int fd, int req, unsigned long arg) +int nx_vioctl(int fd, int req, va_list ap) { FAR struct file *filep; + FAR int *arg; int ret; /* Did we get a valid file descriptor? */ @@ -133,7 +148,7 @@ int nx_ioctl(int fd, int req, unsigned long arg) #ifdef CONFIG_NET if (fd < (CONFIG_NFILE_DESCRIPTORS + CONFIG_NSOCKET_DESCRIPTORS)) { - ret = netdev_ioctl(fd, req, arg); + ret = netdev_vioctl(fd, req, ap); } else #endif @@ -155,7 +170,7 @@ int nx_ioctl(int fd, int req, unsigned long arg) /* Perform the file ioctl. */ - ret = file_ioctl(filep, req, arg); + ret = file_vioctl(filep, req, ap); } /* Check for File system IOCTL commands that can be implemented via @@ -167,20 +182,17 @@ int nx_ioctl(int fd, int req, unsigned long arg) switch (req) { case FIONBIO: - { - DEBUGASSERT(arg != 0); - - if (*(FAR int *)((uintptr_t)arg)) - { - ret = nx_fcntl(fd, F_SETFL, - nx_fcntl(fd, F_GETFL) | O_NONBLOCK); - } - else - { - ret = nx_fcntl(fd, F_SETFL, - nx_fcntl(fd, F_GETFL) & ~O_NONBLOCK); - } - } + arg = va_arg(ap, FAR int *); + if (arg && *arg) + { + ret = nx_fcntl(fd, F_SETFL, + nx_fcntl(fd, F_GETFL) | O_NONBLOCK); + } + else + { + ret = nx_fcntl(fd, F_SETFL, + nx_fcntl(fd, F_GETFL) & ~O_NONBLOCK); + } break; } } @@ -188,8 +200,22 @@ int nx_ioctl(int fd, int req, unsigned long arg) return ret; } +int nx_ioctl(int fd, int req, ...) +{ + va_list ap; + int ret; + + /* Let nx_vioctl() do the real work. */ + + va_start(ap, req); + ret = nx_vioctl(fd, req, ap); + va_end(ap); + + return ret; +} + /**************************************************************************** - * Name: ioctl/fs_ioctl + * Name: ioctl * * Description: * Perform device specific operations. @@ -197,7 +223,6 @@ int nx_ioctl(int fd, int req, unsigned long arg) * Input Parameters: * fd File/socket descriptor of device * req The ioctl command - * arg The argument of the ioctl cmd * * Returned Value: * >=0 on success (positive non-zero values are cmd-specific) @@ -217,15 +242,17 @@ int nx_ioctl(int fd, int req, unsigned long arg) * ****************************************************************************/ -#ifdef CONFIG_LIBC_IOCTL_VARIADIC -int fs_ioctl(int fd, int req, unsigned long arg) -#else -int ioctl(int fd, int req, unsigned long arg) -#endif +int ioctl(int fd, int req, ...) { + va_list ap; int ret; - ret = nx_ioctl(fd, req, arg); + /* Let nx_vioctl() do the real work. */ + + va_start(ap, req); + ret = nx_vioctl(fd, req, ap); + va_end(ap); + if (ret < 0) { set_errno(-ret); diff --git a/include/nuttx/fs/fs.h b/include/nuttx/fs/fs.h index 9f866f2cde0..04bdd19dff2 100644 --- a/include/nuttx/fs/fs.h +++ b/include/nuttx/fs/fs.h @@ -1220,7 +1220,7 @@ int file_truncate(FAR struct file *filep, off_t length); #endif /**************************************************************************** - * Name: file_ioctl + * Name: file_ioctl and file_vioctl * * Description: * Perform device specific operations. @@ -1228,7 +1228,7 @@ int file_truncate(FAR struct file *filep, off_t length); * Input Parameters: * file File structure instance * req The ioctl command - * arg The argument of the ioctl cmd + * ap The argument of the ioctl cmd * * Returned Value: * Returns a non-negative number on success; A negated errno value is @@ -1237,10 +1237,11 @@ int file_truncate(FAR struct file *filep, off_t length); * ****************************************************************************/ -int file_ioctl(FAR struct file *filep, int req, unsigned long arg); +int file_vioctl(FAR struct file *filep, int req, va_list ap); +int file_ioctl(FAR struct file *filep, int req, ...); /**************************************************************************** - * Name: nx_ioctl + * Name: nx_ioctl and nx_vioctl * * Description: * nx_ioctl() is similar to the standard 'ioctl' interface except that is @@ -1256,40 +1257,8 @@ int file_ioctl(FAR struct file *filep, int req, unsigned long arg); * ****************************************************************************/ -int nx_ioctl(int fd, int req, unsigned long arg); - -/**************************************************************************** - * Name: fs_ioctl - * - * Description: - * Perform device specific operations. - * - * Input Parameters: - * fd File/socket descriptor of device - * req The ioctl command - * arg The argument of the ioctl cmd - * - * Returned Value: - * >=0 on success (positive non-zero values are cmd-specific) - * -1 on failure with errno set properly: - * - * EBADF - * 'fd' is not a valid descriptor. - * EFAULT - * 'arg' references an inaccessible memory area. - * EINVAL - * 'cmd' or 'arg' is not valid. - * ENOTTY - * 'fd' is not associated with a character special device. - * ENOTTY - * The specified request does not apply to the kind of object that the - * descriptor 'fd' references. - * - ****************************************************************************/ - -#ifdef CONFIG_LIBC_IOCTL_VARIADIC -int fs_ioctl(int fd, int req, unsigned long arg); -#endif +int nx_vioctl(int fd, int req, va_list ap); +int nx_ioctl(int fd, int req, ...); /**************************************************************************** * Name: file_vfcntl diff --git a/include/nuttx/net/net.h b/include/nuttx/net/net.h index 871236f8176..8218c0c7601 100644 --- a/include/nuttx/net/net.h +++ b/include/nuttx/net/net.h @@ -1228,7 +1228,7 @@ int psock_getpeername(FAR struct socket *psock, FAR struct sockaddr *addr, FAR socklen_t *addrlen); /**************************************************************************** - * Name: psock_ioctl + * Name: psock_ioctl and psock_vioctl * * Description: * Perform network device specific operations. @@ -1236,7 +1236,7 @@ int psock_getpeername(FAR struct socket *psock, FAR struct sockaddr *addr, * Input Parameters: * psock A pointer to a NuttX-specific, internal socket structure * cmd The ioctl command - * arg The argument of the ioctl cmd + * ap The argument of the ioctl cmd * * Returned Value: * A non-negative value is returned on success; a negated errno value is @@ -1258,10 +1258,11 @@ int psock_getpeername(FAR struct socket *psock, FAR struct sockaddr *addr, * ****************************************************************************/ -int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg); +int psock_vioctl(FAR struct socket *psock, int cmd, va_list ap); +int psock_ioctl(FAR struct socket *psock, int cmd, ...); /**************************************************************************** - * Name: netdev_ioctl + * Name: netdev_vioctl * * Description: * Perform network device specific operations. @@ -1269,7 +1270,7 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg); * Input Parameters: * sockfd Socket descriptor of device * cmd The ioctl command - * arg The argument of the ioctl cmd + * ap The argument of the ioctl cmd * * Returned Value: * A non-negative value is returned on success; a negated errno value is @@ -1291,7 +1292,7 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg); * ****************************************************************************/ -int netdev_ioctl(int sockfd, int cmd, unsigned long arg); +int netdev_vioctl(int sockfd, int cmd, va_list ap); /**************************************************************************** * Name: psock_poll diff --git a/include/sys/ioctl.h b/include/sys/ioctl.h index 6672abe8ba1..26ab37168af 100644 --- a/include/sys/ioctl.h +++ b/include/sys/ioctl.h @@ -126,11 +126,7 @@ extern "C" * ****************************************************************************/ -#ifdef CONFIG_LIBC_IOCTL_VARIADIC int ioctl(int fd, int req, ...); -#else -int ioctl(int fd, int req, unsigned long arg); -#endif #undef EXTERN #if defined(__cplusplus) diff --git a/include/sys/syscall.h b/include/sys/syscall.h index 6ee8655a839..88c7d4c3221 100644 --- a/include/sys/syscall.h +++ b/include/sys/syscall.h @@ -284,13 +284,7 @@ */ #define SYS_close (__SYS_descriptors + 0) - -#ifdef CONFIG_LIBC_IOCTL_VARIADIC -# define SYS_fs_ioctl (__SYS_descriptors + 1) -#else -# define SYS_ioctl (__SYS_descriptors + 1) -#endif - +#define SYS_ioctl (__SYS_descriptors + 1) #define SYS_read (__SYS_descriptors + 2) #define SYS_write (__SYS_descriptors + 3) #define SYS_pread (__SYS_descriptors + 4) diff --git a/libs/libc/libc.csv b/libs/libc/libc.csv index 2eafa1e92ae..d20d28c0e16 100644 --- a/libs/libc/libc.csv +++ b/libs/libc/libc.csv @@ -64,7 +64,6 @@ "inet_ntoa","arpa/inet.h","defined(CONFIG_NET_IPv4)","FAR char","struct in_addr" "inet_ntop","arpa/inet.h","","FAR const char","int","FAR const void *","FAR char *","socklen_t" "inet_pton","arpa/inet.h","","int","int","FAR const char *","FAR void *" -"ioctl","sys/ioctl.h","defined(CONFIG_LIBC_IOCTL_VARIADIC)","int","int","int","..." "iswalnum","wctype.h","defined(CONFIG_LIBC_WCHAR)","int","wint_t" "iswalpha","wctype.h","defined(CONFIG_LIBC_WCHAR)","int","wint_t" "iswblank","wctype.h","defined(CONFIG_LIBC_WCHAR)","int","wint_t" diff --git a/libs/libc/misc/Kconfig b/libs/libc/misc/Kconfig index 7247e91da7b..c36b785c205 100644 --- a/libs/libc/misc/Kconfig +++ b/libs/libc/misc/Kconfig @@ -3,49 +3,6 @@ # see the file kconfig-language.txt in the NuttX tools repository. # -config LIBC_IOCTL_VARIADIC - bool "Enable variadic ioctl()" - default y - ---help--- - By default, NuttX implements the "old style," three-parameter, - ioctl() interface with this function prototype: - - int ioctl(int fd, int req, unsigned long arg); - - That function is implemented as part of the VFS. If - LIBC_IOCTL_VARIADIC is selected, then an additional compatibility - layer will be provided in the C library. The enabled, then function - prototype will become: - - int ioctl(int fd, int req, ...); - - The ioctl() is not controlled by any standard so it is really - arbitrary which format you used. You may select the variadic - function prototype with this option. That will slightly increase - code size and ioctl() processing time. It will not support a - variable number of arguments and it still always expects to see a - third argument of type 'unsigned long'. The only benefit of this - alternative function signature is that it may provide greater - compatibility if you are porting code from other platforms that use - the variadic ioctl() function. - - WARNING: Use of this option could cause subtle system errors is - the third argument is omitted or if the sizeof the thread argument - is anything other than sizeof (unsigned long). Most small integers - will be promoted to 'int'. The following assertion appears in ioctl(): - - DEBUGASSERT(sizeof(int) == sizeof(unsigned long) && - sizeof(FAR void *) == sizeof(unsigned long)); - - Do not enable this option if the above is not true. 32-bit ARM - should pass this test with all three types having sizeof(type) == 4 - bytes. 'float' should also be tested. But 'long long' and 'double' - are out of the question! Don't event try to pass them. - - And what will happen if no third argument is passed? In most cases, - this should just result in a garbage value for arg. But you may - discover cases where something worse happens! - config LIB_SENDFILE_BUFSIZE int "sendfile() buffer size" default 512 diff --git a/libs/libc/misc/Make.defs b/libs/libc/misc/Make.defs index 02e60fd6e8b..4edbdc4a23c 100644 --- a/libs/libc/misc/Make.defs +++ b/libs/libc/misc/Make.defs @@ -56,10 +56,6 @@ ifneq ($(CONFIG_NFILE_STREAMS),0) CSRCS += lib_streamsem.c endif -ifeq ($(CONFIG_LIBC_IOCTL_VARIADIC),y) -CSRCS += lib_ioctl.c -endif - ifeq ($(CONFIG_PIPES),y) CSRCS += lib_mkfifo.c endif diff --git a/libs/libc/misc/lib_ioctl.c b/libs/libc/misc/lib_ioctl.c deleted file mode 100644 index af91bcadb26..00000000000 --- a/libs/libc/misc/lib_ioctl.c +++ /dev/null @@ -1,117 +0,0 @@ -/**************************************************************************** - * libs/libc/misc/lib_ioctl.c - * - * Copyright (C) 2014 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include - -#include -#include -#include -#include - -#include - -#include "libc.h" - -#ifdef CONFIG_LIBC_IOCTL_VARIADIC - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: ioctl - * - * Description: - * Perform device specific operations. - * - * Input Parameters: - * fd File/socket descriptor of device - * req The ioctl command - * ... A third argument of type unsigned long is expected - * - * Returned Value: - * >=0 on success (positive non-zero values are cmd-specific) - * -1 on failure with errno set properly: - * - * EBADF - * 'fd' is not a valid descriptor. - * EFAULT - * 'arg' references an inaccessible memory area. - * EINVAL - * 'cmd' or 'arg' is not valid. - * ENOTTY - * 'fd' is not associated with a character special device. - * ENOTTY - * The specified request does not apply to the kind of object that the - * descriptor 'fd' references. - * - ****************************************************************************/ - -int ioctl(int fd, int req, ...) -{ - unsigned long arg; - va_list ap; - - /* Get the unsigned long argument. - * - * REVISIT: This could be the cause of the crash down the road if the - * actual size of the argument is not sizeof(unsigned long). - * Most small integers will be promoted to 'int'. ARM should pass the - * following test with all three types having sizeof(type) == 4 bytes. - * 'float' should also be tested. But 'long long' and 'double' are out of - * the question! Don't try to pass them. - * - * And what will happen if no third argument is passed? In most cases, - * this should just result in a garbage value for arg. But you may - * discover cases where something worse happens! - */ - - DEBUGASSERT(sizeof(int) <= sizeof(unsigned long) && - sizeof(FAR void *) == sizeof(unsigned long)); - - va_start(ap, req); - arg = va_arg(ap, unsigned long); - va_end(ap); - - /* Then let fs_ioctl() to the real work */ - - return fs_ioctl(fd, req, arg); -} - -#endif /* CONFIG_LIBC_IOCTL_VARIADIC */ diff --git a/net/netdev/netdev_ioctl.c b/net/netdev/netdev_ioctl.c index 4e27251d1af..1844b15b891 100644 --- a/net/netdev/netdev_ioctl.c +++ b/net/netdev/netdev_ioctl.c @@ -1577,7 +1577,7 @@ ssize_t net_ioctl_arglen(int cmd) #endif /**************************************************************************** - * Name: psock_ioctl + * Name: psock_ioctl and psock_vioctl * * Description: * Perform network device specific operations. @@ -1607,8 +1607,9 @@ ssize_t net_ioctl_arglen(int cmd) * ****************************************************************************/ -int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg) +int psock_vioctl(FAR struct socket *psock, int cmd, va_list ap) { + unsigned long arg; int ret; /* Verify that the psock corresponds to valid, allocated socket */ @@ -1618,6 +1619,8 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg) return -EBADF; } + arg = va_arg(ap, unsigned long); + #ifdef CONFIG_NET_USRSOCK /* Check for a USRSOCK ioctl command */ @@ -1702,6 +1705,25 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg) return ret; } +int psock_ioctl(FAR struct socket *psock, int cmd, ...) +{ + va_list ap; + int ret; + + /* Setup to access the variable argument list */ + + va_start(ap, cmd); + + /* Let psock_vfcntl() do the real work. The errno is not set on + * failures. + */ + + ret = psock_vioctl(psock, cmd, ap); + + va_end(ap); + return ret; +} + /**************************************************************************** * Name: netdev_ioctl * @@ -1711,7 +1733,7 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg) * Input Parameters: * sockfd Socket descriptor of device * cmd The ioctl command - * arg The argument of the ioctl cmd + * ap The argument of the ioctl cmd * * Returned Value: * A non-negative value is returned on success; a negated errno value is @@ -1733,11 +1755,11 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg) * ****************************************************************************/ -int netdev_ioctl(int sockfd, int cmd, unsigned long arg) +int netdev_vioctl(int sockfd, int cmd, va_list ap) { FAR struct socket *psock = sockfd_socket(sockfd); - return psock_ioctl(psock, cmd, arg); + return psock_ioctl(psock, cmd, ap); } /**************************************************************************** diff --git a/syscall/syscall.csv b/syscall/syscall.csv index 238b093ba00..9a048da6a5c 100644 --- a/syscall/syscall.csv +++ b/syscall/syscall.csv @@ -24,7 +24,6 @@ "exit","stdlib.h","","void","int" "fcntl","fcntl.h","","int","int","int","..." "fs_fdopen","nuttx/fs/fs.h","CONFIG_NFILE_STREAMS > 0","FAR struct file_struct*","int","int","FAR struct tcb_s*" -"fs_ioctl","nuttx/fs/fs.h","defined(CONFIG_LIBC_IOCTL_VARIADIC)","int","int","int","unsigned long" "fstat","sys/stat.h","","int","int","FAR struct stat*" "fstatfs","sys/statfs.h","","int","int","FAR struct statfs*" "fsync","unistd.h","!defined(CONFIG_DISABLE_MOUNTPOINT)","int","int" @@ -42,7 +41,7 @@ "if_indextoname","net/if.h","defined(CONFIG_NETDEV_IFINDEX)","FAR char *","unsigned int","FAR char *" "if_nametoindex","net/if.h","defined(CONFIG_NETDEV_IFINDEX)","unsigned int","FAR const char *" "insmod","nuttx/module.h","defined(CONFIG_MODULE)","FAR void *","FAR const char *","FAR const char *" -"ioctl","sys/ioctl.h","!defined(CONFIG_LIBC_IOCTL_VARIADIC)","int","int","int","unsigned long" +"ioctl","sys/ioctl.h","","int","int","int","..." "kill","signal.h","","int","pid_t","int" "link","unistd.h","defined(CONFIG_PSEUDOFS_SOFTLINKS)","int","FAR const char *","FAR const char *" "listen","sys/socket.h","defined(CONFIG_NET)","int","int","int" diff --git a/syscall/syscall_lookup.h b/syscall/syscall_lookup.h index 17e5e6a00c5..2f23a2351b1 100644 --- a/syscall/syscall_lookup.h +++ b/syscall/syscall_lookup.h @@ -197,11 +197,7 @@ SYSCALL_LOOKUP(up_assert, 2, STUB_up_assert) */ SYSCALL_LOOKUP(close, 1, STUB_close) -#ifdef CONFIG_LIBC_IOCTL_VARIADIC - SYSCALL_LOOKUP(fs_ioctl, 3, STUB_fs_ioctl) -#else - SYSCALL_LOOKUP(ioctl, 3, STUB_ioctl) -#endif + SYSCALL_LOOKUP(ioctl, 6, STUB_ioctl) SYSCALL_LOOKUP(read, 3, STUB_read) SYSCALL_LOOKUP(write, 3, STUB_write) SYSCALL_LOOKUP(pread, 4, STUB_pread) diff --git a/syscall/syscall_stublookup.c b/syscall/syscall_stublookup.c index 493f8e6d52a..1a6a47f7ac3 100644 --- a/syscall/syscall_stublookup.c +++ b/syscall/syscall_stublookup.c @@ -189,13 +189,9 @@ uintptr_t STUB_nx_vsyslog(int nbr, uintptr_t parm1, uintptr_t parm2, */ uintptr_t STUB_close(int nbr, uintptr_t parm1); -#ifdef CONFIG_LIBC_IOCTL_VARIADIC -uintptr_t STUB_fs_ioctl(int nbr, uintptr_t parm1, uintptr_t parm2, - uintptr_t parm3); -#else uintptr_t STUB_ioctl(int nbr, uintptr_t parm1, uintptr_t parm2, - uintptr_t parm3); -#endif + uintptr_t parm3, uintptr_t parm4, uintptr_t parm5, + uintptr_t parm6); uintptr_t STUB_read(int nbr, uintptr_t parm1, uintptr_t parm2, uintptr_t parm3); uintptr_t STUB_write(int nbr, uintptr_t parm1, uintptr_t parm2,