From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LHJGL-0005zm-I8 for qemu-devel@nongnu.org; Mon, 29 Dec 2008 09:38:33 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LHJGK-0005zQ-Ps for qemu-devel@nongnu.org; Mon, 29 Dec 2008 09:38:33 -0500 Received: from [199.232.76.173] (port=55402 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LHJGK-0005zD-Er for qemu-devel@nongnu.org; Mon, 29 Dec 2008 09:38:32 -0500 Received: from mx2.redhat.com ([66.187.237.31]:51877) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LHJGJ-0003XX-TN for qemu-devel@nongnu.org; Mon, 29 Dec 2008 09:38:32 -0500 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id mBTEcVel002062 for ; Mon, 29 Dec 2008 09:38:31 -0500 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id mBTEcTWY026299 for ; Mon, 29 Dec 2008 09:38:29 -0500 Received: from dhcp-1-237.tlv.redhat.com (dhcp-1-237.tlv.redhat.com [10.35.1.237]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id mBTEcSxr012072 for ; Mon, 29 Dec 2008 09:38:28 -0500 Received: from dhcp-1-237.tlv.redhat.com (localhost [127.0.0.1]) by dhcp-1-237.tlv.redhat.com (Postfix) with ESMTP id 7F1FD18D43A for ; Mon, 29 Dec 2008 16:39:33 +0200 (IST) From: Gleb Natapov Date: Mon, 29 Dec 2008 16:39:33 +0200 Message-ID: <20081229143933.24671.11128.stgit@dhcp-1-237.tlv.redhat.com> In-Reply-To: <20081229143922.24671.86727.stgit@dhcp-1-237.tlv.redhat.com> References: <20081229143922.24671.86727.stgit@dhcp-1-237.tlv.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH 2/2] Add vmchannel command line option. Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Signed-off-by: Gleb Natapov --- 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);