mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 01:33:56 -06:00
Bug fixes.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQEcBAABAgAGBQJbTgXfAAoJEL/70l94x66DTbYH/3NutBAkNZKX7EImj/d0I1O8 nERMVH1R70KBcugdsjhaBfTRoATDXdrBng4MBqloIK9dEMT3g6D4TFZJLU+WAjOc 8sItx0BrUR7Sl8SnAvWNFoqVtvVancFiLnu11DsFGM0l8mJHRlZSkQZ0Fd0FL2W/ OPnW7t6F7B2bc1VlPfSs093FVCoD3S+lJmbj64dwNrn8+fOX918V6gSaYQe92aIY pSbJjkRDx2iULmzMY8QH4OQiHgnd/Pijj+D628DMrUc0iW1Rsw5V2Yq7SMY6zoa8 MoI/YDwX6eRMU2mq74BrKlULZrpmQn+6ZCdZTvXzLwc2zpKD4puO4FuMBOA7yx4= =GcxI -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging Bug fixes. # gpg: Signature made Tue 17 Jul 2018 16:06:07 BST # gpg: using RSA key BFFBD25F78C7AE83 # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * remotes/bonzini/tags/for-upstream: Document command line options with single dash opts: remove redundant check for NULL parameter i386: only parse the initrd_filename once for multiboot modules i386: fix regression parsing multiboot initrd modules virtio-scsi: fix hotplug ->reset() vs event race qdev: add HotplugHandler->post_plug() callback hw/char/serial: retry write if EAGAIN PC Chipset: Improve serial divisor calculation vhost-user-test: added proper TestServer *dest initialization in test_migrate() hyperv: ensure VP index equal to QEMU cpu_index hyperv: rename vcpu_id to vp_index accel: Fix typo and grammar in comment dump: add kernel_gs_base to QEMU CPU state Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
59b5552f02
18 changed files with 184 additions and 62 deletions
|
@ -150,13 +150,10 @@ static void serial_update_irq(SerialState *s)
|
|||
|
||||
static void serial_update_parameters(SerialState *s)
|
||||
{
|
||||
int speed, parity, data_bits, stop_bits, frame_size;
|
||||
float speed;
|
||||
int parity, data_bits, stop_bits, frame_size;
|
||||
QEMUSerialSetParams ssp;
|
||||
|
||||
if (s->divider == 0 || s->divider > s->baudbase) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Start bit. */
|
||||
frame_size = 1;
|
||||
if (s->lcr & 0x08) {
|
||||
|
@ -169,14 +166,16 @@ static void serial_update_parameters(SerialState *s)
|
|||
} else {
|
||||
parity = 'N';
|
||||
}
|
||||
if (s->lcr & 0x04)
|
||||
if (s->lcr & 0x04) {
|
||||
stop_bits = 2;
|
||||
else
|
||||
} else {
|
||||
stop_bits = 1;
|
||||
}
|
||||
|
||||
data_bits = (s->lcr & 0x03) + 5;
|
||||
frame_size += data_bits + stop_bits;
|
||||
speed = s->baudbase / s->divider;
|
||||
/* Zero divisor should give about 3500 baud */
|
||||
speed = (s->divider == 0) ? 3500 : (float) s->baudbase / s->divider;
|
||||
ssp.speed = speed;
|
||||
ssp.parity = parity;
|
||||
ssp.data_bits = data_bits;
|
||||
|
@ -184,7 +183,7 @@ static void serial_update_parameters(SerialState *s)
|
|||
s->char_transmit_time = (NANOSECONDS_PER_SECOND / speed) * frame_size;
|
||||
qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
|
||||
|
||||
DPRINTF("speed=%d parity=%c data=%d stop=%d\n",
|
||||
DPRINTF("speed=%.2f parity=%c data=%d stop=%d\n",
|
||||
speed, parity, data_bits, stop_bits);
|
||||
}
|
||||
|
||||
|
@ -261,15 +260,20 @@ static void serial_xmit(SerialState *s)
|
|||
if (s->mcr & UART_MCR_LOOP) {
|
||||
/* in loopback mode, say that we just received a char */
|
||||
serial_receive1(s, &s->tsr, 1);
|
||||
} else if (qemu_chr_fe_write(&s->chr, &s->tsr, 1) == 0 &&
|
||||
s->tsr_retry < MAX_XMIT_RETRY) {
|
||||
assert(s->watch_tag == 0);
|
||||
s->watch_tag =
|
||||
qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP,
|
||||
serial_watch_cb, s);
|
||||
if (s->watch_tag > 0) {
|
||||
s->tsr_retry++;
|
||||
return;
|
||||
} else {
|
||||
int rc = qemu_chr_fe_write(&s->chr, &s->tsr, 1);
|
||||
|
||||
if ((rc == 0 ||
|
||||
(rc == -1 && errno == EAGAIN)) &&
|
||||
s->tsr_retry < MAX_XMIT_RETRY) {
|
||||
assert(s->watch_tag == 0);
|
||||
s->watch_tag =
|
||||
qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP,
|
||||
serial_watch_cb, s);
|
||||
if (s->watch_tag > 0) {
|
||||
s->tsr_retry++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
s->tsr_retry = 0;
|
||||
|
@ -341,7 +345,11 @@ static void serial_ioport_write(void *opaque, hwaddr addr, uint64_t val,
|
|||
default:
|
||||
case 0:
|
||||
if (s->lcr & UART_LCR_DLAB) {
|
||||
s->divider = (s->divider & 0xff00) | val;
|
||||
if (size == 2) {
|
||||
s->divider = (s->divider & 0xff00) | val;
|
||||
} else if (size == 4) {
|
||||
s->divider = val;
|
||||
}
|
||||
serial_update_parameters(s);
|
||||
} else {
|
||||
s->thr = (uint8_t) val;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue