From patchwork Tue Jun 28 17:33:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 641671 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rfDK06nzGz9snl for ; Wed, 29 Jun 2016 04:06:44 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=DMQEFqfj; dkim-atps=neutral Received: from localhost ([::1]:38583 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bHxPG-0007LE-Kq for incoming@patchwork.ozlabs.org; Tue, 28 Jun 2016 14:06:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59811) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bHwup-00016s-I9 for qemu-devel@nongnu.org; Tue, 28 Jun 2016 13:35:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bHwul-0003IA-Kt for qemu-devel@nongnu.org; Tue, 28 Jun 2016 13:35:15 -0400 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:35561) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bHwul-0003Hx-E6 for qemu-devel@nongnu.org; Tue, 28 Jun 2016 13:35:11 -0400 Received: by mail-wm0-x241.google.com with SMTP id a66so7652341wme.2 for ; Tue, 28 Jun 2016 10:35:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=taQkdlOTshEMKqu2tieSc+RdaWvgdZmZSQF3f6r+jN8=; b=DMQEFqfjDGeGD/QEvjnIOgGpalJtxcdREkm0tQphGvbjkpGfijWSDhVNGv+1vaAOaa jCZe++UU1CtlVKU3Bfrm/FiA7ySioymNh8looa7UsI4KLCchjPJGLpG04gt3Gk70FUIA xwGs/ElXAL5cGhRvonPMcE69ImLpqlkShvj7UD/M8+9XhFem3iaWTVTXZSEqRLR3HsiR +TUETxIfh8WPgRFZwy3yxv7gRFCMtsV1BjycEmd8IssLInYvtASIWohy2/8YlkYv/9rG p8sHebAFnjnOnZT/g13HUIGb5TeniiPm5Z48l2XgM6p+fLaYF6FA4yz0VE38ordK4EC8 +skA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=taQkdlOTshEMKqu2tieSc+RdaWvgdZmZSQF3f6r+jN8=; b=CGkPDVKgajwIIae1ctDpcT4mQrPnoxTaaDnuOGIpVXDSoukAAyGinU9qq5u3qsVLjg jTz2Qy8IQANdjWP0nJj+8TLlbuNKjmBVQpRbwl0FFyL3XFOKZA7zlbMwX+cNHynH2d0k gNfascVH0Xu3k3ppfphdl3uWS+z9BmFeTG83ifvZ4AI2XxOI868WYVVEmgUj3h02zD7j QIMPg9fdLC6Pd4+SE/M/DpIFOCgVX5+Cpj6R7FC7dnfigJpgEkexjOXGZ62wizQd0Mkb Lx5vQjBQztyKRRDoUVp0u2Vn7Wry0N573R95hgS7hxoRz5KktQ7aVX+cUmplF+O8TQKR LzAA== X-Gm-Message-State: ALyK8tLYbBbgvecUhiVsakvtmBZnTujlA/vmeIC3s+oY7Ltldt/Ipsere11SzBLnZUykaA== X-Received: by 10.28.73.212 with SMTP id w203mr4813029wma.98.1467135310778; Tue, 28 Jun 2016 10:35:10 -0700 (PDT) Received: from donizetti.lan (94-39-188-118.adsl-ull.clienti.tiscali.it. [94.39.188.118]) by smtp.gmail.com with ESMTPSA id c142sm5305wme.18.2016.06.28.10.35.09 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 28 Jun 2016 10:35:10 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 28 Jun 2016 19:33:59 +0200 Message-Id: <1467135242-874-30-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1467135242-874-1-git-send-email-pbonzini@redhat.com> References: <1467135242-874-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::241 Subject: [Qemu-devel] [PULL 29/32] serial: remove watch on reset 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: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Otherwise, this can cause serial_xmit to be entered with LSR.TEMT=0, which is invalid and causes an assertion failure. Reported-by: Bret Ketchum Tested-by: Bret Ketchum Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Paolo Bonzini --- hw/char/serial.c | 16 ++++++++++++---- include/hw/char/serial.h | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/hw/char/serial.c b/hw/char/serial.c index 0b09094..af39e8f 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -228,6 +228,7 @@ static gboolean serial_watch_cb(GIOChannel *chan, GIOCondition cond, void *opaque) { SerialState *s = opaque; + s->watch_tag = 0; serial_xmit(s); return FALSE; } @@ -258,10 +259,12 @@ 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) != 1) { - if (s->tsr_retry < MAX_XMIT_RETRY && - qemu_chr_fe_add_watch(s->chr, G_IO_OUT|G_IO_HUP, - serial_watch_cb, s) > 0) { + } else if (qemu_chr_fe_write(s->chr, &s->tsr, 1) != 1 && + 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; } @@ -821,6 +824,11 @@ static void serial_reset(void *opaque) { SerialState *s = opaque; + if (s->watch_tag > 0) { + g_source_remove(s->watch_tag); + s->watch_tag = 0; + } + s->rbr = 0; s->ier = 0; s->iir = UART_IIR_NO_INT; diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h index 6a322eb..9feddc6 100644 --- a/include/hw/char/serial.h +++ b/include/hw/char/serial.h @@ -56,6 +56,7 @@ struct SerialState { int it_shift; int baudbase; uint32_t tsr_retry; + guint watch_tag; uint32_t wakeup; /* Time when the last byte was successfully sent out of the tsr */