qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Gleb Natapov <gleb@redhat.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 2/2] Add vmchannel command line option.
Date: Mon, 29 Dec 2008 16:39:33 +0200	[thread overview]
Message-ID: <20081229143933.24671.11128.stgit@dhcp-1-237.tlv.redhat.com> (raw)
In-Reply-To: <20081229143922.24671.86727.stgit@dhcp-1-237.tlv.redhat.com>

Signed-off-by: Gleb Natapov <gleb@redhat.com>
---

 vl.c |   75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 74 insertions(+), 1 deletions(-)

diff --git a/vl.c b/vl.c
index 07740f5..f9dc31a 100644
--- a/vl.c
+++ b/vl.c
@@ -207,6 +207,13 @@ static int full_screen = 0;
 static int no_frame = 0;
 #endif
 int no_quit = 0;
+#if defined(CONFIG_SLIRP)
+#define MAX_VMCHANNEL_DEVICES 4
+struct VMChannel {
+    CharDriverState *hd;
+    int port;
+} vmchannel_hds[MAX_VMCHANNEL_DEVICES];
+#endif
 CharDriverState *serial_hds[MAX_SERIAL_PORTS];
 CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
 #ifdef TARGET_I386
@@ -3932,6 +3939,9 @@ static void help(int exitcode)
            "-monitor dev    redirect the monitor to char device 'dev'\n"
            "-serial dev     redirect the serial port to char device 'dev'\n"
            "-parallel dev   redirect the parallel port to char device 'dev'\n"
+#if defined(CONFIG_SLIRP)
+	   "-vmchannel di:DI,dev  redirect the vmchannel device with device id DI, to char device 'dev'\n"
+#endif
            "-pidfile file   Write PID to 'file'\n"
            "-S              freeze CPU at startup (use 'c' to start execution)\n"
            "-s              wait gdb connection to port\n"
@@ -4046,6 +4056,9 @@ enum {
     QEMU_OPTION_monitor,
     QEMU_OPTION_serial,
     QEMU_OPTION_parallel,
+#if defined(CONFIG_SLIRP)
+    QEMU_OPTION_vmchannel,
+#endif
     QEMU_OPTION_loadvm,
     QEMU_OPTION_full_screen,
     QEMU_OPTION_no_frame,
@@ -4155,6 +4168,9 @@ static const QEMUOption qemu_options[] = {
     { "monitor", HAS_ARG, QEMU_OPTION_monitor },
     { "serial", HAS_ARG, QEMU_OPTION_serial },
     { "parallel", HAS_ARG, QEMU_OPTION_parallel },
+#if defined(CONFIG_SLIRP)
+    { "vmchannel", 1, QEMU_OPTION_vmchannel },
+#endif
     { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
     { "full-screen", 0, QEMU_OPTION_full_screen },
 #ifdef CONFIG_SDL
@@ -4453,6 +4469,20 @@ static void termsig_setup(void)
 
 #endif
 
+#if defined(CONFIG_SLIRP)
+static int vmchannel_can_read(void *opaque)
+{
+    struct VMChannel *vmc = (struct VMChannel*)opaque;
+    return slirp_socket_can_recv(4, vmc->port);
+}
+
+static void vmchannel_read(void *opaque, const uint8_t *buf, int size)
+{
+    struct VMChannel *vmc = (struct VMChannel*)opaque;
+    slirp_socket_recv(4, vmc->port, buf, size);
+}
+#endif
+
 int main(int argc, char **argv, char **envp)
 {
 #ifdef CONFIG_GDBSTUB
@@ -4480,6 +4510,8 @@ int main(int argc, char **argv, char **envp)
     int serial_device_index;
     const char *parallel_devices[MAX_PARALLEL_PORTS];
     int parallel_device_index;
+    char *vmchannel_devices[MAX_VMCHANNEL_DEVICES];
+    int vmchannel_device_index;
     const char *loadvm = NULL;
     QEMUMachine *machine;
     const char *cpu_model;
@@ -4553,6 +4585,10 @@ int main(int argc, char **argv, char **envp)
         parallel_devices[i] = NULL;
     parallel_device_index = 0;
 
+    for(i = 0; i < MAX_VMCHANNEL_DEVICES; i++)
+    	vmchannel_devices[i] = NULL;
+    vmchannel_device_index = 0;
+
     usb_devices_index = 0;
 
     nb_net_clients = 0;
@@ -4947,7 +4983,15 @@ int main(int argc, char **argv, char **envp)
                 parallel_devices[parallel_device_index] = optarg;
                 parallel_device_index++;
                 break;
-	    case QEMU_OPTION_loadvm:
+#if defined(CONFIG_SLIRP)
+            case QEMU_OPTION_vmchannel:
+                if (vmchannel_device_index >= MAX_VMCHANNEL_DEVICES) {
+                    fprintf(stderr, "qemu: too many vmchannel devices\n");
+                    exit(1);
+                }
+                vmchannel_devices[vmchannel_device_index++] = optarg;
+#endif
+            case QEMU_OPTION_loadvm:
 		loadvm = optarg;
 		break;
             case QEMU_OPTION_full_screen:
@@ -5452,6 +5496,35 @@ int main(int argc, char **argv, char **envp)
         }
     }
 
+#if defined(CONFIG_SLIRP)
+    for(i = 0; i < vmchannel_device_index; i++) {
+        char *devname = vmchannel_devices[i];
+        long port;
+        char name[20];
+
+        if (!devname)
+            continue;
+
+        port = strtol(devname, &devname, 10);
+        devname++;
+        if (port < 1 || port > 65535) {
+            fprintf(stderr, "vmchannel: wrong port number\n");
+            exit(1);
+        }
+        snprintf(name, 20, "vmchannel%ld\n", port);
+        vmchannel_hds[i].hd = qemu_chr_open(name, devname);
+        if (!vmchannel_hds[i].hd) {
+            fprintf(stderr, "qemu: could not open vmchannel device '%s'\n",
+                    devname);
+            exit(1);
+        }
+        vmchannel_hds[i].port = port;
+        slirp_add_exec(3, vmchannel_hds[i].hd, 4, port);
+        qemu_chr_add_handlers(vmchannel_hds[i].hd, vmchannel_can_read,
+                vmchannel_read, NULL, &vmchannel_hds[i]);
+    }
+#endif
+
     machine->init(ram_size, vga_ram_size, boot_devices, ds,
                   kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
 

      parent reply	other threads:[~2008-12-29 14:38 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-29 14:39 [Qemu-devel] [PATCH 0/2] Marry slirp and qemu character device Gleb Natapov
2008-12-29 14:39 ` [Qemu-devel] [PATCH 1/2] Redirect slirp traffic to/from " Gleb Natapov
2008-12-29 14:39 ` Gleb Natapov [this message]

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=20081229143933.24671.11128.stgit@dhcp-1-237.tlv.redhat.com \
    --to=gleb@redhat.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).