qemu/linux-user/syscall.c
<<
>>
Prefs
   1/*
   2 *  Linux syscalls
   3 *
   4 *  Copyright (c) 2003 Fabrice Bellard
   5 *
   6 *  This program is free software; you can redistribute it and/or modify
   7 *  it under the terms of the GNU General Public License as published by
   8 *  the Free Software Foundation; either version 2 of the License, or
   9 *  (at your option) any later version.
  10 *
  11 *  This program is distributed in the hope that it will be useful,
  12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 *  GNU General Public License for more details.
  15 *
  16 *  You should have received a copy of the GNU General Public License
  17 *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  18 */
  19#define _ATFILE_SOURCE
  20#include "qemu/osdep.h"
  21#include "qemu/cutils.h"
  22#include "qemu/path.h"
  23#include "qemu/memfd.h"
  24#include "qemu/queue.h"
  25#include "qemu/plugin.h"
  26#include "tcg/startup.h"
  27#include "target_mman.h"
  28#include "exec/page-protection.h"
  29#include "exec/mmap-lock.h"
  30#include "exec/tb-flush.h"
  31#include "exec/translation-block.h"
  32#include <elf.h>
  33#include <endian.h>
  34#include <grp.h>
  35#include <sys/ipc.h>
  36#include <sys/msg.h>
  37#include <sys/wait.h>
  38#include <sys/mount.h>
  39#include <sys/file.h>
  40#include <sys/fsuid.h>
  41#include <sys/personality.h>
  42#include <sys/prctl.h>
  43#include <sys/resource.h>
  44#include <sys/swap.h>
  45#include <linux/capability.h>
  46#include <sched.h>
  47#include <sys/timex.h>
  48#include <sys/socket.h>
  49#include <linux/sockios.h>
  50#include <sys/un.h>
  51#include <sys/uio.h>
  52#include <poll.h>
  53#include <sys/times.h>
  54#include <sys/shm.h>
  55#include <sys/sem.h>
  56#include <sys/statfs.h>
  57#include <utime.h>
  58#include <sys/sysinfo.h>
  59#include <sys/signalfd.h>
  60#include <netinet/in.h>
  61#include <netinet/ip.h>
  62#include <netinet/tcp.h>
  63#include <netinet/udp.h>
  64#include <linux/wireless.h>
  65#include <linux/icmp.h>
  66#include <linux/icmpv6.h>
  67#include <linux/if_tun.h>
  68#include <linux/in6.h>
  69#include <linux/errqueue.h>
  70#include <linux/random.h>
  71#ifdef CONFIG_TIMERFD
  72#include <sys/timerfd.h>
  73#endif
  74#ifdef CONFIG_EVENTFD
  75#include <sys/eventfd.h>
  76#endif
  77#ifdef CONFIG_EPOLL
  78#include <sys/epoll.h>
  79#endif
  80#ifdef CONFIG_ATTR
  81#include "qemu/xattr.h"
  82#endif
  83#ifdef CONFIG_SENDFILE
  84#include <sys/sendfile.h>
  85#endif
  86#ifdef HAVE_SYS_KCOV_H
  87#include <sys/kcov.h>
  88#endif
  89
  90#define termios host_termios
  91#define winsize host_winsize
  92#define termio host_termio
  93#define sgttyb host_sgttyb /* same as target */
  94#define tchars host_tchars /* same as target */
  95#define ltchars host_ltchars /* same as target */
  96
  97#include <linux/termios.h>
  98#include <linux/unistd.h>
  99#include <linux/cdrom.h>
 100#include <linux/hdreg.h>
 101#include <linux/soundcard.h>
 102#include <linux/kd.h>
 103#include <linux/mtio.h>
 104#include <linux/fs.h>
 105#include <linux/fd.h>
 106#if defined(CONFIG_FIEMAP)
 107#include <linux/fiemap.h>
 108#endif
 109#include <linux/fb.h>
 110#if defined(CONFIG_USBFS)
 111#include <linux/usbdevice_fs.h>
 112#include <linux/usb/ch9.h>
 113#endif
 114#include <linux/vt.h>
 115#include <linux/dm-ioctl.h>
 116#include <linux/reboot.h>
 117#include <linux/route.h>
 118#include <linux/filter.h>
 119#include <linux/blkpg.h>
 120#include <netpacket/packet.h>
 121#include <linux/netlink.h>
 122#include <linux/if_alg.h>
 123#include <linux/rtc.h>
 124#include <sound/asound.h>
 125#ifdef HAVE_BTRFS_H
 126#include <linux/btrfs.h>
 127#endif
 128#ifdef HAVE_DRM_H
 129#include <libdrm/drm.h>
 130#include <libdrm/i915_drm.h>
 131#endif
 132#include "linux_loop.h"
 133#include "uname.h"
 134
 135#include "qemu.h"
 136#include "user-internals.h"
 137#include "strace.h"
 138#include "signal-common.h"
 139#include "loader.h"
 140#include "user-mmap.h"
 141#include "user/page-protection.h"
 142#include "user/safe-syscall.h"
 143#include "user/signal.h"
 144#include "qemu/guest-random.h"
 145#include "qemu/selfmap.h"
 146#include "user/syscall-trace.h"
 147#include "special-errno.h"
 148#include "qapi/error.h"
 149#include "fd-trans.h"
 150#include "user/cpu_loop.h"
 151
 152#ifndef CLONE_IO
 153#define CLONE_IO                0x80000000      /* Clone io context */
 154#endif
 155
 156/* We can't directly call the host clone syscall, because this will
 157 * badly confuse libc (breaking mutexes, for example). So we must
 158 * divide clone flags into:
 159 *  * flag combinations that look like pthread_create()
 160 *  * flag combinations that look like fork()
 161 *  * flags we can implement within QEMU itself
 162 *  * flags we can't support and will return an error for
 163 */
 164/* For thread creation, all these flags must be present; for
 165 * fork, none must be present.
 166 */
 167#define CLONE_THREAD_FLAGS                              \
 168    (CLONE_VM | CLONE_FS | CLONE_FILES |                \
 169     CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM)
 170
 171/* These flags are ignored:
 172 * CLONE_DETACHED is now ignored by the kernel;
 173 * CLONE_IO is just an optimisation hint to the I/O scheduler
 174 */
 175#define CLONE_IGNORED_FLAGS                     \
 176    (CLONE_DETACHED | CLONE_IO)
 177
 178#ifndef CLONE_PIDFD
 179# define CLONE_PIDFD 0x00001000
 180#endif
 181
 182/* Flags for fork which we can implement within QEMU itself */
 183#define CLONE_OPTIONAL_FORK_FLAGS               \
 184    (CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_PIDFD | \
 185     CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID)
 186
 187/* Flags for thread creation which we can implement within QEMU itself */
 188#define CLONE_OPTIONAL_THREAD_FLAGS                             \
 189    (CLONE_SETTLS | CLONE_PARENT_SETTID |                       \
 190     CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | CLONE_PARENT)
 191
 192#define CLONE_INVALID_FORK_FLAGS                                        \
 193    (~(CSIGNAL | CLONE_OPTIONAL_FORK_FLAGS | CLONE_IGNORED_FLAGS))
 194
 195#define CLONE_INVALID_THREAD_FLAGS                                      \
 196    (~(CSIGNAL | CLONE_THREAD_FLAGS | CLONE_OPTIONAL_THREAD_FLAGS |     \
 197       CLONE_IGNORED_FLAGS))
 198
 199/* CLONE_VFORK is special cased early in do_fork(). The other flag bits
 200 * have almost all been allocated. We cannot support any of
 201 * CLONE_NEWNS, CLONE_NEWCGROUP, CLONE_NEWUTS, CLONE_NEWIPC,
 202 * CLONE_NEWUSER, CLONE_NEWPID, CLONE_NEWNET, CLONE_PTRACE, CLONE_UNTRACED.
 203 * The checks against the invalid thread masks above will catch these.
 204 * (The one remaining unallocated bit is 0x1000 which used to be CLONE_PID.)
 205 */
 206
 207/* Define DEBUG_ERESTARTSYS to force every syscall to be restarted
 208 * once. This exercises the codepaths for restart.
 209 */
 210//#define DEBUG_ERESTARTSYS
 211
 212//#include <linux/msdos_fs.h>
 213#define VFAT_IOCTL_READDIR_BOTH \
 214    _IOC(_IOC_READ, 'r', 1, (sizeof(struct linux_dirent) + 256) * 2)
 215#define VFAT_IOCTL_READDIR_SHORT \
 216    _IOC(_IOC_READ, 'r', 2, (sizeof(struct linux_dirent) + 256) * 2)
 217
 218#undef _syscall0
 219#undef _syscall1
 220#undef _syscall2
 221#undef _syscall3
 222#undef _syscall4
 223#undef _syscall5
 224#undef _syscall6
 225
 226#define _syscall0(type,name)            \
 227static type name (void)                 \
 228{                                       \
 229        return syscall(__NR_##name);    \
 230}
 231
 232#define _syscall1(type,name,type1,arg1)         \
 233static type name (type1 arg1)                   \
 234{                                               \
 235        return syscall(__NR_##name, arg1);      \
 236}
 237
 238#define _syscall2(type,name,type1,arg1,type2,arg2)      \
 239static type name (type1 arg1,type2 arg2)                \
 240{                                                       \
 241        return syscall(__NR_##name, arg1, arg2);        \
 242}
 243
 244#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)   \
 245static type name (type1 arg1,type2 arg2,type3 arg3)             \
 246{                                                               \
 247        return syscall(__NR_##name, arg1, arg2, arg3);          \
 248}
 249
 250#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)        \
 251static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4)                  \
 252{                                                                               \
 253        return syscall(__NR_##name, arg1, arg2, arg3, arg4);                    \
 254}
 255
 256#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,        \
 257                  type5,arg5)                                                   \
 258static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5)       \
 259{                                                                               \
 260        return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5);              \
 261}
 262
 263
 264#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,        \
 265                  type5,arg5,type6,arg6)                                        \
 266static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,       \
 267                  type6 arg6)                                                   \
 268{                                                                               \
 269        return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6);        \
 270}
 271
 272
 273#define __NR_sys_uname __NR_uname
 274#define __NR_sys_getcwd1 __NR_getcwd
 275#define __NR_sys_getdents __NR_getdents
 276#define __NR_sys_getdents64 __NR_getdents64
 277#define __NR_sys_getpriority __NR_getpriority
 278#define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
 279#define __NR_sys_rt_tgsigqueueinfo __NR_rt_tgsigqueueinfo
 280#define __NR_sys_syslog __NR_syslog
 281#if defined(__NR_futex)
 282# define __NR_sys_futex __NR_futex
 283#endif
 284#if defined(__NR_futex_time64)
 285# define __NR_sys_futex_time64 __NR_futex_time64
 286#endif
 287#define __NR_sys_statx __NR_statx
 288
 289#if defined(__alpha__) || defined(__x86_64__) || defined(__s390x__)
 290#define __NR__llseek __NR_lseek
 291#endif
 292
 293/* Newer kernel ports have llseek() instead of _llseek() */
 294#if defined(TARGET_NR_llseek) && !defined(TARGET_NR__llseek)
 295#define TARGET_NR__llseek TARGET_NR_llseek
 296#endif
 297
 298/* some platforms need to mask more bits than just TARGET_O_NONBLOCK */
 299#ifndef TARGET_O_NONBLOCK_MASK
 300#define TARGET_O_NONBLOCK_MASK TARGET_O_NONBLOCK
 301#endif
 302
 303#define __NR_sys_gettid __NR_gettid
 304_syscall0(int, sys_gettid)
 305
 306/* For the 64-bit guest on 32-bit host case we must emulate
 307 * getdents using getdents64, because otherwise the host
 308 * might hand us back more dirent records than we can fit
 309 * into the guest buffer after structure format conversion.
 310 * Otherwise we emulate getdents with getdents if the host has it.
 311 */
 312#if defined(__NR_getdents) && HOST_LONG_BITS >= TARGET_ABI_BITS
 313#define EMULATE_GETDENTS_WITH_GETDENTS
 314#endif
 315
 316#if defined(TARGET_NR_getdents) && defined(EMULATE_GETDENTS_WITH_GETDENTS)
 317_syscall3(int, sys_getdents, unsigned int, fd, struct linux_dirent *, dirp, unsigned int, count);
 318#endif
 319#if (defined(TARGET_NR_getdents) && \
 320      !defined(EMULATE_GETDENTS_WITH_GETDENTS)) || \
 321    (defined(TARGET_NR_getdents64) && defined(__NR_getdents64))
 322_syscall3(int, sys_getdents64, unsigned int, fd, struct linux_dirent64 *, dirp, unsigned int, count);
 323#endif
 324#if defined(TARGET_NR__llseek) && defined(__NR_llseek)
 325_syscall5(int, _llseek,  unsigned int,  fd, unsigned long, hi, unsigned long, lo,
 326          loff_t *, res, unsigned int, wh);
 327#endif
 328_syscall3(int, sys_rt_sigqueueinfo, pid_t, pid, int, sig, siginfo_t *, uinfo)
 329_syscall4(int, sys_rt_tgsigqueueinfo, pid_t, pid, pid_t, tid, int, sig,
 330          siginfo_t *, uinfo)
 331_syscall3(int,sys_syslog,int,type,char*,bufp,int,len)
 332#ifdef __NR_exit_group
 333_syscall1(int,exit_group,int,error_code)
 334#endif
 335#if defined(__NR_close_range) && defined(TARGET_NR_close_range)
 336#define __NR_sys_close_range __NR_close_range
 337_syscall3(int,sys_close_range,int,first,int,last,int,flags)
 338#ifndef CLOSE_RANGE_CLOEXEC
 339#define CLOSE_RANGE_CLOEXEC     (1U << 2)
 340#endif
 341#endif
 342#if defined(__NR_futex)
 343_syscall6(int,sys_futex,int *,uaddr,int,op,int,val,
 344          const struct timespec *,timeout,int *,uaddr2,int,val3)
 345#endif
 346#if defined(__NR_futex_time64)
 347_syscall6(int,sys_futex_time64,int *,uaddr,int,op,int,val,
 348          const struct timespec *,timeout,int *,uaddr2,int,val3)
 349#endif
 350#if defined(__NR_pidfd_open) && defined(TARGET_NR_pidfd_open)
 351_syscall2(int, pidfd_open, pid_t, pid, unsigned int, flags);
 352#endif
 353#if defined(__NR_pidfd_send_signal) && defined(TARGET_NR_pidfd_send_signal)
 354_syscall4(int, pidfd_send_signal, int, pidfd, int, sig, siginfo_t *, info,
 355                             unsigned int, flags);
 356#endif
 357#if defined(__NR_pidfd_getfd) && defined(TARGET_NR_pidfd_getfd)
 358_syscall3(int, pidfd_getfd, int, pidfd, int, targetfd, unsigned int, flags);
 359#endif
 360#define __NR_sys_sched_getaffinity __NR_sched_getaffinity
 361_syscall3(int, sys_sched_getaffinity, pid_t, pid, unsigned int, len,
 362          unsigned long *, user_mask_ptr);
 363#define __NR_sys_sched_setaffinity __NR_sched_setaffinity
 364_syscall3(int, sys_sched_setaffinity, pid_t, pid, unsigned int, len,
 365          unsigned long *, user_mask_ptr);
 366/* sched_attr is not defined in glibc < 2.41 */
 367#ifndef SCHED_ATTR_SIZE_VER0
 368struct sched_attr {
 369    uint32_t size;
 370    uint32_t sched_policy;
 371    uint64_t sched_flags;
 372    int32_t sched_nice;
 373    uint32_t sched_priority;
 374    uint64_t sched_runtime;
 375    uint64_t sched_deadline;
 376    uint64_t sched_period;
 377    uint32_t sched_util_min;
 378    uint32_t sched_util_max;
 379};
 380#endif
 381#define __NR_sys_sched_getattr __NR_sched_getattr
 382_syscall4(int, sys_sched_getattr, pid_t, pid, struct sched_attr *, attr,
 383          unsigned int, size, unsigned int, flags);
 384#define __NR_sys_sched_setattr __NR_sched_setattr
 385_syscall3(int, sys_sched_setattr, pid_t, pid, struct sched_attr *, attr,
 386          unsigned int, flags);
 387#define __NR_sys_sched_getscheduler __NR_sched_getscheduler
 388_syscall1(int, sys_sched_getscheduler, pid_t, pid);
 389#define __NR_sys_sched_setscheduler __NR_sched_setscheduler
 390_syscall3(int, sys_sched_setscheduler, pid_t, pid, int, policy,
 391          const struct sched_param *, param);
 392#define __NR_sys_sched_getparam __NR_sched_getparam
 393_syscall2(int, sys_sched_getparam, pid_t, pid,
 394          struct sched_param *, param);
 395#define __NR_sys_sched_setparam __NR_sched_setparam
 396_syscall2(int, sys_sched_setparam, pid_t, pid,
 397          const struct sched_param *, param);
 398#define __NR_sys_getcpu __NR_getcpu
 399_syscall3(int, sys_getcpu, unsigned *, cpu, unsigned *, node, void *, tcache);
 400_syscall4(int, reboot, int, magic1, int, magic2, unsigned int, cmd,
 401          void *, arg);
 402_syscall2(int, capget, struct __user_cap_header_struct *, header,
 403          struct __user_cap_data_struct *, data);
 404_syscall2(int, capset, struct __user_cap_header_struct *, header,
 405          struct __user_cap_data_struct *, data);
 406#if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
 407_syscall2(int, ioprio_get, int, which, int, who)
 408#endif
 409#if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
 410_syscall3(int, ioprio_set, int, which, int, who, int, ioprio)
 411#endif
 412#if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
 413_syscall3(int, getrandom, void *, buf, size_t, buflen, unsigned int, flags)
 414#endif
 415
 416#if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
 417_syscall5(int, kcmp, pid_t, pid1, pid_t, pid2, int, type,
 418          unsigned long, idx1, unsigned long, idx2)
 419#endif
 420
 421/*
 422 * It is assumed that struct statx is architecture independent.
 423 */
 424#if defined(TARGET_NR_statx) && defined(__NR_statx)
 425_syscall5(int, sys_statx, int, dirfd, const char *, pathname, int, flags,
 426          unsigned int, mask, struct target_statx *, statxbuf)
 427#endif
 428#if defined(TARGET_NR_membarrier) && defined(__NR_membarrier)
 429_syscall2(int, membarrier, int, cmd, int, flags)
 430#endif
 431
 432static const bitmask_transtbl fcntl_flags_tbl[] = {
 433  { TARGET_O_ACCMODE,   TARGET_O_WRONLY,    O_ACCMODE,   O_WRONLY,    },
 434  { TARGET_O_ACCMODE,   TARGET_O_RDWR,      O_ACCMODE,   O_RDWR,      },
 435  { TARGET_O_CREAT,     TARGET_O_CREAT,     O_CREAT,     O_CREAT,     },
 436  { TARGET_O_EXCL,      TARGET_O_EXCL,      O_EXCL,      O_EXCL,      },
 437  { TARGET_O_NOCTTY,    TARGET_O_NOCTTY,    O_NOCTTY,    O_NOCTTY,    },
 438  { TARGET_O_TRUNC,     TARGET_O_TRUNC,     O_TRUNC,     O_TRUNC,     },
 439  { TARGET_O_APPEND,    TARGET_O_APPEND,    O_APPEND,    O_APPEND,    },
 440  { TARGET_O_NONBLOCK,  TARGET_O_NONBLOCK,  O_NONBLOCK,  O_NONBLOCK,  },
 441  { TARGET_O_SYNC,      TARGET_O_DSYNC,     O_SYNC,      O_DSYNC,     },
 442  { TARGET_O_SYNC,      TARGET_O_SYNC,      O_SYNC,      O_SYNC,      },
 443  { TARGET_FASYNC,      TARGET_FASYNC,      FASYNC,      FASYNC,      },
 444  { TARGET_O_DIRECTORY, TARGET_O_DIRECTORY, O_DIRECTORY, O_DIRECTORY, },
 445  { TARGET_O_NOFOLLOW,  TARGET_O_NOFOLLOW,  O_NOFOLLOW,  O_NOFOLLOW,  },
 446#if defined(O_DIRECT)
 447  { TARGET_O_DIRECT,    TARGET_O_DIRECT,    O_DIRECT,    O_DIRECT,    },
 448#endif
 449#if defined(O_NOATIME)
 450  { TARGET_O_NOATIME,   TARGET_O_NOATIME,   O_NOATIME,   O_NOATIME    },
 451#endif
 452#if defined(O_CLOEXEC)
 453  { TARGET_O_CLOEXEC,   TARGET_O_CLOEXEC,   O_CLOEXEC,   O_CLOEXEC    },
 454#endif
 455#if defined(O_PATH)
 456  { TARGET_O_PATH,      TARGET_O_PATH,      O_PATH,      O_PATH       },
 457#endif
 458#if defined(O_TMPFILE)
 459  { TARGET_O_TMPFILE,   TARGET_O_TMPFILE,   O_TMPFILE,   O_TMPFILE    },
 460#endif
 461  /* Don't terminate the list prematurely on 64-bit host+guest.  */
 462#if TARGET_O_LARGEFILE != 0 || O_LARGEFILE != 0
 463  { TARGET_O_LARGEFILE, TARGET_O_LARGEFILE, O_LARGEFILE, O_LARGEFILE, },
 464#endif
 465};
 466
 467_syscall2(int, sys_getcwd1, char *, buf, size_t, size)
 468
 469#if defined(TARGET_NR_utimensat) || defined(TARGET_NR_utimensat_time64)
 470#if defined(__NR_utimensat)
 471#define __NR_sys_utimensat __NR_utimensat
 472_syscall4(int,sys_utimensat,int,dirfd,const char *,pathname,
 473          const struct timespec *,tsp,int,flags)
 474#else
 475static int sys_utimensat(int dirfd, const char *pathname,
 476                         const struct timespec times[2], int flags)
 477{
 478    errno = ENOSYS;
 479    return -1;
 480}
 481#endif
 482#endif /* TARGET_NR_utimensat */
 483
 484#ifdef TARGET_NR_renameat2
 485#if defined(__NR_renameat2)
 486#define __NR_sys_renameat2 __NR_renameat2
 487_syscall5(int, sys_renameat2, int, oldfd, const char *, old, int, newfd,
 488          const char *, new, unsigned int, flags)
 489#else
 490static int sys_renameat2(int oldfd, const char *old,
 491                         int newfd, const char *new, int flags)
 492{
 493    if (flags == 0) {
 494        return renameat(oldfd, old, newfd, new);
 495    }
 496    errno = ENOSYS;
 497    return -1;
 498}
 499#endif
 500#endif /* TARGET_NR_renameat2 */
 501
 502#ifdef CONFIG_INOTIFY
 503#include <sys/inotify.h>
 504#else
 505/* Userspace can usually survive runtime without inotify */
 506#undef TARGET_NR_inotify_init
 507#undef TARGET_NR_inotify_init1
 508#undef TARGET_NR_inotify_add_watch
 509#undef TARGET_NR_inotify_rm_watch
 510#endif /* CONFIG_INOTIFY  */
 511
 512#if defined(TARGET_NR_prlimit64)
 513#ifndef __NR_prlimit64
 514# define __NR_prlimit64 -1
 515#endif
 516#define __NR_sys_prlimit64 __NR_prlimit64
 517/* The glibc rlimit structure may not be that used by the underlying syscall */
 518struct host_rlimit64 {
 519    uint64_t rlim_cur;
 520    uint64_t rlim_max;
 521};
 522_syscall4(int, sys_prlimit64, pid_t, pid, int, resource,
 523          const struct host_rlimit64 *, new_limit,
 524          struct host_rlimit64 *, old_limit)
 525#endif
 526
 527
 528#if defined(TARGET_NR_timer_create)
 529/* Maximum of 32 active POSIX timers allowed at any one time. */
 530#define GUEST_TIMER_MAX 32
 531static timer_t g_posix_timers[GUEST_TIMER_MAX];
 532static int g_posix_timer_allocated[GUEST_TIMER_MAX];
 533
 534static inline int next_free_host_timer(void)
 535{
 536    int k;
 537    for (k = 0; k < ARRAY_SIZE(g_posix_timer_allocated); k++) {
 538        if (qatomic_xchg(g_posix_timer_allocated + k, 1) == 0) {
 539            return k;
 540        }
 541    }
 542    return -1;
 543}
 544
 545static inline void free_host_timer_slot(int id)
 546{
 547    qatomic_store_release(g_posix_timer_allocated + id, 0);
 548}
 549#endif
 550
 551static inline int host_to_target_errno(int host_errno)
 552{
 553    switch (host_errno) {
 554#define E(X)  case X: return TARGET_##X;
 555#include "errnos.c.inc"
 556#undef E
 557    default:
 558        return host_errno;
 559    }
 560}
 561
 562static inline int target_to_host_errno(int target_errno)
 563{
 564    switch (target_errno) {
 565#define E(X)  case TARGET_##X: return X;
 566#include "errnos.c.inc"
 567#undef E
 568    default:
 569        return target_errno;
 570    }
 571}
 572
 573abi_long get_errno(abi_long ret)
 574{
 575    if (ret == -1)
 576        return -host_to_target_errno(errno);
 577    else
 578        return ret;
 579}
 580
 581const char *target_strerror(int err)
 582{
 583    if (err == QEMU_ERESTARTSYS) {
 584        return "To be restarted";
 585    }
 586    if (err == QEMU_ESIGRETURN) {
 587        return "Successful exit from sigreturn";
 588    }
 589
 590    return strerror(target_to_host_errno(err));
 591}
 592
 593static int check_zeroed_user(abi_long addr, size_t ksize, size_t usize)
 594{
 595    int i;
 596    uint8_t b;
 597    if (usize <= ksize) {
 598        return 1;
 599    }
 600    for (i = ksize; i < usize; i++) {
 601        if (get_user_u8(b, addr + i)) {
 602            return -TARGET_EFAULT;
 603        }
 604        if (b != 0) {
 605            return 0;
 606        }
 607    }
 608    return 1;
 609}
 610
 611/*
 612 * Copies a target struct to a host struct, in a way that guarantees
 613 * backwards-compatibility for struct syscall arguments.
 614 *
 615 * Similar to kernels uaccess.h:copy_struct_from_user()
 616 */
 617int copy_struct_from_user(void *dst, size_t ksize, abi_ptr src, size_t usize)
 618{
 619    size_t size = MIN(ksize, usize);
 620    size_t rest = MAX(ksize, usize) - size;
 621
 622    /* Deal with trailing bytes. */
 623    if (usize < ksize) {
 624        memset(dst + size, 0, rest);
 625    } else if (usize > ksize) {
 626        int ret = check_zeroed_user(src, ksize, usize);
 627        if (ret <= 0) {
 628            return ret ?: -TARGET_E2BIG;
 629        }
 630    }
 631    /* Copy the interoperable parts of the struct. */
 632    if (copy_from_user(dst, src, size)) {
 633        return -TARGET_EFAULT;
 634    }
 635    return 0;
 636}
 637
 638#define safe_syscall0(type, name) \
 639static type safe_##name(void) \
 640{ \
 641    return safe_syscall(__NR_##name); \
 642}
 643
 644#define safe_syscall1(type, name, type1, arg1) \
 645static type safe_##name(type1 arg1) \
 646{ \
 647    return safe_syscall(__NR_##name, arg1); \
 648}
 649
 650#define safe_syscall2(type, name, type1, arg1, type2, arg2) \
 651static type safe_##name(type1 arg1, type2 arg2) \
 652{ \
 653    return safe_syscall(__NR_##name, arg1, arg2); \
 654}
 655
 656#define safe_syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \
 657static type safe_##name(type1 arg1, type2 arg2, type3 arg3) \
 658{ \
 659    return safe_syscall(__NR_##name, arg1, arg2, arg3); \
 660}
 661
 662#define safe_syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \
 663    type4, arg4) \
 664static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
 665{ \
 666    return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4); \
 667}
 668
 669#define safe_syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \
 670    type4, arg4, type5, arg5) \
 671static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
 672    type5 arg5) \
 673{ \
 674    return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
 675}
 676
 677#define safe_syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \
 678    type4, arg4, type5, arg5, type6, arg6) \
 679static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
 680    type5 arg5, type6 arg6) \
 681{ \
 682    return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
 683}
 684
 685safe_syscall3(ssize_t, read, int, fd, void *, buff, size_t, count)
 686safe_syscall3(ssize_t, write, int, fd, const void *, buff, size_t, count)
 687safe_syscall4(int, openat, int, dirfd, const char *, pathname, \
 688              int, flags, mode_t, mode)
 689
 690safe_syscall4(int, openat2, int, dirfd, const char *, pathname, \
 691              const struct open_how_ver0 *, how, size_t, size)
 692
 693#if defined(TARGET_NR_wait4) || defined(TARGET_NR_waitpid)
 694safe_syscall4(pid_t, wait4, pid_t, pid, int *, status, int, options, \
 695              struct rusage *, rusage)
 696#endif
 697safe_syscall5(int, waitid, idtype_t, idtype, id_t, id, siginfo_t *, infop, \
 698              int, options, struct rusage *, rusage)
 699safe_syscall3(int, execve, const char *, filename, char **, argv, char **, envp)
 700safe_syscall5(int, execveat, int, dirfd, const char *, filename,
 701              char **, argv, char **, envp, int, flags)
 702#if defined(TARGET_NR_select) || defined(TARGET_NR__newselect) || \
 703    defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6_time64)
 704safe_syscall6(int, pselect6, int, nfds, fd_set *, readfds, fd_set *, writefds, \
 705              fd_set *, exceptfds, struct timespec *, timeout, void *, sig)
 706#endif
 707#if defined(TARGET_NR_ppoll) || defined(TARGET_NR_ppoll_time64)
 708safe_syscall5(int, ppoll, struct pollfd *, ufds, unsigned int, nfds,
 709              struct timespec *, tsp, const sigset_t *, sigmask,
 710              size_t, sigsetsize)
 711#endif
 712safe_syscall6(int, epoll_pwait, int, epfd, struct epoll_event *, events,
 713              int, maxevents, int, timeout, const sigset_t *, sigmask,
 714              size_t, sigsetsize)
 715#if defined(__NR_futex)
 716safe_syscall6(int,futex,int *,uaddr,int,op,int,val, \
 717              const struct timespec *,timeout,int *,uaddr2,int,val3)
 718#endif
 719#if defined(__NR_futex_time64)
 720safe_syscall6(int,futex_time64,int *,uaddr,int,op,int,val, \
 721              const struct timespec *,timeout,int *,uaddr2,int,val3)
 722#endif
 723safe_syscall2(int, rt_sigsuspend, sigset_t *, newset, size_t, sigsetsize)
 724safe_syscall2(int, kill, pid_t, pid, int, sig)
 725safe_syscall2(int, tkill, int, tid, int, sig)
 726safe_syscall3(int, tgkill, int, tgid, int, pid, int, sig)
 727safe_syscall3(ssize_t, readv, int, fd, const struct iovec *, iov, int, iovcnt)
 728safe_syscall3(ssize_t, writev, int, fd, const struct iovec *, iov, int, iovcnt)
 729safe_syscall5(ssize_t, preadv, int, fd, const struct iovec *, iov, int, iovcnt,
 730              unsigned long, pos_l, unsigned long, pos_h)
 731safe_syscall5(ssize_t, pwritev, int, fd, const struct iovec *, iov, int, iovcnt,
 732              unsigned long, pos_l, unsigned long, pos_h)
 733safe_syscall3(int, connect, int, fd, const struct sockaddr *, addr,
 734              socklen_t, addrlen)
 735safe_syscall6(ssize_t, sendto, int, fd, const void *, buf, size_t, len,
 736              int, flags, const struct sockaddr *, addr, socklen_t, addrlen)
 737safe_syscall6(ssize_t, recvfrom, int, fd, void *, buf, size_t, len,
 738              int, flags, struct sockaddr *, addr, socklen_t *, addrlen)
 739safe_syscall3(ssize_t, sendmsg, int, fd, const struct msghdr *, msg, int, flags)
 740safe_syscall3(ssize_t, recvmsg, int, fd, struct msghdr *, msg, int, flags)
 741safe_syscall2(int, flock, int, fd, int, operation)
 742#if defined(TARGET_NR_rt_sigtimedwait) || defined(TARGET_NR_rt_sigtimedwait_time64)
 743safe_syscall4(int, rt_sigtimedwait, const sigset_t *, these, siginfo_t *, uinfo,
 744              const struct timespec *, uts, size_t, sigsetsize)
 745#endif
 746safe_syscall4(int, accept4, int, fd, struct sockaddr *, addr, socklen_t *, len,
 747              int, flags)
 748#if defined(TARGET_NR_nanosleep)
 749safe_syscall2(int, nanosleep, const struct timespec *, req,
 750              struct timespec *, rem)
 751#endif
 752#if defined(TARGET_NR_clock_nanosleep) || \
 753    defined(TARGET_NR_clock_nanosleep_time64)
 754safe_syscall4(int, clock_nanosleep, const clockid_t, clock, int, flags,
 755              const struct timespec *, req, struct timespec *, rem)
 756#endif
 757#ifdef __NR_ipc
 758#ifdef __s390x__
 759safe_syscall5(int, ipc, int, call, long, first, long, second, long, third,
 760              void *, ptr)
 761#else
 762safe_syscall6(int, ipc, int, call, long, first, long, second, long, third,
 763              void *, ptr, long, fifth)
 764#endif
 765#endif
 766#ifdef __NR_msgsnd
 767safe_syscall4(int, msgsnd, int, msgid, const void *, msgp, size_t, sz,
 768              int, flags)
 769#endif
 770#ifdef __NR_msgrcv
 771safe_syscall5(int, msgrcv, int, msgid, void *, msgp, size_t, sz,
 772              long, msgtype, int, flags)
 773#endif
 774#ifdef __NR_semtimedop
 775safe_syscall4(int, semtimedop, int, semid, struct sembuf *, tsops,
 776              unsigned, nsops, const struct timespec *, timeout)
 777#endif
 778#if defined(TARGET_NR_mq_timedsend) || \
 779    defined(TARGET_NR_mq_timedsend_time64)
 780safe_syscall5(int, mq_timedsend, int, mqdes, const char *, msg_ptr,
 781              size_t, len, unsigned, prio, const struct timespec *, timeout)
 782#endif
 783#if defined(TARGET_NR_mq_timedreceive) || \
 784    defined(TARGET_NR_mq_timedreceive_time64)
 785safe_syscall5(int, mq_timedreceive, int, mqdes, char *, msg_ptr,
 786              size_t, len, unsigned *, prio, const struct timespec *, timeout)
 787#endif
 788#if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range)
 789safe_syscall6(ssize_t, copy_file_range, int, infd, loff_t *, pinoff,
 790              int, outfd, loff_t *, poutoff, size_t, length,
 791              unsigned int, flags)
 792#endif
 793#if defined(TARGET_NR_fchmodat2) && defined(__NR_fchmodat2)
 794safe_syscall4(int, fchmodat2, int, dfd, const char *, filename,
 795              unsigned short, mode, unsigned int, flags)
 796#endif
 797
 798/* We do ioctl like this rather than via safe_syscall3 to preserve the
 799 * "third argument might be integer or pointer or not present" behaviour of
 800 * the libc function.
 801 */
 802#define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__)
 803/* Similarly for fcntl. Since we always build with LFS enabled,
 804 * we should be using the 64-bit structures automatically.
 805 */
 806#ifdef __NR_fcntl64
 807#define safe_fcntl(...) safe_syscall(__NR_fcntl64, __VA_ARGS__)
 808#else
 809#define safe_fcntl(...) safe_syscall(__NR_fcntl, __VA_ARGS__)
 810#endif
 811
 812static inline int host_to_target_sock_type(int host_type)
 813{
 814    int target_type;
 815
 816    switch (host_type & 0xf /* SOCK_TYPE_MASK */) {
 817    case SOCK_DGRAM:
 818        target_type = TARGET_SOCK_DGRAM;
 819        break;
 820    case SOCK_STREAM:
 821        target_type = TARGET_SOCK_STREAM;
 822        break;
 823    default:
 824        target_type = host_type & 0xf /* SOCK_TYPE_MASK */;
 825        break;
 826    }
 827
 828#if defined(SOCK_CLOEXEC)
 829    if (host_type & SOCK_CLOEXEC) {
 830        target_type |= TARGET_SOCK_CLOEXEC;
 831    }
 832#endif
 833
 834#if defined(SOCK_NONBLOCK)
 835    if (host_type & SOCK_NONBLOCK) {
 836        target_type |= TARGET_SOCK_NONBLOCK;
 837    }
 838#endif
 839
 840    return target_type;
 841}
 842
 843static abi_ulong target_brk, initial_target_brk;
 844
 845void target_set_brk(abi_ulong new_brk)
 846{
 847    target_brk = TARGET_PAGE_ALIGN(new_brk);
 848    initial_target_brk = target_brk;
 849}
 850
 851/* do_brk() must return target values and target errnos. */
 852abi_long do_brk(abi_ulong brk_val)
 853{
 854    abi_long mapped_addr;
 855    abi_ulong new_brk;
 856    abi_ulong old_brk;
 857
 858    /* brk pointers are always untagged */
 859
 860    /* do not allow to shrink below initial brk value */
 861    if (brk_val < initial_target_brk) {
 862        return target_brk;
 863    }
 864
 865    new_brk = TARGET_PAGE_ALIGN(brk_val);
 866    old_brk = TARGET_PAGE_ALIGN(target_brk);
 867
 868    /* new and old target_brk might be on the same page */
 869    if (new_brk == old_brk) {
 870        target_brk = brk_val;
 871        return target_brk;
 872    }
 873
 874    /* Release heap if necessary */
 875    if (new_brk < old_brk) {
 876        target_munmap(new_brk, old_brk - new_brk);
 877
 878        target_brk = brk_val;
 879        return target_brk;
 880    }
 881
 882    mapped_addr = target_mmap(old_brk, new_brk - old_brk,
 883                              PROT_READ | PROT_WRITE,
 884                              MAP_FIXED_NOREPLACE | MAP_ANON | MAP_PRIVATE,
 885                              -1, 0);
 886
 887    if (mapped_addr == old_brk) {
 888        target_brk = brk_val;
 889        return target_brk;
 890    }
 891
 892#if defined(TARGET_ALPHA)
 893    /* We (partially) emulate OSF/1 on Alpha, which requires we
 894       return a proper errno, not an unchanged brk value.  */
 895    return -TARGET_ENOMEM;
 896#endif
 897    /* For everything else, return the previous break. */
 898    return target_brk;
 899}
 900
 901#if defined(TARGET_NR_select) || defined(TARGET_NR__newselect) || \
 902    defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6_time64)
 903static inline abi_long copy_from_user_fdset(fd_set *fds,
 904                                            abi_ulong target_fds_addr,
 905                                            int n)
 906{
 907    int i, nw, j, k;
 908    abi_ulong b, *target_fds;
 909
 910    nw = DIV_ROUND_UP(n, TARGET_ABI_BITS);
 911    if (!(target_fds = lock_user(VERIFY_READ,
 912                                 target_fds_addr,
 913                                 sizeof(abi_ulong) * nw,
 914                                 1)))
 915        return -TARGET_EFAULT;
 916
 917    FD_ZERO(fds);
 918    k = 0;
 919    for (i = 0; i < nw; i++) {
 920        /* grab the abi_ulong */
 921        __get_user(b, &target_fds[i]);
 922        for (j = 0; j < TARGET_ABI_BITS; j++) {
 923            /* check the bit inside the abi_ulong */
 924            if ((b >> j) & 1)
 925                FD_SET(k, fds);
 926            k++;
 927        }
 928    }
 929
 930    unlock_user(target_fds, target_fds_addr, 0);
 931
 932    return 0;
 933}
 934
 935static inline abi_ulong copy_from_user_fdset_ptr(fd_set *fds, fd_set **fds_ptr,
 936                                                 abi_ulong target_fds_addr,
 937                                                 int n)
 938{
 939    if (target_fds_addr) {
 940        if (copy_from_user_fdset(fds, target_fds_addr, n))
 941            return -TARGET_EFAULT;
 942        *fds_ptr = fds;
 943    } else {
 944        *fds_ptr = NULL;
 945    }
 946    return 0;
 947}
 948
 949static inline abi_long copy_to_user_fdset(abi_ulong target_fds_addr,
 950                                          const fd_set *fds,
 951                                          int n)
 952{
 953    int i, nw, j, k;
 954    abi_long v;
 955    abi_ulong *target_fds;
 956
 957    nw = DIV_ROUND_UP(n, TARGET_ABI_BITS);
 958    if (!(target_fds = lock_user(VERIFY_WRITE,
 959                                 target_fds_addr,
 960                                 sizeof(abi_ulong) * nw,
 961                                 0)))
 962        return -TARGET_EFAULT;
 963
 964    k = 0;
 965    for (i = 0; i < nw; i++) {
 966        v = 0;
 967        for (j = 0; j < TARGET_ABI_BITS; j++) {
 968            v |= ((abi_ulong)(FD_ISSET(k, fds) != 0) << j);
 969            k++;
 970        }
 971        __put_user(v, &target_fds[i]);
 972    }
 973
 974    unlock_user(target_fds, target_fds_addr, sizeof(abi_ulong) * nw);
 975
 976    return 0;
 977}
 978#endif
 979
 980#if defined(__alpha__)
 981#define HOST_HZ 1024
 982#else
 983#define HOST_HZ 100
 984#endif
 985
 986static inline abi_long host_to_target_clock_t(long ticks)
 987{
 988#if HOST_HZ == TARGET_HZ
 989    return ticks;
 990#else
 991    return ((int64_t)ticks * TARGET_HZ) / HOST_HZ;
 992#endif
 993}
 994
 995static inline abi_long host_to_target_rusage(abi_ulong target_addr,
 996                                             const struct rusage *rusage)
 997{
 998    struct target_rusage *target_rusage;
 999
1000    if (!lock_user_struct(VERIFY_WRITE, target_rusage, target_addr, 0))
1001        return -TARGET_EFAULT;
1002    target_rusage->ru_utime.tv_sec = tswapal(rusage->ru_utime.tv_sec);
1003    target_rusage->ru_utime.tv_usec = tswapal(rusage->ru_utime.tv_usec);
1004    target_rusage->ru_stime.tv_sec = tswapal(rusage->ru_stime.tv_sec);
1005    target_rusage->ru_stime.tv_usec = tswapal(rusage->ru_stime.tv_usec);
1006    target_rusage->ru_maxrss = tswapal(rusage->ru_maxrss);
1007    target_rusage->ru_ixrss = tswapal(rusage->ru_ixrss);
1008    target_rusage->ru_idrss = tswapal(rusage->ru_idrss);
1009    target_rusage->ru_isrss = tswapal(rusage->ru_isrss);
1010    target_rusage->ru_minflt = tswapal(rusage->ru_minflt);
1011    target_rusage->ru_majflt = tswapal(rusage->ru_majflt);
1012    target_rusage->ru_nswap = tswapal(rusage->ru_nswap);
1013    target_rusage->ru_inblock = tswapal(rusage->ru_inblock);
1014    target_rusage->ru_oublock = tswapal(rusage->ru_oublock);
1015    target_rusage->ru_msgsnd = tswapal(rusage->ru_msgsnd);
1016    target_rusage->ru_msgrcv = tswapal(rusage->ru_msgrcv);
1017    target_rusage->ru_nsignals = tswapal(rusage->ru_nsignals);
1018    target_rusage->ru_nvcsw = tswapal(rusage->ru_nvcsw);
1019    target_rusage->ru_nivcsw = tswapal(rusage->ru_nivcsw);
1020    unlock_user_struct(target_rusage, target_addr, 1);
1021
1022    return 0;
1023}
1024
1025#ifdef TARGET_NR_setrlimit
1026static inline rlim_t target_to_host_rlim(abi_ulong target_rlim)
1027{
1028    abi_ulong target_rlim_swap;
1029    rlim_t result;
1030    
1031    target_rlim_swap = tswapal(target_rlim);
1032    if (target_rlim_swap == TARGET_RLIM_INFINITY)
1033        return RLIM_INFINITY;
1034
1035    result = target_rlim_swap;
1036    if (target_rlim_swap != (rlim_t)result)
1037        return RLIM_INFINITY;
1038    
1039    return result;
1040}
1041#endif
1042
1043#if defined(TARGET_NR_getrlimit) || defined(TARGET_NR_ugetrlimit)
1044static inline abi_ulong host_to_target_rlim(rlim_t rlim)
1045{
1046    abi_ulong target_rlim_swap;
1047    abi_ulong result;
1048    
1049    if (rlim == RLIM_INFINITY || rlim != (abi_long)rlim)
1050        target_rlim_swap = TARGET_RLIM_INFINITY;
1051    else
1052        target_rlim_swap = rlim;
1053    result = tswapal(target_rlim_swap);
1054    
1055    return result;
1056}
1057#endif
1058
1059static inline int target_to_host_resource(int code)
1060{
1061    switch (code) {
1062    case TARGET_RLIMIT_AS:
1063        return RLIMIT_AS;
1064    case TARGET_RLIMIT_CORE:
1065        return RLIMIT_CORE;
1066    case TARGET_RLIMIT_CPU:
1067        return RLIMIT_CPU;
1068    case TARGET_RLIMIT_DATA:
1069        return RLIMIT_DATA;
1070    case TARGET_RLIMIT_FSIZE:
1071        return RLIMIT_FSIZE;
1072    case TARGET_RLIMIT_LOCKS:
1073        return RLIMIT_LOCKS;
1074    case TARGET_RLIMIT_MEMLOCK:
1075        return RLIMIT_MEMLOCK;
1076    case TARGET_RLIMIT_MSGQUEUE:
1077        return RLIMIT_MSGQUEUE;
1078    case TARGET_RLIMIT_NICE:
1079        return RLIMIT_NICE;
1080    case TARGET_RLIMIT_NOFILE:
1081        return RLIMIT_NOFILE;
1082    case TARGET_RLIMIT_NPROC:
1083        return RLIMIT_NPROC;
1084    case TARGET_RLIMIT_RSS:
1085        return RLIMIT_RSS;
1086    case TARGET_RLIMIT_RTPRIO:
1087        return RLIMIT_RTPRIO;
1088#ifdef RLIMIT_RTTIME
1089    case TARGET_RLIMIT_RTTIME:
1090        return RLIMIT_RTTIME;
1091#endif
1092    case TARGET_RLIMIT_SIGPENDING:
1093        return RLIMIT_SIGPENDING;
1094    case TARGET_RLIMIT_STACK:
1095        return RLIMIT_STACK;
1096    default:
1097        return code;
1098    }
1099}
1100
1101static inline abi_long copy_from_user_timeval(struct timeval *tv,
1102                                              abi_ulong target_tv_addr)
1103{
1104    struct target_timeval *target_tv;
1105
1106    if (!lock_user_struct(VERIFY_READ, target_tv, target_tv_addr, 1)) {
1107        return -TARGET_EFAULT;
1108    }
1109
1110    __get_user(tv->tv_sec, &target_tv->tv_sec);
1111    __get_user(tv->tv_usec, &target_tv->tv_usec);
1112
1113    unlock_user_struct(target_tv, target_tv_addr, 0);
1114
1115    return 0;
1116}
1117
1118static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr,
1119                                            const struct timeval *tv)
1120{
1121    struct target_timeval *target_tv;
1122
1123    if (!lock_user_struct(VERIFY_WRITE, target_tv, target_tv_addr, 0)) {
1124        return -TARGET_EFAULT;
1125    }
1126
1127    __put_user(tv->tv_sec, &target_tv->tv_sec);
1128    __put_user(tv->tv_usec, &target_tv->tv_usec);
1129
1130    unlock_user_struct(target_tv, target_tv_addr, 1);
1131
1132    return 0;
1133}
1134
1135#if defined(TARGET_NR_clock_adjtime64) && defined(CONFIG_CLOCK_ADJTIME)
1136static inline abi_long copy_from_user_timeval64(struct timeval *tv,
1137                                                abi_ulong target_tv_addr)
1138{
1139    struct target__kernel_sock_timeval *target_tv;
1140
1141    if (!lock_user_struct(VERIFY_READ, target_tv, target_tv_addr, 1)) {
1142        return -TARGET_EFAULT;
1143    }
1144
1145    __get_user(tv->tv_sec, &target_tv->tv_sec);
1146    __get_user(tv->tv_usec, &target_tv->tv_usec);
1147
1148    unlock_user_struct(target_tv, target_tv_addr, 0);
1149
1150    return 0;
1151}
1152#endif
1153
1154static inline abi_long copy_to_user_timeval64(abi_ulong target_tv_addr,
1155                                              const struct timeval *tv)
1156{
1157    struct target__kernel_sock_timeval *target_tv;
1158
1159    if (!lock_user_struct(VERIFY_WRITE, target_tv, target_tv_addr, 0)) {
1160        return -TARGET_EFAULT;
1161    }
1162
1163    __put_user(tv->tv_sec, &target_tv->tv_sec);
1164    __put_user(tv->tv_usec, &target_tv->tv_usec);
1165
1166    unlock_user_struct(target_tv, target_tv_addr, 1);
1167
1168    return 0;
1169}
1170
1171#if defined(TARGET_NR_futex) || \
1172    defined(TARGET_NR_rt_sigtimedwait) || \
1173    defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6) || \
1174    defined(TARGET_NR_nanosleep) || defined(TARGET_NR_clock_settime) || \
1175    defined(TARGET_NR_utimensat) || defined(TARGET_NR_mq_timedsend) || \
1176    defined(TARGET_NR_mq_timedreceive) || defined(TARGET_NR_ipc) || \
1177    defined(TARGET_NR_semop) || defined(TARGET_NR_semtimedop) || \
1178    defined(TARGET_NR_timer_settime) || \
1179    (defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD))
1180static inline abi_long target_to_host_timespec(struct timespec *host_ts,
1181                                               abi_ulong target_addr)
1182{
1183    struct target_timespec *target_ts;
1184
1185    if (!lock_user_struct(VERIFY_READ, target_ts, target_addr, 1)) {
1186        return -TARGET_EFAULT;
1187    }
1188    __get_user(host_ts->tv_sec, &target_ts->tv_sec);
1189    __get_user(host_ts->tv_nsec, &target_ts->tv_nsec);
1190    unlock_user_struct(target_ts, target_addr, 0);
1191    return 0;
1192}
1193#endif
1194
1195#if defined(TARGET_NR_clock_settime64) || defined(TARGET_NR_futex_time64) || \
1196    defined(TARGET_NR_timer_settime64) || \
1197    defined(TARGET_NR_mq_timedsend_time64) || \
1198    defined(TARGET_NR_mq_timedreceive_time64) || \
1199    (defined(TARGET_NR_timerfd_settime64) && defined(CONFIG_TIMERFD)) || \
1200    defined(TARGET_NR_clock_nanosleep_time64) || \
1201    defined(TARGET_NR_rt_sigtimedwait_time64) || \
1202    defined(TARGET_NR_utimensat) || \
1203    defined(TARGET_NR_utimensat_time64) || \
1204    defined(TARGET_NR_semtimedop_time64) || \
1205    defined(TARGET_NR_pselect6_time64) || defined(TARGET_NR_ppoll_time64)
1206static inline abi_long target_to_host_timespec64(struct timespec *host_ts,
1207                                                 abi_ulong target_addr)
1208{
1209    struct target__kernel_timespec *target_ts;
1210
1211    if (!lock_user_struct(VERIFY_READ, target_ts, target_addr, 1)) {
1212        return -TARGET_EFAULT;
1213    }
1214    __get_user(host_ts->tv_sec, &target_ts->tv_sec);
1215    __get_user(host_ts->tv_nsec, &target_ts->tv_nsec);
1216    /* in 32bit mode, this drops the padding */
1217    host_ts->tv_nsec = (long)(abi_long)host_ts->tv_nsec;
1218    unlock_user_struct(target_ts, target_addr, 0);
1219    return 0;
1220}
1221#endif
1222
1223static inline abi_long host_to_target_timespec(abi_ulong target_addr,
1224                                               struct timespec *host_ts)
1225{
1226    struct target_timespec *target_ts;
1227
1228    if (!lock_user_struct(VERIFY_WRITE, target_ts, target_addr, 0)) {
1229        return -TARGET_EFAULT;
1230    }
1231    __put_user(host_ts->tv_sec, &target_ts->tv_sec);
1232    __put_user(host_ts->tv_nsec, &target_ts->tv_nsec);
1233    unlock_user_struct(target_ts, target_addr, 1);
1234    return 0;
1235}
1236
1237static inline abi_long host_to_target_timespec64(abi_ulong target_addr,
1238                                                 struct timespec *host_ts)
1239{
1240    struct target__kernel_timespec *target_ts;
1241
1242    if (!lock_user_struct(VERIFY_WRITE, target_ts, target_addr, 0)) {
1243        return -TARGET_EFAULT;
1244    }
1245    __put_user(host_ts->tv_sec, &target_ts->tv_sec);
1246    __put_user(host_ts->tv_nsec, &target_ts->tv_nsec);
1247    unlock_user_struct(target_ts, target_addr, 1);
1248    return 0;
1249}
1250
1251#if defined(TARGET_NR_gettimeofday)
1252static inline abi_long copy_to_user_timezone(abi_ulong target_tz_addr,
1253                                             struct timezone *tz)
1254{
1255    struct target_timezone *target_tz;
1256
1257    if (!lock_user_struct(VERIFY_WRITE, target_tz, target_tz_addr, 1)) {
1258        return -TARGET_EFAULT;
1259    }
1260
1261    __put_user(tz->tz_minuteswest, &target_tz->tz_minuteswest);
1262    __put_user(tz->tz_dsttime, &target_tz->tz_dsttime);
1263
1264    unlock_user_struct(target_tz, target_tz_addr, 1);
1265
1266    return 0;
1267}
1268#endif
1269
1270#if defined(TARGET_NR_settimeofday)
1271static inline abi_long copy_from_user_timezone(struct timezone *tz,
1272                                               abi_ulong target_tz_addr)
1273{
1274    struct target_timezone *target_tz;
1275
1276    if (!lock_user_struct(VERIFY_READ, target_tz, target_tz_addr, 1)) {
1277        return -TARGET_EFAULT;
1278    }
1279
1280    __get_user(tz->tz_minuteswest, &target_tz->tz_minuteswest);
1281    __get_user(tz->tz_dsttime, &target_tz->tz_dsttime);
1282
1283    unlock_user_struct(target_tz, target_tz_addr, 0);
1284
1285    return 0;
1286}
1287#endif
1288
1289#if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
1290#include <mqueue.h>
1291
1292static inline abi_long copy_from_user_mq_attr(struct mq_attr *attr,
1293                                              abi_ulong target_mq_attr_addr)
1294{
1295    struct target_mq_attr *target_mq_attr;
1296
1297    if (!lock_user_struct(VERIFY_READ, target_mq_attr,
1298                          target_mq_attr_addr, 1))
1299        return -TARGET_EFAULT;
1300
1301    __get_user(attr->mq_flags, &target_mq_attr->mq_flags);
1302    __get_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg);
1303    __get_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize);
1304    __get_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs);
1305
1306    unlock_user_struct(target_mq_attr, target_mq_attr_addr, 0);
1307
1308    return 0;
1309}
1310
1311static inline abi_long copy_to_user_mq_attr(abi_ulong target_mq_attr_addr,
1312                                            const struct mq_attr *attr)
1313{
1314    struct target_mq_attr *target_mq_attr;
1315
1316    if (!lock_user_struct(VERIFY_WRITE, target_mq_attr,
1317                          target_mq_attr_addr, 0))
1318        return -TARGET_EFAULT;
1319
1320    __put_user(attr->mq_flags, &target_mq_attr->mq_flags);
1321    __put_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg);
1322    __put_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize);
1323    __put_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs);
1324
1325    unlock_user_struct(target_mq_attr, target_mq_attr_addr, 1);
1326
1327    return 0;
1328}
1329#endif
1330
1331#if defined(TARGET_NR_select) || defined(TARGET_NR__newselect)
1332/* do_select() must return target values and target errnos. */
1333static abi_long do_select(int n,
1334                          abi_ulong rfd_addr, abi_ulong wfd_addr,
1335                          abi_ulong efd_addr, abi_ulong target_tv_addr)
1336{
1337    fd_set rfds, wfds, efds;
1338    fd_set *rfds_ptr, *wfds_ptr, *efds_ptr;
1339    struct timeval tv;
1340    struct timespec ts, *ts_ptr;
1341    abi_long ret;
1342
1343    ret = copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n);
1344    if (ret) {
1345        return ret;
1346    }
1347    ret = copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n);
1348    if (ret) {
1349        return ret;
1350    }
1351    ret = copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n);
1352    if (ret) {
1353        return ret;
1354    }
1355
1356    if (target_tv_addr) {
1357        if (copy_from_user_timeval(&tv, target_tv_addr))
1358            return -TARGET_EFAULT;
1359        ts.tv_sec = tv.tv_sec;
1360        ts.tv_nsec = tv.tv_usec * 1000;
1361        ts_ptr = &ts;
1362    } else {
1363        ts_ptr = NULL;
1364    }
1365
1366    ret = get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr,
1367                                  ts_ptr, NULL));
1368
1369    if (!is_error(ret)) {
1370        if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n))
1371            return -TARGET_EFAULT;
1372        if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n))
1373            return -TARGET_EFAULT;
1374        if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n))
1375            return -TARGET_EFAULT;
1376
1377        if (target_tv_addr) {
1378            tv.tv_sec = ts.tv_sec;
1379            tv.tv_usec = ts.tv_nsec / 1000;
1380            if (copy_to_user_timeval(target_tv_addr, &tv)) {
1381                return -TARGET_EFAULT;
1382            }
1383        }
1384    }
1385
1386    return ret;
1387}
1388
1389#if defined(TARGET_WANT_OLD_SYS_SELECT)
1390static abi_long do_old_select(abi_ulong arg1)
1391{
1392    struct target_sel_arg_struct *sel;
1393    abi_ulong inp, outp, exp, tvp;
1394    long nsel;
1395
1396    if (!lock_user_struct(VERIFY_READ, sel, arg1, 1)) {
1397        return -TARGET_EFAULT;
1398    }
1399
1400    nsel = tswapal(sel->n);
1401    inp = tswapal(sel->inp);
1402    outp = tswapal(sel->outp);
1403    exp = tswapal(sel->exp);
1404    tvp = tswapal(sel->tvp);
1405
1406    unlock_user_struct(sel, arg1, 0);
1407
1408    return do_select(nsel, inp, outp, exp, tvp);
1409}
1410#endif
1411#endif
1412
1413#if defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6_time64)
1414static abi_long do_pselect6(abi_long arg1, abi_long arg2, abi_long arg3,
1415                            abi_long arg4, abi_long arg5, abi_long arg6,
1416                            bool time64)
1417{
1418    abi_long rfd_addr, wfd_addr, efd_addr, n, ts_addr;
1419    fd_set rfds, wfds, efds;
1420    fd_set *rfds_ptr, *wfds_ptr, *efds_ptr;
1421    struct timespec ts, *ts_ptr;
1422    abi_long ret;
1423
1424    /*
1425     * The 6th arg is actually two args smashed together,
1426     * so we cannot use the C library.
1427     */
1428    struct {
1429        sigset_t *set;
1430        size_t size;
1431    } sig, *sig_ptr;
1432
1433    abi_ulong arg_sigset, arg_sigsize, *arg7;
1434
1435    n = arg1;
1436    rfd_addr = arg2;
1437    wfd_addr = arg3;
1438    efd_addr = arg4;
1439    ts_addr = arg5;
1440
1441    ret = copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n);
1442    if (ret) {
1443        return ret;
1444    }
1445    ret = copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n);
1446    if (ret) {
1447        return ret;
1448    }
1449    ret = copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n);
1450    if (ret) {
1451        return ret;
1452    }
1453
1454    /*
1455     * This takes a timespec, and not a timeval, so we cannot
1456     * use the do_select() helper ...
1457     */
1458    if (ts_addr) {
1459        if (time64) {
1460            if (target_to_host_timespec64(&ts, ts_addr)) {
1461                return -TARGET_EFAULT;
1462            }
1463        } else {
1464            if (target_to_host_timespec(&ts, ts_addr)) {
1465                return -TARGET_EFAULT;
1466            }
1467        }
1468            ts_ptr = &ts;
1469    } else {
1470        ts_ptr = NULL;
1471    }
1472
1473    /* Extract the two packed args for the sigset */
1474    sig_ptr = NULL;
1475    if (arg6) {
1476        arg7 = lock_user(VERIFY_READ, arg6, sizeof(*arg7) * 2, 1);
1477        if (!arg7) {
1478            return -TARGET_EFAULT;
1479        }
1480        arg_sigset = tswapal(arg7[0]);
1481        arg_sigsize = tswapal(arg7[1]);
1482        unlock_user(arg7, arg6, 0);
1483
1484        if (arg_sigset) {
1485            ret = process_sigsuspend_mask(&sig.set, arg_sigset, arg_sigsize);
1486            if (ret != 0) {
1487                return ret;
1488            }
1489            sig_ptr = &sig;
1490            sig.size = SIGSET_T_SIZE;
1491        }
1492    }
1493
1494    ret = get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr,
1495                                  ts_ptr, sig_ptr));
1496
1497    if (sig_ptr) {
1498        finish_sigsuspend_mask(ret);
1499    }
1500
1501    if (!is_error(ret)) {
1502        if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n)) {
1503            return -TARGET_EFAULT;
1504        }
1505        if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n)) {
1506            return -TARGET_EFAULT;
1507        }
1508        if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n)) {
1509            return -TARGET_EFAULT;
1510        }
1511        if (time64) {
1512            if (ts_addr && host_to_target_timespec64(ts_addr, &ts)) {
1513                return -TARGET_EFAULT;
1514            }
1515        } else {
1516            if (ts_addr && host_to_target_timespec(ts_addr, &ts)) {
1517                return -TARGET_EFAULT;
1518            }
1519        }
1520    }
1521    return ret;
1522}
1523#endif
1524
1525#if defined(TARGET_NR_poll) || defined(TARGET_NR_ppoll) || \
1526    defined(TARGET_NR_ppoll_time64)
1527static abi_long do_ppoll(abi_long arg1, abi_long arg2, abi_long arg3,
1528                         abi_long arg4, abi_long arg5, bool ppoll, bool time64)
1529{
1530    struct target_pollfd *target_pfd;
1531    unsigned int nfds = arg2;
1532    struct pollfd *pfd;
1533    unsigned int i;
1534    abi_long ret;
1535
1536    pfd = NULL;
1537    target_pfd = NULL;
1538    if (nfds) {
1539        if (nfds > (INT_MAX / sizeof(struct target_pollfd))) {
1540            return -TARGET_EINVAL;
1541        }
1542        target_pfd = lock_user(VERIFY_WRITE, arg1,
1543                               sizeof(struct target_pollfd) * nfds, 1);
1544        if (!target_pfd) {
1545            return -TARGET_EFAULT;
1546        }
1547
1548        pfd = alloca(sizeof(struct pollfd) * nfds);
1549        for (i = 0; i < nfds; i++) {
1550            pfd[i].fd = tswap32(target_pfd[i].fd);
1551            pfd[i].events = tswap16(target_pfd[i].events);
1552        }
1553    }
1554    if (ppoll) {
1555        struct timespec _timeout_ts, *timeout_ts = &_timeout_ts;
1556        sigset_t *set = NULL;
1557
1558        if (arg3) {
1559            if (time64) {
1560                if (target_to_host_timespec64(timeout_ts, arg3)) {
1561                    unlock_user(target_pfd, arg1, 0);
1562                    return -TARGET_EFAULT;
1563                }
1564            } else {
1565                if (target_to_host_timespec(timeout_ts, arg3)) {
1566                    unlock_user(target_pfd, arg1, 0);
1567                    return -TARGET_EFAULT;
1568                }
1569            }
1570        } else {
1571            timeout_ts = NULL;
1572        }
1573
1574        if (arg4) {
1575            ret = process_sigsuspend_mask(&set, arg4, arg5);
1576            if (ret != 0) {
1577                unlock_user(target_pfd, arg1, 0);
1578                return ret;
1579            }
1580        }
1581
1582        ret = get_errno(safe_ppoll(pfd, nfds, timeout_ts,
1583                                   set, SIGSET_T_SIZE));
1584
1585        if (set) {
1586            finish_sigsuspend_mask(ret);
1587        }
1588        if (!is_error(ret) && arg3) {
1589            if (time64) {
1590                if (host_to_target_timespec64(arg3, timeout_ts)) {
1591                    return -TARGET_EFAULT;
1592                }
1593            } else {
1594                if (host_to_target_timespec(arg3, timeout_ts)) {
1595                    return -TARGET_EFAULT;
1596                }
1597            }
1598        }
1599    } else {
1600          struct timespec ts, *pts;
1601
1602          if (arg3 >= 0) {
1603              /* Convert ms to secs, ns */
1604              ts.tv_sec = arg3 / 1000;
1605              ts.tv_nsec = (arg3 % 1000) * 1000000LL;
1606              pts = &ts;
1607          } else {
1608              /* -ve poll() timeout means "infinite" */
1609              pts = NULL;
1610          }
1611          ret = get_errno(safe_ppoll(pfd, nfds, pts, NULL, 0));
1612    }
1613
1614    if (!is_error(ret)) {
1615        for (i = 0; i < nfds; i++) {
1616            target_pfd[i].revents = tswap16(pfd[i].revents);
1617        }
1618    }
1619    unlock_user(target_pfd, arg1, sizeof(struct target_pollfd) * nfds);
1620    return ret;
1621}
1622#endif
1623
1624static abi_long do_pipe(CPUArchState *cpu_env, abi_ulong pipedes,
1625                        int flags, int is_pipe2)
1626{
1627    int host_pipe[2];
1628    abi_long ret;
1629    ret = pipe2(host_pipe, flags);
1630
1631    if (is_error(ret))
1632        return get_errno(ret);
1633
1634    /* Several targets have special calling conventions for the original
1635       pipe syscall, but didn't replicate this into the pipe2 syscall.  */
1636    if (!is_pipe2) {
1637#if defined(TARGET_ALPHA)
1638        cpu_env->ir[IR_A4] = host_pipe[1];
1639        return host_pipe[0];
1640#elif defined(TARGET_MIPS)
1641        cpu_env->active_tc.gpr[3] = host_pipe[1];
1642        return host_pipe[0];
1643#elif defined(TARGET_SH4)
1644        cpu_env->gregs[1] = host_pipe[1];
1645        return host_pipe[0];
1646#elif defined(TARGET_SPARC)
1647        cpu_env->regwptr[1] = host_pipe[1];
1648        return host_pipe[0];
1649#endif
1650    }
1651
1652    if (put_user_s32(host_pipe[0], pipedes)
1653        || put_user_s32(host_pipe[1], pipedes + sizeof(abi_int)))
1654        return -TARGET_EFAULT;
1655    return get_errno(ret);
1656}
1657
1658static inline abi_long target_to_host_sockaddr(int fd, struct sockaddr *addr,
1659                                               abi_ulong target_addr,
1660                                               socklen_t len)
1661{
1662    const socklen_t unix_maxlen = sizeof (struct sockaddr_un);
1663    sa_family_t sa_family;
1664    struct target_sockaddr *target_saddr;
1665
1666    if (fd_trans_target_to_host_addr(fd)) {
1667        return fd_trans_target_to_host_addr(fd)(addr, target_addr, len);
1668    }
1669
1670    target_saddr = lock_user(VERIFY_READ, target_addr, len, 1);
1671    if (!target_saddr)
1672        return -TARGET_EFAULT;
1673
1674    sa_family = tswap16(target_saddr->sa_family);
1675
1676    /* Oops. The caller might send a incomplete sun_path; sun_path
1677     * must be terminated by \0 (see the manual page), but
1678     * unfortunately it is quite common to specify sockaddr_un
1679     * length as "strlen(x->sun_path)" while it should be
1680     * "strlen(...) + 1". We'll fix that here if needed.
1681     * Linux kernel has a similar feature.
1682     */
1683
1684    if (sa_family == AF_UNIX) {
1685        if (len < unix_maxlen && len > 0) {
1686            char *cp = (char*)target_saddr;
1687
1688            if ( cp[len-1] && !cp[len] )
1689                len++;
1690        }
1691        if (len > unix_maxlen)
1692            len = unix_maxlen;
1693    }
1694
1695    memcpy(addr, target_saddr, len);
1696    addr->sa_family = sa_family;
1697    if (sa_family == AF_NETLINK) {
1698        struct sockaddr_nl *nladdr;
1699
1700        nladdr = (struct sockaddr_nl *)addr;
1701        nladdr->nl_pid = tswap32(nladdr->nl_pid);
1702        nladdr->nl_groups = tswap32(nladdr->nl_groups);
1703    } else if (sa_family == AF_PACKET) {
1704        struct target_sockaddr_ll *lladdr;
1705
1706        lladdr = (struct target_sockaddr_ll *)addr;
1707        lladdr->sll_ifindex = tswap32(lladdr->sll_ifindex);
1708        lladdr->sll_hatype = tswap16(lladdr->sll_hatype);
1709    } else if (sa_family == AF_INET6) {
1710        struct sockaddr_in6 *in6addr;
1711
1712        in6addr = (struct sockaddr_in6 *)addr;
1713        in6addr->sin6_scope_id = tswap32(in6addr->sin6_scope_id);
1714    }
1715    unlock_user(target_saddr, target_addr, 0);
1716
1717    return 0;
1718}
1719
1720static inline abi_long host_to_target_sockaddr(abi_ulong target_addr,
1721                                               struct sockaddr *addr,
1722                                               socklen_t len)
1723{
1724    struct target_sockaddr *target_saddr;
1725
1726    if (len == 0) {
1727        return 0;
1728    }
1729    assert(addr);
1730
1731    target_saddr = lock_user(VERIFY_WRITE, target_addr, len, 0);
1732    if (!target_saddr)
1733        return -TARGET_EFAULT;
1734    memcpy(target_saddr, addr, len);
1735    if (len >= offsetof(struct target_sockaddr, sa_family) +
1736        sizeof(target_saddr->sa_family)) {
1737        target_saddr->sa_family = tswap16(addr->sa_family);
1738    }
1739    if (addr->sa_family == AF_NETLINK &&
1740        len >= sizeof(struct target_sockaddr_nl)) {
1741        struct target_sockaddr_nl *target_nl =
1742               (struct target_sockaddr_nl *)target_saddr;
1743        target_nl->nl_pid = tswap32(target_nl->nl_pid);
1744        target_nl->nl_groups = tswap32(target_nl->nl_groups);
1745    } else if (addr->sa_family == AF_PACKET) {
1746        struct sockaddr_ll *target_ll = (struct sockaddr_ll *)target_saddr;
1747        target_ll->sll_ifindex = tswap32(target_ll->sll_ifindex);
1748        target_ll->sll_hatype = tswap16(target_ll->sll_hatype);
1749    } else if (addr->sa_family == AF_INET6 &&
1750               len >= sizeof(struct target_sockaddr_in6)) {
1751        struct target_sockaddr_in6 *target_in6 =
1752               (struct target_sockaddr_in6 *)target_saddr;
1753        target_in6->sin6_scope_id = tswap16(target_in6->sin6_scope_id);
1754    }
1755    unlock_user(target_saddr, target_addr, len);
1756
1757    return 0;
1758}
1759
1760static inline abi_long target_to_host_cmsg(struct msghdr *msgh,
1761                                           struct target_msghdr *target_msgh)
1762{
1763    struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh);
1764    abi_long msg_controllen;
1765    abi_ulong target_cmsg_addr;
1766    struct target_cmsghdr *target_cmsg, *target_cmsg_start;
1767    socklen_t space = 0;
1768    
1769    msg_controllen = tswapal(target_msgh->msg_controllen);
1770    if (msg_controllen < sizeof (struct target_cmsghdr)) 
1771        goto the_end;
1772    target_cmsg_addr = tswapal(target_msgh->msg_control);
1773    target_cmsg = lock_user(VERIFY_READ, target_cmsg_addr, msg_controllen, 1);
1774    target_cmsg_start = target_cmsg;
1775    if (!target_cmsg)
1776        return -TARGET_EFAULT;
1777
1778    while (cmsg && target_cmsg) {
1779        void *data = CMSG_DATA(cmsg);
1780        void *target_data = TARGET_CMSG_DATA(target_cmsg);
1781
1782        int len = tswapal(target_cmsg->cmsg_len)
1783            - sizeof(struct target_cmsghdr);
1784
1785        space += CMSG_SPACE(len);
1786        if (space > msgh->msg_controllen) {
1787            space -= CMSG_SPACE(len);
1788            /* This is a QEMU bug, since we allocated the payload
1789             * area ourselves (unlike overflow in host-to-target
1790             * conversion, which is just the guest giving us a buffer
1791             * that's too small). It can't happen for the payload types
1792             * we currently support; if it becomes an issue in future
1793             * we would need to improve our allocation strategy to
1794             * something more intelligent than "twice the size of the
1795             * target buffer we're reading from".
1796             */
1797            qemu_log_mask(LOG_UNIMP,
1798                          ("Unsupported ancillary data %d/%d: "
1799                           "unhandled msg size\n"),
1800                          tswap32(target_cmsg->cmsg_level),
1801                          tswap32(target_cmsg->cmsg_type));
1802            break;
1803        }
1804
1805        if (tswap32(target_cmsg->cmsg_level) == TARGET_SOL_SOCKET) {
1806            cmsg->cmsg_level = SOL_SOCKET;
1807        } else {
1808            cmsg->cmsg_level = tswap32(target_cmsg->cmsg_level);
1809        }
1810        cmsg->cmsg_type = tswap32(target_cmsg->cmsg_type);
1811        cmsg->cmsg_len = CMSG_LEN(len);
1812
1813        if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
1814            int *fd = (int *)data;
1815            int *target_fd = (int *)target_data;
1816            int i, numfds = len / sizeof(int);
1817
1818            for (i = 0; i < numfds; i++) {
1819                __get_user(fd[i], target_fd + i);
1820            }
1821        } else if (cmsg->cmsg_level == SOL_SOCKET
1822               &&  cmsg->cmsg_type == SCM_CREDENTIALS) {
1823            struct ucred *cred = (struct ucred *)data;
1824            struct target_ucred *target_cred =
1825                (struct target_ucred *)target_data;
1826
1827            __get_user(cred->pid, &target_cred->pid);
1828            __get_user(cred->uid, &target_cred->uid);
1829            __get_user(cred->gid, &target_cred->gid);
1830        } else if (cmsg->cmsg_level == SOL_ALG) {
1831            uint32_t *dst = (uint32_t *)data;
1832
1833            memcpy(dst, target_data, len);
1834            /* fix endianness of first 32-bit word */
1835            if (len >= sizeof(uint32_t)) {
1836                *dst = tswap32(*dst);
1837            }
1838        } else {
1839            qemu_log_mask(LOG_UNIMP, "Unsupported target ancillary data: %d/%d\n",
1840                          cmsg->cmsg_level, cmsg->cmsg_type);
1841            memcpy(data, target_data, len);
1842        }
1843
1844        cmsg = CMSG_NXTHDR(msgh, cmsg);
1845        target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg,
1846                                         target_cmsg_start);
1847    }
1848    unlock_user(target_cmsg, target_cmsg_addr, 0);
1849 the_end:
1850    msgh->msg_controllen = space;
1851    return 0;
1852}
1853
1854static inline abi_long host_to_target_cmsg(struct target_msghdr *target_msgh,
1855                                           struct msghdr *msgh)
1856{
1857    struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh);
1858    abi_long msg_controllen;
1859    abi_ulong target_cmsg_addr;
1860    struct target_cmsghdr *target_cmsg, *target_cmsg_start;
1861    socklen_t space = 0;
1862
1863    msg_controllen = tswapal(target_msgh->msg_controllen);
1864    if (msg_controllen < sizeof (struct target_cmsghdr)) 
1865        goto the_end;
1866    target_cmsg_addr = tswapal(target_msgh->msg_control);
1867    target_cmsg = lock_user(VERIFY_WRITE, target_cmsg_addr, msg_controllen, 0);
1868    target_cmsg_start = target_cmsg;
1869    if (!target_cmsg)
1870        return -TARGET_EFAULT;
1871
1872    while (cmsg && target_cmsg) {
1873        void *data = CMSG_DATA(cmsg);
1874        void *target_data = TARGET_CMSG_DATA(target_cmsg);
1875
1876        int len = cmsg->cmsg_len - sizeof(struct cmsghdr);
1877        int tgt_len, tgt_space;
1878
1879        /* We never copy a half-header but may copy half-data;
1880         * this is Linux's behaviour in put_cmsg(). Note that
1881         * truncation here is a guest problem (which we report
1882         * to the guest via the CTRUNC bit), unlike truncation
1883         * in target_to_host_cmsg, which is a QEMU bug.
1884         */
1885        if (msg_controllen < sizeof(struct target_cmsghdr)) {
1886            target_msgh->msg_flags |= tswap32(MSG_CTRUNC);
1887            break;
1888        }
1889
1890        if (cmsg->cmsg_level == SOL_SOCKET) {
1891            target_cmsg->cmsg_level = tswap32(TARGET_SOL_SOCKET);
1892        } else {
1893            target_cmsg->cmsg_level = tswap32(cmsg->cmsg_level);
1894        }
1895        target_cmsg->cmsg_type = tswap32(cmsg->cmsg_type);
1896
1897        /* Payload types which need a different size of payload on
1898         * the target must adjust tgt_len here.
1899         */
1900        tgt_len = len;
1901        switch (cmsg->cmsg_level) {
1902        case SOL_SOCKET:
1903            switch (cmsg->cmsg_type) {
1904            case SO_TIMESTAMP:
1905                tgt_len = sizeof(struct target_timeval);
1906                break;
1907            default:
1908                break;
1909            }
1910            break;
1911        default:
1912            break;
1913        }
1914
1915        if (msg_controllen < TARGET_CMSG_LEN(tgt_len)) {
1916            target_msgh->msg_flags |= tswap32(MSG_CTRUNC);
1917            tgt_len = msg_controllen - sizeof(struct target_cmsghdr);
1918        }
1919
1920        /* We must now copy-and-convert len bytes of payload
1921         * into tgt_len bytes of destination space. Bear in mind
1922         * that in both source and destination we may be dealing
1923         * with a truncated value!
1924         */
1925        switch (cmsg->cmsg_level) {
1926        case SOL_SOCKET:
1927            switch (cmsg->cmsg_type) {
1928            case SCM_RIGHTS:
1929            {
1930                int *fd = (int *)data;
1931                int *target_fd = (int *)target_data;
1932                int i, numfds = tgt_len / sizeof(int);
1933
1934                for (i = 0; i < numfds; i++) {
1935                    __put_user(fd[i], target_fd + i);
1936                }
1937                break;
1938            }
1939            case SO_TIMESTAMP:
1940            {
1941                struct timeval *tv = (struct timeval *)data;
1942                struct target_timeval *target_tv =
1943                    (struct target_timeval *)target_data;
1944
1945                if (len != sizeof(struct timeval) ||
1946                    tgt_len != sizeof(struct target_timeval)) {
1947                    goto unimplemented;
1948                }
1949
1950                /* copy struct timeval to target */
1951                __put_user(tv->tv_sec, &target_tv->tv_sec);
1952                __put_user(tv->tv_usec, &target_tv->tv_usec);
1953                break;
1954            }
1955            case SCM_CREDENTIALS:
1956            {
1957                struct ucred *cred = (struct ucred *)data;
1958                struct target_ucred *target_cred =
1959                    (struct target_ucred *)target_data;
1960
1961                __put_user(cred->pid, &target_cred->pid);
1962                __put_user(cred->uid, &target_cred->uid);
1963                __put_user(cred->gid, &target_cred->gid);
1964                break;
1965            }
1966            default:
1967                goto unimplemented;
1968            }
1969            break;
1970
1971        case SOL_IP:
1972            switch (cmsg->cmsg_type) {
1973            case IP_TTL:
1974            {
1975                uint32_t *v = (uint32_t *)data;
1976                uint32_t *t_int = (uint32_t *)target_data;
1977
1978                if (len != sizeof(uint32_t) ||
1979                    tgt_len != sizeof(uint32_t)) {
1980                    goto unimplemented;
1981                }
1982                __put_user(*v, t_int);
1983                break;
1984            }
1985            case IP_RECVERR:
1986            {
1987                struct errhdr_t {
1988                   struct sock_extended_err ee;
1989                   struct sockaddr_in offender;
1990                };
1991                struct errhdr_t *errh = (struct errhdr_t *)data;
1992                struct errhdr_t *target_errh =
1993                    (struct errhdr_t *)target_data;
1994
1995                if (len != sizeof(struct errhdr_t) ||
1996                    tgt_len != sizeof(struct errhdr_t)) {
1997                    goto unimplemented;
1998                }
1999                __put_user(errh->ee.ee_errno, &target_errh->ee.ee_errno);
2000                __put_user(errh->ee.ee_origin, &target_errh->ee.ee_origin);
2001                __put_user(errh->ee.ee_type,  &target_errh->ee.ee_type);
2002                __put_user(errh->ee.ee_code, &target_errh->ee.ee_code);
2003                __put_user(errh->ee.ee_pad, &target_errh->ee.ee_pad);
2004                __put_user(errh->ee.ee_info, &target_errh->ee.ee_info);
2005                __put_user(errh->ee.ee_data, &target_errh->ee.ee_data);
2006                host_to_target_sockaddr((unsigned long) &target_errh->offender,
2007                    (void *) &errh->offender, sizeof(errh->offender));
2008                break;
2009            }
2010            case IP_PKTINFO:
2011            {
2012                struct in_pktinfo *pkti = data;
2013                struct target_in_pktinfo *target_pi = target_data;
2014
2015                __put_user(pkti->ipi_ifindex, &target_pi->ipi_ifindex);
2016                target_pi->ipi_spec_dst.s_addr = pkti->ipi_spec_dst.s_addr;
2017                target_pi->ipi_addr.s_addr = pkti->ipi_addr.s_addr;
2018                break;
2019            }
2020            default:
2021                goto unimplemented;
2022            }
2023            break;
2024
2025        case SOL_IPV6:
2026            switch (cmsg->cmsg_type) {
2027            case IPV6_HOPLIMIT:
2028            {
2029                uint32_t *v = (uint32_t *)data;
2030                uint32_t *t_int = (uint32_t *)target_data;
2031
2032                if (len != sizeof(uint32_t) ||
2033                    tgt_len != sizeof(uint32_t)) {
2034                    goto unimplemented;
2035                }
2036                __put_user(*v, t_int);
2037                break;
2038            }
2039            case IPV6_RECVERR:
2040            {
2041                struct errhdr6_t {
2042                   struct sock_extended_err ee;
2043                   struct sockaddr_in6 offender;
2044                };
2045                struct errhdr6_t *errh = (struct errhdr6_t *)data;
2046                struct errhdr6_t *target_errh =
2047                    (struct errhdr6_t *)target_data;
2048
2049                if (len != sizeof(struct errhdr6_t) ||
2050                    tgt_len != sizeof(struct errhdr6_t)) {
2051                    goto unimplemented;
2052                }
2053                __put_user(errh->ee.ee_errno, &target_errh->ee.ee_errno);
2054                __put_user(errh->ee.ee_origin, &target_errh->ee.ee_origin);
2055                __put_user(errh->ee.ee_type,  &target_errh->ee.ee_type);
2056                __put_user(errh->ee.ee_code, &target_errh->ee.ee_code);
2057                __put_user(errh->ee.ee_pad, &target_errh->ee.ee_pad);
2058                __put_user(errh->ee.ee_info, &target_errh->ee.ee_info);
2059                __put_user(errh->ee.ee_data, &target_errh->ee.ee_data);
2060                host_to_target_sockaddr((unsigned long) &target_errh->offender,
2061                    (void *) &errh->offender, sizeof(errh->offender));
2062                break;
2063            }
2064            default:
2065                goto unimplemented;
2066            }
2067            break;
2068
2069        default:
2070        unimplemented:
2071            qemu_log_mask(LOG_UNIMP, "Unsupported host ancillary data: %d/%d\n",
2072                          cmsg->cmsg_level, cmsg->cmsg_type);
2073            memcpy(target_data, data, MIN(len, tgt_len));
2074            if (tgt_len > len) {
2075                memset(target_data + len, 0, tgt_len - len);
2076            }
2077        }
2078
2079        target_cmsg->cmsg_len = tswapal(TARGET_CMSG_LEN(tgt_len));
2080        tgt_space = TARGET_CMSG_SPACE(tgt_len);
2081        if (msg_controllen < tgt_space) {
2082            tgt_space = msg_controllen;
2083        }
2084        msg_controllen -= tgt_space;
2085        space += tgt_space;
2086        cmsg = CMSG_NXTHDR(msgh, cmsg);
2087        target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg,
2088                                         target_cmsg_start);
2089    }
2090    unlock_user(target_cmsg, target_cmsg_addr, space);
2091 the_end:
2092    target_msgh->msg_controllen = tswapal(space);
2093    return 0;
2094}
2095
2096/* do_setsockopt() Must return target values and target errnos. */
2097static abi_long do_setsockopt(int sockfd, int level, int optname,
2098                              abi_ulong optval_addr, socklen_t optlen)
2099{
2100    abi_long ret;
2101    int val;
2102
2103    switch(level) {
2104    case SOL_TCP:
2105    case SOL_UDP:
2106        /* TCP and UDP options all take an 'int' value.  */
2107        if (optlen < sizeof(uint32_t))
2108            return -TARGET_EINVAL;
2109
2110        if (get_user_u32(val, optval_addr))
2111            return -TARGET_EFAULT;
2112        ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
2113        break;
2114    case SOL_IP:
2115        switch(optname) {
2116        case IP_TOS:
2117        case IP_TTL:
2118        case IP_HDRINCL:
2119        case IP_ROUTER_ALERT:
2120        case IP_RECVOPTS:
2121        case IP_RETOPTS:
2122        case IP_PKTINFO:
2123        case IP_MTU_DISCOVER:
2124        case IP_RECVERR:
2125        case IP_RECVTTL:
2126        case IP_RECVTOS:
2127#ifdef IP_FREEBIND
2128        case IP_FREEBIND:
2129#endif
2130        case IP_MULTICAST_TTL:
2131        case IP_MULTICAST_LOOP:
2132            val = 0;
2133            if (optlen >= sizeof(uint32_t)) {
2134                if (get_user_u32(val, optval_addr))
2135                    return -TARGET_EFAULT;
2136            } else if (optlen >= 1) {
2137                if (get_user_u8(val, optval_addr))
2138                    return -TARGET_EFAULT;
2139            }
2140            ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
2141            break;
2142        case IP_MULTICAST_IF:
2143        case IP_ADD_MEMBERSHIP:
2144        case IP_DROP_MEMBERSHIP:
2145        {
2146            struct ip_mreqn ip_mreq;
2147            struct target_ip_mreqn *target_smreqn;
2148            int min_size;
2149
2150            QEMU_BUILD_BUG_ON(sizeof(struct ip_mreq) !=
2151                              sizeof(struct target_ip_mreq));
2152
2153            if (optname == IP_MULTICAST_IF) {
2154                min_size = sizeof(struct in_addr);
2155            } else {
2156                min_size = sizeof(struct target_ip_mreq);
2157            }
2158            if (optlen < min_size ||
2159                optlen > sizeof (struct target_ip_mreqn)) {
2160                return -TARGET_EINVAL;
2161            }
2162
2163            target_smreqn = lock_user(VERIFY_READ, optval_addr, optlen, 1);
2164            if (!target_smreqn) {
2165                return -TARGET_EFAULT;
2166            }
2167            ip_mreq.imr_multiaddr.s_addr = target_smreqn->imr_multiaddr.s_addr;
2168            if (optlen >= sizeof(struct target_ip_mreq)) {
2169                ip_mreq.imr_address.s_addr = target_smreqn->imr_address.s_addr;
2170                if (optlen >= sizeof(struct target_ip_mreqn)) {
2171                    __put_user(target_smreqn->imr_ifindex, &ip_mreq.imr_ifindex);
2172                    optlen = sizeof(struct ip_mreqn);
2173                }
2174            }
2175            unlock_user(target_smreqn, optval_addr, 0);
2176            ret = get_errno(setsockopt(sockfd, level, optname, &ip_mreq, optlen));
2177            break;
2178        }
2179        case IP_BLOCK_SOURCE:
2180        case IP_UNBLOCK_SOURCE:
2181        case IP_ADD_SOURCE_MEMBERSHIP:
2182        case IP_DROP_SOURCE_MEMBERSHIP:
2183        {
2184            struct ip_mreq_source *ip_mreq_source;
2185
2186            if (optlen != sizeof (struct target_ip_mreq_source))
2187                return -TARGET_EINVAL;
2188
2189            ip_mreq_source = lock_user(VERIFY_READ, optval_addr, optlen, 1);
2190            if (!ip_mreq_source) {
2191                return -TARGET_EFAULT;
2192            }
2193            ret = get_errno(setsockopt(sockfd, level, optname, ip_mreq_source, optlen));
2194            unlock_user (ip_mreq_source, optval_addr, 0);
2195            break;
2196        }
2197        default:
2198            goto unimplemented;
2199        }
2200        break;
2201    case SOL_IPV6:
2202        switch (optname) {
2203        case IPV6_MTU_DISCOVER:
2204        case IPV6_MTU:
2205        case IPV6_V6ONLY:
2206        case IPV6_RECVPKTINFO:
2207        case IPV6_UNICAST_HOPS:
2208        case IPV6_MULTICAST_HOPS:
2209        case IPV6_MULTICAST_LOOP:
2210        case IPV6_RECVERR:
2211        case IPV6_RECVHOPLIMIT:
2212        case IPV6_2292HOPLIMIT:
2213        case IPV6_CHECKSUM:
2214        case IPV6_ADDRFORM:
2215        case IPV6_2292PKTINFO:
2216        case IPV6_RECVTCLASS:
2217        case IPV6_RECVRTHDR:
2218        case IPV6_2292RTHDR:
2219        case IPV6_RECVHOPOPTS:
2220        case IPV6_2292HOPOPTS:
2221        case IPV6_RECVDSTOPTS:
2222        case IPV6_2292DSTOPTS:
2223        case IPV6_TCLASS:
2224        case IPV6_ADDR_PREFERENCES:
2225#ifdef IPV6_RECVPATHMTU
2226        case IPV6_RECVPATHMTU:
2227#endif
2228#ifdef IPV6_TRANSPARENT
2229        case IPV6_TRANSPARENT:
2230#endif
2231#ifdef IPV6_FREEBIND
2232        case IPV6_FREEBIND:
2233#endif
2234#ifdef IPV6_RECVORIGDSTADDR
2235        case IPV6_RECVORIGDSTADDR:
2236#endif
2237            val = 0;
2238            if (optlen < sizeof(uint32_t)) {
2239                return -TARGET_EINVAL;
2240            }
2241            if (get_user_u32(val, optval_addr)) {
2242                return -TARGET_EFAULT;
2243            }
2244            ret = get_errno(setsockopt(sockfd, level, optname,
2245                                       &val, sizeof(val)));
2246            break;
2247        case IPV6_PKTINFO:
2248        {
2249            struct in6_pktinfo pki;
2250
2251            if (optlen < sizeof(pki)) {
2252                return -TARGET_EINVAL;
2253            }
2254
2255            if (copy_from_user(&pki, optval_addr, sizeof(pki))) {
2256                return -TARGET_EFAULT;
2257            }
2258
2259            pki.ipi6_ifindex = tswap32(pki.ipi6_ifindex);
2260
2261            ret = get_errno(setsockopt(sockfd, level, optname,
2262                                       &pki, sizeof(pki)));
2263            break;
2264        }
2265        case IPV6_ADD_MEMBERSHIP:
2266        case IPV6_DROP_MEMBERSHIP:
2267        {
2268            struct ipv6_mreq ipv6mreq;
2269
2270            if (optlen < sizeof(ipv6mreq)) {
2271                return -TARGET_EINVAL;
2272            }
2273
2274            if (copy_from_user(&ipv6mreq, optval_addr, sizeof(ipv6mreq))) {
2275                return -TARGET_EFAULT;
2276            }
2277
2278            ipv6mreq.ipv6mr_interface = tswap32(ipv6mreq.ipv6mr_interface);
2279
2280            ret = get_errno(setsockopt(sockfd, level, optname,
2281                                       &ipv6mreq, sizeof(ipv6mreq)));
2282            break;
2283        }
2284        default:
2285            goto unimplemented;
2286        }
2287        break;
2288    case SOL_ICMPV6:
2289        switch (optname) {
2290        case ICMPV6_FILTER:
2291        {
2292            struct icmp6_filter icmp6f;
2293
2294            if (optlen > sizeof(icmp6f)) {
2295                optlen = sizeof(icmp6f);
2296            }
2297
2298            if (copy_from_user(&icmp6f, optval_addr, optlen)) {
2299                return -TARGET_EFAULT;
2300            }
2301
2302            for (val = 0; val < 8; val++) {
2303                icmp6f.data[val] = tswap32(icmp6f.data[val]);
2304            }
2305
2306            ret = get_errno(setsockopt(sockfd, level, optname,
2307                                       &icmp6f, optlen));
2308            break;
2309        }
2310        default:
2311            goto unimplemented;
2312        }
2313        break;
2314    case SOL_RAW:
2315        switch (optname) {
2316        case ICMP_FILTER:
2317        case IPV6_CHECKSUM:
2318            /* those take an u32 value */
2319            if (optlen < sizeof(uint32_t)) {
2320                return -TARGET_EINVAL;
2321            }
2322
2323            if (get_user_u32(val, optval_addr)) {
2324                return -TARGET_EFAULT;
2325            }
2326            ret = get_errno(setsockopt(sockfd, level, optname,
2327                                       &val, sizeof(val)));
2328            break;
2329
2330        default:
2331            goto unimplemented;
2332        }
2333        break;
2334#if defined(SOL_ALG) && defined(ALG_SET_KEY) && defined(ALG_SET_AEAD_AUTHSIZE)
2335    case SOL_ALG:
2336        switch (optname) {
2337        case ALG_SET_KEY:
2338        {
2339            char *alg_key = lock_user(VERIFY_READ, optval_addr, optlen, 1);
2340            if (!alg_key) {
2341                return -TARGET_EFAULT;
2342            }
2343            ret = get_errno(setsockopt(sockfd, level, optname,
2344                                       alg_key, optlen));
2345            unlock_user(alg_key, optval_addr, optlen);
2346            break;
2347        }
2348        case ALG_SET_AEAD_AUTHSIZE:
2349        {
2350            ret = get_errno(setsockopt(sockfd, level, optname,
2351                                       NULL, optlen));
2352            break;
2353        }
2354        default:
2355            goto unimplemented;
2356        }
2357        break;
2358#endif
2359    case TARGET_SOL_SOCKET:
2360        switch (optname) {
2361        case TARGET_SO_RCVTIMEO:
2362        case TARGET_SO_SNDTIMEO:
2363        {
2364                struct timeval tv;
2365
2366                if (optlen != sizeof(struct target_timeval)) {
2367                    return -TARGET_EINVAL;
2368                }
2369
2370                if (copy_from_user_timeval(&tv, optval_addr)) {
2371                    return -TARGET_EFAULT;
2372                }
2373
2374                ret = get_errno(setsockopt(sockfd, SOL_SOCKET,
2375                                optname == TARGET_SO_RCVTIMEO ?
2376                                    SO_RCVTIMEO : SO_SNDTIMEO,
2377                                &tv, sizeof(tv)));
2378                return ret;
2379        }
2380        case TARGET_SO_ATTACH_FILTER:
2381        {
2382                struct target_sock_fprog *tfprog;
2383                struct target_sock_filter *tfilter;
2384                struct sock_fprog fprog;
2385                struct sock_filter *filter;
2386                int i;
2387
2388                if (optlen != sizeof(*tfprog)) {
2389                    return -TARGET_EINVAL;
2390                }
2391                if (!lock_user_struct(VERIFY_READ, tfprog, optval_addr, 0)) {
2392                    return -TARGET_EFAULT;
2393                }
2394                if (!lock_user_struct(VERIFY_READ, tfilter,
2395                                      tswapal(tfprog->filter), 0)) {
2396                    unlock_user_struct(tfprog, optval_addr, 1);
2397                    return -TARGET_EFAULT;
2398                }
2399
2400                fprog.len = tswap16(tfprog->len);
2401                filter = g_try_new(struct sock_filter, fprog.len);
2402                if (filter == NULL) {
2403                    unlock_user_struct(tfilter, tfprog->filter, 1);
2404                    unlock_user_struct(tfprog, optval_addr, 1);
2405                    return -TARGET_ENOMEM;
2406                }
2407                for (i = 0; i < fprog.len; i++) {
2408                    filter[i].code = tswap16(tfilter[i].code);
2409                    filter[i].jt = tfilter[i].jt;
2410                    filter[i].jf = tfilter[i].jf;
2411                    filter[i].k = tswap32(tfilter[i].k);
2412                }
2413                fprog.filter = filter;
2414
2415                ret = get_errno(setsockopt(sockfd, SOL_SOCKET,
2416                                SO_ATTACH_FILTER, &fprog, sizeof(fprog)));
2417                g_free(filter);
2418
2419                unlock_user_struct(tfilter, tfprog->filter, 1);
2420                unlock_user_struct(tfprog, optval_addr, 1);
2421                return ret;
2422        }
2423        case TARGET_SO_BINDTODEVICE:
2424        {
2425                char *dev_ifname, *addr_ifname;
2426
2427                if (optlen > IFNAMSIZ - 1) {
2428                    optlen = IFNAMSIZ - 1;
2429                }
2430                dev_ifname = lock_user(VERIFY_READ, optval_addr, optlen, 1);
2431                if (!dev_ifname) {
2432                    return -TARGET_EFAULT;
2433                }
2434                optname = SO_BINDTODEVICE;
2435                addr_ifname = alloca(IFNAMSIZ);
2436                memcpy(addr_ifname, dev_ifname, optlen);
2437                addr_ifname[optlen] = 0;
2438                ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname,
2439                                           addr_ifname, optlen));
2440                unlock_user (dev_ifname, optval_addr, 0);
2441                return ret;
2442        }
2443        case TARGET_SO_LINGER:
2444        {
2445                struct linger lg;
2446                struct target_linger *tlg;
2447
2448                if (optlen != sizeof(struct target_linger)) {
2449                    return -TARGET_EINVAL;
2450                }
2451                if (!lock_user_struct(VERIFY_READ, tlg, optval_addr, 1)) {
2452                    return -TARGET_EFAULT;
2453                }
2454                __get_user(lg.l_onoff, &tlg->l_onoff);
2455                __get_user(lg.l_linger, &tlg->l_linger);
2456                ret = get_errno(setsockopt(sockfd, SOL_SOCKET, SO_LINGER,
2457                                &lg, sizeof(lg)));
2458                unlock_user_struct(tlg, optval_addr, 0);
2459                return ret;
2460        }
2461            /* Options with 'int' argument.  */
2462        case TARGET_SO_DEBUG:
2463                optname = SO_DEBUG;
2464                break;
2465        case TARGET_SO_REUSEADDR:
2466                optname = SO_REUSEADDR;
2467                break;
2468#ifdef SO_REUSEPORT
2469        case TARGET_SO_REUSEPORT:
2470                optname = SO_REUSEPORT;
2471                break;
2472#endif
2473        case TARGET_SO_TYPE:
2474                optname = SO_TYPE;
2475                break;
2476        case TARGET_SO_ERROR:
2477                optname = SO_ERROR;
2478                break;
2479        case TARGET_SO_DONTROUTE:
2480                optname = SO_DONTROUTE;
2481                break;
2482        case TARGET_SO_BROADCAST:
2483                optname = SO_BROADCAST;
2484                break;
2485        case TARGET_SO_SNDBUF:
2486                optname = SO_SNDBUF;
2487                break;
2488        case TARGET_SO_SNDBUFFORCE:
2489                optname = SO_SNDBUFFORCE;
2490                break;
2491        case TARGET_SO_RCVBUF:
2492                optname = SO_RCVBUF;
2493                break;
2494        case TARGET_SO_RCVBUFFORCE:
2495                optname = SO_RCVBUFFORCE;
2496                break;
2497        case TARGET_SO_KEEPALIVE:
2498                optname = SO_KEEPALIVE;
2499                break;
2500        case TARGET_SO_OOBINLINE:
2501                optname = SO_OOBINLINE;
2502                break;
2503        case TARGET_SO_NO_CHECK:
2504                optname = SO_NO_CHECK;
2505                break;
2506        case TARGET_SO_PRIORITY:
2507                optname = SO_PRIORITY;
2508                break;
2509#ifdef SO_BSDCOMPAT
2510        case TARGET_SO_BSDCOMPAT:
2511                optname = SO_BSDCOMPAT;
2512                break;
2513#endif
2514        case TARGET_SO_PASSCRED:
2515                optname = SO_PASSCRED;
2516                break;
2517        case TARGET_SO_PASSSEC:
2518                optname = SO_PASSSEC;
2519                break;
2520        case TARGET_SO_TIMESTAMP:
2521                optname = SO_TIMESTAMP;
2522                break;
2523        case TARGET_SO_RCVLOWAT:
2524                optname = SO_RCVLOWAT;
2525                break;
2526        default:
2527            goto unimplemented;
2528        }
2529        if (optlen < sizeof(uint32_t))
2530            return -TARGET_EINVAL;
2531
2532        if (get_user_u32(val, optval_addr))
2533            return -TARGET_EFAULT;
2534        ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname, &val, sizeof(val)));
2535        break;
2536#ifdef SOL_NETLINK
2537    case SOL_NETLINK:
2538        switch (optname) {
2539        case NETLINK_PKTINFO:
2540        case NETLINK_ADD_MEMBERSHIP:
2541        case NETLINK_DROP_MEMBERSHIP:
2542        case NETLINK_BROADCAST_ERROR:
2543        case NETLINK_NO_ENOBUFS:
2544#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
2545        case NETLINK_LISTEN_ALL_NSID:
2546        case NETLINK_CAP_ACK:
2547#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
2548#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
2549        case NETLINK_EXT_ACK:
2550#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
2551#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
2552        case NETLINK_GET_STRICT_CHK:
2553#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
2554            break;
2555        default:
2556            goto unimplemented;
2557        }
2558        val = 0;
2559        if (optlen < sizeof(uint32_t)) {
2560            return -TARGET_EINVAL;
2561        }
2562        if (get_user_u32(val, optval_addr)) {
2563            return -TARGET_EFAULT;
2564        }
2565        ret = get_errno(setsockopt(sockfd, SOL_NETLINK, optname, &val,
2566                                   sizeof(val)));
2567        break;
2568#endif /* SOL_NETLINK */
2569    default:
2570    unimplemented:
2571        qemu_log_mask(LOG_UNIMP, "Unsupported setsockopt level=%d optname=%d\n",
2572                      level, optname);
2573        ret = -TARGET_ENOPROTOOPT;
2574    }
2575    return ret;
2576}
2577
2578/* do_getsockopt() Must return target values and target errnos. */
2579static abi_long do_getsockopt(int sockfd, int level, int optname,
2580                              abi_ulong optval_addr, abi_ulong optlen)
2581{
2582    abi_long ret;
2583    int len, val;
2584    socklen_t lv;
2585
2586    switch(level) {
2587    case TARGET_SOL_SOCKET:
2588        level = SOL_SOCKET;
2589        switch (optname) {
2590        /* These don't just return a single integer */
2591        case TARGET_SO_PEERNAME:
2592            goto unimplemented;
2593        case TARGET_SO_RCVTIMEO: {
2594            struct timeval tv;
2595            socklen_t tvlen;
2596
2597            optname = SO_RCVTIMEO;
2598
2599get_timeout:
2600            if (get_user_u32(len, optlen)) {
2601                return -TARGET_EFAULT;
2602            }
2603            if (len < 0) {
2604                return -TARGET_EINVAL;
2605            }
2606
2607            tvlen = sizeof(tv);
2608            ret = get_errno(getsockopt(sockfd, level, optname,
2609                                       &tv, &tvlen));
2610            if (ret < 0) {
2611                return ret;
2612            }
2613            if (len > sizeof(struct target_timeval)) {
2614                len = sizeof(struct target_timeval);
2615            }
2616            if (copy_to_user_timeval(optval_addr, &tv)) {
2617                return -TARGET_EFAULT;
2618            }
2619            if (put_user_u32(len, optlen)) {
2620                return -TARGET_EFAULT;
2621            }
2622            break;
2623        }
2624        case TARGET_SO_SNDTIMEO:
2625            optname = SO_SNDTIMEO;
2626            goto get_timeout;
2627        case TARGET_SO_PEERCRED: {
2628            struct ucred cr;
2629            socklen_t crlen;
2630            struct target_ucred *tcr;
2631
2632            if (get_user_u32(len, optlen)) {
2633                return -TARGET_EFAULT;
2634            }
2635            if (len < 0) {
2636                return -TARGET_EINVAL;
2637            }
2638
2639            crlen = sizeof(cr);
2640            ret = get_errno(getsockopt(sockfd, level, SO_PEERCRED,
2641                                       &cr, &crlen));
2642            if (ret < 0) {
2643                return ret;
2644            }
2645            if (len > crlen) {
2646                len = crlen;
2647            }
2648            if (!lock_user_struct(VERIFY_WRITE, tcr, optval_addr, 0)) {
2649                return -TARGET_EFAULT;
2650            }
2651            __put_user(cr.pid, &tcr->pid);
2652            __put_user(cr.uid, &tcr->uid);
2653            __put_user(cr.gid, &tcr->gid);
2654            unlock_user_struct(tcr, optval_addr, 1);
2655            if (put_user_u32(len, optlen)) {
2656                return -TARGET_EFAULT;
2657            }
2658            break;
2659        }
2660        case TARGET_SO_PEERSEC: {
2661            char *name;
2662
2663            if (get_user_u32(len, optlen)) {
2664                return -TARGET_EFAULT;
2665            }
2666            if (len < 0) {
2667                return -TARGET_EINVAL;
2668            }
2669            name = lock_user(VERIFY_WRITE, optval_addr, len, 0);
2670            if (!name) {
2671                return -TARGET_EFAULT;
2672            }
2673            lv = len;
2674            ret = get_errno(getsockopt(sockfd, level, SO_PEERSEC,
2675                                       name, &lv));
2676            if (put_user_u32(lv, optlen)) {
2677                ret = -TARGET_EFAULT;
2678            }
2679            unlock_user(name, optval_addr, lv);
2680            break;
2681        }
2682        case TARGET_SO_LINGER:
2683        {
2684            struct linger lg;
2685            socklen_t lglen;
2686            struct target_linger *tlg;
2687
2688            if (get_user_u32(len, optlen)) {
2689                return -TARGET_EFAULT;
2690            }
2691            if (len < 0) {
2692                return -TARGET_EINVAL;
2693            }
2694
2695            lglen = sizeof(lg);
2696            ret = get_errno(getsockopt(sockfd, level, SO_LINGER,
2697                                       &lg, &lglen));
2698            if (ret < 0) {
2699                return ret;
2700            }
2701            if (len > lglen) {
2702                len = lglen;
2703            }
2704            if (!lock_user_struct(VERIFY_WRITE, tlg, optval_addr, 0)) {
2705                return -TARGET_EFAULT;
2706            }
2707            __put_user(lg.l_onoff, &tlg->l_onoff);
2708            __put_user(lg.l_linger, &tlg->l_linger);
2709            unlock_user_struct(tlg, optval_addr, 1);
2710            if (put_user_u32(len, optlen)) {
2711                return -TARGET_EFAULT;
2712            }
2713            break;
2714        }
2715        /* Options with 'int' argument.  */
2716        case TARGET_SO_DEBUG:
2717            optname = SO_DEBUG;
2718            goto int_case;
2719        case TARGET_SO_REUSEADDR:
2720            optname = SO_REUSEADDR;
2721            goto int_case;
2722#ifdef SO_REUSEPORT
2723        case TARGET_SO_REUSEPORT:
2724            optname = SO_REUSEPORT;
2725            goto int_case;
2726#endif
2727        case TARGET_SO_TYPE:
2728            optname = SO_TYPE;
2729            goto int_case;
2730        case TARGET_SO_ERROR:
2731            optname = SO_ERROR;
2732            goto int_case;
2733        case TARGET_SO_DONTROUTE:
2734            optname = SO_DONTROUTE;
2735            goto int_case;
2736        case TARGET_SO_BROADCAST:
2737            optname = SO_BROADCAST;
2738            goto int_case;
2739        case TARGET_SO_SNDBUF:
2740            optname = SO_SNDBUF;
2741            goto int_case;
2742        case TARGET_SO_RCVBUF:
2743            optname = SO_RCVBUF;
2744            goto int_case;
2745        case TARGET_SO_KEEPALIVE:
2746            optname = SO_KEEPALIVE;
2747            goto int_case;
2748        case TARGET_SO_OOBINLINE:
2749            optname = SO_OOBINLINE;
2750            goto int_case;
2751        case TARGET_SO_NO_CHECK:
2752            optname = SO_NO_CHECK;
2753            goto int_case;
2754        case TARGET_SO_PRIORITY:
2755            optname = SO_PRIORITY;
2756            goto int_case;
2757#ifdef SO_BSDCOMPAT
2758        case TARGET_SO_BSDCOMPAT:
2759            optname = SO_BSDCOMPAT;
2760            goto int_case;
2761#endif
2762        case TARGET_SO_PASSCRED:
2763            optname = SO_PASSCRED;
2764            goto int_case;
2765        case TARGET_SO_TIMESTAMP:
2766            optname = SO_TIMESTAMP;
2767            goto int_case;
2768        case TARGET_SO_RCVLOWAT:
2769            optname = SO_RCVLOWAT;
2770            goto int_case;
2771        case TARGET_SO_ACCEPTCONN:
2772            optname = SO_ACCEPTCONN;
2773            goto int_case;
2774        case TARGET_SO_PROTOCOL:
2775            optname = SO_PROTOCOL;
2776            goto int_case;
2777        case TARGET_SO_DOMAIN:
2778            optname = SO_DOMAIN;
2779            goto int_case;
2780        default:
2781            goto int_case;
2782        }
2783        break;
2784    case SOL_TCP:
2785    case SOL_UDP:
2786        /* TCP and UDP options all take an 'int' value.  */
2787    int_case:
2788        if (get_user_u32(len, optlen))
2789            return -TARGET_EFAULT;
2790        if (len < 0)
2791            return -TARGET_EINVAL;
2792        lv = sizeof(lv);
2793        ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
2794        if (ret < 0)
2795            return ret;
2796        switch (optname) {
2797        case SO_TYPE:
2798            val = host_to_target_sock_type(val);
2799            break;
2800        case SO_ERROR:
2801            val = host_to_target_errno(val);
2802            break;
2803        }
2804        if (len > lv)
2805            len = lv;
2806        if (len == 4) {
2807            if (put_user_u32(val, optval_addr))
2808                return -TARGET_EFAULT;
2809        } else {
2810            if (put_user_u8(val, optval_addr))
2811                return -TARGET_EFAULT;
2812        }
2813        if (put_user_u32(len, optlen))
2814            return -TARGET_EFAULT;
2815        break;
2816    case SOL_IP:
2817        switch(optname) {
2818        case IP_TOS:
2819        case IP_TTL:
2820        case IP_HDRINCL:
2821        case IP_ROUTER_ALERT:
2822        case IP_RECVOPTS:
2823        case IP_RETOPTS:
2824        case IP_PKTINFO:
2825        case IP_MTU_DISCOVER:
2826        case IP_RECVERR:
2827        case IP_RECVTOS:
2828#ifdef IP_FREEBIND
2829        case IP_FREEBIND:
2830#endif
2831        case IP_MULTICAST_TTL:
2832        case IP_MULTICAST_LOOP:
2833            if (get_user_u32(len, optlen))
2834                return -TARGET_EFAULT;
2835            if (len < 0)
2836                return -TARGET_EINVAL;
2837            lv = sizeof(lv);
2838            ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
2839            if (ret < 0)
2840                return ret;
2841            if (len < sizeof(int) && len > 0 && val >= 0 && val < 255) {
2842                len = 1;
2843                if (put_user_u32(len, optlen)
2844                    || put_user_u8(val, optval_addr))
2845                    return -TARGET_EFAULT;
2846            } else {
2847                if (len > sizeof(int))
2848                    len = sizeof(int);
2849                if (put_user_u32(len, optlen)
2850                    || put_user_u32(val, optval_addr))
2851                    return -TARGET_EFAULT;
2852            }
2853            break;
2854        default:
2855            ret = -TARGET_ENOPROTOOPT;
2856            break;
2857        }
2858        break;
2859    case SOL_IPV6:
2860        switch (optname) {
2861        case IPV6_MTU_DISCOVER:
2862        case IPV6_MTU:
2863        case IPV6_V6ONLY:
2864        case IPV6_RECVPKTINFO:
2865        case IPV6_UNICAST_HOPS:
2866        case IPV6_MULTICAST_HOPS:
2867        case IPV6_MULTICAST_LOOP:
2868        case IPV6_RECVERR:
2869        case IPV6_RECVHOPLIMIT:
2870        case IPV6_2292HOPLIMIT:
2871        case IPV6_CHECKSUM:
2872        case IPV6_ADDRFORM:
2873        case IPV6_2292PKTINFO:
2874        case IPV6_RECVTCLASS:
2875        case IPV6_RECVRTHDR:
2876        case IPV6_2292RTHDR:
2877        case IPV6_RECVHOPOPTS:
2878        case IPV6_2292HOPOPTS:
2879        case IPV6_RECVDSTOPTS:
2880        case IPV6_2292DSTOPTS:
2881        case IPV6_TCLASS:
2882        case IPV6_ADDR_PREFERENCES:
2883#ifdef IPV6_RECVPATHMTU
2884        case IPV6_RECVPATHMTU:
2885#endif
2886#ifdef IPV6_TRANSPARENT
2887        case IPV6_TRANSPARENT:
2888#endif
2889#ifdef IPV6_FREEBIND
2890        case IPV6_FREEBIND:
2891#endif
2892#ifdef IPV6_RECVORIGDSTADDR
2893        case IPV6_RECVORIGDSTADDR:
2894#endif
2895            if (get_user_u32(len, optlen))
2896                return -TARGET_EFAULT;
2897            if (len < 0)
2898                return -TARGET_EINVAL;
2899            lv = sizeof(lv);
2900            ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
2901            if (ret < 0)
2902                return ret;
2903            if (len < sizeof(int) && len > 0 && val >= 0 && val < 255) {
2904                len = 1;
2905                if (put_user_u32(len, optlen)
2906                    || put_user_u8(val, optval_addr))
2907                    return -TARGET_EFAULT;
2908            } else {
2909                if (len > sizeof(int))
2910                    len = sizeof(int);
2911                if (put_user_u32(len, optlen)
2912                    || put_user_u32(val, optval_addr))
2913                    return -TARGET_EFAULT;
2914            }
2915            break;
2916        default:
2917            ret = -TARGET_ENOPROTOOPT;
2918            break;
2919        }
2920        break;
2921#ifdef SOL_NETLINK
2922    case SOL_NETLINK:
2923        switch (optname) {
2924        case NETLINK_PKTINFO:
2925        case NETLINK_BROADCAST_ERROR:
2926        case NETLINK_NO_ENOBUFS:
2927#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
2928        case NETLINK_LISTEN_ALL_NSID:
2929        case NETLINK_CAP_ACK:
2930#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
2931#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
2932        case NETLINK_EXT_ACK:
2933#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
2934#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
2935        case NETLINK_GET_STRICT_CHK:
2936#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
2937            if (get_user_u32(len, optlen)) {
2938                return -TARGET_EFAULT;
2939            }
2940            if (len != sizeof(val)) {
2941                return -TARGET_EINVAL;
2942            }
2943            lv = len;
2944            ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
2945            if (ret < 0) {
2946                return ret;
2947            }
2948            if (put_user_u32(lv, optlen)
2949                || put_user_u32(val, optval_addr)) {
2950                return -TARGET_EFAULT;
2951            }
2952            break;
2953#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
2954        case NETLINK_LIST_MEMBERSHIPS:
2955        {
2956            uint32_t *results;
2957            int i;
2958            if (get_user_u32(len, optlen)) {
2959                return -TARGET_EFAULT;
2960            }
2961            if (len < 0) {
2962                return -TARGET_EINVAL;
2963            }
2964            results = lock_user(VERIFY_WRITE, optval_addr, len, 1);
2965            if (!results && len > 0) {
2966                return -TARGET_EFAULT;
2967            }
2968            lv = len;
2969            ret = get_errno(getsockopt(sockfd, level, optname, results, &lv));
2970            if (ret < 0) {
2971                unlock_user(results, optval_addr, 0);
2972                return ret;
2973            }
2974            /* swap host endianness to target endianness. */
2975            for (i = 0; i < (len / sizeof(uint32_t)); i++) {
2976                results[i] = tswap32(results[i]);
2977            }
2978            if (put_user_u32(lv, optlen)) {
2979                return -TARGET_EFAULT;
2980            }
2981            unlock_user(results, optval_addr, 0);
2982            break;
2983        }
2984#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
2985        default:
2986            goto unimplemented;
2987        }
2988        break;
2989#endif /* SOL_NETLINK */
2990    default:
2991    unimplemented:
2992        qemu_log_mask(LOG_UNIMP,
2993                      "getsockopt level=%d optname=%d not yet supported\n",
2994                      level, optname);
2995        ret = -TARGET_EOPNOTSUPP;
2996        break;
2997    }
2998    return ret;
2999}
3000
3001/* Convert target low/high pair representing file offset into the host
3002 * low/high pair. This function doesn't handle offsets bigger than 64 bits
3003 * as the kernel doesn't handle them either.
3004 */
3005static void target_to_host_low_high(abi_ulong tlow,
3006                                    abi_ulong thigh,
3007                                    unsigned long *hlow,
3008                                    unsigned long *hhigh)
3009{
3010    uint64_t off = tlow |
3011        ((unsigned long long)thigh << TARGET_LONG_BITS / 2) <<
3012        TARGET_LONG_BITS / 2;
3013
3014    *hlow = off;
3015    *hhigh = (off >> HOST_LONG_BITS / 2) >> HOST_LONG_BITS / 2;
3016}
3017
3018static struct iovec *lock_iovec(int type, abi_ulong target_addr,
3019                                abi_ulong count, int copy)
3020{
3021    struct target_iovec *target_vec;
3022    struct iovec *vec;
3023    abi_ulong total_len, max_len;
3024    int i;
3025    int err = 0;
3026    bool bad_address = false;
3027
3028    if (count == 0) {
3029        errno = 0;
3030        return NULL;
3031    }
3032    if (count > IOV_MAX) {
3033        errno = EINVAL;
3034        return NULL;
3035    }
3036
3037    vec = g_try_new0(struct iovec, count);
3038    if (vec == NULL) {
3039        errno = ENOMEM;
3040        return NULL;
3041    }
3042
3043    target_vec = lock_user(VERIFY_READ, target_addr,
3044                           count * sizeof(struct target_iovec), 1);
3045    if (target_vec == NULL) {
3046        err = EFAULT;
3047        goto fail2;
3048    }
3049
3050    /* ??? If host page size > target page size, this will result in a
3051       value larger than what we can actually support.  */
3052    max_len = 0x7fffffff & TARGET_PAGE_MASK;
3053    total_len = 0;
3054
3055    for (i = 0; i < count; i++) {
3056        abi_ulong base = tswapal(target_vec[i].iov_base);
3057        abi_long len = tswapal(target_vec[i].iov_len);
3058
3059        if (len < 0) {
3060            err = EINVAL;
3061            goto fail;
3062        } else if (len == 0) {
3063            /* Zero length pointer is ignored.  */
3064            vec[i].iov_base = 0;
3065        } else {
3066            vec[i].iov_base = lock_user(type, base, len, copy);
3067            /* If the first buffer pointer is bad, this is a fault.  But
3068             * subsequent bad buffers will result in a partial write; this
3069             * is realized by filling the vector with null pointers and
3070             * zero lengths. */
3071            if (!vec[i].iov_base) {
3072                if (i == 0) {
3073                    err = EFAULT;
3074                    goto fail;
3075                } else {
3076                    bad_address = true;
3077                }
3078            }
3079            if (bad_address) {
3080                len = 0;
3081            }
3082            if (len > max_len - total_len) {
3083                len = max_len - total_len;
3084            }
3085        }
3086        vec[i].iov_len = len;
3087        total_len += len;
3088    }
3089
3090    unlock_user(target_vec, target_addr, 0);
3091    return vec;
3092
3093 fail:
3094    while (--i >= 0) {
3095        if (tswapal(target_vec[i].iov_len) > 0) {
3096            unlock_user(vec[i].iov_base, tswapal(target_vec[i].iov_base), 0);
3097        }
3098    }
3099    unlock_user(target_vec, target_addr, 0);
3100 fail2:
3101    g_free(vec);
3102    errno = err;
3103    return NULL;
3104}
3105
3106static void unlock_iovec(struct iovec *vec, abi_ulong target_addr,
3107                         abi_ulong count, int copy)
3108{
3109    struct target_iovec *target_vec;
3110    int i;
3111
3112    target_vec = lock_user(VERIFY_READ, target_addr,
3113                           count * sizeof(struct target_iovec), 1);
3114    if (target_vec) {
3115        for (i = 0; i < count; i++) {
3116            abi_ulong base = tswapal(target_vec[i].iov_base);
3117            abi_long len = tswapal(target_vec[i].iov_len);
3118            if (len < 0) {
3119                break;
3120            }
3121            unlock_user(vec[i].iov_base, base, copy ? vec[i].iov_len : 0);
3122        }
3123        unlock_user(target_vec, target_addr, 0);
3124    }
3125
3126    g_free(vec);
3127}
3128
3129static inline int target_to_host_sock_type(int *type)
3130{
3131    int host_type = 0;
3132    int target_type = *type;
3133
3134    switch (target_type & TARGET_SOCK_TYPE_MASK) {
3135    case TARGET_SOCK_DGRAM:
3136        host_type = SOCK_DGRAM;
3137        break;
3138    case TARGET_SOCK_STREAM:
3139        host_type = SOCK_STREAM;
3140        break;
3141    default:
3142        host_type = target_type & TARGET_SOCK_TYPE_MASK;
3143        break;
3144    }
3145    if (target_type & TARGET_SOCK_CLOEXEC) {
3146#if defined(SOCK_CLOEXEC)
3147        host_type |= SOCK_CLOEXEC;
3148#else
3149        return -TARGET_EINVAL;
3150#endif
3151    }
3152    if (target_type & TARGET_SOCK_NONBLOCK) {
3153#if defined(SOCK_NONBLOCK)
3154        host_type |= SOCK_NONBLOCK;
3155#elif !defined(O_NONBLOCK)
3156        return -TARGET_EINVAL;
3157#endif
3158    }
3159    *type = host_type;
3160    return 0;
3161}
3162
3163/* Try to emulate socket type flags after socket creation.  */
3164static int sock_flags_fixup(int fd, int target_type)
3165{
3166#if !defined(SOCK_NONBLOCK) && defined(O_NONBLOCK)
3167    if (target_type & TARGET_SOCK_NONBLOCK) {
3168        int flags = fcntl(fd, F_GETFL);
3169        if (fcntl(fd, F_SETFL, O_NONBLOCK | flags) == -1) {
3170            close(fd);
3171            return -TARGET_EINVAL;
3172        }
3173    }
3174#endif
3175    return fd;
3176}
3177
3178/* do_socket() Must return target values and target errnos. */
3179static abi_long do_socket(int domain, int type, int protocol)
3180{
3181    int target_type = type;
3182    int ret;
3183
3184    ret = target_to_host_sock_type(&type);
3185    if (ret) {
3186        return ret;
3187    }
3188
3189    if (domain == PF_NETLINK && !(
3190#ifdef CONFIG_RTNETLINK
3191         protocol == NETLINK_ROUTE ||
3192#endif
3193         protocol == NETLINK_KOBJECT_UEVENT ||
3194         protocol == NETLINK_AUDIT)) {
3195        return -TARGET_EPROTONOSUPPORT;
3196    }
3197
3198    if (domain == AF_PACKET ||
3199        (domain == AF_INET && type == SOCK_PACKET)) {
3200        protocol = tswap16(protocol);
3201    }
3202
3203    ret = get_errno(socket(domain, type, protocol));
3204    if (ret >= 0) {
3205        ret = sock_flags_fixup(ret, target_type);
3206        if (type == SOCK_PACKET) {
3207            /* Manage an obsolete case :
3208             * if socket type is SOCK_PACKET, bind by name
3209             */
3210            fd_trans_register(ret, &target_packet_trans);
3211        } else if (domain == PF_NETLINK) {
3212            switch (protocol) {
3213#ifdef CONFIG_RTNETLINK
3214            case NETLINK_ROUTE:
3215                fd_trans_register(ret, &target_netlink_route_trans);
3216                break;
3217#endif
3218            case NETLINK_KOBJECT_UEVENT:
3219                /* nothing to do: messages are strings */
3220                break;
3221            case NETLINK_AUDIT:
3222                fd_trans_register(ret, &target_netlink_audit_trans);
3223                break;
3224            default:
3225                g_assert_not_reached();
3226            }
3227        }
3228    }
3229    return ret;
3230}
3231
3232/* do_bind() Must return target values and target errnos. */
3233static abi_long do_bind(int sockfd, abi_ulong target_addr,
3234                        socklen_t addrlen)
3235{
3236    void *addr;
3237    abi_long ret;
3238
3239    if ((int)addrlen < 0) {
3240        return -TARGET_EINVAL;
3241    }
3242
3243    addr = alloca(addrlen+1);
3244
3245    ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen);
3246    if (ret)
3247        return ret;
3248
3249    return get_errno(bind(sockfd, addr, addrlen));
3250}
3251
3252/* do_connect() Must return target values and target errnos. */
3253static abi_long do_connect(int sockfd, abi_ulong target_addr,
3254                           socklen_t addrlen)
3255{
3256    void *addr;
3257    abi_long ret;
3258
3259    if ((int)addrlen < 0) {
3260        return -TARGET_EINVAL;
3261    }
3262
3263    addr = alloca(addrlen+1);
3264
3265    ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen);
3266    if (ret)
3267        return ret;
3268
3269    return get_errno(safe_connect(sockfd, addr, addrlen));
3270}
3271
3272/* do_sendrecvmsg_locked() Must return target values and target errnos. */
3273static abi_long do_sendrecvmsg_locked(int fd, struct target_msghdr *msgp,
3274                                      int flags, int send)
3275{
3276    abi_long ret, len;
3277    struct msghdr msg;
3278    abi_ulong count;
3279    struct iovec *vec;
3280    abi_ulong target_vec;
3281
3282    if (msgp->msg_name) {
3283        msg.msg_namelen = tswap32(msgp->msg_namelen);
3284        msg.msg_name = alloca(msg.msg_namelen+1);
3285        ret = target_to_host_sockaddr(fd, msg.msg_name,
3286                                      tswapal(msgp->msg_name),
3287                                      msg.msg_namelen);
3288        if (ret == -TARGET_EFAULT) {
3289            /* For connected sockets msg_name and msg_namelen must
3290             * be ignored, so returning EFAULT immediately is wrong.
3291             * Instead, pass a bad msg_name to the host kernel, and
3292             * let it decide whether to return EFAULT or not.
3293             */
3294            msg.msg_name = (void *)-1;
3295        } else if (ret) {
3296            goto out2;
3297        }
3298    } else {
3299        msg.msg_name = NULL;
3300        msg.msg_namelen = 0;
3301    }
3302    msg.msg_controllen = 2 * tswapal(msgp->msg_controllen);
3303    msg.msg_control = alloca(msg.msg_controllen);
3304    memset(msg.msg_control, 0, msg.msg_controllen);
3305
3306    msg.msg_flags = tswap32(msgp->msg_flags);
3307
3308    count = tswapal(msgp->msg_iovlen);
3309    target_vec = tswapal(msgp->msg_iov);
3310
3311    if (count > IOV_MAX) {
3312        /* sendrcvmsg returns a different errno for this condition than
3313         * readv/writev, so we must catch it here before lock_iovec() does.
3314         */
3315        ret = -TARGET_EMSGSIZE;
3316        goto out2;
3317    }
3318
3319    vec = lock_iovec(send ? VERIFY_READ : VERIFY_WRITE,
3320                     target_vec, count, send);
3321    if (vec == NULL) {
3322        ret = -host_to_target_errno(errno);
3323        /* allow sending packet without any iov, e.g. with MSG_MORE flag */
3324        if (!send || ret) {
3325            goto out2;
3326        }
3327    }
3328    msg.msg_iovlen = count;
3329    msg.msg_iov = vec;
3330
3331    if (send) {
3332        if (fd_trans_target_to_host_data(fd)) {
3333            void *host_msg;
3334
3335            host_msg = g_malloc(msg.msg_iov->iov_len);
3336            memcpy(host_msg, msg.msg_iov->iov_base, msg.msg_iov->iov_len);
3337            ret = fd_trans_target_to_host_data(fd)(host_msg,
3338                                                   msg.msg_iov->iov_len);
3339            if (ret >= 0) {
3340                msg.msg_iov->iov_base = host_msg;
3341                ret = get_errno(safe_sendmsg(fd, &msg, flags));
3342            }
3343            g_free(host_msg);
3344        } else {
3345            ret = target_to_host_cmsg(&msg, msgp);
3346            if (ret == 0) {
3347                ret = get_errno(safe_sendmsg(fd, &msg, flags));
3348            }
3349        }
3350    } else {
3351        ret = get_errno(safe_recvmsg(fd, &msg, flags));
3352        if (!is_error(ret)) {
3353            len = ret;
3354            if (fd_trans_host_to_target_data(fd)) {
3355                ret = fd_trans_host_to_target_data(fd)(msg.msg_iov->iov_base,
3356                                               MIN(msg.msg_iov->iov_len, len));
3357            }
3358            if (!is_error(ret)) {
3359                ret = host_to_target_cmsg(msgp, &msg);
3360            }
3361            if (!is_error(ret)) {
3362                msgp->msg_namelen = tswap32(msg.msg_namelen);
3363                msgp->msg_flags = tswap32(msg.msg_flags);
3364                if (msg.msg_name != NULL && msg.msg_name != (void *)-1) {
3365                    ret = host_to_target_sockaddr(tswapal(msgp->msg_name),
3366                                    msg.msg_name, msg.msg_namelen);
3367                    if (ret) {
3368                        goto out;
3369                    }
3370                }
3371
3372                ret = len;
3373            }
3374        }
3375    }
3376
3377out:
3378    if (vec) {
3379        unlock_iovec(vec, target_vec, count, !send);
3380    }
3381out2:
3382    return ret;
3383}
3384
3385static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg,
3386                               int flags, int send)
3387{
3388    abi_long ret;
3389    struct target_msghdr *msgp;
3390
3391    if (!lock_user_struct(send ? VERIFY_READ : VERIFY_WRITE,
3392                          msgp,
3393                          target_msg,
3394                          send ? 1 : 0)) {
3395        return -TARGET_EFAULT;
3396    }
3397    ret = do_sendrecvmsg_locked(fd, msgp, flags, send);
3398    unlock_user_struct(msgp, target_msg, send ? 0 : 1);
3399    return ret;
3400}
3401
3402/* We don't rely on the C library to have sendmmsg/recvmmsg support,
3403 * so it might not have this *mmsg-specific flag either.
3404 */
3405#ifndef MSG_WAITFORONE
3406#define MSG_WAITFORONE 0x10000
3407#endif
3408
3409static abi_long do_sendrecvmmsg(int fd, abi_ulong target_msgvec,
3410                                unsigned int vlen, unsigned int flags,
3411                                int send)
3412{
3413    struct target_mmsghdr *mmsgp;
3414    abi_long ret = 0;
3415    int i;
3416
3417    if (vlen > UIO_MAXIOV) {
3418        vlen = UIO_MAXIOV;
3419    }
3420
3421    mmsgp = lock_user(VERIFY_WRITE, target_msgvec, sizeof(*mmsgp) * vlen, 1);
3422    if (!mmsgp) {
3423        return -TARGET_EFAULT;
3424    }
3425
3426    for (i = 0; i < vlen; i++) {
3427        ret = do_sendrecvmsg_locked(fd, &mmsgp[i].msg_hdr, flags, send);
3428        if (is_error(ret)) {
3429            break;
3430        }
3431        mmsgp[i].msg_len = tswap32(ret);
3432        /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */
3433        if (flags & MSG_WAITFORONE) {
3434            flags |= MSG_DONTWAIT;
3435        }
3436    }
3437
3438    unlock_user(mmsgp, target_msgvec, sizeof(*mmsgp) * i);
3439
3440    /* Return number of datagrams sent if we sent any at all;
3441     * otherwise return the error.
3442     */
3443    if (i) {
3444        return i;
3445    }
3446    return ret;
3447}
3448
3449/* do_accept4() Must return target values and target errnos. */
3450static abi_long do_accept4(int fd, abi_ulong target_addr,
3451                           abi_ulong target_addrlen_addr, int flags)
3452{
3453    socklen_t addrlen, ret_addrlen;
3454    void *addr;
3455    abi_long ret;
3456    int host_flags;
3457
3458    if (flags & ~(TARGET_SOCK_CLOEXEC | TARGET_SOCK_NONBLOCK)) {
3459        return -TARGET_EINVAL;
3460    }
3461
3462    host_flags = 0;
3463    if (flags & TARGET_SOCK_NONBLOCK) {
3464        host_flags |= SOCK_NONBLOCK;
3465    }
3466    if (flags & TARGET_SOCK_CLOEXEC) {
3467        host_flags |= SOCK_CLOEXEC;
3468    }
3469
3470    if (target_addr == 0) {
3471        return get_errno(safe_accept4(fd, NULL, NULL, host_flags));
3472    }
3473
3474    /* linux returns EFAULT if addrlen pointer is invalid */
3475    if (get_user_u32(addrlen, target_addrlen_addr))
3476        return -TARGET_EFAULT;
3477
3478    if ((int)addrlen < 0) {
3479        return -TARGET_EINVAL;
3480    }
3481
3482    if (!access_ok(thread_cpu, VERIFY_WRITE, target_addr, addrlen)) {
3483        return -TARGET_EFAULT;
3484    }
3485
3486    addr = alloca(addrlen);
3487
3488    ret_addrlen = addrlen;
3489    ret = get_errno(safe_accept4(fd, addr, &ret_addrlen, host_flags));
3490    if (!is_error(ret)) {
3491        host_to_target_sockaddr(target_addr, addr, MIN(addrlen, ret_addrlen));
3492        if (put_user_u32(ret_addrlen, target_addrlen_addr)) {
3493            ret = -TARGET_EFAULT;
3494        }
3495    }
3496    return ret;
3497}
3498
3499/* do_getpeername() Must return target values and target errnos. */
3500static abi_long do_getpeername(int fd, abi_ulong target_addr,
3501                               abi_ulong target_addrlen_addr)
3502{
3503    socklen_t addrlen, ret_addrlen;
3504    void *addr;
3505    abi_long ret;
3506
3507    if (get_user_u32(addrlen, target_addrlen_addr))
3508        return -TARGET_EFAULT;
3509
3510    if ((int)addrlen < 0) {
3511        return -TARGET_EINVAL;
3512    }
3513
3514    if (!access_ok(thread_cpu, VERIFY_WRITE, target_addr, addrlen)) {
3515        return -TARGET_EFAULT;
3516    }
3517
3518    addr = alloca(addrlen);
3519
3520    ret_addrlen = addrlen;
3521    ret = get_errno(getpeername(fd, addr, &ret_addrlen));
3522    if (!is_error(ret)) {
3523        host_to_target_sockaddr(target_addr, addr, MIN(addrlen, ret_addrlen));
3524        if (put_user_u32(ret_addrlen, target_addrlen_addr)) {
3525            ret = -TARGET_EFAULT;
3526        }
3527    }
3528    return ret;
3529}
3530
3531/* do_getsockname() Must return target values and target errnos. */
3532static abi_long do_getsockname(int fd, abi_ulong target_addr,
3533                               abi_ulong target_addrlen_addr)
3534{
3535    socklen_t addrlen, ret_addrlen;
3536    void *addr;
3537    abi_long ret;
3538
3539    if (get_user_u32(addrlen, target_addrlen_addr))
3540        return -TARGET_EFAULT;
3541
3542    if ((int)addrlen < 0) {
3543        return -TARGET_EINVAL;
3544    }
3545
3546    if (!access_ok(thread_cpu, VERIFY_WRITE, target_addr, addrlen)) {
3547        return -TARGET_EFAULT;
3548    }
3549
3550    addr = alloca(addrlen);
3551
3552    ret_addrlen = addrlen;
3553    ret = get_errno(getsockname(fd, addr, &ret_addrlen));
3554    if (!is_error(ret)) {
3555        host_to_target_sockaddr(target_addr, addr, MIN(addrlen, ret_addrlen));
3556        if (put_user_u32(ret_addrlen, target_addrlen_addr)) {
3557            ret = -TARGET_EFAULT;
3558        }
3559    }
3560    return ret;
3561}
3562
3563/* do_socketpair() Must return target values and target errnos. */
3564static abi_long do_socketpair(int domain, int type, int protocol,
3565                              abi_ulong target_tab_addr)
3566{
3567    int tab[2];
3568    abi_long ret;
3569
3570    target_to_host_sock_type(&type);
3571
3572    ret = get_errno(socketpair(domain, type, protocol, tab));
3573    if (!is_error(ret)) {
3574        if (put_user_s32(tab[0], target_tab_addr)
3575            || put_user_s32(tab[1], target_tab_addr + sizeof(tab[0])))
3576            ret = -TARGET_EFAULT;
3577    }
3578    return ret;
3579}
3580
3581/* do_sendto() Must return target values and target errnos. */
3582static abi_long do_sendto(int fd, abi_ulong msg, size_t len, int flags,
3583                          abi_ulong target_addr, socklen_t addrlen)
3584{
3585    void *addr;
3586    void *host_msg;
3587    void *copy_msg = NULL;
3588    abi_long ret;
3589
3590    if ((int)addrlen < 0) {
3591        return -TARGET_EINVAL;
3592    }
3593
3594    host_msg = lock_user(VERIFY_READ, msg, len, 1);
3595    if (!host_msg)
3596        return -TARGET_EFAULT;
3597    if (fd_trans_target_to_host_data(fd)) {
3598        copy_msg = host_msg;
3599        host_msg = g_malloc(len);
3600        memcpy(host_msg, copy_msg, len);
3601        ret = fd_trans_target_to_host_data(fd)(host_msg, len);
3602        if (ret < 0) {
3603            goto fail;
3604        }
3605    }
3606    if (target_addr) {
3607        addr = alloca(addrlen+1);
3608        ret = target_to_host_sockaddr(fd, addr, target_addr, addrlen);
3609        if (ret) {
3610            goto fail;
3611        }
3612        ret = get_errno(safe_sendto(fd, host_msg, len, flags, addr, addrlen));
3613    } else {
3614        ret = get_errno(safe_sendto(fd, host_msg, len, flags, NULL, 0));
3615    }
3616fail:
3617    if (copy_msg) {
3618        g_free(host_msg);
3619        host_msg = copy_msg;
3620    }
3621    unlock_user(host_msg, msg, 0);
3622    return ret;
3623}
3624
3625/* do_recvfrom() Must return target values and target errnos. */
3626static abi_long do_recvfrom(int fd, abi_ulong msg, size_t len, int flags,
3627                            abi_ulong target_addr,
3628                            abi_ulong target_addrlen)
3629{
3630    socklen_t addrlen, ret_addrlen;
3631    void *addr;
3632    void *host_msg;
3633    abi_long ret;
3634
3635    if (!msg) {
3636        host_msg = NULL;
3637    } else {
3638        host_msg = lock_user(VERIFY_WRITE, msg, len, 0);
3639        if (!host_msg) {
3640            return -TARGET_EFAULT;
3641        }
3642    }
3643    if (target_addr) {
3644        if (get_user_u32(addrlen, target_addrlen)) {
3645            ret = -TARGET_EFAULT;
3646            goto fail;
3647        }
3648        if ((int)addrlen < 0) {
3649            ret = -TARGET_EINVAL;
3650            goto fail;
3651        }
3652        addr = alloca(addrlen);
3653        ret_addrlen = addrlen;
3654        ret = get_errno(safe_recvfrom(fd, host_msg, len, flags,
3655                                      addr, &ret_addrlen));
3656    } else {
3657        addr = NULL; /* To keep compiler quiet.  */
3658        addrlen = 0; /* To keep compiler quiet.  */
3659        ret = get_errno(safe_recvfrom(fd, host_msg, len, flags, NULL, 0));
3660    }
3661    if (!is_error(ret)) {
3662        if (fd_trans_host_to_target_data(fd)) {
3663            abi_long trans;
3664            trans = fd_trans_host_to_target_data(fd)(host_msg, MIN(ret, len));
3665            if (is_error(trans)) {
3666                ret = trans;
3667                goto fail;
3668            }
3669        }
3670        if (target_addr) {
3671            host_to_target_sockaddr(target_addr, addr,
3672                                    MIN(addrlen, ret_addrlen));
3673            if (put_user_u32(ret_addrlen, target_addrlen)) {
3674                ret = -TARGET_EFAULT;
3675                goto fail;
3676            }
3677        }
3678        unlock_user(host_msg, msg, len);
3679    } else {
3680fail:
3681        unlock_user(host_msg, msg, 0);
3682    }
3683    return ret;
3684}
3685
3686#ifdef TARGET_NR_socketcall
3687/* do_socketcall() must return target values and target errnos. */
3688static abi_long do_socketcall(int num, abi_ulong vptr)
3689{
3690    static const unsigned nargs[] = { /* number of arguments per operation */
3691        [TARGET_SYS_SOCKET] = 3,      /* domain, type, protocol */
3692        [TARGET_SYS_BIND] = 3,        /* fd, addr, addrlen */
3693        [TARGET_SYS_CONNECT] = 3,     /* fd, addr, addrlen */
3694        [TARGET_SYS_LISTEN] = 2,      /* fd, backlog */
3695        [TARGET_SYS_ACCEPT] = 3,      /* fd, addr, addrlen */
3696        [TARGET_SYS_GETSOCKNAME] = 3, /* fd, addr, addrlen */
3697        [TARGET_SYS_GETPEERNAME] = 3, /* fd, addr, addrlen */
3698        [TARGET_SYS_SOCKETPAIR] = 4,  /* domain, type, protocol, tab */
3699        [TARGET_SYS_SEND] = 4,        /* fd, msg, len, flags */
3700        [TARGET_SYS_RECV] = 4,        /* fd, msg, len, flags */
3701        [TARGET_SYS_SENDTO] = 6,      /* fd, msg, len, flags, addr, addrlen */
3702        [TARGET_SYS_RECVFROM] = 6,    /* fd, msg, len, flags, addr, addrlen */
3703        [TARGET_SYS_SHUTDOWN] = 2,    /* fd, how */
3704        [TARGET_SYS_SETSOCKOPT] = 5,  /* fd, level, optname, optval, optlen */
3705        [TARGET_SYS_GETSOCKOPT] = 5,  /* fd, level, optname, optval, optlen */
3706        [TARGET_SYS_SENDMSG] = 3,     /* fd, msg, flags */
3707        [TARGET_SYS_RECVMSG] = 3,     /* fd, msg, flags */
3708        [TARGET_SYS_ACCEPT4] = 4,     /* fd, addr, addrlen, flags */
3709        [TARGET_SYS_RECVMMSG] = 4,    /* fd, msgvec, vlen, flags */
3710        [TARGET_SYS_SENDMMSG] = 4,    /* fd, msgvec, vlen, flags */
3711    };
3712    abi_long a[6]; /* max 6 args */
3713    unsigned i;
3714
3715    /* check the range of the first argument num */
3716    /* (TARGET_SYS_SENDMMSG is the highest among TARGET_SYS_xxx) */
3717    if (num < 1 || num > TARGET_SYS_SENDMMSG) {
3718        return -TARGET_EINVAL;
3719    }
3720    /* ensure we have space for args */
3721    if (nargs[num] > ARRAY_SIZE(a)) {
3722        return -TARGET_EINVAL;
3723    }
3724    /* collect the arguments in a[] according to nargs[] */
3725    for (i = 0; i < nargs[num]; ++i) {
3726        if (get_user_ual(a[i], vptr + i * sizeof(abi_long)) != 0) {
3727            return -TARGET_EFAULT;
3728        }
3729    }
3730    /* now when we have the args, invoke the appropriate underlying function */
3731    switch (num) {
3732    case TARGET_SYS_SOCKET: /* domain, type, protocol */
3733        return do_socket(a[0], a[1], a[2]);
3734    case TARGET_SYS_BIND: /* sockfd, addr, addrlen */
3735        return do_bind(a[0], a[1], a[2]);
3736    case TARGET_SYS_CONNECT: /* sockfd, addr, addrlen */
3737        return do_connect(a[0], a[1], a[2]);
3738    case TARGET_SYS_LISTEN: /* sockfd, backlog */
3739        return get_errno(listen(a[0], a[1]));
3740    case TARGET_SYS_ACCEPT: /* sockfd, addr, addrlen */
3741        return do_accept4(a[0], a[1], a[2], 0);
3742    case TARGET_SYS_GETSOCKNAME: /* sockfd, addr, addrlen */
3743        return do_getsockname(a[0], a[1], a[2]);
3744    case TARGET_SYS_GETPEERNAME: /* sockfd, addr, addrlen */
3745        return do_getpeername(a[0], a[1], a[2]);
3746    case TARGET_SYS_SOCKETPAIR: /* domain, type, protocol, tab */
3747        return do_socketpair(a[0], a[1], a[2], a[3]);
3748    case TARGET_SYS_SEND: /* sockfd, msg, len, flags */
3749        return do_sendto(a[0], a[1], a[2], a[3], 0, 0);
3750    case TARGET_SYS_RECV: /* sockfd, msg, len, flags */
3751        return do_recvfrom(a[0], a[1], a[2], a[3], 0, 0);
3752    case TARGET_SYS_SENDTO: /* sockfd, msg, len, flags, addr, addrlen */
3753        return do_sendto(a[0], a[1], a[2], a[3], a[4], a[5]);
3754    case TARGET_SYS_RECVFROM: /* sockfd, msg, len, flags, addr, addrlen */
3755        return do_recvfrom(a[0], a[1], a[2], a[3], a[4], a[5]);
3756    case TARGET_SYS_SHUTDOWN: /* sockfd, how */
3757        return get_errno(shutdown(a[0], a[1]));
3758    case TARGET_SYS_SETSOCKOPT: /* sockfd, level, optname, optval, optlen */
3759        return do_setsockopt(a[0], a[1], a[2], a[3], a[4]);
3760    case TARGET_SYS_GETSOCKOPT: /* sockfd, level, optname, optval, optlen */
3761        return do_getsockopt(a[0], a[1], a[2], a[3], a[4]);
3762    case TARGET_SYS_SENDMSG: /* sockfd, msg, flags */
3763        return do_sendrecvmsg(a[0], a[1], a[2], 1);
3764    case TARGET_SYS_RECVMSG: /* sockfd, msg, flags */
3765        return do_sendrecvmsg(a[0], a[1], a[2], 0);
3766    case TARGET_SYS_ACCEPT4: /* sockfd, addr, addrlen, flags */
3767        return do_accept4(a[0], a[1], a[2], a[3]);
3768    case TARGET_SYS_RECVMMSG: /* sockfd, msgvec, vlen, flags */
3769        return do_sendrecvmmsg(a[0], a[1], a[2], a[3], 0);
3770    case TARGET_SYS_SENDMMSG: /* sockfd, msgvec, vlen, flags */
3771        return do_sendrecvmmsg(a[0], a[1], a[2], a[3], 1);
3772    default:
3773        qemu_log_mask(LOG_UNIMP, "Unsupported socketcall: %d\n", num);
3774        return -TARGET_EINVAL;
3775    }
3776}
3777#endif
3778
3779#ifndef TARGET_SEMID64_DS
3780/* asm-generic version of this struct */
3781struct target_semid64_ds
3782{
3783  struct target_ipc_perm sem_perm;
3784  abi_ulong sem_otime;
3785#if TARGET_ABI_BITS == 32
3786  abi_ulong __unused1;
3787#endif
3788  abi_ulong sem_ctime;
3789#if TARGET_ABI_BITS == 32
3790  abi_ulong __unused2;
3791#endif
3792  abi_ulong sem_nsems;
3793  abi_ulong __unused3;
3794  abi_ulong __unused4;
3795};
3796#endif
3797
3798static inline abi_long target_to_host_ipc_perm(struct ipc_perm *host_ip,
3799                                               abi_ulong target_addr)
3800{
3801    struct target_ipc_perm *target_ip;
3802    struct target_semid64_ds *target_sd;
3803
3804    if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
3805        return -TARGET_EFAULT;
3806    target_ip = &(target_sd->sem_perm);
3807    host_ip->__key = tswap32(target_ip->__key);
3808    host_ip->uid = tswap32(target_ip->uid);
3809    host_ip->gid = tswap32(target_ip->gid);
3810    host_ip->cuid = tswap32(target_ip->cuid);
3811    host_ip->cgid = tswap32(target_ip->cgid);
3812#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
3813    host_ip->mode = tswap32(target_ip->mode);
3814#else
3815    host_ip->mode = tswap16(target_ip->mode);
3816#endif
3817#if defined(TARGET_PPC)
3818    host_ip->__seq = tswap32(target_ip->__seq);
3819#else
3820    host_ip->__seq = tswap16(target_ip->__seq);
3821#endif
3822    unlock_user_struct(target_sd, target_addr, 0);
3823    return 0;
3824}
3825
3826static inline abi_long host_to_target_ipc_perm(abi_ulong target_addr,
3827                                               struct ipc_perm *host_ip)
3828{
3829    struct target_ipc_perm *target_ip;
3830    struct target_semid64_ds *target_sd;
3831
3832    if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
3833        return -TARGET_EFAULT;
3834    target_ip = &(target_sd->sem_perm);
3835    target_ip->__key = tswap32(host_ip->__key);
3836    target_ip->uid = tswap32(host_ip->uid);
3837    target_ip->gid = tswap32(host_ip->gid);
3838    target_ip->cuid = tswap32(host_ip->cuid);
3839    target_ip->cgid = tswap32(host_ip->cgid);
3840#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
3841    target_ip->mode = tswap32(host_ip->mode);
3842#else
3843    target_ip->mode = tswap16(host_ip->mode);
3844#endif
3845#if defined(TARGET_PPC)
3846    target_ip->__seq = tswap32(host_ip->__seq);
3847#else
3848    target_ip->__seq = tswap16(host_ip->__seq);
3849#endif
3850    unlock_user_struct(target_sd, target_addr, 1);
3851    return 0;
3852}
3853
3854static inline abi_long target_to_host_semid_ds(struct semid_ds *host_sd,
3855                                               abi_ulong target_addr)
3856{
3857    struct target_semid64_ds *target_sd;
3858
3859    if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
3860        return -TARGET_EFAULT;
3861    if (target_to_host_ipc_perm(&(host_sd->sem_perm),target_addr))
3862        return -TARGET_EFAULT;
3863    host_sd->sem_nsems = tswapal(target_sd->sem_nsems);
3864    host_sd->sem_otime = tswapal(target_sd->sem_otime);
3865    host_sd->sem_ctime = tswapal(target_sd->sem_ctime);
3866    unlock_user_struct(target_sd, target_addr, 0);
3867    return 0;
3868}
3869
3870static inline abi_long host_to_target_semid_ds(abi_ulong target_addr,
3871                                               struct semid_ds *host_sd)
3872{
3873    struct target_semid64_ds *target_sd;
3874
3875    if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
3876        return -TARGET_EFAULT;
3877    if (host_to_target_ipc_perm(target_addr,&(host_sd->sem_perm)))
3878        return -TARGET_EFAULT;
3879    target_sd->sem_nsems = tswapal(host_sd->sem_nsems);
3880    target_sd->sem_otime = tswapal(host_sd->sem_otime);
3881    target_sd->sem_ctime = tswapal(host_sd->sem_ctime);
3882    unlock_user_struct(target_sd, target_addr, 1);
3883    return 0;
3884}
3885
3886struct target_seminfo {
3887    int semmap;
3888    int semmni;
3889    int semmns;
3890    int semmnu;
3891    int semmsl;
3892    int semopm;
3893    int semume;
3894    int semusz;
3895    int semvmx;
3896    int semaem;
3897};
3898
3899static inline abi_long host_to_target_seminfo(abi_ulong target_addr,
3900                                              struct seminfo *host_seminfo)
3901{
3902    struct target_seminfo *target_seminfo;
3903    if (!lock_user_struct(VERIFY_WRITE, target_seminfo, target_addr, 0))
3904        return -TARGET_EFAULT;
3905    __put_user(host_seminfo->semmap, &target_seminfo->semmap);
3906    __put_user(host_seminfo->semmni, &target_seminfo->semmni);
3907    __put_user(host_seminfo->semmns, &target_seminfo->semmns);
3908    __put_user(host_seminfo->semmnu, &target_seminfo->semmnu);
3909    __put_user(host_seminfo->semmsl, &target_seminfo->semmsl);
3910    __put_user(host_seminfo->semopm, &target_seminfo->semopm);
3911    __put_user(host_seminfo->semume, &target_seminfo->semume);
3912    __put_user(host_seminfo->semusz, &target_seminfo->semusz);
3913    __put_user(host_seminfo->semvmx, &target_seminfo->semvmx);
3914    __put_user(host_seminfo->semaem, &target_seminfo->semaem);
3915    unlock_user_struct(target_seminfo, target_addr, 1);
3916    return 0;
3917}
3918
3919union semun {
3920        int val;
3921        struct semid_ds *buf;
3922        unsigned short *array;
3923        struct seminfo *__buf;
3924};
3925
3926union target_semun {
3927        int val;
3928        abi_ulong buf;
3929        abi_ulong array;
3930        abi_ulong __buf;
3931};
3932
3933static inline abi_long target_to_host_semarray(int semid, unsigned short **host_array,
3934                                               abi_ulong target_addr)
3935{
3936    int nsems;
3937    unsigned short *array;
3938    union semun semun;
3939    struct semid_ds semid_ds;
3940    int i, ret;
3941
3942    semun.buf = &semid_ds;
3943
3944    ret = semctl(semid, 0, IPC_STAT, semun);
3945    if (ret == -1)
3946        return get_errno(ret);
3947
3948    nsems = semid_ds.sem_nsems;
3949
3950    *host_array = g_try_new(unsigned short, nsems);
3951    if (!*host_array) {
3952        return -TARGET_ENOMEM;
3953    }
3954    array = lock_user(VERIFY_READ, target_addr,
3955                      nsems*sizeof(unsigned short), 1);
3956    if (!array) {
3957        g_free(*host_array);
3958        return -TARGET_EFAULT;
3959    }
3960
3961    for(i=0; i<nsems; i++) {
3962        __get_user((*host_array)[i], &array[i]);
3963    }
3964    unlock_user(array, target_addr, 0);
3965
3966    return 0;
3967}
3968
3969static inline abi_long host_to_target_semarray(int semid, abi_ulong target_addr,
3970                                               unsigned short **host_array)
3971{
3972    int nsems;
3973    unsigned short *array;
3974    union semun semun;
3975    struct semid_ds semid_ds;
3976    int i, ret;
3977
3978    semun.buf = &semid_ds;
3979
3980    ret = semctl(semid, 0, IPC_STAT, semun);
3981    if (ret == -1)
3982        return get_errno(ret);
3983
3984    nsems = semid_ds.sem_nsems;
3985
3986    array = lock_user(VERIFY_WRITE, target_addr,
3987                      nsems*sizeof(unsigned short), 0);
3988    if (!array)
3989        return -TARGET_EFAULT;
3990
3991    for(i=0; i<nsems; i++) {
3992        __put_user((*host_array)[i], &array[i]);
3993    }
3994    g_free(*host_array);
3995    unlock_user(array, target_addr, 1);
3996
3997    return 0;
3998}
3999
4000static inline abi_long do_semctl(int semid, int semnum, int cmd,
4001                                 abi_ulong target_arg)
4002{
4003    union target_semun target_su = { .buf = target_arg };
4004    union semun arg;
4005    struct semid_ds dsarg;
4006    unsigned short *array = NULL;
4007    struct seminfo seminfo;
4008    abi_long ret = -TARGET_EINVAL;
4009    abi_long err;
4010    cmd &= 0xff;
4011
4012    switch( cmd ) {
4013        case GETVAL:
4014        case SETVAL:
4015            /* In 64 bit cross-endian situations, we will erroneously pick up
4016             * the wrong half of the union for the "val" element.  To rectify
4017             * this, the entire 8-byte structure is byteswapped, followed by
4018             * a swap of the 4 byte val field. In other cases, the data is
4019             * already in proper host byte order. */
4020            if (sizeof(target_su.val) != (sizeof(target_su.buf))) {
4021                target_su.buf = tswapal(target_su.buf);
4022                arg.val = tswap32(target_su.val);
4023            } else {
4024                arg.val = target_su.val;
4025            }
4026            ret = get_errno(semctl(semid, semnum, cmd, arg));
4027            break;
4028        case GETALL:
4029        case SETALL:
4030            err = target_to_host_semarray(semid, &array, target_su.array);
4031            if (err)
4032                return err;
4033            arg.array = array;
4034            ret = get_errno(semctl(semid, semnum, cmd, arg));
4035            err = host_to_target_semarray(semid, target_su.array, &array);
4036            if (err)
4037                return err;
4038            break;
4039        case IPC_STAT:
4040        case IPC_SET:
4041        case SEM_STAT:
4042            err = target_to_host_semid_ds(&dsarg, target_su.buf);
4043            if (err)
4044                return err;
4045            arg.buf = &dsarg;
4046            ret = get_errno(semctl(semid, semnum, cmd, arg));
4047            err = host_to_target_semid_ds(target_su.buf, &dsarg);
4048            if (err)
4049                return err;
4050            break;
4051        case IPC_INFO:
4052        case SEM_INFO:
4053            arg.__buf = &seminfo;
4054            ret = get_errno(semctl(semid, semnum, cmd, arg));
4055            err = host_to_target_seminfo(target_su.__buf, &seminfo);
4056            if (err)
4057                return err;
4058            break;
4059        case IPC_RMID:
4060        case GETPID:
4061        case GETNCNT:
4062        case GETZCNT:
4063            ret = get_errno(semctl(semid, semnum, cmd, NULL));
4064            break;
4065    }
4066
4067    return ret;
4068}
4069
4070struct target_sembuf {
4071    unsigned short sem_num;
4072    short sem_op;
4073    short sem_flg;
4074};
4075
4076static inline abi_long target_to_host_sembuf(struct sembuf *host_sembuf,
4077                                             abi_ulong target_addr,
4078                                             unsigned nsops)
4079{
4080    struct target_sembuf *target_sembuf;
4081    int i;
4082
4083    target_sembuf = lock_user(VERIFY_READ, target_addr,
4084                              nsops*sizeof(struct target_sembuf), 1);
4085    if (!target_sembuf)
4086        return -TARGET_EFAULT;
4087
4088    for(i=0; i<nsops; i++) {
4089        __get_user(host_sembuf[i].sem_num, &target_sembuf[i].sem_num);
4090        __get_user(host_sembuf[i].sem_op, &target_sembuf[i].sem_op);
4091        __get_user(host_sembuf[i].sem_flg, &target_sembuf[i].sem_flg);
4092    }
4093
4094    unlock_user(target_sembuf, target_addr, 0);
4095
4096    return 0;
4097}
4098
4099#if defined(TARGET_NR_ipc) || defined(TARGET_NR_semop) || \
4100    defined(TARGET_NR_semtimedop) || defined(TARGET_NR_semtimedop_time64)
4101
4102/*
4103 * This macro is required to handle the s390 variants, which passes the
4104 * arguments in a different order than default.
4105 */
4106#ifdef __s390x__
4107#define SEMTIMEDOP_IPC_ARGS(__nsops, __sops, __timeout) \
4108  (__nsops), (__timeout), (__sops)
4109#else
4110#define SEMTIMEDOP_IPC_ARGS(__nsops, __sops, __timeout) \
4111  (__nsops), 0, (__sops), (__timeout)
4112#endif
4113
4114static inline abi_long do_semtimedop(int semid,
4115                                     abi_long ptr,
4116                                     unsigned nsops,
4117                                     abi_long timeout, bool time64)
4118{
4119    struct sembuf *sops;
4120    struct timespec ts, *pts = NULL;
4121    abi_long ret;
4122
4123    if (timeout) {
4124        pts = &ts;
4125        if (time64) {
4126            if (target_to_host_timespec64(pts, timeout)) {
4127                return -TARGET_EFAULT;
4128            }
4129        } else {
4130            if (target_to_host_timespec(pts, timeout)) {
4131                return -TARGET_EFAULT;
4132            }
4133        }
4134    }
4135
4136    if (nsops > TARGET_SEMOPM) {
4137        return -TARGET_E2BIG;
4138    }
4139
4140    sops = g_new(struct sembuf, nsops);
4141
4142    if (target_to_host_sembuf(sops, ptr, nsops)) {
4143        g_free(sops);
4144        return -TARGET_EFAULT;
4145    }
4146
4147    ret = -TARGET_ENOSYS;
4148#ifdef __NR_semtimedop
4149    ret = get_errno(safe_semtimedop(semid, sops, nsops, pts));
4150#endif
4151#ifdef __NR_ipc
4152    if (ret == -TARGET_ENOSYS) {
4153        ret = get_errno(safe_ipc(IPCOP_semtimedop, semid,
4154                                 SEMTIMEDOP_IPC_ARGS(nsops, sops, (long)pts)));
4155    }
4156#endif
4157    g_free(sops);
4158    return ret;
4159}
4160#endif
4161
4162struct target_msqid_ds
4163{
4164    struct target_ipc_perm msg_perm;
4165    abi_ulong msg_stime;
4166#if TARGET_ABI_BITS == 32
4167    abi_ulong __unused1;
4168#endif
4169    abi_ulong msg_rtime;
4170#if TARGET_ABI_BITS == 32
4171    abi_ulong __unused2;
4172#endif
4173    abi_ulong msg_ctime;
4174#if TARGET_ABI_BITS == 32
4175    abi_ulong __unused3;
4176#endif
4177    abi_ulong __msg_cbytes;
4178    abi_ulong msg_qnum;
4179    abi_ulong msg_qbytes;
4180    abi_ulong msg_lspid;
4181    abi_ulong msg_lrpid;
4182    abi_ulong __unused4;
4183    abi_ulong __unused5;
4184};
4185
4186static inline abi_long target_to_host_msqid_ds(struct msqid_ds *host_md,
4187                                               abi_ulong target_addr)
4188{
4189    struct target_msqid_ds *target_md;
4190
4191    if (!lock_user_struct(VERIFY_READ, target_md, target_addr, 1))
4192        return -TARGET_EFAULT;
4193    if (target_to_host_ipc_perm(&(host_md->msg_perm),target_addr))
4194        return -TARGET_EFAULT;
4195    host_md->msg_stime = tswapal(target_md->msg_stime);
4196    host_md->msg_rtime = tswapal(target_md->msg_rtime);
4197    host_md->msg_ctime = tswapal(target_md->msg_ctime);
4198    host_md->__msg_cbytes = tswapal(target_md->__msg_cbytes);
4199    host_md->msg_qnum = tswapal(target_md->msg_qnum);
4200    host_md->msg_qbytes = tswapal(target_md->msg_qbytes);
4201    host_md->msg_lspid = tswapal(target_md->msg_lspid);
4202    host_md->msg_lrpid = tswapal(target_md->msg_lrpid);
4203    unlock_user_struct(target_md, target_addr, 0);
4204    return 0;
4205}
4206
4207static inline abi_long host_to_target_msqid_ds(abi_ulong target_addr,
4208                                               struct msqid_ds *host_md)
4209{
4210    struct target_msqid_ds *target_md;
4211
4212    if (!lock_user_struct(VERIFY_WRITE, target_md, target_addr, 0))
4213        return -TARGET_EFAULT;
4214    if (host_to_target_ipc_perm(target_addr,&(host_md->msg_perm)))
4215        return -TARGET_EFAULT;
4216    target_md->msg_stime = tswapal(host_md->msg_stime);
4217    target_md->msg_rtime = tswapal(host_md->msg_rtime);
4218    target_md->msg_ctime = tswapal(host_md->msg_ctime);
4219    target_md->__msg_cbytes = tswapal(host_md->__msg_cbytes);
4220    target_md->msg_qnum = tswapal(host_md->msg_qnum);
4221    target_md->msg_qbytes = tswapal(host_md->msg_qbytes);
4222    target_md->msg_lspid = tswapal(host_md->msg_lspid);
4223    target_md->msg_lrpid = tswapal(host_md->msg_lrpid);
4224    unlock_user_struct(target_md, target_addr, 1);
4225    return 0;
4226}
4227
4228struct target_msginfo {
4229    int msgpool;
4230    int msgmap;
4231    int msgmax;
4232    int msgmnb;
4233    int msgmni;
4234    int msgssz;
4235    int msgtql;
4236    unsigned short int msgseg;
4237};
4238
4239static inline abi_long host_to_target_msginfo(abi_ulong target_addr,
4240                                              struct msginfo *host_msginfo)
4241{
4242    struct target_msginfo *target_msginfo;
4243    if (!lock_user_struct(VERIFY_WRITE, target_msginfo, target_addr, 0))
4244        return -TARGET_EFAULT;
4245    __put_user(host_msginfo->msgpool, &target_msginfo->msgpool);
4246    __put_user(host_msginfo->msgmap, &target_msginfo->msgmap);
4247    __put_user(host_msginfo->msgmax, &target_msginfo->msgmax);
4248    __put_user(host_msginfo->msgmnb, &target_msginfo->msgmnb);
4249    __put_user(host_msginfo->msgmni, &target_msginfo->msgmni);
4250    __put_user(host_msginfo->msgssz, &target_msginfo->msgssz);
4251    __put_user(host_msginfo->msgtql, &target_msginfo->msgtql);
4252    __put_user(host_msginfo->msgseg, &target_msginfo->msgseg);
4253    unlock_user_struct(target_msginfo, target_addr, 1);
4254    return 0;
4255}
4256
4257static inline abi_long do_msgctl(int msgid, int cmd, abi_long ptr)
4258{
4259    struct msqid_ds dsarg;
4260    struct msginfo msginfo;
4261    abi_long ret = -TARGET_EINVAL;
4262
4263    cmd &= 0xff;
4264
4265    switch (cmd) {
4266    case IPC_STAT:
4267    case IPC_SET:
4268    case MSG_STAT:
4269        if (target_to_host_msqid_ds(&dsarg,ptr))
4270            return -TARGET_EFAULT;
4271        ret = get_errno(msgctl(msgid, cmd, &dsarg));
4272        if (host_to_target_msqid_ds(ptr,&dsarg))
4273            return -TARGET_EFAULT;
4274        break;
4275    case IPC_RMID:
4276        ret = get_errno(msgctl(msgid, cmd, NULL));
4277        break;
4278    case IPC_INFO:
4279    case MSG_INFO:
4280        ret = get_errno(msgctl(msgid, cmd, (struct msqid_ds *)&msginfo));
4281        if (host_to_target_msginfo(ptr, &msginfo))
4282            return -TARGET_EFAULT;
4283        break;
4284    }
4285
4286    return ret;
4287}
4288
4289struct target_msgbuf {
4290    abi_long mtype;
4291    char        mtext[1];
4292};
4293
4294static inline abi_long do_msgsnd(int msqid, abi_long msgp,
4295                                 ssize_t msgsz, int msgflg)
4296{
4297    struct target_msgbuf *target_mb;
4298    struct msgbuf *host_mb;
4299    abi_long ret = 0;
4300
4301    if (msgsz < 0) {
4302        return -TARGET_EINVAL;
4303    }
4304
4305    if (!lock_user_struct(VERIFY_READ, target_mb, msgp, 0))
4306        return -TARGET_EFAULT;
4307    host_mb = g_try_malloc(msgsz + sizeof(long));
4308    if (!host_mb) {
4309        unlock_user_struct(target_mb, msgp, 0);
4310        return -TARGET_ENOMEM;
4311    }
4312    host_mb->mtype = (abi_long) tswapal(target_mb->mtype);
4313    memcpy(host_mb->mtext, target_mb->mtext, msgsz);
4314    ret = -TARGET_ENOSYS;
4315#ifdef __NR_msgsnd
4316    ret = get_errno(safe_msgsnd(msqid, host_mb, msgsz, msgflg));
4317#endif
4318#ifdef __NR_ipc
4319    if (ret == -TARGET_ENOSYS) {
4320#ifdef __s390x__
4321        ret = get_errno(safe_ipc(IPCOP_msgsnd, msqid, msgsz, msgflg,
4322                                 host_mb));
4323#else
4324        ret = get_errno(safe_ipc(IPCOP_msgsnd, msqid, msgsz, msgflg,
4325                                 host_mb, 0));
4326#endif
4327    }
4328#endif
4329    g_free(host_mb);
4330    unlock_user_struct(target_mb, msgp, 0);
4331
4332    return ret;
4333}
4334
4335#ifdef __NR_ipc
4336#if defined(__sparc__)
4337/* SPARC for msgrcv it does not use the kludge on final 2 arguments.  */
4338#define MSGRCV_ARGS(__msgp, __msgtyp) __msgp, __msgtyp
4339#elif defined(__s390x__)
4340/* The s390 sys_ipc variant has only five parameters.  */
4341#define MSGRCV_ARGS(__msgp, __msgtyp) \
4342    ((long int[]){(long int)__msgp, __msgtyp})
4343#else
4344#define MSGRCV_ARGS(__msgp, __msgtyp) \
4345    ((long int[]){(long int)__msgp, __msgtyp}), 0
4346#endif
4347#endif
4348
4349static inline abi_long do_msgrcv(int msqid, abi_long msgp,
4350                                 ssize_t msgsz, abi_long msgtyp,
4351                                 int msgflg)
4352{
4353    struct target_msgbuf *target_mb;
4354    char *target_mtext;
4355    struct msgbuf *host_mb;
4356    abi_long ret = 0;
4357
4358    if (msgsz < 0) {
4359        return -TARGET_EINVAL;
4360    }
4361
4362    if (!lock_user_struct(VERIFY_WRITE, target_mb, msgp, 0))
4363        return -TARGET_EFAULT;
4364
4365    host_mb = g_try_malloc(msgsz + sizeof(long));
4366    if (!host_mb) {
4367        ret = -TARGET_ENOMEM;
4368        goto end;
4369    }
4370    ret = -TARGET_ENOSYS;
4371#ifdef __NR_msgrcv
4372    ret = get_errno(safe_msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg));
4373#endif
4374#ifdef __NR_ipc
4375    if (ret == -TARGET_ENOSYS) {
4376        ret = get_errno(safe_ipc(IPCOP_CALL(1, IPCOP_msgrcv), msqid, msgsz,
4377                        msgflg, MSGRCV_ARGS(host_mb, msgtyp)));
4378    }
4379#endif
4380
4381    if (ret > 0) {
4382        abi_ulong target_mtext_addr = msgp + sizeof(abi_ulong);
4383        target_mtext = lock_user(VERIFY_WRITE, target_mtext_addr, ret, 0);
4384        if (!target_mtext) {
4385            ret = -TARGET_EFAULT;
4386            goto end;
4387        }
4388        memcpy(target_mb->mtext, host_mb->mtext, ret);
4389        unlock_user(target_mtext, target_mtext_addr, ret);
4390    }
4391
4392    target_mb->mtype = tswapal(host_mb->mtype);
4393
4394end:
4395    if (target_mb)
4396        unlock_user_struct(target_mb, msgp, 1);
4397    g_free(host_mb);
4398    return ret;
4399}
4400
4401static inline abi_long target_to_host_shmid_ds(struct shmid_ds *host_sd,
4402                                               abi_ulong target_addr)
4403{
4404    struct target_shmid_ds *target_sd;
4405
4406    if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
4407        return -TARGET_EFAULT;
4408    if (target_to_host_ipc_perm(&(host_sd->shm_perm), target_addr))
4409        return -TARGET_EFAULT;
4410    __get_user(host_sd->shm_segsz, &target_sd->shm_segsz);
4411    __get_user(host_sd->shm_atime, &target_sd->shm_atime);
4412    __get_user(host_sd->shm_dtime, &target_sd->shm_dtime);
4413    __get_user(host_sd->shm_ctime, &target_sd->shm_ctime);
4414    __get_user(host_sd->shm_cpid, &target_sd->shm_cpid);
4415    __get_user(host_sd->shm_lpid, &target_sd->shm_lpid);
4416    __get_user(host_sd->shm_nattch, &target_sd->shm_nattch);
4417    unlock_user_struct(target_sd, target_addr, 0);
4418    return 0;
4419}
4420
4421static inline abi_long host_to_target_shmid_ds(abi_ulong target_addr,
4422                                               struct shmid_ds *host_sd)
4423{
4424    struct target_shmid_ds *target_sd;
4425
4426    if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
4427        return -TARGET_EFAULT;
4428    if (host_to_target_ipc_perm(target_addr, &(host_sd->shm_perm)))
4429        return -TARGET_EFAULT;
4430    __put_user(host_sd->shm_segsz, &target_sd->shm_segsz);
4431    __put_user(host_sd->shm_atime, &target_sd->shm_atime);
4432    __put_user(host_sd->shm_dtime, &target_sd->shm_dtime);
4433    __put_user(host_sd->shm_ctime, &target_sd->shm_ctime);
4434    __put_user(host_sd->shm_cpid, &target_sd->shm_cpid);
4435    __put_user(host_sd->shm_lpid, &target_sd->shm_lpid);
4436    __put_user(host_sd->shm_nattch, &target_sd->shm_nattch);
4437    unlock_user_struct(target_sd, target_addr, 1);
4438    return 0;
4439}
4440
4441struct  target_shminfo {
4442    abi_ulong shmmax;
4443    abi_ulong shmmin;
4444    abi_ulong shmmni;
4445    abi_ulong shmseg;
4446    abi_ulong shmall;
4447};
4448
4449static inline abi_long host_to_target_shminfo(abi_ulong target_addr,
4450                                              struct shminfo *host_shminfo)
4451{
4452    struct target_shminfo *target_shminfo;
4453    if (!lock_user_struct(VERIFY_WRITE, target_shminfo, target_addr, 0))
4454        return -TARGET_EFAULT;
4455    __put_user(host_shminfo->shmmax, &target_shminfo->shmmax);
4456    __put_user(host_shminfo->shmmin, &target_shminfo->shmmin);
4457    __put_user(host_shminfo->shmmni, &target_shminfo->shmmni);
4458    __put_user(host_shminfo->shmseg, &target_shminfo->shmseg);
4459    __put_user(host_shminfo->shmall, &target_shminfo->shmall);
4460    unlock_user_struct(target_shminfo, target_addr, 1);
4461    return 0;
4462}
4463
4464struct target_shm_info {
4465    int used_ids;
4466    abi_ulong shm_tot;
4467    abi_ulong shm_rss;
4468    abi_ulong shm_swp;
4469    abi_ulong swap_attempts;
4470    abi_ulong swap_successes;
4471};
4472
4473static inline abi_long host_to_target_shm_info(abi_ulong target_addr,
4474                                               struct shm_info *host_shm_info)
4475{
4476    struct target_shm_info *target_shm_info;
4477    if (!lock_user_struct(VERIFY_WRITE, target_shm_info, target_addr, 0))
4478        return -TARGET_EFAULT;
4479    __put_user(host_shm_info->used_ids, &target_shm_info->used_ids);
4480    __put_user(host_shm_info->shm_tot, &target_shm_info->shm_tot);
4481    __put_user(host_shm_info->shm_rss, &target_shm_info->shm_rss);
4482    __put_user(host_shm_info->shm_swp, &target_shm_info->shm_swp);
4483    __put_user(host_shm_info->swap_attempts, &target_shm_info->swap_attempts);
4484    __put_user(host_shm_info->swap_successes, &target_shm_info->swap_successes);
4485    unlock_user_struct(target_shm_info, target_addr, 1);
4486    return 0;
4487}
4488
4489static inline abi_long do_shmctl(int shmid, int cmd, abi_long buf)
4490{
4491    struct shmid_ds dsarg;
4492    struct shminfo shminfo;
4493    struct shm_info shm_info;
4494    abi_long ret = -TARGET_EINVAL;
4495
4496    cmd &= 0xff;
4497
4498    switch(cmd) {
4499    case IPC_STAT:
4500    case IPC_SET:
4501    case SHM_STAT:
4502        if (target_to_host_shmid_ds(&dsarg, buf))
4503            return -TARGET_EFAULT;
4504        ret = get_errno(shmctl(shmid, cmd, &dsarg));
4505        if (host_to_target_shmid_ds(buf, &dsarg))
4506            return -TARGET_EFAULT;
4507        break;
4508    case IPC_INFO:
4509        ret = get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shminfo));
4510        if (host_to_target_shminfo(buf, &shminfo))
4511            return -TARGET_EFAULT;
4512        break;
4513    case SHM_INFO:
4514        ret = get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shm_info));
4515        if (host_to_target_shm_info(buf, &shm_info))
4516            return -TARGET_EFAULT;
4517        break;
4518    case IPC_RMID:
4519    case SHM_LOCK:
4520    case SHM_UNLOCK:
4521        ret = get_errno(shmctl(shmid, cmd, NULL));
4522        break;
4523    }
4524
4525    return ret;
4526}
4527
4528#ifdef TARGET_NR_ipc
4529/* ??? This only works with linear mappings.  */
4530/* do_ipc() must return target values and target errnos. */
4531static abi_long do_ipc(CPUArchState *cpu_env,
4532                       unsigned int call, abi_long first,
4533                       abi_long second, abi_long third,
4534                       abi_long ptr, abi_long fifth)
4535{
4536    int version;
4537    abi_long ret = 0;
4538
4539    version = call >> 16;
4540    call &= 0xffff;
4541
4542    switch (call) {
4543    case IPCOP_semop:
4544        ret = do_semtimedop(first, ptr, second, 0, false);
4545        break;
4546    case IPCOP_semtimedop:
4547    /*
4548     * The s390 sys_ipc variant has only five parameters instead of six
4549     * (as for default variant) and the only difference is the handling of
4550     * SEMTIMEDOP where on s390 the third parameter is used as a pointer
4551     * to a struct timespec where the generic variant uses fifth parameter.
4552     */
4553#if defined(TARGET_S390X)
4554        ret = do_semtimedop(first, ptr, second, third, TARGET_ABI_BITS == 64);
4555#else
4556        ret = do_semtimedop(first, ptr, second, fifth, TARGET_ABI_BITS == 64);
4557#endif
4558        break;
4559
4560    case IPCOP_semget:
4561        ret = get_errno(semget(first, second, third));
4562        break;
4563
4564    case IPCOP_semctl: {
4565        /* The semun argument to semctl is passed by value, so dereference the
4566         * ptr argument. */
4567        abi_ulong atptr;
4568        get_user_ual(atptr, ptr);
4569        ret = do_semctl(first, second, third, atptr);
4570        break;
4571    }
4572
4573    case IPCOP_msgget:
4574        ret = get_errno(msgget(first, second));
4575        break;
4576
4577    case IPCOP_msgsnd:
4578        ret = do_msgsnd(first, ptr, second, third);
4579        break;
4580
4581    case IPCOP_msgctl:
4582        ret = do_msgctl(first, second, ptr);
4583        break;
4584
4585    case IPCOP_msgrcv:
4586        switch (version) {
4587        case 0:
4588            {
4589                struct target_ipc_kludge {
4590                    abi_long msgp;
4591                    abi_long msgtyp;
4592                } *tmp;
4593
4594                if (!lock_user_struct(VERIFY_READ, tmp, ptr, 1)) {
4595                    ret = -TARGET_EFAULT;
4596                    break;
4597                }
4598
4599                ret = do_msgrcv(first, tswapal(tmp->msgp), second, tswapal(tmp->msgtyp), third);
4600
4601                unlock_user_struct(tmp, ptr, 0);
4602                break;
4603            }
4604        default:
4605            ret = do_msgrcv(first, ptr, second, fifth, third);
4606        }
4607        break;
4608
4609    case IPCOP_shmat:
4610        switch (version) {
4611        default:
4612        {
4613            abi_ulong raddr;
4614            raddr = target_shmat(cpu_env, first, ptr, second);
4615            if (is_error(raddr))
4616                return get_errno(raddr);
4617            if (put_user_ual(raddr, third))
4618                return -TARGET_EFAULT;
4619            break;
4620        }
4621        case 1:
4622            ret = -TARGET_EINVAL;
4623            break;
4624        }
4625        break;
4626    case IPCOP_shmdt:
4627        ret = target_shmdt(ptr);
4628        break;
4629
4630    case IPCOP_shmget:
4631        /* IPC_* flag values are the same on all linux platforms */
4632        ret = get_errno(shmget(first, second, third));
4633        break;
4634
4635        /* IPC_* and SHM_* command values are the same on all linux platforms */
4636    case IPCOP_shmctl:
4637        ret = do_shmctl(first, second, ptr);
4638        break;
4639    default:
4640        qemu_log_mask(LOG_UNIMP, "Unsupported ipc call: %d (version %d)\n",
4641                      call, version);
4642        ret = -TARGET_ENOSYS;
4643        break;
4644    }
4645    return ret;
4646}
4647#endif
4648
4649/* kernel structure types definitions */
4650
4651#define STRUCT(name, ...) STRUCT_ ## name,
4652#define STRUCT_SPECIAL(name) STRUCT_ ## name,
4653enum {
4654#include "syscall_types.h"
4655STRUCT_MAX
4656};
4657#undef STRUCT
4658#undef STRUCT_SPECIAL
4659
4660#define STRUCT(name, ...) static const argtype struct_ ## name ## _def[] = {  __VA_ARGS__, TYPE_NULL };
4661#define STRUCT_SPECIAL(name)
4662#include "syscall_types.h"
4663#undef STRUCT
4664#undef STRUCT_SPECIAL
4665
4666#define MAX_STRUCT_SIZE 4096
4667
4668#ifdef CONFIG_FIEMAP
4669/* So fiemap access checks don't overflow on 32 bit systems.
4670 * This is very slightly smaller than the limit imposed by
4671 * the underlying kernel.
4672 */
4673#define FIEMAP_MAX_EXTENTS ((UINT_MAX - sizeof(struct fiemap))  \
4674                            / sizeof(struct fiemap_extent))
4675
4676static abi_long do_ioctl_fs_ioc_fiemap(const IOCTLEntry *ie, uint8_t *buf_temp,
4677                                       int fd, int cmd, abi_long arg)
4678{
4679    /* The parameter for this ioctl is a struct fiemap followed
4680     * by an array of struct fiemap_extent whose size is set
4681     * in fiemap->fm_extent_count. The array is filled in by the
4682     * ioctl.
4683     */
4684    int target_size_in, target_size_out;
4685    struct fiemap *fm;
4686    const argtype *arg_type = ie->arg_type;
4687    const argtype extent_arg_type[] = { MK_STRUCT(STRUCT_fiemap_extent) };
4688    void *argptr, *p;
4689    abi_long ret;
4690    int i, extent_size = thunk_type_size(extent_arg_type, 0);
4691    uint32_t outbufsz;
4692    int free_fm = 0;
4693
4694    assert(arg_type[0] == TYPE_PTR);
4695    assert(ie->access == IOC_RW);
4696    arg_type++;
4697    target_size_in = thunk_type_size(arg_type, 0);
4698    argptr = lock_user(VERIFY_READ, arg, target_size_in, 1);
4699    if (!argptr) {
4700        return -TARGET_EFAULT;
4701    }
4702    thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
4703    unlock_user(argptr, arg, 0);
4704    fm = (struct fiemap *)buf_temp;
4705    if (fm->fm_extent_count > FIEMAP_MAX_EXTENTS) {
4706        return -TARGET_EINVAL;
4707    }
4708
4709    outbufsz = sizeof (*fm) +
4710        (sizeof(struct fiemap_extent) * fm->fm_extent_count);
4711
4712    if (outbufsz > MAX_STRUCT_SIZE) {
4713        /* We can't fit all the extents into the fixed size buffer.
4714         * Allocate one that is large enough and use it instead.
4715         */
4716        fm = g_try_malloc(outbufsz);
4717        if (!fm) {
4718            return -TARGET_ENOMEM;
4719        }
4720        memcpy(fm, buf_temp, sizeof(struct fiemap));
4721        free_fm = 1;
4722    }
4723    ret = get_errno(safe_ioctl(fd, ie->host_cmd, fm));
4724    if (!is_error(ret)) {
4725        target_size_out = target_size_in;
4726        /* An extent_count of 0 means we were only counting the extents
4727         * so there are no structs to copy
4728         */
4729        if (fm->fm_extent_count != 0) {
4730            target_size_out += fm->fm_mapped_extents * extent_size;
4731        }
4732        argptr = lock_user(VERIFY_WRITE, arg, target_size_out, 0);
4733        if (!argptr) {
4734            ret = -TARGET_EFAULT;
4735        } else {
4736            /* Convert the struct fiemap */
4737            thunk_convert(argptr, fm, arg_type, THUNK_TARGET);
4738            if (fm->fm_extent_count != 0) {
4739                p = argptr + target_size_in;
4740                /* ...and then all the struct fiemap_extents */
4741                for (i = 0; i < fm->fm_mapped_extents; i++) {
4742                    thunk_convert(p, &fm->fm_extents[i], extent_arg_type,
4743                                  THUNK_TARGET);
4744                    p += extent_size;
4745                }
4746            }
4747            unlock_user(argptr, arg, target_size_out);
4748        }
4749    }
4750    if (free_fm) {
4751        g_free(fm);
4752    }
4753    return ret;
4754}
4755#endif
4756
4757static abi_long do_ioctl_ifconf(const IOCTLEntry *ie, uint8_t *buf_temp,
4758                                int fd, int cmd, abi_long arg)
4759{
4760    const argtype *arg_type = ie->arg_type;
4761    int target_size;
4762    void *argptr;
4763    int ret;
4764    struct ifconf *host_ifconf;
4765    uint32_t outbufsz;
4766    const argtype ifreq_arg_type[] = { MK_STRUCT(STRUCT_sockaddr_ifreq) };
4767    const argtype ifreq_max_type[] = { MK_STRUCT(STRUCT_ifmap_ifreq) };
4768    int target_ifreq_size;
4769    int nb_ifreq;
4770    int free_buf = 0;
4771    int i;
4772    int target_ifc_len;
4773    abi_long target_ifc_buf;
4774    int host_ifc_len;
4775    char *host_ifc_buf;
4776
4777    assert(arg_type[0] == TYPE_PTR);
4778    assert(ie->access == IOC_RW);
4779
4780    arg_type++;
4781    target_size = thunk_type_size(arg_type, 0);
4782
4783    argptr = lock_user(VERIFY_READ, arg, target_size, 1);
4784    if (!argptr)
4785        return -TARGET_EFAULT;
4786    thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
4787    unlock_user(argptr, arg, 0);
4788
4789    host_ifconf = (struct ifconf *)(unsigned long)buf_temp;
4790    target_ifc_buf = (abi_long)(unsigned long)host_ifconf->ifc_buf;
4791    target_ifreq_size = thunk_type_size(ifreq_max_type, 0);
4792
4793    if (target_ifc_buf != 0) {
4794        target_ifc_len = host_ifconf->ifc_len;
4795        nb_ifreq = target_ifc_len / target_ifreq_size;
4796        host_ifc_len = nb_ifreq * sizeof(struct ifreq);
4797
4798        outbufsz = sizeof(*host_ifconf) + host_ifc_len;
4799        if (outbufsz > MAX_STRUCT_SIZE) {
4800            /*
4801             * We can't fit all the extents into the fixed size buffer.
4802             * Allocate one that is large enough and use it instead.
4803             */
4804            host_ifconf = g_try_malloc(outbufsz);
4805            if (!host_ifconf) {
4806                return -TARGET_ENOMEM;
4807            }
4808            memcpy(host_ifconf, buf_temp, sizeof(*host_ifconf));
4809            free_buf = 1;
4810        }
4811        host_ifc_buf = (char *)host_ifconf + sizeof(*host_ifconf);
4812
4813        host_ifconf->ifc_len = host_ifc_len;
4814    } else {
4815      host_ifc_buf = NULL;
4816    }
4817    host_ifconf->ifc_buf = host_ifc_buf;
4818
4819    ret = get_errno(safe_ioctl(fd, ie->host_cmd, host_ifconf));
4820    if (!is_error(ret)) {
4821        /* convert host ifc_len to target ifc_len */
4822
4823        nb_ifreq = host_ifconf->ifc_len / sizeof(struct ifreq);
4824        target_ifc_len = nb_ifreq * target_ifreq_size;
4825        host_ifconf->ifc_len = target_ifc_len;
4826
4827        /* restore target ifc_buf */
4828
4829        host_ifconf->ifc_buf = (char *)(unsigned long)target_ifc_buf;
4830
4831        /* copy struct ifconf to target user */
4832
4833        argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
4834        if (!argptr)
4835            return -TARGET_EFAULT;
4836        thunk_convert(argptr, host_ifconf, arg_type, THUNK_TARGET);
4837        unlock_user(argptr, arg, target_size);
4838
4839        if (target_ifc_buf != 0) {
4840            /* copy ifreq[] to target user */
4841            argptr = lock_user(VERIFY_WRITE, target_ifc_buf, target_ifc_len, 0);
4842            for (i = 0; i < nb_ifreq ; i++) {
4843                thunk_convert(argptr + i * target_ifreq_size,
4844                              host_ifc_buf + i * sizeof(struct ifreq),
4845                              ifreq_arg_type, THUNK_TARGET);
4846            }
4847            unlock_user(argptr, target_ifc_buf, target_ifc_len);
4848        }
4849    }
4850
4851    if (free_buf) {
4852        g_free(host_ifconf);
4853    }
4854
4855    return ret;
4856}
4857
4858#if defined(CONFIG_USBFS)
4859#if HOST_LONG_BITS > 64
4860#error USBDEVFS thunks do not support >64 bit hosts yet.
4861#endif
4862struct live_urb {
4863    uint64_t target_urb_adr;
4864    uint64_t target_buf_adr;
4865    char *target_buf_ptr;
4866    struct usbdevfs_urb host_urb;
4867};
4868
4869static GHashTable *usbdevfs_urb_hashtable(void)
4870{
4871    static GHashTable *urb_hashtable;
4872
4873    if (!urb_hashtable) {
4874        urb_hashtable = g_hash_table_new(g_int64_hash, g_int64_equal);
4875    }
4876    return urb_hashtable;
4877}
4878
4879static void urb_hashtable_insert(struct live_urb *urb)
4880{
4881    GHashTable *urb_hashtable = usbdevfs_urb_hashtable();
4882    g_hash_table_insert(urb_hashtable, urb, urb);
4883}
4884
4885static struct live_urb *urb_hashtable_lookup(uint64_t target_urb_adr)
4886{
4887    GHashTable *urb_hashtable = usbdevfs_urb_hashtable();
4888    return g_hash_table_lookup(urb_hashtable, &target_urb_adr);
4889}
4890
4891static void urb_hashtable_remove(struct live_urb *urb)
4892{
4893    GHashTable *urb_hashtable = usbdevfs_urb_hashtable();
4894    g_hash_table_remove(urb_hashtable, urb);
4895}
4896
4897static abi_long
4898do_ioctl_usbdevfs_reapurb(const IOCTLEntry *ie, uint8_t *buf_temp,
4899                          int fd, int cmd, abi_long arg)
4900{
4901    const argtype usbfsurb_arg_type[] = { MK_STRUCT(STRUCT_usbdevfs_urb) };
4902    const argtype ptrvoid_arg_type[] = { TYPE_PTRVOID, 0, 0 };
4903    struct live_urb *lurb;
4904    void *argptr;
4905    uint64_t hurb;
4906    int target_size;
4907    uintptr_t target_urb_adr;
4908    abi_long ret;
4909
4910    target_size = thunk_type_size(usbfsurb_arg_type, THUNK_TARGET);
4911
4912    memset(buf_temp, 0, sizeof(uint64_t));
4913    ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
4914    if (is_error(ret)) {
4915        return ret;
4916    }
4917
4918    memcpy(&hurb, buf_temp, sizeof(uint64_t));
4919    lurb = (void *)((uintptr_t)hurb - offsetof(struct live_urb, host_urb));
4920    if (!lurb->target_urb_adr) {
4921        return -TARGET_EFAULT;
4922    }
4923    urb_hashtable_remove(lurb);
4924    unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr,
4925        lurb->host_urb.buffer_length);
4926    lurb->target_buf_ptr = NULL;
4927
4928    /* restore the guest buffer pointer */
4929    lurb->host_urb.buffer = (void *)(uintptr_t)lurb->target_buf_adr;
4930
4931    /* update the guest urb struct */
4932    argptr = lock_user(VERIFY_WRITE, lurb->target_urb_adr, target_size, 0);
4933    if (!argptr) {
4934        g_free(lurb);
4935        return -TARGET_EFAULT;
4936    }
4937    thunk_convert(argptr, &lurb->host_urb, usbfsurb_arg_type, THUNK_TARGET);
4938    unlock_user(argptr, lurb->target_urb_adr, target_size);
4939
4940    target_size = thunk_type_size(ptrvoid_arg_type, THUNK_TARGET);
4941    /* write back the urb handle */
4942    argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
4943    if (!argptr) {
4944        g_free(lurb);
4945        return -TARGET_EFAULT;
4946    }
4947
4948    /* GHashTable uses 64-bit keys but thunk_convert expects uintptr_t */
4949    target_urb_adr = lurb->target_urb_adr;
4950    thunk_convert(argptr, &target_urb_adr, ptrvoid_arg_type, THUNK_TARGET);
4951    unlock_user(argptr, arg, target_size);
4952
4953    g_free(lurb);
4954    return ret;
4955}
4956
4957static abi_long
4958do_ioctl_usbdevfs_discardurb(const IOCTLEntry *ie,
4959                             uint8_t *buf_temp __attribute__((unused)),
4960                             int fd, int cmd, abi_long arg)
4961{
4962    struct live_urb *lurb;
4963
4964    /* map target address back to host URB with metadata. */
4965    lurb = urb_hashtable_lookup(arg);
4966    if (!lurb) {
4967        return -TARGET_EFAULT;
4968    }
4969    return get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb));
4970}
4971
4972static abi_long
4973do_ioctl_usbdevfs_submiturb(const IOCTLEntry *ie, uint8_t *buf_temp,
4974                            int fd, int cmd, abi_long arg)
4975{
4976    const argtype *arg_type = ie->arg_type;
4977    int target_size;
4978    abi_long ret;
4979    void *argptr;
4980    int rw_dir;
4981    struct live_urb *lurb;
4982
4983    /*
4984     * each submitted URB needs to map to a unique ID for the
4985     * kernel, and that unique ID needs to be a pointer to
4986     * host memory.  hence, we need to malloc for each URB.
4987     * isochronous transfers have a variable length struct.
4988     */
4989    arg_type++;
4990    target_size = thunk_type_size(arg_type, THUNK_TARGET);
4991
4992    /* construct host copy of urb and metadata */
4993    lurb = g_try_new0(struct live_urb, 1);
4994    if (!lurb) {
4995        return -TARGET_ENOMEM;
4996    }
4997
4998    argptr = lock_user(VERIFY_READ, arg, target_size, 1);
4999    if (!argptr) {
5000        g_free(lurb);
5001        return -TARGET_EFAULT;
5002    }
5003    thunk_convert(&lurb->host_urb, argptr, arg_type, THUNK_HOST);
5004    unlock_user(argptr, arg, 0);
5005
5006    lurb->target_urb_adr = arg;
5007    lurb->target_buf_adr = (uintptr_t)lurb->host_urb.buffer;
5008
5009    /* buffer space used depends on endpoint type so lock the entire buffer */
5010    /* control type urbs should check the buffer contents for true direction */
5011    rw_dir = lurb->host_urb.endpoint & USB_DIR_IN ? VERIFY_WRITE : VERIFY_READ;
5012    lurb->target_buf_ptr = lock_user(rw_dir, lurb->target_buf_adr,
5013        lurb->host_urb.buffer_length, 1);
5014    if (lurb->target_buf_ptr == NULL) {
5015        g_free(lurb);
5016        return -TARGET_EFAULT;
5017    }
5018
5019    /* update buffer pointer in host copy */
5020    lurb->host_urb.buffer = lurb->target_buf_ptr;
5021
5022    ret = get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb));
5023    if (is_error(ret)) {
5024        unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr, 0);
5025        g_free(lurb);
5026    } else {
5027        urb_hashtable_insert(lurb);
5028    }
5029
5030    return ret;
5031}
5032#endif /* CONFIG_USBFS */
5033
5034static abi_long do_ioctl_dm(const IOCTLEntry *ie, uint8_t *buf_temp, int fd,
5035                            int cmd, abi_long arg)
5036{
5037    void *argptr;
5038    struct dm_ioctl *host_dm;
5039    abi_long guest_data;
5040    uint32_t guest_data_size;
5041    int target_size;
5042    const argtype *arg_type = ie->arg_type;
5043    abi_long ret;
5044    void *big_buf = NULL;
5045    char *host_data;
5046
5047    arg_type++;
5048    target_size = thunk_type_size(arg_type, 0);
5049    argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5050    if (!argptr) {
5051        ret = -TARGET_EFAULT;
5052        goto out;
5053    }
5054    thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
5055    unlock_user(argptr, arg, 0);
5056
5057    /* buf_temp is too small, so fetch things into a bigger buffer */
5058    big_buf = g_malloc0(((struct dm_ioctl*)buf_temp)->data_size * 2);
5059    memcpy(big_buf, buf_temp, target_size);
5060    buf_temp = big_buf;
5061    host_dm = big_buf;
5062
5063    guest_data = arg + host_dm->data_start;
5064    if ((guest_data - arg) < 0) {
5065        ret = -TARGET_EINVAL;
5066        goto out;
5067    }
5068    guest_data_size = host_dm->data_size - host_dm->data_start;
5069    host_data = (char*)host_dm + host_dm->data_start;
5070
5071    argptr = lock_user(VERIFY_READ, guest_data, guest_data_size, 1);
5072    if (!argptr) {
5073        ret = -TARGET_EFAULT;
5074        goto out;
5075    }
5076
5077    switch (ie->host_cmd) {
5078    case DM_REMOVE_ALL:
5079    case DM_LIST_DEVICES:
5080    case DM_DEV_CREATE:
5081    case DM_DEV_REMOVE:
5082    case DM_DEV_SUSPEND:
5083    case DM_DEV_STATUS:
5084    case DM_DEV_WAIT:
5085    case DM_TABLE_STATUS:
5086    case DM_TABLE_CLEAR:
5087    case DM_TABLE_DEPS:
5088    case DM_LIST_VERSIONS:
5089        /* no input data */
5090        break;
5091    case DM_DEV_RENAME:
5092    case DM_DEV_SET_GEOMETRY:
5093        /* data contains only strings */
5094        memcpy(host_data, argptr, guest_data_size);
5095        break;
5096    case DM_TARGET_MSG:
5097        memcpy(host_data, argptr, guest_data_size);
5098        *(uint64_t*)host_data = tswap64(*(uint64_t*)argptr);
5099        break;
5100    case DM_TABLE_LOAD:
5101    {
5102        void *gspec = argptr;
5103        void *cur_data = host_data;
5104        const argtype dm_arg_type[] = { MK_STRUCT(STRUCT_dm_target_spec) };
5105        int spec_size = thunk_type_size(dm_arg_type, 0);
5106        int i;
5107
5108        for (i = 0; i < host_dm->target_count; i++) {
5109            struct dm_target_spec *spec = cur_data;
5110            uint32_t next;
5111            int slen;
5112
5113            thunk_convert(spec, gspec, dm_arg_type, THUNK_HOST);
5114            slen = strlen((char*)gspec + spec_size) + 1;
5115            next = spec->next;
5116            spec->next = sizeof(*spec) + slen;
5117            strcpy((char*)&spec[1], gspec + spec_size);
5118            gspec += next;
5119            cur_data += spec->next;
5120        }
5121        break;
5122    }
5123    default:
5124        ret = -TARGET_EINVAL;
5125        unlock_user(argptr, guest_data, 0);
5126        goto out;
5127    }
5128    unlock_user(argptr, guest_data, 0);
5129
5130    ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5131    if (!is_error(ret)) {
5132        guest_data = arg + host_dm->data_start;
5133        guest_data_size = host_dm->data_size - host_dm->data_start;
5134        argptr = lock_user(VERIFY_WRITE, guest_data, guest_data_size, 0);
5135        switch (ie->host_cmd) {
5136        case DM_REMOVE_ALL:
5137        case DM_DEV_CREATE:
5138        case DM_DEV_REMOVE:
5139        case DM_DEV_RENAME:
5140        case DM_DEV_SUSPEND:
5141        case DM_DEV_STATUS:
5142        case DM_TABLE_LOAD:
5143        case DM_TABLE_CLEAR:
5144        case DM_TARGET_MSG:
5145        case DM_DEV_SET_GEOMETRY:
5146            /* no return data */
5147            break;
5148        case DM_LIST_DEVICES:
5149        {
5150            struct dm_name_list *nl = (void*)host_dm + host_dm->data_start;
5151            uint32_t remaining_data = guest_data_size;
5152            void *cur_data = argptr;
5153            const argtype dm_arg_type[] = { MK_STRUCT(STRUCT_dm_name_list) };
5154            int nl_size = 12; /* can't use thunk_size due to alignment */
5155
5156            while (1) {
5157                uint32_t next = nl->next;
5158                if (next) {
5159                    nl->next = nl_size + (strlen(nl->name) + 1);
5160                }
5161                if (remaining_data < nl->next) {
5162                    host_dm->flags |= DM_BUFFER_FULL_FLAG;
5163                    break;
5164                }
5165                thunk_convert(cur_data, nl, dm_arg_type, THUNK_TARGET);
5166                strcpy(cur_data + nl_size, nl->name);
5167                cur_data += nl->next;
5168                remaining_data -= nl->next;
5169                if (!next) {
5170                    break;
5171                }
5172                nl = (void*)nl + next;
5173            }
5174            break;
5175        }
5176        case DM_DEV_WAIT:
5177        case DM_TABLE_STATUS:
5178        {
5179            struct dm_target_spec *spec = (void*)host_dm + host_dm->data_start;
5180            void *cur_data = argptr;
5181            const argtype dm_arg_type[] = { MK_STRUCT(STRUCT_dm_target_spec) };
5182            int spec_size = thunk_type_size(dm_arg_type, 0);
5183            int i;
5184
5185            for (i = 0; i < host_dm->target_count; i++) {
5186                uint32_t next = spec->next;
5187                int slen = strlen((char*)&spec[1]) + 1;
5188                spec->next = (cur_data - argptr) + spec_size + slen;
5189                if (guest_data_size < spec->next) {
5190                    host_dm->flags |= DM_BUFFER_FULL_FLAG;
5191                    break;
5192                }
5193                thunk_convert(cur_data, spec, dm_arg_type, THUNK_TARGET);
5194                strcpy(cur_data + spec_size, (char*)&spec[1]);
5195                cur_data = argptr + spec->next;
5196                spec = (void*)host_dm + host_dm->data_start + next;
5197            }
5198            break;
5199        }
5200        case DM_TABLE_DEPS:
5201        {
5202            void *hdata = (void*)host_dm + host_dm->data_start;
5203            int count = *(uint32_t*)hdata;
5204            uint64_t *hdev = hdata + 8;
5205            uint64_t *gdev = argptr + 8;
5206            int i;
5207
5208            *(uint32_t*)argptr = tswap32(count);
5209            for (i = 0; i < count; i++) {
5210                *gdev = tswap64(*hdev);
5211                gdev++;
5212                hdev++;
5213            }
5214            break;
5215        }
5216        case DM_LIST_VERSIONS:
5217        {
5218            struct dm_target_versions *vers = (void*)host_dm + host_dm->data_start;
5219            uint32_t remaining_data = guest_data_size;
5220            void *cur_data = argptr;
5221            const argtype dm_arg_type[] = { MK_STRUCT(STRUCT_dm_target_versions) };
5222            int vers_size = thunk_type_size(dm_arg_type, 0);
5223
5224            while (1) {
5225                uint32_t next = vers->next;
5226                if (next) {
5227                    vers->next = vers_size + (strlen(vers->name) + 1);
5228                }
5229                if (remaining_data < vers->next) {
5230                    host_dm->flags |= DM_BUFFER_FULL_FLAG;
5231                    break;
5232                }
5233                thunk_convert(cur_data, vers, dm_arg_type, THUNK_TARGET);
5234                strcpy(cur_data + vers_size, vers->name);
5235                cur_data += vers->next;
5236                remaining_data -= vers->next;
5237                if (!next) {
5238                    break;
5239                }
5240                vers = (void*)vers + next;
5241            }
5242            break;
5243        }
5244        default:
5245            unlock_user(argptr, guest_data, 0);
5246            ret = -TARGET_EINVAL;
5247            goto out;
5248        }
5249        unlock_user(argptr, guest_data, guest_data_size);
5250
5251        argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
5252        if (!argptr) {
5253            ret = -TARGET_EFAULT;
5254            goto out;
5255        }
5256        thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
5257        unlock_user(argptr, arg, target_size);
5258    }
5259out:
5260    g_free(big_buf);
5261    return ret;
5262}
5263
5264static abi_long do_ioctl_blkpg(const IOCTLEntry *ie, uint8_t *buf_temp, int fd,
5265                               int cmd, abi_long arg)
5266{
5267    void *argptr;
5268    int target_size;
5269    const argtype *arg_type = ie->arg_type;
5270    const argtype part_arg_type[] = { MK_STRUCT(STRUCT_blkpg_partition) };
5271    abi_long ret;
5272
5273    struct blkpg_ioctl_arg *host_blkpg = (void*)buf_temp;
5274    struct blkpg_partition host_part;
5275
5276    /* Read and convert blkpg */
5277    arg_type++;
5278    target_size = thunk_type_size(arg_type, 0);
5279    argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5280    if (!argptr) {
5281        ret = -TARGET_EFAULT;
5282        goto out;
5283    }
5284    thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
5285    unlock_user(argptr, arg, 0);
5286
5287    switch (host_blkpg->op) {
5288    case BLKPG_ADD_PARTITION:
5289    case BLKPG_DEL_PARTITION:
5290        /* payload is struct blkpg_partition */
5291        break;
5292    default:
5293        /* Unknown opcode */
5294        ret = -TARGET_EINVAL;
5295        goto out;
5296    }
5297
5298    /* Read and convert blkpg->data */
5299    arg = (abi_long)(uintptr_t)host_blkpg->data;
5300    target_size = thunk_type_size(part_arg_type, 0);
5301    argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5302    if (!argptr) {
5303        ret = -TARGET_EFAULT;
5304        goto out;
5305    }
5306    thunk_convert(&host_part, argptr, part_arg_type, THUNK_HOST);
5307    unlock_user(argptr, arg, 0);
5308
5309    /* Swizzle the data pointer to our local copy and call! */
5310    host_blkpg->data = &host_part;
5311    ret = get_errno(safe_ioctl(fd, ie->host_cmd, host_blkpg));
5312
5313out:
5314    return ret;
5315}
5316
5317static abi_long do_ioctl_rt(const IOCTLEntry *ie, uint8_t *buf_temp,
5318                                int fd, int cmd, abi_long arg)
5319{
5320    const argtype *arg_type = ie->arg_type;
5321    const StructEntry *se;
5322    const argtype *field_types;
5323    const int *dst_offsets, *src_offsets;
5324    int target_size;
5325    void *argptr;
5326    abi_ulong *target_rt_dev_ptr = NULL;
5327    unsigned long *host_rt_dev_ptr = NULL;
5328    abi_long ret;
5329    int i;
5330
5331    assert(ie->access == IOC_W);
5332    assert(*arg_type == TYPE_PTR);
5333    arg_type++;
5334    assert(*arg_type == TYPE_STRUCT);
5335    target_size = thunk_type_size(arg_type, 0);
5336    argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5337    if (!argptr) {
5338        return -TARGET_EFAULT;
5339    }
5340    arg_type++;
5341    assert(*arg_type == (int)STRUCT_rtentry);
5342    se = struct_entries + *arg_type++;
5343    assert(se->convert[0] == NULL);
5344    /* convert struct here to be able to catch rt_dev string */
5345    field_types = se->field_types;
5346    dst_offsets = se->field_offsets[THUNK_HOST];
5347    src_offsets = se->field_offsets[THUNK_TARGET];
5348    for (i = 0; i < se->nb_fields; i++) {
5349        if (dst_offsets[i] == offsetof(struct rtentry, rt_dev)) {
5350            assert(*field_types == TYPE_PTRVOID);
5351            target_rt_dev_ptr = argptr + src_offsets[i];
5352            host_rt_dev_ptr = (unsigned long *)(buf_temp + dst_offsets[i]);
5353            if (*target_rt_dev_ptr != 0) {
5354                *host_rt_dev_ptr = (unsigned long)lock_user_string(
5355                                                  tswapal(*target_rt_dev_ptr));
5356                if (!*host_rt_dev_ptr) {
5357                    unlock_user(argptr, arg, 0);
5358                    return -TARGET_EFAULT;
5359                }
5360            } else {
5361                *host_rt_dev_ptr = 0;
5362            }
5363            field_types++;
5364            continue;
5365        }
5366        field_types = thunk_convert(buf_temp + dst_offsets[i],
5367                                    argptr + src_offsets[i],
5368                                    field_types, THUNK_HOST);
5369    }
5370    unlock_user(argptr, arg, 0);
5371
5372    ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5373
5374    assert(host_rt_dev_ptr != NULL);
5375    assert(target_rt_dev_ptr != NULL);
5376    if (*host_rt_dev_ptr != 0) {
5377        unlock_user((void *)*host_rt_dev_ptr,
5378                    *target_rt_dev_ptr, 0);
5379    }
5380    return ret;
5381}
5382
5383static abi_long do_ioctl_kdsigaccept(const IOCTLEntry *ie, uint8_t *buf_temp,
5384                                     int fd, int cmd, abi_long arg)
5385{
5386    int sig = target_to_host_signal(arg);
5387    return get_errno(safe_ioctl(fd, ie->host_cmd, sig));
5388}
5389
5390static abi_long do_ioctl_SIOCGSTAMP(const IOCTLEntry *ie, uint8_t *buf_temp,
5391                                    int fd, int cmd, abi_long arg)
5392{
5393    struct timeval tv;
5394    abi_long ret;
5395
5396    ret = get_errno(safe_ioctl(fd, SIOCGSTAMP, &tv));
5397    if (is_error(ret)) {
5398        return ret;
5399    }
5400
5401    if (cmd == (int)TARGET_SIOCGSTAMP_OLD) {
5402        if (copy_to_user_timeval(arg, &tv)) {
5403            return -TARGET_EFAULT;
5404        }
5405    } else {
5406        if (copy_to_user_timeval64(arg, &tv)) {
5407            return -TARGET_EFAULT;
5408        }
5409    }
5410
5411    return ret;
5412}
5413
5414static abi_long do_ioctl_SIOCGSTAMPNS(const IOCTLEntry *ie, uint8_t *buf_temp,
5415                                      int fd, int cmd, abi_long arg)
5416{
5417    struct timespec ts;
5418    abi_long ret;
5419
5420    ret = get_errno(safe_ioctl(fd, SIOCGSTAMPNS, &ts));
5421    if (is_error(ret)) {
5422        return ret;
5423    }
5424
5425    if (cmd == (int)TARGET_SIOCGSTAMPNS_OLD) {
5426        if (host_to_target_timespec(arg, &ts)) {
5427            return -TARGET_EFAULT;
5428        }
5429    } else{
5430        if (host_to_target_timespec64(arg, &ts)) {
5431            return -TARGET_EFAULT;
5432        }
5433    }
5434
5435    return ret;
5436}
5437
5438#ifdef TIOCGPTPEER
5439static abi_long do_ioctl_tiocgptpeer(const IOCTLEntry *ie, uint8_t *buf_temp,
5440                                     int fd, int cmd, abi_long arg)
5441{
5442    int flags = target_to_host_bitmask(arg, fcntl_flags_tbl);
5443    return get_errno(safe_ioctl(fd, ie->host_cmd, flags));
5444}
5445#endif
5446
5447#ifdef HAVE_DRM_H
5448
5449static void unlock_drm_version(struct drm_version *host_ver,
5450                               struct target_drm_version *target_ver,
5451                               bool copy)
5452{
5453    unlock_user(host_ver->name, target_ver->name,
5454                                copy ? host_ver->name_len : 0);
5455    unlock_user(host_ver->date, target_ver->date,
5456                                copy ? host_ver->date_len : 0);
5457    unlock_user(host_ver->desc, target_ver->desc,
5458                                copy ? host_ver->desc_len : 0);
5459}
5460
5461static inline abi_long target_to_host_drmversion(struct drm_version *host_ver,
5462                                          struct target_drm_version *target_ver)
5463{
5464    memset(host_ver, 0, sizeof(*host_ver));
5465
5466    __get_user(host_ver->name_len, &target_ver->name_len);
5467    if (host_ver->name_len) {
5468        host_ver->name = lock_user(VERIFY_WRITE, target_ver->name,
5469                                   target_ver->name_len, 0);
5470        if (!host_ver->name) {
5471            return -EFAULT;
5472        }
5473    }
5474
5475    __get_user(host_ver->date_len, &target_ver->date_len);
5476    if (host_ver->date_len) {
5477        host_ver->date = lock_user(VERIFY_WRITE, target_ver->date,
5478                                   target_ver->date_len, 0);
5479        if (!host_ver->date) {
5480            goto err;
5481        }
5482    }
5483
5484    __get_user(host_ver->desc_len, &target_ver->desc_len);
5485    if (host_ver->desc_len) {
5486        host_ver->desc = lock_user(VERIFY_WRITE, target_ver->desc,
5487                                   target_ver->desc_len, 0);
5488        if (!host_ver->desc) {
5489            goto err;
5490        }
5491    }
5492
5493    return 0;
5494err:
5495    unlock_drm_version(host_ver, target_ver, false);
5496    return -EFAULT;
5497}
5498
5499static inline void host_to_target_drmversion(
5500                                          struct target_drm_version *target_ver,
5501                                          struct drm_version *host_ver)
5502{
5503    __put_user(host_ver->version_major, &target_ver->version_major);
5504    __put_user(host_ver->version_minor, &target_ver->version_minor);
5505    __put_user(host_ver->version_patchlevel, &target_ver->version_patchlevel);
5506    __put_user(host_ver->name_len, &target_ver->name_len);
5507    __put_user(host_ver->date_len, &target_ver->date_len);
5508    __put_user(host_ver->desc_len, &target_ver->desc_len);
5509    unlock_drm_version(host_ver, target_ver, true);
5510}
5511
5512static abi_long do_ioctl_drm(const IOCTLEntry *ie, uint8_t *buf_temp,
5513                             int fd, int cmd, abi_long arg)
5514{
5515    struct drm_version *ver;
5516    struct target_drm_version *target_ver;
5517    abi_long ret;
5518
5519    switch (ie->host_cmd) {
5520    case DRM_IOCTL_VERSION:
5521        if (!lock_user_struct(VERIFY_WRITE, target_ver, arg, 0)) {
5522            return -TARGET_EFAULT;
5523        }
5524        ver = (struct drm_version *)buf_temp;
5525        ret = target_to_host_drmversion(ver, target_ver);
5526        if (!is_error(ret)) {
5527            ret = get_errno(safe_ioctl(fd, ie->host_cmd, ver));
5528            if (is_error(ret)) {
5529                unlock_drm_version(ver, target_ver, false);
5530            } else {
5531                host_to_target_drmversion(target_ver, ver);
5532            }
5533        }
5534        unlock_user_struct(target_ver, arg, 0);
5535        return ret;
5536    }
5537    return -TARGET_ENOSYS;
5538}
5539
5540static abi_long do_ioctl_drm_i915_getparam(const IOCTLEntry *ie,
5541                                           struct drm_i915_getparam *gparam,
5542                                           int fd, abi_long arg)
5543{
5544    abi_long ret;
5545    int value;
5546    struct target_drm_i915_getparam *target_gparam;
5547
5548    if (!lock_user_struct(VERIFY_READ, target_gparam, arg, 0)) {
5549        return -TARGET_EFAULT;
5550    }
5551
5552    __get_user(gparam->param, &target_gparam->param);
5553    gparam->value = &value;
5554    ret = get_errno(safe_ioctl(fd, ie->host_cmd, gparam));
5555    put_user_s32(value, target_gparam->value);
5556
5557    unlock_user_struct(target_gparam, arg, 0);
5558    return ret;
5559}
5560
5561static abi_long do_ioctl_drm_i915(const IOCTLEntry *ie, uint8_t *buf_temp,
5562                                  int fd, int cmd, abi_long arg)
5563{
5564    switch (ie->host_cmd) {
5565    case DRM_IOCTL_I915_GETPARAM:
5566        return do_ioctl_drm_i915_getparam(ie,
5567                                          (struct drm_i915_getparam *)buf_temp,
5568                                          fd, arg);
5569    default:
5570        return -TARGET_ENOSYS;
5571    }
5572}
5573
5574#endif
5575
5576static abi_long do_ioctl_TUNSETTXFILTER(const IOCTLEntry *ie, uint8_t *buf_temp,
5577                                        int fd, int cmd, abi_long arg)
5578{
5579    struct tun_filter *filter = (struct tun_filter *)buf_temp;
5580    struct tun_filter *target_filter;
5581    char *target_addr;
5582
5583    assert(ie->access == IOC_W);
5584
5585    target_filter = lock_user(VERIFY_READ, arg, sizeof(*target_filter), 1);
5586    if (!target_filter) {
5587        return -TARGET_EFAULT;
5588    }
5589    filter->flags = tswap16(target_filter->flags);
5590    filter->count = tswap16(target_filter->count);
5591    unlock_user(target_filter, arg, 0);
5592
5593    if (filter->count) {
5594        if (offsetof(struct tun_filter, addr) + filter->count * ETH_ALEN >
5595            MAX_STRUCT_SIZE) {
5596            return -TARGET_EFAULT;
5597        }
5598
5599        target_addr = lock_user(VERIFY_READ,
5600                                arg + offsetof(struct tun_filter, addr),
5601                                filter->count * ETH_ALEN, 1);
5602        if (!target_addr) {
5603            return -TARGET_EFAULT;
5604        }
5605        memcpy(filter->addr, target_addr, filter->count * ETH_ALEN);
5606        unlock_user(target_addr, arg + offsetof(struct tun_filter, addr), 0);
5607    }
5608
5609    return get_errno(safe_ioctl(fd, ie->host_cmd, filter));
5610}
5611
5612IOCTLEntry ioctl_entries[] = {
5613#define IOCTL(cmd, access, ...) \
5614    { TARGET_ ## cmd, cmd, #cmd, access, 0, {  __VA_ARGS__ } },
5615#define IOCTL_SPECIAL(cmd, access, dofn, ...)                      \
5616    { TARGET_ ## cmd, cmd, #cmd, access, dofn, {  __VA_ARGS__ } },
5617#define IOCTL_IGNORE(cmd) \
5618    { TARGET_ ## cmd, 0, #cmd },
5619#include "ioctls.h"
5620    { 0, 0, },
5621};
5622
5623/* ??? Implement proper locking for ioctls.  */
5624/* do_ioctl() Must return target values and target errnos. */
5625static abi_long do_ioctl(int fd, int cmd, abi_long arg)
5626{
5627    const IOCTLEntry *ie;
5628    const argtype *arg_type;
5629    abi_long ret;
5630    uint8_t buf_temp[MAX_STRUCT_SIZE];
5631    int target_size;
5632    void *argptr;
5633
5634    ie = ioctl_entries;
5635    for(;;) {
5636        if (ie->target_cmd == 0) {
5637            qemu_log_mask(
5638                LOG_UNIMP, "Unsupported ioctl: cmd=0x%04lx\n", (long)cmd);
5639            return -TARGET_ENOTTY;
5640        }
5641        if (ie->target_cmd == cmd)
5642            break;
5643        ie++;
5644    }
5645    arg_type = ie->arg_type;
5646    if (ie->do_ioctl) {
5647        return ie->do_ioctl(ie, buf_temp, fd, cmd, arg);
5648    } else if (!ie->host_cmd) {
5649        /* Some architectures define BSD ioctls in their headers
5650           that are not implemented in Linux.  */
5651        return -TARGET_ENOTTY;
5652    }
5653
5654    switch(arg_type[0]) {
5655    case TYPE_NULL:
5656        /* no argument */
5657        ret = get_errno(safe_ioctl(fd, ie->host_cmd));
5658        break;
5659    case TYPE_PTRVOID:
5660    case TYPE_INT:
5661    case TYPE_LONG:
5662    case TYPE_ULONG:
5663        ret = get_errno(safe_ioctl(fd, ie->host_cmd, arg));
5664        break;
5665    case TYPE_PTR:
5666        arg_type++;
5667        target_size = thunk_type_size(arg_type, 0);
5668        switch(ie->access) {
5669        case IOC_R:
5670            ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5671            if (!is_error(ret)) {
5672                argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
5673                if (!argptr)
5674                    return -TARGET_EFAULT;
5675                thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
5676                unlock_user(argptr, arg, target_size);
5677            }
5678            break;
5679        case IOC_W:
5680            argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5681            if (!argptr)
5682                return -TARGET_EFAULT;
5683            thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
5684            unlock_user(argptr, arg, 0);
5685            ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5686            break;
5687        default:
5688        case IOC_RW:
5689            argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5690            if (!argptr)
5691                return -TARGET_EFAULT;
5692            thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
5693            unlock_user(argptr, arg, 0);
5694            ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5695            if (!is_error(ret)) {
5696                argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
5697                if (!argptr)
5698                    return -TARGET_EFAULT;
5699                thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
5700                unlock_user(argptr, arg, target_size);
5701            }
5702            break;
5703        }
5704        break;
5705    default:
5706        qemu_log_mask(LOG_UNIMP,
5707                      "Unsupported ioctl type: cmd=0x%04lx type=%d\n",
5708                      (long)cmd, arg_type[0]);
5709        ret = -TARGET_ENOTTY;
5710        break;
5711    }
5712    return ret;
5713}
5714
5715static const bitmask_transtbl iflag_tbl[] = {
5716        { TARGET_IGNBRK, TARGET_IGNBRK, IGNBRK, IGNBRK },
5717        { TARGET_BRKINT, TARGET_BRKINT, BRKINT, BRKINT },
5718        { TARGET_IGNPAR, TARGET_IGNPAR, IGNPAR, IGNPAR },
5719        { TARGET_PARMRK, TARGET_PARMRK, PARMRK, PARMRK },
5720        { TARGET_INPCK, TARGET_INPCK, INPCK, INPCK },
5721        { TARGET_ISTRIP, TARGET_ISTRIP, ISTRIP, ISTRIP },
5722        { TARGET_INLCR, TARGET_INLCR, INLCR, INLCR },
5723        { TARGET_IGNCR, TARGET_IGNCR, IGNCR, IGNCR },
5724        { TARGET_ICRNL, TARGET_ICRNL, ICRNL, ICRNL },
5725        { TARGET_IUCLC, TARGET_IUCLC, IUCLC, IUCLC },
5726        { TARGET_IXON, TARGET_IXON, IXON, IXON },
5727        { TARGET_IXANY, TARGET_IXANY, IXANY, IXANY },
5728        { TARGET_IXOFF, TARGET_IXOFF, IXOFF, IXOFF },
5729        { TARGET_IMAXBEL, TARGET_IMAXBEL, IMAXBEL, IMAXBEL },
5730        { TARGET_IUTF8, TARGET_IUTF8, IUTF8, IUTF8},
5731};
5732
5733static const bitmask_transtbl oflag_tbl[] = {
5734        { TARGET_OPOST, TARGET_OPOST, OPOST, OPOST },
5735        { TARGET_OLCUC, TARGET_OLCUC, OLCUC, OLCUC },
5736        { TARGET_ONLCR, TARGET_ONLCR, ONLCR, ONLCR },
5737        { TARGET_OCRNL, TARGET_OCRNL, OCRNL, OCRNL },
5738        { TARGET_ONOCR, TARGET_ONOCR, ONOCR, ONOCR },
5739        { TARGET_ONLRET, TARGET_ONLRET, ONLRET, ONLRET },
5740        { TARGET_OFILL, TARGET_OFILL, OFILL, OFILL },
5741        { TARGET_OFDEL, TARGET_OFDEL, OFDEL, OFDEL },
5742        { TARGET_NLDLY, TARGET_NL0, NLDLY, NL0 },
5743        { TARGET_NLDLY, TARGET_NL1, NLDLY, NL1 },
5744        { TARGET_CRDLY, TARGET_CR0, CRDLY, CR0 },
5745        { TARGET_CRDLY, TARGET_CR1, CRDLY, CR1 },
5746        { TARGET_CRDLY, TARGET_CR2, CRDLY, CR2 },
5747        { TARGET_CRDLY, TARGET_CR3, CRDLY, CR3 },
5748        { TARGET_TABDLY, TARGET_TAB0, TABDLY, TAB0 },
5749        { TARGET_TABDLY, TARGET_TAB1, TABDLY, TAB1 },
5750        { TARGET_TABDLY, TARGET_TAB2, TABDLY, TAB2 },
5751        { TARGET_TABDLY, TARGET_TAB3, TABDLY, TAB3 },
5752        { TARGET_BSDLY, TARGET_BS0, BSDLY, BS0 },
5753        { TARGET_BSDLY, TARGET_BS1, BSDLY, BS1 },
5754        { TARGET_VTDLY, TARGET_VT0, VTDLY, VT0 },
5755        { TARGET_VTDLY, TARGET_VT1, VTDLY, VT1 },
5756        { TARGET_FFDLY, TARGET_FF0, FFDLY, FF0 },
5757        { TARGET_FFDLY, TARGET_FF1, FFDLY, FF1 },
5758};
5759
5760static const bitmask_transtbl cflag_tbl[] = {
5761        { TARGET_CBAUD, TARGET_B0, CBAUD, B0 },
5762        { TARGET_CBAUD, TARGET_B50, CBAUD, B50 },
5763        { TARGET_CBAUD, TARGET_B75, CBAUD, B75 },
5764        { TARGET_CBAUD, TARGET_B110, CBAUD, B110 },
5765        { TARGET_CBAUD, TARGET_B134, CBAUD, B134 },
5766        { TARGET_CBAUD, TARGET_B150, CBAUD, B150 },
5767        { TARGET_CBAUD, TARGET_B200, CBAUD, B200 },
5768        { TARGET_CBAUD, TARGET_B300, CBAUD, B300 },
5769        { TARGET_CBAUD, TARGET_B600, CBAUD, B600 },
5770        { TARGET_CBAUD, TARGET_B1200, CBAUD, B1200 },
5771        { TARGET_CBAUD, TARGET_B1800, CBAUD, B1800 },
5772        { TARGET_CBAUD, TARGET_B2400, CBAUD, B2400 },
5773        { TARGET_CBAUD, TARGET_B4800, CBAUD, B4800 },
5774        { TARGET_CBAUD, TARGET_B9600, CBAUD, B9600 },
5775        { TARGET_CBAUD, TARGET_B19200, CBAUD, B19200 },
5776        { TARGET_CBAUD, TARGET_B38400, CBAUD, B38400 },
5777        { TARGET_CBAUD, TARGET_B57600, CBAUD, B57600 },
5778        { TARGET_CBAUD, TARGET_B115200, CBAUD, B115200 },
5779        { TARGET_CBAUD, TARGET_B230400, CBAUD, B230400 },
5780        { TARGET_CBAUD, TARGET_B460800, CBAUD, B460800 },
5781        { TARGET_CSIZE, TARGET_CS5, CSIZE, CS5 },
5782        { TARGET_CSIZE, TARGET_CS6, CSIZE, CS6 },
5783        { TARGET_CSIZE, TARGET_CS7, CSIZE, CS7 },
5784        { TARGET_CSIZE, TARGET_CS8, CSIZE, CS8 },
5785        { TARGET_CSTOPB, TARGET_CSTOPB, CSTOPB, CSTOPB },
5786        { TARGET_CREAD, TARGET_CREAD, CREAD, CREAD },
5787        { TARGET_PARENB, TARGET_PARENB, PARENB, PARENB },
5788        { TARGET_PARODD, TARGET_PARODD, PARODD, PARODD },
5789        { TARGET_HUPCL, TARGET_HUPCL, HUPCL, HUPCL },
5790        { TARGET_CLOCAL, TARGET_CLOCAL, CLOCAL, CLOCAL },
5791        { TARGET_CRTSCTS, TARGET_CRTSCTS, CRTSCTS, CRTSCTS },
5792};
5793
5794static const bitmask_transtbl lflag_tbl[] = {
5795  { TARGET_ISIG, TARGET_ISIG, ISIG, ISIG },
5796  { TARGET_ICANON, TARGET_ICANON, ICANON, ICANON },
5797  { TARGET_XCASE, TARGET_XCASE, XCASE, XCASE },
5798  { TARGET_ECHO, TARGET_ECHO, ECHO, ECHO },
5799  { TARGET_ECHOE, TARGET_ECHOE, ECHOE, ECHOE },
5800  { TARGET_ECHOK, TARGET_ECHOK, ECHOK, ECHOK },
5801  { TARGET_ECHONL, TARGET_ECHONL, ECHONL, ECHONL },
5802  { TARGET_NOFLSH, TARGET_NOFLSH, NOFLSH, NOFLSH },
5803  { TARGET_TOSTOP, TARGET_TOSTOP, TOSTOP, TOSTOP },
5804  { TARGET_ECHOCTL, TARGET_ECHOCTL, ECHOCTL, ECHOCTL },
5805  { TARGET_ECHOPRT, TARGET_ECHOPRT, ECHOPRT, ECHOPRT },
5806  { TARGET_ECHOKE, TARGET_ECHOKE, ECHOKE, ECHOKE },
5807  { TARGET_FLUSHO, TARGET_FLUSHO, FLUSHO, FLUSHO },
5808  { TARGET_PENDIN, TARGET_PENDIN, PENDIN, PENDIN },
5809  { TARGET_IEXTEN, TARGET_IEXTEN, IEXTEN, IEXTEN },
5810  { TARGET_EXTPROC, TARGET_EXTPROC, EXTPROC, EXTPROC},
5811};
5812
5813static void target_to_host_termios (void *dst, const void *src)
5814{
5815    struct host_termios *host = dst;
5816    const struct target_termios *target = src;
5817
5818    host->c_iflag =
5819        target_to_host_bitmask(tswap32(target->c_iflag), iflag_tbl);
5820    host->c_oflag =
5821        target_to_host_bitmask(tswap32(target->c_oflag), oflag_tbl);
5822    host->c_cflag =
5823        target_to_host_bitmask(tswap32(target->c_cflag), cflag_tbl);
5824    host->c_lflag =
5825        target_to_host_bitmask(tswap32(target->c_lflag), lflag_tbl);
5826    host->c_line = target->c_line;
5827
5828    memset(host->c_cc, 0, sizeof(host->c_cc));
5829    host->c_cc[VINTR] = target->c_cc[TARGET_VINTR];
5830    host->c_cc[VQUIT] = target->c_cc[TARGET_VQUIT];
5831    host->c_cc[VERASE] = target->c_cc[TARGET_VERASE];
5832    host->c_cc[VKILL] = target->c_cc[TARGET_VKILL];
5833    host->c_cc[VEOF] = target->c_cc[TARGET_VEOF];
5834    host->c_cc[VTIME] = target->c_cc[TARGET_VTIME];
5835    host->c_cc[VMIN] = target->c_cc[TARGET_VMIN];
5836    host->c_cc[VSWTC] = target->c_cc[TARGET_VSWTC];
5837    host->c_cc[VSTART] = target->c_cc[TARGET_VSTART];
5838    host->c_cc[VSTOP] = target->c_cc[TARGET_VSTOP];
5839    host->c_cc[VSUSP] = target->c_cc[TARGET_VSUSP];
5840    host->c_cc[VEOL] = target->c_cc[TARGET_VEOL];
5841    host->c_cc[VREPRINT] = target->c_cc[TARGET_VREPRINT];
5842    host->c_cc[VDISCARD] = target->c_cc[TARGET_VDISCARD];
5843    host->c_cc[VWERASE] = target->c_cc[TARGET_VWERASE];
5844    host->c_cc[VLNEXT] = target->c_cc[TARGET_VLNEXT];
5845    host->c_cc[VEOL2] = target->c_cc[TARGET_VEOL2];
5846}
5847
5848static void host_to_target_termios (void *dst, const void *src)
5849{
5850    struct target_termios *target = dst;
5851    const struct host_termios *host = src;
5852
5853    target->c_iflag =
5854        tswap32(host_to_target_bitmask(host->c_iflag, iflag_tbl));
5855    target->c_oflag =
5856        tswap32(host_to_target_bitmask(host->c_oflag, oflag_tbl));
5857    target->c_cflag =
5858        tswap32(host_to_target_bitmask(host->c_cflag, cflag_tbl));
5859    target->c_lflag =
5860        tswap32(host_to_target_bitmask(host->c_lflag, lflag_tbl));
5861    target->c_line = host->c_line;
5862
5863    memset(target->c_cc, 0, sizeof(target->c_cc));
5864    target->c_cc[TARGET_VINTR] = host->c_cc[VINTR];
5865    target->c_cc[TARGET_VQUIT] = host->c_cc[VQUIT];
5866    target->c_cc[TARGET_VERASE] = host->c_cc[VERASE];
5867    target->c_cc[TARGET_VKILL] = host->c_cc[VKILL];
5868    target->c_cc[TARGET_VEOF] = host->c_cc[VEOF];
5869    target->c_cc[TARGET_VTIME] = host->c_cc[VTIME];
5870    target->c_cc[TARGET_VMIN] = host->c_cc[VMIN];
5871    target->c_cc[TARGET_VSWTC] = host->c_cc[VSWTC];
5872    target->c_cc[TARGET_VSTART] = host->c_cc[VSTART];
5873    target->c_cc[TARGET_VSTOP] = host->c_cc[VSTOP];
5874    target->c_cc[TARGET_VSUSP] = host->c_cc[VSUSP];
5875    target->c_cc[TARGET_VEOL] = host->c_cc[VEOL];
5876    target->c_cc[TARGET_VREPRINT] = host->c_cc[VREPRINT];
5877    target->c_cc[TARGET_VDISCARD] = host->c_cc[VDISCARD];
5878    target->c_cc[TARGET_VWERASE] = host->c_cc[VWERASE];
5879    target->c_cc[TARGET_VLNEXT] = host->c_cc[VLNEXT];
5880    target->c_cc[TARGET_VEOL2] = host->c_cc[VEOL2];
5881}
5882
5883static const StructEntry struct_termios_def = {
5884    .convert = { host_to_target_termios, target_to_host_termios },
5885    .size = { sizeof(struct target_termios), sizeof(struct host_termios) },
5886    .align = { __alignof__(struct target_termios), __alignof__(struct host_termios) },
5887    .print = print_termios,
5888};
5889
5890/* If the host does not provide these bits, they may be safely discarded. */
5891#ifndef MAP_SYNC
5892#define MAP_SYNC 0
5893#endif
5894#ifndef MAP_UNINITIALIZED
5895#define MAP_UNINITIALIZED 0
5896#endif
5897
5898static const bitmask_transtbl mmap_flags_tbl[] = {
5899    { TARGET_MAP_FIXED, TARGET_MAP_FIXED, MAP_FIXED, MAP_FIXED },
5900    { TARGET_MAP_ANONYMOUS, TARGET_MAP_ANONYMOUS,
5901      MAP_ANONYMOUS, MAP_ANONYMOUS },
5902    { TARGET_MAP_GROWSDOWN, TARGET_MAP_GROWSDOWN,
5903      MAP_GROWSDOWN, MAP_GROWSDOWN },
5904    { TARGET_MAP_DENYWRITE, TARGET_MAP_DENYWRITE,
5905      MAP_DENYWRITE, MAP_DENYWRITE },
5906    { TARGET_MAP_EXECUTABLE, TARGET_MAP_EXECUTABLE,
5907      MAP_EXECUTABLE, MAP_EXECUTABLE },
5908    { TARGET_MAP_LOCKED, TARGET_MAP_LOCKED, MAP_LOCKED, MAP_LOCKED },
5909    { TARGET_MAP_NORESERVE, TARGET_MAP_NORESERVE,
5910      MAP_NORESERVE, MAP_NORESERVE },
5911    { TARGET_MAP_HUGETLB, TARGET_MAP_HUGETLB, MAP_HUGETLB, MAP_HUGETLB },
5912    /* MAP_STACK had been ignored by the kernel for quite some time.
5913       Recognize it for the target insofar as we do not want to pass
5914       it through to the host.  */
5915    { TARGET_MAP_STACK, TARGET_MAP_STACK, 0, 0 },
5916    { TARGET_MAP_NONBLOCK, TARGET_MAP_NONBLOCK, MAP_NONBLOCK, MAP_NONBLOCK },
5917    { TARGET_MAP_POPULATE, TARGET_MAP_POPULATE, MAP_POPULATE, MAP_POPULATE },
5918    { TARGET_MAP_FIXED_NOREPLACE, TARGET_MAP_FIXED_NOREPLACE,
5919      MAP_FIXED_NOREPLACE, MAP_FIXED_NOREPLACE },
5920    { TARGET_MAP_UNINITIALIZED, TARGET_MAP_UNINITIALIZED,
5921      MAP_UNINITIALIZED, MAP_UNINITIALIZED },
5922};
5923
5924/*
5925 * Arrange for legacy / undefined architecture specific flags to be
5926 * ignored by mmap handling code.
5927 */
5928#ifndef TARGET_MAP_32BIT
5929#define TARGET_MAP_32BIT 0
5930#endif
5931#ifndef TARGET_MAP_HUGE_2MB
5932#define TARGET_MAP_HUGE_2MB 0
5933#endif
5934#ifndef TARGET_MAP_HUGE_1GB
5935#define TARGET_MAP_HUGE_1GB 0
5936#endif
5937
5938static abi_long do_mmap(abi_ulong addr, abi_ulong len, int prot,
5939                        int target_flags, int fd, off_t offset)
5940{
5941    /*
5942     * The historical set of flags that all mmap types implicitly support.
5943     */
5944    enum {
5945        TARGET_LEGACY_MAP_MASK = TARGET_MAP_SHARED
5946                               | TARGET_MAP_PRIVATE
5947                               | TARGET_MAP_FIXED
5948                               | TARGET_MAP_ANONYMOUS
5949                               | TARGET_MAP_DENYWRITE
5950                               | TARGET_MAP_EXECUTABLE
5951                               | TARGET_MAP_UNINITIALIZED
5952                               | TARGET_MAP_GROWSDOWN
5953                               | TARGET_MAP_LOCKED
5954                               | TARGET_MAP_NORESERVE
5955                               | TARGET_MAP_POPULATE
5956                               | TARGET_MAP_NONBLOCK
5957                               | TARGET_MAP_STACK
5958                               | TARGET_MAP_HUGETLB
5959                               | TARGET_MAP_32BIT
5960                               | TARGET_MAP_HUGE_2MB
5961                               | TARGET_MAP_HUGE_1GB
5962    };
5963    int host_flags;
5964
5965    switch (target_flags & TARGET_MAP_TYPE) {
5966    case TARGET_MAP_PRIVATE:
5967        host_flags = MAP_PRIVATE;
5968        break;
5969    case TARGET_MAP_SHARED:
5970        host_flags = MAP_SHARED;
5971        break;
5972    case TARGET_MAP_SHARED_VALIDATE:
5973        /*
5974         * MAP_SYNC is only supported for MAP_SHARED_VALIDATE, and is
5975         * therefore omitted from mmap_flags_tbl and TARGET_LEGACY_MAP_MASK.
5976         */
5977        if (target_flags & ~(TARGET_LEGACY_MAP_MASK | TARGET_MAP_SYNC)) {
5978            return -TARGET_EOPNOTSUPP;
5979        }
5980        host_flags = MAP_SHARED_VALIDATE;
5981        if (target_flags & TARGET_MAP_SYNC) {
5982            host_flags |= MAP_SYNC;
5983        }
5984        break;
5985    default:
5986        return -TARGET_EINVAL;
5987    }
5988    host_flags |= target_to_host_bitmask(target_flags, mmap_flags_tbl);
5989
5990    return get_errno(target_mmap(addr, len, prot, host_flags, fd, offset));
5991}
5992
5993/*
5994 * NOTE: TARGET_ABI32 is defined for TARGET_I386 (but not for TARGET_X86_64)
5995 *       TARGET_I386 is defined if TARGET_X86_64 is defined
5996 */
5997#if defined(TARGET_I386)
5998
5999/* NOTE: there is really one LDT for all the threads */
6000static uint8_t *ldt_table;
6001
6002static abi_long read_ldt(abi_ulong ptr, unsigned long bytecount)
6003{
6004    int size;
6005    void *p;
6006
6007    if (!ldt_table)
6008        return 0;
6009    size = TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE;
6010    if (size > bytecount)
6011        size = bytecount;
6012    p = lock_user(VERIFY_WRITE, ptr, size, 0);
6013    if (!p)
6014        return -TARGET_EFAULT;
6015    /* ??? Should this by byteswapped?  */
6016    memcpy(p, ldt_table, size);
6017    unlock_user(p, ptr, size);
6018    return size;
6019}
6020
6021/* XXX: add locking support */
6022static abi_long write_ldt(CPUX86State *env,
6023                          abi_ulong ptr, unsigned long bytecount, int oldmode)
6024{
6025    struct target_modify_ldt_ldt_s ldt_info;
6026    struct target_modify_ldt_ldt_s *target_ldt_info;
6027    int seg_32bit, contents, read_exec_only, limit_in_pages;
6028    int seg_not_present, useable, lm;
6029    uint32_t *lp, entry_1, entry_2;
6030
6031    if (bytecount != sizeof(ldt_info))
6032        return -TARGET_EINVAL;
6033    if (!lock_user_struct(VERIFY_READ, target_ldt_info, ptr, 1))
6034        return -TARGET_EFAULT;
6035    ldt_info.entry_number = tswap32(target_ldt_info->entry_number);
6036    ldt_info.base_addr = tswapal(target_ldt_info->base_addr);
6037    ldt_info.limit = tswap32(target_ldt_info->limit);
6038    ldt_info.flags = tswap32(target_ldt_info->flags);
6039    unlock_user_struct(target_ldt_info, ptr, 0);
6040
6041    if (ldt_info.entry_number >= TARGET_LDT_ENTRIES)
6042        return -TARGET_EINVAL;
6043    seg_32bit = ldt_info.flags & 1;
6044    contents = (ldt_info.flags >> 1) & 3;
6045    read_exec_only = (ldt_info.flags >> 3) & 1;
6046    limit_in_pages = (ldt_info.flags >> 4) & 1;
6047    seg_not_present = (ldt_info.flags >> 5) & 1;
6048    useable = (ldt_info.flags >> 6) & 1;
6049#ifdef TARGET_ABI32
6050    lm = 0;
6051#else
6052    lm = (ldt_info.flags >> 7) & 1;
6053#endif
6054    if (contents == 3) {
6055        if (oldmode)
6056            return -TARGET_EINVAL;
6057        if (seg_not_present == 0)
6058            return -TARGET_EINVAL;
6059    }
6060    /* allocate the LDT */
6061    if (!ldt_table) {
6062        env->ldt.base = target_mmap(0,
6063                                    TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE,
6064                                    PROT_READ|PROT_WRITE,
6065                                    MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
6066        if (env->ldt.base == -1)
6067            return -TARGET_ENOMEM;
6068        memset(g2h_untagged(env->ldt.base), 0,
6069               TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE);
6070        env->ldt.limit = 0xffff;
6071        ldt_table = g2h_untagged(env->ldt.base);
6072    }
6073
6074    /* NOTE: same code as Linux kernel */
6075    /* Allow LDTs to be cleared by the user. */
6076    if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
6077        if (oldmode ||
6078            (contents == 0              &&
6079             read_exec_only == 1        &&
6080             seg_32bit == 0             &&
6081             limit_in_pages == 0        &&
6082             seg_not_present == 1       &&
6083             useable == 0 )) {
6084            entry_1 = 0;
6085            entry_2 = 0;
6086            goto install;
6087        }
6088    }
6089
6090    entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) |
6091        (ldt_info.limit & 0x0ffff);
6092    entry_2 = (ldt_info.base_addr & 0xff000000) |
6093        ((ldt_info.base_addr & 0x00ff0000) >> 16) |
6094        (ldt_info.limit & 0xf0000) |
6095        ((read_exec_only ^ 1) << 9) |
6096        (contents << 10) |
6097        ((seg_not_present ^ 1) << 15) |
6098        (seg_32bit << 22) |
6099        (limit_in_pages << 23) |
6100        (lm << 21) |
6101        0x7000;
6102    if (!oldmode)
6103        entry_2 |= (useable << 20);
6104
6105    /* Install the new entry ...  */
6106install:
6107    lp = (uint32_t *)(ldt_table + (ldt_info.entry_number << 3));
6108    lp[0] = tswap32(entry_1);
6109    lp[1] = tswap32(entry_2);
6110    return 0;
6111}
6112
6113/* specific and weird i386 syscalls */
6114static abi_long do_modify_ldt(CPUX86State *env, int func, abi_ulong ptr,
6115                              unsigned long bytecount)
6116{
6117    abi_long ret;
6118
6119    switch (func) {
6120    case 0:
6121        ret = read_ldt(ptr, bytecount);
6122        break;
6123    case 1:
6124        ret = write_ldt(env, ptr, bytecount, 1);
6125        break;
6126    case 0x11:
6127        ret = write_ldt(env, ptr, bytecount, 0);
6128        break;
6129    default:
6130        ret = -TARGET_ENOSYS;
6131        break;
6132    }
6133    return ret;
6134}
6135
6136#if defined(TARGET_ABI32)
6137abi_long do_set_thread_area(CPUX86State *env, abi_ulong ptr)
6138{
6139    uint64_t *gdt_table = g2h_untagged(env->gdt.base);
6140    struct target_modify_ldt_ldt_s ldt_info;
6141    struct target_modify_ldt_ldt_s *target_ldt_info;
6142    int seg_32bit, contents, read_exec_only, limit_in_pages;
6143    int seg_not_present, useable, lm;
6144    uint32_t *lp, entry_1, entry_2;
6145    int i;
6146
6147    lock_user_struct(VERIFY_WRITE, target_ldt_info, ptr, 1);
6148    if (!target_ldt_info)
6149        return -TARGET_EFAULT;
6150    ldt_info.entry_number = tswap32(target_ldt_info->entry_number);
6151    ldt_info.base_addr = tswapal(target_ldt_info->base_addr);
6152    ldt_info.limit = tswap32(target_ldt_info->limit);
6153    ldt_info.flags = tswap32(target_ldt_info->flags);
6154    if (ldt_info.entry_number == -1) {
6155        for (i=TARGET_GDT_ENTRY_TLS_MIN; i<=TARGET_GDT_ENTRY_TLS_MAX; i++) {
6156            if (gdt_table[i] == 0) {
6157                ldt_info.entry_number = i;
6158                target_ldt_info->entry_number = tswap32(i);
6159                break;
6160            }
6161        }
6162    }
6163    unlock_user_struct(target_ldt_info, ptr, 1);
6164
6165    if (ldt_info.entry_number < TARGET_GDT_ENTRY_TLS_MIN || 
6166        ldt_info.entry_number > TARGET_GDT_ENTRY_TLS_MAX)
6167           return -TARGET_EINVAL;
6168    seg_32bit = ldt_info.flags & 1;
6169    contents = (ldt_info.flags >> 1) & 3;
6170    read_exec_only = (ldt_info.flags >> 3) & 1;
6171    limit_in_pages = (ldt_info.flags >> 4) & 1;
6172    seg_not_present = (ldt_info.flags >> 5) & 1;
6173    useable = (ldt_info.flags >> 6) & 1;
6174#ifdef TARGET_ABI32
6175    lm = 0;
6176#else
6177    lm = (ldt_info.flags >> 7) & 1;
6178#endif
6179
6180    if (contents == 3) {
6181        if (seg_not_present == 0)
6182            return -TARGET_EINVAL;
6183    }
6184
6185    /* NOTE: same code as Linux kernel */
6186    /* Allow LDTs to be cleared by the user. */
6187    if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
6188        if ((contents == 0             &&
6189             read_exec_only == 1       &&
6190             seg_32bit == 0            &&
6191             limit_in_pages == 0       &&
6192             seg_not_present == 1      &&
6193             useable == 0 )) {
6194            entry_1 = 0;
6195            entry_2 = 0;
6196            goto install;
6197        }
6198    }
6199
6200    entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) |
6201        (ldt_info.limit & 0x0ffff);
6202    entry_2 = (ldt_info.base_addr & 0xff000000) |
6203        ((ldt_info.base_addr & 0x00ff0000) >> 16) |
6204        (ldt_info.limit & 0xf0000) |
6205        ((read_exec_only ^ 1) << 9) |
6206        (contents << 10) |
6207        ((seg_not_present ^ 1) << 15) |
6208        (seg_32bit << 22) |
6209        (limit_in_pages << 23) |
6210        (useable << 20) |
6211        (lm << 21) |
6212        0x7000;
6213
6214    /* Install the new entry ...  */
6215install:
6216    lp = (uint32_t *)(gdt_table + ldt_info.entry_number);
6217    lp[0] = tswap32(entry_1);
6218    lp[1] = tswap32(entry_2);
6219    return 0;
6220}
6221
6222static abi_long do_get_thread_area(CPUX86State *env, abi_ulong ptr)
6223{
6224    struct target_modify_ldt_ldt_s *target_ldt_info;
6225    uint64_t *gdt_table = g2h_untagged(env->gdt.base);
6226    uint32_t base_addr, limit, flags;
6227    int seg_32bit, contents, read_exec_only, limit_in_pages, idx;
6228    int seg_not_present, useable, lm;
6229    uint32_t *lp, entry_1, entry_2;
6230
6231    lock_user_struct(VERIFY_WRITE, target_ldt_info, ptr, 1);
6232    if (!target_ldt_info)
6233        return -TARGET_EFAULT;
6234    idx = tswap32(target_ldt_info->entry_number);
6235    if (idx < TARGET_GDT_ENTRY_TLS_MIN ||
6236        idx > TARGET_GDT_ENTRY_TLS_MAX) {
6237        unlock_user_struct(target_ldt_info, ptr, 1);
6238        return -TARGET_EINVAL;
6239    }
6240    lp = (uint32_t *)(gdt_table + idx);
6241    entry_1 = tswap32(lp[0]);
6242    entry_2 = tswap32(lp[1]);
6243    
6244    read_exec_only = ((entry_2 >> 9) & 1) ^ 1;
6245    contents = (entry_2 >> 10) & 3;
6246    seg_not_present = ((entry_2 >> 15) & 1) ^ 1;
6247    seg_32bit = (entry_2 >> 22) & 1;
6248    limit_in_pages = (entry_2 >> 23) & 1;
6249    useable = (entry_2 >> 20) & 1;
6250#ifdef TARGET_ABI32
6251    lm = 0;
6252#else
6253    lm = (entry_2 >> 21) & 1;
6254#endif
6255    flags = (seg_32bit << 0) | (contents << 1) |
6256        (read_exec_only << 3) | (limit_in_pages << 4) |
6257        (seg_not_present << 5) | (useable << 6) | (lm << 7);
6258    limit = (entry_1 & 0xffff) | (entry_2  & 0xf0000);
6259    base_addr = (entry_1 >> 16) | 
6260        (entry_2 & 0xff000000) | 
6261        ((entry_2 & 0xff) << 16);
6262    target_ldt_info->base_addr = tswapal(base_addr);
6263    target_ldt_info->limit = tswap32(limit);
6264    target_ldt_info->flags = tswap32(flags);
6265    unlock_user_struct(target_ldt_info, ptr, 1);
6266    return 0;
6267}
6268
6269abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr)
6270{
6271    return -TARGET_ENOSYS;
6272}
6273#else
6274abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr)
6275{
6276    abi_long ret = 0;
6277    abi_ulong val;
6278    int idx;
6279
6280    switch(code) {
6281    case TARGET_ARCH_SET_GS:
6282    case TARGET_ARCH_SET_FS:
6283        if (code == TARGET_ARCH_SET_GS)
6284            idx = R_GS;
6285        else
6286            idx = R_FS;
6287        cpu_x86_load_seg(env, idx, 0);
6288        env->segs[idx].base = addr;
6289        break;
6290    case TARGET_ARCH_GET_GS:
6291    case TARGET_ARCH_GET_FS:
6292        if (code == TARGET_ARCH_GET_GS)
6293            idx = R_GS;
6294        else
6295            idx = R_FS;
6296        val = env->segs[idx].base;
6297        if (put_user(val, addr, abi_ulong))
6298            ret = -TARGET_EFAULT;
6299        break;
6300    default:
6301        ret = -TARGET_EINVAL;
6302        break;
6303    }
6304    return ret;
6305}
6306#endif /* defined(TARGET_ABI32 */
6307#endif /* defined(TARGET_I386) */
6308
6309/*
6310 * These constants are generic.  Supply any that are missing from the host.
6311 */
6312#ifndef PR_SET_NAME
6313# define PR_SET_NAME    15
6314# define PR_GET_NAME    16
6315#endif
6316#ifndef PR_SET_FP_MODE
6317# define PR_SET_FP_MODE 45
6318# define PR_GET_FP_MODE 46
6319# define PR_FP_MODE_FR   (1 << 0)
6320# define PR_FP_MODE_FRE  (1 << 1)
6321#endif
6322#ifndef PR_SVE_SET_VL
6323# define PR_SVE_SET_VL  50
6324# define PR_SVE_GET_VL  51
6325# define PR_SVE_VL_LEN_MASK  0xffff
6326# define PR_SVE_VL_INHERIT   (1 << 17)
6327#endif
6328#ifndef PR_PAC_RESET_KEYS
6329# define PR_PAC_RESET_KEYS  54
6330# define PR_PAC_APIAKEY   (1 << 0)
6331# define PR_PAC_APIBKEY   (1 << 1)
6332# define PR_PAC_APDAKEY   (1 << 2)
6333# define PR_PAC_APDBKEY   (1 << 3)
6334# define PR_PAC_APGAKEY   (1 << 4)
6335#endif
6336#ifndef PR_SET_TAGGED_ADDR_CTRL
6337# define PR_SET_TAGGED_ADDR_CTRL 55
6338# define PR_GET_TAGGED_ADDR_CTRL 56
6339# define PR_TAGGED_ADDR_ENABLE  (1UL << 0)
6340#endif
6341#ifndef PR_SET_IO_FLUSHER
6342# define PR_SET_IO_FLUSHER 57
6343# define PR_GET_IO_FLUSHER 58
6344#endif
6345#ifndef PR_SET_SYSCALL_USER_DISPATCH
6346# define PR_SET_SYSCALL_USER_DISPATCH 59
6347#endif
6348#ifndef PR_SME_SET_VL
6349# define PR_SME_SET_VL  63
6350# define PR_SME_GET_VL  64
6351# define PR_SME_VL_LEN_MASK  0xffff
6352# define PR_SME_VL_INHERIT   (1 << 17)
6353#endif
6354
6355#include "target_prctl.h"
6356
6357static abi_long do_prctl_inval0(CPUArchState *env)
6358{
6359    return -TARGET_EINVAL;
6360}
6361
6362static abi_long do_prctl_inval1(CPUArchState *env, abi_long arg2)
6363{
6364    return -TARGET_EINVAL;
6365}
6366
6367#ifndef do_prctl_get_fp_mode
6368#define do_prctl_get_fp_mode do_prctl_inval0
6369#endif
6370#ifndef do_prctl_set_fp_mode
6371#define do_prctl_set_fp_mode do_prctl_inval1
6372#endif
6373#ifndef do_prctl_sve_get_vl
6374#define do_prctl_sve_get_vl do_prctl_inval0
6375#endif
6376#ifndef do_prctl_sve_set_vl
6377#define do_prctl_sve_set_vl do_prctl_inval1
6378#endif
6379#ifndef do_prctl_reset_keys
6380#define do_prctl_reset_keys do_prctl_inval1
6381#endif
6382#ifndef do_prctl_set_tagged_addr_ctrl
6383#define do_prctl_set_tagged_addr_ctrl do_prctl_inval1
6384#endif
6385#ifndef do_prctl_get_tagged_addr_ctrl
6386#define do_prctl_get_tagged_addr_ctrl do_prctl_inval0
6387#endif
6388#ifndef do_prctl_get_unalign
6389#define do_prctl_get_unalign do_prctl_inval1
6390#endif
6391#ifndef do_prctl_set_unalign
6392#define do_prctl_set_unalign do_prctl_inval1
6393#endif
6394#ifndef do_prctl_sme_get_vl
6395#define do_prctl_sme_get_vl do_prctl_inval0
6396#endif
6397#ifndef do_prctl_sme_set_vl
6398#define do_prctl_sme_set_vl do_prctl_inval1
6399#endif
6400
6401static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2,
6402                         abi_long arg3, abi_long arg4, abi_long arg5)
6403{
6404    abi_long ret;
6405
6406    switch (option) {
6407    case PR_GET_PDEATHSIG:
6408        {
6409            int deathsig;
6410            ret = get_errno(prctl(PR_GET_PDEATHSIG, &deathsig,
6411                                  arg3, arg4, arg5));
6412            if (!is_error(ret) &&
6413                put_user_s32(host_to_target_signal(deathsig), arg2)) {
6414                return -TARGET_EFAULT;
6415            }
6416            return ret;
6417        }
6418    case PR_SET_PDEATHSIG:
6419        return get_errno(prctl(PR_SET_PDEATHSIG, target_to_host_signal(arg2),
6420                               arg3, arg4, arg5));
6421    case PR_GET_NAME:
6422        {
6423            void *name = lock_user(VERIFY_WRITE, arg2, 16, 1);
6424            if (!name) {
6425                return -TARGET_EFAULT;
6426            }
6427            ret = get_errno(prctl(PR_GET_NAME, (uintptr_t)name,
6428                                  arg3, arg4, arg5));
6429            unlock_user(name, arg2, 16);
6430            return ret;
6431        }
6432    case PR_SET_NAME:
6433        {
6434            void *name = lock_user(VERIFY_READ, arg2, 16, 1);
6435            if (!name) {
6436                return -TARGET_EFAULT;
6437            }
6438            ret = get_errno(prctl(PR_SET_NAME, (uintptr_t)name,
6439                                  arg3, arg4, arg5));
6440            unlock_user(name, arg2, 0);
6441            return ret;
6442        }
6443    case PR_GET_FP_MODE:
6444        return do_prctl_get_fp_mode(env);
6445    case PR_SET_FP_MODE:
6446        return do_prctl_set_fp_mode(env, arg2);
6447    case PR_SVE_GET_VL:
6448        return do_prctl_sve_get_vl(env);
6449    case PR_SVE_SET_VL:
6450        return do_prctl_sve_set_vl(env, arg2);
6451    case PR_SME_GET_VL:
6452        return do_prctl_sme_get_vl(env);
6453    case PR_SME_SET_VL:
6454        return do_prctl_sme_set_vl(env, arg2);
6455    case PR_PAC_RESET_KEYS:
6456        if (arg3 || arg4 || arg5) {
6457            return -TARGET_EINVAL;
6458        }
6459        return do_prctl_reset_keys(env, arg2);
6460    case PR_SET_TAGGED_ADDR_CTRL:
6461        if (arg3 || arg4 || arg5) {
6462            return -TARGET_EINVAL;
6463        }
6464        return do_prctl_set_tagged_addr_ctrl(env, arg2);
6465    case PR_GET_TAGGED_ADDR_CTRL:
6466        if (arg2 || arg3 || arg4 || arg5) {
6467            return -TARGET_EINVAL;
6468        }
6469        return do_prctl_get_tagged_addr_ctrl(env);
6470
6471    case PR_GET_UNALIGN:
6472        return do_prctl_get_unalign(env, arg2);
6473    case PR_SET_UNALIGN:
6474        return do_prctl_set_unalign(env, arg2);
6475
6476    case PR_CAP_AMBIENT:
6477    case PR_CAPBSET_READ:
6478    case PR_CAPBSET_DROP:
6479    case PR_GET_DUMPABLE:
6480    case PR_SET_DUMPABLE:
6481    case PR_GET_KEEPCAPS:
6482    case PR_SET_KEEPCAPS:
6483    case PR_GET_SECUREBITS:
6484    case PR_SET_SECUREBITS:
6485    case PR_GET_TIMING:
6486    case PR_SET_TIMING:
6487    case PR_GET_TIMERSLACK:
6488    case PR_SET_TIMERSLACK:
6489    case PR_MCE_KILL:
6490    case PR_MCE_KILL_GET:
6491    case PR_GET_NO_NEW_PRIVS:
6492    case PR_SET_NO_NEW_PRIVS:
6493    case PR_GET_IO_FLUSHER:
6494    case PR_SET_IO_FLUSHER:
6495    case PR_SET_CHILD_SUBREAPER:
6496    case PR_GET_SPECULATION_CTRL:
6497    case PR_SET_SPECULATION_CTRL:
6498        /* Some prctl options have no pointer arguments and we can pass on. */
6499        return get_errno(prctl(option, arg2, arg3, arg4, arg5));
6500
6501    case PR_GET_CHILD_SUBREAPER:
6502        {
6503            int val;
6504            ret = get_errno(prctl(PR_GET_CHILD_SUBREAPER, &val,
6505                                  arg3, arg4, arg5));
6506            if (!is_error(ret) && put_user_s32(val, arg2)) {
6507                return -TARGET_EFAULT;
6508            }
6509            return ret;
6510        }
6511
6512    case PR_GET_TID_ADDRESS:
6513        {
6514            TaskState *ts = get_task_state(env_cpu(env));
6515            return put_user_ual(ts->child_tidptr, arg2);
6516        }
6517
6518    case PR_GET_FPEXC:
6519    case PR_SET_FPEXC:
6520        /* Was used for SPE on PowerPC. */
6521        return -TARGET_EINVAL;
6522
6523    case PR_GET_ENDIAN:
6524    case PR_SET_ENDIAN:
6525    case PR_GET_FPEMU:
6526    case PR_SET_FPEMU:
6527    case PR_SET_MM:
6528    case PR_GET_SECCOMP:
6529    case PR_SET_SECCOMP:
6530    case PR_SET_SYSCALL_USER_DISPATCH:
6531    case PR_GET_THP_DISABLE:
6532    case PR_SET_THP_DISABLE:
6533    case PR_GET_TSC:
6534    case PR_SET_TSC:
6535        /* Disable to prevent the target disabling stuff we need. */
6536        return -TARGET_EINVAL;
6537
6538    default:
6539        qemu_log_mask(LOG_UNIMP, "Unsupported prctl: " TARGET_ABI_FMT_ld "\n",
6540                      option);
6541        return -TARGET_EINVAL;
6542    }
6543}
6544
6545#define NEW_STACK_SIZE 0x40000
6546
6547
6548static pthread_mutex_t clone_lock = PTHREAD_MUTEX_INITIALIZER;
6549typedef struct {
6550    CPUArchState *env;
6551    pthread_mutex_t mutex;
6552    pthread_cond_t cond;
6553    pthread_t thread;
6554    uint32_t tid;
6555    abi_ulong child_tidptr;
6556    abi_ulong parent_tidptr;
6557    sigset_t sigmask;
6558} new_thread_info;
6559
6560static void *clone_func(void *arg)
6561{
6562    new_thread_info *info = arg;
6563    CPUArchState *env;
6564    CPUState *cpu;
6565    TaskState *ts;
6566
6567    rcu_register_thread();
6568    tcg_register_thread();
6569    env = info->env;
6570    cpu = env_cpu(env);
6571    thread_cpu = cpu;
6572    ts = get_task_state(cpu);
6573    info->tid = sys_gettid();
6574    task_settid(ts);
6575    if (info->child_tidptr)
6576        put_user_u32(info->tid, info->child_tidptr);
6577    if (info->parent_tidptr)
6578        put_user_u32(info->tid, info->parent_tidptr);
6579    qemu_guest_random_seed_thread_part2(cpu->random_seed);
6580    /* Enable signals.  */
6581    sigprocmask(SIG_SETMASK, &info->sigmask, NULL);
6582    /* Signal to the parent that we're ready.  */
6583    pthread_mutex_lock(&info->mutex);
6584    pthread_cond_broadcast(&info->cond);
6585    pthread_mutex_unlock(&info->mutex);
6586    /* Wait until the parent has finished initializing the tls state.  */
6587    pthread_mutex_lock(&clone_lock);
6588    pthread_mutex_unlock(&clone_lock);
6589    cpu_loop(env);
6590    /* never exits */
6591    return NULL;
6592}
6593
6594/* do_fork() Must return host values and target errnos (unlike most
6595   do_*() functions). */
6596static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
6597                   abi_ulong parent_tidptr, target_ulong newtls,
6598                   abi_ulong child_tidptr)
6599{
6600    CPUState *cpu = env_cpu(env);
6601    int ret;
6602    TaskState *ts;
6603    CPUState *new_cpu;
6604    CPUArchState *new_env;
6605    sigset_t sigmask;
6606
6607    flags &= ~CLONE_IGNORED_FLAGS;
6608
6609    /* Emulate vfork() with fork() */
6610    if (flags & CLONE_VFORK)
6611        flags &= ~(CLONE_VFORK | CLONE_VM);
6612
6613    if (flags & CLONE_VM) {
6614        TaskState *parent_ts = get_task_state(cpu);
6615        new_thread_info info;
6616        pthread_attr_t attr;
6617
6618        if (((flags & CLONE_THREAD_FLAGS) != CLONE_THREAD_FLAGS) ||
6619            (flags & CLONE_INVALID_THREAD_FLAGS)) {
6620            return -TARGET_EINVAL;
6621        }
6622
6623        ts = g_new0(TaskState, 1);
6624        init_task_state(ts);
6625
6626        /* Grab a mutex so that thread setup appears atomic.  */
6627        pthread_mutex_lock(&clone_lock);
6628
6629        /*
6630         * If this is our first additional thread, we need to ensure we
6631         * generate code for parallel execution and flush old translations.
6632         * Do this now so that the copy gets CF_PARALLEL too.
6633         */
6634        if (!tcg_cflags_has(cpu, CF_PARALLEL)) {
6635            tcg_cflags_set(cpu, CF_PARALLEL);
6636            tb_flush(cpu);
6637        }
6638
6639        /* we create a new CPU instance. */
6640        new_env = cpu_copy(env);
6641        /* Init regs that differ from the parent.  */
6642        cpu_clone_regs_child(new_env, newsp, flags);
6643        cpu_clone_regs_parent(env, flags);
6644        new_cpu = env_cpu(new_env);
6645        new_cpu->opaque = ts;
6646        ts->bprm = parent_ts->bprm;
6647        ts->info = parent_ts->info;
6648        ts->signal_mask = parent_ts->signal_mask;
6649
6650        if (flags & CLONE_CHILD_CLEARTID) {
6651            ts->child_tidptr = child_tidptr;
6652        }
6653
6654        if (flags & CLONE_SETTLS) {
6655            cpu_set_tls (new_env, newtls);
6656        }
6657
6658        memset(&info, 0, sizeof(info));
6659        pthread_mutex_init(&info.mutex, NULL);
6660        pthread_mutex_lock(&info.mutex);
6661        pthread_cond_init(&info.cond, NULL);
6662        info.env = new_env;
6663        if (flags & CLONE_CHILD_SETTID) {
6664            info.child_tidptr = child_tidptr;
6665        }
6666        if (flags & CLONE_PARENT_SETTID) {
6667            info.parent_tidptr = parent_tidptr;
6668        }
6669
6670        ret = pthread_attr_init(&attr);
6671        ret = pthread_attr_setstacksize(&attr, NEW_STACK_SIZE);
6672        ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
6673        /* It is not safe to deliver signals until the child has finished
6674           initializing, so temporarily block all signals.  */
6675        sigfillset(&sigmask);
6676        sigprocmask(SIG_BLOCK, &sigmask, &info.sigmask);
6677        cpu->random_seed = qemu_guest_random_seed_thread_part1();
6678
6679        ret = pthread_create(&info.thread, &attr, clone_func, &info);
6680        /* TODO: Free new CPU state if thread creation failed.  */
6681
6682        sigprocmask(SIG_SETMASK, &info.sigmask, NULL);
6683        pthread_attr_destroy(&attr);
6684        if (ret == 0) {
6685            /* Wait for the child to initialize.  */
6686            pthread_cond_wait(&info.cond, &info.mutex);
6687            ret = info.tid;
6688        } else {
6689            ret = -1;
6690        }
6691        pthread_mutex_unlock(&info.mutex);
6692        pthread_cond_destroy(&info.cond);
6693        pthread_mutex_destroy(&info.mutex);
6694        pthread_mutex_unlock(&clone_lock);
6695    } else {
6696        /* if no CLONE_VM, we consider it is a fork */
6697        if (flags & CLONE_INVALID_FORK_FLAGS) {
6698            return -TARGET_EINVAL;
6699        }
6700
6701        /* We can't support custom termination signals */
6702        if ((flags & CSIGNAL) != TARGET_SIGCHLD) {
6703            return -TARGET_EINVAL;
6704        }
6705
6706#if !defined(__NR_pidfd_open) || !defined(TARGET_NR_pidfd_open)
6707        if (flags & CLONE_PIDFD) {
6708            return -TARGET_EINVAL;
6709        }
6710#endif
6711
6712        /* Can not allow CLONE_PIDFD with CLONE_PARENT_SETTID */
6713        if ((flags & CLONE_PIDFD) && (flags & CLONE_PARENT_SETTID)) {
6714            return -TARGET_EINVAL;
6715        }
6716
6717        if (block_signals()) {
6718            return -QEMU_ERESTARTSYS;
6719        }
6720
6721        fork_start();
6722        ret = fork();
6723        if (ret == 0) {
6724            /* Child Process.  */
6725            cpu_clone_regs_child(env, newsp, flags);
6726            fork_end(ret);
6727            /* There is a race condition here.  The parent process could
6728               theoretically read the TID in the child process before the child
6729               tid is set.  This would require using either ptrace
6730               (not implemented) or having *_tidptr to point at a shared memory
6731               mapping.  We can't repeat the spinlock hack used above because
6732               the child process gets its own copy of the lock.  */
6733            if (flags & CLONE_CHILD_SETTID)
6734                put_user_u32(sys_gettid(), child_tidptr);
6735            if (flags & CLONE_PARENT_SETTID)
6736                put_user_u32(sys_gettid(), parent_tidptr);
6737            ts = get_task_state(cpu);
6738            if (flags & CLONE_SETTLS)
6739                cpu_set_tls (env, newtls);
6740            if (flags & CLONE_CHILD_CLEARTID)
6741                ts->child_tidptr = child_tidptr;
6742        } else {
6743            cpu_clone_regs_parent(env, flags);
6744            if (flags & CLONE_PIDFD) {
6745                int pid_fd = 0;
6746#if defined(__NR_pidfd_open) && defined(TARGET_NR_pidfd_open)
6747                int pid_child = ret;
6748                pid_fd = pidfd_open(pid_child, 0);
6749                if (pid_fd >= 0) {
6750                    qemu_set_cloexec(pid_fd);
6751                } else {
6752                    pid_fd = 0;
6753                }
6754#endif
6755                put_user_u32(pid_fd, parent_tidptr);
6756            }
6757            fork_end(ret);
6758        }
6759        g_assert(!cpu_in_exclusive_context(cpu));
6760    }
6761    return ret;
6762}
6763
6764/* warning : doesn't handle linux specific flags... */
6765static int target_to_host_fcntl_cmd(int cmd)
6766{
6767    int ret;
6768
6769    switch(cmd) {
6770    case TARGET_F_DUPFD:
6771    case TARGET_F_GETFD:
6772    case TARGET_F_SETFD:
6773    case TARGET_F_GETFL:
6774    case TARGET_F_SETFL:
6775    case TARGET_F_OFD_GETLK:
6776    case TARGET_F_OFD_SETLK:
6777    case TARGET_F_OFD_SETLKW:
6778        ret = cmd;
6779        break;
6780    case TARGET_F_GETLK:
6781        ret = F_GETLK;
6782        break;
6783    case TARGET_F_SETLK:
6784        ret = F_SETLK;
6785        break;
6786    case TARGET_F_SETLKW:
6787        ret = F_SETLKW;
6788        break;
6789    case TARGET_F_GETOWN:
6790        ret = F_GETOWN;
6791        break;
6792    case TARGET_F_SETOWN:
6793        ret = F_SETOWN;
6794        break;
6795    case TARGET_F_GETSIG:
6796        ret = F_GETSIG;
6797        break;
6798    case TARGET_F_SETSIG:
6799        ret = F_SETSIG;
6800        break;
6801#if TARGET_ABI_BITS == 32
6802    case TARGET_F_GETLK64:
6803        ret = F_GETLK;
6804        break;
6805    case TARGET_F_SETLK64:
6806        ret = F_SETLK;
6807        break;
6808    case TARGET_F_SETLKW64:
6809        ret = F_SETLKW;
6810        break;
6811#endif
6812    case TARGET_F_SETLEASE:
6813        ret = F_SETLEASE;
6814        break;
6815    case TARGET_F_GETLEASE:
6816        ret = F_GETLEASE;
6817        break;
6818#ifdef F_DUPFD_CLOEXEC
6819    case TARGET_F_DUPFD_CLOEXEC:
6820        ret = F_DUPFD_CLOEXEC;
6821        break;
6822#endif
6823    case TARGET_F_NOTIFY:
6824        ret = F_NOTIFY;
6825        break;
6826#ifdef F_GETOWN_EX
6827    case TARGET_F_GETOWN_EX:
6828        ret = F_GETOWN_EX;
6829        break;
6830#endif
6831#ifdef F_SETOWN_EX
6832    case TARGET_F_SETOWN_EX:
6833        ret = F_SETOWN_EX;
6834        break;
6835#endif
6836#ifdef F_SETPIPE_SZ
6837    case TARGET_F_SETPIPE_SZ:
6838        ret = F_SETPIPE_SZ;
6839        break;
6840    case TARGET_F_GETPIPE_SZ:
6841        ret = F_GETPIPE_SZ;
6842        break;
6843#endif
6844#ifdef F_ADD_SEALS
6845    case TARGET_F_ADD_SEALS:
6846        ret = F_ADD_SEALS;
6847        break;
6848    case TARGET_F_GET_SEALS:
6849        ret = F_GET_SEALS;
6850        break;
6851#endif
6852    default:
6853        ret = -TARGET_EINVAL;
6854        break;
6855    }
6856
6857#if defined(__powerpc64__)
6858    /* On PPC64, glibc headers has the F_*LK* defined to 12, 13 and 14 and
6859     * is not supported by kernel. The glibc fcntl call actually adjusts
6860     * them to 5, 6 and 7 before making the syscall(). Since we make the
6861     * syscall directly, adjust to what is supported by the kernel.
6862     */
6863    if (ret >= F_GETLK && ret <= F_SETLKW) {
6864        ret -= F_GETLK - 5;
6865    }
6866#endif
6867
6868    return ret;
6869}
6870
6871#define FLOCK_TRANSTBL \
6872    switch (type) { \
6873    TRANSTBL_CONVERT(F_RDLCK); \
6874    TRANSTBL_CONVERT(F_WRLCK); \
6875    TRANSTBL_CONVERT(F_UNLCK); \
6876    }
6877
6878static int target_to_host_flock(int type)
6879{
6880#define TRANSTBL_CONVERT(a) case TARGET_##a: return a
6881    FLOCK_TRANSTBL
6882#undef  TRANSTBL_CONVERT
6883    return -TARGET_EINVAL;
6884}
6885
6886static int host_to_target_flock(int type)
6887{
6888#define TRANSTBL_CONVERT(a) case a: return TARGET_##a
6889    FLOCK_TRANSTBL
6890#undef  TRANSTBL_CONVERT
6891    /* if we don't know how to convert the value coming
6892     * from the host we copy to the target field as-is
6893     */
6894    return type;
6895}
6896
6897static inline abi_long copy_from_user_flock(struct flock *fl,
6898                                            abi_ulong target_flock_addr)
6899{
6900    struct target_flock *target_fl;
6901    int l_type;
6902
6903    if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
6904        return -TARGET_EFAULT;
6905    }
6906
6907    __get_user(l_type, &target_fl->l_type);
6908    l_type = target_to_host_flock(l_type);
6909    if (l_type < 0) {
6910        return l_type;
6911    }
6912    fl->l_type = l_type;
6913    __get_user(fl->l_whence, &target_fl->l_whence);
6914    __get_user(fl->l_start, &target_fl->l_start);
6915    __get_user(fl->l_len, &target_fl->l_len);
6916    __get_user(fl->l_pid, &target_fl->l_pid);
6917    unlock_user_struct(target_fl, target_flock_addr, 0);
6918    return 0;
6919}
6920
6921static inline abi_long copy_to_user_flock(abi_ulong target_flock_addr,
6922                                          const struct flock *fl)
6923{
6924    struct target_flock *target_fl;
6925    short l_type;
6926
6927    if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
6928        return -TARGET_EFAULT;
6929    }
6930
6931    l_type = host_to_target_flock(fl->l_type);
6932    __put_user(l_type, &target_fl->l_type);
6933    __put_user(fl->l_whence, &target_fl->l_whence);
6934    __put_user(fl->l_start, &target_fl->l_start);
6935    __put_user(fl->l_len, &target_fl->l_len);
6936    __put_user(fl->l_pid, &target_fl->l_pid);
6937    unlock_user_struct(target_fl, target_flock_addr, 1);
6938    return 0;
6939}
6940
6941typedef abi_long from_flock64_fn(struct flock *fl, abi_ulong target_addr);
6942typedef abi_long to_flock64_fn(abi_ulong target_addr, const struct flock *fl);
6943
6944#if defined(TARGET_ARM) && TARGET_ABI_BITS == 32
6945struct target_oabi_flock64 {
6946    abi_short l_type;
6947    abi_short l_whence;
6948    abi_llong l_start;
6949    abi_llong l_len;
6950    abi_int   l_pid;
6951} QEMU_PACKED;
6952
6953static inline abi_long copy_from_user_oabi_flock64(struct flock *fl,
6954                                                   abi_ulong target_flock_addr)
6955{
6956    struct target_oabi_flock64 *target_fl;
6957    int l_type;
6958
6959    if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
6960        return -TARGET_EFAULT;
6961    }
6962
6963    __get_user(l_type, &target_fl->l_type);
6964    l_type = target_to_host_flock(l_type);
6965    if (l_type < 0) {
6966        return l_type;
6967    }
6968    fl->l_type = l_type;
6969    __get_user(fl->l_whence, &target_fl->l_whence);
6970    __get_user(fl->l_start, &target_fl->l_start);
6971    __get_user(fl->l_len, &target_fl->l_len);
6972    __get_user(fl->l_pid, &target_fl->l_pid);
6973    unlock_user_struct(target_fl, target_flock_addr, 0);
6974    return 0;
6975}
6976
6977static inline abi_long copy_to_user_oabi_flock64(abi_ulong target_flock_addr,
6978                                                 const struct flock *fl)
6979{
6980    struct target_oabi_flock64 *target_fl;
6981    short l_type;
6982
6983    if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
6984        return -TARGET_EFAULT;
6985    }
6986
6987    l_type = host_to_target_flock(fl->l_type);
6988    __put_user(l_type, &target_fl->l_type);
6989    __put_user(fl->l_whence, &target_fl->l_whence);
6990    __put_user(fl->l_start, &target_fl->l_start);
6991    __put_user(fl->l_len, &target_fl->l_len);
6992    __put_user(fl->l_pid, &target_fl->l_pid);
6993    unlock_user_struct(target_fl, target_flock_addr, 1);
6994    return 0;
6995}
6996#endif
6997
6998static inline abi_long copy_from_user_flock64(struct flock *fl,
6999                                              abi_ulong target_flock_addr)
7000{
7001    struct target_flock64 *target_fl;
7002    int l_type;
7003
7004    if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
7005        return -TARGET_EFAULT;
7006    }
7007
7008    __get_user(l_type, &target_fl->l_type);
7009    l_type = target_to_host_flock(l_type);
7010    if (l_type < 0) {
7011        return l_type;
7012    }
7013    fl->l_type = l_type;
7014    __get_user(fl->l_whence, &target_fl->l_whence);
7015    __get_user(fl->l_start, &target_fl->l_start);
7016    __get_user(fl->l_len, &target_fl->l_len);
7017    __get_user(fl->l_pid, &target_fl->l_pid);
7018    unlock_user_struct(target_fl, target_flock_addr, 0);
7019    return 0;
7020}
7021
7022static inline abi_long copy_to_user_flock64(abi_ulong target_flock_addr,
7023                                            const struct flock *fl)
7024{
7025    struct target_flock64 *target_fl;
7026    short l_type;
7027
7028    if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
7029        return -TARGET_EFAULT;
7030    }
7031
7032    l_type = host_to_target_flock(fl->l_type);
7033    __put_user(l_type, &target_fl->l_type);
7034    __put_user(fl->l_whence, &target_fl->l_whence);
7035    __put_user(fl->l_start, &target_fl->l_start);
7036    __put_user(fl->l_len, &target_fl->l_len);
7037    __put_user(fl->l_pid, &target_fl->l_pid);
7038    unlock_user_struct(target_fl, target_flock_addr, 1);
7039    return 0;
7040}
7041
7042static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
7043{
7044    struct flock fl;
7045#ifdef F_GETOWN_EX
7046    struct f_owner_ex fox;
7047    struct target_f_owner_ex *target_fox;
7048#endif
7049    abi_long ret;
7050    int host_cmd = target_to_host_fcntl_cmd(cmd);
7051
7052    if (host_cmd == -TARGET_EINVAL)
7053            return host_cmd;
7054
7055    switch(cmd) {
7056    case TARGET_F_GETLK:
7057        ret = copy_from_user_flock(&fl, arg);
7058        if (ret) {
7059            return ret;
7060        }
7061        ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
7062        if (ret == 0) {
7063            ret = copy_to_user_flock(arg, &fl);
7064        }
7065        break;
7066
7067    case TARGET_F_SETLK:
7068    case TARGET_F_SETLKW:
7069        ret = copy_from_user_flock(&fl, arg);
7070        if (ret) {
7071            return ret;
7072        }
7073        ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
7074        break;
7075
7076    case TARGET_F_GETLK64:
7077    case TARGET_F_OFD_GETLK:
7078        ret = copy_from_user_flock64(&fl, arg);
7079        if (ret) {
7080            return ret;
7081        }
7082        ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
7083        if (ret == 0) {
7084            ret = copy_to_user_flock64(arg, &fl);
7085        }
7086        break;
7087    case TARGET_F_SETLK64:
7088    case TARGET_F_SETLKW64:
7089    case TARGET_F_OFD_SETLK:
7090    case TARGET_F_OFD_SETLKW:
7091        ret = copy_from_user_flock64(&fl, arg);
7092        if (ret) {
7093            return ret;
7094        }
7095        ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
7096        break;
7097
7098    case TARGET_F_GETFL:
7099        ret = get_errno(safe_fcntl(fd, host_cmd, arg));
7100        if (ret >= 0) {
7101            ret = host_to_target_bitmask(ret, fcntl_flags_tbl);
7102            /* tell 32-bit guests it uses largefile on 64-bit hosts: */
7103            if (O_LARGEFILE == 0 && HOST_LONG_BITS == 64) {
7104                ret |= TARGET_O_LARGEFILE;
7105            }
7106        }
7107        break;
7108
7109    case TARGET_F_SETFL:
7110        ret = get_errno(safe_fcntl(fd, host_cmd,
7111                                   target_to_host_bitmask(arg,
7112                                                          fcntl_flags_tbl)));
7113        break;
7114
7115#ifdef F_GETOWN_EX
7116    case TARGET_F_GETOWN_EX:
7117        ret = get_errno(safe_fcntl(fd, host_cmd, &fox));
7118        if (ret >= 0) {
7119            if (!lock_user_struct(VERIFY_WRITE, target_fox, arg, 0))
7120                return -TARGET_EFAULT;
7121            target_fox->type = tswap32(fox.type);
7122            target_fox->pid = tswap32(fox.pid);
7123            unlock_user_struct(target_fox, arg, 1);
7124        }
7125        break;
7126#endif
7127
7128#ifdef F_SETOWN_EX
7129    case TARGET_F_SETOWN_EX:
7130        if (!lock_user_struct(VERIFY_READ, target_fox, arg, 1))
7131            return -TARGET_EFAULT;
7132        fox.type = tswap32(target_fox->type);
7133        fox.pid = tswap32(target_fox->pid);
7134        unlock_user_struct(target_fox, arg, 0);
7135        ret = get_errno(safe_fcntl(fd, host_cmd, &fox));
7136        break;
7137#endif
7138
7139    case TARGET_F_SETSIG:
7140        ret = get_errno(safe_fcntl(fd, host_cmd, target_to_host_signal(arg)));
7141        break;
7142
7143    case TARGET_F_GETSIG:
7144        ret = host_to_target_signal(get_errno(safe_fcntl(fd, host_cmd, arg)));
7145        break;
7146
7147    case TARGET_F_SETOWN:
7148    case TARGET_F_GETOWN:
7149    case TARGET_F_SETLEASE:
7150    case TARGET_F_GETLEASE:
7151    case TARGET_F_SETPIPE_SZ:
7152    case TARGET_F_GETPIPE_SZ:
7153    case TARGET_F_ADD_SEALS:
7154    case TARGET_F_GET_SEALS:
7155        ret = get_errno(safe_fcntl(fd, host_cmd, arg));
7156        break;
7157
7158    default:
7159        ret = get_errno(safe_fcntl(fd, cmd, arg));
7160        break;
7161    }
7162    return ret;
7163}
7164
7165#ifdef USE_UID16
7166
7167static inline int high2lowuid(int uid)
7168{
7169    if (uid > 65535)
7170        return 65534;
7171    else
7172        return uid;
7173}
7174
7175static inline int high2lowgid(int gid)
7176{
7177    if (gid > 65535)
7178        return 65534;
7179    else
7180        return gid;
7181}
7182
7183static inline int low2highuid(int uid)
7184{
7185    if ((int16_t)uid == -1)
7186        return -1;
7187    else
7188        return uid;
7189}
7190
7191static inline int low2highgid(int gid)
7192{
7193    if ((int16_t)gid == -1)
7194        return -1;
7195    else
7196        return gid;
7197}
7198static inline int tswapid(int id)
7199{
7200    return tswap16(id);
7201}
7202
7203#define put_user_id(x, gaddr) put_user_u16(x, gaddr)
7204
7205#else /* !USE_UID16 */
7206static inline int high2lowuid(int uid)
7207{
7208    return uid;
7209}
7210static inline int high2lowgid(int gid)
7211{
7212    return gid;
7213}
7214static inline int low2highuid(int uid)
7215{
7216    return uid;
7217}
7218static inline int low2highgid(int gid)
7219{
7220    return gid;
7221}
7222static inline int tswapid(int id)
7223{
7224    return tswap32(id);
7225}
7226
7227#define put_user_id(x, gaddr) put_user_u32(x, gaddr)
7228
7229#endif /* USE_UID16 */
7230
7231/* We must do direct syscalls for setting UID/GID, because we want to
7232 * implement the Linux system call semantics of "change only for this thread",
7233 * not the libc/POSIX semantics of "change for all threads in process".
7234 * (See http://ewontfix.com/17/ for more details.)
7235 * We use the 32-bit version of the syscalls if present; if it is not
7236 * then either the host architecture supports 32-bit UIDs natively with
7237 * the standard syscall, or the 16-bit UID is the best we can do.
7238 */
7239#ifdef __NR_setuid32
7240#define __NR_sys_setuid __NR_setuid32
7241#else
7242#define __NR_sys_setuid __NR_setuid
7243#endif
7244#ifdef __NR_setgid32
7245#define __NR_sys_setgid __NR_setgid32
7246#else
7247#define __NR_sys_setgid __NR_setgid
7248#endif
7249#ifdef __NR_setresuid32
7250#define __NR_sys_setresuid __NR_setresuid32
7251#else
7252#define __NR_sys_setresuid __NR_setresuid
7253#endif
7254#ifdef __NR_setresgid32
7255#define __NR_sys_setresgid __NR_setresgid32
7256#else
7257#define __NR_sys_setresgid __NR_setresgid
7258#endif
7259#ifdef __NR_setgroups32
7260#define __NR_sys_setgroups __NR_setgroups32
7261#else
7262#define __NR_sys_setgroups __NR_setgroups
7263#endif
7264#ifdef __NR_sys_setreuid32
7265#define __NR_sys_setreuid __NR_setreuid32
7266#else
7267#define __NR_sys_setreuid __NR_setreuid
7268#endif
7269#ifdef __NR_sys_setregid32
7270#define __NR_sys_setregid __NR_setregid32
7271#else
7272#define __NR_sys_setregid __NR_setregid
7273#endif
7274
7275_syscall1(int, sys_setuid, uid_t, uid)
7276_syscall1(int, sys_setgid, gid_t, gid)
7277_syscall3(int, sys_setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
7278_syscall3(int, sys_setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
7279_syscall2(int, sys_setgroups, int, size, gid_t *, grouplist)
7280_syscall2(int, sys_setreuid, uid_t, ruid, uid_t, euid);
7281_syscall2(int, sys_setregid, gid_t, rgid, gid_t, egid);
7282
7283void syscall_init(void)
7284{
7285    IOCTLEntry *ie;
7286    const argtype *arg_type;
7287    int size;
7288
7289    thunk_init(STRUCT_MAX);
7290
7291#define STRUCT(name, ...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def);
7292#define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def);
7293#include "syscall_types.h"
7294#undef STRUCT
7295#undef STRUCT_SPECIAL
7296
7297    /* we patch the ioctl size if necessary. We rely on the fact that
7298       no ioctl has all the bits at '1' in the size field */
7299    ie = ioctl_entries;
7300    while (ie->target_cmd != 0) {
7301        if (((ie->target_cmd >> TARGET_IOC_SIZESHIFT) & TARGET_IOC_SIZEMASK) ==
7302            TARGET_IOC_SIZEMASK) {
7303            arg_type = ie->arg_type;
7304            if (arg_type[0] != TYPE_PTR) {
7305                fprintf(stderr, "cannot patch size for ioctl 0x%x\n",
7306                        ie->target_cmd);
7307                exit(1);
7308            }
7309            arg_type++;
7310            size = thunk_type_size(arg_type, 0);
7311            ie->target_cmd = (ie->target_cmd &
7312                              ~(TARGET_IOC_SIZEMASK << TARGET_IOC_SIZESHIFT)) |
7313                (size << TARGET_IOC_SIZESHIFT);
7314        }
7315
7316        /* automatic consistency check if same arch */
7317#if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \
7318    (defined(__x86_64__) && defined(TARGET_X86_64))
7319        if (unlikely(ie->target_cmd != ie->host_cmd)) {
7320            fprintf(stderr, "ERROR: ioctl(%s): target=0x%x host=0x%x\n",
7321                    ie->name, ie->target_cmd, ie->host_cmd);
7322        }
7323#endif
7324        ie++;
7325    }
7326}
7327
7328#ifdef TARGET_NR_truncate64
7329static inline abi_long target_truncate64(CPUArchState *cpu_env, const char *arg1,
7330                                         abi_long arg2,
7331                                         abi_long arg3,
7332                                         abi_long arg4)
7333{
7334    if (regpairs_aligned(cpu_env, TARGET_NR_truncate64)) {
7335        arg2 = arg3;
7336        arg3 = arg4;
7337    }
7338    return get_errno(truncate(arg1, target_offset64(arg2, arg3)));
7339}
7340#endif
7341
7342#ifdef TARGET_NR_ftruncate64
7343static inline abi_long target_ftruncate64(CPUArchState *cpu_env, abi_long arg1,
7344                                          abi_long arg2,
7345                                          abi_long arg3,
7346                                          abi_long arg4)
7347{
7348    if (regpairs_aligned(cpu_env, TARGET_NR_ftruncate64)) {
7349        arg2 = arg3;
7350        arg3 = arg4;
7351    }
7352    return get_errno(ftruncate(arg1, target_offset64(arg2, arg3)));
7353}
7354#endif
7355
7356#if defined(TARGET_NR_timer_settime) || \
7357    (defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD))
7358static inline abi_long target_to_host_itimerspec(struct itimerspec *host_its,
7359                                                 abi_ulong target_addr)
7360{
7361    if (target_to_host_timespec(&host_its->it_interval, target_addr +
7362                                offsetof(struct target_itimerspec,
7363                                         it_interval)) ||
7364        target_to_host_timespec(&host_its->it_value, target_addr +
7365                                offsetof(struct target_itimerspec,
7366                                         it_value))) {
7367        return -TARGET_EFAULT;
7368    }
7369
7370    return 0;
7371}
7372#endif
7373
7374#if defined(TARGET_NR_timer_settime64) || \
7375    (defined(TARGET_NR_timerfd_settime64) && defined(CONFIG_TIMERFD))
7376static inline abi_long target_to_host_itimerspec64(struct itimerspec *host_its,
7377                                                   abi_ulong target_addr)
7378{
7379    if (target_to_host_timespec64(&host_its->it_interval, target_addr +
7380                                  offsetof(struct target__kernel_itimerspec,
7381                                           it_interval)) ||
7382        target_to_host_timespec64(&host_its->it_value, target_addr +
7383                                  offsetof(struct target__kernel_itimerspec,
7384                                           it_value))) {
7385        return -TARGET_EFAULT;
7386    }
7387
7388    return 0;
7389}
7390#endif
7391
7392#if ((defined(TARGET_NR_timerfd_gettime) || \
7393      defined(TARGET_NR_timerfd_settime)) && defined(CONFIG_TIMERFD)) || \
7394      defined(TARGET_NR_timer_gettime) || defined(TARGET_NR_timer_settime)
7395static inline abi_long host_to_target_itimerspec(abi_ulong target_addr,
7396                                                 struct itimerspec *host_its)
7397{
7398    if (host_to_target_timespec(target_addr + offsetof(struct target_itimerspec,
7399                                                       it_interval),
7400                                &host_its->it_interval) ||
7401        host_to_target_timespec(target_addr + offsetof(struct target_itimerspec,
7402                                                       it_value),
7403                                &host_its->it_value)) {
7404        return -TARGET_EFAULT;
7405    }
7406    return 0;
7407}
7408#endif
7409
7410#if ((defined(TARGET_NR_timerfd_gettime64) || \
7411      defined(TARGET_NR_timerfd_settime64)) && defined(CONFIG_TIMERFD)) || \
7412      defined(TARGET_NR_timer_gettime64) || defined(TARGET_NR_timer_settime64)
7413static inline abi_long host_to_target_itimerspec64(abi_ulong target_addr,
7414                                                   struct itimerspec *host_its)
7415{
7416    if (host_to_target_timespec64(target_addr +
7417                                  offsetof(struct target__kernel_itimerspec,
7418                                           it_interval),
7419                                  &host_its->it_interval) ||
7420        host_to_target_timespec64(target_addr +
7421                                  offsetof(struct target__kernel_itimerspec,
7422                                           it_value),
7423                                  &host_its->it_value)) {
7424        return -TARGET_EFAULT;
7425    }
7426    return 0;
7427}
7428#endif
7429
7430#if defined(TARGET_NR_adjtimex) || \
7431    (defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME))
7432static inline abi_long target_to_host_timex(struct timex *host_tx,
7433                                            abi_long target_addr)
7434{
7435    struct target_timex *target_tx;
7436
7437    if (!lock_user_struct(VERIFY_READ, target_tx, target_addr, 1)) {
7438        return -TARGET_EFAULT;
7439    }
7440
7441    __get_user(host_tx->modes, &target_tx->modes);
7442    __get_user(host_tx->offset, &target_tx->offset);
7443    __get_user(host_tx->freq, &target_tx->freq);
7444    __get_user(host_tx->maxerror, &target_tx->maxerror);
7445    __get_user(host_tx->esterror, &target_tx->esterror);
7446    __get_user(host_tx->status, &target_tx->status);
7447    __get_user(host_tx->constant, &target_tx->constant);
7448    __get_user(host_tx->precision, &target_tx->precision);
7449    __get_user(host_tx->tolerance, &target_tx->tolerance);
7450    __get_user(host_tx->time.tv_sec, &target_tx->time.tv_sec);
7451    __get_user(host_tx->time.tv_usec, &target_tx->time.tv_usec);
7452    __get_user(host_tx->tick, &target_tx->tick);
7453    __get_user(host_tx->ppsfreq, &target_tx->ppsfreq);
7454    __get_user(host_tx->jitter, &target_tx->jitter);
7455    __get_user(host_tx->shift, &target_tx->shift);
7456    __get_user(host_tx->stabil, &target_tx->stabil);
7457    __get_user(host_tx->jitcnt, &target_tx->jitcnt);
7458    __get_user(host_tx->calcnt, &target_tx->calcnt);
7459    __get_user(host_tx->errcnt, &target_tx->errcnt);
7460    __get_user(host_tx->stbcnt, &target_tx->stbcnt);
7461    __get_user(host_tx->tai, &target_tx->tai);
7462
7463    unlock_user_struct(target_tx, target_addr, 0);
7464    return 0;
7465}
7466
7467static inline abi_long host_to_target_timex(abi_long target_addr,
7468                                            struct timex *host_tx)
7469{
7470    struct target_timex *target_tx;
7471
7472    if (!lock_user_struct(VERIFY_WRITE, target_tx, target_addr, 0)) {
7473        return -TARGET_EFAULT;
7474    }
7475
7476    __put_user(host_tx->modes, &target_tx->modes);
7477    __put_user(host_tx->offset, &target_tx->offset);
7478    __put_user(host_tx->freq, &target_tx->freq);
7479    __put_user(host_tx->maxerror, &target_tx->maxerror);
7480    __put_user(host_tx->esterror, &target_tx->esterror);
7481    __put_user(host_tx->status, &target_tx->status);
7482    __put_user(host_tx->constant, &target_tx->constant);
7483    __put_user(host_tx->precision, &target_tx->precision);
7484    __put_user(host_tx->tolerance, &target_tx->tolerance);
7485    __put_user(host_tx->time.tv_sec, &target_tx->time.tv_sec);
7486    __put_user(host_tx->time.tv_usec, &target_tx->time.tv_usec);
7487    __put_user(host_tx->tick, &target_tx->tick);
7488    __put_user(host_tx->ppsfreq, &target_tx->ppsfreq);
7489    __put_user(host_tx->jitter, &target_tx->jitter);
7490    __put_user(host_tx->shift, &target_tx->shift);
7491    __put_user(host_tx->stabil, &target_tx->stabil);
7492    __put_user(host_tx->jitcnt, &target_tx->jitcnt);
7493    __put_user(host_tx->calcnt, &target_tx->calcnt);
7494    __put_user(host_tx->errcnt, &target_tx->errcnt);
7495    __put_user(host_tx->stbcnt, &target_tx->stbcnt);
7496    __put_user(host_tx->tai, &target_tx->tai);
7497
7498    unlock_user_struct(target_tx, target_addr, 1);
7499    return 0;
7500}
7501#endif
7502
7503
7504#if defined(TARGET_NR_clock_adjtime64) && defined(CONFIG_CLOCK_ADJTIME)
7505static inline abi_long target_to_host_timex64(struct timex *host_tx,
7506                                              abi_long target_addr)
7507{
7508    struct target__kernel_timex *target_tx;
7509
7510    if (copy_from_user_timeval64(&host_tx->time, target_addr +
7511                                 offsetof(struct target__kernel_timex,
7512                                          time))) {
7513        return -TARGET_EFAULT;
7514    }
7515
7516    if (!lock_user_struct(VERIFY_READ, target_tx, target_addr, 1)) {
7517        return -TARGET_EFAULT;
7518    }
7519
7520    __get_user(host_tx->modes, &target_tx->modes);
7521    __get_user(host_tx->offset, &target_tx->offset);
7522    __get_user(host_tx->freq, &target_tx->freq);
7523    __get_user(host_tx->maxerror, &target_tx->maxerror);
7524    __get_user(host_tx->esterror, &target_tx->esterror);
7525    __get_user(host_tx->status, &target_tx->status);
7526    __get_user(host_tx->constant, &target_tx->constant);
7527    __get_user(host_tx->precision, &target_tx->precision);
7528    __get_user(host_tx->tolerance, &target_tx->tolerance);
7529    __get_user(host_tx->tick, &target_tx->tick);
7530    __get_user(host_tx->ppsfreq, &target_tx->ppsfreq);
7531    __get_user(host_tx->jitter, &target_tx->jitter);
7532    __get_user(host_tx->shift, &target_tx->shift);
7533    __get_user(host_tx->stabil, &target_tx->stabil);
7534    __get_user(host_tx->jitcnt, &target_tx->jitcnt);
7535    __get_user(host_tx->calcnt, &target_tx->calcnt);
7536    __get_user(host_tx->errcnt, &target_tx->errcnt);
7537    __get_user(host_tx->stbcnt, &target_tx->stbcnt);
7538    __get_user(host_tx->tai, &target_tx->tai);
7539
7540    unlock_user_struct(target_tx, target_addr, 0);
7541    return 0;
7542}
7543
7544static inline abi_long host_to_target_timex64(abi_long target_addr,
7545                                              struct timex *host_tx)
7546{
7547    struct target__kernel_timex *target_tx;
7548
7549   if (copy_to_user_timeval64(target_addr +
7550                              offsetof(struct target__kernel_timex, time),
7551                              &host_tx->time)) {
7552        return -TARGET_EFAULT;
7553    }
7554
7555    if (!lock_user_struct(VERIFY_WRITE, target_tx, target_addr, 0)) {
7556        return -TARGET_EFAULT;
7557    }
7558
7559    __put_user(host_tx->modes, &target_tx->modes);
7560    __put_user(host_tx->offset, &target_tx->offset);
7561    __put_user(host_tx->freq, &target_tx->freq);
7562    __put_user(host_tx->maxerror, &target_tx->maxerror);
7563    __put_user(host_tx->esterror, &target_tx->esterror);
7564    __put_user(host_tx->status, &target_tx->status);
7565    __put_user(host_tx->constant, &target_tx->constant);
7566    __put_user(host_tx->precision, &target_tx->precision);
7567    __put_user(host_tx->tolerance, &target_tx->tolerance);
7568    __put_user(host_tx->tick, &target_tx->tick);
7569    __put_user(host_tx->ppsfreq, &target_tx->ppsfreq);
7570    __put_user(host_tx->jitter, &target_tx->jitter);
7571    __put_user(host_tx->shift, &target_tx->shift);
7572    __put_user(host_tx->stabil, &target_tx->stabil);
7573    __put_user(host_tx->jitcnt, &target_tx->jitcnt);
7574    __put_user(host_tx->calcnt, &target_tx->calcnt);
7575    __put_user(host_tx->errcnt, &target_tx->errcnt);
7576    __put_user(host_tx->stbcnt, &target_tx->stbcnt);
7577    __put_user(host_tx->tai, &target_tx->tai);
7578
7579    unlock_user_struct(target_tx, target_addr, 1);
7580    return 0;
7581}
7582#endif
7583
7584#ifndef HAVE_SIGEV_NOTIFY_THREAD_ID
7585#define sigev_notify_thread_id _sigev_un._tid
7586#endif
7587
7588static inline abi_long target_to_host_sigevent(struct sigevent *host_sevp,
7589                                               abi_ulong target_addr)
7590{
7591    struct target_sigevent *target_sevp;
7592
7593    if (!lock_user_struct(VERIFY_READ, target_sevp, target_addr, 1)) {
7594        return -TARGET_EFAULT;
7595    }
7596
7597    /* This union is awkward on 64 bit systems because it has a 32 bit
7598     * integer and a pointer in it; we follow the conversion approach
7599     * used for handling sigval types in signal.c so the guest should get
7600     * the correct value back even if we did a 64 bit byteswap and it's
7601     * using the 32 bit integer.
7602     */
7603    host_sevp->sigev_value.sival_ptr =
7604        (void *)(uintptr_t)tswapal(target_sevp->sigev_value.sival_ptr);
7605    host_sevp->sigev_signo =
7606        target_to_host_signal(tswap32(target_sevp->sigev_signo));
7607    host_sevp->sigev_notify = tswap32(target_sevp->sigev_notify);
7608    host_sevp->sigev_notify_thread_id = tswap32(target_sevp->_sigev_un._tid);
7609
7610    unlock_user_struct(target_sevp, target_addr, 1);
7611    return 0;
7612}
7613
7614#if defined(TARGET_NR_mlockall)
7615static inline int target_to_host_mlockall_arg(int arg)
7616{
7617    int result = 0;
7618
7619    if (arg & TARGET_MCL_CURRENT) {
7620        result |= MCL_CURRENT;
7621    }
7622    if (arg & TARGET_MCL_FUTURE) {
7623        result |= MCL_FUTURE;
7624    }
7625#ifdef MCL_ONFAULT
7626    if (arg & TARGET_MCL_ONFAULT) {
7627        result |= MCL_ONFAULT;
7628    }
7629#endif
7630
7631    return result;
7632}
7633#endif
7634
7635static inline int target_to_host_msync_arg(abi_long arg)
7636{
7637    return ((arg & TARGET_MS_ASYNC) ? MS_ASYNC : 0) |
7638           ((arg & TARGET_MS_INVALIDATE) ? MS_INVALIDATE : 0) |
7639           ((arg & TARGET_MS_SYNC) ? MS_SYNC : 0) |
7640           (arg & ~(TARGET_MS_ASYNC | TARGET_MS_INVALIDATE | TARGET_MS_SYNC));
7641}
7642
7643#if (defined(TARGET_NR_stat64) || defined(TARGET_NR_lstat64) ||     \
7644     defined(TARGET_NR_fstat64) || defined(TARGET_NR_fstatat64) ||  \
7645     defined(TARGET_NR_newfstatat))
7646static inline abi_long host_to_target_stat64(CPUArchState *cpu_env,
7647                                             abi_ulong target_addr,
7648                                             struct stat *host_st)
7649{
7650#if defined(TARGET_ARM) && defined(TARGET_ABI32)
7651    if (cpu_env->eabi) {
7652        struct target_eabi_stat64 *target_st;
7653
7654        if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0))
7655            return -TARGET_EFAULT;
7656        memset(target_st, 0, sizeof(struct target_eabi_stat64));
7657        __put_user(host_st->st_dev, &target_st->st_dev);
7658        __put_user(host_st->st_ino, &target_st->st_ino);
7659#ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
7660        __put_user(host_st->st_ino, &target_st->__st_ino);
7661#endif
7662        __put_user(host_st->st_mode, &target_st->st_mode);
7663        __put_user(host_st->st_nlink, &target_st->st_nlink);
7664        __put_user(host_st->st_uid, &target_st->st_uid);
7665        __put_user(host_st->st_gid, &target_st->st_gid);
7666        __put_user(host_st->st_rdev, &target_st->st_rdev);
7667        __put_user(host_st->st_size, &target_st->st_size);
7668        __put_user(host_st->st_blksize, &target_st->st_blksize);
7669        __put_user(host_st->st_blocks, &target_st->st_blocks);
7670        __put_user(host_st->st_atime, &target_st->target_st_atime);
7671        __put_user(host_st->st_mtime, &target_st->target_st_mtime);
7672        __put_user(host_st->st_ctime, &target_st->target_st_ctime);
7673#ifdef HAVE_STRUCT_STAT_ST_ATIM
7674        __put_user(host_st->st_atim.tv_nsec, &target_st->target_st_atime_nsec);
7675        __put_user(host_st->st_mtim.tv_nsec, &target_st->target_st_mtime_nsec);
7676        __put_user(host_st->st_ctim.tv_nsec, &target_st->target_st_ctime_nsec);
7677#endif
7678        unlock_user_struct(target_st, target_addr, 1);
7679    } else
7680#endif
7681    {
7682#if defined(TARGET_HAS_STRUCT_STAT64)
7683        struct target_stat64 *target_st;
7684#else
7685        struct target_stat *target_st;
7686#endif
7687
7688        if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0))
7689            return -TARGET_EFAULT;
7690        memset(target_st, 0, sizeof(*target_st));
7691        __put_user(host_st->st_dev, &target_st->st_dev);
7692        __put_user(host_st->st_ino, &target_st->st_ino);
7693#ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
7694        __put_user(host_st->st_ino, &target_st->__st_ino);
7695#endif
7696        __put_user(host_st->st_mode, &target_st->st_mode);
7697        __put_user(host_st->st_nlink, &target_st->st_nlink);
7698        __put_user(host_st->st_uid, &target_st->st_uid);
7699        __put_user(host_st->st_gid, &target_st->st_gid);
7700        __put_user(host_st->st_rdev, &target_st->st_rdev);
7701        /* XXX: better use of kernel struct */
7702        __put_user(host_st->st_size, &target_st->st_size);
7703        __put_user(host_st->st_blksize, &target_st->st_blksize);
7704        __put_user(host_st->st_blocks, &target_st->st_blocks);
7705        __put_user(host_st->st_atime, &target_st->target_st_atime);
7706        __put_user(host_st->st_mtime, &target_st->target_st_mtime);
7707        __put_user(host_st->st_ctime, &target_st->target_st_ctime);
7708#ifdef HAVE_STRUCT_STAT_ST_ATIM
7709        __put_user(host_st->st_atim.tv_nsec, &target_st->target_st_atime_nsec);
7710        __put_user(host_st->st_mtim.tv_nsec, &target_st->target_st_mtime_nsec);
7711        __put_user(host_st->st_ctim.tv_nsec, &target_st->target_st_ctime_nsec);
7712#endif
7713        unlock_user_struct(target_st, target_addr, 1);
7714    }
7715
7716    return 0;
7717}
7718#endif
7719
7720#if defined(TARGET_NR_statx) && defined(__NR_statx)
7721static inline abi_long host_to_target_statx(struct target_statx *host_stx,
7722                                            abi_ulong target_addr)
7723{
7724    struct target_statx *target_stx;
7725
7726    if (!lock_user_struct(VERIFY_WRITE, target_stx, target_addr,  0)) {
7727        return -TARGET_EFAULT;
7728    }
7729    memset(target_stx, 0, sizeof(*target_stx));
7730
7731    __put_user(host_stx->stx_mask, &target_stx->stx_mask);
7732    __put_user(host_stx->stx_blksize, &target_stx->stx_blksize);
7733    __put_user(host_stx->stx_attributes, &target_stx->stx_attributes);
7734    __put_user(host_stx->stx_nlink, &target_stx->stx_nlink);
7735    __put_user(host_stx->stx_uid, &target_stx->stx_uid);
7736    __put_user(host_stx->stx_gid, &target_stx->stx_gid);
7737    __put_user(host_stx->stx_mode, &target_stx->stx_mode);
7738    __put_user(host_stx->stx_ino, &target_stx->stx_ino);
7739    __put_user(host_stx->stx_size, &target_stx->stx_size);
7740    __put_user(host_stx->stx_blocks, &target_stx->stx_blocks);
7741    __put_user(host_stx->stx_attributes_mask, &target_stx->stx_attributes_mask);
7742    __put_user(host_stx->stx_atime.tv_sec, &target_stx->stx_atime.tv_sec);
7743    __put_user(host_stx->stx_atime.tv_nsec, &target_stx->stx_atime.tv_nsec);
7744    __put_user(host_stx->stx_btime.tv_sec, &target_stx->stx_btime.tv_sec);
7745    __put_user(host_stx->stx_btime.tv_nsec, &target_stx->stx_btime.tv_nsec);
7746    __put_user(host_stx->stx_ctime.tv_sec, &target_stx->stx_ctime.tv_sec);
7747    __put_user(host_stx->stx_ctime.tv_nsec, &target_stx->stx_ctime.tv_nsec);
7748    __put_user(host_stx->stx_mtime.tv_sec, &target_stx->stx_mtime.tv_sec);
7749    __put_user(host_stx->stx_mtime.tv_nsec, &target_stx->stx_mtime.tv_nsec);
7750    __put_user(host_stx->stx_rdev_major, &target_stx->stx_rdev_major);
7751    __put_user(host_stx->stx_rdev_minor, &target_stx->stx_rdev_minor);
7752    __put_user(host_stx->stx_dev_major, &target_stx->stx_dev_major);
7753    __put_user(host_stx->stx_dev_minor, &target_stx->stx_dev_minor);
7754
7755    unlock_user_struct(target_stx, target_addr, 1);
7756
7757    return 0;
7758}
7759#endif
7760
7761static int do_sys_futex(int *uaddr, int op, int val,
7762                         const struct timespec *timeout, int *uaddr2,
7763                         int val3)
7764{
7765#if HOST_LONG_BITS == 64
7766#if defined(__NR_futex)
7767    /* always a 64-bit time_t, it doesn't define _time64 version  */
7768    return sys_futex(uaddr, op, val, timeout, uaddr2, val3);
7769
7770#endif
7771#else /* HOST_LONG_BITS == 64 */
7772#if defined(__NR_futex_time64)
7773    if (sizeof(timeout->tv_sec) == 8) {
7774        /* _time64 function on 32bit arch */
7775        return sys_futex_time64(uaddr, op, val, timeout, uaddr2, val3);
7776    }
7777#endif
7778#if defined(__NR_futex)
7779    /* old function on 32bit arch */
7780    return sys_futex(uaddr, op, val, timeout, uaddr2, val3);
7781#endif
7782#endif /* HOST_LONG_BITS == 64 */
7783    g_assert_not_reached();
7784}
7785
7786static int do_safe_futex(int *uaddr, int op, int val,
7787                         const struct timespec *timeout, int *uaddr2,
7788                         int val3)
7789{
7790#if HOST_LONG_BITS == 64
7791#if defined(__NR_futex)
7792    /* always a 64-bit time_t, it doesn't define _time64 version  */
7793    return get_errno(safe_futex(uaddr, op, val, timeout, uaddr2, val3));
7794#endif
7795#else /* HOST_LONG_BITS == 64 */
7796#if defined(__NR_futex_time64)
7797    if (sizeof(timeout->tv_sec) == 8) {
7798        /* _time64 function on 32bit arch */
7799        return get_errno(safe_futex_time64(uaddr, op, val, timeout, uaddr2,
7800                                           val3));
7801    }
7802#endif
7803#if defined(__NR_futex)
7804    /* old function on 32bit arch */
7805    return get_errno(safe_futex(uaddr, op, val, timeout, uaddr2, val3));
7806#endif
7807#endif /* HOST_LONG_BITS == 64 */
7808    return -TARGET_ENOSYS;
7809}
7810
7811/* ??? Using host futex calls even when target atomic operations
7812   are not really atomic probably breaks things.  However implementing
7813   futexes locally would make futexes shared between multiple processes
7814   tricky.  However they're probably useless because guest atomic
7815   operations won't work either.  */
7816#if defined(TARGET_NR_futex) || defined(TARGET_NR_futex_time64)
7817static int do_futex(CPUState *cpu, bool time64, target_ulong uaddr,
7818                    int op, int val, target_ulong timeout,
7819                    target_ulong uaddr2, int val3)
7820{
7821    struct timespec ts, *pts = NULL;
7822    void *haddr2 = NULL;
7823    int base_op;
7824
7825    /* We assume FUTEX_* constants are the same on both host and target. */
7826#ifdef FUTEX_CMD_MASK
7827    base_op = op & FUTEX_CMD_MASK;
7828#else
7829    base_op = op;
7830#endif
7831    switch (base_op) {
7832    case FUTEX_WAIT:
7833    case FUTEX_WAIT_BITSET:
7834        val = tswap32(val);
7835        break;
7836    case FUTEX_WAIT_REQUEUE_PI:
7837        val = tswap32(val);
7838        haddr2 = g2h(cpu, uaddr2);
7839        break;
7840    case FUTEX_LOCK_PI:
7841    case FUTEX_LOCK_PI2:
7842        break;
7843    case FUTEX_WAKE:
7844    case FUTEX_WAKE_BITSET:
7845    case FUTEX_TRYLOCK_PI:
7846    case FUTEX_UNLOCK_PI:
7847        timeout = 0;
7848        break;
7849    case FUTEX_FD:
7850        val = target_to_host_signal(val);
7851        timeout = 0;
7852        break;
7853    case FUTEX_CMP_REQUEUE:
7854    case FUTEX_CMP_REQUEUE_PI:
7855        val3 = tswap32(val3);
7856        /* fall through */
7857    case FUTEX_REQUEUE:
7858    case FUTEX_WAKE_OP:
7859        /*
7860         * For these, the 4th argument is not TIMEOUT, but VAL2.
7861         * But the prototype of do_safe_futex takes a pointer, so
7862         * insert casts to satisfy the compiler.  We do not need
7863         * to tswap VAL2 since it's not compared to guest memory.
7864          */
7865        pts = (struct timespec *)(uintptr_t)timeout;
7866        timeout = 0;
7867        haddr2 = g2h(cpu, uaddr2);
7868        break;
7869    default:
7870        return -TARGET_ENOSYS;
7871    }
7872    if (timeout) {
7873        pts = &ts;
7874        if (time64
7875            ? target_to_host_timespec64(pts, timeout)
7876            : target_to_host_timespec(pts, timeout)) {
7877            return -TARGET_EFAULT;
7878        }
7879    }
7880    return do_safe_futex(g2h(cpu, uaddr), op, val, pts, haddr2, val3);
7881}
7882#endif
7883
7884#if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7885static abi_long do_name_to_handle_at(abi_long dirfd, abi_long pathname,
7886                                     abi_long handle, abi_long mount_id,
7887                                     abi_long flags)
7888{
7889    struct file_handle *target_fh;
7890    struct file_handle *fh;
7891    int mid = 0;
7892    abi_long ret;
7893    char *name;
7894    unsigned int size, total_size;
7895
7896    if (get_user_s32(size, handle)) {
7897        return -TARGET_EFAULT;
7898    }
7899
7900    name = lock_user_string(pathname);
7901    if (!name) {
7902        return -TARGET_EFAULT;
7903    }
7904
7905    total_size = sizeof(struct file_handle) + size;
7906    target_fh = lock_user(VERIFY_WRITE, handle, total_size, 0);
7907    if (!target_fh) {
7908        unlock_user(name, pathname, 0);
7909        return -TARGET_EFAULT;
7910    }
7911
7912    fh = g_malloc0(total_size);
7913    fh->handle_bytes = size;
7914
7915    ret = get_errno(name_to_handle_at(dirfd, path(name), fh, &mid, flags));
7916    unlock_user(name, pathname, 0);
7917
7918    /* man name_to_handle_at(2):
7919     * Other than the use of the handle_bytes field, the caller should treat
7920     * the file_handle structure as an opaque data type
7921     */
7922
7923    memcpy(target_fh, fh, total_size);
7924    target_fh->handle_bytes = tswap32(fh->handle_bytes);
7925    target_fh->handle_type = tswap32(fh->handle_type);
7926    g_free(fh);
7927    unlock_user(target_fh, handle, total_size);
7928
7929    if (put_user_s32(mid, mount_id)) {
7930        return -TARGET_EFAULT;
7931    }
7932
7933    return ret;
7934
7935}
7936#endif
7937
7938#if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7939static abi_long do_open_by_handle_at(abi_long mount_fd, abi_long handle,
7940                                     abi_long flags)
7941{
7942    struct file_handle *target_fh;
7943    struct file_handle *fh;
7944    unsigned int size, total_size;
7945    abi_long ret;
7946
7947    if (get_user_s32(size, handle)) {
7948        return -TARGET_EFAULT;
7949    }
7950
7951    total_size = sizeof(struct file_handle) + size;
7952    target_fh = lock_user(VERIFY_READ, handle, total_size, 1);
7953    if (!target_fh) {
7954        return -TARGET_EFAULT;
7955    }
7956
7957    fh = g_memdup(target_fh, total_size);
7958    fh->handle_bytes = size;
7959    fh->handle_type = tswap32(target_fh->handle_type);
7960
7961    ret = get_errno(open_by_handle_at(mount_fd, fh,
7962                    target_to_host_bitmask(flags, fcntl_flags_tbl)));
7963
7964    g_free(fh);
7965
7966    unlock_user(target_fh, handle, total_size);
7967
7968    return ret;
7969}
7970#endif
7971
7972#if defined(TARGET_NR_signalfd) || defined(TARGET_NR_signalfd4)
7973
7974static abi_long do_signalfd4(int fd, abi_long mask, int flags)
7975{
7976    int host_flags;
7977    target_sigset_t *target_mask;
7978    sigset_t host_mask;
7979    abi_long ret;
7980
7981    if (flags & ~(TARGET_O_NONBLOCK_MASK | TARGET_O_CLOEXEC)) {
7982        return -TARGET_EINVAL;
7983    }
7984    if (!lock_user_struct(VERIFY_READ, target_mask, mask, 1)) {
7985        return -TARGET_EFAULT;
7986    }
7987
7988    target_to_host_sigset(&host_mask, target_mask);
7989
7990    host_flags = target_to_host_bitmask(flags, fcntl_flags_tbl);
7991
7992    ret = get_errno(signalfd(fd, &host_mask, host_flags));
7993    if (ret >= 0) {
7994        fd_trans_register(ret, &target_signalfd_trans);
7995    }
7996
7997    unlock_user_struct(target_mask, mask, 0);
7998
7999    return ret;
8000}
8001#endif
8002
8003/* Map host to target signal numbers for the wait family of syscalls.
8004   Assume all other status bits are the same.  */
8005int host_to_target_waitstatus(int status)
8006{
8007    if (WIFSIGNALED(status)) {
8008        return host_to_target_signal(WTERMSIG(status)) | (status & ~0x7f);
8009    }
8010    if (WIFSTOPPED(status)) {
8011        return (host_to_target_signal(WSTOPSIG(status)) << 8)
8012               | (status & 0xff);
8013    }
8014    return status;
8015}
8016
8017static int open_self_cmdline(CPUArchState *cpu_env, int fd)
8018{
8019    CPUState *cpu = env_cpu(cpu_env);
8020    struct linux_binprm *bprm = get_task_state(cpu)->bprm;
8021    int i;
8022
8023    for (i = 0; i < bprm->argc; i++) {
8024        size_t len = strlen(bprm->argv[i]) + 1;
8025
8026        if (write(fd, bprm->argv[i], len) != len) {
8027            return -1;
8028        }
8029    }
8030
8031    return 0;
8032}
8033
8034struct open_self_maps_data {
8035    TaskState *ts;
8036    IntervalTreeRoot *host_maps;
8037    int fd;
8038    bool smaps;
8039};
8040
8041/*
8042 * Subroutine to output one line of /proc/self/maps,
8043 * or one region of /proc/self/smaps.
8044 */
8045
8046#ifdef TARGET_HPPA
8047# define test_stack(S, E, L)  (E == L)
8048#else
8049# define test_stack(S, E, L)  (S == L)
8050#endif
8051
8052static void open_self_maps_4(const struct open_self_maps_data *d,
8053                             const MapInfo *mi, abi_ptr start,
8054                             abi_ptr end, unsigned flags)
8055{
8056    const struct image_info *info = d->ts->info;
8057    const char *path = mi->path;
8058    uint64_t offset;
8059    int fd = d->fd;
8060    int count;
8061
8062    if (test_stack(start, end, info->stack_limit)) {
8063        path = "[stack]";
8064    } else if (start == info->brk) {
8065        path = "[heap]";
8066    } else if (start == info->vdso) {
8067        path = "[vdso]";
8068#ifdef TARGET_X86_64
8069    } else if (start == TARGET_VSYSCALL_PAGE) {
8070        path = "[vsyscall]";
8071#endif
8072    }
8073
8074    /* Except null device (MAP_ANON), adjust offset for this fragment. */
8075    offset = mi->offset;
8076    if (mi->dev) {
8077        uintptr_t hstart = (uintptr_t)g2h_untagged(start);
8078        offset += hstart - mi->itree.start;
8079    }
8080
8081    count = dprintf(fd, TARGET_ABI_FMT_ptr "-" TARGET_ABI_FMT_ptr
8082                    " %c%c%c%c %08" PRIx64 " %02x:%02x %"PRId64,
8083                    start, end,
8084                    (flags & PAGE_READ) ? 'r' : '-',
8085                    (flags & PAGE_WRITE_ORG) ? 'w' : '-',
8086                    (flags & PAGE_EXEC) ? 'x' : '-',
8087                    mi->is_priv ? 'p' : 's',
8088                    offset, major(mi->dev), minor(mi->dev),
8089                    (uint64_t)mi->inode);
8090    if (path) {
8091        dprintf(fd, "%*s%s\n", 73 - count, "", path);
8092    } else {
8093        dprintf(fd, "\n");
8094    }
8095
8096    if (d->smaps) {
8097        unsigned long size = end - start;
8098        unsigned long page_size_kb = TARGET_PAGE_SIZE >> 10;
8099        unsigned long size_kb = size >> 10;
8100
8101        dprintf(fd, "Size:                  %lu kB\n"
8102                "KernelPageSize:        %lu kB\n"
8103                "MMUPageSize:           %lu kB\n"
8104                "Rss:                   0 kB\n"
8105                "Pss:                   0 kB\n"
8106                "Pss_Dirty:             0 kB\n"
8107                "Shared_Clean:          0 kB\n"
8108                "Shared_Dirty:          0 kB\n"
8109                "Private_Clean:         0 kB\n"
8110                "Private_Dirty:         0 kB\n"
8111                "Referenced:            0 kB\n"
8112                "Anonymous:             %lu kB\n"
8113                "LazyFree:              0 kB\n"
8114                "AnonHugePages:         0 kB\n"
8115                "ShmemPmdMapped:        0 kB\n"
8116                "FilePmdMapped:         0 kB\n"
8117                "Shared_Hugetlb:        0 kB\n"
8118                "Private_Hugetlb:       0 kB\n"
8119                "Swap:                  0 kB\n"
8120                "SwapPss:               0 kB\n"
8121                "Locked:                0 kB\n"
8122                "THPeligible:    0\n"
8123                "VmFlags:%s%s%s%s%s%s%s%s\n",
8124                size_kb, page_size_kb, page_size_kb,
8125                (flags & PAGE_ANON ? size_kb : 0),
8126                (flags & PAGE_READ) ? " rd" : "",
8127                (flags & PAGE_WRITE_ORG) ? " wr" : "",
8128                (flags & PAGE_EXEC) ? " ex" : "",
8129                mi->is_priv ? "" : " sh",
8130                (flags & PAGE_READ) ? " mr" : "",
8131                (flags & PAGE_WRITE_ORG) ? " mw" : "",
8132                (flags & PAGE_EXEC) ? " me" : "",
8133                mi->is_priv ? "" : " ms");
8134    }
8135}
8136
8137/*
8138 * Callback for walk_memory_regions, when read_self_maps() fails.
8139 * Proceed without the benefit of host /proc/self/maps cross-check.
8140 */
8141static int open_self_maps_3(void *opaque, vaddr guest_start,
8142                            vaddr guest_end, int flags)
8143{
8144    static const MapInfo mi = { .is_priv = true };
8145
8146    open_self_maps_4(opaque, &mi, guest_start, guest_end, flags);
8147    return 0;
8148}
8149
8150/*
8151 * Callback for walk_memory_regions, when read_self_maps() succeeds.
8152 */
8153static int open_self_maps_2(void *opaque, vaddr guest_start,
8154                            vaddr guest_end, int flags)
8155{
8156    const struct open_self_maps_data *d = opaque;
8157    uintptr_t host_start = (uintptr_t)g2h_untagged(guest_start);
8158    uintptr_t host_last = (uintptr_t)g2h_untagged(guest_end - 1);
8159
8160#ifdef TARGET_X86_64
8161    /*
8162     * Because of the extremely high position of the page within the guest
8163     * virtual address space, this is not backed by host memory at all.
8164     * Therefore the loop below would fail.  This is the only instance
8165     * of not having host backing memory.
8166     */
8167    if (guest_start == TARGET_VSYSCALL_PAGE) {
8168        return open_self_maps_3(opaque, guest_start, guest_end, flags);
8169    }
8170#endif
8171
8172    while (1) {
8173        IntervalTreeNode *n =
8174            interval_tree_iter_first(d->host_maps, host_start, host_start);
8175        MapInfo *mi = container_of(n, MapInfo, itree);
8176        uintptr_t this_hlast = MIN(host_last, n->last);
8177        target_ulong this_gend = h2g(this_hlast) + 1;
8178
8179        open_self_maps_4(d, mi, guest_start, this_gend, flags);
8180
8181        if (this_hlast == host_last) {
8182            return 0;
8183        }
8184        host_start = this_hlast + 1;
8185        guest_start = h2g(host_start);
8186    }
8187}
8188
8189static int open_self_maps_1(CPUArchState *env, int fd, bool smaps)
8190{
8191    struct open_self_maps_data d = {
8192        .ts = get_task_state(env_cpu(env)),
8193        .fd = fd,
8194        .smaps = smaps
8195    };
8196
8197    mmap_lock();
8198    d.host_maps = read_self_maps();
8199    if (d.host_maps) {
8200        walk_memory_regions(&d, open_self_maps_2);
8201        free_self_maps(d.host_maps);
8202    } else {
8203        walk_memory_regions(&d, open_self_maps_3);
8204    }
8205    mmap_unlock();
8206    return 0;
8207}
8208
8209static int open_self_maps(CPUArchState *cpu_env, int fd)
8210{
8211    return open_self_maps_1(cpu_env, fd, false);
8212}
8213
8214static int open_self_smaps(CPUArchState *cpu_env, int fd)
8215{
8216    return open_self_maps_1(cpu_env, fd, true);
8217}
8218
8219static int open_self_stat(CPUArchState *cpu_env, int fd)
8220{
8221    CPUState *cpu = env_cpu(cpu_env);
8222    TaskState *ts = get_task_state(cpu);
8223    g_autoptr(GString) buf = g_string_new(NULL);
8224    int i;
8225
8226    for (i = 0; i < 44; i++) {
8227        if (i == 0) {
8228            /* pid */
8229            g_string_printf(buf, FMT_pid " ", getpid());
8230        } else if (i == 1) {
8231            /* app name */
8232            gchar *bin = g_strrstr(ts->bprm->argv[0], "/");
8233            bin = bin ? bin + 1 : ts->bprm->argv[0];
8234            g_string_printf(buf, "(%.15s) ", bin);
8235        } else if (i == 2) {
8236            /* task state */
8237            g_string_assign(buf, "R "); /* we are running right now */
8238        } else if (i == 3) {
8239            /* ppid */
8240            g_string_printf(buf, FMT_pid " ", getppid());
8241        } else if (i == 4) {
8242            /* pgid */
8243            g_string_printf(buf, FMT_pid " ", getpgrp());
8244        } else if (i == 19) {
8245            /* num_threads */
8246            int cpus = 0;
8247            WITH_RCU_READ_LOCK_GUARD() {
8248                CPUState *cpu_iter;
8249                CPU_FOREACH(cpu_iter) {
8250                    cpus++;
8251                }
8252            }
8253            g_string_printf(buf, "%d ", cpus);
8254        } else if (i == 21) {
8255            /* starttime */
8256            g_string_printf(buf, "%" PRIu64 " ", ts->start_boottime);
8257        } else if (i == 27) {
8258            /* stack bottom */
8259            g_string_printf(buf, TARGET_ABI_FMT_ld " ", ts->info->start_stack);
8260        } else {
8261            /* for the rest, there is MasterCard */
8262            g_string_printf(buf, "0%c", i == 43 ? '\n' : ' ');
8263        }
8264
8265        if (write(fd, buf->str, buf->len) != buf->len) {
8266            return -1;
8267        }
8268    }
8269
8270    return 0;
8271}
8272
8273static int open_self_auxv(CPUArchState *cpu_env, int fd)
8274{
8275    CPUState *cpu = env_cpu(cpu_env);
8276    TaskState *ts = get_task_state(cpu);
8277    abi_ulong auxv = ts->info->saved_auxv;
8278    abi_ulong len = ts->info->auxv_len;
8279    char *ptr;
8280
8281    /*
8282     * Auxiliary vector is stored in target process stack.
8283     * read in whole auxv vector and copy it to file
8284     */
8285    ptr = lock_user(VERIFY_READ, auxv, len, 0);
8286    if (ptr != NULL) {
8287        while (len > 0) {
8288            ssize_t r;
8289            r = write(fd, ptr, len);
8290            if (r <= 0) {
8291                break;
8292            }
8293            len -= r;
8294            ptr += r;
8295        }
8296        lseek(fd, 0, SEEK_SET);
8297        unlock_user(ptr, auxv, len);
8298    }
8299
8300    return 0;
8301}
8302
8303static int is_proc_myself(const char *filename, const char *entry)
8304{
8305    if (!strncmp(filename, "/proc/", strlen("/proc/"))) {
8306        filename += strlen("/proc/");
8307        if (!strncmp(filename, "self/", strlen("self/"))) {
8308            filename += strlen("self/");
8309        } else if (*filename >= '1' && *filename <= '9') {
8310            char myself[80];
8311            snprintf(myself, sizeof(myself), "%d/", getpid());
8312            if (!strncmp(filename, myself, strlen(myself))) {
8313                filename += strlen(myself);
8314            } else {
8315                return 0;
8316            }
8317        } else {
8318            return 0;
8319        }
8320        if (!strcmp(filename, entry)) {
8321            return 1;
8322        }
8323    }
8324    return 0;
8325}
8326
8327static void excp_dump_file(FILE *logfile, CPUArchState *env,
8328                      const char *fmt, int code)
8329{
8330    if (logfile) {
8331        CPUState *cs = env_cpu(env);
8332
8333        fprintf(logfile, fmt, code);
8334        fprintf(logfile, "Failing executable: %s\n", exec_path);
8335        cpu_dump_state(cs, logfile, 0);
8336        open_self_maps(env, fileno(logfile));
8337    }
8338}
8339
8340void target_exception_dump(CPUArchState *env, const char *fmt, int code)
8341{
8342    /* dump to console */
8343    excp_dump_file(stderr, env, fmt, code);
8344
8345    /* dump to log file */
8346    if (qemu_log_separate()) {
8347        FILE *logfile = qemu_log_trylock();
8348
8349        excp_dump_file(logfile, env, fmt, code);
8350        qemu_log_unlock(logfile);
8351    }
8352}
8353
8354#include "target_proc.h"
8355
8356#if HOST_BIG_ENDIAN != TARGET_BIG_ENDIAN || \
8357    defined(HAVE_ARCH_PROC_CPUINFO) || \
8358    defined(HAVE_ARCH_PROC_HARDWARE)
8359static int is_proc(const char *filename, const char *entry)
8360{
8361    return strcmp(filename, entry) == 0;
8362}
8363#endif
8364
8365#if HOST_BIG_ENDIAN != TARGET_BIG_ENDIAN
8366static int open_net_route(CPUArchState *cpu_env, int fd)
8367{
8368    FILE *fp;
8369    char *line = NULL;
8370    size_t len = 0;
8371    ssize_t read;
8372
8373    fp = fopen("/proc/net/route", "r");
8374    if (fp == NULL) {
8375        return -1;
8376    }
8377
8378    /* read header */
8379
8380    read = getline(&line, &len, fp);
8381    dprintf(fd, "%s", line);
8382
8383    /* read routes */
8384
8385    while ((read = getline(&line, &len, fp)) != -1) {
8386        char iface[16];
8387        uint32_t dest, gw, mask;
8388        unsigned int flags, refcnt, use, metric, mtu, window, irtt;
8389        int fields;
8390
8391        fields = sscanf(line,
8392                        "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
8393                        iface, &dest, &gw, &flags, &refcnt, &use, &metric,
8394                        &mask, &mtu, &window, &irtt);
8395        if (fields != 11) {
8396            continue;
8397        }
8398        dprintf(fd, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
8399                iface, tswap32(dest), tswap32(gw), flags, refcnt, use,
8400                metric, tswap32(mask), mtu, window, irtt);
8401    }
8402
8403    free(line);
8404    fclose(fp);
8405
8406    return 0;
8407}
8408#endif
8409
8410static int maybe_do_fake_open(CPUArchState *cpu_env, int dirfd,
8411                              const char *fname, int flags, mode_t mode,
8412                              int openat2_resolve, bool safe)
8413{
8414    g_autofree char *proc_name = NULL;
8415    const char *pathname;
8416    struct fake_open {
8417        const char *filename;
8418        int (*fill)(CPUArchState *cpu_env, int fd);
8419        int (*cmp)(const char *s1, const char *s2);
8420    };
8421    const struct fake_open *fake_open;
8422    static const struct fake_open fakes[] = {
8423        { "maps", open_self_maps, is_proc_myself },
8424        { "smaps", open_self_smaps, is_proc_myself },
8425        { "stat", open_self_stat, is_proc_myself },
8426        { "auxv", open_self_auxv, is_proc_myself },
8427        { "cmdline", open_self_cmdline, is_proc_myself },
8428#if HOST_BIG_ENDIAN != TARGET_BIG_ENDIAN
8429        { "/proc/net/route", open_net_route, is_proc },
8430#endif
8431#if defined(HAVE_ARCH_PROC_CPUINFO)
8432        { "/proc/cpuinfo", open_cpuinfo, is_proc },
8433#endif
8434#if defined(HAVE_ARCH_PROC_HARDWARE)
8435        { "/proc/hardware", open_hardware, is_proc },
8436#endif
8437        { NULL, NULL, NULL }
8438    };
8439
8440    /* if this is a file from /proc/ filesystem, expand full name */
8441    proc_name = realpath(fname, NULL);
8442    if (proc_name && strncmp(proc_name, "/proc/", 6) == 0) {
8443        pathname = proc_name;
8444    } else {
8445        pathname = fname;
8446    }
8447
8448    if (is_proc_myself(pathname, "exe")) {
8449        /* Honor openat2 resolve flags */
8450        if ((openat2_resolve & RESOLVE_NO_MAGICLINKS) ||
8451            (openat2_resolve & RESOLVE_NO_SYMLINKS)) {
8452            errno = ELOOP;
8453            return -1;
8454        }
8455        if (safe) {
8456            return safe_openat(dirfd, exec_path, flags, mode);
8457        } else {
8458            return openat(dirfd, exec_path, flags, mode);
8459        }
8460    }
8461
8462    for (fake_open = fakes; fake_open->filename; fake_open++) {
8463        if (fake_open->cmp(pathname, fake_open->filename)) {
8464            break;
8465        }
8466    }
8467
8468    if (fake_open->filename) {
8469        const char *tmpdir;
8470        char filename[PATH_MAX];
8471        int fd, r;
8472
8473        fd = memfd_create("qemu-open", 0);
8474        if (fd < 0) {
8475            if (errno != ENOSYS) {
8476                return fd;
8477            }
8478            /* create temporary file to map stat to */
8479            tmpdir = getenv("TMPDIR");
8480            if (!tmpdir)
8481                tmpdir = "/tmp";
8482            snprintf(filename, sizeof(filename), "%s/qemu-open.XXXXXX", tmpdir);
8483            fd = mkstemp(filename);
8484            if (fd < 0) {
8485                return fd;
8486            }
8487            unlink(filename);
8488        }
8489
8490        if ((r = fake_open->fill(cpu_env, fd))) {
8491            int e = errno;
8492            close(fd);
8493            errno = e;
8494            return r;
8495        }
8496        lseek(fd, 0, SEEK_SET);
8497
8498        return fd;
8499    }
8500
8501    return -2;
8502}
8503
8504int do_guest_openat(CPUArchState *cpu_env, int dirfd, const char *pathname,
8505                    int flags, mode_t mode, bool safe)
8506{
8507    int fd = maybe_do_fake_open(cpu_env, dirfd, pathname, flags, mode, 0, safe);
8508    if (fd > -2) {
8509        return fd;
8510    }
8511
8512    if (safe) {
8513        return safe_openat(dirfd, path(pathname), flags, mode);
8514    } else {
8515        return openat(dirfd, path(pathname), flags, mode);
8516    }
8517}
8518
8519
8520static int do_openat2(CPUArchState *cpu_env, abi_long dirfd,
8521                      abi_ptr guest_pathname, abi_ptr guest_open_how,
8522                      abi_ulong guest_size)
8523{
8524    struct open_how_ver0 how = {0};
8525    char *pathname;
8526    int ret;
8527
8528    if (guest_size < sizeof(struct target_open_how_ver0)) {
8529        return -TARGET_EINVAL;
8530    }
8531    ret = copy_struct_from_user(&how, sizeof(how), guest_open_how, guest_size);
8532    if (ret) {
8533        if (ret == -TARGET_E2BIG) {
8534            qemu_log_mask(LOG_UNIMP,
8535                          "Unimplemented openat2 open_how size: "
8536                          TARGET_ABI_FMT_lu "\n", guest_size);
8537        }
8538        return ret;
8539    }
8540    pathname = lock_user_string(guest_pathname);
8541    if (!pathname) {
8542        return -TARGET_EFAULT;
8543    }
8544
8545    how.flags = target_to_host_bitmask(tswap64(how.flags), fcntl_flags_tbl);
8546    how.mode = tswap64(how.mode);
8547    how.resolve = tswap64(how.resolve);
8548    int fd = maybe_do_fake_open(cpu_env, dirfd, pathname, how.flags, how.mode,
8549                                how.resolve, true);
8550    if (fd > -2) {
8551        ret = get_errno(fd);
8552    } else {
8553        ret = get_errno(safe_openat2(dirfd, pathname, &how,
8554                                     sizeof(struct open_how_ver0)));
8555    }
8556
8557    fd_trans_unregister(ret);
8558    unlock_user(pathname, guest_pathname, 0);
8559    return ret;
8560}
8561
8562ssize_t do_guest_readlink(const char *pathname, char *buf, size_t bufsiz)
8563{
8564    ssize_t ret;
8565
8566    if (!pathname || !buf) {
8567        errno = EFAULT;
8568        return -1;
8569    }
8570
8571    if (!bufsiz) {
8572        /* Short circuit this for the magic exe check. */
8573        errno = EINVAL;
8574        return -1;
8575    }
8576
8577    if (is_proc_myself((const char *)pathname, "exe")) {
8578        /*
8579         * Don't worry about sign mismatch as earlier mapping
8580         * logic would have thrown a bad address error.
8581         */
8582        ret = MIN(strlen(exec_path), bufsiz);
8583        /* We cannot NUL terminate the string. */
8584        memcpy(buf, exec_path, ret);
8585    } else {
8586        ret = readlink(path(pathname), buf, bufsiz);
8587    }
8588
8589    return ret;
8590}
8591
8592static int do_execv(CPUArchState *cpu_env, int dirfd,
8593                    abi_long pathname, abi_long guest_argp,
8594                    abi_long guest_envp, int flags, bool is_execveat)
8595{
8596    int ret;
8597    char **argp, **envp;
8598    int argc, envc;
8599    abi_ulong gp;
8600    abi_ulong addr;
8601    char **q;
8602    void *p;
8603
8604    argc = 0;
8605
8606    for (gp = guest_argp; gp; gp += sizeof(abi_ulong)) {
8607        if (get_user_ual(addr, gp)) {
8608            return -TARGET_EFAULT;
8609        }
8610        if (!addr) {
8611            break;
8612        }
8613        argc++;
8614    }
8615    envc = 0;
8616    for (gp = guest_envp; gp; gp += sizeof(abi_ulong)) {
8617        if (get_user_ual(addr, gp)) {
8618            return -TARGET_EFAULT;
8619        }
8620        if (!addr) {
8621            break;
8622        }
8623        envc++;
8624    }
8625
8626    argp = g_new0(char *, argc + 1);
8627    envp = g_new0(char *, envc + 1);
8628
8629    for (gp = guest_argp, q = argp; gp; gp += sizeof(abi_ulong), q++) {
8630        if (get_user_ual(addr, gp)) {
8631            goto execve_efault;
8632        }
8633        if (!addr) {
8634            break;
8635        }
8636        *q = lock_user_string(addr);
8637        if (!*q) {
8638            goto execve_efault;
8639        }
8640    }
8641    *q = NULL;
8642
8643    for (gp = guest_envp, q = envp; gp; gp += sizeof(abi_ulong), q++) {
8644        if (get_user_ual(addr, gp)) {
8645            goto execve_efault;
8646        }
8647        if (!addr) {
8648            break;
8649        }
8650        *q = lock_user_string(addr);
8651        if (!*q) {
8652            goto execve_efault;
8653        }
8654    }
8655    *q = NULL;
8656
8657    /*
8658     * Although execve() is not an interruptible syscall it is
8659     * a special case where we must use the safe_syscall wrapper:
8660     * if we allow a signal to happen before we make the host
8661     * syscall then we will 'lose' it, because at the point of
8662     * execve the process leaves QEMU's control. So we use the
8663     * safe syscall wrapper to ensure that we either take the
8664     * signal as a guest signal, or else it does not happen
8665     * before the execve completes and makes it the other
8666     * program's problem.
8667     */
8668    p = lock_user_string(pathname);
8669    if (!p) {
8670        goto execve_efault;
8671    }
8672
8673    const char *exe = p;
8674    if (is_proc_myself(p, "exe")) {
8675        exe = exec_path;
8676    }
8677    ret = is_execveat
8678        ? safe_execveat(dirfd, exe, argp, envp, flags)
8679        : safe_execve(exe, argp, envp);
8680    ret = get_errno(ret);
8681
8682    unlock_user(p, pathname, 0);
8683
8684    goto execve_end;
8685
8686execve_efault:
8687    ret = -TARGET_EFAULT;
8688
8689execve_end:
8690    for (gp = guest_argp, q = argp; *q; gp += sizeof(abi_ulong), q++) {
8691        if (get_user_ual(addr, gp) || !addr) {
8692            break;
8693        }
8694        unlock_user(*q, addr, 0);
8695    }
8696    for (gp = guest_envp, q = envp; *q; gp += sizeof(abi_ulong), q++) {
8697        if (get_user_ual(addr, gp) || !addr) {
8698            break;
8699        }
8700        unlock_user(*q, addr, 0);
8701    }
8702
8703    g_free(argp);
8704    g_free(envp);
8705    return ret;
8706}
8707
8708#define TIMER_MAGIC 0x0caf0000
8709#define TIMER_MAGIC_MASK 0xffff0000
8710
8711/* Convert QEMU provided timer ID back to internal 16bit index format */
8712static target_timer_t get_timer_id(abi_long arg)
8713{
8714    target_timer_t timerid = arg;
8715
8716    if ((timerid & TIMER_MAGIC_MASK) != TIMER_MAGIC) {
8717        return -TARGET_EINVAL;
8718    }
8719
8720    timerid &= 0xffff;
8721
8722    if (timerid >= ARRAY_SIZE(g_posix_timers)) {
8723        return -TARGET_EINVAL;
8724    }
8725
8726    return timerid;
8727}
8728
8729static int target_to_host_cpu_mask(unsigned long *host_mask,
8730                                   size_t host_size,
8731                                   abi_ulong target_addr,
8732                                   size_t target_size)
8733{
8734    unsigned target_bits = sizeof(abi_ulong) * 8;
8735    unsigned host_bits = sizeof(*host_mask) * 8;
8736    abi_ulong *target_mask;
8737    unsigned i, j;
8738
8739    assert(host_size >= target_size);
8740
8741    target_mask = lock_user(VERIFY_READ, target_addr, target_size, 1);
8742    if (!target_mask) {
8743        return -TARGET_EFAULT;
8744    }
8745    memset(host_mask, 0, host_size);
8746
8747    for (i = 0 ; i < target_size / sizeof(abi_ulong); i++) {
8748        unsigned bit = i * target_bits;
8749        abi_ulong val;
8750
8751        __get_user(val, &target_mask[i]);
8752        for (j = 0; j < target_bits; j++, bit++) {
8753            if (val & (1UL << j)) {
8754                host_mask[bit / host_bits] |= 1UL << (bit % host_bits);
8755            }
8756        }
8757    }
8758
8759    unlock_user(target_mask, target_addr, 0);
8760    return 0;
8761}
8762
8763static int host_to_target_cpu_mask(const unsigned long *host_mask,
8764                                   size_t host_size,
8765                                   abi_ulong target_addr,
8766                                   size_t target_size)
8767{
8768    unsigned target_bits = sizeof(abi_ulong) * 8;
8769    unsigned host_bits = sizeof(*host_mask) * 8;
8770    abi_ulong *target_mask;
8771    unsigned i, j;
8772
8773    assert(host_size >= target_size);
8774
8775    target_mask = lock_user(VERIFY_WRITE, target_addr, target_size, 0);
8776    if (!target_mask) {
8777        return -TARGET_EFAULT;
8778    }
8779
8780    for (i = 0 ; i < target_size / sizeof(abi_ulong); i++) {
8781        unsigned bit = i * target_bits;
8782        abi_ulong val = 0;
8783
8784        for (j = 0; j < target_bits; j++, bit++) {
8785            if (host_mask[bit / host_bits] & (1UL << (bit % host_bits))) {
8786                val |= 1UL << j;
8787            }
8788        }
8789        __put_user(val, &target_mask[i]);
8790    }
8791
8792    unlock_user(target_mask, target_addr, target_size);
8793    return 0;
8794}
8795
8796#ifdef TARGET_NR_getdents
8797static int do_getdents(abi_long dirfd, abi_long arg2, abi_long count)
8798{
8799    g_autofree void *hdirp = NULL;
8800    void *tdirp;
8801    int hlen, hoff, toff;
8802    int hreclen, treclen;
8803    off_t prev_diroff = 0;
8804
8805    hdirp = g_try_malloc(count);
8806    if (!hdirp) {
8807        return -TARGET_ENOMEM;
8808    }
8809
8810#ifdef EMULATE_GETDENTS_WITH_GETDENTS
8811    hlen = sys_getdents(dirfd, hdirp, count);
8812#else
8813    hlen = sys_getdents64(dirfd, hdirp, count);
8814#endif
8815
8816    hlen = get_errno(hlen);
8817    if (is_error(hlen)) {
8818        return hlen;
8819    }
8820
8821    tdirp = lock_user(VERIFY_WRITE, arg2, count, 0);
8822    if (!tdirp) {
8823        return -TARGET_EFAULT;
8824    }
8825
8826    for (hoff = toff = 0; hoff < hlen; hoff += hreclen, toff += treclen) {
8827#ifdef EMULATE_GETDENTS_WITH_GETDENTS
8828        struct linux_dirent *hde = hdirp + hoff;
8829#else
8830        struct linux_dirent64 *hde = hdirp + hoff;
8831#endif
8832        struct target_dirent *tde = tdirp + toff;
8833        int namelen;
8834        uint8_t type;
8835
8836        namelen = strlen(hde->d_name);
8837        hreclen = hde->d_reclen;
8838        treclen = offsetof(struct target_dirent, d_name) + namelen + 2;
8839        treclen = QEMU_ALIGN_UP(treclen, __alignof(struct target_dirent));
8840
8841        if (toff + treclen > count) {
8842            /*
8843             * If the host struct is smaller than the target struct, or
8844             * requires less alignment and thus packs into less space,
8845             * then the host can return more entries than we can pass
8846             * on to the guest.
8847             */
8848            if (toff == 0) {
8849                toff = -TARGET_EINVAL; /* result buffer is too small */
8850                break;
8851            }
8852            /*
8853             * Return what we have, resetting the file pointer to the
8854             * location of the first record not returned.
8855             */
8856            lseek(dirfd, prev_diroff, SEEK_SET);
8857            break;
8858        }
8859
8860        prev_diroff = hde->d_off;
8861        tde->d_ino = tswapal(hde->d_ino);
8862        tde->d_off = tswapal(hde->d_off);
8863        tde->d_reclen = tswap16(treclen);
8864        memcpy(tde->d_name, hde->d_name, namelen + 1);
8865
8866        /*
8867         * The getdents type is in what was formerly a padding byte at the
8868         * end of the structure.
8869         */
8870#ifdef EMULATE_GETDENTS_WITH_GETDENTS
8871        type = *((uint8_t *)hde + hreclen - 1);
8872#else
8873        type = hde->d_type;
8874#endif
8875        *((uint8_t *)tde + treclen - 1) = type;
8876    }
8877
8878    unlock_user(tdirp, arg2, toff);
8879    return toff;
8880}
8881#endif /* TARGET_NR_getdents */
8882
8883#if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
8884static int do_getdents64(abi_long dirfd, abi_long arg2, abi_long count)
8885{
8886    g_autofree void *hdirp = NULL;
8887    void *tdirp;
8888    int hlen, hoff, toff;
8889    int hreclen, treclen;
8890    off_t prev_diroff = 0;
8891
8892    hdirp = g_try_malloc(count);
8893    if (!hdirp) {
8894        return -TARGET_ENOMEM;
8895    }
8896
8897    hlen = get_errno(sys_getdents64(dirfd, hdirp, count));
8898    if (is_error(hlen)) {
8899        return hlen;
8900    }
8901
8902    tdirp = lock_user(VERIFY_WRITE, arg2, count, 0);
8903    if (!tdirp) {
8904        return -TARGET_EFAULT;
8905    }
8906
8907    for (hoff = toff = 0; hoff < hlen; hoff += hreclen, toff += treclen) {
8908        struct linux_dirent64 *hde = hdirp + hoff;
8909        struct target_dirent64 *tde = tdirp + toff;
8910        int namelen;
8911
8912        namelen = strlen(hde->d_name) + 1;
8913        hreclen = hde->d_reclen;
8914        treclen = offsetof(struct target_dirent64, d_name) + namelen;
8915        treclen = QEMU_ALIGN_UP(treclen, __alignof(struct target_dirent64));
8916
8917        if (toff + treclen > count) {
8918            /*
8919             * If the host struct is smaller than the target struct, or
8920             * requires less alignment and thus packs into less space,
8921             * then the host can return more entries than we can pass
8922             * on to the guest.
8923             */
8924            if (toff == 0) {
8925                toff = -TARGET_EINVAL; /* result buffer is too small */
8926                break;
8927            }
8928            /*
8929             * Return what we have, resetting the file pointer to the
8930             * location of the first record not returned.
8931             */
8932            lseek(dirfd, prev_diroff, SEEK_SET);
8933            break;
8934        }
8935
8936        prev_diroff = hde->d_off;
8937        tde->d_ino = tswap64(hde->d_ino);
8938        tde->d_off = tswap64(hde->d_off);
8939        tde->d_reclen = tswap16(treclen);
8940        tde->d_type = hde->d_type;
8941        memcpy(tde->d_name, hde->d_name, namelen);
8942    }
8943
8944    unlock_user(tdirp, arg2, toff);
8945    return toff;
8946}
8947#endif /* TARGET_NR_getdents64 */
8948
8949#if defined(TARGET_NR_riscv_hwprobe)
8950
8951#define RISCV_HWPROBE_KEY_MVENDORID     0
8952#define RISCV_HWPROBE_KEY_MARCHID       1
8953#define RISCV_HWPROBE_KEY_MIMPID        2
8954
8955#define RISCV_HWPROBE_KEY_BASE_BEHAVIOR 3
8956#define     RISCV_HWPROBE_BASE_BEHAVIOR_IMA (1 << 0)
8957
8958#define RISCV_HWPROBE_KEY_IMA_EXT_0         4
8959#define     RISCV_HWPROBE_IMA_FD            (1 << 0)
8960#define     RISCV_HWPROBE_IMA_C             (1 << 1)
8961#define     RISCV_HWPROBE_IMA_V             (1 << 2)
8962#define     RISCV_HWPROBE_EXT_ZBA           (1 << 3)
8963#define     RISCV_HWPROBE_EXT_ZBB           (1 << 4)
8964#define     RISCV_HWPROBE_EXT_ZBS           (1 << 5)
8965#define     RISCV_HWPROBE_EXT_ZICBOZ        (1 << 6)
8966#define     RISCV_HWPROBE_EXT_ZBC           (1 << 7)
8967#define     RISCV_HWPROBE_EXT_ZBKB          (1 << 8)
8968#define     RISCV_HWPROBE_EXT_ZBKC          (1 << 9)
8969#define     RISCV_HWPROBE_EXT_ZBKX          (1 << 10)
8970#define     RISCV_HWPROBE_EXT_ZKND          (1 << 11)
8971#define     RISCV_HWPROBE_EXT_ZKNE          (1 << 12)
8972#define     RISCV_HWPROBE_EXT_ZKNH          (1 << 13)
8973#define     RISCV_HWPROBE_EXT_ZKSED         (1 << 14)
8974#define     RISCV_HWPROBE_EXT_ZKSH          (1 << 15)
8975#define     RISCV_HWPROBE_EXT_ZKT           (1 << 16)
8976#define     RISCV_HWPROBE_EXT_ZVBB          (1 << 17)
8977#define     RISCV_HWPROBE_EXT_ZVBC          (1 << 18)
8978#define     RISCV_HWPROBE_EXT_ZVKB          (1 << 19)
8979#define     RISCV_HWPROBE_EXT_ZVKG          (1 << 20)
8980#define     RISCV_HWPROBE_EXT_ZVKNED        (1 << 21)
8981#define     RISCV_HWPROBE_EXT_ZVKNHA        (1 << 22)
8982#define     RISCV_HWPROBE_EXT_ZVKNHB        (1 << 23)
8983#define     RISCV_HWPROBE_EXT_ZVKSED        (1 << 24)
8984#define     RISCV_HWPROBE_EXT_ZVKSH         (1 << 25)
8985#define     RISCV_HWPROBE_EXT_ZVKT          (1 << 26)
8986#define     RISCV_HWPROBE_EXT_ZFH           (1 << 27)
8987#define     RISCV_HWPROBE_EXT_ZFHMIN        (1 << 28)
8988#define     RISCV_HWPROBE_EXT_ZIHINTNTL     (1 << 29)
8989#define     RISCV_HWPROBE_EXT_ZVFH          (1 << 30)
8990#define     RISCV_HWPROBE_EXT_ZVFHMIN       (1ULL << 31)
8991#define     RISCV_HWPROBE_EXT_ZFA           (1ULL << 32)
8992#define     RISCV_HWPROBE_EXT_ZTSO          (1ULL << 33)
8993#define     RISCV_HWPROBE_EXT_ZACAS         (1ULL << 34)
8994#define     RISCV_HWPROBE_EXT_ZICOND        (1ULL << 35)
8995
8996#define RISCV_HWPROBE_KEY_CPUPERF_0     5
8997#define     RISCV_HWPROBE_MISALIGNED_UNKNOWN     (0 << 0)
8998#define     RISCV_HWPROBE_MISALIGNED_EMULATED    (1 << 0)
8999#define     RISCV_HWPROBE_MISALIGNED_SLOW        (2 << 0)
9000#define     RISCV_HWPROBE_MISALIGNED_FAST        (3 << 0)
9001#define     RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0)
9002#define     RISCV_HWPROBE_MISALIGNED_MASK        (7 << 0)
9003
9004#define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6
9005
9006struct riscv_hwprobe {
9007    abi_llong  key;
9008    abi_ullong value;
9009};
9010
9011static void risc_hwprobe_fill_pairs(CPURISCVState *env,
9012                                    struct riscv_hwprobe *pair,
9013                                    size_t pair_count)
9014{
9015    const RISCVCPUConfig *cfg = riscv_cpu_cfg(env);
9016
9017    for (; pair_count > 0; pair_count--, pair++) {
9018        abi_llong key;
9019        abi_ullong value;
9020        __put_user(0, &pair->value);
9021        __get_user(key, &pair->key);
9022        switch (key) {
9023        case RISCV_HWPROBE_KEY_MVENDORID:
9024            __put_user(cfg->mvendorid, &pair->value);
9025            break;
9026        case RISCV_HWPROBE_KEY_MARCHID:
9027            __put_user(cfg->marchid, &pair->value);
9028            break;
9029        case RISCV_HWPROBE_KEY_MIMPID:
9030            __put_user(cfg->mimpid, &pair->value);
9031            break;
9032        case RISCV_HWPROBE_KEY_BASE_BEHAVIOR:
9033            value = riscv_has_ext(env, RVI) &&
9034                    riscv_has_ext(env, RVM) &&
9035                    riscv_has_ext(env, RVA) ?
9036                    RISCV_HWPROBE_BASE_BEHAVIOR_IMA : 0;
9037            __put_user(value, &pair->value);
9038            break;
9039        case RISCV_HWPROBE_KEY_IMA_EXT_0:
9040            value = riscv_has_ext(env, RVF) &&
9041                    riscv_has_ext(env, RVD) ?
9042                    RISCV_HWPROBE_IMA_FD : 0;
9043            value |= riscv_has_ext(env, RVC) ?
9044                     RISCV_HWPROBE_IMA_C : 0;
9045            value |= riscv_has_ext(env, RVV) ?
9046                     RISCV_HWPROBE_IMA_V : 0;
9047            value |= cfg->ext_zba ?
9048                     RISCV_HWPROBE_EXT_ZBA : 0;
9049            value |= cfg->ext_zbb ?
9050                     RISCV_HWPROBE_EXT_ZBB : 0;
9051            value |= cfg->ext_zbs ?
9052                     RISCV_HWPROBE_EXT_ZBS : 0;
9053            value |= cfg->ext_zicboz ?
9054                     RISCV_HWPROBE_EXT_ZICBOZ : 0;
9055            value |= cfg->ext_zbc ?
9056                     RISCV_HWPROBE_EXT_ZBC : 0;
9057            value |= cfg->ext_zbkb ?
9058                     RISCV_HWPROBE_EXT_ZBKB : 0;
9059            value |= cfg->ext_zbkc ?
9060                     RISCV_HWPROBE_EXT_ZBKC : 0;
9061            value |= cfg->ext_zbkx ?
9062                     RISCV_HWPROBE_EXT_ZBKX : 0;
9063            value |= cfg->ext_zknd ?
9064                     RISCV_HWPROBE_EXT_ZKND : 0;
9065            value |= cfg->ext_zkne ?
9066                     RISCV_HWPROBE_EXT_ZKNE : 0;
9067            value |= cfg->ext_zknh ?
9068                     RISCV_HWPROBE_EXT_ZKNH : 0;
9069            value |= cfg->ext_zksed ?
9070                     RISCV_HWPROBE_EXT_ZKSED : 0;
9071            value |= cfg->ext_zksh ?
9072                     RISCV_HWPROBE_EXT_ZKSH : 0;
9073            value |= cfg->ext_zkt ?
9074                     RISCV_HWPROBE_EXT_ZKT : 0;
9075            value |= cfg->ext_zvbb ?
9076                     RISCV_HWPROBE_EXT_ZVBB : 0;
9077            value |= cfg->ext_zvbc ?
9078                     RISCV_HWPROBE_EXT_ZVBC : 0;
9079            value |= cfg->ext_zvkb ?
9080                     RISCV_HWPROBE_EXT_ZVKB : 0;
9081            value |= cfg->ext_zvkg ?
9082                     RISCV_HWPROBE_EXT_ZVKG : 0;
9083            value |= cfg->ext_zvkned ?
9084                     RISCV_HWPROBE_EXT_ZVKNED : 0;
9085            value |= cfg->ext_zvknha ?
9086                     RISCV_HWPROBE_EXT_ZVKNHA : 0;
9087            value |= cfg->ext_zvknhb ?
9088                     RISCV_HWPROBE_EXT_ZVKNHB : 0;
9089            value |= cfg->ext_zvksed ?
9090                     RISCV_HWPROBE_EXT_ZVKSED : 0;
9091            value |= cfg->ext_zvksh ?
9092                     RISCV_HWPROBE_EXT_ZVKSH : 0;
9093            value |= cfg->ext_zvkt ?
9094                     RISCV_HWPROBE_EXT_ZVKT : 0;
9095            value |= cfg->ext_zfh ?
9096                     RISCV_HWPROBE_EXT_ZFH : 0;
9097            value |= cfg->ext_zfhmin ?
9098                     RISCV_HWPROBE_EXT_ZFHMIN : 0;
9099            value |= cfg->ext_zihintntl ?
9100                     RISCV_HWPROBE_EXT_ZIHINTNTL : 0;
9101            value |= cfg->ext_zvfh ?
9102                     RISCV_HWPROBE_EXT_ZVFH : 0;
9103            value |= cfg->ext_zvfhmin ?
9104                     RISCV_HWPROBE_EXT_ZVFHMIN : 0;
9105            value |= cfg->ext_zfa ?
9106                     RISCV_HWPROBE_EXT_ZFA : 0;
9107            value |= cfg->ext_ztso ?
9108                     RISCV_HWPROBE_EXT_ZTSO : 0;
9109            value |= cfg->ext_zacas ?
9110                     RISCV_HWPROBE_EXT_ZACAS : 0;
9111            value |= cfg->ext_zicond ?
9112                     RISCV_HWPROBE_EXT_ZICOND : 0;
9113            __put_user(value, &pair->value);
9114            break;
9115        case RISCV_HWPROBE_KEY_CPUPERF_0:
9116            __put_user(RISCV_HWPROBE_MISALIGNED_FAST, &pair->value);
9117            break;
9118        case RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE:
9119            value = cfg->ext_zicboz ? cfg->cboz_blocksize : 0;
9120            __put_user(value, &pair->value);
9121            break;
9122        default:
9123            __put_user(-1, &pair->key);
9124            break;
9125        }
9126    }
9127}
9128
9129/*
9130 * If the cpumask_t of (target_cpus, cpusetsize) cannot be read: -EFAULT.
9131 * If the cpumast_t has no bits set: -EINVAL.
9132 * Otherwise the cpumask_t contains some bit set: 0.
9133 * Unlike the kernel, we do not mask cpumask_t by the set of online cpus,
9134 * nor bound the search by cpumask_size().
9135 */
9136static int nonempty_cpu_set(abi_ulong cpusetsize, abi_ptr target_cpus)
9137{
9138    unsigned char *p = lock_user(VERIFY_READ, target_cpus, cpusetsize, 1);
9139    int ret = -TARGET_EFAULT;
9140
9141    if (p) {
9142        ret = -TARGET_EINVAL;
9143        /*
9144         * Since we only care about the empty/non-empty state of the cpumask_t
9145         * not the individual bits, we do not need to repartition the bits
9146         * from target abi_ulong to host unsigned long.
9147         *
9148         * Note that the kernel does not round up cpusetsize to a multiple of
9149         * sizeof(abi_ulong).  After bounding cpusetsize by cpumask_size(),
9150         * it copies exactly cpusetsize bytes into a zeroed buffer.
9151         */
9152        for (abi_ulong i = 0; i < cpusetsize; ++i) {
9153            if (p[i]) {
9154                ret = 0;
9155                break;
9156            }
9157        }
9158        unlock_user(p, target_cpus, 0);
9159    }
9160    return ret;
9161}
9162
9163static abi_long do_riscv_hwprobe(CPUArchState *cpu_env, abi_long arg1,
9164                                 abi_long arg2, abi_long arg3,
9165                                 abi_long arg4, abi_long arg5)
9166{
9167    int ret;
9168    struct riscv_hwprobe *host_pairs;
9169
9170    /* flags must be 0 */
9171    if (arg5 != 0) {
9172        return -TARGET_EINVAL;
9173    }
9174
9175    /* check cpu_set */
9176    if (arg3 != 0) {
9177        ret = nonempty_cpu_set(arg3, arg4);
9178        if (ret != 0) {
9179            return ret;
9180        }
9181    } else if (arg4 != 0) {
9182        return -TARGET_EINVAL;
9183    }
9184
9185    /* no pairs */
9186    if (arg2 == 0) {
9187        return 0;
9188    }
9189
9190    host_pairs = lock_user(VERIFY_WRITE, arg1,
9191                           sizeof(*host_pairs) * (size_t)arg2, 0);
9192    if (host_pairs == NULL) {
9193        return -TARGET_EFAULT;
9194    }
9195    risc_hwprobe_fill_pairs(cpu_env, host_pairs, arg2);
9196    unlock_user(host_pairs, arg1, sizeof(*host_pairs) * (size_t)arg2);
9197    return 0;
9198}
9199#endif /* TARGET_NR_riscv_hwprobe */
9200
9201#if defined(TARGET_NR_pivot_root) && defined(__NR_pivot_root)
9202_syscall2(int, pivot_root, const char *, new_root, const char *, put_old)
9203#endif
9204
9205#if defined(TARGET_NR_open_tree) && defined(__NR_open_tree)
9206#define __NR_sys_open_tree __NR_open_tree
9207_syscall3(int, sys_open_tree, int, __dfd, const char *, __filename,
9208          unsigned int, __flags)
9209#endif
9210
9211#if defined(TARGET_NR_move_mount) && defined(__NR_move_mount)
9212#define __NR_sys_move_mount __NR_move_mount
9213_syscall5(int, sys_move_mount, int, __from_dfd, const char *, __from_pathname,
9214           int, __to_dfd, const char *, __to_pathname, unsigned int, flag)
9215#endif
9216
9217/* This is an internal helper for do_syscall so that it is easier
9218 * to have a single return point, so that actions, such as logging
9219 * of syscall results, can be performed.
9220 * All errnos that do_syscall() returns must be -TARGET_<errcode>.
9221 */
9222static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
9223                            abi_long arg2, abi_long arg3, abi_long arg4,
9224                            abi_long arg5, abi_long arg6, abi_long arg7,
9225                            abi_long arg8)
9226{
9227    CPUState *cpu = env_cpu(cpu_env);
9228    abi_long ret;
9229#if defined(TARGET_NR_stat) || defined(TARGET_NR_stat64) \
9230    || defined(TARGET_NR_lstat) || defined(TARGET_NR_lstat64) \
9231    || defined(TARGET_NR_fstat) || defined(TARGET_NR_fstat64) \
9232    || defined(TARGET_NR_statx)
9233    struct stat st;
9234#endif
9235#if defined(TARGET_NR_statfs) || defined(TARGET_NR_statfs64) \
9236    || defined(TARGET_NR_fstatfs)
9237    struct statfs stfs;
9238#endif
9239    void *p;
9240
9241    switch(num) {
9242    case TARGET_NR_exit:
9243        /* In old applications this may be used to implement _exit(2).
9244           However in threaded applications it is used for thread termination,
9245           and _exit_group is used for application termination.
9246           Do thread termination if we have more then one thread.  */
9247
9248        if (block_signals()) {
9249            return -QEMU_ERESTARTSYS;
9250        }
9251
9252        pthread_mutex_lock(&clone_lock);
9253
9254        if (CPU_NEXT(first_cpu)) {
9255            TaskState *ts = get_task_state(cpu);
9256
9257            if (ts->child_tidptr) {
9258                put_user_u32(0, ts->child_tidptr);
9259                do_sys_futex(g2h(cpu, ts->child_tidptr),
9260                             FUTEX_WAKE, INT_MAX, NULL, NULL, 0);
9261            }
9262
9263            object_unparent(OBJECT(cpu));
9264            object_unref(OBJECT(cpu));
9265            /*
9266             * At this point the CPU should be unrealized and removed
9267             * from cpu lists. We can clean-up the rest of the thread
9268             * data without the lock held.
9269             */
9270
9271            pthread_mutex_unlock(&clone_lock);
9272
9273            thread_cpu = NULL;
9274            g_free(ts);
9275            rcu_unregister_thread();
9276            pthread_exit(NULL);
9277        }
9278
9279        pthread_mutex_unlock(&clone_lock);
9280        preexit_cleanup(cpu_env, arg1);
9281        _exit(arg1);
9282        return 0; /* avoid warning */
9283    case TARGET_NR_read:
9284        if (arg2 == 0 && arg3 == 0) {
9285            return get_errno(safe_read(arg1, 0, 0));
9286        } else {
9287            if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
9288                return -TARGET_EFAULT;
9289            ret = get_errno(safe_read(arg1, p, arg3));
9290            if (ret >= 0 &&
9291                fd_trans_host_to_target_data(arg1)) {
9292                ret = fd_trans_host_to_target_data(arg1)(p, ret);
9293            }
9294            unlock_user(p, arg2, ret);
9295        }
9296        return ret;
9297    case TARGET_NR_write:
9298        if (arg2 == 0 && arg3 == 0) {
9299            return get_errno(safe_write(arg1, 0, 0));
9300        }
9301        if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
9302            return -TARGET_EFAULT;
9303        if (fd_trans_target_to_host_data(arg1)) {
9304            void *copy = g_malloc(arg3);
9305            memcpy(copy, p, arg3);
9306            ret = fd_trans_target_to_host_data(arg1)(copy, arg3);
9307            if (ret >= 0) {
9308                ret = get_errno(safe_write(arg1, copy, ret));
9309            }
9310            g_free(copy);
9311        } else {
9312            ret = get_errno(safe_write(arg1, p, arg3));
9313        }
9314        unlock_user(p, arg2, 0);
9315        return ret;
9316
9317#ifdef TARGET_NR_open
9318    case TARGET_NR_open:
9319        if (!(p = lock_user_string(arg1)))
9320            return -TARGET_EFAULT;
9321        ret = get_errno(do_guest_openat(cpu_env, AT_FDCWD, p,
9322                                  target_to_host_bitmask(arg2, fcntl_flags_tbl),
9323                                  arg3, true));
9324        fd_trans_unregister(ret);
9325        unlock_user(p, arg1, 0);
9326        return ret;
9327#endif
9328    case TARGET_NR_openat:
9329        if (!(p = lock_user_string(arg2)))
9330            return -TARGET_EFAULT;
9331        ret = get_errno(do_guest_openat(cpu_env, arg1, p,
9332                                  target_to_host_bitmask(arg3, fcntl_flags_tbl),
9333                                  arg4, true));
9334        fd_trans_unregister(ret);
9335        unlock_user(p, arg2, 0);
9336        return ret;
9337    case TARGET_NR_openat2:
9338        ret = do_openat2(cpu_env, arg1, arg2, arg3, arg4);
9339        return ret;
9340#if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
9341    case TARGET_NR_name_to_handle_at:
9342        ret = do_name_to_handle_at(arg1, arg2, arg3, arg4, arg5);
9343        return ret;
9344#endif
9345#if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
9346    case TARGET_NR_open_by_handle_at:
9347        ret = do_open_by_handle_at(arg1, arg2, arg3);
9348        fd_trans_unregister(ret);
9349        return ret;
9350#endif
9351#if defined(__NR_pidfd_open) && defined(TARGET_NR_pidfd_open)
9352    case TARGET_NR_pidfd_open:
9353        return get_errno(pidfd_open(arg1, arg2));
9354#endif
9355#if defined(__NR_pidfd_send_signal) && defined(TARGET_NR_pidfd_send_signal)
9356    case TARGET_NR_pidfd_send_signal:
9357        {
9358            siginfo_t uinfo, *puinfo;
9359
9360            if (arg3) {
9361                p = lock_user(VERIFY_READ, arg3, sizeof(target_siginfo_t), 1);
9362                if (!p) {
9363                    return -TARGET_EFAULT;
9364                 }
9365                 target_to_host_siginfo(&uinfo, p);
9366                 unlock_user(p, arg3, 0);
9367                 puinfo = &uinfo;
9368            } else {
9369                 puinfo = NULL;
9370            }
9371            ret = get_errno(pidfd_send_signal(arg1, target_to_host_signal(arg2),
9372                                              puinfo, arg4));
9373        }
9374        return ret;
9375#endif
9376#if defined(__NR_pidfd_getfd) && defined(TARGET_NR_pidfd_getfd)
9377    case TARGET_NR_pidfd_getfd:
9378        return get_errno(pidfd_getfd(arg1, arg2, arg3));
9379#endif
9380    case TARGET_NR_close:
9381        fd_trans_unregister(arg1);
9382        return get_errno(close(arg1));
9383#if defined(__NR_close_range) && defined(TARGET_NR_close_range)
9384    case TARGET_NR_close_range:
9385        ret = get_errno(sys_close_range(arg1, arg2, arg3));
9386        if (ret == 0 && !(arg3 & CLOSE_RANGE_CLOEXEC)) {
9387            abi_long fd, maxfd;
9388            maxfd = MIN(arg2, target_fd_max);
9389            for (fd = arg1; fd < maxfd; fd++) {
9390                fd_trans_unregister(fd);
9391            }
9392        }
9393        return ret;
9394#endif
9395
9396    case TARGET_NR_brk:
9397        return do_brk(arg1);
9398#ifdef TARGET_NR_fork
9399    case TARGET_NR_fork:
9400        return get_errno(do_fork(cpu_env, TARGET_SIGCHLD, 0, 0, 0, 0));
9401#endif
9402#ifdef TARGET_NR_waitpid
9403    case TARGET_NR_waitpid:
9404        {
9405            int status;
9406            ret = get_errno(safe_wait4(arg1, &status, arg3, 0));
9407            if (!is_error(ret) && arg2 && ret
9408                && put_user_s32(host_to_target_waitstatus(status), arg2))
9409                return -TARGET_EFAULT;
9410        }
9411        return ret;
9412#endif
9413#ifdef TARGET_NR_waitid
9414    case TARGET_NR_waitid:
9415        {
9416            struct rusage ru;
9417            siginfo_t info;
9418
9419            ret = get_errno(safe_waitid(arg1, arg2, (arg3 ? &info : NULL),
9420                                        arg4, (arg5 ? &ru : NULL)));
9421            if (!is_error(ret)) {
9422                if (arg3) {
9423                    p = lock_user(VERIFY_WRITE, arg3,
9424                                  sizeof(target_siginfo_t), 0);
9425                    if (!p) {
9426                        return -TARGET_EFAULT;
9427                    }
9428                    host_to_target_siginfo(p, &info);
9429                    unlock_user(p, arg3, sizeof(target_siginfo_t));
9430                }
9431                if (arg5 && host_to_target_rusage(arg5, &ru)) {
9432                    return -TARGET_EFAULT;
9433                }
9434            }
9435        }
9436        return ret;
9437#endif
9438#ifdef TARGET_NR_creat /* not on alpha */
9439    case TARGET_NR_creat:
9440        if (!(p = lock_user_string(arg1)))
9441            return -TARGET_EFAULT;
9442        ret = get_errno(creat(p, arg2));
9443        fd_trans_unregister(ret);
9444        unlock_user(p, arg1, 0);
9445        return ret;
9446#endif
9447#ifdef TARGET_NR_link
9448    case TARGET_NR_link:
9449        {
9450            void * p2;
9451            p = lock_user_string(arg1);
9452            p2 = lock_user_string(arg2);
9453            if (!p || !p2)
9454                ret = -TARGET_EFAULT;
9455            else
9456                ret = get_errno(link(p, p2));
9457            unlock_user(p2, arg2, 0);
9458            unlock_user(p, arg1, 0);
9459        }
9460        return ret;
9461#endif
9462#if defined(TARGET_NR_linkat)
9463    case TARGET_NR_linkat:
9464        {
9465            void * p2 = NULL;
9466            if (!arg2 || !arg4)
9467                return -TARGET_EFAULT;
9468            p  = lock_user_string(arg2);
9469            p2 = lock_user_string(arg4);
9470            if (!p || !p2)
9471                ret = -TARGET_EFAULT;
9472            else
9473                ret = get_errno(linkat(arg1, p, arg3, p2, arg5));
9474            unlock_user(p, arg2, 0);
9475            unlock_user(p2, arg4, 0);
9476        }
9477        return ret;
9478#endif
9479#ifdef TARGET_NR_unlink
9480    case TARGET_NR_unlink:
9481        if (!(p = lock_user_string(arg1)))
9482            return -TARGET_EFAULT;
9483        ret = get_errno(unlink(p));
9484        unlock_user(p, arg1, 0);
9485        return ret;
9486#endif
9487#if defined(TARGET_NR_unlinkat)
9488    case TARGET_NR_unlinkat:
9489        if (!(p = lock_user_string(arg2)))
9490            return -TARGET_EFAULT;
9491        ret = get_errno(unlinkat(arg1, p, arg3));
9492        unlock_user(p, arg2, 0);
9493        return ret;
9494#endif
9495    case TARGET_NR_execveat:
9496        return do_execv(cpu_env, arg1, arg2, arg3, arg4, arg5, true);
9497    case TARGET_NR_execve:
9498        return do_execv(cpu_env, AT_FDCWD, arg1, arg2, arg3, 0, false);
9499    case TARGET_NR_chdir:
9500        if (!(p = lock_user_string(arg1)))
9501            return -TARGET_EFAULT;
9502        ret = get_errno(chdir(p));
9503        unlock_user(p, arg1, 0);
9504        return ret;
9505#ifdef TARGET_NR_time
9506    case TARGET_NR_time:
9507        {
9508            time_t host_time;
9509            ret = get_errno(time(&host_time));
9510            if (!is_error(ret)
9511                && arg1
9512                && put_user_sal(host_time, arg1))
9513                return -TARGET_EFAULT;
9514        }
9515        return ret;
9516#endif
9517#ifdef TARGET_NR_mknod
9518    case TARGET_NR_mknod:
9519        if (!(p = lock_user_string(arg1)))
9520            return -TARGET_EFAULT;
9521        ret = get_errno(mknod(p, arg2, arg3));
9522        unlock_user(p, arg1, 0);
9523        return ret;
9524#endif
9525#if defined(TARGET_NR_mknodat)
9526    case TARGET_NR_mknodat:
9527        if (!(p = lock_user_string(arg2)))
9528            return -TARGET_EFAULT;
9529        ret = get_errno(mknodat(arg1, p, arg3, arg4));
9530        unlock_user(p, arg2, 0);
9531        return ret;
9532#endif
9533#ifdef TARGET_NR_chmod
9534    case TARGET_NR_chmod:
9535        if (!(p = lock_user_string(arg1)))
9536            return -TARGET_EFAULT;
9537        ret = get_errno(chmod(p, arg2));
9538        unlock_user(p, arg1, 0);
9539        return ret;
9540#endif
9541#ifdef TARGET_NR_lseek
9542    case TARGET_NR_lseek:
9543        return get_errno(lseek(arg1, arg2, arg3));
9544#endif
9545#if defined(TARGET_NR_getxpid) && defined(TARGET_ALPHA)
9546    /* Alpha specific */
9547    case TARGET_NR_getxpid:
9548        cpu_env->ir[IR_A4] = getppid();
9549        return get_errno(getpid());
9550#endif
9551#ifdef TARGET_NR_getpid
9552    case TARGET_NR_getpid:
9553        return get_errno(getpid());
9554#endif
9555    case TARGET_NR_mount:
9556        {
9557            /* need to look at the data field */
9558            void *p2, *p3;
9559
9560            if (arg1) {
9561                p = lock_user_string(arg1);
9562                if (!p) {
9563                    return -TARGET_EFAULT;
9564                }
9565            } else {
9566                p = NULL;
9567            }
9568
9569            p2 = lock_user_string(arg2);
9570            if (!p2) {
9571                if (arg1) {
9572                    unlock_user(p, arg1, 0);
9573                }
9574                return -TARGET_EFAULT;
9575            }
9576
9577            if (arg3) {
9578                p3 = lock_user_string(arg3);
9579                if (!p3) {
9580                    if (arg1) {
9581                        unlock_user(p, arg1, 0);
9582                    }
9583                    unlock_user(p2, arg2, 0);
9584                    return -TARGET_EFAULT;
9585                }
9586            } else {
9587                p3 = NULL;
9588            }
9589
9590            /* FIXME - arg5 should be locked, but it isn't clear how to
9591             * do that since it's not guaranteed to be a NULL-terminated
9592             * string.
9593             */
9594            if (!arg5) {
9595                ret = mount(p, p2, p3, (unsigned long)arg4, NULL);
9596            } else {
9597                ret = mount(p, p2, p3, (unsigned long)arg4, g2h(cpu, arg5));
9598            }
9599            ret = get_errno(ret);
9600
9601            if (arg1) {
9602                unlock_user(p, arg1, 0);
9603            }
9604            unlock_user(p2, arg2, 0);
9605            if (arg3) {
9606                unlock_user(p3, arg3, 0);
9607            }
9608        }
9609        return ret;
9610#if defined(TARGET_NR_umount) || defined(TARGET_NR_oldumount)
9611#if defined(TARGET_NR_umount)
9612    case TARGET_NR_umount:
9613#endif
9614#if defined(TARGET_NR_oldumount)
9615    case TARGET_NR_oldumount:
9616#endif
9617        if (!(p = lock_user_string(arg1)))
9618            return -TARGET_EFAULT;
9619        ret = get_errno(umount(p));
9620        unlock_user(p, arg1, 0);
9621        return ret;
9622#endif
9623#if defined(TARGET_NR_move_mount) && defined(__NR_move_mount)
9624    case TARGET_NR_move_mount:
9625        {
9626            void *p2, *p4;
9627
9628            if (!arg2 || !arg4) {
9629                return -TARGET_EFAULT;
9630            }
9631
9632            p2 = lock_user_string(arg2);
9633            if (!p2) {
9634                return -TARGET_EFAULT;
9635            }
9636
9637            p4 = lock_user_string(arg4);
9638            if (!p4) {
9639                unlock_user(p2, arg2, 0);
9640                return -TARGET_EFAULT;
9641            }
9642            ret = get_errno(sys_move_mount(arg1, p2, arg3, p4, arg5));
9643
9644            unlock_user(p2, arg2, 0);
9645            unlock_user(p4, arg4, 0);
9646
9647            return ret;
9648        }
9649#endif
9650#if defined(TARGET_NR_open_tree) && defined(__NR_open_tree)
9651    case TARGET_NR_open_tree:
9652        {
9653            void *p2;
9654            int host_flags;
9655
9656            if (!arg2) {
9657                return -TARGET_EFAULT;
9658            }
9659
9660            p2 = lock_user_string(arg2);
9661            if (!p2) {
9662                return -TARGET_EFAULT;
9663            }
9664
9665            host_flags = arg3 & ~TARGET_O_CLOEXEC;
9666            if (arg3 & TARGET_O_CLOEXEC) {
9667                host_flags |= O_CLOEXEC;
9668            }
9669
9670            ret = get_errno(sys_open_tree(arg1, p2, host_flags));
9671
9672            unlock_user(p2, arg2, 0);
9673
9674            return ret;
9675        }
9676#endif
9677#ifdef TARGET_NR_stime /* not on alpha */
9678    case TARGET_NR_stime:
9679        {
9680            struct timespec ts;
9681            ts.tv_nsec = 0;
9682            if (get_user_sal(ts.tv_sec, arg1)) {
9683                return -TARGET_EFAULT;
9684            }
9685            return get_errno(clock_settime(CLOCK_REALTIME, &ts));
9686        }
9687#endif
9688#ifdef TARGET_NR_alarm /* not on alpha */
9689    case TARGET_NR_alarm:
9690        return alarm(arg1);
9691#endif
9692#ifdef TARGET_NR_pause /* not on alpha */
9693    case TARGET_NR_pause:
9694        if (!block_signals()) {
9695            sigsuspend(&get_task_state(cpu)->signal_mask);
9696        }
9697        return -TARGET_EINTR;
9698#endif
9699#ifdef TARGET_NR_utime
9700    case TARGET_NR_utime:
9701        {
9702            struct utimbuf tbuf, *host_tbuf;
9703            struct target_utimbuf *target_tbuf;
9704            if (arg2) {
9705                if (!lock_user_struct(VERIFY_READ, target_tbuf, arg2, 1))
9706                    return -TARGET_EFAULT;
9707                tbuf.actime = tswapal(target_tbuf->actime);
9708                tbuf.modtime = tswapal(target_tbuf->modtime);
9709                unlock_user_struct(target_tbuf, arg2, 0);
9710                host_tbuf = &tbuf;
9711            } else {
9712                host_tbuf = NULL;
9713            }
9714            if (!(p = lock_user_string(arg1)))
9715                return -TARGET_EFAULT;
9716            ret = get_errno(utime(p, host_tbuf));
9717            unlock_user(p, arg1, 0);
9718        }
9719        return ret;
9720#endif
9721#ifdef TARGET_NR_utimes
9722    case TARGET_NR_utimes:
9723        {
9724            struct timeval *tvp, tv[2];
9725            if (arg2) {
9726                if (copy_from_user_timeval(&tv[0], arg2)
9727                    || copy_from_user_timeval(&tv[1],
9728                                              arg2 + sizeof(struct target_timeval)))
9729                    return -TARGET_EFAULT;
9730                tvp = tv;
9731            } else {
9732                tvp = NULL;
9733            }
9734            if (!(p = lock_user_string(arg1)))
9735                return -TARGET_EFAULT;
9736            ret = get_errno(utimes(p, tvp));
9737            unlock_user(p, arg1, 0);
9738        }
9739        return ret;
9740#endif
9741#if defined(TARGET_NR_futimesat)
9742    case TARGET_NR_futimesat:
9743        {
9744            struct timeval *tvp, tv[2];
9745            if (arg3) {
9746                if (copy_from_user_timeval(&tv[0], arg3)
9747                    || copy_from_user_timeval(&tv[1],
9748                                              arg3 + sizeof(struct target_timeval)))
9749                    return -TARGET_EFAULT;
9750                tvp = tv;
9751            } else {
9752                tvp = NULL;
9753            }
9754            if (!(p = lock_user_string(arg2))) {
9755                return -TARGET_EFAULT;
9756            }
9757            ret = get_errno(futimesat(arg1, path(p), tvp));
9758            unlock_user(p, arg2, 0);
9759        }
9760        return ret;
9761#endif
9762#ifdef TARGET_NR_access
9763    case TARGET_NR_access:
9764        if (!(p = lock_user_string(arg1))) {
9765            return -TARGET_EFAULT;
9766        }
9767        ret = get_errno(access(path(p), arg2));
9768        unlock_user(p, arg1, 0);
9769        return ret;
9770#endif
9771#if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
9772    case TARGET_NR_faccessat:
9773        if (!(p = lock_user_string(arg2))) {
9774            return -TARGET_EFAULT;
9775        }
9776        ret = get_errno(faccessat(arg1, p, arg3, 0));
9777        unlock_user(p, arg2, 0);
9778        return ret;
9779#endif
9780#if defined(TARGET_NR_faccessat2)
9781    case TARGET_NR_faccessat2:
9782        if (!(p = lock_user_string(arg2))) {
9783            return -TARGET_EFAULT;
9784        }
9785        ret = get_errno(faccessat(arg1, p, arg3, arg4));
9786        unlock_user(p, arg2, 0);
9787        return ret;
9788#endif
9789#ifdef TARGET_NR_nice /* not on alpha */
9790    case TARGET_NR_nice:
9791        return get_errno(nice(arg1));
9792#endif
9793    case TARGET_NR_sync:
9794        sync();
9795        return 0;
9796#if defined(TARGET_NR_syncfs) && defined(CONFIG_SYNCFS)
9797    case TARGET_NR_syncfs:
9798        return get_errno(syncfs(arg1));
9799#endif
9800    case TARGET_NR_kill:
9801        return get_errno(safe_kill(arg1, target_to_host_signal(arg2)));
9802#ifdef TARGET_NR_rename
9803    case TARGET_NR_rename:
9804        {
9805            void *p2;
9806            p = lock_user_string(arg1);
9807            p2 = lock_user_string(arg2);
9808            if (!p || !p2)
9809                ret = -TARGET_EFAULT;
9810            else
9811                ret = get_errno(rename(p, p2));
9812            unlock_user(p2, arg2, 0);
9813            unlock_user(p, arg1, 0);
9814        }
9815        return ret;
9816#endif
9817#if defined(TARGET_NR_renameat)
9818    case TARGET_NR_renameat:
9819        {
9820            void *p2;
9821            p  = lock_user_string(arg2);
9822            p2 = lock_user_string(arg4);
9823            if (!p || !p2)
9824                ret = -TARGET_EFAULT;
9825            else
9826                ret = get_errno(renameat(arg1, p, arg3, p2));
9827            unlock_user(p2, arg4, 0);
9828            unlock_user(p, arg2, 0);
9829        }
9830        return ret;
9831#endif
9832#if defined(TARGET_NR_renameat2)
9833    case TARGET_NR_renameat2:
9834        {
9835            void *p2;
9836            p  = lock_user_string(arg2);
9837            p2 = lock_user_string(arg4);
9838            if (!p || !p2) {
9839                ret = -TARGET_EFAULT;
9840            } else {
9841                ret = get_errno(sys_renameat2(arg1, p, arg3, p2, arg5));
9842            }
9843            unlock_user(p2, arg4, 0);
9844            unlock_user(p, arg2, 0);
9845        }
9846        return ret;
9847#endif
9848#ifdef TARGET_NR_mkdir
9849    case TARGET_NR_mkdir:
9850        if (!(p = lock_user_string(arg1)))
9851            return -TARGET_EFAULT;
9852        ret = get_errno(mkdir(p, arg2));
9853        unlock_user(p, arg1, 0);
9854        return ret;
9855#endif
9856#if defined(TARGET_NR_mkdirat)
9857    case TARGET_NR_mkdirat:
9858        if (!(p = lock_user_string(arg2)))
9859            return -TARGET_EFAULT;
9860        ret = get_errno(mkdirat(arg1, p, arg3));
9861        unlock_user(p, arg2, 0);
9862        return ret;
9863#endif
9864#ifdef TARGET_NR_rmdir
9865    case TARGET_NR_rmdir:
9866        if (!(p = lock_user_string(arg1)))
9867            return -TARGET_EFAULT;
9868        ret = get_errno(rmdir(p));
9869        unlock_user(p, arg1, 0);
9870        return ret;
9871#endif
9872    case TARGET_NR_dup:
9873        ret = get_errno(dup(arg1));
9874        if (ret >= 0) {
9875            fd_trans_dup(arg1, ret);
9876        }
9877        return ret;
9878#ifdef TARGET_NR_pipe
9879    case TARGET_NR_pipe:
9880        return do_pipe(cpu_env, arg1, 0, 0);
9881#endif
9882#ifdef TARGET_NR_pipe2
9883    case TARGET_NR_pipe2:
9884        return do_pipe(cpu_env, arg1,
9885                       target_to_host_bitmask(arg2, fcntl_flags_tbl), 1);
9886#endif
9887    case TARGET_NR_times:
9888        {
9889            struct target_tms *tmsp;
9890            struct tms tms;
9891            ret = get_errno(times(&tms));
9892            if (arg1) {
9893                tmsp = lock_user(VERIFY_WRITE, arg1, sizeof(struct target_tms), 0);
9894                if (!tmsp)
9895                    return -TARGET_EFAULT;
9896                tmsp->tms_utime = tswapal(host_to_target_clock_t(tms.tms_utime));
9897                tmsp->tms_stime = tswapal(host_to_target_clock_t(tms.tms_stime));
9898                tmsp->tms_cutime = tswapal(host_to_target_clock_t(tms.tms_cutime));
9899                tmsp->tms_cstime = tswapal(host_to_target_clock_t(tms.tms_cstime));
9900            }
9901            if (!is_error(ret))
9902                ret = host_to_target_clock_t(ret);
9903        }
9904        return ret;
9905    case TARGET_NR_acct:
9906        if (arg1 == 0) {
9907            ret = get_errno(acct(NULL));
9908        } else {
9909            if (!(p = lock_user_string(arg1))) {
9910                return -TARGET_EFAULT;
9911            }
9912            ret = get_errno(acct(path(p)));
9913            unlock_user(p, arg1, 0);
9914        }
9915        return ret;
9916#ifdef TARGET_NR_umount2
9917    case TARGET_NR_umount2:
9918        if (!(p = lock_user_string(arg1)))
9919            return -TARGET_EFAULT;
9920        ret = get_errno(umount2(p, arg2));
9921        unlock_user(p, arg1, 0);
9922        return ret;
9923#endif
9924    case TARGET_NR_ioctl:
9925        return do_ioctl(arg1, arg2, arg3);
9926#ifdef TARGET_NR_fcntl
9927    case TARGET_NR_fcntl:
9928        return do_fcntl(arg1, arg2, arg3);
9929#endif
9930    case TARGET_NR_setpgid:
9931        return get_errno(setpgid(arg1, arg2));
9932    case TARGET_NR_umask:
9933        return get_errno(umask(arg1));
9934    case TARGET_NR_chroot:
9935        if (!(p = lock_user_string(arg1)))
9936            return -TARGET_EFAULT;
9937        ret = get_errno(chroot(p));
9938        unlock_user(p, arg1, 0);
9939        return ret;
9940#ifdef TARGET_NR_dup2
9941    case TARGET_NR_dup2:
9942        ret = get_errno(dup2(arg1, arg2));
9943        if (ret >= 0) {
9944            fd_trans_dup(arg1, arg2);
9945        }
9946        return ret;
9947#endif
9948#if defined(CONFIG_DUP3) && defined(TARGET_NR_dup3)
9949    case TARGET_NR_dup3:
9950    {
9951        int host_flags;
9952
9953        if ((arg3 & ~TARGET_O_CLOEXEC) != 0) {
9954            return -EINVAL;
9955        }
9956        host_flags = target_to_host_bitmask(arg3, fcntl_flags_tbl);
9957        ret = get_errno(dup3(arg1, arg2, host_flags));
9958        if (ret >= 0) {
9959            fd_trans_dup(arg1, arg2);
9960        }
9961        return ret;
9962    }
9963#endif
9964#ifdef TARGET_NR_getppid /* not on alpha */
9965    case TARGET_NR_getppid:
9966        return get_errno(getppid());
9967#endif
9968#ifdef TARGET_NR_getpgrp
9969    case TARGET_NR_getpgrp:
9970        return get_errno(getpgrp());
9971#endif
9972    case TARGET_NR_setsid:
9973        return get_errno(setsid());
9974#ifdef TARGET_NR_sigaction
9975    case TARGET_NR_sigaction:
9976        {
9977#if defined(TARGET_MIPS)
9978            struct target_sigaction act, oact, *pact, *old_act;
9979
9980            if (arg2) {
9981                if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1))
9982                    return -TARGET_EFAULT;
9983                act._sa_handler = old_act->_sa_handler;
9984                target_siginitset(&act.sa_mask, old_act->sa_mask.sig[0]);
9985                act.sa_flags = old_act->sa_flags;
9986                unlock_user_struct(old_act, arg2, 0);
9987                pact = &act;
9988            } else {
9989                pact = NULL;
9990            }
9991
9992        ret = get_errno(do_sigaction(arg1, pact, &oact, 0));
9993
9994            if (!is_error(ret) && arg3) {
9995                if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0))
9996                    return -TARGET_EFAULT;
9997                old_act->_sa_handler = oact._sa_handler;
9998                old_act->sa_flags = oact.sa_flags;
9999                old_act->sa_mask.sig[0] = oact.sa_mask.sig[0];
10000                old_act->sa_mask.sig[1] = 0;
10001                old_act->sa_mask.sig[2] = 0;
10002                old_act->sa_mask.sig[3] = 0;
10003                unlock_user_struct(old_act, arg3, 1);
10004            }
10005#else
10006            struct target_old_sigaction *old_act;
10007            struct target_sigaction act, oact, *pact;
10008            if (arg2) {
10009                if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1))
10010                    return -TARGET_EFAULT;
10011                act._sa_handler = old_act->_sa_handler;
10012                target_siginitset(&act.sa_mask, old_act->sa_mask);
10013                act.sa_flags = old_act->sa_flags;
10014#ifdef TARGET_ARCH_HAS_SA_RESTORER
10015                act.sa_restorer = old_act->sa_restorer;
10016#endif
10017                unlock_user_struct(old_act, arg2, 0);
10018                pact = &act;
10019            } else {
10020                pact = NULL;
10021            }
10022            ret = get_errno(do_sigaction(arg1, pact, &oact, 0));
10023            if (!is_error(ret) && arg3) {
10024                if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0))
10025                    return -TARGET_EFAULT;
10026                old_act->_sa_handler = oact._sa_handler;
10027                old_act->sa_mask = oact.sa_mask.sig[0];
10028                old_act->sa_flags = oact.sa_flags;
10029#ifdef TARGET_ARCH_HAS_SA_RESTORER
10030                old_act->sa_restorer = oact.sa_restorer;
10031#endif
10032                unlock_user_struct(old_act, arg3, 1);
10033            }
10034#endif
10035        }
10036        return ret;
10037#endif
10038    case TARGET_NR_rt_sigaction:
10039        {
10040            /*
10041             * For Alpha and SPARC this is a 5 argument syscall, with
10042             * a 'restorer' parameter which must be copied into the
10043             * sa_restorer field of the sigaction struct.
10044             * For Alpha that 'restorer' is arg5; for SPARC it is arg4,
10045             * and arg5 is the sigsetsize.
10046             */
10047#if defined(TARGET_ALPHA)
10048            target_ulong sigsetsize = arg4;
10049            target_ulong restorer = arg5;
10050#elif defined(TARGET_SPARC)
10051            target_ulong restorer = arg4;
10052            target_ulong sigsetsize = arg5;
10053#else
10054            target_ulong sigsetsize = arg4;
10055            target_ulong restorer = 0;
10056#endif
10057            struct target_sigaction *act = NULL;
10058            struct target_sigaction *oact = NULL;
10059
10060            if (sigsetsize != sizeof(target_sigset_t)) {
10061                return -TARGET_EINVAL;
10062            }
10063            if (arg2 && !lock_user_struct(VERIFY_READ, act, arg2, 1)) {
10064                return -TARGET_EFAULT;
10065            }
10066            if (arg3 && !lock_user_struct(VERIFY_WRITE, oact, arg3, 0)) {
10067                ret = -TARGET_EFAULT;
10068            } else {
10069                ret = get_errno(do_sigaction(arg1, act, oact, restorer));
10070                if (oact) {
10071                    unlock_user_struct(oact, arg3, 1);
10072                }
10073            }
10074            if (act) {
10075                unlock_user_struct(act, arg2, 0);
10076            }
10077        }
10078        return ret;
10079#ifdef TARGET_NR_sgetmask /* not on alpha */
10080    case TARGET_NR_sgetmask:
10081        {
10082            sigset_t cur_set;
10083            abi_ulong target_set;
10084            ret = do_sigprocmask(0, NULL, &cur_set);
10085            if (!ret) {
10086                host_to_target_old_sigset(&target_set, &cur_set);
10087                ret = target_set;
10088            }
10089        }
10090        return ret;
10091#endif
10092#ifdef TARGET_NR_ssetmask /* not on alpha */
10093    case TARGET_NR_ssetmask:
10094        {
10095            sigset_t set, oset;
10096            abi_ulong target_set = arg1;
10097            target_to_host_old_sigset(&set, &target_set);
10098            ret = do_sigprocmask(SIG_SETMASK, &set, &oset);
10099            if (!ret) {
10100                host_to_target_old_sigset(&target_set, &oset);
10101                ret = target_set;
10102            }
10103        }
10104        return ret;
10105#endif
10106#ifdef TARGET_NR_sigprocmask
10107    case TARGET_NR_sigprocmask:
10108        {
10109#if defined(TARGET_ALPHA)
10110            sigset_t set, oldset;
10111            abi_ulong mask;
10112            int how;
10113
10114            switch (arg1) {
10115            case TARGET_SIG_BLOCK:
10116                how = SIG_BLOCK;
10117                break;
10118            case TARGET_SIG_UNBLOCK:
10119                how = SIG_UNBLOCK;
10120                break;
10121            case TARGET_SIG_SETMASK:
10122                how = SIG_SETMASK;
10123                break;
10124            default:
10125                return -TARGET_EINVAL;
10126            }
10127            mask = arg2;
10128            target_to_host_old_sigset(&set, &mask);
10129
10130            ret = do_sigprocmask(how, &set, &oldset);
10131            if (!is_error(ret)) {
10132                host_to_target_old_sigset(&mask, &oldset);
10133                ret = mask;
10134                cpu_env->ir[IR_V0] = 0; /* force no error */
10135            }
10136#else
10137            sigset_t set, oldset, *set_ptr;
10138            int how;
10139
10140            if (arg2) {
10141                p = lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1);
10142                if (!p) {
10143                    return -TARGET_EFAULT;
10144                }
10145                target_to_host_old_sigset(&set, p);
10146                unlock_user(p, arg2, 0);
10147                set_ptr = &set;
10148                switch (arg1) {
10149                case TARGET_SIG_BLOCK:
10150                    how = SIG_BLOCK;
10151                    break;
10152                case TARGET_SIG_UNBLOCK:
10153                    how = SIG_UNBLOCK;
10154                    break;
10155                case TARGET_SIG_SETMASK:
10156                    how = SIG_SETMASK;
10157                    break;
10158                default:
10159                    return -TARGET_EINVAL;
10160                }
10161            } else {
10162                how = 0;
10163                set_ptr = NULL;
10164            }
10165            ret = do_sigprocmask(how, set_ptr, &oldset);
10166            if (!is_error(ret) && arg3) {
10167                if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0)))
10168                    return -TARGET_EFAULT;
10169                host_to_target_old_sigset(p, &oldset);
10170                unlock_user(p, arg3, sizeof(target_sigset_t));
10171            }
10172#endif
10173        }
10174        return ret;
10175#endif
10176    case TARGET_NR_rt_sigprocmask:
10177        {
10178            int how = arg1;
10179            sigset_t set, oldset, *set_ptr;
10180
10181            if (arg4 != sizeof(target_sigset_t)) {
10182                return -TARGET_EINVAL;
10183            }
10184
10185            if (arg2) {
10186                p = lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1);
10187                if (!p) {
10188                    return -TARGET_EFAULT;
10189                }
10190                target_to_host_sigset(&set, p);
10191                unlock_user(p, arg2, 0);
10192                set_ptr = &set;
10193                switch(how) {
10194                case TARGET_SIG_BLOCK:
10195                    how = SIG_BLOCK;
10196                    break;
10197                case TARGET_SIG_UNBLOCK:
10198                    how = SIG_UNBLOCK;
10199                    break;
10200                case TARGET_SIG_SETMASK:
10201                    how = SIG_SETMASK;
10202                    break;
10203                default:
10204                    return -TARGET_EINVAL;
10205                }
10206            } else {
10207                how = 0;
10208                set_ptr = NULL;
10209            }
10210            ret = do_sigprocmask(how, set_ptr, &oldset);
10211            if (!is_error(ret) && arg3) {
10212                if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0)))
10213                    return -TARGET_EFAULT;
10214                host_to_target_sigset(p, &oldset);
10215                unlock_user(p, arg3, sizeof(target_sigset_t));
10216            }
10217        }
10218        return ret;
10219#ifdef TARGET_NR_sigpending
10220    case TARGET_NR_sigpending:
10221        {
10222            sigset_t set;
10223            ret = get_errno(sigpending(&set));
10224            if (!is_error(ret)) {
10225                if (!(p = lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t), 0)))
10226                    return -TARGET_EFAULT;
10227                host_to_target_old_sigset(p, &set);
10228                unlock_user(p, arg1, sizeof(target_sigset_t));
10229            }
10230        }
10231        return ret;
10232#endif
10233    case TARGET_NR_rt_sigpending:
10234        {
10235            sigset_t set;
10236
10237            /* Yes, this check is >, not != like most. We follow the kernel's
10238             * logic and it does it like this because it implements
10239             * NR_sigpending through the same code path, and in that case
10240             * the old_sigset_t is smaller in size.
10241             */
10242            if (arg2 > sizeof(target_sigset_t)) {
10243                return -TARGET_EINVAL;
10244            }
10245
10246            ret = get_errno(sigpending(&set));
10247            if (!is_error(ret)) {
10248                if (!(p = lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t), 0)))
10249                    return -TARGET_EFAULT;
10250                host_to_target_sigset(p, &set);
10251                unlock_user(p, arg1, sizeof(target_sigset_t));
10252            }
10253        }
10254        return ret;
10255#ifdef TARGET_NR_sigsuspend
10256    case TARGET_NR_sigsuspend:
10257        {
10258            sigset_t *set;
10259
10260#if defined(TARGET_ALPHA)
10261            TaskState *ts = get_task_state(cpu);
10262            /* target_to_host_old_sigset will bswap back */
10263            abi_ulong mask = tswapal(arg1);
10264            set = &ts->sigsuspend_mask;
10265            target_to_host_old_sigset(set, &mask);
10266#else
10267            ret = process_sigsuspend_mask(&set, arg1, sizeof(target_sigset_t));
10268            if (ret != 0) {
10269                return ret;
10270            }
10271#endif
10272            ret = get_errno(safe_rt_sigsuspend(set, SIGSET_T_SIZE));
10273            finish_sigsuspend_mask(ret);
10274        }
10275        return ret;
10276#endif
10277    case TARGET_NR_rt_sigsuspend:
10278        {
10279            sigset_t *set;
10280
10281            ret = process_sigsuspend_mask(&set, arg1, arg2);
10282            if (ret != 0) {
10283                return ret;
10284            }
10285            ret = get_errno(safe_rt_sigsuspend(set, SIGSET_T_SIZE));
10286            finish_sigsuspend_mask(ret);
10287        }
10288        return ret;
10289#ifdef TARGET_NR_rt_sigtimedwait
10290    case TARGET_NR_rt_sigtimedwait:
10291        {
10292            sigset_t set;
10293            struct timespec uts, *puts;
10294            siginfo_t uinfo;
10295
10296            if (arg4 != sizeof(target_sigset_t)) {
10297                return -TARGET_EINVAL;
10298            }
10299
10300            if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
10301                return -TARGET_EFAULT;
10302            target_to_host_sigset(&set, p);
10303            unlock_user(p, arg1, 0);
10304            if (arg3) {
10305                puts = &uts;
10306                if (target_to_host_timespec(puts, arg3)) {
10307                    return -TARGET_EFAULT;
10308                }
10309            } else {
10310                puts = NULL;
10311            }
10312            ret = get_errno(safe_rt_sigtimedwait(&set, &uinfo, puts,
10313                                                 SIGSET_T_SIZE));
10314            if (!is_error(ret)) {
10315                if (arg2) {
10316                    p = lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t),
10317                                  0);
10318                    if (!p) {
10319                        return -TARGET_EFAULT;
10320                    }
10321                    host_to_target_siginfo(p, &uinfo);
10322                    unlock_user(p, arg2, sizeof(target_siginfo_t));
10323                }
10324                ret = host_to_target_signal(ret);
10325            }
10326        }
10327        return ret;
10328#endif
10329#ifdef TARGET_NR_rt_sigtimedwait_time64
10330    case TARGET_NR_rt_sigtimedwait_time64:
10331        {
10332            sigset_t set;
10333            struct timespec uts, *puts;
10334            siginfo_t uinfo;
10335
10336            if (arg4 != sizeof(target_sigset_t)) {
10337                return -TARGET_EINVAL;
10338            }
10339
10340            p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1);
10341            if (!p) {
10342                return -TARGET_EFAULT;
10343            }
10344            target_to_host_sigset(&set, p);
10345            unlock_user(p, arg1, 0);
10346            if (arg3) {
10347                puts = &uts;
10348                if (target_to_host_timespec64(puts, arg3)) {
10349                    return -TARGET_EFAULT;
10350                }
10351            } else {
10352                puts = NULL;
10353            }
10354            ret = get_errno(safe_rt_sigtimedwait(&set, &uinfo, puts,
10355                                                 SIGSET_T_SIZE));
10356            if (!is_error(ret)) {
10357                if (arg2) {
10358                    p = lock_user(VERIFY_WRITE, arg2,
10359                                  sizeof(target_siginfo_t), 0);
10360                    if (!p) {
10361                        return -TARGET_EFAULT;
10362                    }
10363                    host_to_target_siginfo(p, &uinfo);
10364                    unlock_user(p, arg2, sizeof(target_siginfo_t));
10365                }
10366                ret = host_to_target_signal(ret);
10367            }
10368        }
10369        return ret;
10370#endif
10371    case TARGET_NR_rt_sigqueueinfo:
10372        {
10373            siginfo_t uinfo;
10374
10375            p = lock_user(VERIFY_READ, arg3, sizeof(target_siginfo_t), 1);
10376            if (!p) {
10377                return -TARGET_EFAULT;
10378            }
10379            target_to_host_siginfo(&uinfo, p);
10380            unlock_user(p, arg3, 0);
10381            ret = get_errno(sys_rt_sigqueueinfo(arg1, target_to_host_signal(arg2), &uinfo));
10382        }
10383        return ret;
10384    case TARGET_NR_rt_tgsigqueueinfo:
10385        {
10386            siginfo_t uinfo;
10387
10388            p = lock_user(VERIFY_READ, arg4, sizeof(target_siginfo_t), 1);
10389            if (!p) {
10390                return -TARGET_EFAULT;
10391            }
10392            target_to_host_siginfo(&uinfo, p);
10393            unlock_user(p, arg4, 0);
10394            ret = get_errno(sys_rt_tgsigqueueinfo(arg1, arg2, target_to_host_signal(arg3), &uinfo));
10395        }
10396        return ret;
10397#ifdef TARGET_NR_sigreturn
10398    case TARGET_NR_sigreturn:
10399        if (block_signals()) {
10400            return -QEMU_ERESTARTSYS;
10401        }
10402        return do_sigreturn(cpu_env);
10403#endif
10404    case TARGET_NR_rt_sigreturn:
10405        if (block_signals()) {
10406            return -QEMU_ERESTARTSYS;
10407        }
10408        return do_rt_sigreturn(cpu_env);
10409    case TARGET_NR_sethostname:
10410        if (!(p = lock_user_string(arg1)))
10411            return -TARGET_EFAULT;
10412        ret = get_errno(sethostname(p, arg2));
10413        unlock_user(p, arg1, 0);
10414        return ret;
10415#ifdef TARGET_NR_setrlimit
10416    case TARGET_NR_setrlimit:
10417        {
10418            int resource = target_to_host_resource(arg1);
10419            struct target_rlimit *target_rlim;
10420            struct rlimit rlim;
10421            if (!lock_user_struct(VERIFY_READ, target_rlim, arg2, 1))
10422                return -TARGET_EFAULT;
10423            rlim.rlim_cur = target_to_host_rlim(target_rlim->rlim_cur);
10424            rlim.rlim_max = target_to_host_rlim(target_rlim->rlim_max);
10425            unlock_user_struct(target_rlim, arg2, 0);
10426            /*
10427             * If we just passed through resource limit settings for memory then
10428             * they would also apply to QEMU's own allocations, and QEMU will
10429             * crash or hang or die if its allocations fail. Ideally we would
10430             * track the guest allocations in QEMU and apply the limits ourselves.
10431             * For now, just tell the guest the call succeeded but don't actually
10432             * limit anything.
10433             */
10434            if (resource != RLIMIT_AS &&
10435                resource != RLIMIT_DATA &&
10436                resource != RLIMIT_STACK) {
10437                return get_errno(setrlimit(resource, &rlim));
10438            } else {
10439                return 0;
10440            }
10441        }
10442#endif
10443#ifdef TARGET_NR_getrlimit
10444    case TARGET_NR_getrlimit:
10445        {
10446            int resource = target_to_host_resource(arg1);
10447            struct target_rlimit *target_rlim;
10448            struct rlimit rlim;
10449
10450            ret = get_errno(getrlimit(resource, &rlim));
10451            if (!is_error(ret)) {
10452                if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0))
10453                    return -TARGET_EFAULT;
10454                target_rlim->rlim_cur = host_to_target_rlim(rlim.rlim_cur);
10455                target_rlim->rlim_max = host_to_target_rlim(rlim.rlim_max);
10456                unlock_user_struct(target_rlim, arg2, 1);
10457            }
10458        }
10459        return ret;
10460#endif
10461    case TARGET_NR_getrusage:
10462        {
10463            struct rusage rusage;
10464            ret = get_errno(getrusage(arg1, &rusage));
10465            if (!is_error(ret)) {
10466                ret = host_to_target_rusage(arg2, &rusage);
10467            }
10468        }
10469        return ret;
10470#if defined(TARGET_NR_gettimeofday)
10471    case TARGET_NR_gettimeofday:
10472        {
10473            struct timeval tv;
10474            struct timezone tz;
10475
10476            ret = get_errno(gettimeofday(&tv, &tz));
10477            if (!is_error(ret)) {
10478                if (arg1 && copy_to_user_timeval(arg1, &tv)) {
10479                    return -TARGET_EFAULT;
10480                }
10481                if (arg2 && copy_to_user_timezone(arg2, &tz)) {
10482                    return -TARGET_EFAULT;
10483                }
10484            }
10485        }
10486        return ret;
10487#endif
10488#if defined(TARGET_NR_settimeofday)
10489    case TARGET_NR_settimeofday:
10490        {
10491            struct timeval tv, *ptv = NULL;
10492            struct timezone tz, *ptz = NULL;
10493
10494            if (arg1) {
10495                if (copy_from_user_timeval(&tv, arg1)) {
10496                    return -TARGET_EFAULT;
10497                }
10498                ptv = &tv;
10499            }
10500
10501            if (arg2) {
10502                if (copy_from_user_timezone(&tz, arg2)) {
10503                    return -TARGET_EFAULT;
10504                }
10505                ptz = &tz;
10506            }
10507
10508            return get_errno(settimeofday(ptv, ptz));
10509        }
10510#endif
10511#if defined(TARGET_NR_select)
10512    case TARGET_NR_select:
10513#if defined(TARGET_WANT_NI_OLD_SELECT)
10514        /* some architectures used to have old_select here
10515         * but now ENOSYS it.
10516         */
10517        ret = -TARGET_ENOSYS;
10518#elif defined(TARGET_WANT_OLD_SYS_SELECT)
10519        ret = do_old_select(arg1);
10520#else
10521        ret = do_select(arg1, arg2, arg3, arg4, arg5);
10522#endif
10523        return ret;
10524#endif
10525#ifdef TARGET_NR_pselect6
10526    case TARGET_NR_pselect6:
10527        return do_pselect6(arg1, arg2, arg3, arg4, arg5, arg6, false);
10528#endif
10529#ifdef TARGET_NR_pselect6_time64
10530    case TARGET_NR_pselect6_time64:
10531        return do_pselect6(arg1, arg2, arg3, arg4, arg5, arg6, true);
10532#endif
10533#ifdef TARGET_NR_symlink
10534    case TARGET_NR_symlink:
10535        {
10536            void *p2;
10537            p = lock_user_string(arg1);
10538            p2 = lock_user_string(arg2);
10539            if (!p || !p2)
10540                ret = -TARGET_EFAULT;
10541            else
10542                ret = get_errno(symlink(p, p2));
10543            unlock_user(p2, arg2, 0);
10544            unlock_user(p, arg1, 0);
10545        }
10546        return ret;
10547#endif
10548#if defined(TARGET_NR_symlinkat)
10549    case TARGET_NR_symlinkat:
10550        {
10551            void *p2;
10552            p  = lock_user_string(arg1);
10553            p2 = lock_user_string(arg3);
10554            if (!p || !p2)
10555                ret = -TARGET_EFAULT;
10556            else
10557                ret = get_errno(symlinkat(p, arg2, p2));
10558            unlock_user(p2, arg3, 0);
10559            unlock_user(p, arg1, 0);
10560        }
10561        return ret;
10562#endif
10563#ifdef TARGET_NR_readlink
10564    case TARGET_NR_readlink:
10565        {
10566            void *p2;
10567            p = lock_user_string(arg1);
10568            p2 = lock_user(VERIFY_WRITE, arg2, arg3, 0);
10569            ret = get_errno(do_guest_readlink(p, p2, arg3));
10570            unlock_user(p2, arg2, ret);
10571            unlock_user(p, arg1, 0);
10572        }
10573        return ret;
10574#endif
10575#if defined(TARGET_NR_readlinkat)
10576    case TARGET_NR_readlinkat:
10577        {
10578            void *p2;
10579            p  = lock_user_string(arg2);
10580            p2 = lock_user(VERIFY_WRITE, arg3, arg4, 0);
10581            if (!p || !p2) {
10582                ret = -TARGET_EFAULT;
10583            } else if (!arg4) {
10584                /* Short circuit this for the magic exe check. */
10585                ret = -TARGET_EINVAL;
10586            } else if (is_proc_myself((const char *)p, "exe")) {
10587                /*
10588                 * Don't worry about sign mismatch as earlier mapping
10589                 * logic would have thrown a bad address error.
10590                 */
10591                ret = MIN(strlen(exec_path), arg4);
10592                /* We cannot NUL terminate the string. */
10593                memcpy(p2, exec_path, ret);
10594            } else {
10595                ret = get_errno(readlinkat(arg1, path(p), p2, arg4));
10596            }
10597            unlock_user(p2, arg3, ret);
10598            unlock_user(p, arg2, 0);
10599        }
10600        return ret;
10601#endif
10602#ifdef TARGET_NR_swapon
10603    case TARGET_NR_swapon:
10604        if (!(p = lock_user_string(arg1)))
10605            return -TARGET_EFAULT;
10606        ret = get_errno(swapon(p, arg2));
10607        unlock_user(p, arg1, 0);
10608        return ret;
10609#endif
10610    case TARGET_NR_reboot:
10611        if (arg3 == LINUX_REBOOT_CMD_RESTART2) {
10612           /* arg4 must be ignored in all other cases */
10613           p = lock_user_string(arg4);
10614           if (!p) {
10615               return -TARGET_EFAULT;
10616           }
10617           ret = get_errno(reboot(arg1, arg2, arg3, p));
10618           unlock_user(p, arg4, 0);
10619        } else {
10620           ret = get_errno(reboot(arg1, arg2, arg3, NULL));
10621        }
10622        return ret;
10623#ifdef TARGET_NR_mmap
10624    case TARGET_NR_mmap:
10625#ifdef TARGET_ARCH_WANT_SYS_OLD_MMAP
10626        {
10627            abi_ulong *v;
10628            abi_ulong v1, v2, v3, v4, v5, v6;
10629            if (!(v = lock_user(VERIFY_READ, arg1, 6 * sizeof(abi_ulong), 1)))
10630                return -TARGET_EFAULT;
10631            v1 = tswapal(v[0]);
10632            v2 = tswapal(v[1]);
10633            v3 = tswapal(v[2]);
10634            v4 = tswapal(v[3]);
10635            v5 = tswapal(v[4]);
10636            v6 = tswapal(v[5]);
10637            unlock_user(v, arg1, 0);
10638            return do_mmap(v1, v2, v3, v4, v5, v6);
10639        }
10640#else
10641        /* mmap pointers are always untagged */
10642        return do_mmap(arg1, arg2, arg3, arg4, arg5, arg6);
10643#endif
10644#endif
10645#ifdef TARGET_NR_mmap2
10646    case TARGET_NR_mmap2:
10647#ifndef MMAP_SHIFT
10648#define MMAP_SHIFT 12
10649#endif
10650        return do_mmap(arg1, arg2, arg3, arg4, arg5,
10651                       (off_t)(abi_ulong)arg6 << MMAP_SHIFT);
10652#endif
10653    case TARGET_NR_munmap:
10654        arg1 = cpu_untagged_addr(cpu, arg1);
10655        return get_errno(target_munmap(arg1, arg2));
10656    case TARGET_NR_mprotect:
10657        arg1 = cpu_untagged_addr(cpu, arg1);
10658        {
10659            TaskState *ts = get_task_state(cpu);
10660            /* Special hack to detect libc making the stack executable.  */
10661            if ((arg3 & PROT_GROWSDOWN)
10662                && arg1 >= ts->info->stack_limit
10663                && arg1 <= ts->info->start_stack) {
10664                arg3 &= ~PROT_GROWSDOWN;
10665                arg2 = arg2 + arg1 - ts->info->stack_limit;
10666                arg1 = ts->info->stack_limit;
10667            }
10668        }
10669        return get_errno(target_mprotect(arg1, arg2, arg3));
10670#ifdef TARGET_NR_mremap
10671    case TARGET_NR_mremap:
10672        arg1 = cpu_untagged_addr(cpu, arg1);
10673        /* mremap new_addr (arg5) is always untagged */
10674        return get_errno(target_mremap(arg1, arg2, arg3, arg4, arg5));
10675#endif
10676        /* ??? msync/mlock/munlock are broken for softmmu.  */
10677#ifdef TARGET_NR_msync
10678    case TARGET_NR_msync:
10679        return get_errno(msync(g2h(cpu, arg1), arg2,
10680                               target_to_host_msync_arg(arg3)));
10681#endif
10682#ifdef TARGET_NR_mlock
10683    case TARGET_NR_mlock:
10684        return get_errno(mlock(g2h(cpu, arg1), arg2));
10685#endif
10686#ifdef TARGET_NR_munlock
10687    case TARGET_NR_munlock:
10688        return get_errno(munlock(g2h(cpu, arg1), arg2));
10689#endif
10690#ifdef TARGET_NR_mlockall
10691    case TARGET_NR_mlockall:
10692        return get_errno(mlockall(target_to_host_mlockall_arg(arg1)));
10693#endif
10694#ifdef TARGET_NR_munlockall
10695    case TARGET_NR_munlockall:
10696        return get_errno(munlockall());
10697#endif
10698#ifdef TARGET_NR_truncate
10699    case TARGET_NR_truncate:
10700        if (!(p = lock_user_string(arg1)))
10701            return -TARGET_EFAULT;
10702        ret = get_errno(truncate(p, arg2));
10703        unlock_user(p, arg1, 0);
10704        return ret;
10705#endif
10706#ifdef TARGET_NR_ftruncate
10707    case TARGET_NR_ftruncate:
10708        return get_errno(ftruncate(arg1, arg2));
10709#endif
10710    case TARGET_NR_fchmod:
10711        return get_errno(fchmod(arg1, arg2));
10712#if defined(TARGET_NR_fchmodat)
10713    case TARGET_NR_fchmodat:
10714        if (!(p = lock_user_string(arg2)))
10715            return -TARGET_EFAULT;
10716        ret = get_errno(fchmodat(arg1, p, arg3, 0));
10717        unlock_user(p, arg2, 0);
10718        return ret;
10719#endif
10720#if defined(TARGET_NR_fchmodat2) && defined(__NR_fchmodat2)
10721    case TARGET_NR_fchmodat2:
10722        if (!(p = lock_user_string(arg2))) {
10723            return -TARGET_EFAULT;
10724        }
10725        ret = get_errno(safe_fchmodat2(arg1, p, arg3, arg4));
10726        unlock_user(p, arg2, 0);
10727        return ret;
10728#endif
10729    case TARGET_NR_getpriority:
10730        /* Note that negative values are valid for getpriority, so we must
10731           differentiate based on errno settings.  */
10732        errno = 0;
10733        ret = getpriority(arg1, arg2);
10734        if (ret == -1 && errno != 0) {
10735            return -host_to_target_errno(errno);
10736        }
10737#ifdef TARGET_ALPHA
10738        /* Return value is the unbiased priority.  Signal no error.  */
10739        cpu_env->ir[IR_V0] = 0;
10740#else
10741        /* Return value is a biased priority to avoid negative numbers.  */
10742        ret = 20 - ret;
10743#endif
10744        return ret;
10745    case TARGET_NR_setpriority:
10746        return get_errno(setpriority(arg1, arg2, arg3));
10747#ifdef TARGET_NR_statfs
10748    case TARGET_NR_statfs:
10749        if (!(p = lock_user_string(arg1))) {
10750            return -TARGET_EFAULT;
10751        }
10752        ret = get_errno(statfs(path(p), &stfs));
10753        unlock_user(p, arg1, 0);
10754    convert_statfs:
10755        if (!is_error(ret)) {
10756            struct target_statfs *target_stfs;
10757
10758            if (!lock_user_struct(VERIFY_WRITE, target_stfs, arg2, 0))
10759                return -TARGET_EFAULT;
10760            __put_user(stfs.f_type, &target_stfs->f_type);
10761            __put_user(stfs.f_bsize, &target_stfs->f_bsize);
10762            __put_user(stfs.f_blocks, &target_stfs->f_blocks);
10763            __put_user(stfs.f_bfree, &target_stfs->f_bfree);
10764            __put_user(stfs.f_bavail, &target_stfs->f_bavail);
10765            __put_user(stfs.f_files, &target_stfs->f_files);
10766            __put_user(stfs.f_ffree, &target_stfs->f_ffree);
10767            __put_user(stfs.f_fsid.__val[0], &target_stfs->f_fsid.val[0]);
10768            __put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]);
10769            __put_user(stfs.f_namelen, &target_stfs->f_namelen);
10770            __put_user(stfs.f_frsize, &target_stfs->f_frsize);
10771#ifdef _STATFS_F_FLAGS
10772            __put_user(stfs.f_flags, &target_stfs->f_flags);
10773#else
10774            __put_user(0, &target_stfs->f_flags);
10775#endif
10776            memset(target_stfs->f_spare, 0, sizeof(target_stfs->f_spare));
10777            unlock_user_struct(target_stfs, arg2, 1);
10778        }
10779        return ret;
10780#endif
10781#ifdef TARGET_NR_fstatfs
10782    case TARGET_NR_fstatfs:
10783        ret = get_errno(fstatfs(arg1, &stfs));
10784        goto convert_statfs;
10785#endif
10786#ifdef TARGET_NR_statfs64
10787    case TARGET_NR_statfs64:
10788        if (!(p = lock_user_string(arg1))) {
10789            return -TARGET_EFAULT;
10790        }
10791        ret = get_errno(statfs(path(p), &stfs));
10792        unlock_user(p, arg1, 0);
10793    convert_statfs64:
10794        if (!is_error(ret)) {
10795            struct target_statfs64 *target_stfs;
10796
10797            if (!lock_user_struct(VERIFY_WRITE, target_stfs, arg3, 0))
10798                return -TARGET_EFAULT;
10799            __put_user(stfs.f_type, &target_stfs->f_type);
10800            __put_user(stfs.f_bsize, &target_stfs->f_bsize);
10801            __put_user(stfs.f_blocks, &target_stfs->f_blocks);
10802            __put_user(stfs.f_bfree, &target_stfs->f_bfree);
10803            __put_user(stfs.f_bavail, &target_stfs->f_bavail);
10804            __put_user(stfs.f_files, &target_stfs->f_files);
10805            __put_user(stfs.f_ffree, &target_stfs->f_ffree);
10806            __put_user(stfs.f_fsid.__val[0], &target_stfs->f_fsid.val[0]);
10807            __put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]);
10808            __put_user(stfs.f_namelen, &target_stfs->f_namelen);
10809            __put_user(stfs.f_frsize, &target_stfs->f_frsize);
10810#ifdef _STATFS_F_FLAGS
10811            __put_user(stfs.f_flags, &target_stfs->f_flags);
10812#else
10813            __put_user(0, &target_stfs->f_flags);
10814#endif
10815            memset(target_stfs->f_spare, 0, sizeof(target_stfs->f_spare));
10816            unlock_user_struct(target_stfs, arg3, 1);
10817        }
10818        return ret;
10819    case TARGET_NR_fstatfs64:
10820        ret = get_errno(fstatfs(arg1, &stfs));
10821        goto convert_statfs64;
10822#endif
10823#ifdef TARGET_NR_socketcall
10824    case TARGET_NR_socketcall:
10825        return do_socketcall(arg1, arg2);
10826#endif
10827#ifdef TARGET_NR_accept
10828    case TARGET_NR_accept:
10829        return do_accept4(arg1, arg2, arg3, 0);
10830#endif
10831#ifdef TARGET_NR_accept4
10832    case TARGET_NR_accept4:
10833        return do_accept4(arg1, arg2, arg3, arg4);
10834#endif
10835#ifdef TARGET_NR_bind
10836    case TARGET_NR_bind:
10837        return do_bind(arg1, arg2, arg3);
10838#endif
10839#ifdef TARGET_NR_connect
10840    case TARGET_NR_connect:
10841        return do_connect(arg1, arg2, arg3);
10842#endif
10843#ifdef TARGET_NR_getpeername
10844    case TARGET_NR_getpeername:
10845        return do_getpeername(arg1, arg2, arg3);
10846#endif
10847#ifdef TARGET_NR_getsockname
10848    case TARGET_NR_getsockname:
10849        return do_getsockname(arg1, arg2, arg3);
10850#endif
10851#ifdef TARGET_NR_getsockopt
10852    case TARGET_NR_getsockopt:
10853        return do_getsockopt(arg1, arg2, arg3, arg4, arg5);
10854#endif
10855#ifdef TARGET_NR_listen
10856    case TARGET_NR_listen:
10857        return get_errno(listen(arg1, arg2));
10858#endif
10859#ifdef TARGET_NR_recv
10860    case TARGET_NR_recv:
10861        return do_recvfrom(arg1, arg2, arg3, arg4, 0, 0);
10862#endif
10863#ifdef TARGET_NR_recvfrom
10864    case TARGET_NR_recvfrom:
10865        return do_recvfrom(arg1, arg2, arg3, arg4, arg5, arg6);
10866#endif
10867#ifdef TARGET_NR_recvmsg
10868    case TARGET_NR_recvmsg:
10869        return do_sendrecvmsg(arg1, arg2, arg3, 0);
10870#endif
10871#ifdef TARGET_NR_send
10872    case TARGET_NR_send:
10873        return do_sendto(arg1, arg2, arg3, arg4, 0, 0);
10874#endif
10875#ifdef TARGET_NR_sendmsg
10876    case TARGET_NR_sendmsg:
10877        return do_sendrecvmsg(arg1, arg2, arg3, 1);
10878#endif
10879#ifdef TARGET_NR_sendmmsg
10880    case TARGET_NR_sendmmsg:
10881        return do_sendrecvmmsg(arg1, arg2, arg3, arg4, 1);
10882#endif
10883#ifdef TARGET_NR_recvmmsg
10884    case TARGET_NR_recvmmsg:
10885        return do_sendrecvmmsg(arg1, arg2, arg3, arg4, 0);
10886#endif
10887#ifdef TARGET_NR_sendto
10888    case TARGET_NR_sendto:
10889        return do_sendto(arg1, arg2, arg3, arg4, arg5, arg6);
10890#endif
10891#ifdef TARGET_NR_shutdown
10892    case TARGET_NR_shutdown:
10893        return get_errno(shutdown(arg1, arg2));
10894#endif
10895#if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
10896    case TARGET_NR_getrandom:
10897        p = lock_user(VERIFY_WRITE, arg1, arg2, 0);
10898        if (!p) {
10899            return -TARGET_EFAULT;
10900        }
10901        ret = get_errno(getrandom(p, arg2, arg3));
10902        unlock_user(p, arg1, ret);
10903        return ret;
10904#endif
10905#ifdef TARGET_NR_socket
10906    case TARGET_NR_socket:
10907        return do_socket(arg1, arg2, arg3);
10908#endif
10909#ifdef TARGET_NR_socketpair
10910    case TARGET_NR_socketpair:
10911        return do_socketpair(arg1, arg2, arg3, arg4);
10912#endif
10913#ifdef TARGET_NR_setsockopt
10914    case TARGET_NR_setsockopt:
10915        return do_setsockopt(arg1, arg2, arg3, arg4, (socklen_t) arg5);
10916#endif
10917#if defined(TARGET_NR_syslog)
10918    case TARGET_NR_syslog:
10919        {
10920            int len = arg2;
10921
10922            switch (arg1) {
10923            case TARGET_SYSLOG_ACTION_CLOSE:         /* Close log */
10924            case TARGET_SYSLOG_ACTION_OPEN:          /* Open log */
10925            case TARGET_SYSLOG_ACTION_CLEAR:         /* Clear ring buffer */
10926            case TARGET_SYSLOG_ACTION_CONSOLE_OFF:   /* Disable logging */
10927            case TARGET_SYSLOG_ACTION_CONSOLE_ON:    /* Enable logging */
10928            case TARGET_SYSLOG_ACTION_CONSOLE_LEVEL: /* Set messages level */
10929            case TARGET_SYSLOG_ACTION_SIZE_UNREAD:   /* Number of chars */
10930            case TARGET_SYSLOG_ACTION_SIZE_BUFFER:   /* Size of the buffer */
10931                return get_errno(sys_syslog((int)arg1, NULL, (int)arg3));
10932            case TARGET_SYSLOG_ACTION_READ:          /* Read from log */
10933            case TARGET_SYSLOG_ACTION_READ_CLEAR:    /* Read/clear msgs */
10934            case TARGET_SYSLOG_ACTION_READ_ALL:      /* Read last messages */
10935                {
10936                    if (len < 0) {
10937                        return -TARGET_EINVAL;
10938                    }
10939                    if (len == 0) {
10940                        return 0;
10941                    }
10942                    p = lock_user(VERIFY_WRITE, arg2, arg3, 0);
10943                    if (!p) {
10944                        return -TARGET_EFAULT;
10945                    }
10946                    ret = get_errno(sys_syslog((int)arg1, p, (int)arg3));
10947                    unlock_user(p, arg2, arg3);
10948                }
10949                return ret;
10950            default:
10951                return -TARGET_EINVAL;
10952            }
10953        }
10954        break;
10955#endif
10956    case TARGET_NR_setitimer:
10957        {
10958            struct itimerval value, ovalue, *pvalue;
10959
10960            if (arg2) {
10961                pvalue = &value;
10962                if (copy_from_user_timeval(&pvalue->it_interval, arg2)
10963                    || copy_from_user_timeval(&pvalue->it_value,
10964                                              arg2 + sizeof(struct target_timeval)))
10965                    return -TARGET_EFAULT;
10966            } else {
10967                pvalue = NULL;
10968            }
10969            ret = get_errno(setitimer(arg1, pvalue, &ovalue));
10970            if (!is_error(ret) && arg3) {
10971                if (copy_to_user_timeval(arg3,
10972                                         &ovalue.it_interval)
10973                    || copy_to_user_timeval(arg3 + sizeof(struct target_timeval),
10974                                            &ovalue.it_value))
10975                    return -TARGET_EFAULT;
10976            }
10977        }
10978        return ret;
10979    case TARGET_NR_getitimer:
10980        {
10981            struct itimerval value;
10982
10983            ret = get_errno(getitimer(arg1, &value));
10984            if (!is_error(ret) && arg2) {
10985                if (copy_to_user_timeval(arg2,
10986                                         &value.it_interval)
10987                    || copy_to_user_timeval(arg2 + sizeof(struct target_timeval),
10988                                            &value.it_value))
10989                    return -TARGET_EFAULT;
10990            }
10991        }
10992        return ret;
10993#ifdef TARGET_NR_stat
10994    case TARGET_NR_stat:
10995        if (!(p = lock_user_string(arg1))) {
10996            return -TARGET_EFAULT;
10997        }
10998        ret = get_errno(stat(path(p), &st));
10999        unlock_user(p, arg1, 0);
11000        goto do_stat;
11001#endif
11002#ifdef TARGET_NR_lstat
11003    case TARGET_NR_lstat:
11004        if (!(p = lock_user_string(arg1))) {
11005            return -TARGET_EFAULT;
11006        }
11007        ret = get_errno(lstat(path(p), &st));
11008        unlock_user(p, arg1, 0);
11009        goto do_stat;
11010#endif
11011#ifdef TARGET_NR_fstat
11012    case TARGET_NR_fstat:
11013        {
11014            ret = get_errno(fstat(arg1, &st));
11015#if defined(TARGET_NR_stat) || defined(TARGET_NR_lstat)
11016        do_stat:
11017#endif
11018            if (!is_error(ret)) {
11019                struct target_stat *target_st;
11020
11021                if (!lock_user_struct(VERIFY_WRITE, target_st, arg2, 0))
11022                    return -TARGET_EFAULT;
11023                memset(target_st, 0, sizeof(*target_st));
11024                __put_user(st.st_dev, &target_st->st_dev);
11025                __put_user(st.st_ino, &target_st->st_ino);
11026                __put_user(st.st_mode, &target_st->st_mode);
11027                __put_user(st.st_uid, &target_st->st_uid);
11028                __put_user(st.st_gid, &target_st->st_gid);
11029                __put_user(st.st_nlink, &target_st->st_nlink);
11030                __put_user(st.st_rdev, &target_st->st_rdev);
11031                __put_user(st.st_size, &target_st->st_size);
11032                __put_user(st.st_blksize, &target_st->st_blksize);
11033                __put_user(st.st_blocks, &target_st->st_blocks);
11034                __put_user(st.st_atime, &target_st->target_st_atime);
11035                __put_user(st.st_mtime, &target_st->target_st_mtime);
11036                __put_user(st.st_ctime, &target_st->target_st_ctime);
11037#if defined(HAVE_STRUCT_STAT_ST_ATIM) && defined(TARGET_STAT_HAVE_NSEC)
11038                __put_user(st.st_atim.tv_nsec,
11039                           &target_st->target_st_atime_nsec);
11040                __put_user(st.st_mtim.tv_nsec,
11041                           &target_st->target_st_mtime_nsec);
11042                __put_user(st.st_ctim.tv_nsec,
11043                           &target_st->target_st_ctime_nsec);
11044#endif
11045                unlock_user_struct(target_st, arg2, 1);
11046            }
11047        }
11048        return ret;
11049#endif
11050    case TARGET_NR_vhangup:
11051        return get_errno(vhangup());
11052#ifdef TARGET_NR_syscall
11053    case TARGET_NR_syscall:
11054        return do_syscall(cpu_env, arg1 & 0xffff, arg2, arg3, arg4, arg5,
11055                          arg6, arg7, arg8, 0);
11056#endif
11057#if defined(TARGET_NR_wait4)
11058    case TARGET_NR_wait4:
11059        {
11060            int status;
11061            abi_long status_ptr = arg2;
11062            struct rusage rusage, *rusage_ptr;
11063            abi_ulong target_rusage = arg4;
11064            abi_long rusage_err;
11065            if (target_rusage)
11066                rusage_ptr = &rusage;
11067            else
11068                rusage_ptr = NULL;
11069            ret = get_errno(safe_wait4(arg1, &status, arg3, rusage_ptr));
11070            if (!is_error(ret)) {
11071                if (status_ptr && ret) {
11072                    status = host_to_target_waitstatus(status);
11073                    if (put_user_s32(status, status_ptr))
11074                        return -TARGET_EFAULT;
11075                }
11076                if (target_rusage) {
11077                    rusage_err = host_to_target_rusage(target_rusage, &rusage);
11078                    if (rusage_err) {
11079                        ret = rusage_err;
11080                    }
11081                }
11082            }
11083        }
11084        return ret;
11085#endif
11086#ifdef TARGET_NR_swapoff
11087    case TARGET_NR_swapoff:
11088        if (!(p = lock_user_string(arg1)))
11089            return -TARGET_EFAULT;
11090        ret = get_errno(swapoff(p));
11091        unlock_user(p, arg1, 0);
11092        return ret;
11093#endif
11094    case TARGET_NR_sysinfo:
11095        {
11096            struct target_sysinfo *target_value;
11097            struct sysinfo value;
11098            ret = get_errno(sysinfo(&value));
11099            if (!is_error(ret) && arg1)
11100            {
11101                if (!lock_user_struct(VERIFY_WRITE, target_value, arg1, 0))
11102                    return -TARGET_EFAULT;
11103                __put_user(value.uptime, &target_value->uptime);
11104                __put_user(value.loads[0], &target_value->loads[0]);
11105                __put_user(value.loads[1], &target_value->loads[1]);
11106                __put_user(value.loads[2], &target_value->loads[2]);
11107                __put_user(value.totalram, &target_value->totalram);
11108                __put_user(value.freeram, &target_value->freeram);
11109                __put_user(value.sharedram, &target_value->sharedram);
11110                __put_user(value.bufferram, &target_value->bufferram);
11111                __put_user(value.totalswap, &target_value->totalswap);
11112                __put_user(value.freeswap, &target_value->freeswap);
11113                __put_user(value.procs, &target_value->procs);
11114                __put_user(value.totalhigh, &target_value->totalhigh);
11115                __put_user(value.freehigh, &target_value->freehigh);
11116                __put_user(value.mem_unit, &target_value->mem_unit);
11117                unlock_user_struct(target_value, arg1, 1);
11118            }
11119        }
11120        return ret;
11121#ifdef TARGET_NR_ipc
11122    case TARGET_NR_ipc:
11123        return do_ipc(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6);
11124#endif
11125#ifdef TARGET_NR_semget
11126    case TARGET_NR_semget:
11127        return get_errno(semget(arg1, arg2, arg3));
11128#endif
11129#ifdef TARGET_NR_semop
11130    case TARGET_NR_semop:
11131        return do_semtimedop(arg1, arg2, arg3, 0, false);
11132#endif
11133#ifdef TARGET_NR_semtimedop
11134    case TARGET_NR_semtimedop:
11135        return do_semtimedop(arg1, arg2, arg3, arg4, false);
11136#endif
11137#ifdef TARGET_NR_semtimedop_time64
11138    case TARGET_NR_semtimedop_time64:
11139        return do_semtimedop(arg1, arg2, arg3, arg4, true);
11140#endif
11141#ifdef TARGET_NR_semctl
11142    case TARGET_NR_semctl:
11143        return do_semctl(arg1, arg2, arg3, arg4);
11144#endif
11145#ifdef TARGET_NR_msgctl
11146    case TARGET_NR_msgctl:
11147        return do_msgctl(arg1, arg2, arg3);
11148#endif
11149#ifdef TARGET_NR_msgget
11150    case TARGET_NR_msgget:
11151        return get_errno(msgget(arg1, arg2));
11152#endif
11153#ifdef TARGET_NR_msgrcv
11154    case TARGET_NR_msgrcv:
11155        return do_msgrcv(arg1, arg2, arg3, arg4, arg5);
11156#endif
11157#ifdef TARGET_NR_msgsnd
11158    case TARGET_NR_msgsnd:
11159        return do_msgsnd(arg1, arg2, arg3, arg4);
11160#endif
11161#ifdef TARGET_NR_shmget
11162    case TARGET_NR_shmget:
11163        return get_errno(shmget(arg1, arg2, arg3));
11164#endif
11165#ifdef TARGET_NR_shmctl
11166    case TARGET_NR_shmctl:
11167        return do_shmctl(arg1, arg2, arg3);
11168#endif
11169#ifdef TARGET_NR_shmat
11170    case TARGET_NR_shmat:
11171        return target_shmat(cpu_env, arg1, arg2, arg3);
11172#endif
11173#ifdef TARGET_NR_shmdt
11174    case TARGET_NR_shmdt:
11175        return target_shmdt(arg1);
11176#endif
11177    case TARGET_NR_fsync:
11178        return get_errno(fsync(arg1));
11179    case TARGET_NR_clone:
11180        /* Linux manages to have three different orderings for its
11181         * arguments to clone(); the BACKWARDS and BACKWARDS2 defines
11182         * match the kernel's CONFIG_CLONE_* settings.
11183         * Microblaze is further special in that it uses a sixth
11184         * implicit argument to clone for the TLS pointer.
11185         */
11186#if defined(TARGET_MICROBLAZE)
11187        ret = get_errno(do_fork(cpu_env, arg1, arg2, arg4, arg6, arg5));
11188#elif defined(TARGET_CLONE_BACKWARDS)
11189        ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg4, arg5));
11190#elif defined(TARGET_CLONE_BACKWARDS2)
11191        ret = get_errno(do_fork(cpu_env, arg2, arg1, arg3, arg5, arg4));
11192#else
11193        ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg5, arg4));
11194#endif
11195        return ret;
11196#ifdef __NR_exit_group
11197        /* new thread calls */
11198    case TARGET_NR_exit_group:
11199        preexit_cleanup(cpu_env, arg1);
11200        return get_errno(exit_group(arg1));
11201#endif
11202    case TARGET_NR_setdomainname:
11203        if (!(p = lock_user_string(arg1)))
11204            return -TARGET_EFAULT;
11205        ret = get_errno(setdomainname(p, arg2));
11206        unlock_user(p, arg1, 0);
11207        return ret;
11208    case TARGET_NR_uname:
11209        /* no need to transcode because we use the linux syscall */
11210        {
11211            struct new_utsname * buf;
11212
11213            if (!lock_user_struct(VERIFY_WRITE, buf, arg1, 0))
11214                return -TARGET_EFAULT;
11215            ret = get_errno(sys_uname(buf));
11216            if (!is_error(ret)) {
11217                /* Overwrite the native machine name with whatever is being
11218                   emulated. */
11219                g_strlcpy(buf->machine, cpu_to_uname_machine(cpu_env),
11220                          sizeof(buf->machine));
11221                /* Allow the user to override the reported release.  */
11222                if (qemu_uname_release && *qemu_uname_release) {
11223                    g_strlcpy(buf->release, qemu_uname_release,
11224                              sizeof(buf->release));
11225                }
11226            }
11227            unlock_user_struct(buf, arg1, 1);
11228        }
11229        return ret;
11230#ifdef TARGET_I386
11231    case TARGET_NR_modify_ldt:
11232        return do_modify_ldt(cpu_env, arg1, arg2, arg3);
11233#if !defined(TARGET_X86_64)
11234    case TARGET_NR_vm86:
11235        return do_vm86(cpu_env, arg1, arg2);
11236#endif
11237#endif
11238#if defined(TARGET_NR_adjtimex)
11239    case TARGET_NR_adjtimex:
11240        {
11241            struct timex host_buf;
11242
11243            if (target_to_host_timex(&host_buf, arg1) != 0) {
11244                return -TARGET_EFAULT;
11245            }
11246            ret = get_errno(adjtimex(&host_buf));
11247            if (!is_error(ret)) {
11248                if (host_to_target_timex(arg1, &host_buf) != 0) {
11249                    return -TARGET_EFAULT;
11250                }
11251            }
11252        }
11253        return ret;
11254#endif
11255#if defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME)
11256    case TARGET_NR_clock_adjtime:
11257        {
11258            struct timex htx;
11259
11260            if (target_to_host_timex(&htx, arg2) != 0) {
11261                return -TARGET_EFAULT;
11262            }
11263            ret = get_errno(clock_adjtime(arg1, &htx));
11264            if (!is_error(ret) && host_to_target_timex(arg2, &htx)) {
11265                return -TARGET_EFAULT;
11266            }
11267        }
11268        return ret;
11269#endif
11270#if defined(TARGET_NR_clock_adjtime64) && defined(CONFIG_CLOCK_ADJTIME)
11271    case TARGET_NR_clock_adjtime64:
11272        {
11273            struct timex htx;
11274
11275            if (target_to_host_timex64(&htx, arg2) != 0) {
11276                return -TARGET_EFAULT;
11277            }
11278            ret = get_errno(clock_adjtime(arg1, &htx));
11279            if (!is_error(ret) && host_to_target_timex64(arg2, &htx)) {
11280                    return -TARGET_EFAULT;
11281            }
11282        }
11283        return ret;
11284#endif
11285    case TARGET_NR_getpgid:
11286        return get_errno(getpgid(arg1));
11287    case TARGET_NR_fchdir:
11288        return get_errno(fchdir(arg1));
11289    case TARGET_NR_personality:
11290        return get_errno(personality(arg1));
11291#ifdef TARGET_NR__llseek /* Not on alpha */
11292    case TARGET_NR__llseek:
11293        {
11294            int64_t res;
11295#if !defined(__NR_llseek)
11296            res = lseek(arg1, ((uint64_t)arg2 << 32) | (abi_ulong)arg3, arg5);
11297            if (res == -1) {
11298                ret = get_errno(res);
11299            } else {
11300                ret = 0;
11301            }
11302#else
11303            ret = get_errno(_llseek(arg1, arg2, arg3, &res, arg5));
11304#endif
11305            if ((ret == 0) && put_user_s64(res, arg4)) {
11306                return -TARGET_EFAULT;
11307            }
11308        }
11309        return ret;
11310#endif
11311#ifdef TARGET_NR_getdents
11312    case TARGET_NR_getdents:
11313        return do_getdents(arg1, arg2, arg3);
11314#endif /* TARGET_NR_getdents */
11315#if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
11316    case TARGET_NR_getdents64:
11317        return do_getdents64(arg1, arg2, arg3);
11318#endif /* TARGET_NR_getdents64 */
11319#if defined(TARGET_NR__newselect)
11320    case TARGET_NR__newselect:
11321        return do_select(arg1, arg2, arg3, arg4, arg5);
11322#endif
11323#ifdef TARGET_NR_poll
11324    case TARGET_NR_poll:
11325        return do_ppoll(arg1, arg2, arg3, arg4, arg5, false, false);
11326#endif
11327#ifdef TARGET_NR_ppoll
11328    case TARGET_NR_ppoll:
11329        return do_ppoll(arg1, arg2, arg3, arg4, arg5, true, false);
11330#endif
11331#ifdef TARGET_NR_ppoll_time64
11332    case TARGET_NR_ppoll_time64:
11333        return do_ppoll(arg1, arg2, arg3, arg4, arg5, true, true);
11334#endif
11335    case TARGET_NR_flock:
11336        /* NOTE: the flock constant seems to be the same for every
11337           Linux platform */
11338        return get_errno(safe_flock(arg1, arg2));
11339    case TARGET_NR_readv:
11340        {
11341            struct iovec *vec = lock_iovec(VERIFY_WRITE, arg2, arg3, 0);
11342            if (vec != NULL) {
11343                ret = get_errno(safe_readv(arg1, vec, arg3));
11344                unlock_iovec(vec, arg2, arg3, 1);
11345            } else {
11346                ret = -host_to_target_errno(errno);
11347            }
11348        }
11349        return ret;
11350    case TARGET_NR_writev:
11351        {
11352            struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1);
11353            if (vec != NULL) {
11354                ret = get_errno(safe_writev(arg1, vec, arg3));
11355                unlock_iovec(vec, arg2, arg3, 0);
11356            } else {
11357                ret = -host_to_target_errno(errno);
11358            }
11359        }
11360        return ret;
11361#if defined(TARGET_NR_preadv)
11362    case TARGET_NR_preadv:
11363        {
11364            struct iovec *vec = lock_iovec(VERIFY_WRITE, arg2, arg3, 0);
11365            if (vec != NULL) {
11366                unsigned long low, high;
11367
11368                target_to_host_low_high(arg4, arg5, &low, &high);
11369                ret = get_errno(safe_preadv(arg1, vec, arg3, low, high));
11370                unlock_iovec(vec, arg2, arg3, 1);
11371            } else {
11372                ret = -host_to_target_errno(errno);
11373           }
11374        }
11375        return ret;
11376#endif
11377#if defined(TARGET_NR_pwritev)
11378    case TARGET_NR_pwritev:
11379        {
11380            struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1);
11381            if (vec != NULL) {
11382                unsigned long low, high;
11383
11384                target_to_host_low_high(arg4, arg5, &low, &high);
11385                ret = get_errno(safe_pwritev(arg1, vec, arg3, low, high));
11386                unlock_iovec(vec, arg2, arg3, 0);
11387            } else {
11388                ret = -host_to_target_errno(errno);
11389           }
11390        }
11391        return ret;
11392#endif
11393    case TARGET_NR_getsid:
11394        return get_errno(getsid(arg1));
11395#if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
11396    case TARGET_NR_fdatasync:
11397        return get_errno(fdatasync(arg1));
11398#endif
11399    case TARGET_NR_sched_getaffinity:
11400        {
11401            unsigned int mask_size;
11402            unsigned long *mask;
11403
11404            /*
11405             * sched_getaffinity needs multiples of ulong, so need to take
11406             * care of mismatches between target ulong and host ulong sizes.
11407             */
11408            if (arg2 & (sizeof(abi_ulong) - 1)) {
11409                return -TARGET_EINVAL;
11410            }
11411            mask_size = (arg2 + (sizeof(*mask) - 1)) & ~(sizeof(*mask) - 1);
11412
11413            mask = alloca(mask_size);
11414            memset(mask, 0, mask_size);
11415            ret = get_errno(sys_sched_getaffinity(arg1, mask_size, mask));
11416
11417            if (!is_error(ret)) {
11418                if (ret > arg2) {
11419                    /* More data returned than the caller's buffer will fit.
11420                     * This only happens if sizeof(abi_long) < sizeof(long)
11421                     * and the caller passed us a buffer holding an odd number
11422                     * of abi_longs. If the host kernel is actually using the
11423                     * extra 4 bytes then fail EINVAL; otherwise we can just
11424                     * ignore them and only copy the interesting part.
11425                     */
11426                    int numcpus = sysconf(_SC_NPROCESSORS_CONF);
11427                    if (numcpus > arg2 * 8) {
11428                        return -TARGET_EINVAL;
11429                    }
11430                    ret = arg2;
11431                }
11432
11433                if (host_to_target_cpu_mask(mask, mask_size, arg3, ret)) {
11434                    return -TARGET_EFAULT;
11435                }
11436            }
11437        }
11438        return ret;
11439    case TARGET_NR_sched_setaffinity:
11440        {
11441            unsigned int mask_size;
11442            unsigned long *mask;
11443
11444            /*
11445             * sched_setaffinity needs multiples of ulong, so need to take
11446             * care of mismatches between target ulong and host ulong sizes.
11447             */
11448            if (arg2 & (sizeof(abi_ulong) - 1)) {
11449                return -TARGET_EINVAL;
11450            }
11451            mask_size = (arg2 + (sizeof(*mask) - 1)) & ~(sizeof(*mask) - 1);
11452            mask = alloca(mask_size);
11453
11454            ret = target_to_host_cpu_mask(mask, mask_size, arg3, arg2);
11455            if (ret) {
11456                return ret;
11457            }
11458
11459            return get_errno(sys_sched_setaffinity(arg1, mask_size, mask));
11460        }
11461    case TARGET_NR_getcpu:
11462        {
11463            unsigned cpuid, node;
11464            ret = get_errno(sys_getcpu(arg1 ? &cpuid : NULL,
11465                                       arg2 ? &node : NULL,
11466                                       NULL));
11467            if (is_error(ret)) {
11468                return ret;
11469            }
11470            if (arg1 && put_user_u32(cpuid, arg1)) {
11471                return -TARGET_EFAULT;
11472            }
11473            if (arg2 && put_user_u32(node, arg2)) {
11474                return -TARGET_EFAULT;
11475            }
11476        }
11477        return ret;
11478    case TARGET_NR_sched_setparam:
11479        {
11480            struct target_sched_param *target_schp;
11481            struct sched_param schp;
11482
11483            if (arg2 == 0) {
11484                return -TARGET_EINVAL;
11485            }
11486            if (!lock_user_struct(VERIFY_READ, target_schp, arg2, 1)) {
11487                return -TARGET_EFAULT;
11488            }
11489            schp.sched_priority = tswap32(target_schp->sched_priority);
11490            unlock_user_struct(target_schp, arg2, 0);
11491            return get_errno(sys_sched_setparam(arg1, &schp));
11492        }
11493    case TARGET_NR_sched_getparam:
11494        {
11495            struct target_sched_param *target_schp;
11496            struct sched_param schp;
11497
11498            if (arg2 == 0) {
11499                return -TARGET_EINVAL;
11500            }
11501            ret = get_errno(sys_sched_getparam(arg1, &schp));
11502            if (!is_error(ret)) {
11503                if (!lock_user_struct(VERIFY_WRITE, target_schp, arg2, 0)) {
11504                    return -TARGET_EFAULT;
11505                }
11506                target_schp->sched_priority = tswap32(schp.sched_priority);
11507                unlock_user_struct(target_schp, arg2, 1);
11508            }
11509        }
11510        return ret;
11511    case TARGET_NR_sched_setscheduler:
11512        {
11513            struct target_sched_param *target_schp;
11514            struct sched_param schp;
11515            if (arg3 == 0) {
11516                return -TARGET_EINVAL;
11517            }
11518            if (!lock_user_struct(VERIFY_READ, target_schp, arg3, 1)) {
11519                return -TARGET_EFAULT;
11520            }
11521            schp.sched_priority = tswap32(target_schp->sched_priority);
11522            unlock_user_struct(target_schp, arg3, 0);
11523            return get_errno(sys_sched_setscheduler(arg1, arg2, &schp));
11524        }
11525    case TARGET_NR_sched_getscheduler:
11526        return get_errno(sys_sched_getscheduler(arg1));
11527    case TARGET_NR_sched_getattr:
11528        {
11529            struct target_sched_attr *target_scha;
11530            struct sched_attr scha;
11531            if (arg2 == 0) {
11532                return -TARGET_EINVAL;
11533            }
11534            if (arg3 > sizeof(scha)) {
11535                arg3 = sizeof(scha);
11536            }
11537            ret = get_errno(sys_sched_getattr(arg1, &scha, arg3, arg4));
11538            if (!is_error(ret)) {
11539                target_scha = lock_user(VERIFY_WRITE, arg2, arg3, 0);
11540                if (!target_scha) {
11541                    return -TARGET_EFAULT;
11542                }
11543                target_scha->size = tswap32(scha.size);
11544                target_scha->sched_policy = tswap32(scha.sched_policy);
11545                target_scha->sched_flags = tswap64(scha.sched_flags);
11546                target_scha->sched_nice = tswap32(scha.sched_nice);
11547                target_scha->sched_priority = tswap32(scha.sched_priority);
11548                target_scha->sched_runtime = tswap64(scha.sched_runtime);
11549                target_scha->sched_deadline = tswap64(scha.sched_deadline);
11550                target_scha->sched_period = tswap64(scha.sched_period);
11551                if (scha.size > offsetof(struct sched_attr, sched_util_min)) {
11552                    target_scha->sched_util_min = tswap32(scha.sched_util_min);
11553                    target_scha->sched_util_max = tswap32(scha.sched_util_max);
11554                }
11555                unlock_user(target_scha, arg2, arg3);
11556            }
11557            return ret;
11558        }
11559    case TARGET_NR_sched_setattr:
11560        {
11561            struct target_sched_attr *target_scha;
11562            struct sched_attr scha;
11563            uint32_t size;
11564            int zeroed;
11565            if (arg2 == 0) {
11566                return -TARGET_EINVAL;
11567            }
11568            if (get_user_u32(size, arg2)) {
11569                return -TARGET_EFAULT;
11570            }
11571            if (!size) {
11572                size = offsetof(struct target_sched_attr, sched_util_min);
11573            }
11574            if (size < offsetof(struct target_sched_attr, sched_util_min)) {
11575                if (put_user_u32(sizeof(struct target_sched_attr), arg2)) {
11576                    return -TARGET_EFAULT;
11577                }
11578                return -TARGET_E2BIG;
11579            }
11580
11581            zeroed = check_zeroed_user(arg2, sizeof(struct target_sched_attr), size);
11582            if (zeroed < 0) {
11583                return zeroed;
11584            } else if (zeroed == 0) {
11585                if (put_user_u32(sizeof(struct target_sched_attr), arg2)) {
11586                    return -TARGET_EFAULT;
11587                }
11588                return -TARGET_E2BIG;
11589            }
11590            if (size > sizeof(struct target_sched_attr)) {
11591                size = sizeof(struct target_sched_attr);
11592            }
11593
11594            target_scha = lock_user(VERIFY_READ, arg2, size, 1);
11595            if (!target_scha) {
11596                return -TARGET_EFAULT;
11597            }
11598            scha.size = size;
11599            scha.sched_policy = tswap32(target_scha->sched_policy);
11600            scha.sched_flags = tswap64(target_scha->sched_flags);
11601            scha.sched_nice = tswap32(target_scha->sched_nice);
11602            scha.sched_priority = tswap32(target_scha->sched_priority);
11603            scha.sched_runtime = tswap64(target_scha->sched_runtime);
11604            scha.sched_deadline = tswap64(target_scha->sched_deadline);
11605            scha.sched_period = tswap64(target_scha->sched_period);
11606            if (size > offsetof(struct target_sched_attr, sched_util_min)) {
11607                scha.sched_util_min = tswap32(target_scha->sched_util_min);
11608                scha.sched_util_max = tswap32(target_scha->sched_util_max);
11609            }
11610            unlock_user(target_scha, arg2, 0);
11611            return get_errno(sys_sched_setattr(arg1, &scha, arg3));
11612        }
11613    case TARGET_NR_sched_yield:
11614        return get_errno(sched_yield());
11615    case TARGET_NR_sched_get_priority_max:
11616        return get_errno(sched_get_priority_max(arg1));
11617    case TARGET_NR_sched_get_priority_min:
11618        return get_errno(sched_get_priority_min(arg1));
11619#ifdef TARGET_NR_sched_rr_get_interval
11620    case TARGET_NR_sched_rr_get_interval:
11621        {
11622            struct timespec ts;
11623            ret = get_errno(sched_rr_get_interval(arg1, &ts));
11624            if (!is_error(ret)) {
11625                ret = host_to_target_timespec(arg2, &ts);
11626            }
11627        }
11628        return ret;
11629#endif
11630#ifdef TARGET_NR_sched_rr_get_interval_time64
11631    case TARGET_NR_sched_rr_get_interval_time64:
11632        {
11633            struct timespec ts;
11634            ret = get_errno(sched_rr_get_interval(arg1, &ts));
11635            if (!is_error(ret)) {
11636                ret = host_to_target_timespec64(arg2, &ts);
11637            }
11638        }
11639        return ret;
11640#endif
11641#if defined(TARGET_NR_nanosleep)
11642    case TARGET_NR_nanosleep:
11643        {
11644            struct timespec req, rem;
11645            if (target_to_host_timespec(&req, arg1)) {
11646                return -TARGET_EFAULT;
11647            }
11648            ret = get_errno(safe_nanosleep(&req, &rem));
11649            if (is_error(ret) && arg2) {
11650                if (host_to_target_timespec(arg2, &rem)) {
11651                    return -TARGET_EFAULT;
11652                }
11653            }
11654        }
11655        return ret;
11656#endif
11657    case TARGET_NR_prctl:
11658        return do_prctl(cpu_env, arg1, arg2, arg3, arg4, arg5);
11659        break;
11660#ifdef TARGET_NR_arch_prctl
11661    case TARGET_NR_arch_prctl:
11662        return do_arch_prctl(cpu_env, arg1, arg2);
11663#endif
11664#ifdef TARGET_NR_pread64
11665    case TARGET_NR_pread64:
11666        if (regpairs_aligned(cpu_env, num)) {
11667            arg4 = arg5;
11668            arg5 = arg6;
11669        }
11670        if (arg2 == 0 && arg3 == 0) {
11671            /* Special-case NULL buffer and zero length, which should succeed */
11672            p = 0;
11673        } else {
11674            p = lock_user(VERIFY_WRITE, arg2, arg3, 0);
11675            if (!p) {
11676                return -TARGET_EFAULT;
11677            }
11678        }
11679        ret = get_errno(pread(arg1, p, arg3, target_offset64(arg4, arg5)));
11680        unlock_user(p, arg2, ret);
11681        return ret;
11682    case TARGET_NR_pwrite64:
11683        if (regpairs_aligned(cpu_env, num)) {
11684            arg4 = arg5;
11685            arg5 = arg6;
11686        }
11687        if (arg2 == 0 && arg3 == 0) {
11688            /* Special-case NULL buffer and zero length, which should succeed */
11689            p = 0;
11690        } else {
11691            p = lock_user(VERIFY_READ, arg2, arg3, 1);
11692            if (!p) {
11693                return -TARGET_EFAULT;
11694            }
11695        }
11696        ret = get_errno(pwrite(arg1, p, arg3, target_offset64(arg4, arg5)));
11697        unlock_user(p, arg2, 0);
11698        return ret;
11699#endif
11700    case TARGET_NR_getcwd:
11701        if (!(p = lock_user(VERIFY_WRITE, arg1, arg2, 0)))
11702            return -TARGET_EFAULT;
11703        ret = get_errno(sys_getcwd1(p, arg2));
11704        unlock_user(p, arg1, ret);
11705        return ret;
11706    case TARGET_NR_capget:
11707    case TARGET_NR_capset:
11708    {
11709        struct target_user_cap_header *target_header;
11710        struct target_user_cap_data *target_data = NULL;
11711        struct __user_cap_header_struct header;
11712        struct __user_cap_data_struct data[2];
11713        struct __user_cap_data_struct *dataptr = NULL;
11714        int i, target_datalen;
11715        int data_items = 1;
11716
11717        if (!lock_user_struct(VERIFY_WRITE, target_header, arg1, 1)) {
11718            return -TARGET_EFAULT;
11719        }
11720        header.version = tswap32(target_header->version);
11721        header.pid = tswap32(target_header->pid);
11722
11723        if (header.version != _LINUX_CAPABILITY_VERSION) {
11724            /* Version 2 and up takes pointer to two user_data structs */
11725            data_items = 2;
11726        }
11727
11728        target_datalen = sizeof(*target_data) * data_items;
11729
11730        if (arg2) {
11731            if (num == TARGET_NR_capget) {
11732                target_data = lock_user(VERIFY_WRITE, arg2, target_datalen, 0);
11733            } else {
11734                target_data = lock_user(VERIFY_READ, arg2, target_datalen, 1);
11735            }
11736            if (!target_data) {
11737                unlock_user_struct(target_header, arg1, 0);
11738                return -TARGET_EFAULT;
11739            }
11740
11741            if (num == TARGET_NR_capset) {
11742                for (i = 0; i < data_items; i++) {
11743                    data[i].effective = tswap32(target_data[i].effective);
11744                    data[i].permitted = tswap32(target_data[i].permitted);
11745                    data[i].inheritable = tswap32(target_data[i].inheritable);
11746                }
11747            }
11748
11749            dataptr = data;
11750        }
11751
11752        if (num == TARGET_NR_capget) {
11753            ret = get_errno(capget(&header, dataptr));
11754        } else {
11755            ret = get_errno(capset(&header, dataptr));
11756        }
11757
11758        /* The kernel always updates version for both capget and capset */
11759        target_header->version = tswap32(header.version);
11760        unlock_user_struct(target_header, arg1, 1);
11761
11762        if (arg2) {
11763            if (num == TARGET_NR_capget) {
11764                for (i = 0; i < data_items; i++) {
11765                    target_data[i].effective = tswap32(data[i].effective);
11766                    target_data[i].permitted = tswap32(data[i].permitted);
11767                    target_data[i].inheritable = tswap32(data[i].inheritable);
11768                }
11769                unlock_user(target_data, arg2, target_datalen);
11770            } else {
11771                unlock_user(target_data, arg2, 0);
11772            }
11773        }
11774        return ret;
11775    }
11776    case TARGET_NR_sigaltstack:
11777        return do_sigaltstack(arg1, arg2, cpu_env);
11778
11779#ifdef CONFIG_SENDFILE
11780#ifdef TARGET_NR_sendfile
11781    case TARGET_NR_sendfile:
11782    {
11783        off_t *offp = NULL;
11784        off_t off;
11785        if (arg3) {
11786            ret = get_user_sal(off, arg3);
11787            if (is_error(ret)) {
11788                return ret;
11789            }
11790            offp = &off;
11791        }
11792        ret = get_errno(sendfile(arg1, arg2, offp, arg4));
11793        if (!is_error(ret) && arg3) {
11794            abi_long ret2 = put_user_sal(off, arg3);
11795            if (is_error(ret2)) {
11796                ret = ret2;
11797            }
11798        }
11799        return ret;
11800    }
11801#endif
11802#ifdef TARGET_NR_sendfile64
11803    case TARGET_NR_sendfile64:
11804    {
11805        off_t *offp = NULL;
11806        off_t off;
11807        if (arg3) {
11808            ret = get_user_s64(off, arg3);
11809            if (is_error(ret)) {
11810                return ret;
11811            }
11812            offp = &off;
11813        }
11814        ret = get_errno(sendfile(arg1, arg2, offp, arg4));
11815        if (!is_error(ret) && arg3) {
11816            abi_long ret2 = put_user_s64(off, arg3);
11817            if (is_error(ret2)) {
11818                ret = ret2;
11819            }
11820        }
11821        return ret;
11822    }
11823#endif
11824#endif
11825#ifdef TARGET_NR_vfork
11826    case TARGET_NR_vfork:
11827        return get_errno(do_fork(cpu_env,
11828                         CLONE_VFORK | CLONE_VM | TARGET_SIGCHLD,
11829                         0, 0, 0, 0));
11830#endif
11831#ifdef TARGET_NR_ugetrlimit
11832    case TARGET_NR_ugetrlimit:
11833    {
11834        struct rlimit rlim;
11835        int resource = target_to_host_resource(arg1);
11836        ret = get_errno(getrlimit(resource, &rlim));
11837        if (!is_error(ret)) {
11838            struct target_rlimit *target_rlim;
11839            if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0))
11840                return -TARGET_EFAULT;
11841            target_rlim->rlim_cur = host_to_target_rlim(rlim.rlim_cur);
11842            target_rlim->rlim_max = host_to_target_rlim(rlim.rlim_max);
11843            unlock_user_struct(target_rlim, arg2, 1);
11844        }
11845        return ret;
11846    }
11847#endif
11848#ifdef TARGET_NR_truncate64
11849    case TARGET_NR_truncate64:
11850        if (!(p = lock_user_string(arg1)))
11851            return -TARGET_EFAULT;
11852        ret = target_truncate64(cpu_env, p, arg2, arg3, arg4);
11853        unlock_user(p, arg1, 0);
11854        return ret;
11855#endif
11856#ifdef TARGET_NR_ftruncate64
11857    case TARGET_NR_ftruncate64:
11858        return target_ftruncate64(cpu_env, arg1, arg2, arg3, arg4);
11859#endif
11860#ifdef TARGET_NR_stat64
11861    case TARGET_NR_stat64:
11862        if (!(p = lock_user_string(arg1))) {
11863            return -TARGET_EFAULT;
11864        }
11865        ret = get_errno(stat(path(p), &st));
11866        unlock_user(p, arg1, 0);
11867        if (!is_error(ret))
11868            ret = host_to_target_stat64(cpu_env, arg2, &st);
11869        return ret;
11870#endif
11871#ifdef TARGET_NR_lstat64
11872    case TARGET_NR_lstat64:
11873        if (!(p = lock_user_string(arg1))) {
11874            return -TARGET_EFAULT;
11875        }
11876        ret = get_errno(lstat(path(p), &st));
11877        unlock_user(p, arg1, 0);
11878        if (!is_error(ret))
11879            ret = host_to_target_stat64(cpu_env, arg2, &st);
11880        return ret;
11881#endif
11882#ifdef TARGET_NR_fstat64
11883    case TARGET_NR_fstat64:
11884        ret = get_errno(fstat(arg1, &st));
11885        if (!is_error(ret))
11886            ret = host_to_target_stat64(cpu_env, arg2, &st);
11887        return ret;
11888#endif
11889#if (defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat))
11890#ifdef TARGET_NR_fstatat64
11891    case TARGET_NR_fstatat64:
11892#endif
11893#ifdef TARGET_NR_newfstatat
11894    case TARGET_NR_newfstatat:
11895#endif
11896        if (!(p = lock_user_string(arg2))) {
11897            return -TARGET_EFAULT;
11898        }
11899        ret = get_errno(fstatat(arg1, path(p), &st, arg4));
11900        unlock_user(p, arg2, 0);
11901        if (!is_error(ret))
11902            ret = host_to_target_stat64(cpu_env, arg3, &st);
11903        return ret;
11904#endif
11905#if defined(TARGET_NR_statx)
11906    case TARGET_NR_statx:
11907        {
11908            struct target_statx *target_stx;
11909            int dirfd = arg1;
11910            int flags = arg3;
11911
11912            p = lock_user_string(arg2);
11913            if (p == NULL) {
11914                return -TARGET_EFAULT;
11915            }
11916#if defined(__NR_statx)
11917            {
11918                /*
11919                 * It is assumed that struct statx is architecture independent.
11920                 */
11921                struct target_statx host_stx;
11922                int mask = arg4;
11923
11924                ret = get_errno(sys_statx(dirfd, p, flags, mask, &host_stx));
11925                if (!is_error(ret)) {
11926                    if (host_to_target_statx(&host_stx, arg5) != 0) {
11927                        unlock_user(p, arg2, 0);
11928                        return -TARGET_EFAULT;
11929                    }
11930                }
11931
11932                if (ret != -TARGET_ENOSYS) {
11933                    unlock_user(p, arg2, 0);
11934                    return ret;
11935                }
11936            }
11937#endif
11938            ret = get_errno(fstatat(dirfd, path(p), &st, flags));
11939            unlock_user(p, arg2, 0);
11940
11941            if (!is_error(ret)) {
11942                if (!lock_user_struct(VERIFY_WRITE, target_stx, arg5, 0)) {
11943                    return -TARGET_EFAULT;
11944                }
11945                memset(target_stx, 0, sizeof(*target_stx));
11946                __put_user(major(st.st_dev), &target_stx->stx_dev_major);
11947                __put_user(minor(st.st_dev), &target_stx->stx_dev_minor);
11948                __put_user(st.st_ino, &target_stx->stx_ino);
11949                __put_user(st.st_mode, &target_stx->stx_mode);
11950                __put_user(st.st_uid, &target_stx->stx_uid);
11951                __put_user(st.st_gid, &target_stx->stx_gid);
11952                __put_user(st.st_nlink, &target_stx->stx_nlink);
11953                __put_user(major(st.st_rdev), &target_stx->stx_rdev_major);
11954                __put_user(minor(st.st_rdev), &target_stx->stx_rdev_minor);
11955                __put_user(st.st_size, &target_stx->stx_size);
11956                __put_user(st.st_blksize, &target_stx->stx_blksize);
11957                __put_user(st.st_blocks, &target_stx->stx_blocks);
11958                __put_user(st.st_atime, &target_stx->stx_atime.tv_sec);
11959                __put_user(st.st_mtime, &target_stx->stx_mtime.tv_sec);
11960                __put_user(st.st_ctime, &target_stx->stx_ctime.tv_sec);
11961                unlock_user_struct(target_stx, arg5, 1);
11962            }
11963        }
11964        return ret;
11965#endif
11966#ifdef TARGET_NR_lchown
11967    case TARGET_NR_lchown:
11968        if (!(p = lock_user_string(arg1)))
11969            return -TARGET_EFAULT;
11970        ret = get_errno(lchown(p, low2highuid(arg2), low2highgid(arg3)));
11971        unlock_user(p, arg1, 0);
11972        return ret;
11973#endif
11974#ifdef TARGET_NR_getuid
11975    case TARGET_NR_getuid:
11976        return get_errno(high2lowuid(getuid()));
11977#endif
11978#ifdef TARGET_NR_getgid
11979    case TARGET_NR_getgid:
11980        return get_errno(high2lowgid(getgid()));
11981#endif
11982#ifdef TARGET_NR_geteuid
11983    case TARGET_NR_geteuid:
11984        return get_errno(high2lowuid(geteuid()));
11985#endif
11986#ifdef TARGET_NR_getegid
11987    case TARGET_NR_getegid:
11988        return get_errno(high2lowgid(getegid()));
11989#endif
11990    case TARGET_NR_setreuid:
11991        return get_errno(sys_setreuid(low2highuid(arg1), low2highuid(arg2)));
11992    case TARGET_NR_setregid:
11993        return get_errno(sys_setregid(low2highgid(arg1), low2highgid(arg2)));
11994    case TARGET_NR_getgroups:
11995        { /* the same code as for TARGET_NR_getgroups32 */
11996            int gidsetsize = arg1;
11997            target_id *target_grouplist;
11998            g_autofree gid_t *grouplist = NULL;
11999            int i;
12000
12001            if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
12002                return -TARGET_EINVAL;
12003            }
12004            if (gidsetsize > 0) {
12005                grouplist = g_try_new(gid_t, gidsetsize);
12006                if (!grouplist) {
12007                    return -TARGET_ENOMEM;
12008                }
12009            }
12010            ret = get_errno(getgroups(gidsetsize, grouplist));
12011            if (!is_error(ret) && gidsetsize > 0) {
12012                target_grouplist = lock_user(VERIFY_WRITE, arg2,
12013                                             gidsetsize * sizeof(target_id), 0);
12014                if (!target_grouplist) {
12015                    return -TARGET_EFAULT;
12016                }
12017                for (i = 0; i < ret; i++) {
12018                    target_grouplist[i] = tswapid(high2lowgid(grouplist[i]));
12019                }
12020                unlock_user(target_grouplist, arg2,
12021                            gidsetsize * sizeof(target_id));
12022            }
12023            return ret;
12024        }
12025    case TARGET_NR_setgroups:
12026        { /* the same code as for TARGET_NR_setgroups32 */
12027            int gidsetsize = arg1;
12028            target_id *target_grouplist;
12029            g_autofree gid_t *grouplist = NULL;
12030            int i;
12031
12032            if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
12033                return -TARGET_EINVAL;
12034            }
12035            if (gidsetsize > 0) {
12036                grouplist = g_try_new(gid_t, gidsetsize);
12037                if (!grouplist) {
12038                    return -TARGET_ENOMEM;
12039                }
12040                target_grouplist = lock_user(VERIFY_READ, arg2,
12041                                             gidsetsize * sizeof(target_id), 1);
12042                if (!target_grouplist) {
12043                    return -TARGET_EFAULT;
12044                }
12045                for (i = 0; i < gidsetsize; i++) {
12046                    grouplist[i] = low2highgid(tswapid(target_grouplist[i]));
12047                }
12048                unlock_user(target_grouplist, arg2,
12049                            gidsetsize * sizeof(target_id));
12050            }
12051            return get_errno(sys_setgroups(gidsetsize, grouplist));
12052        }
12053    case TARGET_NR_fchown:
12054        return get_errno(fchown(arg1, low2highuid(arg2), low2highgid(arg3)));
12055#if defined(TARGET_NR_fchownat)
12056    case TARGET_NR_fchownat:
12057        if (!(p = lock_user_string(arg2))) 
12058            return -TARGET_EFAULT;
12059        ret = get_errno(fchownat(arg1, p, low2highuid(arg3),
12060                                 low2highgid(arg4), arg5));
12061        unlock_user(p, arg2, 0);
12062        return ret;
12063#endif
12064#ifdef TARGET_NR_setresuid
12065    case TARGET_NR_setresuid:
12066        return get_errno(sys_setresuid(low2highuid(arg1),
12067                                       low2highuid(arg2),
12068                                       low2highuid(arg3)));
12069#endif
12070#ifdef TARGET_NR_getresuid
12071    case TARGET_NR_getresuid:
12072        {
12073            uid_t ruid, euid, suid;
12074            ret = get_errno(getresuid(&ruid, &euid, &suid));
12075            if (!is_error(ret)) {
12076                if (put_user_id(high2lowuid(ruid), arg1)
12077                    || put_user_id(high2lowuid(euid), arg2)
12078                    || put_user_id(high2lowuid(suid), arg3))
12079                    return -TARGET_EFAULT;
12080            }
12081        }
12082        return ret;
12083#endif
12084#ifdef TARGET_NR_getresgid
12085    case TARGET_NR_setresgid:
12086        return get_errno(sys_setresgid(low2highgid(arg1),
12087                                       low2highgid(arg2),
12088                                       low2highgid(arg3)));
12089#endif
12090#ifdef TARGET_NR_getresgid
12091    case TARGET_NR_getresgid:
12092        {
12093            gid_t rgid, egid, sgid;
12094            ret = get_errno(getresgid(&rgid, &egid, &sgid));
12095            if (!is_error(ret)) {
12096                if (put_user_id(high2lowgid(rgid), arg1)
12097                    || put_user_id(high2lowgid(egid), arg2)
12098                    || put_user_id(high2lowgid(sgid), arg3))
12099                    return -TARGET_EFAULT;
12100            }
12101        }
12102        return ret;
12103#endif
12104#ifdef TARGET_NR_chown
12105    case TARGET_NR_chown:
12106        if (!(p = lock_user_string(arg1)))
12107            return -TARGET_EFAULT;
12108        ret = get_errno(chown(p, low2highuid(arg2), low2highgid(arg3)));
12109        unlock_user(p, arg1, 0);
12110        return ret;
12111#endif
12112    case TARGET_NR_setuid:
12113        return get_errno(sys_setuid(low2highuid(arg1)));
12114    case TARGET_NR_setgid:
12115        return get_errno(sys_setgid(low2highgid(arg1)));
12116    case TARGET_NR_setfsuid:
12117        return get_errno(setfsuid(arg1));
12118    case TARGET_NR_setfsgid:
12119        return get_errno(setfsgid(arg1));
12120
12121#ifdef TARGET_NR_lchown32
12122    case TARGET_NR_lchown32:
12123        if (!(p = lock_user_string(arg1)))
12124            return -TARGET_EFAULT;
12125        ret = get_errno(lchown(p, arg2, arg3));
12126        unlock_user(p, arg1, 0);
12127        return ret;
12128#endif
12129#ifdef TARGET_NR_getuid32
12130    case TARGET_NR_getuid32:
12131        return get_errno(getuid());
12132#endif
12133
12134#if defined(TARGET_NR_getxuid) && defined(TARGET_ALPHA)
12135   /* Alpha specific */
12136    case TARGET_NR_getxuid:
12137         {
12138            uid_t euid;
12139            euid=geteuid();
12140            cpu_env->ir[IR_A4]=euid;
12141         }
12142        return get_errno(getuid());
12143#endif
12144#if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
12145   /* Alpha specific */
12146    case TARGET_NR_getxgid:
12147         {
12148            uid_t egid;
12149            egid=getegid();
12150            cpu_env->ir[IR_A4]=egid;
12151         }
12152        return get_errno(getgid());
12153#endif
12154#if defined(TARGET_NR_osf_getsysinfo) && defined(TARGET_ALPHA)
12155    /* Alpha specific */
12156    case TARGET_NR_osf_getsysinfo:
12157        ret = -TARGET_EOPNOTSUPP;
12158        switch (arg1) {
12159          case TARGET_GSI_IEEE_FP_CONTROL:
12160            {
12161                uint64_t fpcr = cpu_alpha_load_fpcr(cpu_env);
12162                uint64_t swcr = cpu_env->swcr;
12163
12164                swcr &= ~SWCR_STATUS_MASK;
12165                swcr |= (fpcr >> 35) & SWCR_STATUS_MASK;
12166
12167                if (put_user_u64 (swcr, arg2))
12168                        return -TARGET_EFAULT;
12169                ret = 0;
12170            }
12171            break;
12172
12173          /* case GSI_IEEE_STATE_AT_SIGNAL:
12174             -- Not implemented in linux kernel.
12175             case GSI_UACPROC:
12176             -- Retrieves current unaligned access state; not much used.
12177             case GSI_PROC_TYPE:
12178             -- Retrieves implver information; surely not used.
12179             case GSI_GET_HWRPB:
12180             -- Grabs a copy of the HWRPB; surely not used.
12181          */
12182        }
12183        return ret;
12184#endif
12185#if defined(TARGET_NR_osf_setsysinfo) && defined(TARGET_ALPHA)
12186    /* Alpha specific */
12187    case TARGET_NR_osf_setsysinfo:
12188        ret = -TARGET_EOPNOTSUPP;
12189        switch (arg1) {
12190          case TARGET_SSI_IEEE_FP_CONTROL:
12191            {
12192                uint64_t swcr, fpcr;
12193
12194                if (get_user_u64 (swcr, arg2)) {
12195                    return -TARGET_EFAULT;
12196                }
12197
12198                /*
12199                 * The kernel calls swcr_update_status to update the
12200                 * status bits from the fpcr at every point that it
12201                 * could be queried.  Therefore, we store the status
12202                 * bits only in FPCR.
12203                 */
12204                cpu_env->swcr = swcr & (SWCR_TRAP_ENABLE_MASK | SWCR_MAP_MASK);
12205
12206                fpcr = cpu_alpha_load_fpcr(cpu_env);
12207                fpcr &= ((uint64_t)FPCR_DYN_MASK << 32);
12208                fpcr |= alpha_ieee_swcr_to_fpcr(swcr);
12209                cpu_alpha_store_fpcr(cpu_env, fpcr);
12210                ret = 0;
12211            }
12212            break;
12213
12214          case TARGET_SSI_IEEE_RAISE_EXCEPTION:
12215            {
12216                uint64_t exc, fpcr, fex;
12217
12218                if (get_user_u64(exc, arg2)) {
12219                    return -TARGET_EFAULT;
12220                }
12221                exc &= SWCR_STATUS_MASK;
12222                fpcr = cpu_alpha_load_fpcr(cpu_env);
12223
12224                /* Old exceptions are not signaled.  */
12225                fex = alpha_ieee_fpcr_to_swcr(fpcr);
12226                fex = exc & ~fex;
12227                fex >>= SWCR_STATUS_TO_EXCSUM_SHIFT;
12228                fex &= (cpu_env)->swcr;
12229
12230                /* Update the hardware fpcr.  */
12231                fpcr |= alpha_ieee_swcr_to_fpcr(exc);
12232                cpu_alpha_store_fpcr(cpu_env, fpcr);
12233
12234                if (fex) {
12235                    int si_code = TARGET_FPE_FLTUNK;
12236                    target_siginfo_t info;
12237
12238                    if (fex & SWCR_TRAP_ENABLE_DNO) {
12239                        si_code = TARGET_FPE_FLTUND;
12240                    }
12241                    if (fex & SWCR_TRAP_ENABLE_INE) {
12242                        si_code = TARGET_FPE_FLTRES;
12243                    }
12244                    if (fex & SWCR_TRAP_ENABLE_UNF) {
12245                        si_code = TARGET_FPE_FLTUND;
12246                    }
12247                    if (fex & SWCR_TRAP_ENABLE_OVF) {
12248                        si_code = TARGET_FPE_FLTOVF;
12249                    }
12250                    if (fex & SWCR_TRAP_ENABLE_DZE) {
12251                        si_code = TARGET_FPE_FLTDIV;
12252                    }
12253                    if (fex & SWCR_TRAP_ENABLE_INV) {
12254                        si_code = TARGET_FPE_FLTINV;
12255                    }
12256
12257                    info.si_signo = SIGFPE;
12258                    info.si_errno = 0;
12259                    info.si_code = si_code;
12260                    info._sifields._sigfault._addr = (cpu_env)->pc;
12261                    queue_signal(cpu_env, info.si_signo,
12262                                 QEMU_SI_FAULT, &info);
12263                }
12264                ret = 0;
12265            }
12266            break;
12267
12268          /* case SSI_NVPAIRS:
12269             -- Used with SSIN_UACPROC to enable unaligned accesses.
12270             case SSI_IEEE_STATE_AT_SIGNAL:
12271             case SSI_IEEE_IGNORE_STATE_AT_SIGNAL:
12272             -- Not implemented in linux kernel
12273          */
12274        }
12275        return ret;
12276#endif
12277#ifdef TARGET_NR_osf_sigprocmask
12278    /* Alpha specific.  */
12279    case TARGET_NR_osf_sigprocmask:
12280        {
12281            abi_ulong mask;
12282            int how;
12283            sigset_t set, oldset;
12284
12285            switch(arg1) {
12286            case TARGET_SIG_BLOCK:
12287                how = SIG_BLOCK;
12288                break;
12289            case TARGET_SIG_UNBLOCK:
12290                how = SIG_UNBLOCK;
12291                break;
12292            case TARGET_SIG_SETMASK:
12293                how = SIG_SETMASK;
12294                break;
12295            default:
12296                return -TARGET_EINVAL;
12297            }
12298            mask = arg2;
12299            target_to_host_old_sigset(&set, &mask);
12300            ret = do_sigprocmask(how, &set, &oldset);
12301            if (!ret) {
12302                host_to_target_old_sigset(&mask, &oldset);
12303                ret = mask;
12304            }
12305        }
12306        return ret;
12307#endif
12308
12309#ifdef TARGET_NR_getgid32
12310    case TARGET_NR_getgid32:
12311        return get_errno(getgid());
12312#endif
12313#ifdef TARGET_NR_geteuid32
12314    case TARGET_NR_geteuid32:
12315        return get_errno(geteuid());
12316#endif
12317#ifdef TARGET_NR_getegid32
12318    case TARGET_NR_getegid32:
12319        return get_errno(getegid());
12320#endif
12321#ifdef TARGET_NR_setreuid32
12322    case TARGET_NR_setreuid32:
12323        return get_errno(sys_setreuid(arg1, arg2));
12324#endif
12325#ifdef TARGET_NR_setregid32
12326    case TARGET_NR_setregid32:
12327        return get_errno(sys_setregid(arg1, arg2));
12328#endif
12329#ifdef TARGET_NR_getgroups32
12330    case TARGET_NR_getgroups32:
12331        { /* the same code as for TARGET_NR_getgroups */
12332            int gidsetsize = arg1;
12333            uint32_t *target_grouplist;
12334            g_autofree gid_t *grouplist = NULL;
12335            int i;
12336
12337            if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
12338                return -TARGET_EINVAL;
12339            }
12340            if (gidsetsize > 0) {
12341                grouplist = g_try_new(gid_t, gidsetsize);
12342                if (!grouplist) {
12343                    return -TARGET_ENOMEM;
12344                }
12345            }
12346            ret = get_errno(getgroups(gidsetsize, grouplist));
12347            if (!is_error(ret) && gidsetsize > 0) {
12348                target_grouplist = lock_user(VERIFY_WRITE, arg2,
12349                                             gidsetsize * 4, 0);
12350                if (!target_grouplist) {
12351                    return -TARGET_EFAULT;
12352                }
12353                for (i = 0; i < ret; i++) {
12354                    target_grouplist[i] = tswap32(grouplist[i]);
12355                }
12356                unlock_user(target_grouplist, arg2, gidsetsize * 4);
12357            }
12358            return ret;
12359        }
12360#endif
12361#ifdef TARGET_NR_setgroups32
12362    case TARGET_NR_setgroups32:
12363        { /* the same code as for TARGET_NR_setgroups */
12364            int gidsetsize = arg1;
12365            uint32_t *target_grouplist;
12366            g_autofree gid_t *grouplist = NULL;
12367            int i;
12368
12369            if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
12370                return -TARGET_EINVAL;
12371            }
12372            if (gidsetsize > 0) {
12373                grouplist = g_try_new(gid_t, gidsetsize);
12374                if (!grouplist) {
12375                    return -TARGET_ENOMEM;
12376                }
12377                target_grouplist = lock_user(VERIFY_READ, arg2,
12378                                             gidsetsize * 4, 1);
12379                if (!target_grouplist) {
12380                    return -TARGET_EFAULT;
12381                }
12382                for (i = 0; i < gidsetsize; i++) {
12383                    grouplist[i] = tswap32(target_grouplist[i]);
12384                }
12385                unlock_user(target_grouplist, arg2, 0);
12386            }
12387            return get_errno(sys_setgroups(gidsetsize, grouplist));
12388        }
12389#endif
12390#ifdef TARGET_NR_fchown32
12391    case TARGET_NR_fchown32:
12392        return get_errno(fchown(arg1, arg2, arg3));
12393#endif
12394#ifdef TARGET_NR_setresuid32
12395    case TARGET_NR_setresuid32:
12396        return get_errno(sys_setresuid(arg1, arg2, arg3));
12397#endif
12398#ifdef TARGET_NR_getresuid32
12399    case TARGET_NR_getresuid32:
12400        {
12401            uid_t ruid, euid, suid;
12402            ret = get_errno(getresuid(&ruid, &euid, &suid));
12403            if (!is_error(ret)) {
12404                if (put_user_u32(ruid, arg1)
12405                    || put_user_u32(euid, arg2)
12406                    || put_user_u32(suid, arg3))
12407                    return -TARGET_EFAULT;
12408            }
12409        }
12410        return ret;
12411#endif
12412#ifdef TARGET_NR_setresgid32
12413    case TARGET_NR_setresgid32:
12414        return get_errno(sys_setresgid(arg1, arg2, arg3));
12415#endif
12416#ifdef TARGET_NR_getresgid32
12417    case TARGET_NR_getresgid32:
12418        {
12419            gid_t rgid, egid, sgid;
12420            ret = get_errno(getresgid(&rgid, &egid, &sgid));
12421            if (!is_error(ret)) {
12422                if (put_user_u32(rgid, arg1)
12423                    || put_user_u32(egid, arg2)
12424                    || put_user_u32(sgid, arg3))
12425                    return -TARGET_EFAULT;
12426            }
12427        }
12428        return ret;
12429#endif
12430#ifdef TARGET_NR_chown32
12431    case TARGET_NR_chown32:
12432        if (!(p = lock_user_string(arg1)))
12433            return -TARGET_EFAULT;
12434        ret = get_errno(chown(p, arg2, arg3));
12435        unlock_user(p, arg1, 0);
12436        return ret;
12437#endif
12438#ifdef TARGET_NR_setuid32
12439    case TARGET_NR_setuid32:
12440        return get_errno(sys_setuid(arg1));
12441#endif
12442#ifdef TARGET_NR_setgid32
12443    case TARGET_NR_setgid32:
12444        return get_errno(sys_setgid(arg1));
12445#endif
12446#ifdef TARGET_NR_setfsuid32
12447    case TARGET_NR_setfsuid32:
12448        return get_errno(setfsuid(arg1));
12449#endif
12450#ifdef TARGET_NR_setfsgid32
12451    case TARGET_NR_setfsgid32:
12452        return get_errno(setfsgid(arg1));
12453#endif
12454#ifdef TARGET_NR_mincore
12455    case TARGET_NR_mincore:
12456        {
12457            void *a = lock_user(VERIFY_NONE, arg1, arg2, 0);
12458            if (!a) {
12459                return -TARGET_ENOMEM;
12460            }
12461            p = lock_user_string(arg3);
12462            if (!p) {
12463                ret = -TARGET_EFAULT;
12464            } else {
12465                ret = get_errno(mincore(a, arg2, p));
12466                unlock_user(p, arg3, ret);
12467            }
12468            unlock_user(a, arg1, 0);
12469        }
12470        return ret;
12471#endif
12472#ifdef TARGET_NR_arm_fadvise64_64
12473    case TARGET_NR_arm_fadvise64_64:
12474        /* arm_fadvise64_64 looks like fadvise64_64 but
12475         * with different argument order: fd, advice, offset, len
12476         * rather than the usual fd, offset, len, advice.
12477         * Note that offset and len are both 64-bit so appear as
12478         * pairs of 32-bit registers.
12479         */
12480        ret = posix_fadvise(arg1, target_offset64(arg3, arg4),
12481                            target_offset64(arg5, arg6), arg2);
12482        return -host_to_target_errno(ret);
12483#endif
12484
12485#if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
12486
12487#ifdef TARGET_NR_fadvise64_64
12488    case TARGET_NR_fadvise64_64:
12489#if defined(TARGET_PPC) || defined(TARGET_XTENSA)
12490        /* 6 args: fd, advice, offset (high, low), len (high, low) */
12491        ret = arg2;
12492        arg2 = arg3;
12493        arg3 = arg4;
12494        arg4 = arg5;
12495        arg5 = arg6;
12496        arg6 = ret;
12497#else
12498        /* 6 args: fd, offset (high, low), len (high, low), advice */
12499        if (regpairs_aligned(cpu_env, num)) {
12500            /* offset is in (3,4), len in (5,6) and advice in 7 */
12501            arg2 = arg3;
12502            arg3 = arg4;
12503            arg4 = arg5;
12504            arg5 = arg6;
12505            arg6 = arg7;
12506        }
12507#endif
12508        ret = posix_fadvise(arg1, target_offset64(arg2, arg3),
12509                            target_offset64(arg4, arg5), arg6);
12510        return -host_to_target_errno(ret);
12511#endif
12512
12513#ifdef TARGET_NR_fadvise64
12514    case TARGET_NR_fadvise64:
12515        /* 5 args: fd, offset (high, low), len, advice */
12516        if (regpairs_aligned(cpu_env, num)) {
12517            /* offset is in (3,4), len in 5 and advice in 6 */
12518            arg2 = arg3;
12519            arg3 = arg4;
12520            arg4 = arg5;
12521            arg5 = arg6;
12522        }
12523        ret = posix_fadvise(arg1, target_offset64(arg2, arg3), arg4, arg5);
12524        return -host_to_target_errno(ret);
12525#endif
12526
12527#else /* not a 32-bit ABI */
12528#if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_fadvise64)
12529#ifdef TARGET_NR_fadvise64_64
12530    case TARGET_NR_fadvise64_64:
12531#endif
12532#ifdef TARGET_NR_fadvise64
12533    case TARGET_NR_fadvise64:
12534#endif
12535#ifdef TARGET_S390X
12536        switch (arg4) {
12537        case 4: arg4 = POSIX_FADV_NOREUSE + 1; break; /* make sure it's an invalid value */
12538        case 5: arg4 = POSIX_FADV_NOREUSE + 2; break; /* ditto */
12539        case 6: arg4 = POSIX_FADV_DONTNEED; break;
12540        case 7: arg4 = POSIX_FADV_NOREUSE; break;
12541        default: break;
12542        }
12543#endif
12544        return -host_to_target_errno(posix_fadvise(arg1, arg2, arg3, arg4));
12545#endif
12546#endif /* end of 64-bit ABI fadvise handling */
12547
12548#ifdef TARGET_NR_madvise
12549    case TARGET_NR_madvise:
12550        return target_madvise(arg1, arg2, arg3);
12551#endif
12552#ifdef TARGET_NR_fcntl64
12553    case TARGET_NR_fcntl64:
12554    {
12555        int cmd;
12556        struct flock fl;
12557        from_flock64_fn *copyfrom = copy_from_user_flock64;
12558        to_flock64_fn *copyto = copy_to_user_flock64;
12559
12560#ifdef TARGET_ARM
12561        if (!cpu_env->eabi) {
12562            copyfrom = copy_from_user_oabi_flock64;
12563            copyto = copy_to_user_oabi_flock64;
12564        }
12565#endif
12566
12567        cmd = target_to_host_fcntl_cmd(arg2);
12568        if (cmd == -TARGET_EINVAL) {
12569            return cmd;
12570        }
12571
12572        switch(arg2) {
12573        case TARGET_F_GETLK64:
12574            ret = copyfrom(&fl, arg3);
12575            if (ret) {
12576                break;
12577            }
12578            ret = get_errno(safe_fcntl(arg1, cmd, &fl));
12579            if (ret == 0) {
12580                ret = copyto(arg3, &fl);
12581            }
12582            break;
12583
12584        case TARGET_F_SETLK64:
12585        case TARGET_F_SETLKW64:
12586            ret = copyfrom(&fl, arg3);
12587            if (ret) {
12588                break;
12589            }
12590            ret = get_errno(safe_fcntl(arg1, cmd, &fl));
12591            break;
12592        default:
12593            ret = do_fcntl(arg1, arg2, arg3);
12594            break;
12595        }
12596        return ret;
12597    }
12598#endif
12599#ifdef TARGET_NR_cacheflush
12600    case TARGET_NR_cacheflush:
12601        /* self-modifying code is handled automatically, so nothing needed */
12602        return 0;
12603#endif
12604#ifdef TARGET_NR_getpagesize
12605    case TARGET_NR_getpagesize:
12606        return TARGET_PAGE_SIZE;
12607#endif
12608    case TARGET_NR_gettid:
12609        return get_errno(sys_gettid());
12610#ifdef TARGET_NR_readahead
12611    case TARGET_NR_readahead:
12612#if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
12613        if (regpairs_aligned(cpu_env, num)) {
12614            arg2 = arg3;
12615            arg3 = arg4;
12616            arg4 = arg5;
12617        }
12618        ret = get_errno(readahead(arg1, target_offset64(arg2, arg3) , arg4));
12619#else
12620        ret = get_errno(readahead(arg1, arg2, arg3));
12621#endif
12622        return ret;
12623#endif
12624#ifdef CONFIG_ATTR
12625#ifdef TARGET_NR_setxattr
12626    case TARGET_NR_listxattr:
12627    case TARGET_NR_llistxattr:
12628    {
12629        void *b = 0;
12630        if (arg2) {
12631            b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
12632            if (!b) {
12633                return -TARGET_EFAULT;
12634            }
12635        }
12636        p = lock_user_string(arg1);
12637        if (p) {
12638            if (num == TARGET_NR_listxattr) {
12639                ret = get_errno(listxattr(p, b, arg3));
12640            } else {
12641                ret = get_errno(llistxattr(p, b, arg3));
12642            }
12643        } else {
12644            ret = -TARGET_EFAULT;
12645        }
12646        unlock_user(p, arg1, 0);
12647        unlock_user(b, arg2, arg3);
12648        return ret;
12649    }
12650    case TARGET_NR_flistxattr:
12651    {
12652        void *b = 0;
12653        if (arg2) {
12654            b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
12655            if (!b) {
12656                return -TARGET_EFAULT;
12657            }
12658        }
12659        ret = get_errno(flistxattr(arg1, b, arg3));
12660        unlock_user(b, arg2, arg3);
12661        return ret;
12662    }
12663    case TARGET_NR_setxattr:
12664    case TARGET_NR_lsetxattr:
12665        {
12666            void *n, *v = 0;
12667            if (arg3) {
12668                v = lock_user(VERIFY_READ, arg3, arg4, 1);
12669                if (!v) {
12670                    return -TARGET_EFAULT;
12671                }
12672            }
12673            p = lock_user_string(arg1);
12674            n = lock_user_string(arg2);
12675            if (p && n) {
12676                if (num == TARGET_NR_setxattr) {
12677                    ret = get_errno(setxattr(p, n, v, arg4, arg5));
12678                } else {
12679                    ret = get_errno(lsetxattr(p, n, v, arg4, arg5));
12680                }
12681            } else {
12682                ret = -TARGET_EFAULT;
12683            }
12684            unlock_user(p, arg1, 0);
12685            unlock_user(n, arg2, 0);
12686            unlock_user(v, arg3, 0);
12687        }
12688        return ret;
12689    case TARGET_NR_fsetxattr:
12690        {
12691            void *n, *v = 0;
12692            if (arg3) {
12693                v = lock_user(VERIFY_READ, arg3, arg4, 1);
12694                if (!v) {
12695                    return -TARGET_EFAULT;
12696                }
12697            }
12698            n = lock_user_string(arg2);
12699            if (n) {
12700                ret = get_errno(fsetxattr(arg1, n, v, arg4, arg5));
12701            } else {
12702                ret = -TARGET_EFAULT;
12703            }
12704            unlock_user(n, arg2, 0);
12705            unlock_user(v, arg3, 0);
12706        }
12707        return ret;
12708    case TARGET_NR_getxattr:
12709    case TARGET_NR_lgetxattr:
12710        {
12711            void *n, *v = 0;
12712            if (arg3) {
12713                v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
12714                if (!v) {
12715                    return -TARGET_EFAULT;
12716                }
12717            }
12718            p = lock_user_string(arg1);
12719            n = lock_user_string(arg2);
12720            if (p && n) {
12721                if (num == TARGET_NR_getxattr) {
12722                    ret = get_errno(getxattr(p, n, v, arg4));
12723                } else {
12724                    ret = get_errno(lgetxattr(p, n, v, arg4));
12725                }
12726            } else {
12727                ret = -TARGET_EFAULT;
12728            }
12729            unlock_user(p, arg1, 0);
12730            unlock_user(n, arg2, 0);
12731            unlock_user(v, arg3, arg4);
12732        }
12733        return ret;
12734    case TARGET_NR_fgetxattr:
12735        {
12736            void *n, *v = 0;
12737            if (arg3) {
12738                v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
12739                if (!v) {
12740                    return -TARGET_EFAULT;
12741                }
12742            }
12743            n = lock_user_string(arg2);
12744            if (n) {
12745                ret = get_errno(fgetxattr(arg1, n, v, arg4));
12746            } else {
12747                ret = -TARGET_EFAULT;
12748            }
12749            unlock_user(n, arg2, 0);
12750            unlock_user(v, arg3, arg4);
12751        }
12752        return ret;
12753    case TARGET_NR_removexattr:
12754    case TARGET_NR_lremovexattr:
12755        {
12756            void *n;
12757            p = lock_user_string(arg1);
12758            n = lock_user_string(arg2);
12759            if (p && n) {
12760                if (num == TARGET_NR_removexattr) {
12761                    ret = get_errno(removexattr(p, n));
12762                } else {
12763                    ret = get_errno(lremovexattr(p, n));
12764                }
12765            } else {
12766                ret = -TARGET_EFAULT;
12767            }
12768            unlock_user(p, arg1, 0);
12769            unlock_user(n, arg2, 0);
12770        }
12771        return ret;
12772    case TARGET_NR_fremovexattr:
12773        {
12774            void *n;
12775            n = lock_user_string(arg2);
12776            if (n) {
12777                ret = get_errno(fremovexattr(arg1, n));
12778            } else {
12779                ret = -TARGET_EFAULT;
12780            }
12781            unlock_user(n, arg2, 0);
12782        }
12783        return ret;
12784#endif
12785#endif /* CONFIG_ATTR */
12786#ifdef TARGET_NR_set_thread_area
12787    case TARGET_NR_set_thread_area:
12788#if defined(TARGET_MIPS)
12789      cpu_env->active_tc.CP0_UserLocal = arg1;
12790      return 0;
12791#elif defined(TARGET_I386) && defined(TARGET_ABI32)
12792      return do_set_thread_area(cpu_env, arg1);
12793#elif defined(TARGET_M68K)
12794      {
12795          TaskState *ts = get_task_state(cpu);
12796          ts->tp_value = arg1;
12797          return 0;
12798      }
12799#else
12800      return -TARGET_ENOSYS;
12801#endif
12802#endif
12803#ifdef TARGET_NR_get_thread_area
12804    case TARGET_NR_get_thread_area:
12805#if defined(TARGET_I386) && defined(TARGET_ABI32)
12806        return do_get_thread_area(cpu_env, arg1);
12807#elif defined(TARGET_M68K)
12808        {
12809            TaskState *ts = get_task_state(cpu);
12810            return ts->tp_value;
12811        }
12812#else
12813        return -TARGET_ENOSYS;
12814#endif
12815#endif
12816#ifdef TARGET_NR_getdomainname
12817    case TARGET_NR_getdomainname:
12818        return -TARGET_ENOSYS;
12819#endif
12820
12821#ifdef TARGET_NR_clock_settime
12822    case TARGET_NR_clock_settime:
12823    {
12824        struct timespec ts;
12825
12826        ret = target_to_host_timespec(&ts, arg2);
12827        if (!is_error(ret)) {
12828            ret = get_errno(clock_settime(arg1, &ts));
12829        }
12830        return ret;
12831    }
12832#endif
12833#ifdef TARGET_NR_clock_settime64
12834    case TARGET_NR_clock_settime64:
12835    {
12836        struct timespec ts;
12837
12838        ret = target_to_host_timespec64(&ts, arg2);
12839        if (!is_error(ret)) {
12840            ret = get_errno(clock_settime(arg1, &ts));
12841        }
12842        return ret;
12843    }
12844#endif
12845#ifdef TARGET_NR_clock_gettime
12846    case TARGET_NR_clock_gettime:
12847    {
12848        struct timespec ts;
12849        ret = get_errno(clock_gettime(arg1, &ts));
12850        if (!is_error(ret)) {
12851            ret = host_to_target_timespec(arg2, &ts);
12852        }
12853        return ret;
12854    }
12855#endif
12856#ifdef TARGET_NR_clock_gettime64
12857    case TARGET_NR_clock_gettime64:
12858    {
12859        struct timespec ts;
12860        ret = get_errno(clock_gettime(arg1, &ts));
12861        if (!is_error(ret)) {
12862            ret = host_to_target_timespec64(arg2, &ts);
12863        }
12864        return ret;
12865    }
12866#endif
12867#ifdef TARGET_NR_clock_getres
12868    case TARGET_NR_clock_getres:
12869    {
12870        struct timespec ts;
12871        ret = get_errno(clock_getres(arg1, &ts));
12872        if (!is_error(ret)) {
12873            host_to_target_timespec(arg2, &ts);
12874        }
12875        return ret;
12876    }
12877#endif
12878#ifdef TARGET_NR_clock_getres_time64
12879    case TARGET_NR_clock_getres_time64:
12880    {
12881        struct timespec ts;
12882        ret = get_errno(clock_getres(arg1, &ts));
12883        if (!is_error(ret)) {
12884            host_to_target_timespec64(arg2, &ts);
12885        }
12886        return ret;
12887    }
12888#endif
12889#ifdef TARGET_NR_clock_nanosleep
12890    case TARGET_NR_clock_nanosleep:
12891    {
12892        struct timespec ts;
12893        if (target_to_host_timespec(&ts, arg3)) {
12894            return -TARGET_EFAULT;
12895        }
12896        ret = get_errno(safe_clock_nanosleep(arg1, arg2,
12897                                             &ts, arg4 ? &ts : NULL));
12898        /*
12899         * if the call is interrupted by a signal handler, it fails
12900         * with error -TARGET_EINTR and if arg4 is not NULL and arg2 is not
12901         * TIMER_ABSTIME, it returns the remaining unslept time in arg4.
12902         */
12903        if (ret == -TARGET_EINTR && arg4 && arg2 != TIMER_ABSTIME &&
12904            host_to_target_timespec(arg4, &ts)) {
12905              return -TARGET_EFAULT;
12906        }
12907
12908        return ret;
12909    }
12910#endif
12911#ifdef TARGET_NR_clock_nanosleep_time64
12912    case TARGET_NR_clock_nanosleep_time64:
12913    {
12914        struct timespec ts;
12915
12916        if (target_to_host_timespec64(&ts, arg3)) {
12917            return -TARGET_EFAULT;
12918        }
12919
12920        ret = get_errno(safe_clock_nanosleep(arg1, arg2,
12921                                             &ts, arg4 ? &ts : NULL));
12922
12923        if (ret == -TARGET_EINTR && arg4 && arg2 != TIMER_ABSTIME &&
12924            host_to_target_timespec64(arg4, &ts)) {
12925            return -TARGET_EFAULT;
12926        }
12927        return ret;
12928    }
12929#endif
12930
12931#if defined(TARGET_NR_set_tid_address)
12932    case TARGET_NR_set_tid_address:
12933    {
12934        TaskState *ts = get_task_state(cpu);
12935        ts->child_tidptr = arg1;
12936        /* do not call host set_tid_address() syscall, instead return tid() */
12937        return get_errno(sys_gettid());
12938    }
12939#endif
12940
12941    case TARGET_NR_tkill:
12942        return get_errno(safe_tkill((int)arg1, target_to_host_signal(arg2)));
12943
12944    case TARGET_NR_tgkill:
12945        return get_errno(safe_tgkill((int)arg1, (int)arg2,
12946                         target_to_host_signal(arg3)));
12947
12948#ifdef TARGET_NR_set_robust_list
12949    case TARGET_NR_set_robust_list:
12950    case TARGET_NR_get_robust_list:
12951        /* The ABI for supporting robust futexes has userspace pass
12952         * the kernel a pointer to a linked list which is updated by
12953         * userspace after the syscall; the list is walked by the kernel
12954         * when the thread exits. Since the linked list in QEMU guest
12955         * memory isn't a valid linked list for the host and we have
12956         * no way to reliably intercept the thread-death event, we can't
12957         * support these. Silently return ENOSYS so that guest userspace
12958         * falls back to a non-robust futex implementation (which should
12959         * be OK except in the corner case of the guest crashing while
12960         * holding a mutex that is shared with another process via
12961         * shared memory).
12962         */
12963        return -TARGET_ENOSYS;
12964#endif
12965
12966#if defined(TARGET_NR_utimensat)
12967    case TARGET_NR_utimensat:
12968        {
12969            struct timespec *tsp, ts[2];
12970            if (!arg3) {
12971                tsp = NULL;
12972            } else {
12973                if (target_to_host_timespec(ts, arg3)) {
12974                    return -TARGET_EFAULT;
12975                }
12976                if (target_to_host_timespec(ts + 1, arg3 +
12977                                            sizeof(struct target_timespec))) {
12978                    return -TARGET_EFAULT;
12979                }
12980                tsp = ts;
12981            }
12982            if (!arg2)
12983                ret = get_errno(sys_utimensat(arg1, NULL, tsp, arg4));
12984            else {
12985                if (!(p = lock_user_string(arg2))) {
12986                    return -TARGET_EFAULT;
12987                }
12988                ret = get_errno(sys_utimensat(arg1, path(p), tsp, arg4));
12989                unlock_user(p, arg2, 0);
12990            }
12991        }
12992        return ret;
12993#endif
12994#ifdef TARGET_NR_utimensat_time64
12995    case TARGET_NR_utimensat_time64:
12996        {
12997            struct timespec *tsp, ts[2];
12998            if (!arg3) {
12999                tsp = NULL;
13000            } else {
13001                if (target_to_host_timespec64(ts, arg3)) {
13002                    return -TARGET_EFAULT;
13003                }
13004                if (target_to_host_timespec64(ts + 1, arg3 +
13005                                     sizeof(struct target__kernel_timespec))) {
13006                    return -TARGET_EFAULT;
13007                }
13008                tsp = ts;
13009            }
13010            if (!arg2)
13011                ret = get_errno(sys_utimensat(arg1, NULL, tsp, arg4));
13012            else {
13013                p = lock_user_string(arg2);
13014                if (!p) {
13015                    return -TARGET_EFAULT;
13016                }
13017                ret = get_errno(sys_utimensat(arg1, path(p), tsp, arg4));
13018                unlock_user(p, arg2, 0);
13019            }
13020        }
13021        return ret;
13022#endif
13023#ifdef TARGET_NR_futex
13024    case TARGET_NR_futex:
13025        return do_futex(cpu, false, arg1, arg2, arg3, arg4, arg5, arg6);
13026#endif
13027#ifdef TARGET_NR_futex_time64
13028    case TARGET_NR_futex_time64:
13029        return do_futex(cpu, true, arg1, arg2, arg3, arg4, arg5, arg6);
13030#endif
13031#ifdef CONFIG_INOTIFY
13032#if defined(TARGET_NR_inotify_init)
13033    case TARGET_NR_inotify_init:
13034        ret = get_errno(inotify_init());
13035        if (ret >= 0) {
13036            fd_trans_register(ret, &target_inotify_trans);
13037        }
13038        return ret;
13039#endif
13040#if defined(TARGET_NR_inotify_init1) && defined(CONFIG_INOTIFY1)
13041    case TARGET_NR_inotify_init1:
13042        ret = get_errno(inotify_init1(target_to_host_bitmask(arg1,
13043                                          fcntl_flags_tbl)));
13044        if (ret >= 0) {
13045            fd_trans_register(ret, &target_inotify_trans);
13046        }
13047        return ret;
13048#endif
13049#if defined(TARGET_NR_inotify_add_watch)
13050    case TARGET_NR_inotify_add_watch:
13051        p = lock_user_string(arg2);
13052        ret = get_errno(inotify_add_watch(arg1, path(p), arg3));
13053        unlock_user(p, arg2, 0);
13054        return ret;
13055#endif
13056#if defined(TARGET_NR_inotify_rm_watch)
13057    case TARGET_NR_inotify_rm_watch:
13058        return get_errno(inotify_rm_watch(arg1, arg2));
13059#endif
13060#endif
13061
13062#if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
13063    case TARGET_NR_mq_open:
13064        {
13065            struct mq_attr posix_mq_attr;
13066            struct mq_attr *pposix_mq_attr;
13067            int host_flags;
13068
13069            host_flags = target_to_host_bitmask(arg2, fcntl_flags_tbl);
13070            pposix_mq_attr = NULL;
13071            if (arg4) {
13072                if (copy_from_user_mq_attr(&posix_mq_attr, arg4) != 0) {
13073                    return -TARGET_EFAULT;
13074                }
13075                pposix_mq_attr = &posix_mq_attr;
13076            }
13077            p = lock_user_string(arg1 - 1);
13078            if (!p) {
13079                return -TARGET_EFAULT;
13080            }
13081            ret = get_errno(mq_open(p, host_flags, arg3, pposix_mq_attr));
13082            unlock_user (p, arg1, 0);
13083        }
13084        return ret;
13085
13086    case TARGET_NR_mq_unlink:
13087        p = lock_user_string(arg1 - 1);
13088        if (!p) {
13089            return -TARGET_EFAULT;
13090        }
13091        ret = get_errno(mq_unlink(p));
13092        unlock_user (p, arg1, 0);
13093        return ret;
13094
13095#ifdef TARGET_NR_mq_timedsend
13096    case TARGET_NR_mq_timedsend:
13097        {
13098            struct timespec ts;
13099
13100            p = lock_user (VERIFY_READ, arg2, arg3, 1);
13101            if (arg5 != 0) {
13102                if (target_to_host_timespec(&ts, arg5)) {
13103                    return -TARGET_EFAULT;
13104                }
13105                ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, &ts));
13106                if (!is_error(ret) && host_to_target_timespec(arg5, &ts)) {
13107                    return -TARGET_EFAULT;
13108                }
13109            } else {
13110                ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, NULL));
13111            }
13112            unlock_user (p, arg2, arg3);
13113        }
13114        return ret;
13115#endif
13116#ifdef TARGET_NR_mq_timedsend_time64
13117    case TARGET_NR_mq_timedsend_time64:
13118        {
13119            struct timespec ts;
13120
13121            p = lock_user(VERIFY_READ, arg2, arg3, 1);
13122            if (arg5 != 0) {
13123                if (target_to_host_timespec64(&ts, arg5)) {
13124                    return -TARGET_EFAULT;
13125                }
13126                ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, &ts));
13127                if (!is_error(ret) && host_to_target_timespec64(arg5, &ts)) {
13128                    return -TARGET_EFAULT;
13129                }
13130            } else {
13131                ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, NULL));
13132            }
13133            unlock_user(p, arg2, arg3);
13134        }
13135        return ret;
13136#endif
13137
13138#ifdef TARGET_NR_mq_timedreceive
13139    case TARGET_NR_mq_timedreceive:
13140        {
13141            struct timespec ts;
13142            unsigned int prio;
13143
13144            p = lock_user (VERIFY_READ, arg2, arg3, 1);
13145            if (arg5 != 0) {
13146                if (target_to_host_timespec(&ts, arg5)) {
13147                    return -TARGET_EFAULT;
13148                }
13149                ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
13150                                                     &prio, &ts));
13151                if (!is_error(ret) && host_to_target_timespec(arg5, &ts)) {
13152                    return -TARGET_EFAULT;
13153                }
13154            } else {
13155                ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
13156                                                     &prio, NULL));
13157            }
13158            unlock_user (p, arg2, arg3);
13159            if (arg4 != 0)
13160                put_user_u32(prio, arg4);
13161        }
13162        return ret;
13163#endif
13164#ifdef TARGET_NR_mq_timedreceive_time64
13165    case TARGET_NR_mq_timedreceive_time64:
13166        {
13167            struct timespec ts;
13168            unsigned int prio;
13169
13170            p = lock_user(VERIFY_READ, arg2, arg3, 1);
13171            if (arg5 != 0) {
13172                if (target_to_host_timespec64(&ts, arg5)) {
13173                    return -TARGET_EFAULT;
13174                }
13175                ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
13176                                                     &prio, &ts));
13177                if (!is_error(ret) && host_to_target_timespec64(arg5, &ts)) {
13178                    return -TARGET_EFAULT;
13179                }
13180            } else {
13181                ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
13182                                                     &prio, NULL));
13183            }
13184            unlock_user(p, arg2, arg3);
13185            if (arg4 != 0) {
13186                put_user_u32(prio, arg4);
13187            }
13188        }
13189        return ret;
13190#endif
13191
13192    /* Not implemented for now... */
13193/*     case TARGET_NR_mq_notify: */
13194/*         break; */
13195
13196    case TARGET_NR_mq_getsetattr:
13197        {
13198            struct mq_attr posix_mq_attr_in, posix_mq_attr_out;
13199            ret = 0;
13200            if (arg2 != 0) {
13201                copy_from_user_mq_attr(&posix_mq_attr_in, arg2);
13202                ret = get_errno(mq_setattr(arg1, &posix_mq_attr_in,
13203                                           &posix_mq_attr_out));
13204            } else if (arg3 != 0) {
13205                ret = get_errno(mq_getattr(arg1, &posix_mq_attr_out));
13206            }
13207            if (ret == 0 && arg3 != 0) {
13208                copy_to_user_mq_attr(arg3, &posix_mq_attr_out);
13209            }
13210        }
13211        return ret;
13212#endif
13213
13214#ifdef CONFIG_SPLICE
13215#ifdef TARGET_NR_tee
13216    case TARGET_NR_tee:
13217        {
13218            ret = get_errno(tee(arg1,arg2,arg3,arg4));
13219        }
13220        return ret;
13221#endif
13222#ifdef TARGET_NR_splice
13223    case TARGET_NR_splice:
13224        {
13225            loff_t loff_in, loff_out;
13226            loff_t *ploff_in = NULL, *ploff_out = NULL;
13227            if (arg2) {
13228                if (get_user_u64(loff_in, arg2)) {
13229                    return -TARGET_EFAULT;
13230                }
13231                ploff_in = &loff_in;
13232            }
13233            if (arg4) {
13234                if (get_user_u64(loff_out, arg4)) {
13235                    return -TARGET_EFAULT;
13236                }
13237                ploff_out = &loff_out;
13238            }
13239            ret = get_errno(splice(arg1, ploff_in, arg3, ploff_out, arg5, arg6));
13240            if (arg2) {
13241                if (put_user_u64(loff_in, arg2)) {
13242                    return -TARGET_EFAULT;
13243                }
13244            }
13245            if (arg4) {
13246                if (put_user_u64(loff_out, arg4)) {
13247                    return -TARGET_EFAULT;
13248                }
13249            }
13250        }
13251        return ret;
13252#endif
13253#ifdef TARGET_NR_vmsplice
13254        case TARGET_NR_vmsplice:
13255        {
13256            struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1);
13257            if (vec != NULL) {
13258                ret = get_errno(vmsplice(arg1, vec, arg3, arg4));
13259                unlock_iovec(vec, arg2, arg3, 0);
13260            } else {
13261                ret = -host_to_target_errno(errno);
13262            }
13263        }
13264        return ret;
13265#endif
13266#endif /* CONFIG_SPLICE */
13267#ifdef CONFIG_EVENTFD
13268#if defined(TARGET_NR_eventfd)
13269    case TARGET_NR_eventfd:
13270        ret = get_errno(eventfd(arg1, 0));
13271        if (ret >= 0) {
13272            fd_trans_register(ret, &target_eventfd_trans);
13273        }
13274        return ret;
13275#endif
13276#if defined(TARGET_NR_eventfd2)
13277    case TARGET_NR_eventfd2:
13278    {
13279        int host_flags = arg2 & (~(TARGET_O_NONBLOCK_MASK | TARGET_O_CLOEXEC));
13280        if (arg2 & TARGET_O_NONBLOCK) {
13281            host_flags |= O_NONBLOCK;
13282        }
13283        if (arg2 & TARGET_O_CLOEXEC) {
13284            host_flags |= O_CLOEXEC;
13285        }
13286        ret = get_errno(eventfd(arg1, host_flags));
13287        if (ret >= 0) {
13288            fd_trans_register(ret, &target_eventfd_trans);
13289        }
13290        return ret;
13291    }
13292#endif
13293#endif /* CONFIG_EVENTFD  */
13294#if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate)
13295    case TARGET_NR_fallocate:
13296#if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
13297        ret = get_errno(fallocate(arg1, arg2, target_offset64(arg3, arg4),
13298                                  target_offset64(arg5, arg6)));
13299#else
13300        ret = get_errno(fallocate(arg1, arg2, arg3, arg4));
13301#endif
13302        return ret;
13303#endif
13304#if defined(CONFIG_SYNC_FILE_RANGE)
13305#if defined(TARGET_NR_sync_file_range)
13306    case TARGET_NR_sync_file_range:
13307#if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
13308#if defined(TARGET_MIPS)
13309        ret = get_errno(sync_file_range(arg1, target_offset64(arg3, arg4),
13310                                        target_offset64(arg5, arg6), arg7));
13311#else
13312        ret = get_errno(sync_file_range(arg1, target_offset64(arg2, arg3),
13313                                        target_offset64(arg4, arg5), arg6));
13314#endif /* !TARGET_MIPS */
13315#else
13316        ret = get_errno(sync_file_range(arg1, arg2, arg3, arg4));
13317#endif
13318        return ret;
13319#endif
13320#if defined(TARGET_NR_sync_file_range2) || \
13321    defined(TARGET_NR_arm_sync_file_range)
13322#if defined(TARGET_NR_sync_file_range2)
13323    case TARGET_NR_sync_file_range2:
13324#endif
13325#if defined(TARGET_NR_arm_sync_file_range)
13326    case TARGET_NR_arm_sync_file_range:
13327#endif
13328        /* This is like sync_file_range but the arguments are reordered */
13329#if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
13330        ret = get_errno(sync_file_range(arg1, target_offset64(arg3, arg4),
13331                                        target_offset64(arg5, arg6), arg2));
13332#else
13333        ret = get_errno(sync_file_range(arg1, arg3, arg4, arg2));
13334#endif
13335        return ret;
13336#endif
13337#endif
13338#if defined(TARGET_NR_signalfd4)
13339    case TARGET_NR_signalfd4:
13340        return do_signalfd4(arg1, arg2, arg4);
13341#endif
13342#if defined(TARGET_NR_signalfd)
13343    case TARGET_NR_signalfd:
13344        return do_signalfd4(arg1, arg2, 0);
13345#endif
13346#if defined(CONFIG_EPOLL)
13347#if defined(TARGET_NR_epoll_create)
13348    case TARGET_NR_epoll_create:
13349        return get_errno(epoll_create(arg1));
13350#endif
13351#if defined(TARGET_NR_epoll_create1) && defined(CONFIG_EPOLL_CREATE1)
13352    case TARGET_NR_epoll_create1:
13353        return get_errno(epoll_create1(target_to_host_bitmask(arg1, fcntl_flags_tbl)));
13354#endif
13355#if defined(TARGET_NR_epoll_ctl)
13356    case TARGET_NR_epoll_ctl:
13357    {
13358        struct epoll_event ep;
13359        struct epoll_event *epp = 0;
13360        if (arg4) {
13361            if (arg2 != EPOLL_CTL_DEL) {
13362                struct target_epoll_event *target_ep;
13363                if (!lock_user_struct(VERIFY_READ, target_ep, arg4, 1)) {
13364                    return -TARGET_EFAULT;
13365                }
13366                ep.events = tswap32(target_ep->events);
13367                /*
13368                 * The epoll_data_t union is just opaque data to the kernel,
13369                 * so we transfer all 64 bits across and need not worry what
13370                 * actual data type it is.
13371                 */
13372                ep.data.u64 = tswap64(target_ep->data.u64);
13373                unlock_user_struct(target_ep, arg4, 0);
13374            }
13375            /*
13376             * before kernel 2.6.9, EPOLL_CTL_DEL operation required a
13377             * non-null pointer, even though this argument is ignored.
13378             *
13379             */
13380            epp = &ep;
13381        }
13382        return get_errno(epoll_ctl(arg1, arg2, arg3, epp));
13383    }
13384#endif
13385
13386#if defined(TARGET_NR_epoll_wait) || defined(TARGET_NR_epoll_pwait)
13387#if defined(TARGET_NR_epoll_wait)
13388    case TARGET_NR_epoll_wait:
13389#endif
13390#if defined(TARGET_NR_epoll_pwait)
13391    case TARGET_NR_epoll_pwait:
13392#endif
13393    {
13394        struct target_epoll_event *target_ep;
13395        struct epoll_event *ep;
13396        int epfd = arg1;
13397        int maxevents = arg3;
13398        int timeout = arg4;
13399
13400        if (maxevents <= 0 || maxevents > TARGET_EP_MAX_EVENTS) {
13401            return -TARGET_EINVAL;
13402        }
13403
13404        target_ep = lock_user(VERIFY_WRITE, arg2,
13405                              maxevents * sizeof(struct target_epoll_event), 1);
13406        if (!target_ep) {
13407            return -TARGET_EFAULT;
13408        }
13409
13410        ep = g_try_new(struct epoll_event, maxevents);
13411        if (!ep) {
13412            unlock_user(target_ep, arg2, 0);
13413            return -TARGET_ENOMEM;
13414        }
13415
13416        switch (num) {
13417#if defined(TARGET_NR_epoll_pwait)
13418        case TARGET_NR_epoll_pwait:
13419        {
13420            sigset_t *set = NULL;
13421
13422            if (arg5) {
13423                ret = process_sigsuspend_mask(&set, arg5, arg6);
13424                if (ret != 0) {
13425                    break;
13426                }
13427            }
13428
13429            ret = get_errno(safe_epoll_pwait(epfd, ep, maxevents, timeout,
13430                                             set, SIGSET_T_SIZE));
13431
13432            if (set) {
13433                finish_sigsuspend_mask(ret);
13434            }
13435            break;
13436        }
13437#endif
13438#if defined(TARGET_NR_epoll_wait)
13439        case TARGET_NR_epoll_wait:
13440            ret = get_errno(safe_epoll_pwait(epfd, ep, maxevents, timeout,
13441                                             NULL, 0));
13442            break;
13443#endif
13444        default:
13445            ret = -TARGET_ENOSYS;
13446        }
13447        if (!is_error(ret)) {
13448            int i;
13449            for (i = 0; i < ret; i++) {
13450                target_ep[i].events = tswap32(ep[i].events);
13451                target_ep[i].data.u64 = tswap64(ep[i].data.u64);
13452            }
13453            unlock_user(target_ep, arg2,
13454                        ret * sizeof(struct target_epoll_event));
13455        } else {
13456            unlock_user(target_ep, arg2, 0);
13457        }
13458        g_free(ep);
13459        return ret;
13460    }
13461#endif
13462#endif
13463#ifdef TARGET_NR_prlimit64
13464    case TARGET_NR_prlimit64:
13465    {
13466        /* args: pid, resource number, ptr to new rlimit, ptr to old rlimit */
13467        struct target_rlimit64 *target_rnew, *target_rold;
13468        struct host_rlimit64 rnew, rold, *rnewp = 0;
13469        int resource = target_to_host_resource(arg2);
13470
13471        if (arg3 && (resource != RLIMIT_AS &&
13472                     resource != RLIMIT_DATA &&
13473                     resource != RLIMIT_STACK)) {
13474            if (!lock_user_struct(VERIFY_READ, target_rnew, arg3, 1)) {
13475                return -TARGET_EFAULT;
13476            }
13477            __get_user(rnew.rlim_cur, &target_rnew->rlim_cur);
13478            __get_user(rnew.rlim_max, &target_rnew->rlim_max);
13479            unlock_user_struct(target_rnew, arg3, 0);
13480            rnewp = &rnew;
13481        }
13482
13483        ret = get_errno(sys_prlimit64(arg1, resource, rnewp, arg4 ? &rold : 0));
13484        if (!is_error(ret) && arg4) {
13485            if (!lock_user_struct(VERIFY_WRITE, target_rold, arg4, 1)) {
13486                return -TARGET_EFAULT;
13487            }
13488            __put_user(rold.rlim_cur, &target_rold->rlim_cur);
13489            __put_user(rold.rlim_max, &target_rold->rlim_max);
13490            unlock_user_struct(target_rold, arg4, 1);
13491        }
13492        return ret;
13493    }
13494#endif
13495#ifdef TARGET_NR_gethostname
13496    case TARGET_NR_gethostname:
13497    {
13498        char *name = lock_user(VERIFY_WRITE, arg1, arg2, 0);
13499        if (name) {
13500            ret = get_errno(gethostname(name, arg2));
13501            unlock_user(name, arg1, arg2);
13502        } else {
13503            ret = -TARGET_EFAULT;
13504        }
13505        return ret;
13506    }
13507#endif
13508#ifdef TARGET_NR_atomic_cmpxchg_32
13509    case TARGET_NR_atomic_cmpxchg_32:
13510    {
13511        /* should use start_exclusive from main.c */
13512        abi_ulong mem_value;
13513        if (get_user_u32(mem_value, arg6)) {
13514            target_siginfo_t info;
13515            info.si_signo = SIGSEGV;
13516            info.si_errno = 0;
13517            info.si_code = TARGET_SEGV_MAPERR;
13518            info._sifields._sigfault._addr = arg6;
13519            queue_signal(cpu_env, info.si_signo, QEMU_SI_FAULT, &info);
13520            ret = 0xdeadbeef;
13521
13522        }
13523        if (mem_value == arg2)
13524            put_user_u32(arg1, arg6);
13525        return mem_value;
13526    }
13527#endif
13528#ifdef TARGET_NR_atomic_barrier
13529    case TARGET_NR_atomic_barrier:
13530        /* Like the kernel implementation and the
13531           qemu arm barrier, no-op this? */
13532        return 0;
13533#endif
13534
13535#ifdef TARGET_NR_timer_create
13536    case TARGET_NR_timer_create:
13537    {
13538        /* args: clockid_t clockid, struct sigevent *sevp, timer_t *timerid */
13539
13540        struct sigevent host_sevp = { {0}, }, *phost_sevp = NULL;
13541
13542        int clkid = arg1;
13543        int timer_index = next_free_host_timer();
13544
13545        if (timer_index < 0) {
13546            ret = -TARGET_EAGAIN;
13547        } else {
13548            timer_t *phtimer = g_posix_timers  + timer_index;
13549
13550            if (arg2) {
13551                phost_sevp = &host_sevp;
13552                ret = target_to_host_sigevent(phost_sevp, arg2);
13553                if (ret != 0) {
13554                    free_host_timer_slot(timer_index);
13555                    return ret;
13556                }
13557            }
13558
13559            ret = get_errno(timer_create(clkid, phost_sevp, phtimer));
13560            if (ret) {
13561                free_host_timer_slot(timer_index);
13562            } else {
13563                if (put_user(TIMER_MAGIC | timer_index, arg3, target_timer_t)) {
13564                    timer_delete(*phtimer);
13565                    free_host_timer_slot(timer_index);
13566                    return -TARGET_EFAULT;
13567                }
13568            }
13569        }
13570        return ret;
13571    }
13572#endif
13573
13574#ifdef TARGET_NR_timer_settime
13575    case TARGET_NR_timer_settime:
13576    {
13577        /* args: timer_t timerid, int flags, const struct itimerspec *new_value,
13578         * struct itimerspec * old_value */
13579        target_timer_t timerid = get_timer_id(arg1);
13580
13581        if (timerid < 0) {
13582            ret = timerid;
13583        } else if (arg3 == 0) {
13584            ret = -TARGET_EINVAL;
13585        } else {
13586            timer_t htimer = g_posix_timers[timerid];
13587            struct itimerspec hspec_new = {{0},}, hspec_old = {{0},};
13588
13589            if (target_to_host_itimerspec(&hspec_new, arg3)) {
13590                return -TARGET_EFAULT;
13591            }
13592            ret = get_errno(
13593                          timer_settime(htimer, arg2, &hspec_new, &hspec_old));
13594            if (arg4 && host_to_target_itimerspec(arg4, &hspec_old)) {
13595                return -TARGET_EFAULT;
13596            }
13597        }
13598        return ret;
13599    }
13600#endif
13601
13602#ifdef TARGET_NR_timer_settime64
13603    case TARGET_NR_timer_settime64:
13604    {
13605        target_timer_t timerid = get_timer_id(arg1);
13606
13607        if (timerid < 0) {
13608            ret = timerid;
13609        } else if (arg3 == 0) {
13610            ret = -TARGET_EINVAL;
13611        } else {
13612            timer_t htimer = g_posix_timers[timerid];
13613            struct itimerspec hspec_new = {{0},}, hspec_old = {{0},};
13614
13615            if (target_to_host_itimerspec64(&hspec_new, arg3)) {
13616                return -TARGET_EFAULT;
13617            }
13618            ret = get_errno(
13619                          timer_settime(htimer, arg2, &hspec_new, &hspec_old));
13620            if (arg4 && host_to_target_itimerspec64(arg4, &hspec_old)) {
13621                return -TARGET_EFAULT;
13622            }
13623        }
13624        return ret;
13625    }
13626#endif
13627
13628#ifdef TARGET_NR_timer_gettime
13629    case TARGET_NR_timer_gettime:
13630    {
13631        /* args: timer_t timerid, struct itimerspec *curr_value */
13632        target_timer_t timerid = get_timer_id(arg1);
13633
13634        if (timerid < 0) {
13635            ret = timerid;
13636        } else if (!arg2) {
13637            ret = -TARGET_EFAULT;
13638        } else {
13639            timer_t htimer = g_posix_timers[timerid];
13640            struct itimerspec hspec;
13641            ret = get_errno(timer_gettime(htimer, &hspec));
13642
13643            if (host_to_target_itimerspec(arg2, &hspec)) {
13644                ret = -TARGET_EFAULT;
13645            }
13646        }
13647        return ret;
13648    }
13649#endif
13650
13651#ifdef TARGET_NR_timer_gettime64
13652    case TARGET_NR_timer_gettime64:
13653    {
13654        /* args: timer_t timerid, struct itimerspec64 *curr_value */
13655        target_timer_t timerid = get_timer_id(arg1);
13656
13657        if (timerid < 0) {
13658            ret = timerid;
13659        } else if (!arg2) {
13660            ret = -TARGET_EFAULT;
13661        } else {
13662            timer_t htimer = g_posix_timers[timerid];
13663            struct itimerspec hspec;
13664            ret = get_errno(timer_gettime(htimer, &hspec));
13665
13666            if (host_to_target_itimerspec64(arg2, &hspec)) {
13667                ret = -TARGET_EFAULT;
13668            }
13669        }
13670        return ret;
13671    }
13672#endif
13673
13674#ifdef TARGET_NR_timer_getoverrun
13675    case TARGET_NR_timer_getoverrun:
13676    {
13677        /* args: timer_t timerid */
13678        target_timer_t timerid = get_timer_id(arg1);
13679
13680        if (timerid < 0) {
13681            ret = timerid;
13682        } else {
13683            timer_t htimer = g_posix_timers[timerid];
13684            ret = get_errno(timer_getoverrun(htimer));
13685        }
13686        return ret;
13687    }
13688#endif
13689
13690#ifdef TARGET_NR_timer_delete
13691    case TARGET_NR_timer_delete:
13692    {
13693        /* args: timer_t timerid */
13694        target_timer_t timerid = get_timer_id(arg1);
13695
13696        if (timerid < 0) {
13697            ret = timerid;
13698        } else {
13699            timer_t htimer = g_posix_timers[timerid];
13700            ret = get_errno(timer_delete(htimer));
13701            free_host_timer_slot(timerid);
13702        }
13703        return ret;
13704    }
13705#endif
13706
13707#if defined(TARGET_NR_timerfd_create) && defined(CONFIG_TIMERFD)
13708    case TARGET_NR_timerfd_create:
13709        ret = get_errno(timerfd_create(arg1,
13710                        target_to_host_bitmask(arg2, fcntl_flags_tbl)));
13711        if (ret >= 0) {
13712            fd_trans_register(ret, &target_timerfd_trans);
13713        }
13714        return ret;
13715#endif
13716
13717#if defined(TARGET_NR_timerfd_gettime) && defined(CONFIG_TIMERFD)
13718    case TARGET_NR_timerfd_gettime:
13719        {
13720            struct itimerspec its_curr;
13721
13722            ret = get_errno(timerfd_gettime(arg1, &its_curr));
13723
13724            if (arg2 && host_to_target_itimerspec(arg2, &its_curr)) {
13725                return -TARGET_EFAULT;
13726            }
13727        }
13728        return ret;
13729#endif
13730
13731#if defined(TARGET_NR_timerfd_gettime64) && defined(CONFIG_TIMERFD)
13732    case TARGET_NR_timerfd_gettime64:
13733        {
13734            struct itimerspec its_curr;
13735
13736            ret = get_errno(timerfd_gettime(arg1, &its_curr));
13737
13738            if (arg2 && host_to_target_itimerspec64(arg2, &its_curr)) {
13739                return -TARGET_EFAULT;
13740            }
13741        }
13742        return ret;
13743#endif
13744
13745#if defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD)
13746    case TARGET_NR_timerfd_settime:
13747        {
13748            struct itimerspec its_new, its_old, *p_new;
13749
13750            if (arg3) {
13751                if (target_to_host_itimerspec(&its_new, arg3)) {
13752                    return -TARGET_EFAULT;
13753                }
13754                p_new = &its_new;
13755            } else {
13756                p_new = NULL;
13757            }
13758
13759            ret = get_errno(timerfd_settime(arg1, arg2, p_new, &its_old));
13760
13761            if (arg4 && host_to_target_itimerspec(arg4, &its_old)) {
13762                return -TARGET_EFAULT;
13763            }
13764        }
13765        return ret;
13766#endif
13767
13768#if defined(TARGET_NR_timerfd_settime64) && defined(CONFIG_TIMERFD)
13769    case TARGET_NR_timerfd_settime64:
13770        {
13771            struct itimerspec its_new, its_old, *p_new;
13772
13773            if (arg3) {
13774                if (target_to_host_itimerspec64(&its_new, arg3)) {
13775                    return -TARGET_EFAULT;
13776                }
13777                p_new = &its_new;
13778            } else {
13779                p_new = NULL;
13780            }
13781
13782            ret = get_errno(timerfd_settime(arg1, arg2, p_new, &its_old));
13783
13784            if (arg4 && host_to_target_itimerspec64(arg4, &its_old)) {
13785                return -TARGET_EFAULT;
13786            }
13787        }
13788        return ret;
13789#endif
13790
13791#if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
13792    case TARGET_NR_ioprio_get:
13793        return get_errno(ioprio_get(arg1, arg2));
13794#endif
13795
13796#if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
13797    case TARGET_NR_ioprio_set:
13798        return get_errno(ioprio_set(arg1, arg2, arg3));
13799#endif
13800
13801#if defined(TARGET_NR_setns) && defined(CONFIG_SETNS)
13802    case TARGET_NR_setns:
13803        return get_errno(setns(arg1, arg2));
13804#endif
13805#if defined(TARGET_NR_unshare) && defined(CONFIG_SETNS)
13806    case TARGET_NR_unshare:
13807        return get_errno(unshare(arg1));
13808#endif
13809#if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
13810    case TARGET_NR_kcmp:
13811        return get_errno(kcmp(arg1, arg2, arg3, arg4, arg5));
13812#endif
13813#ifdef TARGET_NR_swapcontext
13814    case TARGET_NR_swapcontext:
13815        /* PowerPC specific.  */
13816        return do_swapcontext(cpu_env, arg1, arg2, arg3);
13817#endif
13818#ifdef TARGET_NR_memfd_create
13819    case TARGET_NR_memfd_create:
13820        p = lock_user_string(arg1);
13821        if (!p) {
13822            return -TARGET_EFAULT;
13823        }
13824        ret = get_errno(memfd_create(p, arg2));
13825        fd_trans_unregister(ret);
13826        unlock_user(p, arg1, 0);
13827        return ret;
13828#endif
13829#if defined TARGET_NR_membarrier && defined __NR_membarrier
13830    case TARGET_NR_membarrier:
13831        return get_errno(membarrier(arg1, arg2));
13832#endif
13833
13834#if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range)
13835    case TARGET_NR_copy_file_range:
13836        {
13837            loff_t inoff, outoff;
13838            loff_t *pinoff = NULL, *poutoff = NULL;
13839
13840            if (arg2) {
13841                if (get_user_u64(inoff, arg2)) {
13842                    return -TARGET_EFAULT;
13843                }
13844                pinoff = &inoff;
13845            }
13846            if (arg4) {
13847                if (get_user_u64(outoff, arg4)) {
13848                    return -TARGET_EFAULT;
13849                }
13850                poutoff = &outoff;
13851            }
13852            /* Do not sign-extend the count parameter. */
13853            ret = get_errno(safe_copy_file_range(arg1, pinoff, arg3, poutoff,
13854                                                 (abi_ulong)arg5, arg6));
13855            if (!is_error(ret) && ret > 0) {
13856                if (arg2) {
13857                    if (put_user_u64(inoff, arg2)) {
13858                        return -TARGET_EFAULT;
13859                    }
13860                }
13861                if (arg4) {
13862                    if (put_user_u64(outoff, arg4)) {
13863                        return -TARGET_EFAULT;
13864                    }
13865                }
13866            }
13867        }
13868        return ret;
13869#endif
13870
13871#if defined(TARGET_NR_pivot_root)
13872    case TARGET_NR_pivot_root:
13873        {
13874            void *p2;
13875            p = lock_user_string(arg1); /* new_root */
13876            p2 = lock_user_string(arg2); /* put_old */
13877            if (!p || !p2) {
13878                ret = -TARGET_EFAULT;
13879            } else {
13880                ret = get_errno(pivot_root(p, p2));
13881            }
13882            unlock_user(p2, arg2, 0);
13883            unlock_user(p, arg1, 0);
13884        }
13885        return ret;
13886#endif
13887
13888#if defined(TARGET_NR_riscv_hwprobe)
13889    case TARGET_NR_riscv_hwprobe:
13890        return do_riscv_hwprobe(cpu_env, arg1, arg2, arg3, arg4, arg5);
13891#endif
13892
13893    default:
13894        qemu_log_mask(LOG_UNIMP, "Unsupported syscall: %d\n", num);
13895        return -TARGET_ENOSYS;
13896    }
13897    return ret;
13898}
13899
13900abi_long do_syscall(CPUArchState *cpu_env, int num, abi_long arg1,
13901                    abi_long arg2, abi_long arg3, abi_long arg4,
13902                    abi_long arg5, abi_long arg6, abi_long arg7,
13903                    abi_long arg8)
13904{
13905    CPUState *cpu = env_cpu(cpu_env);
13906    abi_long ret;
13907
13908#ifdef DEBUG_ERESTARTSYS
13909    /* Debug-only code for exercising the syscall-restart code paths
13910     * in the per-architecture cpu main loops: restart every syscall
13911     * the guest makes once before letting it through.
13912     */
13913    {
13914        static bool flag;
13915        flag = !flag;
13916        if (flag) {
13917            return -QEMU_ERESTARTSYS;
13918        }
13919    }
13920#endif
13921
13922    record_syscall_start(cpu, num, arg1,
13923                         arg2, arg3, arg4, arg5, arg6, arg7, arg8);
13924
13925    if (unlikely(qemu_loglevel_mask(LOG_STRACE))) {
13926        print_syscall(cpu_env, num, arg1, arg2, arg3, arg4, arg5, arg6);
13927    }
13928
13929    ret = do_syscall1(cpu_env, num, arg1, arg2, arg3, arg4,
13930                      arg5, arg6, arg7, arg8);
13931
13932    if (unlikely(qemu_loglevel_mask(LOG_STRACE))) {
13933        print_syscall_ret(cpu_env, num, ret, arg1, arg2,
13934                          arg3, arg4, arg5, arg6);
13935    }
13936
13937    record_syscall_return(cpu, num, ret);
13938    return ret;
13939}
13940