From patchwork Thu Jul 13 14:24:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 787825 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3x7f1n0tHvz9s65 for ; Fri, 14 Jul 2017 00:52:45 +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="Z0W+q5L0"; dkim-atps=neutral Received: from localhost ([::1]:60488 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVfTv-0001Ou-13 for incoming@patchwork.ozlabs.org; Thu, 13 Jul 2017 10:52:43 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51776) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dVf4M-0001oj-1v for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dVf4H-0004Gx-W8 for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:18 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:33948) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dVf4H-0004Gg-PJ for qemu-devel@nongnu.org; Thu, 13 Jul 2017 10:26:13 -0400 Received: by mail-wr0-f195.google.com with SMTP id k67so9397780wrc.1 for ; Thu, 13 Jul 2017 07:26:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=H1ZDQ/thoK9msWQr7kiocoalErn1fARXKwec83RCRHs=; b=Z0W+q5L0HDuV5n6l5QHc4Xo49ahP5HqSdlkIvuYrHne99lw3NoAq3QkkodiLxOa9Nv BYdp2X1r3GgmvfGzOSkh7S9zLmdnePpQTuOXgO6TSe2dggnDRVkpWoauEwrvIGLdFhJg VeQxSvsjcxMykdQ9NjiG2WCl/wvuyEt3ul6zsNtzBEqsrJIBHI5LFUz+pvSMsMI+N+XH 9F8YEd3D1Bb4vfMWlkif3ThswTwoEhDp+ipKb08ajuCfw506VoJZZYnMcF0YIPbVtgtj 4ziu0PA4DFbdgy+WnhFx4x3kEMvg20RSlHvBpA759Uxl4CDUlmY3Li0LJBgpa6DUuv1B PvQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=H1ZDQ/thoK9msWQr7kiocoalErn1fARXKwec83RCRHs=; b=WfIqPct91JnAzYHfhCC2UowjYNJEP48fetgBH5Iz0uCihKF8e6X0hozfMU25dfU93Y osw6XPP7pNme/fqzRTbOty4d+/zfdMK1pkyCNrH35YNoL9aWdrdAkj2JCZld7JHnve7Z T9n3FToBfu4/14OCuX0s6bg08EJsitg050ABioR48YVG51w+YlKItg6CCvXd4HJcA1pW EZMwEPZG364xp3TpA6nzreBI+/IgiH6gtu4Kj+YeiZ6g4Dn2em0KWqMwlR6+5ml3dWYv fPLUQxV6S8GQz9iyE/SpoGHYs/WxtoeCM+8Aee2yN6jyCnswQWv7/HjDsR8V43lfEsLy uoCw== X-Gm-Message-State: AIVw110Xwfm2uUmeQ9UAb3EhC5diR0xx3MBXOo8/wqiDkWxvQvq5H80J lMjpJNQ1CiAsN7Yzjvc= X-Received: by 10.223.133.99 with SMTP id 90mr1795893wrh.44.1499955911127; Thu, 13 Jul 2017 07:25:11 -0700 (PDT) Received: from 640k.lan (94-39-191-51.adsl-ull.clienti.tiscali.it. [94.39.191.51]) by smtp.gmail.com with ESMTPSA id k75sm6042448wmh.10.2017.07.13.07.25.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Jul 2017 07:25:10 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Jul 2017 16:24:13 +0200 Message-Id: <1499955874-10954-21-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> References: <1499955874-10954-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.128.195 Subject: [Qemu-devel] [PULL 20/41] serial: chardev hotswap support 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: Anton Nefedov Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Anton Nefedov This allows to change the port's backend runtime, e.g. change it from file to a socket making it possible to establish a debug session with WinDbg > qemu-system [..] -chardev file,id=charchannel2,path=/tmp/charchannel2 \ -device isa-serial,chardev=charchannel2,id=channel2 QEMU 2.9.50 monitor - type 'help' for more information (qemu) chardev-change charchannel2 \ socket,host=127.0.0.1,port=4242,server,nowait For a backend change, a number of ioctls has to be replayed to sync the current setup of a frontend to a backend tty. This is hopefully enough so we don't have to track, store and replay the whole original control byte sequence. Signed-off-by: Anton Nefedov Reviewed-by: Vladimir Sementsov-Ogievskiy Message-Id: <1499342940-56739-14-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- hw/char/serial.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/hw/char/serial.c b/hw/char/serial.c index 09157f9..9aec6c6 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -891,6 +891,34 @@ static void serial_reset(void *opaque) s->msr &= ~UART_MSR_ANY_DELTA; } +static int serial_be_change(void *opaque) +{ + SerialState *s = opaque; + + qemu_chr_fe_set_handlers(&s->chr, serial_can_receive1, serial_receive1, + serial_event, serial_be_change, s, NULL, true); + + serial_update_parameters(s); + + qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_BREAK, + &s->last_break_enable); + + s->poll_msl = (s->ier & UART_IER_MSI) ? 1 : 0; + serial_update_msl(s); + + if (s->poll_msl >= 0 && !(s->mcr & UART_MCR_LOOP)) { + serial_update_tiocm(s); + } + + if (s->watch_tag > 0) { + g_source_remove(s->watch_tag); + s->watch_tag = qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP, + serial_watch_cb, s); + } + + return 0; +} + void serial_realize_core(SerialState *s, Error **errp) { if (!qemu_chr_fe_backend_connected(&s->chr)) { @@ -904,7 +932,7 @@ void serial_realize_core(SerialState *s, Error **errp) qemu_register_reset(serial_reset, s); qemu_chr_fe_set_handlers(&s->chr, serial_can_receive1, serial_receive1, - serial_event, NULL, s, NULL, true); + serial_event, serial_be_change, s, NULL, true); fifo8_create(&s->recv_fifo, UART_FIFO_LENGTH); fifo8_create(&s->xmit_fifo, UART_FIFO_LENGTH); serial_reset(s);