aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure44
-rw-r--r--fpu/softfloat.c33
-rw-r--r--hw/usb/host-libusb.c89
-rw-r--r--hw/usb/trace-events1
-rw-r--r--migration/ram.c4
-rw-r--r--tests/plugin/Makefile2
6 files changed, 136 insertions, 37 deletions
diff --git a/configure b/configure
index b01b5e3..ba88fd1 100755
--- a/configure
+++ b/configure
@@ -97,6 +97,11 @@ do_cxx() {
do_compiler "$cxx" "$@"
}
+# Append $2 to the variable named $1, with space separation
+add_to() {
+ eval $1=\${$1:+\"\$$1 \"}\$2
+}
+
update_cxxflags() {
# Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
# options which some versions of GCC's C++ compiler complain about
@@ -2024,16 +2029,35 @@ if ! compile_prog "" "" ; then
error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)"
fi
-gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits"
-gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers $gcc_flags"
-gcc_flags="-Wno-missing-include-dirs -Wempty-body -Wnested-externs $gcc_flags"
-gcc_flags="-Wendif-labels -Wno-shift-negative-value $gcc_flags"
-gcc_flags="-Wno-initializer-overrides -Wexpansion-to-defined $gcc_flags"
-gcc_flags="-Wno-string-plus-int -Wno-typedef-redefinition $gcc_flags"
-# Note that we do not add -Werror to gcc_flags here, because that would
-# enable it for all configure tests. If a configure test failed due
-# to -Werror this would just silently disable some features,
-# so it's too error prone.
+# Accumulate -Wfoo and -Wno-bar separately.
+# We will list all of the enable flags first, and the disable flags second.
+# Note that we do not add -Werror, because that would enable it for all
+# configure tests. If a configure test failed due to -Werror this would
+# just silently disable some features, so it's too error prone.
+
+warn_flags=
+add_to warn_flags -Wold-style-declaration
+add_to warn_flags -Wold-style-definition
+add_to warn_flags -Wtype-limits
+add_to warn_flags -Wformat-security
+add_to warn_flags -Wformat-y2k
+add_to warn_flags -Winit-self
+add_to warn_flags -Wignored-qualifiers
+add_to warn_flags -Wempty-body
+add_to warn_flags -Wnested-externs
+add_to warn_flags -Wendif-labels
+add_to warn_flags -Wexpansion-to-defined
+
+nowarn_flags=
+add_to nowarn_flags -Wno-initializer-overrides
+add_to nowarn_flags -Wno-missing-include-dirs
+add_to nowarn_flags -Wno-shift-negative-value
+add_to nowarn_flags -Wno-string-plus-int
+add_to nowarn_flags -Wno-typedef-redefinition
+add_to nowarn_flags -Wno-tautological-type-limit-compare
+add_to nowarn_flags -Wno-psabi
+
+gcc_flags="$warn_flags $nowarn_flags"
cc_has_warning_flag() {
write_c_skeleton;
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 6c8f2d5..5e9746c 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -3362,7 +3362,9 @@ static int32_t roundAndPackInt32(bool zSign, uint64_t absZ,
}
roundBits = absZ & 0x7F;
absZ = ( absZ + roundIncrement )>>7;
- absZ &= ~ ( ( ( roundBits ^ 0x40 ) == 0 ) & roundNearestEven );
+ if (!(roundBits ^ 0x40) && roundNearestEven) {
+ absZ &= ~1;
+ }
z = absZ;
if ( zSign ) z = - z;
if ( ( absZ>>32 ) || ( z && ( ( z < 0 ) ^ zSign ) ) ) {
@@ -3420,7 +3422,9 @@ static int64_t roundAndPackInt64(bool zSign, uint64_t absZ0, uint64_t absZ1,
if ( increment ) {
++absZ0;
if ( absZ0 == 0 ) goto overflow;
- absZ0 &= ~ ( ( (uint64_t) ( absZ1<<1 ) == 0 ) & roundNearestEven );
+ if (!(absZ1 << 1) && roundNearestEven) {
+ absZ0 &= ~1;
+ }
}
z = absZ0;
if ( zSign ) z = - z;
@@ -3480,7 +3484,9 @@ static int64_t roundAndPackUint64(bool zSign, uint64_t absZ0,
float_raise(float_flag_invalid, status);
return UINT64_MAX;
}
- absZ0 &= ~(((uint64_t)(absZ1<<1) == 0) & roundNearestEven);
+ if (!(absZ1 << 1) && roundNearestEven) {
+ absZ0 &= ~1;
+ }
}
if (zSign && absZ0) {
@@ -3603,7 +3609,9 @@ static float32 roundAndPackFloat32(bool zSign, int zExp, uint32_t zSig,
status->float_exception_flags |= float_flag_inexact;
}
zSig = ( zSig + roundIncrement )>>7;
- zSig &= ~ ( ( ( roundBits ^ 0x40 ) == 0 ) & roundNearestEven );
+ if (!(roundBits ^ 0x40) && roundNearestEven) {
+ zSig &= ~1;
+ }
if ( zSig == 0 ) zExp = 0;
return packFloat32( zSign, zExp, zSig );
@@ -3757,7 +3765,9 @@ static float64 roundAndPackFloat64(bool zSign, int zExp, uint64_t zSig,
status->float_exception_flags |= float_flag_inexact;
}
zSig = ( zSig + roundIncrement )>>10;
- zSig &= ~ ( ( ( roundBits ^ 0x200 ) == 0 ) & roundNearestEven );
+ if (!(roundBits ^ 0x200) && roundNearestEven) {
+ zSig &= ~1;
+ }
if ( zSig == 0 ) zExp = 0;
return packFloat64( zSign, zExp, zSig );
@@ -3983,8 +3993,9 @@ floatx80 roundAndPackFloatx80(int8_t roundingPrecision, bool zSign,
}
if ( increment ) {
++zSig0;
- zSig0 &=
- ~ ( ( (uint64_t) ( zSig1<<1 ) == 0 ) & roundNearestEven );
+ if (!(zSig1 << 1) && roundNearestEven) {
+ zSig0 &= ~1;
+ }
if ( (int64_t) zSig0 < 0 ) zExp = 1;
}
return packFloatx80( zSign, zExp, zSig0 );
@@ -4000,7 +4011,9 @@ floatx80 roundAndPackFloatx80(int8_t roundingPrecision, bool zSign,
zSig0 = UINT64_C(0x8000000000000000);
}
else {
- zSig0 &= ~ ( ( (uint64_t) ( zSig1<<1 ) == 0 ) & roundNearestEven );
+ if (!(zSig1 << 1) && roundNearestEven) {
+ zSig0 &= ~1;
+ }
}
}
else {
@@ -4270,7 +4283,9 @@ static float128 roundAndPackFloat128(bool zSign, int32_t zExp,
}
if ( increment ) {
add128( zSig0, zSig1, 0, 1, &zSig0, &zSig1 );
- zSig1 &= ~ ( ( zSig2 + zSig2 == 0 ) & roundNearestEven );
+ if ((zSig2 + zSig2 == 0) && roundNearestEven) {
+ zSig1 &= ~1;
+ }
}
else {
if ( ( zSig0 | zSig1 ) == 0 ) zExp = 0;
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
index e284413..ad7ed8f 100644
--- a/hw/usb/host-libusb.c
+++ b/hw/usb/host-libusb.c
@@ -80,6 +80,7 @@ struct USBHostDevice {
/* properties */
struct USBAutoFilter match;
+ char *hostdevice;
int32_t bootindex;
uint32_t iso_urb_count;
uint32_t iso_urb_frames;
@@ -97,6 +98,7 @@ struct USBHostDevice {
int addr;
char port[16];
+ int hostfd;
libusb_device *dev;
libusb_device_handle *dh;
struct libusb_device_descriptor ddesc;
@@ -880,26 +882,45 @@ static void usb_host_ep_update(USBHostDevice *s)
libusb_free_config_descriptor(conf);
}
-static int usb_host_open(USBHostDevice *s, libusb_device *dev)
+static int usb_host_open(USBHostDevice *s, libusb_device *dev, int hostfd)
{
USBDevice *udev = USB_DEVICE(s);
- int bus_num = libusb_get_bus_number(dev);
- int addr = libusb_get_device_address(dev);
+ int bus_num = 0;
+ int addr = 0;
int rc;
Error *local_err = NULL;
if (s->bh_postld_pending) {
return -1;
}
-
- trace_usb_host_open_started(bus_num, addr);
-
if (s->dh != NULL) {
goto fail;
}
- rc = libusb_open(dev, &s->dh);
- if (rc != 0) {
- goto fail;
+
+ if (dev) {
+ bus_num = libusb_get_bus_number(dev);
+ addr = libusb_get_device_address(dev);
+ trace_usb_host_open_started(bus_num, addr);
+
+ rc = libusb_open(dev, &s->dh);
+ if (rc != 0) {
+ goto fail;
+ }
+ } else {
+#if LIBUSB_API_VERSION >= 0x01000107
+ trace_usb_host_open_hostfd(hostfd);
+
+ rc = libusb_wrap_sys_device(ctx, hostfd, &s->dh);
+ if (rc != 0) {
+ goto fail;
+ }
+ s->hostfd = hostfd;
+ dev = libusb_get_device(s->dh);
+ bus_num = libusb_get_bus_number(dev);
+ addr = libusb_get_device_address(dev);
+#else
+ g_assert_not_reached();
+#endif
}
s->dev = dev;
@@ -951,6 +972,7 @@ fail:
static void usb_host_abort_xfers(USBHostDevice *s)
{
USBHostRequest *r, *rtmp;
+ int limit = 100;
QTAILQ_FOREACH_SAFE(r, &s->requests, next, rtmp) {
usb_host_req_abort(r);
@@ -961,6 +983,19 @@ static void usb_host_abort_xfers(USBHostDevice *s)
memset(&tv, 0, sizeof(tv));
tv.tv_usec = 2500;
libusb_handle_events_timeout(ctx, &tv);
+ if (--limit == 0) {
+ /*
+ * Don't wait forever for libusb calling the complete
+ * callback (which will unlink and free the request).
+ *
+ * Leaking memory here, to make sure libusb will not
+ * access memory which we have released already.
+ */
+ QTAILQ_FOREACH_SAFE(r, &s->requests, next, rtmp) {
+ QTAILQ_REMOVE(&s->requests, r, next);
+ }
+ return;
+ }
}
}
@@ -988,6 +1023,11 @@ static int usb_host_close(USBHostDevice *s)
s->dh = NULL;
s->dev = NULL;
+ if (s->hostfd != -1) {
+ close(s->hostfd);
+ s->hostfd = -1;
+ }
+
usb_host_auto_check(NULL);
return 0;
}
@@ -1025,9 +1065,6 @@ static libusb_device *usb_host_find_ref(int bus, int addr)
libusb_device *ret = NULL;
int i, n;
- if (usb_host_init() != 0) {
- return NULL;
- }
n = libusb_get_device_list(ctx, &devs);
for (i = 0; i < n; i++) {
if (libusb_get_bus_number(devs[i]) == bus &&
@@ -1046,6 +1083,10 @@ static void usb_host_realize(USBDevice *udev, Error **errp)
libusb_device *ldev;
int rc;
+ if (usb_host_init() != 0) {
+ error_setg(errp, "failed to init libusb");
+ return;
+ }
if (s->match.vendor_id > 0xffff) {
error_setg(errp, "vendorid out of range");
return;
@@ -1064,7 +1105,24 @@ static void usb_host_realize(USBDevice *udev, Error **errp)
udev->auto_attach = 0;
QTAILQ_INIT(&s->requests);
QTAILQ_INIT(&s->isorings);
+ s->hostfd = -1;
+#if LIBUSB_API_VERSION >= 0x01000107
+ if (s->hostdevice) {
+ int fd;
+ s->needs_autoscan = false;
+ fd = qemu_open(s->hostdevice, O_RDWR);
+ if (fd < 0) {
+ error_setg_errno(errp, errno, "failed to open %s", s->hostdevice);
+ return;
+ }
+ rc = usb_host_open(s, NULL, fd);
+ if (rc < 0) {
+ error_setg(errp, "failed to open host usb device %s", s->hostdevice);
+ return;
+ }
+ } else
+#endif
if (s->match.addr && s->match.bus_num &&
!s->match.vendor_id &&
!s->match.product_id &&
@@ -1077,7 +1135,7 @@ static void usb_host_realize(USBDevice *udev, Error **errp)
s->match.bus_num, s->match.addr);
return;
}
- rc = usb_host_open(s, ldev);
+ rc = usb_host_open(s, ldev, 0);
libusb_unref_device(ldev);
if (rc < 0) {
error_setg(errp, "failed to open host usb device %d:%d",
@@ -1605,6 +1663,9 @@ static Property usb_host_dev_properties[] = {
DEFINE_PROP_STRING("hostport", USBHostDevice, match.port),
DEFINE_PROP_UINT32("vendorid", USBHostDevice, match.vendor_id, 0),
DEFINE_PROP_UINT32("productid", USBHostDevice, match.product_id, 0),
+#if LIBUSB_API_VERSION >= 0x01000107
+ DEFINE_PROP_STRING("hostdevice", USBHostDevice, hostdevice),
+#endif
DEFINE_PROP_UINT32("isobufs", USBHostDevice, iso_urb_count, 4),
DEFINE_PROP_UINT32("isobsize", USBHostDevice, iso_urb_frames, 32),
DEFINE_PROP_BOOL("guest-reset", USBHostDevice,
@@ -1723,7 +1784,7 @@ static void usb_host_auto_check(void *unused)
if (s->dh != NULL) {
continue;
}
- if (usb_host_open(s, devs[i]) < 0) {
+ if (usb_host_open(s, devs[i], 0) < 0) {
s->errcount++;
continue;
}
diff --git a/hw/usb/trace-events b/hw/usb/trace-events
index 5817ce4..e9cdeee 100644
--- a/hw/usb/trace-events
+++ b/hw/usb/trace-events
@@ -291,6 +291,7 @@ usb_mtp_file_monitor_event(int dev, const char *path, const char *s) "dev %d, pa
# host-libusb.c
usb_host_open_started(int bus, int addr) "dev %d:%d"
+usb_host_open_hostfd(int hostfd) "hostfd %d"
usb_host_open_success(int bus, int addr) "dev %d:%d"
usb_host_open_failure(int bus, int addr) "dev %d:%d"
usb_host_close(int bus, int addr) "dev %d:%d"
diff --git a/migration/ram.c b/migration/ram.c
index 41cc530..069b6e3 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -913,10 +913,8 @@ static void migration_update_rates(RAMState *rs, int64_t end_time)
unencoded_size = (xbzrle_counters.pages - rs->xbzrle_pages_prev) *
TARGET_PAGE_SIZE;
encoded_size = xbzrle_counters.bytes - rs->xbzrle_bytes_prev;
- if (xbzrle_counters.pages == rs->xbzrle_pages_prev) {
+ if (xbzrle_counters.pages == rs->xbzrle_pages_prev || !encoded_size) {
xbzrle_counters.encoding_rate = 0;
- } else if (!encoded_size) {
- xbzrle_counters.encoding_rate = UINT64_MAX;
} else {
xbzrle_counters.encoding_rate = unencoded_size / encoded_size;
}
diff --git a/tests/plugin/Makefile b/tests/plugin/Makefile
index b3250e2..3a50451 100644
--- a/tests/plugin/Makefile
+++ b/tests/plugin/Makefile
@@ -17,7 +17,7 @@ NAMES += lockstep
SONAMES := $(addsuffix .so,$(addprefix lib,$(NAMES)))
-QEMU_CFLAGS += -fPIC
+QEMU_CFLAGS += -fPIC -Wpsabi
QEMU_CFLAGS += -I$(SRC_PATH)/include/qemu
all: $(SONAMES)