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