From: Anthony Liguori <anthony@codemonkey.ws>
To: qemu-devel@nongnu.org
Cc: ehrhardt@linux.vnet.ibm.com, aliguori@us.ibm.com, borntraeger@de.ibm.com
Subject: Re: [Qemu-devel] [PATCH 1 of 4] kvm-userpace: add virtio-console support
Date: Thu, 15 Jan 2009 13:55:51 -0600 [thread overview]
Message-ID: <496F94C7.4080304@codemonkey.ws> (raw)
In-Reply-To: <50f40bc14f793a5f4ce6.1231861065@HelionPrime>
Christian Ehrhardt wrote:
> # HG changeset patch
> # User Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
> # Date 1231855865 -3600
> # Node ID 50f40bc14f793a5f4ce6d91c36a3f3b19b507d42
> # Parent 89ed96e77993639b89d41a1a113ccbef979adfb9
> kvm-userpace: add virtio-console support
>
> This patch adds the virtio console to qemu. This console can be found after the
> serial and parallel outputs as another virtual console. In the -nographic case
> it is redirected to the null output by default.
>
> Signed-off-by: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
>
Please submit this against QEMU, not kvm-userspace.
Regards,
Anthony Liguori
> ---
> Makefile.target | 2
> hw/virtio-console.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> hw/virtio-console.h | 22 +++++++
> sysemu.h | 6 ++
> vl.c | 26 +++++++++
> 5 files changed, 202 insertions(+), 1 deletion(-)
>
> diff --git a/Makefile.target b/Makefile.target
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -559,7 +559,7 @@ OBJS=vl.o osdep.o monitor.o pci.o loader
> OBJS=vl.o osdep.o monitor.o pci.o loader.o isa_mmio.o machine.o
> # virtio has to be here due to weird dependency between PCI and virtio-net.
> # need to fix this properly
> -OBJS+=virtio.o virtio-blk.o virtio-balloon.o virtio-net.o
> +OBJS+=virtio.o virtio-blk.o virtio-balloon.o virtio-net.o virtio-console.o
> OBJS+=fw_cfg.o
> ifdef CONFIG_KVM
> OBJS+=kvm.o kvm-all.o
> diff --git a/hw/virtio-console.c b/hw/virtio-console.c
> new file mode 100644
> --- /dev/null
> +++ b/hw/virtio-console.c
> @@ -0,0 +1,147 @@
> +/*
> + * Virtio Console Device
> + *
> + * Copyright IBM, Corp. 2008
> + *
> + * Authors:
> + * Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2. See
> + * the COPYING file in the top-level directory.
> + *
> + */
> +
> +#include "hw.h"
> +#include "qemu-char.h"
> +#include "virtio.h"
> +#include "virtio-console.h"
> +
> +
> +typedef struct VirtIOConsole
> +{
> + VirtIODevice vdev;
> + VirtQueue *ivq, *dvq;
> + CharDriverState *chr;
> +} VirtIOConsole;
> +
> +static VirtIOConsole *to_virtio_console(VirtIODevice *vdev)
> +{
> + return (VirtIOConsole *)vdev;
> +}
> +
> +static void virtio_console_handle_output(VirtIODevice *vdev, VirtQueue *vq)
> +{
> + VirtIOConsole *s = to_virtio_console(vdev);
> + VirtQueueElement elem;
> +
> + while (virtqueue_pop(vq, &elem)) {
> + ssize_t len = 0;
> + int d;
> +
> + for (d=0; d < elem.out_num; d++)
> + len += qemu_chr_write(s->chr, elem.out_sg[d].iov_base,elem.out_sg[d].iov_len);
> + virtqueue_push(vq, &elem, len);
> + virtio_notify(vdev, vq);
> + }
> +}
> +
> +static void virtio_console_handle_input(VirtIODevice *vdev, VirtQueue *vq)
> +{
> +}
> +
> +static uint32_t virtio_console_get_features(VirtIODevice *vdev)
> +{
> + return 0;
> +}
> +
> +static int vcon_can_read(void *opaque)
> +{
> + VirtIOConsole *s = (VirtIOConsole *) opaque;
> +
> + if (!virtio_queue_ready(s->ivq) ||
> + !(s->vdev.status & VIRTIO_CONFIG_S_DRIVER_OK) ||
> + virtio_queue_empty(s->ivq))
> + return 0;
> +
> + /* current implementations have a page sized buffer.
> + * We fall back to a one byte per read if there is not enough room.
> + * It would be cool to have a function that returns the available byte
> + * instead of checking for a limit */
> + if (virtqueue_avail_bytes(s->ivq, TARGET_PAGE_SIZE, 0))
> + return TARGET_PAGE_SIZE;
> + if (virtqueue_avail_bytes(s->ivq, 1, 0))
> + return 1;
> + return 0;
> +}
> +
> +static void vcon_read(void *opaque, const uint8_t *buf, int size)
> +{
> + VirtIOConsole *s = (VirtIOConsole *) opaque;
> + VirtQueueElement elem;
> + int offset = 0;
> +
> + /* The current kernel implementation has only one outstanding input
> + * buffer of PAGE_SIZE. Nevertheless, this function is prepared to
> + * handle multiple buffers with multiple sg element for input */
> + while (offset < size) {
> + int i = 0;
> + if (!virtqueue_pop(s->ivq, &elem))
> + break;
> + while (offset < size && i < elem.in_num) {
> + int len = MIN(elem.in_sg[i].iov_len, size - offset);
> + memcpy(elem.in_sg[i].iov_base, buf + offset, len);
> + offset += len;
> + i++;
> + }
> + virtqueue_push(s->ivq, &elem, size);
> + }
> + virtio_notify(&s->vdev, s->ivq);
> +}
> +
> +static void vcon_event(void *opaque, int event)
> +{
> + /* we will ignore any event for the time being */
> +}
> +
> +static void virtio_console_save(QEMUFile *f, void *opaque)
> +{
> + VirtIOConsole *s = opaque;
> +
> + virtio_save(&s->vdev, f);
> +}
> +
> +static int virtio_console_load(QEMUFile *f, void *opaque, int version_id)
> +{
> + VirtIOConsole *s = opaque;
> +
> + if (version_id != 1)
> + return -EINVAL;
> +
> + virtio_load(&s->vdev, f);
> + return 0;
> +}
> +
> +void *virtio_console_init(PCIBus *bus, CharDriverState *chr)
> +{
> + VirtIOConsole *s;
> +
> + s = (VirtIOConsole *)virtio_init_pci(bus, "virtio-console",
> + 6900, 0x1003,
> + 0, VIRTIO_ID_CONSOLE,
> + 0x03, 0x80, 0x00,
> + 0, sizeof(VirtIOConsole));
> + if (s == NULL)
> + return NULL;
> +
> + s->vdev.get_features = virtio_console_get_features;
> +
> + s->ivq = virtio_add_queue(&s->vdev, 128, virtio_console_handle_input);
> + s->dvq = virtio_add_queue(&s->vdev, 128, virtio_console_handle_output);
> +
> + s->chr = chr;
> + qemu_chr_add_handlers(chr, vcon_can_read, vcon_read, vcon_event, s);
> +
> + register_savevm("virtio-console", -1, 1, virtio_console_save, virtio_console_load, s);
> +
> + return &s->vdev;
> +}
> diff --git a/hw/virtio-console.h b/hw/virtio-console.h
> new file mode 100644
> --- /dev/null
> +++ b/hw/virtio-console.h
> @@ -0,0 +1,22 @@
> +/*
> + * Virtio Console Support
> + *
> + * Copyright IBM, Corp. 2008
> + *
> + * Authors:
> + * Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2. See
> + * the COPYING file in the top-level directory.
> + *
> + */
> +#ifndef _QEMU_VIRTIO_CONSOLE_H
> +#define _QEMU_VIRTIO_CONSOLE_H
> +
> +/* The ID for virtio console */
> +#define VIRTIO_ID_CONSOLE 3
> +
> +/* Creates a virtio console */
> +void *virtio_console_init(PCIBus *bus, CharDriverState *chr);
> +
> +#endif
> diff --git a/sysemu.h b/sysemu.h
> --- a/sysemu.h
> +++ b/sysemu.h
> @@ -158,6 +158,12 @@ extern CharDriverState *serial_hds[MAX_S
>
> extern CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
>
> +/* virtio consoles */
> +
> +#define MAX_VIRTIO_CONSOLES 1
> +
> +extern CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES];
> +
> #define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
>
> #ifdef NEED_CPU_H
> diff --git a/vl.c b/vl.c
> --- a/vl.c
> +++ b/vl.c
> @@ -209,6 +209,7 @@ int no_quit = 0;
> int no_quit = 0;
> CharDriverState *serial_hds[MAX_SERIAL_PORTS];
> CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
> +CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES];
> #ifdef TARGET_I386
> int win2k_install_hack = 0;
> #endif
> @@ -4502,6 +4503,8 @@ int main(int argc, char **argv, char **e
> int serial_device_index;
> const char *parallel_devices[MAX_PARALLEL_PORTS];
> int parallel_device_index;
> + const char *virtio_consoles[MAX_VIRTIO_CONSOLES];
> + int virtio_console_index;
> const char *loadvm = NULL;
> QEMUMachine *machine;
> const char *cpu_model;
> @@ -4574,6 +4577,11 @@ int main(int argc, char **argv, char **e
> for(i = 1; i < MAX_PARALLEL_PORTS; i++)
> parallel_devices[i] = NULL;
> parallel_device_index = 0;
> +
> + virtio_consoles[0] = "vc:80Cx24C";
> + for(i = 1; i < MAX_VIRTIO_CONSOLES; i++)
> + virtio_consoles[i] = NULL;
> + virtio_console_index = 0;
>
> usb_devices_index = 0;
>
> @@ -5170,6 +5178,8 @@ int main(int argc, char **argv, char **e
> parallel_devices[0] = "null";
> if (strncmp(monitor_device, "vc", 2) == 0)
> monitor_device = "stdio";
> + if (virtio_console_index == 0)
> + virtio_consoles[0] = "null";
> }
>
> #ifndef _WIN32
> @@ -5464,6 +5474,22 @@ int main(int argc, char **argv, char **e
> }
> }
>
> + for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) {
> + const char *devname = virtio_consoles[i];
> + if (devname && strcmp(devname, "none")) {
> + char label[32];
> + snprintf(label, sizeof(label), "virtcon%d", i);
> + virtcon_hds[i] = qemu_chr_open(label, devname);
> + if (!virtcon_hds[i]) {
> + fprintf(stderr, "qemu: could not open virtio console '%s'\n",
> + devname);
> + exit(1);
> + }
> + if (strstart(devname, "vc", 0))
> + qemu_chr_printf(virtcon_hds[i], "virtio console%d\r\n", i);
> + }
> + }
> +
> if (kvm_enabled()) {
> int ret;
>
>
>
>
next prev parent reply other threads:[~2009-01-15 19:56 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-13 15:37 [Qemu-devel] [PATCH 0 of 4] Add virtio-console support to qemu Christian Ehrhardt
2009-01-13 15:37 ` [Qemu-devel] [PATCH 1 of 4] kvm-userpace: add virtio-console support Christian Ehrhardt
2009-01-15 19:55 ` Anthony Liguori [this message]
2009-01-19 10:09 ` Mark McLoughlin
2009-01-13 15:37 ` [Qemu-devel] [PATCH 2 of 4] kvm-userpace: add virtio-console cmdline option Christian Ehrhardt
2009-01-19 10:11 ` Mark McLoughlin
2009-01-13 15:37 ` [Qemu-devel] [PATCH 3 of 4] kvm-userpace: add virtio-console initializer for x86 Christian Ehrhardt
2009-01-13 15:37 ` [Qemu-devel] [PATCH 4 of 4] kvm-userpace: add virtio-console initializer for powerpc Christian Ehrhardt
2009-01-13 20:27 ` [Qemu-devel] [PATCH 0 of 4] Add virtio-console support to qemu Avi Kivity
2009-01-13 20:34 ` Anthony Liguori
2009-01-13 20:39 ` Avi Kivity
2009-01-13 20:44 ` Anthony Liguori
2009-01-13 20:41 ` Christian Borntraeger
2009-01-13 20:58 ` Avi Kivity
2009-01-13 21:00 ` Avi Kivity
2009-01-15 20:08 ` Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=496F94C7.4080304@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=aliguori@us.ibm.com \
--cc=borntraeger@de.ibm.com \
--cc=ehrhardt@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).