]> git.proxmox.com Git - mirror_qemu.git/commitdiff
Merge remote-tracking branch 'remotes/riku/tags/pull-linux-user-20160608' into staging
authorPeter Maydell <peter.maydell@linaro.org>
Wed, 8 Jun 2016 17:34:32 +0000 (18:34 +0100)
committerPeter Maydell <peter.maydell@linaro.org>
Wed, 8 Jun 2016 17:34:32 +0000 (18:34 +0100)
linux-user pull request for June 2016

# gpg: Signature made Wed 08 Jun 2016 14:27:14 BST
# gpg:                using RSA key 0xB44890DEDE3C9BC0
# gpg: Good signature from "Riku Voipio <riku.voipio@iki.fi>"
# gpg:                 aka "Riku Voipio <riku.voipio@linaro.org>"

* remotes/riku/tags/pull-linux-user-20160608: (44 commits)
  linux-user: In fork_end(), remove correct CPUs from CPU list
  linux-user: Special-case ERESTARTSYS in target_strerror()
  linux-user: Make target_strerror() return 'const char *'
  linux-user: Correct signedness of target_flock l_start and l_len fields
  linux-user: Use safe_syscall wrapper for ioctl
  linux-user: Use safe_syscall wrapper for accept and accept4 syscalls
  linux-user: Use safe_syscall wrapper for semop
  linux-user: Use safe_syscall wrapper for epoll_wait syscalls
  linux-user: Use safe_syscall wrapper for poll and ppoll syscalls
  linux-user: Use safe_syscall wrapper for sleep syscalls
  linux-user: Use safe_syscall wrapper for rt_sigtimedwait syscall
  linux-user: Use safe_syscall wrapper for flock
  linux-user: Use safe_syscall wrapper for mq_timedsend and mq_timedreceive
  linux-user: Use safe_syscall wrapper for msgsnd and msgrcv
  linux-user: Use safe_syscall wrapper for send* and recv* syscalls
  linux-user: Use safe_syscall wrapper for connect syscall
  linux-user: Use safe_syscall wrapper for readv and writev syscalls
  linux-user: Fix error conversion in 64-bit fadvise syscall
  linux-user: Fix NR_fadvise64 and NR_fadvise64_64 for 32-bit guests
  linux-user: Fix handling of arm_fadvise64_64 syscall
  ...

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Conflicts:
configure
scripts/qemu-binfmt-conf.sh

1  2 
configure
gdbstub.c
linux-user/main.c
linux-user/syscall.c

diff --combined configure
index 4627d2c1eb0c4bdf954b1024134ae586f58f56d0,e995ddd7c9b46d3610843ca44fad041bfbce18e2..8c2f90b3127da012b97fc8517fac87ee824ea2e2
+++ b/configure
@@@ -31,7 -31,6 +31,7 @@@ TMPCXX="${TMPDIR1}/${TMPB}.cxx
  TMPL="${TMPDIR1}/${TMPB}.lo"
  TMPA="${TMPDIR1}/lib${TMPB}.la"
  TMPE="${TMPDIR1}/${TMPB}.exe"
 +TMPMO="${TMPDIR1}/${TMPB}.mo"
  
  rm -f config.log
  
@@@ -165,7 -164,7 +165,7 @@@ have_backend () 
  }
  
  # default parameters
 -source_path=`dirname "$0"`
 +source_path=$(dirname "$0")
  cpu=""
  iasl="iasl"
  interp_prefix="/usr/gnemul/qemu-%M"
@@@ -324,7 -323,7 +324,7 @@@ jemalloc="no
  
  # parse CC options first
  for opt do
 -  optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
 +  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
    case "$opt" in
    --cross-prefix=*) cross_prefix="$optarg"
    ;;
@@@ -399,7 -398,7 +399,7 @@@ if test "$debug_info" = "yes"; the
  fi
  
  # make source path absolute
 -source_path=`cd "$source_path"; pwd`
 +source_path=$(cd "$source_path"; pwd)
  
  # running configure in the source tree?
  # we know that's the case if configure is there.
@@@ -444,7 -443,7 +444,7 @@@ elif check_define __sun__ ; the
  elif check_define __HAIKU__ ; then
    targetos='Haiku'
  else
 -  targetos=`uname -s`
 +  targetos=$(uname -s)
  fi
  
  # Some host OSes need non-standard checks for which CPU to use.
@@@ -462,7 -461,7 +462,7 @@@ Darwin
    fi
    ;;
  SunOS)
 -  # `uname -m` returns i86pc even on an x86_64 box, so default based on isainfo
 +  # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
    if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
      cpu="x86_64"
    fi
@@@ -508,7 -507,7 +508,7 @@@ elif check_define __aarch64__ ; the
  elif check_define __hppa__ ; then
    cpu="hppa"
  else
 -  cpu=`uname -m`
 +  cpu=$(uname -m)
  fi
  
  ARCH=
@@@ -628,7 -627,7 +628,7 @@@ SunOS
    ld="gld"
    smbd="${SMBD-/usr/sfw/sbin/smbd}"
    needs_libsunmath="no"
 -  solarisrev=`uname -r | cut -f2 -d.`
 +  solarisrev=$(uname -r | cut -f2 -d.)
    if [ "$cpu" = "i386" -o "$cpu" = "x86_64" ] ; then
      if test "$solarisrev" -le 9 ; then
        if test -f /opt/SUNWspro/prod/lib/libsunmath.so.1; then
@@@ -723,7 -722,7 +723,7 @@@ f
  werror=""
  
  for opt do
 -  optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
 +  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
    case "$opt" in
    --help|-h) show_help=yes
    ;;
    ;;
    --audio-drv-list=*) audio_drv_list="$optarg"
    ;;
 -  --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=`echo "$optarg" | sed -e 's/,/ /g'`
 +  --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
    ;;
 -  --block-drv-ro-whitelist=*) block_drv_ro_whitelist=`echo "$optarg" | sed -e 's/,/ /g'`
 +  --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
    ;;
    --enable-debug-tcg) debug_tcg="yes"
    ;;
    ;;
    --enable-cocoa)
        cocoa="yes" ;
 -      audio_drv_list="coreaudio `echo $audio_drv_list | sed s,coreaudio,,g`"
 +      audio_drv_list="coreaudio $(echo $audio_drv_list | sed s,coreaudio,,g)"
    ;;
    --disable-system) softmmu="no"
    ;;
  
  # Consult white-list to determine whether to enable werror
  # by default.  Only enable by default for git builds
 -z_version=`cut -f3 -d. $source_path/VERSION`
 +z_version=$(cut -f3 -d. $source_path/VERSION)
  
  if test -z "$werror" ; then
      if test -d "$source_path/.git" -a \
@@@ -1618,7 -1617,7 +1618,7 @@@ if test "$solaris" = "yes" ; the
          "install fileutils from www.blastwave.org using pkg-get -i fileutils" \
          "to get ginstall which is used by default (which lives in /opt/csw/bin)"
    fi
 -  if test "`path_of $install`" = "/usr/sbin/install" ; then
 +  if test "$(path_of $install)" = "/usr/sbin/install" ; then
      error_exit "Solaris /usr/sbin/install is not an appropriate install program." \
          "try ginstall from the GNU fileutils available from www.blastwave.org" \
          "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
  if test -z "${target_list+xxx}" ; then
      target_list="$default_target_list"
  else
 -    target_list=`echo "$target_list" | sed -e 's/,/ /g'`
 +    target_list=$(echo "$target_list" | sed -e 's/,/ /g')
  fi
  
  # Check that we recognised the target name; this allows a more
@@@ -1887,8 -1886,8 +1887,8 @@@ if test "$seccomp" != "no" ; the
  
      if test "$libseccomp_minver" != "" &&
         $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
 -        libs_softmmu="$libs_softmmu `$pkg_config --libs libseccomp`"
 -        QEMU_CFLAGS="$QEMU_CFLAGS `$pkg_config --cflags libseccomp`"
 +        libs_softmmu="$libs_softmmu $($pkg_config --libs libseccomp)"
 +        QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags libseccomp)"
          seccomp="yes"
      else
          if test "$seccomp" = "yes" ; then
  x11_cflags=
  x11_libs=-lX11
  if $pkg_config --exists "x11"; then
 -    x11_cflags=`$pkg_config --cflags x11`
 -    x11_libs=`$pkg_config --libs x11`
 +    x11_cflags=$($pkg_config --cflags x11)
 +    x11_libs=$($pkg_config --libs x11)
  fi
  
  ##########################################
@@@ -2156,9 -2155,9 +2156,9 @@@ if test "$gtk" != "no"; the
        gtkversion="2.18.0"
      fi
      if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
 -        gtk_cflags=`$pkg_config --cflags $gtkpackage`
 -        gtk_libs=`$pkg_config --libs $gtkpackage`
 -        gtk_version=`$pkg_config --modversion $gtkpackage`
 +        gtk_cflags=$($pkg_config --cflags $gtkpackage)
 +        gtk_libs=$($pkg_config --libs $gtkpackage)
 +        gtk_version=$($pkg_config --modversion $gtkpackage)
          if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
              gtk_cflags="$gtk_cflags $x11_cflags"
              gtk_libs="$gtk_libs $x11_libs"
@@@ -2196,8 -2195,8 +2196,8 @@@ gnutls_gcrypt=n
  gnutls_nettle=no
  if test "$gnutls" != "no"; then
      if gnutls_works; then
 -        gnutls_cflags=`$pkg_config --cflags gnutls`
 -        gnutls_libs=`$pkg_config --libs gnutls`
 +        gnutls_cflags=$($pkg_config --cflags gnutls)
 +        gnutls_libs=$($pkg_config --libs gnutls)
          libs_softmmu="$gnutls_libs $libs_softmmu"
          libs_tools="$gnutls_libs $libs_tools"
        QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags"
            gnutls_gcrypt=no
            gnutls_nettle=yes
        elif $pkg_config --exists 'gnutls >= 2.12'; then
 -          case `$pkg_config --libs --static gnutls` in
 +          case $($pkg_config --libs --static gnutls) in
                *gcrypt*)
                    gnutls_gcrypt=yes
                    gnutls_nettle=no
@@@ -2282,7 -2281,7 +2282,7 @@@ has_libgcrypt_config() 
  
      if test -n "$cross_prefix"
      then
 -      host=`libgcrypt-config --host`
 +      host=$(libgcrypt-config --host)
        if test "$host-" != $cross_prefix
        then
            return 1
  
  if test "$gcrypt" != "no"; then
      if has_libgcrypt_config; then
 -        gcrypt_cflags=`libgcrypt-config --cflags`
 -        gcrypt_libs=`libgcrypt-config --libs`
 +        gcrypt_cflags=$(libgcrypt-config --cflags)
 +        gcrypt_libs=$(libgcrypt-config --libs)
          # Debian has remove -lgpg-error from libgcrypt-config
          # as it "spreads unnecessary dependencies" which in
          # turn breaks static builds...
  
  if test "$nettle" != "no"; then
      if $pkg_config --exists "nettle"; then
 -        nettle_cflags=`$pkg_config --cflags nettle`
 -        nettle_libs=`$pkg_config --libs nettle`
 -        nettle_version=`$pkg_config --modversion nettle`
 +        nettle_cflags=$($pkg_config --cflags nettle)
 +        nettle_libs=$($pkg_config --libs nettle)
 +        nettle_version=$($pkg_config --modversion nettle)
          libs_softmmu="$nettle_libs $libs_softmmu"
          libs_tools="$nettle_libs $libs_tools"
          QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags"
          nettle="yes"
  
          cat > $TMPC << EOF
 +#include <stddef.h>
  #include <nettle/pbkdf2.h>
  int main(void) {
       pbkdf2_hmac_sha256(8, NULL, 1000, 8, NULL, 8, NULL);
@@@ -2375,8 -2373,8 +2375,8 @@@ tasn1=ye
  tasn1_cflags=""
  tasn1_libs=""
  if $pkg_config --exists "libtasn1"; then
 -    tasn1_cflags=`$pkg_config --cflags libtasn1`
 -    tasn1_libs=`$pkg_config --libs libtasn1`
 +    tasn1_cflags=$($pkg_config --cflags libtasn1)
 +    tasn1_libs=$($pkg_config --libs libtasn1)
  else
      tasn1=no
  fi
@@@ -2406,9 -2404,9 +2406,9 @@@ if test "$vte" != "no"; the
        vteminversion="0.24.0"
      fi
      if $pkg_config --exists "$vtepackage >= $vteminversion"; then
 -        vte_cflags=`$pkg_config --cflags $vtepackage`
 -        vte_libs=`$pkg_config --libs $vtepackage`
 -        vteversion=`$pkg_config --modversion $vtepackage`
 +        vte_cflags=$($pkg_config --cflags $vtepackage)
 +        vte_libs=$($pkg_config --libs $vtepackage)
 +        vteversion=$($pkg_config --modversion $vtepackage)
          libs_softmmu="$vte_libs $libs_softmmu"
          vte="yes"
      elif test "$vte" = "yes"; then
      error_exit "Unknown sdlabi $sdlabi, must be 1.2 or 2.0"
  fi
  
 -if test "`basename $sdl_config`" != $sdlconfigname && ! has ${sdl_config}; then
 +if test "$(basename $sdl_config)" != $sdlconfigname && ! has ${sdl_config}; then
    sdl_config=$sdlconfigname
  fi
  
  if $pkg_config $sdlname --exists; then
    sdlconfig="$pkg_config $sdlname"
 -  sdlversion=`$sdlconfig --modversion 2>/dev/null`
 +  sdlversion=$($sdlconfig --modversion 2>/dev/null)
  elif has ${sdl_config}; then
    sdlconfig="$sdl_config"
 -  sdlversion=`$sdlconfig --version`
 +  sdlversion=$($sdlconfig --version)
  else
    if test "$sdl" = "yes" ; then
      feature_not_found "sdl" "Install SDL devel"
@@@ -2476,14 -2474,14 +2476,14 @@@ if test "$sdl" != "no" ; the
  #undef main /* We don't want SDL to override our main() */
  int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
  EOF
 -  sdl_cflags=`$sdlconfig --cflags 2> /dev/null`
 +  sdl_cflags=$($sdlconfig --cflags 2>/dev/null)
    if test "$static" = "yes" ; then
 -    sdl_libs=`$sdlconfig --static-libs 2>/dev/null`
 +    sdl_libs=$($sdlconfig --static-libs 2>/dev/null)
    else
 -    sdl_libs=`$sdlconfig --libs 2> /dev/null`
 +    sdl_libs=$($sdlconfig --libs 2>/dev/null)
    fi
    if compile_prog "$sdl_cflags" "$sdl_libs" ; then
 -    if test `echo $sdlversion | sed 's/[^0-9]//g'` -lt 121 ; then
 +    if test $(echo $sdlversion | sed 's/[^0-9]//g') -lt 121 ; then
        sdl_too_old=yes
      else
        sdl=yes
      # static link with sdl ? (note: sdl.pc's --static --libs is broken)
      if test "$sdl" = "yes" -a "$static" = "yes" ; then
        if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
 -         sdl_libs="$sdl_libs `aalib-config --static-libs 2>/dev/null`"
 -         sdl_cflags="$sdl_cflags `aalib-config --cflags 2>/dev/null`"
 +         sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
 +         sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
        fi
        if compile_prog "$sdl_cflags" "$sdl_libs" ; then
        :
@@@ -2610,8 -2608,8 +2610,8 @@@ int main(void) 
  }
  EOF
    if $pkg_config libpng --exists; then
 -    vnc_png_cflags=`$pkg_config libpng --cflags`
 -    vnc_png_libs=`$pkg_config libpng --libs`
 +    vnc_png_cflags=$($pkg_config libpng --cflags)
 +    vnc_png_libs=$($pkg_config libpng --libs)
    else
      vnc_png_cflags=""
      vnc_png_libs="-lpng"
@@@ -2805,7 -2803,7 +2805,7 @@@ EO
      fi
  }
  
 -audio_drv_list=`echo "$audio_drv_list" | sed -e 's/,/ /g'`
 +audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
  for drv in $audio_drv_list; do
      case $drv in
      alsa)
@@@ -2917,8 -2915,8 +2917,8 @@@ if test "$curl" != "no" ; the
  #include <curl/curl.h>
  int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
  EOF
 -  curl_cflags=`$curlconfig --cflags 2>/dev/null`
 -  curl_libs=`$curlconfig --libs 2>/dev/null`
 +  curl_cflags=$($curlconfig --cflags 2>/dev/null)
 +  curl_libs=$($curlconfig --libs 2>/dev/null)
    if compile_prog "$curl_cflags" "$curl_libs" ; then
      curl=yes
    else
@@@ -2936,8 -2934,8 +2936,8 @@@ if test "$bluez" != "no" ; the
  #include <bluetooth/bluetooth.h>
  int main(void) { return bt_error(0); }
  EOF
 -  bluez_cflags=`$pkg_config --cflags bluez 2> /dev/null`
 -  bluez_libs=`$pkg_config --libs bluez 2> /dev/null`
 +  bluez_cflags=$($pkg_config --cflags bluez 2>/dev/null)
 +  bluez_libs=$($pkg_config --libs bluez 2>/dev/null)
    if compile_prog "$bluez_cflags" "$bluez_libs" ; then
      bluez=yes
      libs_softmmu="$bluez_libs $libs_softmmu"
  
  for i in $glib_modules; do
      if $pkg_config --atleast-version=$glib_req_ver $i; then
 -        glib_cflags=`$pkg_config --cflags $i`
 -        glib_libs=`$pkg_config --libs $i`
 +        glib_cflags=$($pkg_config --cflags $i)
 +        glib_libs=$($pkg_config --libs $i)
          CFLAGS="$glib_cflags $CFLAGS"
          LIBS="$glib_libs $LIBS"
          libs_qga="$glib_libs $libs_qga"
@@@ -3050,8 -3048,8 +3050,8 @@@ if test "$pixman" = "none"; the
    pixman_libs=
  elif test "$pixman" = "system"; then
    # pixman version has been checked above
 -  pixman_cflags=`$pkg_config --cflags pixman-1`
 -  pixman_libs=`$pkg_config --libs pixman-1`
 +  pixman_cflags=$($pkg_config --cflags pixman-1)
 +  pixman_libs=$($pkg_config --libs pixman-1)
  else
    if test ! -d ${source_path}/pixman/pixman; then
      error_exit "pixman >= 0.21.8 not present. Your options:" \
  min_libssh2_version=1.2.8
  if test "$libssh2" != "no" ; then
    if $pkg_config --atleast-version=$min_libssh2_version libssh2; then
 -    libssh2_cflags=`$pkg_config libssh2 --cflags`
 -    libssh2_libs=`$pkg_config libssh2 --libs`
 +    libssh2_cflags=$($pkg_config libssh2 --cflags)
 +    libssh2_libs=$($pkg_config libssh2 --libs)
      libssh2=yes
    else
      if test "$libssh2" = "yes" ; then
  if test "$glusterfs" != "no" ; then
    if $pkg_config --atleast-version=3 glusterfs-api; then
      glusterfs="yes"
 -    glusterfs_cflags=`$pkg_config --cflags glusterfs-api`
 -    glusterfs_libs=`$pkg_config --libs glusterfs-api`
 +    glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
 +    glusterfs_libs=$($pkg_config --libs glusterfs-api)
      if $pkg_config --atleast-version=4 glusterfs-api; then
        glusterfs_xlator_opt="yes"
      fi
@@@ -3800,8 -3798,8 +3800,8 @@@ if compile_prog "" "" ; the
    epoll=yes
  fi
  
- # epoll_create1 and epoll_pwait are later additions
- # so we must check separately for their presence
+ # epoll_create1 is a later addition
+ # so we must check separately for its presence
  epoll_create1=no
  cat > $TMPC << EOF
  #include <sys/epoll.h>
@@@ -3823,20 -3821,6 +3823,6 @@@ if compile_prog "" "" ; the
    epoll_create1=yes
  fi
  
- epoll_pwait=no
- cat > $TMPC << EOF
- #include <sys/epoll.h>
- int main(void)
- {
-     epoll_pwait(0, 0, 0, 0, 0);
-     return 0;
- }
- EOF
- if compile_prog "" "" ; then
-   epoll_pwait=yes
- fi
  # check for sendfile support
  sendfile=no
  cat > $TMPC << EOF
@@@ -4227,12 -4211,12 +4213,12 @@@ int main(void) { return 0; 
  EOF
    if compile_prog "" "" ; then
      if $pkg_config lttng-ust --exists; then
 -      lttng_ust_libs=`$pkg_config --libs lttng-ust`
 +      lttng_ust_libs=$($pkg_config --libs lttng-ust)
      else
        lttng_ust_libs="-llttng-ust"
      fi
      if $pkg_config liburcu-bp --exists; then
 -      urcu_bp_libs=`$pkg_config --libs liburcu-bp`
 +      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
      else
        urcu_bp_libs="-lurcu-bp"
      fi
@@@ -4528,25 -4512,17 +4514,38 @@@ if compile_prog "" "" ; the
      have_fsxattr=yes
  fi
  
++##########################################
++# check if rtnetlink.h exists and is useful
+ have_rtnetlink=no
+ cat > $TMPC << EOF
+ #include <linux/rtnetlink.h>
+ int main(void) {
+   return IFLA_PROTO_DOWN;
+ }
+ EOF
+ if compile_prog "" "" ; then
+     have_rtnetlink=yes
+ fi
 +#################################################
 +# Sparc implicitly links with --relax, which is
 +# incompatible with -r, so --no-relax should be
 +# given. It does no harm to give it on other
 +# platforms too.
 +
 +# Note: the prototype is needed since QEMU_CFLAGS
 +#       contains -Wmissing-prototypes
 +cat > $TMPC << EOF
 +extern int foo(void);
 +int foo(void) { return 0; }
 +EOF
 +if ! compile_object ""; then
 +  error_exit "Failed to compile object file for LD_REL_FLAGS test"
 +fi
 +if do_cc -nostdlib -Wl,-r -Wl,--no-relax -o $TMPMO $TMPO; then
 +  LD_REL_FLAGS="-Wl,--no-relax"
 +fi
 +
  ##########################################
  # End of CC checks
  # After here, no more $cc or $ld runs
@@@ -4691,10 -4667,10 +4690,10 @@@ if test "$guest_agent_msi" = "yes"; the
    fi
  
    if test "$QEMU_GA_VERSION" = ""; then
 -      QEMU_GA_VERSION=`cat $source_path/VERSION`
 +      QEMU_GA_VERSION=$(cat $source_path/VERSION)
    fi
  
 -  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=`$pkg_config --variable=prefix glib-2.0`/bin"
 +  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
  
    case "$cpu" in
    x86_64)
@@@ -4768,16 -4744,16 +4767,16 @@@ QEMU_CFLAGS="$pixman_cflags $fdt_cflag
  libs_softmmu="$pixman_libs $libs_softmmu"
  
  echo "Install prefix    $prefix"
 -echo "BIOS directory    `eval echo $qemu_datadir`"
 -echo "binary directory  `eval echo $bindir`"
 -echo "library directory `eval echo $libdir`"
 -echo "module directory  `eval echo $qemu_moddir`"
 -echo "libexec directory `eval echo $libexecdir`"
 -echo "include directory `eval echo $includedir`"
 -echo "config directory  `eval echo $sysconfdir`"
 +echo "BIOS directory    $(eval echo $qemu_datadir)"
 +echo "binary directory  $(eval echo $bindir)"
 +echo "library directory $(eval echo $libdir)"
 +echo "module directory  $(eval echo $qemu_moddir)"
 +echo "libexec directory $(eval echo $libexecdir)"
 +echo "include directory $(eval echo $includedir)"
 +echo "config directory  $(eval echo $sysconfdir)"
  if test "$mingw32" = "no" ; then
 -echo "local state directory   `eval echo $local_statedir`"
 -echo "Manual directory  `eval echo $mandir`"
 +echo "local state directory   $(eval echo $local_statedir)"
 +echo "Manual directory  $(eval echo $mandir)"
  echo "ELF interp prefix $interp_prefix"
  else
  echo "local state directory   queried at runtime"
@@@ -4812,16 -4788,16 +4811,16 @@@ if test "$darwin" = "yes" ; the
      echo "Cocoa support     $cocoa"
  fi
  echo "pixman            $pixman"
 -echo "SDL support       $sdl `echo_version $sdl $sdlversion`"
 -echo "GTK support       $gtk `echo_version $gtk $gtk_version`"
 +echo "SDL support       $sdl $(echo_version $sdl $sdlversion)"
 +echo "GTK support       $gtk $(echo_version $gtk $gtk_version)"
  echo "GTK GL support    $gtk_gl"
 -echo "VTE support       $vte `echo_version $vte $vteversion`"
 +echo "VTE support       $vte $(echo_version $vte $vteversion)"
  echo "GNUTLS support    $gnutls"
  echo "GNUTLS hash       $gnutls_hash"
  echo "GNUTLS rnd        $gnutls_rnd"
  echo "libgcrypt         $gcrypt"
  echo "libgcrypt kdf     $gcrypt_kdf"
 -echo "nettle            $nettle `echo_version $nettle $nettle_version`"
 +echo "nettle            $nettle $(echo_version $nettle $nettle_version)"
  echo "nettle kdf        $nettle_kdf"
  echo "libtasn1          $tasn1"
  echo "curses support    $curses"
@@@ -4872,7 -4848,7 +4871,7 @@@ echo "Trace backends    $trace_backends
  if have_backend "simple"; then
  echo "Trace output file $trace_file-<pid>"
  fi
 -echo "spice support     $spice `echo_version $spice $spice_protocol_version/$spice_server_version`"
 +echo "spice support     $spice $(echo_version $spice $spice_protocol_version/$spice_server_version)"
  echo "rbd support       $rbd"
  echo "xfsctl support    $xfs"
  echo "smartcard support $smartcard"
@@@ -4951,7 -4927,7 +4950,7 @@@ if test "$bigendian" = "yes" ; the
  fi
  if test "$mingw32" = "yes" ; then
    echo "CONFIG_WIN32=y" >> $config_host_mak
 -  rc_version=`cat $source_path/VERSION`
 +  rc_version=$(cat $source_path/VERSION)
    version_major=${rc_version%%.*}
    rc_version=${rc_version#*.}
    version_minor=${rc_version%%.*}
@@@ -5027,7 -5003,7 +5026,7 @@@ if test "$cap_ng" = "yes" ; the
  fi
  echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
  for drv in $audio_drv_list; do
 -    def=CONFIG_`echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]'`
 +    def=CONFIG_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
      echo "$def=y" >> $config_host_mak
  done
  if test "$audio_pt_int" = "yes" ; then
  if test "$xfs" = "yes" ; then
    echo "CONFIG_XFS=y" >> $config_host_mak
  fi
 -qemu_version=`head $source_path/VERSION`
 +qemu_version=$(head $source_path/VERSION)
  echo "VERSION=$qemu_version" >>$config_host_mak
  echo "PKGVERSION=$pkgversion" >>$config_host_mak
  echo "SRC_PATH=$source_path" >> $config_host_mak
  if test "$modules" = "yes"; then
    # $shacmd can generate a hash started with digit, which the compiler doesn't
    # like as an symbol. So prefix it with an underscore
 -  echo "CONFIG_STAMP=_`(echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ `" >> $config_host_mak
 +  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
    echo "CONFIG_MODULES=y" >> $config_host_mak
  fi
  if test "$sdl" = "yes" ; then
  if test "$epoll_create1" = "yes" ; then
    echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
  fi
- if test "$epoll_pwait" = "yes" ; then
-   echo "CONFIG_EPOLL_PWAIT=y" >> $config_host_mak
- fi
  if test "$sendfile" = "yes" ; then
    echo "CONFIG_SENDFILE=y" >> $config_host_mak
  fi
@@@ -5482,6 -5455,10 +5478,10 @@@ if test "$rdma" = "yes" ; the
    echo "CONFIG_RDMA=y" >> $config_host_mak
  fi
  
+ if test "$have_rtnetlink" = "yes" ; then
+   echo "CONFIG_RTNETLINK=y" >> $config_host_mak
+ fi
  # Hold two types of flag:
  #   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
  #                                     a thread we have a handle to
@@@ -5550,7 -5527,6 +5550,7 @@@ els
  fi
  echo "LDFLAGS=$LDFLAGS" >> $config_host_mak
  echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
 +echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak
  echo "LIBS+=$LIBS" >> $config_host_mak
  echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
  echo "EXESUF=$EXESUF" >> $config_host_mak
  for target in $target_list; do
  target_dir="$target"
  config_target_mak=$target_dir/config-target.mak
 -target_name=`echo $target | cut -d '-' -f 1`
 +target_name=$(echo $target | cut -d '-' -f 1)
  target_bigendian="no"
  
  case "$target_name" in
@@@ -5639,7 -5615,7 +5639,7 @@@ mkdir -p $target_di
  echo "# Automatically generated by configure - do not modify" > $config_target_mak
  
  bflt="no"
 -interp_prefix1=`echo "$interp_prefix" | sed "s/%M/$target_name/g"`
 +interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
  gdb_xml_files=""
  
  TARGET_ARCH="$target_name"
@@@ -5765,7 -5741,7 +5765,7 @@@ upper() 
      echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
  }
  
 -target_arch_name="`upper $TARGET_ARCH`"
 +target_arch_name="$(upper $TARGET_ARCH)"
  echo "TARGET_$target_arch_name=y" >> $config_target_mak
  echo "TARGET_NAME=$target_name" >> $config_target_mak
  echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
@@@ -5981,11 -5957,11 +5981,11 @@@ for bios_file in 
      $source_path/pc-bios/u-boot.* \
      $source_path/pc-bios/palcode-*
  do
 -    FILES="$FILES pc-bios/`basename $bios_file`"
 +    FILES="$FILES pc-bios/$(basename $bios_file)"
  done
 -for test_file in `find $source_path/tests/acpi-test-data -type f`
 +for test_file in $(find $source_path/tests/acpi-test-data -type f)
  do
 -    FILES="$FILES tests/acpi-test-data`echo $test_file | sed -e 's/.*acpi-test-data//'`"
 +    FILES="$FILES tests/acpi-test-data$(echo $test_file | sed -e 's/.*acpi-test-data//')"
  done
  mkdir -p $DIRS
  for f in $FILES ; do
diff --combined gdbstub.c
index 9d3951336f28ff04d0945bd1c9c8ed65beff3820,b3101bf865aa237120c4d2edd1ca66a0b32175fe..5da66f1794173740e5f85071a44d76725e18a89b
+++ b/gdbstub.c
@@@ -1493,19 -1493,6 +1493,6 @@@ void gdb_exit(CPUArchState *env, int co
  }
  
  #ifdef CONFIG_USER_ONLY
- int
- gdb_queuesig (void)
- {
-     GDBState *s;
-     s = gdbserver_state;
-     if (gdbserver_fd < 0 || s->fd < 0)
-         return 0;
-     else
-         return 1;
- }
  int
  gdb_handlesig(CPUState *cpu, int sig)
  {
@@@ -1631,7 -1618,7 +1618,7 @@@ static int gdbserver_open(int port
          close(fd);
          return -1;
      }
 -    ret = listen(fd, 0);
 +    ret = listen(fd, 1);
      if (ret < 0) {
          perror("listen");
          close(fd);
diff --combined linux-user/main.c
index 8a11d0219e6a77c0ef2b6a51465c8530c2f60775,150a356e8d1b7f583d625d10a9c633ec5a2a91b2..f8a8764ae97a69b21ab4c1148b60835c8c517469
@@@ -17,7 -17,6 +17,7 @@@
   *  along with this program; if not, see <http://www.gnu.org/licenses/>.
   */
  #include "qemu/osdep.h"
 +#include "qemu-version.h"
  #include <sys/mman.h>
  #include <sys/syscall.h>
  #include <sys/resource.h>
@@@ -131,7 -130,7 +131,7 @@@ void fork_end(int child
             Discard information about the parent threads.  */
          CPU_FOREACH_SAFE(cpu, next_cpu) {
              if (cpu != thread_cpu) {
-                 QTAILQ_REMOVE(&cpus, thread_cpu, node);
+                 QTAILQ_REMOVE(&cpus, cpu, node);
              }
          }
          pending_cpus = 0;
@@@ -3795,14 -3794,7 +3795,7 @@@ void stop_all_tasks(void
  /* Assumes contents are already zeroed.  */
  void init_task_state(TaskState *ts)
  {
-     int i;
-  
      ts->used = 1;
-     ts->first_free = ts->sigqueue_table;
-     for (i = 0; i < MAX_SIGQUEUE_SIZE - 1; i++) {
-         ts->sigqueue_table[i].next = &ts->sigqueue_table[i + 1];
-     }
-     ts->sigqueue_table[i].next = NULL;
  }
  
  CPUArchState *cpu_copy(CPUArchState *env)
diff --combined linux-user/syscall.c
index 96ec80124044b9b2f9527c4933c8e7bf29bbac2b,bd8095c819aef269d9ae49afbbd06557cdcf43b4..71ccbd9c5e30bc7e101a6df1bcafa05ea815f100
@@@ -101,6 -101,11 +101,11 @@@ int __clone2(int (*fn)(void *), void *c
  #include <linux/route.h>
  #include <linux/filter.h>
  #include <linux/blkpg.h>
+ #include <linux/netlink.h>
+ #ifdef CONFIG_RTNETLINK
+ #include <linux/rtnetlink.h>
+ #endif
+ #include <linux/audit.h>
  #include "linux_loop.h"
  #include "uname.h"
  
  #define       VFAT_IOCTL_READDIR_BOTH         _IOR('r', 1, struct linux_dirent [2])
  #define       VFAT_IOCTL_READDIR_SHORT        _IOR('r', 2, struct linux_dirent [2])
  
+ /* This is the size of the host kernel's sigset_t, needed where we make
+  * direct system calls that take a sigset_t pointer and a size.
+  */
+ #define SIGSET_T_SIZE (_NSIG / 8)
  
  #undef _syscall0
  #undef _syscall1
@@@ -182,8 -191,6 +191,6 @@@ static type name (type1 arg1,type2 arg2
  #define __NR_sys_getpriority __NR_getpriority
  #define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
  #define __NR_sys_syslog __NR_syslog
- #define __NR_sys_tgkill __NR_tgkill
- #define __NR_sys_tkill __NR_tkill
  #define __NR_sys_futex __NR_futex
  #define __NR_sys_inotify_init __NR_inotify_init
  #define __NR_sys_inotify_add_watch __NR_inotify_add_watch
@@@ -221,12 -228,6 +228,6 @@@ _syscall5(int, _llseek,  uint,  fd, ulo
  #endif
  _syscall3(int,sys_rt_sigqueueinfo,int,pid,int,sig,siginfo_t *,uinfo)
  _syscall3(int,sys_syslog,int,type,char*,bufp,int,len)
- #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill)
- _syscall3(int,sys_tgkill,int,tgid,int,pid,int,sig)
- #endif
- #if defined(TARGET_NR_tkill) && defined(__NR_tkill)
- _syscall2(int,sys_tkill,int,tid,int,sig)
- #endif
  #ifdef __NR_exit_group
  _syscall1(int,exit_group,int,error_code)
  #endif
@@@ -304,6 -305,14 +305,14 @@@ static TargetFdTrans **target_fd_trans
  
  static unsigned int target_fd_max;
  
+ static TargetFdDataFunc fd_trans_target_to_host_data(int fd)
+ {
+     if (fd >= 0 && fd < target_fd_max && target_fd_trans[fd]) {
+         return target_fd_trans[fd]->target_to_host_data;
+     }
+     return NULL;
+ }
  static TargetFdDataFunc fd_trans_host_to_target_data(int fd)
  {
      if (fd >= 0 && fd < target_fd_max && target_fd_trans[fd]) {
@@@ -420,16 -429,6 +429,6 @@@ static int sys_inotify_init1(int flags
  #undef TARGET_NR_inotify_rm_watch
  #endif /* CONFIG_INOTIFY  */
  
- #if defined(TARGET_NR_ppoll)
- #ifndef __NR_ppoll
- # define __NR_ppoll -1
- #endif
- #define __NR_sys_ppoll __NR_ppoll
- _syscall5(int, sys_ppoll, struct pollfd *, fds, nfds_t, nfds,
-           struct timespec *, timeout, const sigset_t *, sigmask,
-           size_t, sigsetsize)
- #endif
  #if defined(TARGET_NR_prlimit64)
  #ifndef __NR_prlimit64
  # define __NR_prlimit64 -1
@@@ -631,8 -630,15 +630,15 @@@ static inline int is_error(abi_long ret
      return (abi_ulong)ret >= (abi_ulong)(-4096);
  }
  
- char *target_strerror(int err)
+ const char *target_strerror(int err)
  {
+     if (err == TARGET_ERESTARTSYS) {
+         return "To be restarted";
+     }
+     if (err == TARGET_QEMU_ESIGRETURN) {
+         return "Successful exit from sigreturn";
+     }
      if ((err >= ERRNO_TABLE_SIZE) || (err < 0)) {
          return NULL;
      }
@@@ -697,8 -703,87 +703,87 @@@ safe_syscall5(int, waitid, idtype_t, id
  safe_syscall3(int, execve, const char *, filename, char **, argv, char **, envp)
  safe_syscall6(int, pselect6, int, nfds, fd_set *, readfds, fd_set *, writefds, \
                fd_set *, exceptfds, struct timespec *, timeout, void *, sig)
+ safe_syscall5(int, ppoll, struct pollfd *, ufds, unsigned int, nfds,
+               struct timespec *, tsp, const sigset_t *, sigmask,
+               size_t, sigsetsize)
+ safe_syscall6(int, epoll_pwait, int, epfd, struct epoll_event *, events,
+               int, maxevents, int, timeout, const sigset_t *, sigmask,
+               size_t, sigsetsize)
  safe_syscall6(int,futex,int *,uaddr,int,op,int,val, \
                const struct timespec *,timeout,int *,uaddr2,int,val3)
+ safe_syscall2(int, rt_sigsuspend, sigset_t *, newset, size_t, sigsetsize)
+ safe_syscall2(int, kill, pid_t, pid, int, sig)
+ safe_syscall2(int, tkill, int, tid, int, sig)
+ safe_syscall3(int, tgkill, int, tgid, int, pid, int, sig)
+ safe_syscall3(ssize_t, readv, int, fd, const struct iovec *, iov, int, iovcnt)
+ safe_syscall3(ssize_t, writev, int, fd, const struct iovec *, iov, int, iovcnt)
+ safe_syscall3(int, connect, int, fd, const struct sockaddr *, addr,
+               socklen_t, addrlen)
+ safe_syscall6(ssize_t, sendto, int, fd, const void *, buf, size_t, len,
+               int, flags, const struct sockaddr *, addr, socklen_t, addrlen)
+ safe_syscall6(ssize_t, recvfrom, int, fd, void *, buf, size_t, len,
+               int, flags, struct sockaddr *, addr, socklen_t *, addrlen)
+ safe_syscall3(ssize_t, sendmsg, int, fd, const struct msghdr *, msg, int, flags)
+ safe_syscall3(ssize_t, recvmsg, int, fd, struct msghdr *, msg, int, flags)
+ safe_syscall2(int, flock, int, fd, int, operation)
+ safe_syscall4(int, rt_sigtimedwait, const sigset_t *, these, siginfo_t *, uinfo,
+               const struct timespec *, uts, size_t, sigsetsize)
+ safe_syscall4(int, accept4, int, fd, struct sockaddr *, addr, socklen_t *, len,
+               int, flags)
+ safe_syscall2(int, nanosleep, const struct timespec *, req,
+               struct timespec *, rem)
+ #ifdef TARGET_NR_clock_nanosleep
+ safe_syscall4(int, clock_nanosleep, const clockid_t, clock, int, flags,
+               const struct timespec *, req, struct timespec *, rem)
+ #endif
+ #ifdef __NR_msgsnd
+ safe_syscall4(int, msgsnd, int, msgid, const void *, msgp, size_t, sz,
+               int, flags)
+ safe_syscall5(int, msgrcv, int, msgid, void *, msgp, size_t, sz,
+               long, msgtype, int, flags)
+ safe_syscall4(int, semtimedop, int, semid, struct sembuf *, tsops,
+               unsigned, nsops, const struct timespec *, timeout)
+ #else
+ /* This host kernel architecture uses a single ipc syscall; fake up
+  * wrappers for the sub-operations to hide this implementation detail.
+  * Annoyingly we can't include linux/ipc.h to get the constant definitions
+  * for the call parameter because some structs in there conflict with the
+  * sys/ipc.h ones. So we just define them here, and rely on them being
+  * the same for all host architectures.
+  */
+ #define Q_SEMTIMEDOP 4
+ #define Q_MSGSND 11
+ #define Q_MSGRCV 12
+ #define Q_IPCCALL(VERSION, OP) ((VERSION) << 16 | (OP))
+ safe_syscall6(int, ipc, int, call, long, first, long, second, long, third,
+               void *, ptr, long, fifth)
+ static int safe_msgsnd(int msgid, const void *msgp, size_t sz, int flags)
+ {
+     return safe_ipc(Q_IPCCALL(0, Q_MSGSND), msgid, sz, flags, (void *)msgp, 0);
+ }
+ static int safe_msgrcv(int msgid, void *msgp, size_t sz, long type, int flags)
+ {
+     return safe_ipc(Q_IPCCALL(1, Q_MSGRCV), msgid, sz, flags, msgp, type);
+ }
+ static int safe_semtimedop(int semid, struct sembuf *tsops, unsigned nsops,
+                            const struct timespec *timeout)
+ {
+     return safe_ipc(Q_IPCCALL(0, Q_SEMTIMEDOP), semid, nsops, 0, tsops,
+                     (long)timeout);
+ }
+ #endif
+ #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
+ safe_syscall5(int, mq_timedsend, int, mqdes, const char *, msg_ptr,
+               size_t, len, unsigned, prio, const struct timespec *, timeout)
+ safe_syscall5(int, mq_timedreceive, int, mqdes, char *, msg_ptr,
+               size_t, len, unsigned *, prio, const struct timespec *, timeout)
+ #endif
+ /* We do ioctl like this rather than via safe_syscall3 to preserve the
+  * "third argument might be integer or pointer or not present" behaviour of
+  * the libc function.
+  */
+ #define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__)
  
  static inline int host_to_target_sock_type(int host_type)
  {
@@@ -829,7 -914,7 +914,7 @@@ static inline abi_long copy_from_user_f
      int i, nw, j, k;
      abi_ulong b, *target_fds;
  
 -    nw = (n + TARGET_ABI_BITS - 1) / TARGET_ABI_BITS;
 +    nw = DIV_ROUND_UP(n, TARGET_ABI_BITS);
      if (!(target_fds = lock_user(VERIFY_READ,
                                   target_fds_addr,
                                   sizeof(abi_ulong) * nw,
@@@ -876,7 -961,7 +961,7 @@@ static inline abi_long copy_to_user_fds
      abi_long v;
      abi_ulong *target_fds;
  
 -    nw = (n + TARGET_ABI_BITS - 1) / TARGET_ABI_BITS;
 +    nw = DIV_ROUND_UP(n, TARGET_ABI_BITS);
      if (!(target_fds = lock_user(VERIFY_WRITE,
                                   target_fds_addr,
                                   sizeof(abi_ulong) * nw,
@@@ -1261,7 -1346,13 +1346,13 @@@ static inline abi_long target_to_host_s
  
      memcpy(addr, target_saddr, len);
      addr->sa_family = sa_family;
-     if (sa_family == AF_PACKET) {
+     if (sa_family == AF_NETLINK) {
+         struct sockaddr_nl *nladdr;
+         nladdr = (struct sockaddr_nl *)addr;
+         nladdr->nl_pid = tswap32(nladdr->nl_pid);
+         nladdr->nl_groups = tswap32(nladdr->nl_groups);
+     } else if (sa_family == AF_PACKET) {
        struct target_sockaddr_ll *lladdr;
  
        lladdr = (struct target_sockaddr_ll *)addr;
@@@ -1284,6 -1375,11 +1375,11 @@@ static inline abi_long host_to_target_s
          return -TARGET_EFAULT;
      memcpy(target_saddr, addr, len);
      target_saddr->sa_family = tswap16(addr->sa_family);
+     if (addr->sa_family == AF_NETLINK) {
+         struct sockaddr_nl *target_nl = (struct sockaddr_nl *)target_saddr;
+         target_nl->nl_pid = tswap32(target_nl->nl_pid);
+         target_nl->nl_groups = tswap32(target_nl->nl_groups);
+     }
      unlock_user(target_saddr, target_addr, len);
  
      return 0;
@@@ -1515,6 -1611,551 +1611,551 @@@ static inline abi_long host_to_target_c
      return 0;
  }
  
+ static void tswap_nlmsghdr(struct nlmsghdr *nlh)
+ {
+     nlh->nlmsg_len = tswap32(nlh->nlmsg_len);
+     nlh->nlmsg_type = tswap16(nlh->nlmsg_type);
+     nlh->nlmsg_flags = tswap16(nlh->nlmsg_flags);
+     nlh->nlmsg_seq = tswap32(nlh->nlmsg_seq);
+     nlh->nlmsg_pid = tswap32(nlh->nlmsg_pid);
+ }
+ static abi_long host_to_target_for_each_nlmsg(struct nlmsghdr *nlh,
+                                               size_t len,
+                                               abi_long (*host_to_target_nlmsg)
+                                                        (struct nlmsghdr *))
+ {
+     uint32_t nlmsg_len;
+     abi_long ret;
+     while (len > sizeof(struct nlmsghdr)) {
+         nlmsg_len = nlh->nlmsg_len;
+         if (nlmsg_len < sizeof(struct nlmsghdr) ||
+             nlmsg_len > len) {
+             break;
+         }
+         switch (nlh->nlmsg_type) {
+         case NLMSG_DONE:
+             tswap_nlmsghdr(nlh);
+             return 0;
+         case NLMSG_NOOP:
+             break;
+         case NLMSG_ERROR:
+         {
+             struct nlmsgerr *e = NLMSG_DATA(nlh);
+             e->error = tswap32(e->error);
+             tswap_nlmsghdr(&e->msg);
+             tswap_nlmsghdr(nlh);
+             return 0;
+         }
+         default:
+             ret = host_to_target_nlmsg(nlh);
+             if (ret < 0) {
+                 tswap_nlmsghdr(nlh);
+                 return ret;
+             }
+             break;
+         }
+         tswap_nlmsghdr(nlh);
+         len -= NLMSG_ALIGN(nlmsg_len);
+         nlh = (struct nlmsghdr *)(((char*)nlh) + NLMSG_ALIGN(nlmsg_len));
+     }
+     return 0;
+ }
+ static abi_long target_to_host_for_each_nlmsg(struct nlmsghdr *nlh,
+                                               size_t len,
+                                               abi_long (*target_to_host_nlmsg)
+                                                        (struct nlmsghdr *))
+ {
+     int ret;
+     while (len > sizeof(struct nlmsghdr)) {
+         if (tswap32(nlh->nlmsg_len) < sizeof(struct nlmsghdr) ||
+             tswap32(nlh->nlmsg_len) > len) {
+             break;
+         }
+         tswap_nlmsghdr(nlh);
+         switch (nlh->nlmsg_type) {
+         case NLMSG_DONE:
+             return 0;
+         case NLMSG_NOOP:
+             break;
+         case NLMSG_ERROR:
+         {
+             struct nlmsgerr *e = NLMSG_DATA(nlh);
+             e->error = tswap32(e->error);
+             tswap_nlmsghdr(&e->msg);
+         }
+         default:
+             ret = target_to_host_nlmsg(nlh);
+             if (ret < 0) {
+                 return ret;
+             }
+         }
+         len -= NLMSG_ALIGN(nlh->nlmsg_len);
+         nlh = (struct nlmsghdr *)(((char *)nlh) + NLMSG_ALIGN(nlh->nlmsg_len));
+     }
+     return 0;
+ }
+ #ifdef CONFIG_RTNETLINK
+ static abi_long host_to_target_for_each_rtattr(struct rtattr *rtattr,
+                                                size_t len,
+                                                abi_long (*host_to_target_rtattr)
+                                                         (struct rtattr *))
+ {
+     unsigned short rta_len;
+     abi_long ret;
+     while (len > sizeof(struct rtattr)) {
+         rta_len = rtattr->rta_len;
+         if (rta_len < sizeof(struct rtattr) ||
+             rta_len > len) {
+             break;
+         }
+         ret = host_to_target_rtattr(rtattr);
+         rtattr->rta_len = tswap16(rtattr->rta_len);
+         rtattr->rta_type = tswap16(rtattr->rta_type);
+         if (ret < 0) {
+             return ret;
+         }
+         len -= RTA_ALIGN(rta_len);
+         rtattr = (struct rtattr *)(((char *)rtattr) + RTA_ALIGN(rta_len));
+     }
+     return 0;
+ }
+ static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
+ {
+     uint32_t *u32;
+     struct rtnl_link_stats *st;
+     struct rtnl_link_stats64 *st64;
+     struct rtnl_link_ifmap *map;
+     switch (rtattr->rta_type) {
+     /* binary stream */
+     case IFLA_ADDRESS:
+     case IFLA_BROADCAST:
+     /* string */
+     case IFLA_IFNAME:
+     case IFLA_QDISC:
+         break;
+     /* uin8_t */
+     case IFLA_OPERSTATE:
+     case IFLA_LINKMODE:
+     case IFLA_CARRIER:
+     case IFLA_PROTO_DOWN:
+         break;
+     /* uint32_t */
+     case IFLA_MTU:
+     case IFLA_LINK:
+     case IFLA_WEIGHT:
+     case IFLA_TXQLEN:
+     case IFLA_CARRIER_CHANGES:
+     case IFLA_NUM_RX_QUEUES:
+     case IFLA_NUM_TX_QUEUES:
+     case IFLA_PROMISCUITY:
+     case IFLA_EXT_MASK:
+     case IFLA_LINK_NETNSID:
+     case IFLA_GROUP:
+     case IFLA_MASTER:
+     case IFLA_NUM_VF:
+         u32 = RTA_DATA(rtattr);
+         *u32 = tswap32(*u32);
+         break;
+     /* struct rtnl_link_stats */
+     case IFLA_STATS:
+         st = RTA_DATA(rtattr);
+         st->rx_packets = tswap32(st->rx_packets);
+         st->tx_packets = tswap32(st->tx_packets);
+         st->rx_bytes = tswap32(st->rx_bytes);
+         st->tx_bytes = tswap32(st->tx_bytes);
+         st->rx_errors = tswap32(st->rx_errors);
+         st->tx_errors = tswap32(st->tx_errors);
+         st->rx_dropped = tswap32(st->rx_dropped);
+         st->tx_dropped = tswap32(st->tx_dropped);
+         st->multicast = tswap32(st->multicast);
+         st->collisions = tswap32(st->collisions);
+         /* detailed rx_errors: */
+         st->rx_length_errors = tswap32(st->rx_length_errors);
+         st->rx_over_errors = tswap32(st->rx_over_errors);
+         st->rx_crc_errors = tswap32(st->rx_crc_errors);
+         st->rx_frame_errors = tswap32(st->rx_frame_errors);
+         st->rx_fifo_errors = tswap32(st->rx_fifo_errors);
+         st->rx_missed_errors = tswap32(st->rx_missed_errors);
+         /* detailed tx_errors */
+         st->tx_aborted_errors = tswap32(st->tx_aborted_errors);
+         st->tx_carrier_errors = tswap32(st->tx_carrier_errors);
+         st->tx_fifo_errors = tswap32(st->tx_fifo_errors);
+         st->tx_heartbeat_errors = tswap32(st->tx_heartbeat_errors);
+         st->tx_window_errors = tswap32(st->tx_window_errors);
+         /* for cslip etc */
+         st->rx_compressed = tswap32(st->rx_compressed);
+         st->tx_compressed = tswap32(st->tx_compressed);
+         break;
+     /* struct rtnl_link_stats64 */
+     case IFLA_STATS64:
+         st64 = RTA_DATA(rtattr);
+         st64->rx_packets = tswap64(st64->rx_packets);
+         st64->tx_packets = tswap64(st64->tx_packets);
+         st64->rx_bytes = tswap64(st64->rx_bytes);
+         st64->tx_bytes = tswap64(st64->tx_bytes);
+         st64->rx_errors = tswap64(st64->rx_errors);
+         st64->tx_errors = tswap64(st64->tx_errors);
+         st64->rx_dropped = tswap64(st64->rx_dropped);
+         st64->tx_dropped = tswap64(st64->tx_dropped);
+         st64->multicast = tswap64(st64->multicast);
+         st64->collisions = tswap64(st64->collisions);
+         /* detailed rx_errors: */
+         st64->rx_length_errors = tswap64(st64->rx_length_errors);
+         st64->rx_over_errors = tswap64(st64->rx_over_errors);
+         st64->rx_crc_errors = tswap64(st64->rx_crc_errors);
+         st64->rx_frame_errors = tswap64(st64->rx_frame_errors);
+         st64->rx_fifo_errors = tswap64(st64->rx_fifo_errors);
+         st64->rx_missed_errors = tswap64(st64->rx_missed_errors);
+         /* detailed tx_errors */
+         st64->tx_aborted_errors = tswap64(st64->tx_aborted_errors);
+         st64->tx_carrier_errors = tswap64(st64->tx_carrier_errors);
+         st64->tx_fifo_errors = tswap64(st64->tx_fifo_errors);
+         st64->tx_heartbeat_errors = tswap64(st64->tx_heartbeat_errors);
+         st64->tx_window_errors = tswap64(st64->tx_window_errors);
+         /* for cslip etc */
+         st64->rx_compressed = tswap64(st64->rx_compressed);
+         st64->tx_compressed = tswap64(st64->tx_compressed);
+         break;
+     /* struct rtnl_link_ifmap */
+     case IFLA_MAP:
+         map = RTA_DATA(rtattr);
+         map->mem_start = tswap64(map->mem_start);
+         map->mem_end = tswap64(map->mem_end);
+         map->base_addr = tswap64(map->base_addr);
+         map->irq = tswap16(map->irq);
+         break;
+     /* nested */
+     case IFLA_AF_SPEC:
+     case IFLA_LINKINFO:
+         /* FIXME: implement nested type */
+         gemu_log("Unimplemented nested type %d\n", rtattr->rta_type);
+         break;
+     default:
+         gemu_log("Unknown host IFLA type: %d\n", rtattr->rta_type);
+         break;
+     }
+     return 0;
+ }
+ static abi_long host_to_target_data_addr_rtattr(struct rtattr *rtattr)
+ {
+     uint32_t *u32;
+     struct ifa_cacheinfo *ci;
+     switch (rtattr->rta_type) {
+     /* binary: depends on family type */
+     case IFA_ADDRESS:
+     case IFA_LOCAL:
+         break;
+     /* string */
+     case IFA_LABEL:
+         break;
+     /* u32 */
+     case IFA_FLAGS:
+     case IFA_BROADCAST:
+         u32 = RTA_DATA(rtattr);
+         *u32 = tswap32(*u32);
+         break;
+     /* struct ifa_cacheinfo */
+     case IFA_CACHEINFO:
+         ci = RTA_DATA(rtattr);
+         ci->ifa_prefered = tswap32(ci->ifa_prefered);
+         ci->ifa_valid = tswap32(ci->ifa_valid);
+         ci->cstamp = tswap32(ci->cstamp);
+         ci->tstamp = tswap32(ci->tstamp);
+         break;
+     default:
+         gemu_log("Unknown host IFA type: %d\n", rtattr->rta_type);
+         break;
+     }
+     return 0;
+ }
+ static abi_long host_to_target_data_route_rtattr(struct rtattr *rtattr)
+ {
+     uint32_t *u32;
+     switch (rtattr->rta_type) {
+     /* binary: depends on family type */
+     case RTA_GATEWAY:
+     case RTA_DST:
+     case RTA_PREFSRC:
+         break;
+     /* u32 */
+     case RTA_PRIORITY:
+     case RTA_TABLE:
+     case RTA_OIF:
+         u32 = RTA_DATA(rtattr);
+         *u32 = tswap32(*u32);
+         break;
+     default:
+         gemu_log("Unknown host RTA type: %d\n", rtattr->rta_type);
+         break;
+     }
+     return 0;
+ }
+ static abi_long host_to_target_link_rtattr(struct rtattr *rtattr,
+                                          uint32_t rtattr_len)
+ {
+     return host_to_target_for_each_rtattr(rtattr, rtattr_len,
+                                           host_to_target_data_link_rtattr);
+ }
+ static abi_long host_to_target_addr_rtattr(struct rtattr *rtattr,
+                                          uint32_t rtattr_len)
+ {
+     return host_to_target_for_each_rtattr(rtattr, rtattr_len,
+                                           host_to_target_data_addr_rtattr);
+ }
+ static abi_long host_to_target_route_rtattr(struct rtattr *rtattr,
+                                          uint32_t rtattr_len)
+ {
+     return host_to_target_for_each_rtattr(rtattr, rtattr_len,
+                                           host_to_target_data_route_rtattr);
+ }
+ static abi_long host_to_target_data_route(struct nlmsghdr *nlh)
+ {
+     uint32_t nlmsg_len;
+     struct ifinfomsg *ifi;
+     struct ifaddrmsg *ifa;
+     struct rtmsg *rtm;
+     nlmsg_len = nlh->nlmsg_len;
+     switch (nlh->nlmsg_type) {
+     case RTM_NEWLINK:
+     case RTM_DELLINK:
+     case RTM_GETLINK:
+         ifi = NLMSG_DATA(nlh);
+         ifi->ifi_type = tswap16(ifi->ifi_type);
+         ifi->ifi_index = tswap32(ifi->ifi_index);
+         ifi->ifi_flags = tswap32(ifi->ifi_flags);
+         ifi->ifi_change = tswap32(ifi->ifi_change);
+         host_to_target_link_rtattr(IFLA_RTA(ifi),
+                                    nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)));
+         break;
+     case RTM_NEWADDR:
+     case RTM_DELADDR:
+     case RTM_GETADDR:
+         ifa = NLMSG_DATA(nlh);
+         ifa->ifa_index = tswap32(ifa->ifa_index);
+         host_to_target_addr_rtattr(IFA_RTA(ifa),
+                                    nlmsg_len - NLMSG_LENGTH(sizeof(*ifa)));
+         break;
+     case RTM_NEWROUTE:
+     case RTM_DELROUTE:
+     case RTM_GETROUTE:
+         rtm = NLMSG_DATA(nlh);
+         rtm->rtm_flags = tswap32(rtm->rtm_flags);
+         host_to_target_route_rtattr(RTM_RTA(rtm),
+                                     nlmsg_len - NLMSG_LENGTH(sizeof(*rtm)));
+         break;
+     default:
+         return -TARGET_EINVAL;
+     }
+     return 0;
+ }
+ static inline abi_long host_to_target_nlmsg_route(struct nlmsghdr *nlh,
+                                                   size_t len)
+ {
+     return host_to_target_for_each_nlmsg(nlh, len, host_to_target_data_route);
+ }
+ static abi_long target_to_host_for_each_rtattr(struct rtattr *rtattr,
+                                                size_t len,
+                                                abi_long (*target_to_host_rtattr)
+                                                         (struct rtattr *))
+ {
+     abi_long ret;
+     while (len >= sizeof(struct rtattr)) {
+         if (tswap16(rtattr->rta_len) < sizeof(struct rtattr) ||
+             tswap16(rtattr->rta_len) > len) {
+             break;
+         }
+         rtattr->rta_len = tswap16(rtattr->rta_len);
+         rtattr->rta_type = tswap16(rtattr->rta_type);
+         ret = target_to_host_rtattr(rtattr);
+         if (ret < 0) {
+             return ret;
+         }
+         len -= RTA_ALIGN(rtattr->rta_len);
+         rtattr = (struct rtattr *)(((char *)rtattr) +
+                  RTA_ALIGN(rtattr->rta_len));
+     }
+     return 0;
+ }
+ static abi_long target_to_host_data_link_rtattr(struct rtattr *rtattr)
+ {
+     switch (rtattr->rta_type) {
+     default:
+         gemu_log("Unknown target IFLA type: %d\n", rtattr->rta_type);
+         break;
+     }
+     return 0;
+ }
+ static abi_long target_to_host_data_addr_rtattr(struct rtattr *rtattr)
+ {
+     switch (rtattr->rta_type) {
+     /* binary: depends on family type */
+     case IFA_LOCAL:
+     case IFA_ADDRESS:
+         break;
+     default:
+         gemu_log("Unknown target IFA type: %d\n", rtattr->rta_type);
+         break;
+     }
+     return 0;
+ }
+ static abi_long target_to_host_data_route_rtattr(struct rtattr *rtattr)
+ {
+     uint32_t *u32;
+     switch (rtattr->rta_type) {
+     /* binary: depends on family type */
+     case RTA_DST:
+     case RTA_SRC:
+     case RTA_GATEWAY:
+         break;
+     /* u32 */
+     case RTA_OIF:
+         u32 = RTA_DATA(rtattr);
+         *u32 = tswap32(*u32);
+         break;
+     default:
+         gemu_log("Unknown target RTA type: %d\n", rtattr->rta_type);
+         break;
+     }
+     return 0;
+ }
+ static void target_to_host_link_rtattr(struct rtattr *rtattr,
+                                        uint32_t rtattr_len)
+ {
+     target_to_host_for_each_rtattr(rtattr, rtattr_len,
+                                    target_to_host_data_link_rtattr);
+ }
+ static void target_to_host_addr_rtattr(struct rtattr *rtattr,
+                                      uint32_t rtattr_len)
+ {
+     target_to_host_for_each_rtattr(rtattr, rtattr_len,
+                                    target_to_host_data_addr_rtattr);
+ }
+ static void target_to_host_route_rtattr(struct rtattr *rtattr,
+                                      uint32_t rtattr_len)
+ {
+     target_to_host_for_each_rtattr(rtattr, rtattr_len,
+                                    target_to_host_data_route_rtattr);
+ }
+ static abi_long target_to_host_data_route(struct nlmsghdr *nlh)
+ {
+     struct ifinfomsg *ifi;
+     struct ifaddrmsg *ifa;
+     struct rtmsg *rtm;
+     switch (nlh->nlmsg_type) {
+     case RTM_GETLINK:
+         break;
+     case RTM_NEWLINK:
+     case RTM_DELLINK:
+         ifi = NLMSG_DATA(nlh);
+         ifi->ifi_type = tswap16(ifi->ifi_type);
+         ifi->ifi_index = tswap32(ifi->ifi_index);
+         ifi->ifi_flags = tswap32(ifi->ifi_flags);
+         ifi->ifi_change = tswap32(ifi->ifi_change);
+         target_to_host_link_rtattr(IFLA_RTA(ifi), nlh->nlmsg_len -
+                                    NLMSG_LENGTH(sizeof(*ifi)));
+         break;
+     case RTM_GETADDR:
+     case RTM_NEWADDR:
+     case RTM_DELADDR:
+         ifa = NLMSG_DATA(nlh);
+         ifa->ifa_index = tswap32(ifa->ifa_index);
+         target_to_host_addr_rtattr(IFA_RTA(ifa), nlh->nlmsg_len -
+                                    NLMSG_LENGTH(sizeof(*ifa)));
+         break;
+     case RTM_GETROUTE:
+         break;
+     case RTM_NEWROUTE:
+     case RTM_DELROUTE:
+         rtm = NLMSG_DATA(nlh);
+         rtm->rtm_flags = tswap32(rtm->rtm_flags);
+         target_to_host_route_rtattr(RTM_RTA(rtm), nlh->nlmsg_len -
+                                     NLMSG_LENGTH(sizeof(*rtm)));
+         break;
+     default:
+         return -TARGET_EOPNOTSUPP;
+     }
+     return 0;
+ }
+ static abi_long target_to_host_nlmsg_route(struct nlmsghdr *nlh, size_t len)
+ {
+     return target_to_host_for_each_nlmsg(nlh, len, target_to_host_data_route);
+ }
+ #endif /* CONFIG_RTNETLINK */
+ static abi_long host_to_target_data_audit(struct nlmsghdr *nlh)
+ {
+     switch (nlh->nlmsg_type) {
+     default:
+         gemu_log("Unknown host audit message type %d\n",
+                  nlh->nlmsg_type);
+         return -TARGET_EINVAL;
+     }
+     return 0;
+ }
+ static inline abi_long host_to_target_nlmsg_audit(struct nlmsghdr *nlh,
+                                                   size_t len)
+ {
+     return host_to_target_for_each_nlmsg(nlh, len, host_to_target_data_audit);
+ }
+ static abi_long target_to_host_data_audit(struct nlmsghdr *nlh)
+ {
+     switch (nlh->nlmsg_type) {
+     case AUDIT_USER:
+     case AUDIT_FIRST_USER_MSG ... AUDIT_LAST_USER_MSG:
+     case AUDIT_FIRST_USER_MSG2 ... AUDIT_LAST_USER_MSG2:
+         break;
+     default:
+         gemu_log("Unknown target audit message type %d\n",
+                  nlh->nlmsg_type);
+         return -TARGET_EINVAL;
+     }
+     return 0;
+ }
+ static abi_long target_to_host_nlmsg_audit(struct nlmsghdr *nlh, size_t len)
+ {
+     return target_to_host_for_each_nlmsg(nlh, len, target_to_host_data_audit);
+ }
  /* do_setsockopt() Must return target values and target errnos. */
  static abi_long do_setsockopt(int sockfd, int level, int optname,
                                abi_ulong optval_addr, socklen_t optlen)
@@@ -2165,6 -2806,38 +2806,38 @@@ static TargetFdTrans target_packet_tran
      .target_to_host_addr = packet_target_to_host_sockaddr,
  };
  
+ #ifdef CONFIG_RTNETLINK
+ static abi_long netlink_route_target_to_host(void *buf, size_t len)
+ {
+     return target_to_host_nlmsg_route(buf, len);
+ }
+ static abi_long netlink_route_host_to_target(void *buf, size_t len)
+ {
+     return host_to_target_nlmsg_route(buf, len);
+ }
+ static TargetFdTrans target_netlink_route_trans = {
+     .target_to_host_data = netlink_route_target_to_host,
+     .host_to_target_data = netlink_route_host_to_target,
+ };
+ #endif /* CONFIG_RTNETLINK */
+ static abi_long netlink_audit_target_to_host(void *buf, size_t len)
+ {
+     return target_to_host_nlmsg_audit(buf, len);
+ }
+ static abi_long netlink_audit_host_to_target(void *buf, size_t len)
+ {
+     return host_to_target_nlmsg_audit(buf, len);
+ }
+ static TargetFdTrans target_netlink_audit_trans = {
+     .target_to_host_data = netlink_audit_target_to_host,
+     .host_to_target_data = netlink_audit_host_to_target,
+ };
  /* do_socket() Must return target values and target errnos. */
  static abi_long do_socket(int domain, int type, int protocol)
  {
          return ret;
      }
  
-     if (domain == PF_NETLINK)
-         return -TARGET_EAFNOSUPPORT;
+     if (domain == PF_NETLINK && !(
+ #ifdef CONFIG_RTNETLINK
+          protocol == NETLINK_ROUTE ||
+ #endif
+          protocol == NETLINK_KOBJECT_UEVENT ||
+          protocol == NETLINK_AUDIT)) {
+         return -EPFNOSUPPORT;
+     }
  
      if (domain == AF_PACKET ||
          (domain == AF_INET && type == SOCK_PACKET)) {
               * if socket type is SOCK_PACKET, bind by name
               */
              fd_trans_register(ret, &target_packet_trans);
+         } else if (domain == PF_NETLINK) {
+             switch (protocol) {
+ #ifdef CONFIG_RTNETLINK
+             case NETLINK_ROUTE:
+                 fd_trans_register(ret, &target_netlink_route_trans);
+                 break;
+ #endif
+             case NETLINK_KOBJECT_UEVENT:
+                 /* nothing to do: messages are strings */
+                 break;
+             case NETLINK_AUDIT:
+                 fd_trans_register(ret, &target_netlink_audit_trans);
+                 break;
+             default:
+                 g_assert_not_reached();
+             }
          }
      }
      return ret;
@@@ -2234,7 -2929,7 +2929,7 @@@ static abi_long do_connect(int sockfd, 
      if (ret)
          return ret;
  
-     return get_errno(connect(sockfd, addr, addrlen));
+     return get_errno(safe_connect(sockfd, addr, addrlen));
  }
  
  /* do_sendrecvmsg_locked() Must return target values and target errnos. */
@@@ -2276,14 -2971,25 +2971,25 @@@ static abi_long do_sendrecvmsg_locked(i
      msg.msg_iov = vec;
  
      if (send) {
-         ret = target_to_host_cmsg(&msg, msgp);
-         if (ret == 0)
-             ret = get_errno(sendmsg(fd, &msg, flags));
+         if (fd_trans_target_to_host_data(fd)) {
+             ret = fd_trans_target_to_host_data(fd)(msg.msg_iov->iov_base,
+                                                    msg.msg_iov->iov_len);
+         } else {
+             ret = target_to_host_cmsg(&msg, msgp);
+         }
+         if (ret == 0) {
+             ret = get_errno(safe_sendmsg(fd, &msg, flags));
+         }
      } else {
-         ret = get_errno(recvmsg(fd, &msg, flags));
+         ret = get_errno(safe_recvmsg(fd, &msg, flags));
          if (!is_error(ret)) {
              len = ret;
-             ret = host_to_target_cmsg(msgp, &msg);
+             if (fd_trans_host_to_target_data(fd)) {
+                 ret = fd_trans_host_to_target_data(fd)(msg.msg_iov->iov_base,
+                                                        msg.msg_iov->iov_len);
+             } else {
+                 ret = host_to_target_cmsg(msgp, &msg);
+             }
              if (!is_error(ret)) {
                  msgp->msg_namelen = tswap32(msg.msg_namelen);
                  if (msg.msg_name != NULL) {
@@@ -2369,19 -3075,6 +3075,6 @@@ static abi_long do_sendrecvmmsg(int fd
      return ret;
  }
  
- /* If we don't have a system accept4() then just call accept.
-  * The callsites to do_accept4() will ensure that they don't
-  * pass a non-zero flags argument in this config.
-  */
- #ifndef CONFIG_ACCEPT4
- static inline int accept4(int sockfd, struct sockaddr *addr,
-                           socklen_t *addrlen, int flags)
- {
-     assert(flags == 0);
-     return accept(sockfd, addr, addrlen);
- }
- #endif
  /* do_accept4() Must return target values and target errnos. */
  static abi_long do_accept4(int fd, abi_ulong target_addr,
                             abi_ulong target_addrlen_addr, int flags)
      host_flags = target_to_host_bitmask(flags, fcntl_flags_tbl);
  
      if (target_addr == 0) {
-         return get_errno(accept4(fd, NULL, NULL, host_flags));
+         return get_errno(safe_accept4(fd, NULL, NULL, host_flags));
      }
  
      /* linux returns EINVAL if addrlen pointer is invalid */
  
      addr = alloca(addrlen);
  
-     ret = get_errno(accept4(fd, addr, &addrlen, host_flags));
+     ret = get_errno(safe_accept4(fd, addr, &addrlen, host_flags));
      if (!is_error(ret)) {
          host_to_target_sockaddr(target_addr, addr, addrlen);
          if (put_user_u32(addrlen, target_addrlen_addr))
@@@ -2510,6 -3203,13 +3203,13 @@@ static abi_long do_sendto(int fd, abi_u
      host_msg = lock_user(VERIFY_READ, msg, len, 1);
      if (!host_msg)
          return -TARGET_EFAULT;
+     if (fd_trans_target_to_host_data(fd)) {
+         ret = fd_trans_target_to_host_data(fd)(host_msg, len);
+         if (ret < 0) {
+             unlock_user(host_msg, msg, 0);
+             return ret;
+         }
+     }
      if (target_addr) {
          addr = alloca(addrlen+1);
          ret = target_to_host_sockaddr(fd, addr, target_addr, addrlen);
              unlock_user(host_msg, msg, 0);
              return ret;
          }
-         ret = get_errno(sendto(fd, host_msg, len, flags, addr, addrlen));
+         ret = get_errno(safe_sendto(fd, host_msg, len, flags, addr, addrlen));
      } else {
-         ret = get_errno(send(fd, host_msg, len, flags));
+         ret = get_errno(safe_sendto(fd, host_msg, len, flags, NULL, 0));
      }
      unlock_user(host_msg, msg, 0);
      return ret;
@@@ -2548,10 -3248,11 +3248,11 @@@ static abi_long do_recvfrom(int fd, abi
              goto fail;
          }
          addr = alloca(addrlen);
-         ret = get_errno(recvfrom(fd, host_msg, len, flags, addr, &addrlen));
+         ret = get_errno(safe_recvfrom(fd, host_msg, len, flags,
+                                       addr, &addrlen));
      } else {
          addr = NULL; /* To keep compiler quiet.  */
-         ret = get_errno(qemu_recv(fd, host_msg, len, flags));
+         ret = get_errno(safe_recvfrom(fd, host_msg, len, flags, NULL, 0));
      }
      if (!is_error(ret)) {
          if (target_addr) {
@@@ -2989,7 -3690,7 +3690,7 @@@ static inline abi_long do_semop(int sem
      if (target_to_host_sembuf(sops, ptr, nsops))
          return -TARGET_EFAULT;
  
-     return get_errno(semop(semid, sops, nsops));
+     return get_errno(safe_semtimedop(semid, sops, nsops, NULL));
  }
  
  struct target_msqid_ds
@@@ -3144,7 -3845,7 +3845,7 @@@ static inline abi_long do_msgsnd(int ms
      }
      host_mb->mtype = (abi_long) tswapal(target_mb->mtype);
      memcpy(host_mb->mtext, target_mb->mtext, msgsz);
-     ret = get_errno(msgsnd(msqid, host_mb, msgsz, msgflg));
+     ret = get_errno(safe_msgsnd(msqid, host_mb, msgsz, msgflg));
      g_free(host_mb);
      unlock_user_struct(target_mb, msgp, 0);
  
@@@ -3172,7 -3873,7 +3873,7 @@@ static inline abi_long do_msgrcv(int ms
          ret = -TARGET_ENOMEM;
          goto end;
      }
-     ret = get_errno(msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg));
+     ret = get_errno(safe_msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg));
  
      if (ret > 0) {
          abi_ulong target_mtext_addr = msgp + sizeof(abi_ulong);
@@@ -3588,7 -4289,7 +4289,7 @@@ static abi_long do_ioctl_fs_ioc_fiemap(
          memcpy(fm, buf_temp, sizeof(struct fiemap));
          free_fm = 1;
      }
-     ret = get_errno(ioctl(fd, ie->host_cmd, fm));
+     ret = get_errno(safe_ioctl(fd, ie->host_cmd, fm));
      if (!is_error(ret)) {
          target_size_out = target_size_in;
          /* An extent_count of 0 means we were only counting the extents
@@@ -3678,7 -4379,7 +4379,7 @@@ static abi_long do_ioctl_ifconf(const I
      host_ifconf->ifc_len = host_ifc_len;
      host_ifconf->ifc_buf = host_ifc_buf;
  
-     ret = get_errno(ioctl(fd, ie->host_cmd, host_ifconf));
+     ret = get_errno(safe_ioctl(fd, ie->host_cmd, host_ifconf));
      if (!is_error(ret)) {
        /* convert host ifc_len to target ifc_len */
  
@@@ -3807,7 -4508,7 +4508,7 @@@ static abi_long do_ioctl_dm(const IOCTL
      }
      unlock_user(argptr, guest_data, 0);
  
-     ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
+     ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
      if (!is_error(ret)) {
          guest_data = arg + host_dm->data_start;
          guest_data_size = host_dm->data_size - host_dm->data_start;
@@@ -3988,7 -4689,7 +4689,7 @@@ static abi_long do_ioctl_blkpg(const IO
  
      /* Swizzle the data pointer to our local copy and call! */
      host_blkpg->data = &host_part;
-     ret = get_errno(ioctl(fd, ie->host_cmd, host_blkpg));
+     ret = get_errno(safe_ioctl(fd, ie->host_cmd, host_blkpg));
  
  out:
      return ret;
@@@ -4049,7 -4750,7 +4750,7 @@@ static abi_long do_ioctl_rt(const IOCTL
      }
      unlock_user(argptr, arg, 0);
  
-     ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
+     ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
      if (*host_rt_dev_ptr != 0) {
          unlock_user((void *)*host_rt_dev_ptr,
                      *target_rt_dev_ptr, 0);
@@@ -4061,7 -4762,7 +4762,7 @@@ static abi_long do_ioctl_kdsigaccept(co
                                       int fd, int cmd, abi_long arg)
  {
      int sig = target_to_host_signal(arg);
-     return get_errno(ioctl(fd, ie->host_cmd, sig));
+     return get_errno(safe_ioctl(fd, ie->host_cmd, sig));
  }
  
  static IOCTLEntry ioctl_entries[] = {
@@@ -4105,18 -4806,18 +4806,18 @@@ static abi_long do_ioctl(int fd, int cm
      switch(arg_type[0]) {
      case TYPE_NULL:
          /* no argument */
-         ret = get_errno(ioctl(fd, ie->host_cmd));
+         ret = get_errno(safe_ioctl(fd, ie->host_cmd));
          break;
      case TYPE_PTRVOID:
      case TYPE_INT:
-         ret = get_errno(ioctl(fd, ie->host_cmd, arg));
+         ret = get_errno(safe_ioctl(fd, ie->host_cmd, arg));
          break;
      case TYPE_PTR:
          arg_type++;
          target_size = thunk_type_size(arg_type, 0);
          switch(ie->access) {
          case IOC_R:
-             ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
+             ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
              if (!is_error(ret)) {
                  argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
                  if (!argptr)
                  return -TARGET_EFAULT;
              thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
              unlock_user(argptr, arg, 0);
-             ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
+             ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
              break;
          default:
          case IOC_RW:
                  return -TARGET_EFAULT;
              thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
              unlock_user(argptr, arg, 0);
-             ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
+             ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
              if (!is_error(ret)) {
                  argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
                  if (!argptr)
@@@ -4741,6 -5442,7 +5442,7 @@@ static int do_fork(CPUArchState *env, u
          new_cpu->opaque = ts;
          ts->bprm = parent_ts->bprm;
          ts->info = parent_ts->info;
+         ts->signal_mask = parent_ts->signal_mask;
          nptl_flags = flags;
          flags &= ~CLONE_NPTL_FLAGS2;
  
          if ((flags & ~(CSIGNAL | CLONE_NPTL_FLAGS2)) != 0) {
              return -TARGET_EINVAL;
          }
+         if (block_signals()) {
+             return -TARGET_ERESTARTSYS;
+         }
          fork_start();
          ret = fork();
          if (ret == 0) {
@@@ -5993,8 -6700,12 +6700,12 @@@ abi_long do_syscall(void *cpu_env, int 
             However in threaded applictions it is used for thread termination,
             and _exit_group is used for application termination.
             Do thread termination if we have more then one thread.  */
-         /* FIXME: This probably breaks if a signal arrives.  We should probably
-            be disabling signals.  */
+         if (block_signals()) {
+             ret = -TARGET_ERESTARTSYS;
+             break;
+         }
          if (CPU_NEXT(first_cpu)) {
              TaskState *ts;
  
  #endif
  #ifdef TARGET_NR_pause /* not on alpha */
      case TARGET_NR_pause:
-         ret = get_errno(pause());
+         if (!block_signals()) {
+             sigsuspend(&((TaskState *)cpu->opaque)->signal_mask);
+         }
+         ret = -TARGET_EINTR;
          break;
  #endif
  #ifdef TARGET_NR_utime
          ret = 0;
          break;
      case TARGET_NR_kill:
-         ret = get_errno(kill(arg1, target_to_host_signal(arg2)));
+         ret = get_errno(safe_kill(arg1, target_to_host_signal(arg2)));
          break;
  #ifdef TARGET_NR_rename
      case TARGET_NR_rename:
          {
              sigset_t cur_set;
              abi_ulong target_set;
-             do_sigprocmask(0, NULL, &cur_set);
-             host_to_target_old_sigset(&target_set, &cur_set);
-             ret = target_set;
+             ret = do_sigprocmask(0, NULL, &cur_set);
+             if (!ret) {
+                 host_to_target_old_sigset(&target_set, &cur_set);
+                 ret = target_set;
+             }
          }
          break;
  #endif
          {
              sigset_t set, oset, cur_set;
              abi_ulong target_set = arg1;
-             do_sigprocmask(0, NULL, &cur_set);
+             /* We only have one word of the new mask so we must read
+              * the rest of it with do_sigprocmask() and OR in this word.
+              * We are guaranteed that a do_sigprocmask() that only queries
+              * the signal mask will not fail.
+              */
+             ret = do_sigprocmask(0, NULL, &cur_set);
+             assert(!ret);
              target_to_host_old_sigset(&set, &target_set);
              sigorset(&set, &set, &cur_set);
-             do_sigprocmask(SIG_SETMASK, &set, &oset);
-             host_to_target_old_sigset(&target_set, &oset);
-             ret = target_set;
+             ret = do_sigprocmask(SIG_SETMASK, &set, &oset);
+             if (!ret) {
+                 host_to_target_old_sigset(&target_set, &oset);
+                 ret = target_set;
+             }
          }
          break;
  #endif
              mask = arg2;
              target_to_host_old_sigset(&set, &mask);
  
-             ret = get_errno(do_sigprocmask(how, &set, &oldset));
+             ret = do_sigprocmask(how, &set, &oldset);
              if (!is_error(ret)) {
                  host_to_target_old_sigset(&mask, &oldset);
                  ret = mask;
                  how = 0;
                  set_ptr = NULL;
              }
-             ret = get_errno(do_sigprocmask(how, set_ptr, &oldset));
+             ret = do_sigprocmask(how, set_ptr, &oldset);
              if (!is_error(ret) && arg3) {
                  if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0)))
                      goto efault;
                  how = 0;
                  set_ptr = NULL;
              }
-             ret = get_errno(do_sigprocmask(how, set_ptr, &oldset));
+             ret = do_sigprocmask(how, set_ptr, &oldset);
              if (!is_error(ret) && arg3) {
                  if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0)))
                      goto efault;
  #ifdef TARGET_NR_sigsuspend
      case TARGET_NR_sigsuspend:
          {
-             sigset_t set;
+             TaskState *ts = cpu->opaque;
  #if defined(TARGET_ALPHA)
              abi_ulong mask = arg1;
-             target_to_host_old_sigset(&set, &mask);
+             target_to_host_old_sigset(&ts->sigsuspend_mask, &mask);
  #else
              if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
                  goto efault;
-             target_to_host_old_sigset(&set, p);
+             target_to_host_old_sigset(&ts->sigsuspend_mask, p);
              unlock_user(p, arg1, 0);
  #endif
-             ret = get_errno(sigsuspend(&set));
+             ret = get_errno(safe_rt_sigsuspend(&ts->sigsuspend_mask,
+                                                SIGSET_T_SIZE));
+             if (ret != -TARGET_ERESTARTSYS) {
+                 ts->in_sigsuspend = 1;
+             }
          }
          break;
  #endif
      case TARGET_NR_rt_sigsuspend:
          {
-             sigset_t set;
+             TaskState *ts = cpu->opaque;
              if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
                  goto efault;
-             target_to_host_sigset(&set, p);
+             target_to_host_sigset(&ts->sigsuspend_mask, p);
              unlock_user(p, arg1, 0);
-             ret = get_errno(sigsuspend(&set));
+             ret = get_errno(safe_rt_sigsuspend(&ts->sigsuspend_mask,
+                                                SIGSET_T_SIZE));
+             if (ret != -TARGET_ERESTARTSYS) {
+                 ts->in_sigsuspend = 1;
+             }
          }
          break;
      case TARGET_NR_rt_sigtimedwait:
              } else {
                  puts = NULL;
              }
-             ret = get_errno(sigtimedwait(&set, &uinfo, puts));
+             ret = get_errno(safe_rt_sigtimedwait(&set, &uinfo, puts,
+                                                  SIGSET_T_SIZE));
              if (!is_error(ret)) {
                  if (arg2) {
                      p = lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t),
          break;
  #ifdef TARGET_NR_sigreturn
      case TARGET_NR_sigreturn:
-         ret = do_sigreturn(cpu_env);
+         if (block_signals()) {
+             ret = -TARGET_ERESTARTSYS;
+         } else {
+             ret = do_sigreturn(cpu_env);
+         }
          break;
  #endif
      case TARGET_NR_rt_sigreturn:
-         ret = do_rt_sigreturn(cpu_env);
+         if (block_signals()) {
+             ret = -TARGET_ERESTARTSYS;
+         } else {
+             ret = do_rt_sigreturn(cpu_env);
+         }
          break;
      case TARGET_NR_sethostname:
          if (!(p = lock_user_string(arg1)))
              /* Extract the two packed args for the sigset */
              if (arg6) {
                  sig_ptr = &sig;
-                 sig.size = _NSIG / 8;
+                 sig.size = SIGSET_T_SIZE;
  
                  arg7 = lock_user(VERIFY_READ, arg6, sizeof(*arg7) * 2, 1);
                  if (!arg7) {
  #endif
  #ifdef TARGET_NR_accept4
      case TARGET_NR_accept4:
- #ifdef CONFIG_ACCEPT4
          ret = do_accept4(arg1, arg2, arg3, arg4);
- #else
-         goto unimplemented;
- #endif
          break;
  #endif
  #ifdef TARGET_NR_bind
          {
              struct target_pollfd *target_pfd;
              unsigned int nfds = arg2;
-             int timeout = arg3;
              struct pollfd *pfd;
              unsigned int i;
  
                  }
              }
  
+             switch (num) {
  # ifdef TARGET_NR_ppoll
-             if (num == TARGET_NR_ppoll) {
+             case TARGET_NR_ppoll:
+             {
                  struct timespec _timeout_ts, *timeout_ts = &_timeout_ts;
                  target_sigset_t *target_set;
                  sigset_t _set, *set = &_set;
                      set = NULL;
                  }
  
-                 ret = get_errno(sys_ppoll(pfd, nfds, timeout_ts, set, _NSIG/8));
+                 ret = get_errno(safe_ppoll(pfd, nfds, timeout_ts,
+                                            set, SIGSET_T_SIZE));
  
                  if (!is_error(ret) && arg3) {
                      host_to_target_timespec(arg3, timeout_ts);
                  if (arg4) {
                      unlock_user(target_set, arg4, 0);
                  }
-             } else
+                 break;
+             }
  # endif
-                 ret = get_errno(poll(pfd, nfds, timeout));
+ # ifdef TARGET_NR_poll
+             case TARGET_NR_poll:
+             {
+                 struct timespec ts, *pts;
+                 if (arg3 >= 0) {
+                     /* Convert ms to secs, ns */
+                     ts.tv_sec = arg3 / 1000;
+                     ts.tv_nsec = (arg3 % 1000) * 1000000LL;
+                     pts = &ts;
+                 } else {
+                     /* -ve poll() timeout means "infinite" */
+                     pts = NULL;
+                 }
+                 ret = get_errno(safe_ppoll(pfd, nfds, pts, NULL, 0));
+                 break;
+             }
+ # endif
+             default:
+                 g_assert_not_reached();
+             }
  
              if (!is_error(ret)) {
                  for(i = 0; i < nfds; i++) {
      case TARGET_NR_flock:
          /* NOTE: the flock constant seems to be the same for every
             Linux platform */
-         ret = get_errno(flock(arg1, arg2));
+         ret = get_errno(safe_flock(arg1, arg2));
          break;
      case TARGET_NR_readv:
          {
              struct iovec *vec = lock_iovec(VERIFY_WRITE, arg2, arg3, 0);
              if (vec != NULL) {
-                 ret = get_errno(readv(arg1, vec, arg3));
+                 ret = get_errno(safe_readv(arg1, vec, arg3));
                  unlock_iovec(vec, arg2, arg3, 1);
              } else {
                  ret = -host_to_target_errno(errno);
          {
              struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1);
              if (vec != NULL) {
-                 ret = get_errno(writev(arg1, vec, arg3));
+                 ret = get_errno(safe_writev(arg1, vec, arg3));
                  unlock_iovec(vec, arg2, arg3, 0);
              } else {
                  ret = -host_to_target_errno(errno);
          {
              struct timespec req, rem;
              target_to_host_timespec(&req, arg1);
-             ret = get_errno(nanosleep(&req, &rem));
+             ret = get_errno(safe_nanosleep(&req, &rem));
              if (is_error(ret) && arg2) {
                  host_to_target_timespec(arg2, &rem);
              }
              }
              mask = arg2;
              target_to_host_old_sigset(&set, &mask);
-             do_sigprocmask(how, &set, &oldset);
-             host_to_target_old_sigset(&mask, &oldset);
-             ret = mask;
+             ret = do_sigprocmask(how, &set, &oldset);
+             if (!ret) {
+                 host_to_target_old_sigset(&mask, &oldset);
+                 ret = mask;
+             }
          }
          break;
  #endif
  #endif
  #ifdef TARGET_NR_arm_fadvise64_64
      case TARGET_NR_arm_fadvise64_64:
-       {
-               /*
-                * arm_fadvise64_64 looks like fadvise64_64 but
-                * with different argument order
-                */
-               abi_long temp;
-               temp = arg3;
-               arg3 = arg4;
-               arg4 = temp;
-       }
+         /* arm_fadvise64_64 looks like fadvise64_64 but
+          * with different argument order: fd, advice, offset, len
+          * rather than the usual fd, offset, len, advice.
+          * Note that offset and len are both 64-bit so appear as
+          * pairs of 32-bit registers.
+          */
+         ret = posix_fadvise(arg1, target_offset64(arg3, arg4),
+                             target_offset64(arg5, arg6), arg2);
+         ret = -host_to_target_errno(ret);
+         break;
+ #endif
+ #if TARGET_ABI_BITS == 32
+ #ifdef TARGET_NR_fadvise64_64
+     case TARGET_NR_fadvise64_64:
+         /* 6 args: fd, offset (high, low), len (high, low), advice */
+         if (regpairs_aligned(cpu_env)) {
+             /* offset is in (3,4), len in (5,6) and advice in 7 */
+             arg2 = arg3;
+             arg3 = arg4;
+             arg4 = arg5;
+             arg5 = arg6;
+             arg6 = arg7;
+         }
+         ret = -host_to_target_errno(posix_fadvise(arg1,
+                                                   target_offset64(arg2, arg3),
+                                                   target_offset64(arg4, arg5),
+                                                   arg6));
+         break;
+ #endif
+ #ifdef TARGET_NR_fadvise64
+     case TARGET_NR_fadvise64:
+         /* 5 args: fd, offset (high, low), len, advice */
+         if (regpairs_aligned(cpu_env)) {
+             /* offset is in (3,4), len in 5 and advice in 6 */
+             arg2 = arg3;
+             arg3 = arg4;
+             arg4 = arg5;
+             arg5 = arg6;
+         }
+         ret = -host_to_target_errno(posix_fadvise(arg1,
+                                                   target_offset64(arg2, arg3),
+                                                   arg4, arg5));
+         break;
  #endif
- #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_arm_fadvise64_64) || defined(TARGET_NR_fadvise64)
+ #else /* not a 32-bit ABI */
+ #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_fadvise64)
  #ifdef TARGET_NR_fadvise64_64
      case TARGET_NR_fadvise64_64:
  #endif
          default: break;
          }
  #endif
-         ret = -posix_fadvise(arg1, arg2, arg3, arg4);
-       break;
+         ret = -host_to_target_errno(posix_fadvise(arg1, arg2, arg3, arg4));
+         break;
  #endif
+ #endif /* end of 64-bit ABI fadvise handling */
  #ifdef TARGET_NR_madvise
      case TARGET_NR_madvise:
          /* A straight passthrough may not be safe because qemu sometimes
      {
          struct timespec ts;
          target_to_host_timespec(&ts, arg3);
-         ret = get_errno(clock_nanosleep(arg1, arg2, &ts, arg4 ? &ts : NULL));
+         ret = get_errno(safe_clock_nanosleep(arg1, arg2,
+                                              &ts, arg4 ? &ts : NULL));
          if (arg4)
              host_to_target_timespec(arg4, &ts);
  
  #if defined(TARGET_PPC)
          /* clock_nanosleep is odd in that it returns positive errno values.
           * On PPC, CR0 bit 3 should be set in such a situation. */
-         if (ret) {
+         if (ret && ret != -TARGET_ERESTARTSYS) {
              ((CPUPPCState *)cpu_env)->crf[0] |= 1;
          }
  #endif
          break;
  #endif
  
- #if defined(TARGET_NR_tkill) && defined(__NR_tkill)
      case TARGET_NR_tkill:
-         ret = get_errno(sys_tkill((int)arg1, target_to_host_signal(arg2)));
+         ret = get_errno(safe_tkill((int)arg1, target_to_host_signal(arg2)));
          break;
- #endif
  
- #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill)
      case TARGET_NR_tgkill:
-       ret = get_errno(sys_tgkill((int)arg1, (int)arg2,
+         ret = get_errno(safe_tgkill((int)arg1, (int)arg2,
                          target_to_host_signal(arg3)));
-       break;
- #endif
+         break;
  
  #ifdef TARGET_NR_set_robust_list
      case TARGET_NR_set_robust_list:
              p = lock_user (VERIFY_READ, arg2, arg3, 1);
              if (arg5 != 0) {
                  target_to_host_timespec(&ts, arg5);
-                 ret = get_errno(mq_timedsend(arg1, p, arg3, arg4, &ts));
+                 ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, &ts));
                  host_to_target_timespec(arg5, &ts);
+             } else {
+                 ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, NULL));
              }
-             else
-                 ret = get_errno(mq_send(arg1, p, arg3, arg4));
              unlock_user (p, arg2, arg3);
          }
          break;
              p = lock_user (VERIFY_READ, arg2, arg3, 1);
              if (arg5 != 0) {
                  target_to_host_timespec(&ts, arg5);
-                 ret = get_errno(mq_timedreceive(arg1, p, arg3, &prio, &ts));
+                 ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
+                                                      &prio, &ts));
                  host_to_target_timespec(arg5, &ts);
+             } else {
+                 ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
+                                                      &prio, NULL));
              }
-             else
-                 ret = get_errno(mq_receive(arg1, p, arg3, &prio));
              unlock_user (p, arg2, arg3);
              if (arg4 != 0)
                  put_user_u32(prio, arg4);
      }
  #endif
  
- #if defined(TARGET_NR_epoll_pwait) && defined(CONFIG_EPOLL_PWAIT)
- #define IMPLEMENT_EPOLL_PWAIT
- #endif
- #if defined(TARGET_NR_epoll_wait) || defined(IMPLEMENT_EPOLL_PWAIT)
+ #if defined(TARGET_NR_epoll_wait) || defined(TARGET_NR_epoll_pwait)
  #if defined(TARGET_NR_epoll_wait)
      case TARGET_NR_epoll_wait:
  #endif
- #if defined(IMPLEMENT_EPOLL_PWAIT)
+ #if defined(TARGET_NR_epoll_pwait)
      case TARGET_NR_epoll_pwait:
  #endif
      {
          ep = alloca(maxevents * sizeof(struct epoll_event));
  
          switch (num) {
- #if defined(IMPLEMENT_EPOLL_PWAIT)
+ #if defined(TARGET_NR_epoll_pwait)
          case TARGET_NR_epoll_pwait:
          {
              target_sigset_t *target_set;
                  set = NULL;
              }
  
-             ret = get_errno(epoll_pwait(epfd, ep, maxevents, timeout, set));
+             ret = get_errno(safe_epoll_pwait(epfd, ep, maxevents, timeout,
+                                              set, SIGSET_T_SIZE));
              break;
          }
  #endif
  #if defined(TARGET_NR_epoll_wait)
          case TARGET_NR_epoll_wait:
-             ret = get_errno(epoll_wait(epfd, ep, maxevents, timeout));
+             ret = get_errno(safe_epoll_pwait(epfd, ep, maxevents, timeout,
+                                              NULL, 0));
              break;
  #endif
          default: