Compare commits
5 Commits
qdev-array
...
v2.4.0.1
Author | SHA1 | Date | |
---|---|---|---|
|
83c92b4514 | ||
|
5a1ccdfe44 | ||
|
7aa2bcad0c | ||
|
3a56af1fbc | ||
|
efec4dcd25 |
@@ -740,7 +740,8 @@ process_tx_desc(E1000State *s, struct e1000_tx_desc *dp)
|
|||||||
memmove(tp->data, tp->header, tp->hdr_len);
|
memmove(tp->data, tp->header, tp->hdr_len);
|
||||||
tp->size = tp->hdr_len;
|
tp->size = tp->hdr_len;
|
||||||
}
|
}
|
||||||
} while (split_size -= bytes);
|
split_size -= bytes;
|
||||||
|
} while (bytes && split_size);
|
||||||
} else if (!tp->tse && tp->cptse) {
|
} else if (!tp->tse && tp->cptse) {
|
||||||
// context descriptor TSE is not set, while data descriptor TSE is set
|
// context descriptor TSE is not set, while data descriptor TSE is set
|
||||||
DBGOUT(TXERR, "TCP segmentation error\n");
|
DBGOUT(TXERR, "TCP segmentation error\n");
|
||||||
|
@@ -230,6 +230,9 @@ ssize_t ne2000_receive(NetClientState *nc, const uint8_t *buf, size_t size_)
|
|||||||
}
|
}
|
||||||
|
|
||||||
index = s->curpag << 8;
|
index = s->curpag << 8;
|
||||||
|
if (index >= NE2000_PMEM_END) {
|
||||||
|
index = s->start;
|
||||||
|
}
|
||||||
/* 4 bytes for header */
|
/* 4 bytes for header */
|
||||||
total_len = size + 4;
|
total_len = size + 4;
|
||||||
/* address for next packet (4 bytes for CRC) */
|
/* address for next packet (4 bytes for CRC) */
|
||||||
@@ -253,7 +256,7 @@ ssize_t ne2000_receive(NetClientState *nc, const uint8_t *buf, size_t size_)
|
|||||||
if (index <= s->stop)
|
if (index <= s->stop)
|
||||||
avail = s->stop - index;
|
avail = s->stop - index;
|
||||||
else
|
else
|
||||||
avail = 0;
|
break;
|
||||||
len = size;
|
len = size;
|
||||||
if (len > avail)
|
if (len > avail)
|
||||||
len = avail;
|
len = avail;
|
||||||
@@ -315,13 +318,19 @@ static void ne2000_ioport_write(void *opaque, uint32_t addr, uint32_t val)
|
|||||||
offset = addr | (page << 4);
|
offset = addr | (page << 4);
|
||||||
switch(offset) {
|
switch(offset) {
|
||||||
case EN0_STARTPG:
|
case EN0_STARTPG:
|
||||||
s->start = val << 8;
|
if (val << 8 <= NE2000_PMEM_END) {
|
||||||
|
s->start = val << 8;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case EN0_STOPPG:
|
case EN0_STOPPG:
|
||||||
s->stop = val << 8;
|
if (val << 8 <= NE2000_PMEM_END) {
|
||||||
|
s->stop = val << 8;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case EN0_BOUNDARY:
|
case EN0_BOUNDARY:
|
||||||
s->boundary = val;
|
if (val << 8 < NE2000_PMEM_END) {
|
||||||
|
s->boundary = val;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case EN0_IMR:
|
case EN0_IMR:
|
||||||
s->imr = val;
|
s->imr = val;
|
||||||
@@ -362,7 +371,9 @@ static void ne2000_ioport_write(void *opaque, uint32_t addr, uint32_t val)
|
|||||||
s->phys[offset - EN1_PHYS] = val;
|
s->phys[offset - EN1_PHYS] = val;
|
||||||
break;
|
break;
|
||||||
case EN1_CURPAG:
|
case EN1_CURPAG:
|
||||||
s->curpag = val;
|
if (val << 8 < NE2000_PMEM_END) {
|
||||||
|
s->curpag = val;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case EN1_MULT ... EN1_MULT + 7:
|
case EN1_MULT ... EN1_MULT + 7:
|
||||||
s->mult[offset - EN1_MULT] = val;
|
s->mult[offset - EN1_MULT] = val;
|
||||||
|
15
ui/vnc.c
15
ui/vnc.c
@@ -2872,7 +2872,7 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
|
|||||||
pixman_image_get_width(vd->server));
|
pixman_image_get_width(vd->server));
|
||||||
int height = MIN(pixman_image_get_height(vd->guest.fb),
|
int height = MIN(pixman_image_get_height(vd->guest.fb),
|
||||||
pixman_image_get_height(vd->server));
|
pixman_image_get_height(vd->server));
|
||||||
int cmp_bytes, server_stride, min_stride, guest_stride, y = 0;
|
int cmp_bytes, server_stride, line_bytes, guest_ll, guest_stride, y = 0;
|
||||||
uint8_t *guest_row0 = NULL, *server_row0;
|
uint8_t *guest_row0 = NULL, *server_row0;
|
||||||
VncState *vs;
|
VncState *vs;
|
||||||
int has_dirty = 0;
|
int has_dirty = 0;
|
||||||
@@ -2891,17 +2891,21 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
|
|||||||
* Update server dirty map.
|
* Update server dirty map.
|
||||||
*/
|
*/
|
||||||
server_row0 = (uint8_t *)pixman_image_get_data(vd->server);
|
server_row0 = (uint8_t *)pixman_image_get_data(vd->server);
|
||||||
server_stride = guest_stride = pixman_image_get_stride(vd->server);
|
server_stride = guest_stride = guest_ll =
|
||||||
|
pixman_image_get_stride(vd->server);
|
||||||
cmp_bytes = MIN(VNC_DIRTY_PIXELS_PER_BIT * VNC_SERVER_FB_BYTES,
|
cmp_bytes = MIN(VNC_DIRTY_PIXELS_PER_BIT * VNC_SERVER_FB_BYTES,
|
||||||
server_stride);
|
server_stride);
|
||||||
if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
|
if (vd->guest.format != VNC_SERVER_FB_FORMAT) {
|
||||||
int width = pixman_image_get_width(vd->server);
|
int width = pixman_image_get_width(vd->server);
|
||||||
tmpbuf = qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, width);
|
tmpbuf = qemu_pixman_linebuf_create(VNC_SERVER_FB_FORMAT, width);
|
||||||
} else {
|
} else {
|
||||||
|
int guest_bpp =
|
||||||
|
PIXMAN_FORMAT_BPP(pixman_image_get_format(vd->guest.fb));
|
||||||
guest_row0 = (uint8_t *)pixman_image_get_data(vd->guest.fb);
|
guest_row0 = (uint8_t *)pixman_image_get_data(vd->guest.fb);
|
||||||
guest_stride = pixman_image_get_stride(vd->guest.fb);
|
guest_stride = pixman_image_get_stride(vd->guest.fb);
|
||||||
|
guest_ll = pixman_image_get_width(vd->guest.fb) * ((guest_bpp + 7) / 8);
|
||||||
}
|
}
|
||||||
min_stride = MIN(server_stride, guest_stride);
|
line_bytes = MIN(server_stride, guest_ll);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int x;
|
int x;
|
||||||
@@ -2932,9 +2936,10 @@ static int vnc_refresh_server_surface(VncDisplay *vd)
|
|||||||
if (!test_and_clear_bit(x, vd->guest.dirty[y])) {
|
if (!test_and_clear_bit(x, vd->guest.dirty[y])) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((x + 1) * cmp_bytes > min_stride) {
|
if ((x + 1) * cmp_bytes > line_bytes) {
|
||||||
_cmp_bytes = min_stride - x * cmp_bytes;
|
_cmp_bytes = line_bytes - x * cmp_bytes;
|
||||||
}
|
}
|
||||||
|
assert(_cmp_bytes >= 0);
|
||||||
if (memcmp(server_ptr, guest_ptr, _cmp_bytes) == 0) {
|
if (memcmp(server_ptr, guest_ptr, _cmp_bytes) == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user