From patchwork Mon Aug 2 08:33:49 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alon Levy X-Patchwork-Id: 60520 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 376641007D3 for ; Mon, 2 Aug 2010 18:34:50 +1000 (EST) Received: from localhost ([127.0.0.1]:35017 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OfqTv-0007aW-1F for incoming@patchwork.ozlabs.org; Mon, 02 Aug 2010 04:34:47 -0400 Received: from [140.186.70.92] (port=49410 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OfqT3-0007aR-AI for qemu-devel@nongnu.org; Mon, 02 Aug 2010 04:33:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OfqT2-0007Q7-0r for qemu-devel@nongnu.org; Mon, 02 Aug 2010 04:33:53 -0400 Received: from mx3-phx2.redhat.com ([209.132.183.24]:47755 helo=mx01.colomx.prod.int.phx2.redhat.com) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OfqT1-0007Pu-QU for qemu-devel@nongnu.org; Mon, 02 Aug 2010 04:33:51 -0400 Received: from mail06.corp.redhat.com (zmail06.collab.prod.int.phx2.redhat.com [10.5.5.45]) by mx01.colomx.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o728Xntk015562; Mon, 2 Aug 2010 04:33:50 -0400 Date: Mon, 2 Aug 2010 04:33:49 -0400 (EDT) From: Alon Levy To: qemu-devel Message-ID: <1504146626.525061280738029828.JavaMail.root@zmail06.collab.prod.int.phx2.redhat.com> In-Reply-To: <2092558519.524651280737489312.JavaMail.root@zmail06.collab.prod.int.phx2.redhat.com> MIME-Version: 1.0 X-Originating-IP: [10.5.5.72] X-Mailer: Zimbra 5.0.21_GA_3150.RHEL4_64 (ZimbraWebClient - FF3.0 (Linux)/5.0.21_GA_3150.RHEL4_64) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. Cc: Amit Shah , Anthony Liguori Subject: [Qemu-devel] RFC adding ioctl's to virtserial/virtconsole X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Hi, This patch adds three CHR_IOCTLs and uses them in virtserial devices, to be used by a chardev backend, such as a spice vm channel (spice is a vdi solution). Basically virtio-serial provides three driver initiated events for guest open of a device, guest close, and guest ready (driver port init complete) that before this patch are not exposed to the chardev backend. With the spicevmc backend this is used like this: qemu -chardev spicevmc,id=vdiport,name=vdiport -device virtserialport,chardev=vdiport,name=com.redhat.spice.0 I'd appreciate any feedback if this seems the right way to accomplish this, and for the numbers I grabbed. Alon -------------- commit message -------------------------------- From a90d4e26df727ed0d2b64b705e955f695289fa61 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Mon, 2 Aug 2010 11:22:58 +0300 Subject: [PATCH] virtio-console: add IOCTL's for guest_{ready,open,close} Add three IOCTL corresponding to the three control events of: guest_ready -> CHR_IOCTL_VIRT_SERIAL_READY guest_open -> CHR_IOCTL_VIRT_SERIAL_OPEN guest_close -> CHR_IOCTL_VIRT_SERIAL_CLOSE Can be used by a matching backend. --- hw/virtio-console.c | 33 +++++++++++++++++++++++++++++++++ qemu-char.h | 4 ++++ 2 files changed, 37 insertions(+), 0 deletions(-) diff --git a/hw/virtio-console.c b/hw/virtio-console.c index caea11f..4c3686d 100644 --- a/hw/virtio-console.c +++ b/hw/virtio-console.c @@ -58,6 +58,33 @@ static void chr_event(void *opaque, int event) } } +static void virtconsole_guest_open(VirtIOSerialPort *port) +{ + VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); + + if (vcon->chr) { + qemu_chr_ioctl(vcon->chr, CHR_IOCTL_VIRT_SERIAL_OPEN, NULL); + } +} + +static void virtconsole_guest_close(VirtIOSerialPort *port) +{ + VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); + + if (vcon->chr) { + qemu_chr_ioctl(vcon->chr, CHR_IOCTL_VIRT_SERIAL_CLOSE, NULL); + } +} + +static void virtconsole_guest_ready(VirtIOSerialPort *port) +{ + VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); + + if (vcon->chr) { + qemu_chr_ioctl(vcon->chr, CHR_IOCTL_VIRT_SERIAL_READY, NULL); + } +} + /* Virtio Console Ports */ static int virtconsole_initfn(VirtIOSerialDevice *dev) { @@ -94,6 +121,9 @@ static VirtIOSerialPortInfo virtconsole_info = { .qdev.size = sizeof(VirtConsole), .init = virtconsole_initfn, .exit = virtconsole_exitfn, + .guest_open = virtconsole_guest_open, + .guest_close = virtconsole_guest_close, + .guest_ready = virtconsole_guest_ready, .qdev.props = (Property[]) { DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console, 1), DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID), @@ -130,6 +160,9 @@ static VirtIOSerialPortInfo virtserialport_info = { .qdev.size = sizeof(VirtConsole), .init = virtserialport_initfn, .exit = virtconsole_exitfn, + .guest_open = virtconsole_guest_open, + .guest_close = virtconsole_guest_close, + .guest_ready = virtconsole_guest_ready, .qdev.props = (Property[]) { DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID), DEFINE_PROP_CHR("chardev", VirtConsole, chr), diff --git a/qemu-char.h b/qemu-char.h index e3a0783..1df53ae 100644 --- a/qemu-char.h +++ b/qemu-char.h @@ -41,6 +41,10 @@ typedef struct { #define CHR_IOCTL_SERIAL_SET_TIOCM 13 #define CHR_IOCTL_SERIAL_GET_TIOCM 14 +#define CHR_IOCTL_VIRT_SERIAL_OPEN 15 +#define CHR_IOCTL_VIRT_SERIAL_CLOSE 16 +#define CHR_IOCTL_VIRT_SERIAL_READY 17 + #define CHR_TIOCM_CTS 0x020 #define CHR_TIOCM_CAR 0x040 #define CHR_TIOCM_DSR 0x100