[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 06/13] PC Chipset: Improve serial divisor calculation
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 06/13] PC Chipset: Improve serial divisor calculation |
Date: |
Tue, 17 Jul 2018 17:06:48 +0200 |
From: Calvin Lee <address@hidden>
This fixes several problems I found in the UART serial implementation.
Now all divisor values are allowed, while before divisor values of zero
and below the base baud rate were rejected. All changes are in reference
to http://www.sci.muni.cz/docs/pc/serport.txt
Signed-off-by: Calvin Lee <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/char/serial.c | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/hw/char/serial.c b/hw/char/serial.c
index cd7d747..d3b75f0 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -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);
}
@@ -341,7 +340,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;
--
1.8.3.1
- [Qemu-devel] [PULL 00/13] Misc fixes for QEMU 3.0.0-rc1, Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 01/13] dump: add kernel_gs_base to QEMU CPU state, Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 03/13] hyperv: rename vcpu_id to vp_index, Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 02/13] accel: Fix typo and grammar in comment, Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 06/13] PC Chipset: Improve serial divisor calculation,
Paolo Bonzini <=
- [Qemu-devel] [PULL 05/13] vhost-user-test: added proper TestServer *dest initialization in test_migrate(), Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 04/13] hyperv: ensure VP index equal to QEMU cpu_index, Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 07/13] hw/char/serial: retry write if EAGAIN, Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 09/13] virtio-scsi: fix hotplug ->reset() vs event race, Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 12/13] opts: remove redundant check for NULL parameter, Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 08/13] qdev: add HotplugHandler->post_plug() callback, Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 10/13] i386: fix regression parsing multiboot initrd modules, Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 11/13] i386: only parse the initrd_filename once for multiboot modules, Paolo Bonzini, 2018/07/17
- [Qemu-devel] [PULL 13/13] Document command line options with single dash, Paolo Bonzini, 2018/07/17
- Re: [Qemu-devel] [PULL 00/13] Misc fixes for QEMU 3.0.0-rc1, Peter Maydell, 2018/07/17