From a63e5e0c0d457718a957c351c996ba9cb31d5cdd Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Tue, 4 Feb 2014 06:43:09 +0100 Subject: [PATCH 01/10] misc: Fix case Qemu -> QEMU MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Weil Reviewed-by: Laszlo Ersek Reviewed-by: Andreas Färber Signed-off-by: Michael Tokarev --- scripts/switch-timer-api | 2 +- tests/i440fx-test.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/switch-timer-api b/scripts/switch-timer-api index a369a083d1..b0e230b9f1 100755 --- a/scripts/switch-timer-api +++ b/scripts/switch-timer-api @@ -20,7 +20,7 @@ sub Syntax print STDERR < Date: Mon, 3 Feb 2014 10:18:11 +0100 Subject: [PATCH 02/10] sparc/leon3: Initialize stack pointer A lot of real world LEON3 systems are shipped with the GRMON boot loader. This boot loader initializes the stack pointer with the end of RAM address. The application can use this to detect the RAM size of a particular board variant. Signed-off-by: Sebastian Huber Reviewed-by: Fabien Chouteau Signed-off-by: Michael Tokarev --- hw/sparc/leon3.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c index c583c3d0c5..c16e9e4c81 100644 --- a/hw/sparc/leon3.c +++ b/hw/sparc/leon3.c @@ -45,6 +45,7 @@ typedef struct ResetData { SPARCCPU *cpu; uint32_t entry; /* save kernel entry in case of reset */ + target_ulong sp; /* initial stack pointer */ } ResetData; static void main_cpu_reset(void *opaque) @@ -58,6 +59,7 @@ static void main_cpu_reset(void *opaque) cpu->halted = 0; env->pc = s->entry; env->npc = s->entry + 4; + env->regbase[6] = s->sp; } void leon3_irq_ack(void *irq_manager, int intno) @@ -133,6 +135,7 @@ static void leon3_generic_hw_init(QEMUMachineInitArgs *args) /* Reset data */ reset_info = g_malloc0(sizeof(ResetData)); reset_info->cpu = cpu; + reset_info->sp = 0x40000000 + ram_size; qemu_register_reset(main_cpu_reset, reset_info); /* Allocate IRQ manager */ From 3f281822b26e4b39b2a49ac030fc6a5f184dd387 Mon Sep 17 00:00:00 2001 From: Stewart Smith Date: Fri, 24 Jan 2014 12:39:06 +1100 Subject: [PATCH 03/10] configure: add hint of libfdt to DTC dependency not found message Most distros package it as libfdt, and mentioning libfdt here makes it much easier to find the package you're missing. Signed-off-by: Stewart Smith Reviewed-by: Stefan Weil Signed-off-by: Michael Tokarev --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 88133a100e..f58fa84deb 100755 --- a/configure +++ b/configure @@ -2662,8 +2662,8 @@ EOF fdt_libs="-L\$(BUILD_DIR)/dtc/libfdt $fdt_libs" elif test "$fdt" = "yes" ; then # have neither and want - prompt for system/submodule install - error_exit "DTC not present. Your options:" \ - " (1) Preferred: Install the DTC devel package" \ + error_exit "DTC (libfdt) not present. Your options:" \ + " (1) Preferred: Install the DTC (libfdt) devel package" \ " (2) Fetch the DTC submodule, using:" \ " git submodule update --init dtc" else From 21684af0233df1d2b554db736e4feb774950d488 Mon Sep 17 00:00:00 2001 From: Stewart Smith Date: Fri, 24 Jan 2014 12:39:10 +1100 Subject: [PATCH 04/10] configure: add hints to a remedy for feature_not_found errors Modify feature_not_found to accept an optional second parameter to be printed after the generic feature not found error. Modify most calls to feature_not_found to provide hints as to the packages that may be missing. The few calls remaining without a remedy are ones I couldn't work out how to remedy myself. Signed-off-by: Stewart Smith Signed-off-by: Michael Tokarev --- configure | 68 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/configure b/configure index f58fa84deb..0eadab5f00 100755 --- a/configure +++ b/configure @@ -1474,9 +1474,11 @@ esac feature_not_found() { feature=$1 + remedy=$2 error_exit "User requested feature $feature" \ - "configure was not able to find it" + "configure was not able to find it." \ + "$remedy" } # --- @@ -1524,7 +1526,7 @@ int main(void) { } EOF if ! compile_object ; then - feature_not_found "nptl" + feature_not_found "nptl" "Install glibc and linux kernel headers." fi fi @@ -1555,7 +1557,7 @@ if test "$seccomp" != "no" ; then seccomp="yes" else if test "$seccomp" = "yes"; then - feature_not_found "libseccomp" + feature_not_found "libseccomp" "Install libseccomp devel >= 2.1.0" fi seccomp="no" fi @@ -1580,7 +1582,7 @@ EOF if ! compile_prog "" "$xen_libs" ; then # Xen not found if test "$xen" = "yes" ; then - feature_not_found "xen" + feature_not_found "xen" "Install xen devel" fi xen=no @@ -1703,7 +1705,7 @@ EOF # Xen version unsupported else if test "$xen" = "yes" ; then - feature_not_found "xen (unsupported version)" + feature_not_found "xen (unsupported version)" "Install supported xen (e.g. 4.0, 3.4, 3.3)" fi xen=no fi @@ -1752,7 +1754,7 @@ if test "$sparse" != "no" ; then sparse=yes else if test "$sparse" = "yes" ; then - feature_not_found "sparse" + feature_not_found "sparse" "Install sparse binary" fi sparse=no fi @@ -1774,7 +1776,7 @@ if test "$gtk" != "no"; then fi if ! $pkg_config --exists "$gtkpackage >= $gtkversion"; then if test "$gtk" = "yes" ; then - feature_not_found "gtk" + feature_not_found "gtk" "Install gtk2 or gtk3 (requires --with-gtkabi=3.0 option to configure) devel" fi gtk="no" elif ! $pkg_config --exists "$vtepackage >= $vteversion"; then @@ -1809,7 +1811,7 @@ elif has ${sdl_config}; then _sdlversion=`$sdlconfig --version | sed 's/[^0-9]//g'` else if test "$sdl" = "yes" ; then - feature_not_found "sdl" + feature_not_found "sdl" "Install SDL devel" fi sdl=no fi @@ -1853,7 +1855,7 @@ EOF fi # static link else # sdl not found if test "$sdl" = "yes" ; then - feature_not_found "sdl" + feature_not_found "sdl" "Install SDL devel" fi sdl=no fi # sdl compile test @@ -1919,10 +1921,10 @@ EOF QEMU_CFLAGS="$QEMU_CFLAGS $vnc_tls_cflags" else if test "$vnc_tls" = "yes" ; then - feature_not_found "vnc-tls" + feature_not_found "vnc-tls" "Install gnutls devel" fi if test "$vnc_ws" = "yes" ; then - feature_not_found "vnc-ws" + feature_not_found "vnc-ws" "Install gnutls devel" fi vnc_tls=no vnc_ws=no @@ -1946,7 +1948,7 @@ EOF QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags" else if test "$vnc_sasl" = "yes" ; then - feature_not_found "vnc-sasl" + feature_not_found "vnc-sasl" "Install Cyrus SASL devel" fi vnc_sasl=no fi @@ -1968,7 +1970,7 @@ EOF QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags" else if test "$vnc_jpeg" = "yes" ; then - feature_not_found "vnc-jpeg" + feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel" fi vnc_jpeg=no fi @@ -2000,7 +2002,7 @@ EOF QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags" else if test "$vnc_png" = "yes" ; then - feature_not_found "vnc-png" + feature_not_found "vnc-png" "Install libpng devel" fi vnc_png=no fi @@ -2044,7 +2046,7 @@ EOF libs_tools="$uuid_libs $libs_tools" else if test "$uuid" = "yes" ; then - feature_not_found "uuid" + feature_not_found "uuid" "Install libuuid devel" fi uuid=no fi @@ -2078,7 +2080,7 @@ EOF xfs="yes" else if test "$xfs" = "yes" ; then - feature_not_found "xfs" + feature_not_found "xfs" "Instal xfsprogs/xfslibs devel" fi xfs=no fi @@ -2104,7 +2106,7 @@ EOF libs_tools="$vde_libs $libs_tools" else if test "$vde" = "yes" ; then - feature_not_found "vde" + feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel" fi vde=no fi @@ -2147,7 +2149,7 @@ EOF libs_tools="$cap_libs $libs_tools" else if test "$cap_ng" = "yes" ; then - feature_not_found "cap_ng" + feature_not_found "cap_ng" "Install libcap-ng devel" fi cap_ng=no fi @@ -2252,7 +2254,7 @@ EOF libs_softmmu="$brlapi_libs $libs_softmmu" else if test "$brlapi" = "yes" ; then - feature_not_found "brlapi" + feature_not_found "brlapi" "Install brlapi devel" fi brlapi=no fi @@ -2289,7 +2291,7 @@ EOF curses=yes else if test "$curses" = "yes" ; then - feature_not_found "curses" + feature_not_found "curses" "Install ncurses devel" fi curses=no fi @@ -2315,7 +2317,7 @@ EOF libs_softmmu="$curl_libs $libs_softmmu" else if test "$curl" = "yes" ; then - feature_not_found "curl" + feature_not_found "curl" "Install libcurl devel" fi curl=no fi @@ -2335,7 +2337,7 @@ EOF libs_softmmu="$bluez_libs $libs_softmmu" else if test "$bluez" = "yes" ; then - feature_not_found "bluez" + feature_not_found "bluez" "Install bluez-libs/libbluetooth devel" fi bluez="no" fi @@ -2471,7 +2473,7 @@ EOF libs_softmmu="$rbd_libs $libs_softmmu" else if test "$rbd" = "yes" ; then - feature_not_found "rados block device" + feature_not_found "rados block device" "Install librbd/ceph devel" fi rbd=no fi @@ -2537,7 +2539,7 @@ EOF libs_tools="$libs_tools -laio" else if test "$linux_aio" = "yes" ; then - feature_not_found "linux AIO" + feature_not_found "linux AIO" "Install libaio devel" fi linux_aio=no fi @@ -2585,7 +2587,7 @@ EOF libattr=yes else if test "$attr" = "yes" ; then - feature_not_found "ATTR" + feature_not_found "ATTR" "Install libc6 or libattr devel" fi attr=no fi @@ -2689,7 +2691,7 @@ EOF glx=yes else if test "$glx" = "yes" ; then - feature_not_found "glx" + feature_not_found "glx" "Install GL devel (e.g. MESA)" fi glx_libs= glx=no @@ -2714,7 +2716,7 @@ if test "$glusterfs" != "no" ; then fi else if test "$glusterfs" = "yes" ; then - feature_not_found "GlusterFS backend support" + feature_not_found "GlusterFS backend support" "Install glusterfs-api devel" fi glusterfs="no" fi @@ -3034,7 +3036,7 @@ if test "$docs" != "no" ; then docs=yes else if test "$docs" = "yes" ; then - feature_not_found "docs" + feature_not_found "docs" "Install texinfo and Perl/perl-podlators" fi docs=no fi @@ -3083,7 +3085,7 @@ EOF LIBS="$LIBS -liscsi" else if test "$libiscsi" = "yes" ; then - feature_not_found "libiscsi" + feature_not_found "libiscsi" "Install libiscsi devel" fi libiscsi="no" fi @@ -3167,7 +3169,7 @@ EOF spice_server_version=$($pkg_config --modversion spice-server) else if test "$spice" = "yes" ; then - feature_not_found "spice" + feature_not_found "spice" "Install spice-server and spice-protocol devel" fi spice="no" fi @@ -3217,7 +3219,7 @@ if test "$libusb" != "no" ; then libs_softmmu="$libs_softmmu $libusb_libs" else if test "$libusb" = "yes"; then - feature_not_found "libusb" + feature_not_found "libusb" "Install libusb devel" fi libusb="no" fi @@ -3233,7 +3235,7 @@ if test "$usb_redir" != "no" ; then libs_softmmu="$libs_softmmu $usb_redir_libs" else if test "$usb_redir" = "yes"; then - feature_not_found "usb-redir" + feature_not_found "usb-redir" "Install usbredir devel" fi usb_redir="no" fi @@ -4320,7 +4322,7 @@ if test "$trace_backend" = "ftrace"; then echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak trace_default=no else - feature_not_found "ftrace(trace backend)" + feature_not_found "ftrace(trace backend)" "ftrace requires Linux" fi fi echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak From 62dc90c668fc4e17639f594b70a1001780f59a9b Mon Sep 17 00:00:00 2001 From: Michael Tokarev Date: Fri, 17 Jan 2014 14:23:51 +0400 Subject: [PATCH 05/10] linux-user: refactor do_socketcall() Refactor do_socketcall() to do argument conversion/checking first, according to a lookup table (which call has how many args) and by calling the right function second with ready-to-go arguments. This ensures that all arguments are handled as abi_long, according to socketcall prototype, and simplifies argument handling alot too. Signed-off-by: Michael Tokarev Reviewed-by: Peter Maydell --- linux-user/syscall.c | 324 +++++++++---------------------------------- 1 file changed, 67 insertions(+), 257 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index bc0ac98d4f..f3700876a3 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -2177,271 +2177,81 @@ fail: /* do_socketcall() Must return target values and target errnos. */ static abi_long do_socketcall(int num, abi_ulong vptr) { - abi_long ret; - const int n = sizeof(abi_ulong); + static const unsigned ac[] = { /* number of arguments per call */ + [SOCKOP_socket] = 3, /* domain, type, protocol */ + [SOCKOP_bind] = 3, /* sockfd, addr, addrlen */ + [SOCKOP_connect] = 3, /* sockfd, addr, addrlen */ + [SOCKOP_listen] = 2, /* sockfd, backlog */ + [SOCKOP_accept] = 3, /* sockfd, addr, addrlen */ + [SOCKOP_accept4] = 4, /* sockfd, addr, addrlen, flags */ + [SOCKOP_getsockname] = 3, /* sockfd, addr, addrlen */ + [SOCKOP_getpeername] = 3, /* sockfd, addr, addrlen */ + [SOCKOP_socketpair] = 4, /* domain, type, protocol, tab */ + [SOCKOP_send] = 4, /* sockfd, msg, len, flags */ + [SOCKOP_recv] = 4, /* sockfd, msg, len, flags */ + [SOCKOP_sendto] = 6, /* sockfd, msg, len, flags, addr, addrlen */ + [SOCKOP_recvfrom] = 6, /* sockfd, msg, len, flags, addr, addrlen */ + [SOCKOP_shutdown] = 2, /* sockfd, how */ + [SOCKOP_sendmsg] = 3, /* sockfd, msg, flags */ + [SOCKOP_recvmsg] = 3, /* sockfd, msg, flags */ + [SOCKOP_setsockopt] = 5, /* sockfd, level, optname, optval, optlen */ + [SOCKOP_getsockopt] = 5, /* sockfd, level, optname, optval, optlen */ + }; + abi_long a[6]; /* max 6 args */ - switch(num) { - case SOCKOP_socket: - { - abi_ulong domain, type, protocol; - - if (get_user_ual(domain, vptr) - || get_user_ual(type, vptr + n) - || get_user_ual(protocol, vptr + 2 * n)) - return -TARGET_EFAULT; - - ret = do_socket(domain, type, protocol); - } - break; - case SOCKOP_bind: - { - abi_ulong sockfd; - abi_ulong target_addr; - socklen_t addrlen; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(target_addr, vptr + n) - || get_user_ual(addrlen, vptr + 2 * n)) - return -TARGET_EFAULT; - - ret = do_bind(sockfd, target_addr, addrlen); - } - break; - case SOCKOP_connect: - { - abi_ulong sockfd; - abi_ulong target_addr; - socklen_t addrlen; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(target_addr, vptr + n) - || get_user_ual(addrlen, vptr + 2 * n)) - return -TARGET_EFAULT; - - ret = do_connect(sockfd, target_addr, addrlen); - } - break; - case SOCKOP_listen: - { - abi_ulong sockfd, backlog; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(backlog, vptr + n)) - return -TARGET_EFAULT; - - ret = get_errno(listen(sockfd, backlog)); - } - break; - case SOCKOP_accept: - { - abi_ulong sockfd; - abi_ulong target_addr, target_addrlen; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(target_addr, vptr + n) - || get_user_ual(target_addrlen, vptr + 2 * n)) - return -TARGET_EFAULT; - - ret = do_accept4(sockfd, target_addr, target_addrlen, 0); - } - break; - case SOCKOP_accept4: - { - abi_ulong sockfd; - abi_ulong target_addr, target_addrlen; - abi_ulong flags; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(target_addr, vptr + n) - || get_user_ual(target_addrlen, vptr + 2 * n) - || get_user_ual(flags, vptr + 3 * n)) { + /* first, collect the arguments in a[] according to ac[] */ + if (num >= 0 && num < ARRAY_SIZE(ac)) { + unsigned i; + assert(ARRAY_SIZE(a) >= ac[num]); /* ensure we have space for args */ + for (i = 0; i < ac[num]; ++i) { + if (get_user_ual(a[i], vptr + i * sizeof(abi_long)) != 0) { return -TARGET_EFAULT; } - - ret = do_accept4(sockfd, target_addr, target_addrlen, flags); } - break; - case SOCKOP_getsockname: - { - abi_ulong sockfd; - abi_ulong target_addr, target_addrlen; + } - if (get_user_ual(sockfd, vptr) - || get_user_ual(target_addr, vptr + n) - || get_user_ual(target_addrlen, vptr + 2 * n)) - return -TARGET_EFAULT; - - ret = do_getsockname(sockfd, target_addr, target_addrlen); - } - break; - case SOCKOP_getpeername: - { - abi_ulong sockfd; - abi_ulong target_addr, target_addrlen; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(target_addr, vptr + n) - || get_user_ual(target_addrlen, vptr + 2 * n)) - return -TARGET_EFAULT; - - ret = do_getpeername(sockfd, target_addr, target_addrlen); - } - break; - case SOCKOP_socketpair: - { - abi_ulong domain, type, protocol; - abi_ulong tab; - - if (get_user_ual(domain, vptr) - || get_user_ual(type, vptr + n) - || get_user_ual(protocol, vptr + 2 * n) - || get_user_ual(tab, vptr + 3 * n)) - return -TARGET_EFAULT; - - ret = do_socketpair(domain, type, protocol, tab); - } - break; - case SOCKOP_send: - { - abi_ulong sockfd; - abi_ulong msg; - size_t len; - abi_ulong flags; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(msg, vptr + n) - || get_user_ual(len, vptr + 2 * n) - || get_user_ual(flags, vptr + 3 * n)) - return -TARGET_EFAULT; - - ret = do_sendto(sockfd, msg, len, flags, 0, 0); - } - break; - case SOCKOP_recv: - { - abi_ulong sockfd; - abi_ulong msg; - size_t len; - abi_ulong flags; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(msg, vptr + n) - || get_user_ual(len, vptr + 2 * n) - || get_user_ual(flags, vptr + 3 * n)) - return -TARGET_EFAULT; - - ret = do_recvfrom(sockfd, msg, len, flags, 0, 0); - } - break; - case SOCKOP_sendto: - { - abi_ulong sockfd; - abi_ulong msg; - size_t len; - abi_ulong flags; - abi_ulong addr; - abi_ulong addrlen; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(msg, vptr + n) - || get_user_ual(len, vptr + 2 * n) - || get_user_ual(flags, vptr + 3 * n) - || get_user_ual(addr, vptr + 4 * n) - || get_user_ual(addrlen, vptr + 5 * n)) - return -TARGET_EFAULT; - - ret = do_sendto(sockfd, msg, len, flags, addr, addrlen); - } - break; - case SOCKOP_recvfrom: - { - abi_ulong sockfd; - abi_ulong msg; - size_t len; - abi_ulong flags; - abi_ulong addr; - socklen_t addrlen; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(msg, vptr + n) - || get_user_ual(len, vptr + 2 * n) - || get_user_ual(flags, vptr + 3 * n) - || get_user_ual(addr, vptr + 4 * n) - || get_user_ual(addrlen, vptr + 5 * n)) - return -TARGET_EFAULT; - - ret = do_recvfrom(sockfd, msg, len, flags, addr, addrlen); - } - break; - case SOCKOP_shutdown: - { - abi_ulong sockfd, how; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(how, vptr + n)) - return -TARGET_EFAULT; - - ret = get_errno(shutdown(sockfd, how)); - } - break; - case SOCKOP_sendmsg: - case SOCKOP_recvmsg: - { - abi_ulong fd; - abi_ulong target_msg; - abi_ulong flags; - - if (get_user_ual(fd, vptr) - || get_user_ual(target_msg, vptr + n) - || get_user_ual(flags, vptr + 2 * n)) - return -TARGET_EFAULT; - - ret = do_sendrecvmsg(fd, target_msg, flags, - (num == SOCKOP_sendmsg)); - } - break; - case SOCKOP_setsockopt: - { - abi_ulong sockfd; - abi_ulong level; - abi_ulong optname; - abi_ulong optval; - abi_ulong optlen; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(level, vptr + n) - || get_user_ual(optname, vptr + 2 * n) - || get_user_ual(optval, vptr + 3 * n) - || get_user_ual(optlen, vptr + 4 * n)) - return -TARGET_EFAULT; - - ret = do_setsockopt(sockfd, level, optname, optval, optlen); - } - break; - case SOCKOP_getsockopt: - { - abi_ulong sockfd; - abi_ulong level; - abi_ulong optname; - abi_ulong optval; - socklen_t optlen; - - if (get_user_ual(sockfd, vptr) - || get_user_ual(level, vptr + n) - || get_user_ual(optname, vptr + 2 * n) - || get_user_ual(optval, vptr + 3 * n) - || get_user_ual(optlen, vptr + 4 * n)) - return -TARGET_EFAULT; - - ret = do_getsockopt(sockfd, level, optname, optval, optlen); - } - break; + /* now when we have the args, actually handle the call */ + switch (num) { + case SOCKOP_socket: /* domain, type, protocol */ + return do_socket(a[0], a[1], a[2]); + case SOCKOP_bind: /* sockfd, addr, addrlen */ + return do_bind(a[0], a[1], a[2]); + case SOCKOP_connect: /* sockfd, addr, addrlen */ + return do_connect(a[0], a[1], a[2]); + case SOCKOP_listen: /* sockfd, backlog */ + return get_errno(listen(a[0], a[1])); + case SOCKOP_accept: /* sockfd, addr, addrlen */ + return do_accept4(a[0], a[1], a[2], 0); + case SOCKOP_accept4: /* sockfd, addr, addrlen, flags */ + return do_accept4(a[0], a[1], a[2], a[3]); + case SOCKOP_getsockname: /* sockfd, addr, addrlen */ + return do_getsockname(a[0], a[1], a[2]); + case SOCKOP_getpeername: /* sockfd, addr, addrlen */ + return do_getpeername(a[0], a[1], a[2]); + case SOCKOP_socketpair: /* domain, type, protocol, tab */ + return do_socketpair(a[0], a[1], a[2], a[3]); + case SOCKOP_send: /* sockfd, msg, len, flags */ + return do_sendto(a[0], a[1], a[2], a[3], 0, 0); + case SOCKOP_recv: /* sockfd, msg, len, flags */ + return do_recvfrom(a[0], a[1], a[2], a[3], 0, 0); + case SOCKOP_sendto: /* sockfd, msg, len, flags, addr, addrlen */ + return do_sendto(a[0], a[1], a[2], a[3], a[4], a[5]); + case SOCKOP_recvfrom: /* sockfd, msg, len, flags, addr, addrlen */ + return do_recvfrom(a[0], a[1], a[2], a[3], a[4], a[5]); + case SOCKOP_shutdown: /* sockfd, how */ + return get_errno(shutdown(a[0], a[1])); + case SOCKOP_sendmsg: /* sockfd, msg, flags */ + return do_sendrecvmsg(a[0], a[1], a[2], 1); + case SOCKOP_recvmsg: /* sockfd, msg, flags */ + return do_sendrecvmsg(a[0], a[1], a[2], 0); + case SOCKOP_setsockopt: /* sockfd, level, optname, optval, optlen */ + return do_setsockopt(a[0], a[1], a[2], a[3], a[4]); + case SOCKOP_getsockopt: /* sockfd, level, optname, optval, optlen */ + return do_getsockopt(a[0], a[1], a[2], a[3], a[4]); default: gemu_log("Unsupported socketcall: %d\n", num); - ret = -TARGET_ENOSYS; - break; + return -TARGET_ENOSYS; } - return ret; } #endif From 262471794d6d75435fa755eb2d6363d941743b14 Mon Sep 17 00:00:00 2001 From: Michael Tokarev Date: Fri, 7 Feb 2014 12:22:18 +0400 Subject: [PATCH 06/10] net: declare struct iovec in checksum.h to fix compiler warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The checksum calculation header exports a function that refers to struct iov defined in iov.h. Without including the former, build fails like this: In file included from hw/net/fsl_etsec/rings.c:24:0: include/net/checksum.h:51:31: error: ‘struct iovec’ declared inside parameter list [-Werror] include/net/checksum.h:51:31: error: its scope is only this definition or declaration, which is probably not what you want [-Werror] Mention struct iovec there. Reported-by: Alexander Graf Signed-off-by: Michael Tokarev --- include/net/checksum.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/net/checksum.h b/include/net/checksum.h index 80203fb6e0..2d7a363d40 100644 --- a/include/net/checksum.h +++ b/include/net/checksum.h @@ -19,6 +19,7 @@ #define QEMU_NET_CHECKSUM_H #include +struct iovec; uint32_t net_checksum_add_cont(int len, uint8_t *buf, int seq); uint16_t net_checksum_finish(uint32_t sum); From 24c84e687edd628084dd383ab1f1601765dbfd03 Mon Sep 17 00:00:00 2001 From: Michael Tokarev Date: Fri, 7 Feb 2014 12:23:05 +0400 Subject: [PATCH 07/10] vl: remove old, long-unused defines Signed-off-by: Michael Tokarev --- vl.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/vl.c b/vl.c index a7b00cdd37..a7c3f8ea28 100644 --- a/vl.c +++ b/vl.c @@ -172,9 +172,6 @@ int main(int argc, char **argv) #include "qapi/string-input-visitor.h" #include "qom/object_interfaces.h" -//#define DEBUG_NET -//#define DEBUG_SLIRP - #define DEFAULT_RAM_SIZE 128 #define MAX_VIRTIO_CONSOLES 1 From b33276a7a8224de8f1b2adbf03eede36d63e1c33 Mon Sep 17 00:00:00 2001 From: Michael Tokarev Date: Fri, 7 Feb 2014 12:26:14 +0400 Subject: [PATCH 08/10] vl: trim includes Over time, lots of stuff moved from vl.c into separate files. But include statements has never been cleaned, and they continue to carry lots of anymore-unused stuff. Remove includes which are not relevant for vl.c anymore. Apparently there are more includes like this, because many are included from qemu-common.h and the like, or, for example, I don't see were we use win32-specific stuff in vl.c (so that maybe #include might be removed too). Signed-off-by: Michael Tokarev --- vl.c | 52 +--------------------------------------------------- 1 file changed, 1 insertion(+), 51 deletions(-) diff --git a/vl.c b/vl.c index a7c3f8ea28..316de54101 100644 --- a/vl.c +++ b/vl.c @@ -27,64 +27,13 @@ #include #include #include -#include -#include "qemu/bitmap.h" -/* Needed early for CONFIG_BSD etc. */ #include "config-host.h" -#ifndef _WIN32 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_BSD -#include -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) -#include -#else -#include -#endif -#else -#ifdef __linux__ -#include - -#include -#include -#endif - #ifdef CONFIG_SECCOMP #include "sysemu/seccomp.h" #endif -#ifdef __sun__ -#include -#include -#include -#include -#include -#include -#include // must come after ip.h -#include -#include -#include -#include -#include -#endif -#endif -#endif - #if defined(CONFIG_VDE) #include #endif @@ -135,6 +84,7 @@ int main(int argc, char **argv) #include "exec/gdbstub.h" #include "qemu/timer.h" #include "sysemu/char.h" +#include "qemu/bitmap.h" #include "qemu/cache-utils.h" #include "sysemu/blockdev.h" #include "hw/block/block.h" From 5556332aba80c0579244c4458d3e35f13badd5ed Mon Sep 17 00:00:00 2001 From: Michael Tokarev Date: Tue, 11 Feb 2014 14:22:32 +0400 Subject: [PATCH 09/10] gitignore: anchor all ignored names by default, patterns/names in .gitignore are applied recursively to all subdirectories. So any name mentioned in .gitignore is ignored in all subdirectores. This is good for, say. object files (*.o), but not good for particular names which should be ignored only in one directory. For example, qemu-img.1 file is generated in the top directory, and it should be ignored only there, not in some subdir. At first, this might not matter much, but we have lots of examples already where it actually does not help at all. For example, top-level .gitignore ignores a file/dir named "patches" (which is very questionable by itself), but it is applied recursively, so git also ignores, for example, debian/patches/ which should not be ignored. So anchor all the names where appropriate. .gitignore should be cleaned up further, which will be addressed in a subsequent patch. Signed-off-by: Michael Tokarev --- .gitignore | 150 ++++++++++++++++++++++++++--------------------------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/.gitignore b/.gitignore index 1c9d63d651..6e48b5ed3f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,64 +1,64 @@ -config-devices.* -config-all-devices.* -config-all-disas.* -config-host.* -config-target.* -config.status -trace/generated-tracers.h -trace/generated-tracers.c -trace/generated-tracers-dtrace.h -trace/generated-tracers.dtrace -trace/generated-events.h -trace/generated-events.c -libcacard/trace/generated-tracers.c +/config-devices.* +/config-all-devices.* +/config-all-disas.* +/config-host.* +/config-target.* +/config.status +/trace/generated-tracers.h +/trace/generated-tracers.c +/trace/generated-tracers-dtrace.h +/trace/generated-tracers.dtrace +/trace/generated-events.h +/trace/generated-events.c +/libcacard/trace/generated-tracers.c *-timestamp -*-softmmu -*-darwin-user -*-linux-user -*-bsd-user +/*-softmmu +/*-darwin-user +/*-linux-user +/*-bsd-user libdis* libuser -linux-headers/asm -qapi-generated -qapi-types.[ch] -qapi-visit.[ch] -qmp-commands.h -qmp-marshal.c -qemu-doc.html -qemu-tech.html -qemu-doc.info -qemu-tech.info -qemu.1 -qemu.pod -qemu-img.1 -qemu-img.pod -qemu-img -qemu-nbd -qemu-nbd.8 -qemu-nbd.pod -qemu-options.def -qemu-options.texi -qemu-img-cmds.texi -qemu-img-cmds.h -qemu-io -qemu-ga -qemu-bridge-helper -qemu-monitor.texi -vscclient -qmp-commands.txt -test-bitops -test-coroutine -test-int128 -test-opts-visitor -test-qmp-input-visitor -test-qmp-output-visitor -test-string-input-visitor -test-string-output-visitor -test-visitor-serialization -fsdev/virtfs-proxy-helper -fsdev/virtfs-proxy-helper.1 -fsdev/virtfs-proxy-helper.pod -.gdbinit +/linux-headers/asm +/qapi-generated +/qapi-types.[ch] +/qapi-visit.[ch] +/qmp-commands.h +/qmp-marshal.c +/qemu-doc.html +/qemu-tech.html +/qemu-doc.info +/qemu-tech.info +/qemu.1 +/qemu.pod +/qemu-img.1 +/qemu-img.pod +/qemu-img +/qemu-nbd +/qemu-nbd.8 +/qemu-nbd.pod +/qemu-options.def +/qemu-options.texi +/qemu-img-cmds.texi +/qemu-img-cmds.h +/qemu-io +/qemu-ga +/qemu-bridge-helper +/qemu-monitor.texi +/qmp-commands.txt +/vscclient +/test-bitops +/test-coroutine +/test-int128 +/test-opts-visitor +/test-qmp-input-visitor +/test-qmp-output-visitor +/test-string-input-visitor +/test-string-output-visitor +/test-visitor-serialization +/fsdev/virtfs-proxy-helper +/fsdev/virtfs-proxy-helper.1 +/fsdev/virtfs-proxy-helper.pod +/.gdbinit *.a *.aux *.cp @@ -77,7 +77,7 @@ fsdev/virtfs-proxy-helper.pod *.tp *.vr *.d -!scripts/qemu-guest-agent/fsfreeze-hook.d +!/scripts/qemu-guest-agent/fsfreeze-hook.d *.o *.lo *.la @@ -90,22 +90,22 @@ fsdev/virtfs-proxy-helper.pod *.gcda *.gcno patches -pc-bios/bios-pq/status -pc-bios/vgabios-pq/status -pc-bios/optionrom/linuxboot.asm -pc-bios/optionrom/linuxboot.bin -pc-bios/optionrom/linuxboot.raw -pc-bios/optionrom/linuxboot.img -pc-bios/optionrom/multiboot.asm -pc-bios/optionrom/multiboot.bin -pc-bios/optionrom/multiboot.raw -pc-bios/optionrom/multiboot.img -pc-bios/optionrom/kvmvapic.asm -pc-bios/optionrom/kvmvapic.bin -pc-bios/optionrom/kvmvapic.raw -pc-bios/optionrom/kvmvapic.img -pc-bios/s390-ccw/s390-ccw.elf -pc-bios/s390-ccw/s390-ccw.img +/pc-bios/bios-pq/status +/pc-bios/vgabios-pq/status +/pc-bios/optionrom/linuxboot.asm +/pc-bios/optionrom/linuxboot.bin +/pc-bios/optionrom/linuxboot.raw +/pc-bios/optionrom/linuxboot.img +/pc-bios/optionrom/multiboot.asm +/pc-bios/optionrom/multiboot.bin +/pc-bios/optionrom/multiboot.raw +/pc-bios/optionrom/multiboot.img +/pc-bios/optionrom/kvmvapic.asm +/pc-bios/optionrom/kvmvapic.bin +/pc-bios/optionrom/kvmvapic.raw +/pc-bios/optionrom/kvmvapic.img +/pc-bios/s390-ccw/s390-ccw.elf +/pc-bios/s390-ccw/s390-ccw.img .stgit-* cscope.* tags From 88c1ee73d3231c74ff90bcfc084a7589670ec244 Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Mon, 10 Feb 2014 22:49:35 -0800 Subject: [PATCH 10/10] char/serial: Fix emptyness check This was guarding against a full fifo rather than an empty fifo when popping. Fix. Signed-off-by: Peter Crosthwaite Reviewed-by: Martin Kletzander Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Michael Tokarev --- hw/char/serial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/char/serial.c b/hw/char/serial.c index 27dab7d9d6..6d3b5aff8b 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -225,7 +225,7 @@ static gboolean serial_xmit(GIOChannel *chan, GIOCondition cond, void *opaque) if (s->tsr_retry <= 0) { if (s->fcr & UART_FCR_FE) { - s->tsr = fifo8_is_full(&s->xmit_fifo) ? + s->tsr = fifo8_is_empty(&s->xmit_fifo) ? 0 : fifo8_pop(&s->xmit_fifo); if (!s->xmit_fifo.num) { s->lsr |= UART_LSR_THRE;