From nobody Tue Sep 30 23:39:19 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1526083643001135.78583632205118; Fri, 11 May 2018 17:07:23 -0700 (PDT) Received: from localhost ([::1]:56875 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fHI4E-00018l-2K for importer@patchew.org; Fri, 11 May 2018 20:07:18 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55973) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fHI2v-0007QS-T5 for qemu-devel@nongnu.org; Fri, 11 May 2018 20:05:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fHI2t-0007b7-HA for qemu-devel@nongnu.org; Fri, 11 May 2018 20:05:57 -0400 Received: from mail-it0-x244.google.com ([2607:f8b0:4001:c0b::244]:52712) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fHI2t-0007ac-BX for qemu-devel@nongnu.org; Fri, 11 May 2018 20:05:55 -0400 Received: by mail-it0-x244.google.com with SMTP id y189-v6so3963215itb.2 for ; Fri, 11 May 2018 17:05:55 -0700 (PDT) Received: from localhost.localdomain (c-24-11-27-195.hsd1.ut.comcast.net. [24.11.27.195]) by smtp.gmail.com with ESMTPSA id v20-v6sm1965098iog.59.2018.05.11.17.05.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 May 2018 17:05:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=wEzkG7XiPR6N4VSx5jf9hXc5flKbnEVBuOQkdXU//OE=; b=liraaEsnonS4dKB7gyWF51npr9QtduZLDkcBlxmEzb4uGjqp+4PQOSwmejGXzh+gem PovuNW/x/yj607yEulAU1wkz1Pi/sHco5xMO5iIEAs/IHuHqKCWF44BOVBX3ZIB52+JM to8ygHXu/uuJ82aDglwNqq7l870pgXg+HsfQNddYKXDZXbpCszYGStY1E5e0fzkxqtF4 cCjKgd9Jo3ajvuQo/D4js4Ure4NV+M+DXeN/XlrAdjx43dzPUmpTt0qUwdViQsFBDdCU 7XcJuFmcy4xyo9Urr0abpPyFqSDA4yvyZFWWHMOthSXnvdVqWUOkX7ctBms9MetjFd5F dWHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=wEzkG7XiPR6N4VSx5jf9hXc5flKbnEVBuOQkdXU//OE=; b=EiIQczMe77z4VyZWZV6EIe/+8oWUCcTKbBR2oCYLK+RJFjb8u5SkTvHUiAzAuAVlxy YsMwDxvx42iFDLzpwZiXWA9nfE4e1iVcva9i5MjY3H6ATXfYtX2agWezVGDKA4z1TKmX aLtwbuP4dj2P40c390oxaWx8s1UI1qlGqWHTflNMlGHqvEvqxxeAXj6BaRjR6BCq8G8X EO9NDKg8+0wczLZv+jQe3EFfg62TQFzFO3unvGHisiMnxqFerL6OoebOgOYL0DOXZx6W c4SGYGsvLm9tfCy2DMFiqA61+2j+PSZAuTirtmGfvhAgFCOhWt9EE82dYYphezIf7fKK VCoQ== X-Gm-Message-State: ALKqPwe7D3N9g8tLH2beFNnH0MQ/MmLWTxz2ZNYS6gg09wFTk5cBG8NJ GT0pVpcJU8Xx3ia7U58u9Yq1wdlv X-Google-Smtp-Source: AB8JxZpKS0zfPZ9xq+LR98sRiAGewY6hzDC0AD2Thx7vCcTcY60NULipQuSzFk6AjvDDHISB1hqwMQ== X-Received: by 2002:a24:8b41:: with SMTP id g62-v6mr5638394ite.114.1526083554559; Fri, 11 May 2018 17:05:54 -0700 (PDT) From: Calvin Lee To: qemu-devel@nongnu.org Date: Fri, 11 May 2018 18:05:44 -0600 Message-Id: <20180512000545.966-2-cyrus296@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180512000545.966-1-cyrus296@gmail.com> References: <20180512000545.966-1-cyrus296@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4001:c0b::244 Subject: [Qemu-devel] [PATCH RFC v2 1/2] PC Chipset: Improve serial divisor calculation X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Calvin Lee , pbonzini@redhat.com, dgilbert@redhat.com, mst@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 --- I included a slight code-style change in this commit because it seemed close enough to the code I was editing to be relevant. If not, I can change the commit to not include this change. 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 2c080c9862..4159a46a2f 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -150,13 +150,10 @@ static void serial_update_irq(SerialState *s) =20 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; =20 - if (s->divider =3D=3D 0 || s->divider > s->baudbase) { - return; - } - /* Start bit. */ frame_size =3D 1; if (s->lcr & 0x08) { @@ -169,14 +166,16 @@ static void serial_update_parameters(SerialState *s) } else { parity =3D 'N'; } - if (s->lcr & 0x04) + if (s->lcr & 0x04) { stop_bits =3D 2; - else + } else { stop_bits =3D 1; + } =20 data_bits =3D (s->lcr & 0x03) + 5; frame_size +=3D data_bits + stop_bits; - speed =3D s->baudbase / s->divider; + /* Zero divisor should give about 3500 baud */ + speed =3D (s->divider =3D=3D 0) ? 3500 : (float) s->baudbase / s->divi= der; ssp.speed =3D speed; ssp.parity =3D parity; ssp.data_bits =3D data_bits; @@ -184,7 +183,7 @@ static void serial_update_parameters(SerialState *s) s->char_transmit_time =3D (NANOSECONDS_PER_SECOND / speed) * frame_si= ze; qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp); =20 - DPRINTF("speed=3D%d parity=3D%c data=3D%d stop=3D%d\n", + DPRINTF("speed=3D%.2f parity=3D%c data=3D%d stop=3D%d\n", speed, parity, data_bits, stop_bits); } =20 @@ -341,7 +340,11 @@ static void serial_ioport_write(void *opaque, hwaddr a= ddr, uint64_t val, default: case 0: if (s->lcr & UART_LCR_DLAB) { - s->divider =3D (s->divider & 0xff00) | val; + if (size =3D=3D 2) { + s->divider =3D (s->divider & 0xff00) | val; + } else if (size =3D=3D 4) { + s->divider =3D val; + } serial_update_parameters(s); } else { s->thr =3D (uint8_t) val; --=20 2.17.0