mirror of https://github.com/xemu-project/xemu.git
trivial patches for 2014-04-18
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQEcBAABAgAGBQJTUMffAAoJEL7lnXSkw9fb5YQH/1SHIUFYl85Z/qIXQppcLQXm Og32R7N82Z+E/FSBCuYWXB2Xo9jih4Pfn49A5tMyoITYQkrhNpHx3iXbZ2Ggk8/S FmD5Uuc3lCfhfldDyfKtKGMli0CYsxXfBKupUTrImHEGeQ4WSU8fkzuQy6MP9W+m HCms7nVXBgNqJ6mWBHkSgcXWbiKCPcfCJ5AvFQYDWHV83OF43jPnttXzKw/0ZNtZ COLW9j5KdFHerQx02mFOT0Ne8TUgEEUgihaKm5fJqaSZ6+xAA7LuHnSdXrRCyMOQ m9lY6WTQjf4XlSc4C13cAXSGgxfLeh8//DUa72huRuVMNRD66TGizoqlrS2NKuM= =AXjD -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/mjt/tags/trivial-patches-2014-04-18' into staging trivial patches for 2014-04-18 # gpg: Signature made Fri 18 Apr 2014 07:36:15 BST using RSA key ID A4C3D7DB # gpg: Good signature from "Michael Tokarev <mjt@tls.msk.ru>" # gpg: aka "Michael Tokarev <mjt@corpit.ru>" # gpg: aka "Michael Tokarev <mjt@debian.org>" # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 6EE1 95D1 886E 8FFB 810D 4324 457C E0A0 8044 65C5 # Subkey fingerprint: 6F67 E18E 7C91 C5B1 5514 66A7 BEE5 9D74 A4C3 D7DB * remotes/mjt/tags/trivial-patches-2014-04-18: Fix grammar in comment doc: grammify "allows to" configure: Remove redundant message for -Werror scripts: add sample model file for Coverity Scan xbzrle.c: Avoid undefined behaviour with signed arithmetic int128.h: Avoid undefined behaviours involving signed arithmetic hw/ide/ahci.c: Avoid shift left into sign bit net: Report error when device / hub combo is not found. configure: Fix indentation of help for --enable/disable-debug-info qga: trivial fix for unclear documentation of guest-set-time vl: Report accelerator not supported for target more nicely Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
4b8abfb78e
|
@ -1217,8 +1217,8 @@ Advanced options (experts only):
|
||||||
--enable-modules enable modules support
|
--enable-modules enable modules support
|
||||||
--enable-debug-tcg enable TCG debugging
|
--enable-debug-tcg enable TCG debugging
|
||||||
--disable-debug-tcg disable TCG debugging (default)
|
--disable-debug-tcg disable TCG debugging (default)
|
||||||
--enable-debug-info enable debugging information (default)
|
--enable-debug-info enable debugging information (default)
|
||||||
--disable-debug-info disable debugging information
|
--disable-debug-info disable debugging information
|
||||||
--enable-debug enable common debug build options
|
--enable-debug enable common debug build options
|
||||||
--enable-sparse enable sparse checker
|
--enable-sparse enable sparse checker
|
||||||
--disable-sparse disable sparse checker (default)
|
--disable-sparse disable sparse checker (default)
|
||||||
|
@ -4095,7 +4095,6 @@ echo "sparse enabled $sparse"
|
||||||
echo "strip binaries $strip_opt"
|
echo "strip binaries $strip_opt"
|
||||||
echo "profiler $profiler"
|
echo "profiler $profiler"
|
||||||
echo "static build $static"
|
echo "static build $static"
|
||||||
echo "-Werror enabled $werror"
|
|
||||||
if test "$darwin" = "yes" ; then
|
if test "$darwin" = "yes" ; then
|
||||||
echo "Cocoa support $cocoa"
|
echo "Cocoa support $cocoa"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -71,7 +71,7 @@ static void eeprom_write_data(SMBusDevice *dev, uint8_t cmd, uint8_t *buf, int l
|
||||||
printf("eeprom_write_byte: addr=0x%02x cmd=0x%02x val=0x%02x\n",
|
printf("eeprom_write_byte: addr=0x%02x cmd=0x%02x val=0x%02x\n",
|
||||||
dev->i2c.address, cmd, buf[0]);
|
dev->i2c.address, cmd, buf[0]);
|
||||||
#endif
|
#endif
|
||||||
/* An page write operation is not a valid SMBus command.
|
/* A page write operation is not a valid SMBus command.
|
||||||
It is a block write without a length byte. Fortunately we
|
It is a block write without a length byte. Fortunately we
|
||||||
get the full block anyway. */
|
get the full block anyway. */
|
||||||
/* TODO: Should this set the current location? */
|
/* TODO: Should this set the current location? */
|
||||||
|
|
|
@ -438,9 +438,9 @@ static void check_cmd(AHCIState *s, int port)
|
||||||
|
|
||||||
if ((pr->cmd & PORT_CMD_START) && pr->cmd_issue) {
|
if ((pr->cmd & PORT_CMD_START) && pr->cmd_issue) {
|
||||||
for (slot = 0; (slot < 32) && pr->cmd_issue; slot++) {
|
for (slot = 0; (slot < 32) && pr->cmd_issue; slot++) {
|
||||||
if ((pr->cmd_issue & (1 << slot)) &&
|
if ((pr->cmd_issue & (1U << slot)) &&
|
||||||
!handle_cmd(s, port, slot)) {
|
!handle_cmd(s, port, slot)) {
|
||||||
pr->cmd_issue &= ~(1 << slot);
|
pr->cmd_issue &= ~(1U << slot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ static inline Int128 int128_rshift(Int128 a, int n)
|
||||||
if (n >= 64) {
|
if (n >= 64) {
|
||||||
return (Int128) { h, h >> 63 };
|
return (Int128) { h, h >> 63 };
|
||||||
} else {
|
} else {
|
||||||
return (Int128) { (a.lo >> n) | (a.hi << (64 - n)), h };
|
return (Int128) { (a.lo >> n) | ((uint64_t)a.hi << (64 - n)), h };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ static inline Int128 int128_neg(Int128 a)
|
||||||
|
|
||||||
static inline Int128 int128_sub(Int128 a, Int128 b)
|
static inline Int128 int128_sub(Int128 a, Int128 b)
|
||||||
{
|
{
|
||||||
return (Int128){ a.lo - b.lo, a.hi - b.hi - (a.lo < b.lo) };
|
return (Int128){ a.lo - b.lo, (uint64_t)a.hi - b.hi - (a.lo < b.lo) };
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool int128_nonneg(Int128 a)
|
static inline bool int128_nonneg(Int128 a)
|
||||||
|
|
|
@ -952,10 +952,12 @@ void net_host_device_remove(Monitor *mon, const QDict *qdict)
|
||||||
|
|
||||||
nc = net_hub_find_client_by_name(vlan_id, device);
|
nc = net_hub_find_client_by_name(vlan_id, device);
|
||||||
if (!nc) {
|
if (!nc) {
|
||||||
|
error_report("Host network device '%s' on hub '%d' not found",
|
||||||
|
device, vlan_id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!net_host_check_device(nc->model)) {
|
if (!net_host_check_device(nc->model)) {
|
||||||
monitor_printf(mon, "invalid host network device %s\n", device);
|
error_report("invalid host network device '%s'", device);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qemu_del_net_client(nc);
|
qemu_del_net_client(nc);
|
||||||
|
|
|
@ -823,7 +823,7 @@ In this case, the block device must be exported using qemu-nbd:
|
||||||
qemu-nbd --socket=/tmp/my_socket my_disk.qcow2
|
qemu-nbd --socket=/tmp/my_socket my_disk.qcow2
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
The use of qemu-nbd allows to share a disk between several guests:
|
The use of qemu-nbd allows sharing of a disk between several guests:
|
||||||
@example
|
@example
|
||||||
qemu-nbd --socket=/tmp/my_socket --share=2 my_disk.qcow2
|
qemu-nbd --socket=/tmp/my_socket --share=2 my_disk.qcow2
|
||||||
@end example
|
@end example
|
||||||
|
|
|
@ -444,7 +444,8 @@ This option defines the type of the media: disk or cdrom.
|
||||||
@item cyls=@var{c},heads=@var{h},secs=@var{s}[,trans=@var{t}]
|
@item cyls=@var{c},heads=@var{h},secs=@var{s}[,trans=@var{t}]
|
||||||
These options have the same definition as they have in @option{-hdachs}.
|
These options have the same definition as they have in @option{-hdachs}.
|
||||||
@item snapshot=@var{snapshot}
|
@item snapshot=@var{snapshot}
|
||||||
@var{snapshot} is "on" or "off" and allows to enable snapshot for given drive (see @option{-snapshot}).
|
@var{snapshot} is "on" or "off" and controls snapshot mode for the given drive
|
||||||
|
(see @option{-snapshot}).
|
||||||
@item cache=@var{cache}
|
@item cache=@var{cache}
|
||||||
@var{cache} is "none", "writeback", "unsafe", "directsync" or "writethrough" and controls how the host cache is used to access block data.
|
@var{cache} is "none", "writeback", "unsafe", "directsync" or "writethrough" and controls how the host cache is used to access block data.
|
||||||
@item aio=@var{aio}
|
@item aio=@var{aio}
|
||||||
|
@ -1242,7 +1243,7 @@ Disable adaptive encodings. Adaptive encodings are enabled by default.
|
||||||
An adaptive encoding will try to detect frequently updated screen regions,
|
An adaptive encoding will try to detect frequently updated screen regions,
|
||||||
and send updates in these regions using a lossy encoding (like JPEG).
|
and send updates in these regions using a lossy encoding (like JPEG).
|
||||||
This can be really helpful to save bandwidth when playing videos. Disabling
|
This can be really helpful to save bandwidth when playing videos. Disabling
|
||||||
adaptive encodings allows to restore the original static behavior of encodings
|
adaptive encodings restores the original static behavior of encodings
|
||||||
like Tight.
|
like Tight.
|
||||||
|
|
||||||
@item share=[allow-exclusive|force-shared|ignore]
|
@item share=[allow-exclusive|force-shared|ignore]
|
||||||
|
@ -2805,7 +2806,7 @@ UTC or local time, respectively. @code{localtime} is required for correct date i
|
||||||
MS-DOS or Windows. To start at a specific point in time, provide @var{date} in the
|
MS-DOS or Windows. To start at a specific point in time, provide @var{date} in the
|
||||||
format @code{2006-06-17T16:01:21} or @code{2006-06-17}. The default base is UTC.
|
format @code{2006-06-17T16:01:21} or @code{2006-06-17}. The default base is UTC.
|
||||||
|
|
||||||
By default the RTC is driven by the host system time. This allows to use the
|
By default the RTC is driven by the host system time. This allows using of the
|
||||||
RTC as accurate reference clock inside the guest, specifically if the host
|
RTC as accurate reference clock inside the guest, specifically if the host
|
||||||
time is smoothly following an accurate external reference clock, e.g. via NTP.
|
time is smoothly following an accurate external reference clock, e.g. via NTP.
|
||||||
If you want to isolate the guest time from the host, you can set @option{clock}
|
If you want to isolate the guest time from the host, you can set @option{clock}
|
||||||
|
|
|
@ -171,7 +171,7 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
|
||||||
/* Now, if user has passed a time to set and the system time is set, we
|
/* Now, if user has passed a time to set and the system time is set, we
|
||||||
* just need to synchronize the hardware clock. However, if no time was
|
* just need to synchronize the hardware clock. However, if no time was
|
||||||
* passed, user is requesting the opposite: set the system time from the
|
* passed, user is requesting the opposite: set the system time from the
|
||||||
* hardware clock. */
|
* hardware clock (RTC). */
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
setsid();
|
setsid();
|
||||||
|
|
|
@ -96,8 +96,8 @@
|
||||||
##
|
##
|
||||||
# @guest-get-time:
|
# @guest-get-time:
|
||||||
#
|
#
|
||||||
# Get the information about guest time relative to the Epoch
|
# Get the information about guest's System Time relative to
|
||||||
# of 1970-01-01 in UTC.
|
# the Epoch of 1970-01-01 in UTC.
|
||||||
#
|
#
|
||||||
# Returns: Time in nanoseconds.
|
# Returns: Time in nanoseconds.
|
||||||
#
|
#
|
||||||
|
@ -117,11 +117,11 @@
|
||||||
# gap was, NTP might not be able to resynchronize the
|
# gap was, NTP might not be able to resynchronize the
|
||||||
# guest.
|
# guest.
|
||||||
#
|
#
|
||||||
# This command tries to set guest time to the given value,
|
# This command tries to set guest's System Time to the
|
||||||
# then sets the Hardware Clock to the current System Time.
|
# given value, then sets the Hardware Clock (RTC) to the
|
||||||
# This will make it easier for a guest to resynchronize
|
# current System Time. This will make it easier for a guest
|
||||||
# without waiting for NTP. If no @time is specified, then
|
# to resynchronize without waiting for NTP. If no @time is
|
||||||
# the time to set is read from RTC.
|
# specified, then the time to set is read from RTC.
|
||||||
#
|
#
|
||||||
# @time: #optional time of nanoseconds, relative to the Epoch
|
# @time: #optional time of nanoseconds, relative to the Epoch
|
||||||
# of 1970-01-01 in UTC.
|
# of 1970-01-01 in UTC.
|
||||||
|
|
|
@ -0,0 +1,183 @@
|
||||||
|
/* Coverity Scan model
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Markus Armbruster <armbru@redhat.com>
|
||||||
|
* Paolo Bonzini <pbonzini@redhat.com>
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU GPL, version 2 or, at your
|
||||||
|
* option, any later version. See the COPYING file in the top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the source code for our Coverity user model file. The
|
||||||
|
* purpose of user models is to increase scanning accuracy by explaining
|
||||||
|
* code Coverity can't see (out of tree libraries) or doesn't
|
||||||
|
* sufficiently understand. Better accuracy means both fewer false
|
||||||
|
* positives and more true defects. Memory leaks in particular.
|
||||||
|
*
|
||||||
|
* - A model file can't import any header files. Some built-in primitives are
|
||||||
|
* available but not wchar_t, NULL etc.
|
||||||
|
* - Modeling doesn't need full structs and typedefs. Rudimentary structs
|
||||||
|
* and similar types are sufficient.
|
||||||
|
* - An uninitialized local variable signifies that the variable could be
|
||||||
|
* any value.
|
||||||
|
*
|
||||||
|
* The model file must be uploaded by an admin in the analysis settings of
|
||||||
|
* http://scan.coverity.com/projects/378
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define NULL ((void *)0)
|
||||||
|
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
typedef char int8_t;
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
|
typedef int int32_t;
|
||||||
|
typedef long ssize_t;
|
||||||
|
typedef unsigned long long uint64_t;
|
||||||
|
typedef long long int64_t;
|
||||||
|
typedef _Bool bool;
|
||||||
|
|
||||||
|
/* exec.c */
|
||||||
|
|
||||||
|
typedef struct AddressSpace AddressSpace;
|
||||||
|
typedef uint64_t hwaddr;
|
||||||
|
|
||||||
|
static void __write(uint8_t *buf, ssize_t len)
|
||||||
|
{
|
||||||
|
int first, last;
|
||||||
|
__coverity_negative_sink__(len);
|
||||||
|
if (len == 0) return;
|
||||||
|
buf[0] = first;
|
||||||
|
buf[len-1] = last;
|
||||||
|
__coverity_writeall__(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __read(uint8_t *buf, ssize_t len)
|
||||||
|
{
|
||||||
|
__coverity_negative_sink__(len);
|
||||||
|
if (len == 0) return;
|
||||||
|
int first = buf[0];
|
||||||
|
int last = buf[len-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
|
||||||
|
int len, bool is_write)
|
||||||
|
{
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
// TODO: investigate impact of treating reads as producing
|
||||||
|
// tainted data, with __coverity_tainted_data_argument__(buf).
|
||||||
|
if (is_write) __write(buf, len); else __read(buf, len);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tainting */
|
||||||
|
|
||||||
|
typedef struct {} name2keysym_t;
|
||||||
|
static int get_keysym(const name2keysym_t *table,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
if (result > 0) {
|
||||||
|
__coverity_tainted_string_sanitize_content__(name);
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* glib memory allocation functions.
|
||||||
|
*
|
||||||
|
* Note that we ignore the fact that g_malloc of 0 bytes returns NULL,
|
||||||
|
* and g_realloc of 0 bytes frees the pointer.
|
||||||
|
*
|
||||||
|
* Modeling this would result in Coverity flagging a lot of memory
|
||||||
|
* allocations as potentially returning NULL, and asking us to check
|
||||||
|
* whether the result of the allocation is NULL or not. However, the
|
||||||
|
* resulting pointer should never be dereferenced anyway, and in fact
|
||||||
|
* it is not in the vast majority of cases.
|
||||||
|
*
|
||||||
|
* If a dereference did happen, this would suppress a defect report
|
||||||
|
* for an actual null pointer dereference. But it's too unlikely to
|
||||||
|
* be worth wading through the false positives, and with some luck
|
||||||
|
* we'll get a buffer overflow reported anyway.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void *malloc(size_t);
|
||||||
|
void *calloc(size_t, size_t);
|
||||||
|
void *realloc(void *, size_t);
|
||||||
|
void free(void *);
|
||||||
|
|
||||||
|
void *
|
||||||
|
g_malloc(size_t n_bytes)
|
||||||
|
{
|
||||||
|
void *mem;
|
||||||
|
__coverity_negative_sink__(n_bytes);
|
||||||
|
mem = malloc(n_bytes == 0 ? 1 : n_bytes);
|
||||||
|
if (!mem) __coverity_panic__();
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
g_malloc0(size_t n_bytes)
|
||||||
|
{
|
||||||
|
void *mem;
|
||||||
|
__coverity_negative_sink__(n_bytes);
|
||||||
|
mem = calloc(1, n_bytes == 0 ? 1 : n_bytes);
|
||||||
|
if (!mem) __coverity_panic__();
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void g_free(void *mem)
|
||||||
|
{
|
||||||
|
free(mem);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *g_realloc(void * mem, size_t n_bytes)
|
||||||
|
{
|
||||||
|
__coverity_negative_sink__(n_bytes);
|
||||||
|
mem = realloc(mem, n_bytes == 0 ? 1 : n_bytes);
|
||||||
|
if (!mem) __coverity_panic__();
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *g_try_malloc(size_t n_bytes)
|
||||||
|
{
|
||||||
|
__coverity_negative_sink__(n_bytes);
|
||||||
|
return malloc(n_bytes == 0 ? 1 : n_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *g_try_malloc0(size_t n_bytes)
|
||||||
|
{
|
||||||
|
__coverity_negative_sink__(n_bytes);
|
||||||
|
return calloc(1, n_bytes == 0 ? 1 : n_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *g_try_realloc(void *mem, size_t n_bytes)
|
||||||
|
{
|
||||||
|
__coverity_negative_sink__(n_bytes);
|
||||||
|
return realloc(mem, n_bytes == 0 ? 1 : n_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Other glib functions */
|
||||||
|
|
||||||
|
typedef struct _GIOChannel GIOChannel;
|
||||||
|
GIOChannel *g_io_channel_unix_new(int fd)
|
||||||
|
{
|
||||||
|
GIOChannel *c = g_malloc0(sizeof(GIOChannel));
|
||||||
|
__coverity_escape__(fd);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void g_assertion_message_expr(const char *domain,
|
||||||
|
const char *file,
|
||||||
|
int line,
|
||||||
|
const char *func,
|
||||||
|
const char *expr)
|
||||||
|
{
|
||||||
|
__coverity_panic__();
|
||||||
|
}
|
2
vl.c
2
vl.c
|
@ -2740,7 +2740,7 @@ static int configure_accelerator(QEMUMachine *machine)
|
||||||
if (!accel_list[i].available()) {
|
if (!accel_list[i].available()) {
|
||||||
printf("%s not supported for this target\n",
|
printf("%s not supported for this target\n",
|
||||||
accel_list[i].name);
|
accel_list[i].name);
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
*(accel_list[i].allowed) = true;
|
*(accel_list[i].allowed) = true;
|
||||||
ret = accel_list[i].init(machine);
|
ret = accel_list[i].init(machine);
|
||||||
|
|
8
xbzrle.c
8
xbzrle.c
|
@ -28,7 +28,7 @@ int xbzrle_encode_buffer(uint8_t *old_buf, uint8_t *new_buf, int slen,
|
||||||
{
|
{
|
||||||
uint32_t zrun_len = 0, nzrun_len = 0;
|
uint32_t zrun_len = 0, nzrun_len = 0;
|
||||||
int d = 0, i = 0;
|
int d = 0, i = 0;
|
||||||
long res, xor;
|
long res;
|
||||||
uint8_t *nzrun_start = NULL;
|
uint8_t *nzrun_start = NULL;
|
||||||
|
|
||||||
g_assert(!(((uintptr_t)old_buf | (uintptr_t)new_buf | slen) %
|
g_assert(!(((uintptr_t)old_buf | (uintptr_t)new_buf | slen) %
|
||||||
|
@ -93,9 +93,11 @@ int xbzrle_encode_buffer(uint8_t *old_buf, uint8_t *new_buf, int slen,
|
||||||
/* word at a time for speed, use of 32-bit long okay */
|
/* word at a time for speed, use of 32-bit long okay */
|
||||||
if (!res) {
|
if (!res) {
|
||||||
/* truncation to 32-bit long okay */
|
/* truncation to 32-bit long okay */
|
||||||
long mask = (long)0x0101010101010101ULL;
|
unsigned long mask = (unsigned long)0x0101010101010101ULL;
|
||||||
while (i < slen) {
|
while (i < slen) {
|
||||||
xor = *(long *)(old_buf + i) ^ *(long *)(new_buf + i);
|
unsigned long xor;
|
||||||
|
xor = *(unsigned long *)(old_buf + i)
|
||||||
|
^ *(unsigned long *)(new_buf + i);
|
||||||
if ((xor - mask) & ~xor & (mask << 7)) {
|
if ((xor - mask) & ~xor & (mask << 7)) {
|
||||||
/* found the end of an nzrun within the current long */
|
/* found the end of an nzrun within the current long */
|
||||||
while (old_buf[i] != new_buf[i]) {
|
while (old_buf[i] != new_buf[i]) {
|
||||||
|
|
Loading…
Reference in New Issue