Commit 6582d3e8 authored by Anthony Liguori's avatar Anthony Liguori
Browse files

Merge remote-tracking branch 'riku/linux-user-for-upstream' into staging

# By Peter Maydell (5) and others
# Via Riku Voipio
* riku/linux-user-for-upstream:
  linux-user/syscall.c: Don't warn about unimplemented get_robust_list
  linux-user: Implement accept4
  linux-user: Implement sendfile and sendfile64
  linux-user: make bogus negative iovec lengths fail EINVAL
  linux-user: Fix layout of usage table to account for option text
  linux-user: Add more sparc syscall numbers
  linux-user: Support setgroups syscall with no groups
  linux-user: fix futex strace of FUTEX_CLOCK_REALTIME
  linux-user/syscall.c: handle FUTEX_WAIT_BITSET in do_futex
  linux-user: improve print_fcntl()
  linux-user: Add Alpha socket constants
parents c69b30e8 e9a970a8
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -2764,6 +2764,20 @@ if compile_prog "" "" ; then
  epoll_pwait=yes
fi

# check for sendfile support
sendfile=no
cat > $TMPC << EOF
#include <sys/sendfile.h>

int main(void)
{
    return sendfile(0, 0, 0, 0);
}
EOF
if compile_prog "" "" ; then
  sendfile=yes
fi

# Check if tools are available to build documentation.
if test "$docs" != "no" ; then
  if has makeinfo && has pod2man; then
@@ -3633,6 +3647,9 @@ 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
if test "$inotify" = "yes" ; then
  echo "CONFIG_INOTIFY=y" >> $config_host_mak
fi
+16 −8
Original line number Diff line number Diff line
@@ -3406,27 +3406,35 @@ static void usage(void)
           "Options and associated environment variables:\n"
           "\n");

    maxarglen = maxenvlen = 0;
    /* Calculate column widths. We must always have at least enough space
     * for the column header.
     */
    maxarglen = strlen("Argument");
    maxenvlen = strlen("Env-variable");

    for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
        int arglen = strlen(arginfo->argv);
        if (arginfo->has_arg) {
            arglen += strlen(arginfo->example) + 1;
        }
        if (strlen(arginfo->env) > maxenvlen) {
            maxenvlen = strlen(arginfo->env);
        }
        if (strlen(arginfo->argv) > maxarglen) {
            maxarglen = strlen(arginfo->argv);
        if (arglen > maxarglen) {
            maxarglen = arglen;
        }
    }

    printf("%-*s%-*sDescription\n", maxarglen+3, "Argument",
            maxenvlen+1, "Env-variable");
    printf("%-*s %-*s Description\n", maxarglen+1, "Argument",
            maxenvlen, "Env-variable");

    for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
        if (arginfo->has_arg) {
            printf("-%s %-*s %-*s %s\n", arginfo->argv,
                    (int)(maxarglen-strlen(arginfo->argv)), arginfo->example,
                    maxenvlen, arginfo->env, arginfo->help);
                   (int)(maxarglen - strlen(arginfo->argv) - 1),
                   arginfo->example, maxenvlen, arginfo->env, arginfo->help);
        } else {
            printf("-%-*s %-*s %s\n", maxarglen+1, arginfo->argv,
            printf("-%-*s %-*s %s\n", maxarglen, arginfo->argv,
                    maxenvlen, arginfo->env,
                    arginfo->help);
        }
+69 −0
Original line number Diff line number Diff line
@@ -87,6 +87,75 @@

	#define TARGET_SOCK_MAX (SOCK_PACKET + 1)

#elif defined(TARGET_ALPHA)

    /* For setsockopt(2) */
    #define TARGET_SOL_SOCKET   0xffff

    #define TARGET_SO_DEBUG 0x0001
    #define TARGET_SO_REUSEADDR 0x0004
    #define TARGET_SO_KEEPALIVE 0x0008
    #define TARGET_SO_DONTROUTE 0x0010
    #define TARGET_SO_BROADCAST 0x0020
    #define TARGET_SO_LINGER    0x0080
    #define TARGET_SO_OOBINLINE 0x0100
    /* To add :#define TARGET_SO_REUSEPORT 0x0200 */

    #define TARGET_SO_TYPE      0x1008
    #define TARGET_SO_ERROR 0x1007
    #define TARGET_SO_SNDBUF    0x1001
    #define TARGET_SO_RCVBUF    0x1002
    #define TARGET_SO_SNDBUFFORCE   0x100a
    #define TARGET_SO_RCVBUFFORCE   0x100b
    #define TARGET_SO_RCVLOWAT  0x1010
    #define TARGET_SO_SNDLOWAT  0x1011
    #define TARGET_SO_RCVTIMEO  0x1012
    #define TARGET_SO_SNDTIMEO  0x1013
    #define TARGET_SO_ACCEPTCONN    0x1014
    #define TARGET_SO_PROTOCOL  0x1028
    #define TARGET_SO_DOMAIN    0x1029

    /* linux-specific, might as well be the same as on i386 */
    #define TARGET_SO_NO_CHECK  11
    #define TARGET_SO_PRIORITY  12
    #define TARGET_SO_BSDCOMPAT 14

    #define TARGET_SO_PASSCRED  17
    #define TARGET_SO_PEERCRED  18
    #define TARGET_SO_BINDTODEVICE 25

    /* Socket filtering */
    #define TARGET_SO_ATTACH_FILTER        26
    #define TARGET_SO_DETACH_FILTER        27

    #define TARGET_SO_PEERNAME      28
    #define TARGET_SO_TIMESTAMP     29
    #define TARGET_SCM_TIMESTAMP        TARGET_SO_TIMESTAMP

    #define TARGET_SO_PEERSEC       30
    #define TARGET_SO_PASSSEC       34
    #define TARGET_SO_TIMESTAMPNS       35
    #define TARGET_SCM_TIMESTAMPNS      TARGET_SO_TIMESTAMPNS

    /* Security levels - as per NRL IPv6 - don't actually do anything */
    #define TARGET_SO_SECURITY_AUTHENTICATION       19
    #define TARGET_SO_SECURITY_ENCRYPTION_TRANSPORT 20
    #define TARGET_SO_SECURITY_ENCRYPTION_NETWORK       21

    #define TARGET_SO_MARK          36

    #define TARGET_SO_TIMESTAMPING      37
    #define TARGET_SCM_TIMESTAMPING TARGET_SO_TIMESTAMPING

    #define TARGET_SO_RXQ_OVFL             40

    #define TARGET_SO_WIFI_STATUS       41
    #define TARGET_SCM_WIFI_STATUS      TARGET_SO_WIFI_STATUS
    #define TARGET_SO_PEEK_OFF      42

    /* Instruct lower device to use last 4-bytes of skb data as FCS */
    #define TARGET_SO_NOFCS     43

#else

	/* For setsockopt(2) */
+2 −0
Original line number Diff line number Diff line
@@ -200,6 +200,8 @@
#define TARGET_NR__newselect         230 /* Linux Specific                              */
#define TARGET_NR_time               231 /* Linux Specific                              */
#define TARGET_NR_stime              233 /* Linux Specific                              */
#define TARGET_NR_statfs64           234 /* Linux Specific                              */
#define TARGET_NR_fstatfs64          235 /* Linux Specific                              */
#define TARGET_NR__llseek            236 /* Linux Specific                              */
#define TARGET_NR_mlock              237
#define TARGET_NR_munlock            238
+85 −18
Original line number Diff line number Diff line
@@ -462,18 +462,6 @@ UNUSED static struct flags mmap_flags[] = {
    FLAG_END,
};

UNUSED static struct flags fcntl_flags[] = {
    FLAG_TARGET(F_DUPFD),
    FLAG_TARGET(F_GETFD),
    FLAG_TARGET(F_SETFD),
    FLAG_TARGET(F_GETFL),
    FLAG_TARGET(F_SETFL),
    FLAG_TARGET(F_GETLK),
    FLAG_TARGET(F_SETLK),
    FLAG_TARGET(F_SETLKW),
    FLAG_END,
};

UNUSED static struct flags clone_flags[] = {
    FLAG_GENERIC(CLONE_VM),
    FLAG_GENERIC(CLONE_FS),
@@ -867,12 +855,85 @@ print_fcntl(const struct syscallname *name,
{
    print_syscall_prologue(name);
    print_raw_param("%d", arg0, 0);
    print_flags(fcntl_flags, arg1, 0);
    /*
     * TODO: check flags and print following argument only
     *       when needed.
     */
    switch(arg1) {
    case TARGET_F_DUPFD:
        gemu_log("F_DUPFD,");
        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
        break;
    case TARGET_F_GETFD:
        gemu_log("F_GETFD");
        break;
    case TARGET_F_SETFD:
        gemu_log("F_SETFD,");
        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
        break;
    case TARGET_F_GETFL:
        gemu_log("F_GETFL");
        break;
    case TARGET_F_SETFL:
        gemu_log("F_SETFL,");
        print_open_flags(arg2, 1);
        break;
    case TARGET_F_GETLK:
        gemu_log("F_GETLK,");
        print_pointer(arg2, 1);
        break;
    case TARGET_F_SETLK:
        gemu_log("F_SETLK,");
        print_pointer(arg2, 1);
        break;
    case TARGET_F_SETLKW:
        gemu_log("F_SETLKW,");
        print_pointer(arg2, 1);
        break;
    case TARGET_F_GETOWN:
        gemu_log("F_GETOWN");
        break;
    case TARGET_F_SETOWN:
        gemu_log("F_SETOWN,");
        print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
        break;
    case TARGET_F_GETSIG:
        gemu_log("F_GETSIG");
        break;
    case TARGET_F_SETSIG:
        gemu_log("F_SETSIG,");
        print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
        break;
#if TARGET_ABI_BITS == 32
    case TARGET_F_GETLK64:
        gemu_log("F_GETLK64,");
        print_pointer(arg2, 1);
        break;
    case TARGET_F_SETLK64:
        gemu_log("F_SETLK64,");
        print_pointer(arg2, 1);
        break;
    case TARGET_F_SETLKW64:
        gemu_log("F_SETLKW64,");
        print_pointer(arg2, 1);
        break;
#endif
    case TARGET_F_SETLEASE:
        gemu_log("F_SETLEASE,");
        print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
        break;
    case TARGET_F_GETLEASE:
        gemu_log("F_GETLEASE");
        break;
    case TARGET_F_DUPFD_CLOEXEC:
        gemu_log("F_DUPFD_CLOEXEC,");
        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
        break;
    case TARGET_F_NOTIFY:
        gemu_log("F_NOTIFY,");
        print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
        break;
    default:
        print_raw_param(TARGET_ABI_FMT_ld, arg1, 0);
        print_pointer(arg2, 1);
        break;
    }
    print_syscall_epilogue(name);
}
#define print_fcntl64   print_fcntl
@@ -1436,6 +1497,12 @@ if( cmd == val ) { \
        gemu_log("FUTEX_PRIVATE_FLAG|");
        cmd &= ~FUTEX_PRIVATE_FLAG;
    }
#endif
#ifdef FUTEX_CLOCK_REALTIME
    if (cmd & FUTEX_CLOCK_REALTIME) {
        gemu_log("FUTEX_CLOCK_REALTIME|");
        cmd &= ~FUTEX_CLOCK_REALTIME;
    }
#endif
    print_op(FUTEX_WAIT)
    print_op(FUTEX_WAKE)
Loading