From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JMiSI-00073N-V5 for qemu-devel@nongnu.org; Wed, 06 Feb 2008 06:28:43 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JMiSH-00072m-Uq for qemu-devel@nongnu.org; Wed, 06 Feb 2008 06:28:42 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JMiSH-00072d-Fy for qemu-devel@nongnu.org; Wed, 06 Feb 2008 06:28:41 -0500 Received: from smtp7-g19.free.fr ([212.27.42.64]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1JMiSG-0001re-QB for qemu-devel@nongnu.org; Wed, 06 Feb 2008 06:28:41 -0500 Received: from smtp7-g19.free.fr (localhost [127.0.0.1]) by smtp7-g19.free.fr (Postfix) with ESMTP id 29210322822 for ; Wed, 6 Feb 2008 12:28:40 +0100 (CET) Received: from [127.0.0.1] (rob92-4-82-225-201-66.fbx.proxad.net [82.225.201.66]) by smtp7-g19.free.fr (Postfix) with ESMTP id E1037322808 for ; Wed, 6 Feb 2008 12:28:39 +0100 (CET) Message-ID: <47A999E6.3080402@reactos.org> Date: Wed, 06 Feb 2008 12:28:38 +0100 From: =?ISO-8859-1?Q?Herv=E9_Poussineau?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090901030102050006020404" Subject: [Qemu-devel] [PATCH] Add serial loopback mode (+ fixes reset) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This is a multi-part message in MIME format. --------------090901030102050006020404 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: quoted-printable Hi, Serial emulation lacks loopback mode (ie a transmitted byte is directly=20 received in the serial port). After a reset, serial port registers should go back to default values.=20 This is done by adding a call to qemu_register_reset(). Attached patch fixes both issues. Herv=E9 --------------090901030102050006020404 Content-Type: text/plain; name="serial-loopback.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="serial-loopback.patch" Index: hw/serial.c =================================================================== RCS file: /sources/qemu/qemu/hw/serial.c,v retrieving revision 1.22 diff -u -r1.22 serial.c --- hw/serial.c 25 Nov 2007 00:55:06 -0000 1.22 +++ hw/serial.c 31 Jan 2008 16:51:19 -0000 @@ -93,6 +93,8 @@ int it_shift; }; +static void serial_receive_byte(SerialState *s, int ch); + static void serial_update_irq(SerialState *s) { if ((s->lsr & UART_LSR_DR) && (s->ier & UART_IER_RDI)) { @@ -161,11 +163,18 @@ s->lsr &= ~UART_LSR_THRE; serial_update_irq(s); ch = val; - qemu_chr_write(s->chr, &ch, 1); + if (!(s->mcr & UART_MCR_LOOP)) { + /* when not in loopback mode, send the char */ + qemu_chr_write(s->chr, &ch, 1); + } s->thr_ipending = 1; s->lsr |= UART_LSR_THRE; s->lsr |= UART_LSR_TEMT; serial_update_irq(s); + if (s->mcr & UART_MCR_LOOP) { + /* in loopback mode, say that we just received a char */ + serial_receive_byte(s, ch); + } } break; case 1: @@ -223,7 +232,10 @@ ret = s->rbr; s->lsr &= ~(UART_LSR_DR | UART_LSR_BI); serial_update_irq(s); - qemu_chr_accept_input(s->chr); + if (!(s->mcr & UART_MCR_LOOP)) { + /* in loopback mode, don't receive any data */ + qemu_chr_accept_input(s->chr); + } } break; case 1: @@ -346,6 +358,25 @@ return 0; } +static void serial_reset(void *opaque) +{ + SerialState *s = opaque; + + s->divider = 0; + s->rbr = 0; + s->ier = 0; + s->iir = UART_IIR_NO_INT; + s->lcr = 0; + s->mcr = 0; + s->lsr = UART_LSR_TEMT | UART_LSR_THRE; + s->msr = UART_MSR_DCD | UART_MSR_DSR | UART_MSR_CTS; + s->scr = 0; + + s->thr_ipending = 0; + s->last_break_enable = 0; + qemu_irq_lower(s->irq); +} + /* If fd is zero, it means that the serial device uses the console */ SerialState *serial_init(int base, qemu_irq irq, CharDriverState *chr) { @@ -355,9 +386,9 @@ if (!s) return NULL; s->irq = irq; - s->lsr = UART_LSR_TEMT | UART_LSR_THRE; - s->iir = UART_IIR_NO_INT; - s->msr = UART_MSR_DCD | UART_MSR_DSR | UART_MSR_CTS; + + qemu_register_reset(serial_reset, s); + serial_reset(s); register_savevm("serial", base, 2, serial_save, serial_load, s); @@ -452,12 +483,12 @@ if (!s) return NULL; s->irq = irq; - s->lsr = UART_LSR_TEMT | UART_LSR_THRE; - s->iir = UART_IIR_NO_INT; - s->msr = UART_MSR_DCD | UART_MSR_DSR | UART_MSR_CTS; s->base = base; s->it_shift = it_shift; + qemu_register_reset(serial_reset, s); + serial_reset(s); + register_savevm("serial", base, 2, serial_save, serial_load, s); if (ioregister) { --------------090901030102050006020404--