From e8efd8e71f89b22d0a5028495cc35bd167f92e63 Mon Sep 17 00:00:00 2001 From: Christophe Lyon Date: Mon, 3 Feb 2014 17:04:32 +0100 Subject: [PATCH 01/13] Add support for MAP_NORESERVE mmap flag. mmap_flags_tbl contains a list of mmap flags, and how to map them to the target. This patch adds MAP_NORESERVE, which was missing to the list. Signed-off-by: Christophe Lyon Reviewed-by: Peter Maydell Signed-off-by: Riku Voipio --- linux-user/syscall.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 7d7407920b..007d59d70c 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -3908,6 +3908,8 @@ static bitmask_transtbl mmap_flags_tbl[] = { { TARGET_MAP_DENYWRITE, TARGET_MAP_DENYWRITE, MAP_DENYWRITE, MAP_DENYWRITE }, { TARGET_MAP_EXECUTABLE, TARGET_MAP_EXECUTABLE, MAP_EXECUTABLE, MAP_EXECUTABLE }, { TARGET_MAP_LOCKED, TARGET_MAP_LOCKED, MAP_LOCKED, MAP_LOCKED }, + { TARGET_MAP_NORESERVE, TARGET_MAP_NORESERVE, MAP_NORESERVE, + MAP_NORESERVE }, { 0, 0, 0, 0 } }; From 76b94245507881a0621c5bb3b144c3c19dcbcb4d Mon Sep 17 00:00:00 2001 From: Wim Vander Schelden Date: Wed, 18 Jun 2014 11:02:39 +0200 Subject: [PATCH 02/13] linux-user: added fake open() for /proc/self/cmdline Signed-off-by: Wim Vander Schelden Signed-off-by: Riku Voipio --- linux-user/syscall.c | 46 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 007d59d70c..5c175ba13a 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4949,6 +4949,51 @@ int host_to_target_waitstatus(int status) return status; } +static int open_self_cmdline(void *cpu_env, int fd) +{ + int fd_orig = -1; + bool word_skipped = false; + + fd_orig = open("/proc/self/cmdline", O_RDONLY); + if (fd_orig < 0) { + return fd_orig; + } + + while (true) { + ssize_t nb_read; + char buf[128]; + char *cp_buf = buf; + + nb_read = read(fd_orig, buf, sizeof(buf)); + if (nb_read < 0) { + fd_orig = close(fd_orig); + return -1; + } else if (nb_read == 0) { + break; + } + + if (!word_skipped) { + /* Skip the first string, which is the path to qemu-*-static + instead of the actual command. */ + cp_buf = memchr(buf, 0, sizeof(buf)); + if (cp_buf) { + /* Null byte found, skip one string */ + cp_buf++; + nb_read -= cp_buf - buf; + word_skipped = true; + } + } + + if (word_skipped) { + if (write(fd, cp_buf, nb_read) != nb_read) { + return -1; + } + } + } + + return close(fd_orig); +} + static int open_self_maps(void *cpu_env, int fd) { #if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32) @@ -5150,6 +5195,7 @@ static int do_open(void *cpu_env, const char *pathname, int flags, mode_t mode) { "maps", open_self_maps, is_proc_myself }, { "stat", open_self_stat, is_proc_myself }, { "auxv", open_self_auxv, is_proc_myself }, + { "cmdline", open_self_cmdline, is_proc_myself }, #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) { "/proc/net/route", open_net_route, is_proc }, #endif From 8289d112811adfd609c1e3d855427a96418564b0 Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sun, 22 Jun 2014 11:25:33 +0100 Subject: [PATCH 03/13] linux-user: translate the result of getsockopt SO_TYPE QEMU previously passed the result of the host syscall directly to the target program. This is a problem if the host & target have different representations of socket types, as is the case when running a MIPS target program on an x86 host. Introduce a host_to_target_sock_type helper function mirroring the existing target_to_host_sock_type, and call it to translate the value provided by getsockopt when called for the SO_TYPE option. Signed-off-by: Paul Burton Signed-off-by: Riku Voipio --- linux-user/syscall.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 5c175ba13a..8d13781bf8 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -592,6 +592,37 @@ char *target_strerror(int err) return strerror(target_to_host_errno(err)); } +static inline int host_to_target_sock_type(int host_type) +{ + int target_type; + + switch (host_type & 0xf /* SOCK_TYPE_MASK */) { + case SOCK_DGRAM: + target_type = TARGET_SOCK_DGRAM; + break; + case SOCK_STREAM: + target_type = TARGET_SOCK_STREAM; + break; + default: + target_type = host_type & 0xf /* SOCK_TYPE_MASK */; + break; + } + +#if defined(SOCK_CLOEXEC) + if (host_type & SOCK_CLOEXEC) { + target_type |= TARGET_SOCK_CLOEXEC; + } +#endif + +#if defined(SOCK_NONBLOCK) + if (host_type & SOCK_NONBLOCK) { + target_type |= TARGET_SOCK_NONBLOCK; + } +#endif + + return target_type; +} + static abi_ulong target_brk; static abi_ulong target_original_brk; static abi_ulong brk_page; @@ -1636,6 +1667,9 @@ static abi_long do_getsockopt(int sockfd, int level, int optname, ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv)); if (ret < 0) return ret; + if (optname == SO_TYPE) { + val = host_to_target_sock_type(val); + } if (len > lv) len = lv; if (len == 4) { From aec1ca411e8b772823d88eb64d86478a381cb819 Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sun, 22 Jun 2014 11:25:34 +0100 Subject: [PATCH 04/13] linux-user: support SO_ACCEPTCONN getsockopt option Translate the SO_ACCEPTCONN option to the host value & execute the syscall as expected. Signed-off-by: Paul Burton Signed-off-by: Riku Voipio --- linux-user/syscall.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 8d13781bf8..b1e57df4a3 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1652,6 +1652,9 @@ static abi_long do_getsockopt(int sockfd, int level, int optname, case TARGET_SO_RCVLOWAT: optname = SO_RCVLOWAT; goto int_case; + case TARGET_SO_ACCEPTCONN: + optname = SO_ACCEPTCONN; + goto int_case; default: goto int_case; } From d79b6cc4350a1c8debab8ae9a60ea745ea7ef036 Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sun, 22 Jun 2014 11:25:35 +0100 Subject: [PATCH 05/13] linux-user: support SO_{SND, RCV}BUFFORCE setsockopt options Translate the SO_SNDBUFFORCE & SO_RCVBUFFORCE options to setsockopt to the host values & perform the syscall as expected, allowing use of those options by target programs. Signed-off-by: Paul Burton Signed-off-by: Riku Voipio --- linux-user/syscall.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index b1e57df4a3..bdc60fe0ee 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1502,9 +1502,15 @@ set_timeout: case TARGET_SO_SNDBUF: optname = SO_SNDBUF; break; + case TARGET_SO_SNDBUFFORCE: + optname = SO_SNDBUFFORCE; + break; case TARGET_SO_RCVBUF: optname = SO_RCVBUF; break; + case TARGET_SO_RCVBUFFORCE: + optname = SO_RCVBUFFORCE; + break; case TARGET_SO_KEEPALIVE: optname = SO_KEEPALIVE; break; From 82d0fe6b7a7384ed442b6a481ab33d442a06f5f1 Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sun, 22 Jun 2014 11:25:36 +0100 Subject: [PATCH 06/13] linux-user: support SO_PASSSEC setsockopt option Translate the SO_PASSSEC option to setsockopt to the host value & perform the syscall as expected, allowing use of the option by target programs. Signed-off-by: Paul Burton Signed-off-by: Riku Voipio --- linux-user/socket.h | 5 +++++ linux-user/syscall.c | 3 +++ 2 files changed, 8 insertions(+) diff --git a/linux-user/socket.h b/linux-user/socket.h index ae17959902..4dacae6127 100644 --- a/linux-user/socket.h +++ b/linux-user/socket.h @@ -63,6 +63,7 @@ #define TARGET_SO_PEERSEC 30 #define TARGET_SO_SNDBUFFORCE 31 #define TARGET_SO_RCVBUFFORCE 33 + #define TARGET_SO_PASSSEC 34 /** sock_type - Socket types * @@ -242,6 +243,10 @@ #define TARGET_SOCK_MAX (TARGET_SOCK_PACKET + 1) #define TARGET_SOCK_TYPE_MASK 0xf /* Covers up to TARGET_SOCK_MAX-1. */ + + #define TARGET_SO_PASSSEC 31 +#else + #define TARGET_SO_PASSSEC 34 #endif /* For setsockopt(2) */ diff --git a/linux-user/syscall.c b/linux-user/syscall.c index bdc60fe0ee..3971cb51d6 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1531,6 +1531,9 @@ set_timeout: case TARGET_SO_PASSCRED: optname = SO_PASSCRED; break; + case TARGET_SO_PASSSEC: + optname = SO_PASSSEC; + break; case TARGET_SO_TIMESTAMP: optname = SO_TIMESTAMP; break; From 356d771b30071b44fcb19d2f8d911784b9b276be Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sun, 22 Jun 2014 11:25:37 +0100 Subject: [PATCH 07/13] linux-user: allow NULL arguments to mount Calls to the mount syscall can legitimately provide NULL as the value for the source of filesystemtype arguments, which QEMU would previously reject & return -EFAULT to the target program. An example of this is remounting an already mounted filesystem with different properties. Instead of rejecting such syscalls with -EFAULT, pass NULL along to the kernel as the target program expects. Additionally this patch fixes a potential memory leak when DEBUG_REMAP is enabled and lock_user_string fails on the target or filesystemtype arguments but a prior argument was non-NULL and already locked. Since the patch already touched most lines of the TARGET_NR_mount case, it fixes the indentation & coding style for good measure. Signed-off-by: Paul Burton Signed-off-by: Riku Voipio --- linux-user/syscall.c | 75 +++++++++++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 22 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 3971cb51d6..4e48af68aa 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5614,29 +5614,60 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, break; #endif case TARGET_NR_mount: - { - /* need to look at the data field */ - void *p2, *p3; - p = lock_user_string(arg1); - p2 = lock_user_string(arg2); - p3 = lock_user_string(arg3); - if (!p || !p2 || !p3) - ret = -TARGET_EFAULT; - else { - /* FIXME - arg5 should be locked, but it isn't clear how to - * do that since it's not guaranteed to be a NULL-terminated - * string. - */ - if ( ! arg5 ) - ret = get_errno(mount(p, p2, p3, (unsigned long)arg4, NULL)); - else - ret = get_errno(mount(p, p2, p3, (unsigned long)arg4, g2h(arg5))); - } + { + /* need to look at the data field */ + void *p2, *p3; + + if (arg1) { + p = lock_user_string(arg1); + if (!p) { + goto efault; + } + } else { + p = NULL; + } + + p2 = lock_user_string(arg2); + if (!p2) { + if (arg1) { + unlock_user(p, arg1, 0); + } + goto efault; + } + + if (arg3) { + p3 = lock_user_string(arg3); + if (!p3) { + if (arg1) { unlock_user(p, arg1, 0); - unlock_user(p2, arg2, 0); - unlock_user(p3, arg3, 0); - break; - } + } + unlock_user(p2, arg2, 0); + goto efault; + } + } else { + p3 = NULL; + } + + /* FIXME - arg5 should be locked, but it isn't clear how to + * do that since it's not guaranteed to be a NULL-terminated + * string. + */ + if (!arg5) { + ret = mount(p, p2, p3, (unsigned long)arg4, NULL); + } else { + ret = mount(p, p2, p3, (unsigned long)arg4, g2h(arg5)); + } + ret = get_errno(ret); + + if (arg1) { + unlock_user(p, arg1, 0); + } + unlock_user(p2, arg2, 0); + if (arg3) { + unlock_user(p3, arg3, 0); + } + } + break; #ifdef TARGET_NR_umount case TARGET_NR_umount: if (!(p = lock_user_string(arg1))) From 0fa82d39c8afbaaa2fb4cdbb30f36c3dc76dad8e Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sun, 22 Jun 2014 11:25:38 +0100 Subject: [PATCH 08/13] linux-user: support strace of epoll_create1 Add the epoll_create1 syscall to strace.list in order to display that syscall when it occurs, rather than a message about the syscall being unknown despite QEMU already implementing support for it. Signed-off-by: Paul Burton Signed-off-by: Riku Voipio --- linux-user/strace.list | 3 +++ 1 file changed, 3 insertions(+) diff --git a/linux-user/strace.list b/linux-user/strace.list index cf5841af60..fcb258d348 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -114,6 +114,9 @@ #ifdef TARGET_NR_epoll_create { TARGET_NR_epoll_create, "epoll_create" , NULL, NULL, NULL }, #endif +#ifdef TARGET_NR_epoll_create1 +{ TARGET_NR_epoll_create1, "epoll_create1" , NULL, NULL, NULL }, +#endif #ifdef TARGET_NR_epoll_ctl { TARGET_NR_epoll_ctl, "epoll_ctl" , NULL, NULL, NULL }, #endif From fd7678324391d497b53afa40eeafe04cc05030df Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sun, 22 Jun 2014 11:25:39 +0100 Subject: [PATCH 09/13] linux-user: fix struct target_epoll_event layout for MIPS MIPS requires the pad field to 64b-align the data field just as ARM does. Signed-off-by: Paul Burton Signed-off-by: Riku Voipio --- linux-user/syscall_defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 69c3982ee6..e379b45cab 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -2528,7 +2528,7 @@ typedef union target_epoll_data { struct target_epoll_event { uint32_t events; -#ifdef TARGET_ARM +#if defined(TARGET_ARM) || defined(TARGET_MIPS) || defined(TARGET_MIPS64) uint32_t __pad; #endif target_epoll_data_t data; From ef4467e911fc8a8a58c85877152a6ef7f46ed03a Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sun, 22 Jun 2014 11:25:40 +0100 Subject: [PATCH 10/13] linux-user: respect timezone for settimeofday The settimeofday syscall accepts a tz argument indicating the desired timezone to the kernel. QEMU previously ignored any argument provided by the target program & always passed NULL to the kernel. Instead, translate the argument & pass along the data userland provided. Although this argument is described by the settimeofday man page as obsolete, it is used by systemd as of version 213. Signed-off-by: Paul Burton Signed-off-by: Riku Voipio --- linux-user/syscall.c | 29 ++++++++++++++++++++++++++++- linux-user/syscall_defs.h | 5 +++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 4e48af68aa..0ce1a4e369 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -935,6 +935,23 @@ static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr, return 0; } +static inline abi_long copy_from_user_timezone(struct timezone *tz, + abi_ulong target_tz_addr) +{ + struct target_timezone *target_tz; + + if (!lock_user_struct(VERIFY_READ, target_tz, target_tz_addr, 1)) { + return -TARGET_EFAULT; + } + + __get_user(tz->tz_minuteswest, &target_tz->tz_minuteswest); + __get_user(tz->tz_dsttime, &target_tz->tz_dsttime); + + unlock_user_struct(target_tz, target_tz_addr, 0); + + return 0; +} + #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open) #include @@ -6385,9 +6402,19 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, case TARGET_NR_settimeofday: { struct timeval tv; + struct timezone tz, *ptz = NULL; + if (copy_from_user_timeval(&tv, arg1)) goto efault; - ret = get_errno(settimeofday(&tv, NULL)); + + if (arg2) { + if (copy_from_user_timezone(&tz, arg2)) { + goto efault; + } + ptz = &tz; + } + + ret = get_errno(settimeofday(&tv, ptz)); } break; #if defined(TARGET_NR_select) diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index e379b45cab..a1f1fce921 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -165,6 +165,11 @@ struct target_timespec { abi_long tv_nsec; }; +struct target_timezone { + abi_int tz_minuteswest; + abi_int tz_dsttime; +}; + struct target_itimerval { struct target_timeval it_interval; struct target_timeval it_value; From b67d80311a7d081747c0f4a731e0bfd2facf1464 Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sun, 22 Jun 2014 11:25:41 +0100 Subject: [PATCH 11/13] linux-user: allow NULL tv argument for settimeofday The tv argument to the settimeofday syscall is allowed to be NULL, if the program only wishes to provide the timezone. QEMU previously returned -EFAULT when tv was NULL. Instead, execute the syscall & provide NULL to the kernel as the target program expected. Signed-off-by: Paul Burton Signed-off-by: Riku Voipio --- linux-user/syscall.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 0ce1a4e369..8e2762b0ed 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6401,11 +6401,15 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, break; case TARGET_NR_settimeofday: { - struct timeval tv; + struct timeval tv, *ptv = NULL; struct timezone tz, *ptz = NULL; - if (copy_from_user_timeval(&tv, arg1)) - goto efault; + if (arg1) { + if (copy_from_user_timeval(&tv, arg1)) { + goto efault; + } + ptv = &tv; + } if (arg2) { if (copy_from_user_timezone(&tz, arg2)) { @@ -6414,7 +6418,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, ptz = &tz; } - ret = get_errno(settimeofday(&tv, ptz)); + ret = get_errno(settimeofday(ptv, ptz)); } break; #if defined(TARGET_NR_select) From ca56f5b59622af0101f51b0f29459f749b6cbab0 Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sun, 22 Jun 2014 11:25:47 +0100 Subject: [PATCH 12/13] linux-user: support the KDSIGACCEPT ioctl Add a definition of the KDSIGACCEPT ioctl & allow its use by target programs. Signed-off-by: Paul Burton Signed-off-by: Riku Voipio --- linux-user/ioctls.h | 1 + linux-user/syscall.c | 7 +++++++ linux-user/syscall_defs.h | 1 + 3 files changed, 9 insertions(+) diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h index 309fb21759..f278d3e989 100644 --- a/linux-user/ioctls.h +++ b/linux-user/ioctls.h @@ -64,6 +64,7 @@ IOCTL(KDSKBLED, 0, TYPE_INT) IOCTL(KDGETLED, 0, TYPE_INT) IOCTL(KDSETLED, 0, TYPE_INT) + IOCTL_SPECIAL(KDSIGACCEPT, 0, do_ioctl_kdsigaccept, TYPE_INT) IOCTL(BLKROSET, IOC_W, MK_PTR(TYPE_INT)) IOCTL(BLKROGET, IOC_R, MK_PTR(TYPE_INT)) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 8e2762b0ed..5a272d3d08 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -3689,6 +3689,13 @@ static abi_long do_ioctl_rt(const IOCTLEntry *ie, uint8_t *buf_temp, return ret; } +static abi_long do_ioctl_kdsigaccept(const IOCTLEntry *ie, uint8_t *buf_temp, + int fd, abi_long cmd, abi_long arg) +{ + int sig = target_to_host_signal(arg); + return get_errno(ioctl(fd, ie->host_cmd, sig)); +} + static IOCTLEntry ioctl_entries[] = { #define IOCTL(cmd, access, ...) \ { TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } }, diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index a1f1fce921..4adfd3a400 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -831,6 +831,7 @@ struct target_pollfd { #define TARGET_KDSKBLED 0x4B65 /* set led flags (not lights) */ #define TARGET_KDGETLED 0x4B31 /* return current led state */ #define TARGET_KDSETLED 0x4B32 /* set led state [lights, not flags] */ +#define TARGET_KDSIGACCEPT 0x4B4E #define TARGET_SIOCATMARK 0x8905 From f63eb01ac7a5b4437d5589ad4343527534bf9d0b Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Sun, 22 Jun 2014 11:25:48 +0100 Subject: [PATCH 13/13] linux-user: support the SIOCGIFINDEX ioctl Add a definition of the SIOCGIFINDEX ioctl, allowing its use by target programs. Signed-off-by: Paul Burton Signed-off-by: Riku Voipio --- linux-user/ioctls.h | 1 + linux-user/syscall_defs.h | 1 + 2 files changed, 2 insertions(+) diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h index f278d3e989..07a00da727 100644 --- a/linux-user/ioctls.h +++ b/linux-user/ioctls.h @@ -118,6 +118,7 @@ IOCTL(SIOCSIFMEM, IOC_W, MK_PTR(MK_STRUCT(STRUCT_ptr_ifreq))) IOCTL(SIOCADDMULTI, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) IOCTL(SIOCDELMULTI, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) + IOCTL(SIOCGIFINDEX, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) IOCTL(SIOCSIFLINK, 0, TYPE_NULL) IOCTL_SPECIAL(SIOCGIFCONF, IOC_W | IOC_R, do_ioctl_ifconf, MK_PTR(MK_STRUCT(STRUCT_ifconf))) diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 4adfd3a400..856302780f 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -865,6 +865,7 @@ struct target_pollfd { #define TARGET_SIOCSIFSLAVE 0x8930 #define TARGET_SIOCADDMULTI 0x8931 /* Multicast address lists */ #define TARGET_SIOCDELMULTI 0x8932 +#define TARGET_SIOCGIFINDEX 0x8933 /* Bridging control calls */ #define TARGET_SIOCGIFBR 0x8940 /* Bridging support */