blob: 9effa676d288d1b39cc19e638f16af384c2817d7 [file] [log] [blame]
bellard0824d6f2003-06-24 13:42:40 +00001/*
bellard80cabfa2004-03-14 12:20:30 +00002 * QEMU System Emulator
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard68d0f702008-01-06 17:21:48 +00004 * Copyright (c) 2003-2008 Fabrice Bellard
ths5fafdf22007-09-16 21:08:06 +00005 *
bellard1df912c2003-06-25 16:20:35 +00006 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
bellard0824d6f2003-06-24 13:42:40 +000023 */
pbrook87ecb682007-11-17 17:14:51 +000024#include "hw/hw.h"
25#include "hw/boards.h"
26#include "hw/usb.h"
27#include "hw/pcmcia.h"
28#include "hw/pc.h"
pbrook87ecb682007-11-17 17:14:51 +000029#include "hw/audiodev.h"
30#include "hw/isa.h"
aurel322e4d9fb2008-04-08 06:01:02 +000031#include "hw/baum.h"
balrog1ae26a12008-09-28 23:19:47 +000032#include "hw/bt.h"
pbrook87ecb682007-11-17 17:14:51 +000033#include "net.h"
34#include "console.h"
35#include "sysemu.h"
36#include "gdbstub.h"
37#include "qemu-timer.h"
38#include "qemu-char.h"
39#include "block.h"
40#include "audio/audio.h"
bellard67b915a2004-03-31 23:37:16 +000041
bellard0824d6f2003-06-24 13:42:40 +000042#include <unistd.h>
bellard0824d6f2003-06-24 13:42:40 +000043#include <fcntl.h>
44#include <signal.h>
45#include <time.h>
bellard0824d6f2003-06-24 13:42:40 +000046#include <errno.h>
bellard67b915a2004-03-31 23:37:16 +000047#include <sys/time.h>
bellardc88676f2006-08-06 13:36:11 +000048#include <zlib.h>
bellard67b915a2004-03-31 23:37:16 +000049
50#ifndef _WIN32
51#include <sys/times.h>
bellardf1510b22003-06-25 00:07:40 +000052#include <sys/wait.h>
bellard67b915a2004-03-31 23:37:16 +000053#include <termios.h>
54#include <sys/poll.h>
55#include <sys/mman.h>
bellardf1510b22003-06-25 00:07:40 +000056#include <sys/ioctl.h>
57#include <sys/socket.h>
bellardc94c8d62004-09-13 21:37:34 +000058#include <netinet/in.h>
bellard9d728e82004-09-05 23:09:03 +000059#include <dirent.h>
bellard7c9d8e02005-11-15 22:16:05 +000060#include <netdb.h>
thscb4b9762007-09-13 12:39:35 +000061#include <sys/select.h>
62#include <arpa/inet.h>
bellard7d3505c2004-05-12 19:32:15 +000063#ifdef _BSD
64#include <sys/stat.h>
blueswir1128ab2f2008-08-15 18:33:42 +000065#if !defined(__APPLE__) && !defined(__OpenBSD__)
bellard7d3505c2004-05-12 19:32:15 +000066#include <libutil.h>
bellard83fb7ad2004-07-05 21:25:26 +000067#endif
blueswir1128ab2f2008-08-15 18:33:42 +000068#ifdef __OpenBSD__
69#include <net/if.h>
70#endif
ths5c40d2b2007-06-23 16:03:36 +000071#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
72#include <freebsd/stdlib.h>
bellard7d3505c2004-05-12 19:32:15 +000073#else
blueswir1223f0d72008-09-30 18:12:18 +000074#ifdef __linux__
bellardf1510b22003-06-25 00:07:40 +000075#include <linux/if.h>
76#include <linux/if_tun.h>
bellard7d3505c2004-05-12 19:32:15 +000077#include <pty.h>
78#include <malloc.h>
bellardfd872592004-05-12 19:11:15 +000079#include <linux/rtc.h>
thsbd494f42007-09-16 20:03:23 +000080
81/* For the benefit of older linux systems which don't supply it,
82 we use a local copy of hpet.h. */
83/* #include <linux/hpet.h> */
84#include "hpet.h"
85
bellarde57a8c02005-11-10 23:58:52 +000086#include <linux/ppdev.h>
ths5867c882007-02-17 23:44:43 +000087#include <linux/parport.h>
blueswir1223f0d72008-09-30 18:12:18 +000088#endif
89#ifdef __sun__
thsd5d10bc2007-02-17 22:54:49 +000090#include <sys/stat.h>
91#include <sys/ethernet.h>
92#include <sys/sockio.h>
thsd5d10bc2007-02-17 22:54:49 +000093#include <netinet/arp.h>
94#include <netinet/in.h>
95#include <netinet/in_systm.h>
96#include <netinet/ip.h>
97#include <netinet/ip_icmp.h> // must come after ip.h
98#include <netinet/udp.h>
99#include <netinet/tcp.h>
100#include <net/if.h>
101#include <syslog.h>
102#include <stropts.h>
bellard67b915a2004-03-31 23:37:16 +0000103#endif
bellard7d3505c2004-05-12 19:32:15 +0000104#endif
bellardec530c82006-04-25 22:36:06 +0000105#endif
bellard67b915a2004-03-31 23:37:16 +0000106
aliguori03ff3ca2008-09-15 15:51:35 +0000107#include "qemu_socket.h"
108
bellardc20709a2004-04-21 23:27:19 +0000109#if defined(CONFIG_SLIRP)
110#include "libslirp.h"
111#endif
112
blueswir19892fbf2008-08-24 10:34:20 +0000113#if defined(__OpenBSD__)
114#include <util.h>
115#endif
116
ths8a16d272008-07-19 09:56:24 +0000117#if defined(CONFIG_VDE)
118#include <libvdeplug.h>
119#endif
120
bellard67b915a2004-03-31 23:37:16 +0000121#ifdef _WIN32
bellard7d3505c2004-05-12 19:32:15 +0000122#include <malloc.h>
bellard67b915a2004-03-31 23:37:16 +0000123#include <sys/timeb.h>
ths4fddf622007-12-17 04:42:29 +0000124#include <mmsystem.h>
bellard67b915a2004-03-31 23:37:16 +0000125#define getopt_long_only getopt_long
126#define memalign(align, size) malloc(size)
127#endif
128
bellard73332e52004-04-04 20:22:28 +0000129#ifdef CONFIG_SDL
bellard96bcd4f2004-07-10 16:26:15 +0000130#ifdef __APPLE__
bellard83fb7ad2004-07-05 21:25:26 +0000131#include <SDL/SDL.h>
bellard96bcd4f2004-07-10 16:26:15 +0000132#endif
bellard73332e52004-04-04 20:22:28 +0000133#endif /* CONFIG_SDL */
bellard0824d6f2003-06-24 13:42:40 +0000134
bellard5b0753e2005-03-01 21:37:28 +0000135#ifdef CONFIG_COCOA
136#undef main
137#define main qemu_main
138#endif /* CONFIG_COCOA */
139
bellard0824d6f2003-06-24 13:42:40 +0000140#include "disas.h"
bellardfc01f7e2003-06-30 10:03:06 +0000141
bellard8a7ddc32004-03-31 19:00:16 +0000142#include "exec-all.h"
bellard0824d6f2003-06-24 13:42:40 +0000143
bellard5a671352003-10-01 00:13:48 +0000144#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
thsb46a8902007-10-21 23:20:45 +0000145#define DEFAULT_NETWORK_DOWN_SCRIPT "/etc/qemu-ifdown"
pbrooka14d6c82006-12-23 15:37:33 +0000146#ifdef __sun__
147#define SMBD_COMMAND "/usr/sfw/sbin/smbd"
148#else
149#define SMBD_COMMAND "/usr/sbin/smbd"
150#endif
bellardf1510b22003-06-25 00:07:40 +0000151
bellard0824d6f2003-06-24 13:42:40 +0000152//#define DEBUG_UNUSED_IOPORT
bellardfd872592004-05-12 19:11:15 +0000153//#define DEBUG_IOPORT
bellard330d0412003-07-26 18:11:40 +0000154
bellard77d4bc32004-05-26 22:13:53 +0000155#ifdef TARGET_PPC
156#define DEFAULT_RAM_SIZE 144
157#else
bellard1bfe8562004-07-08 21:17:50 +0000158#define DEFAULT_RAM_SIZE 128
bellard77d4bc32004-05-26 22:13:53 +0000159#endif
bellard313aa562003-08-10 21:52:11 +0000160
pbrook0d92ed32006-05-21 16:30:15 +0000161/* Max number of USB devices that can be specified on the commandline. */
162#define MAX_USB_CMDLINE 8
163
bellard7dea1da2003-11-16 15:59:30 +0000164/* XXX: use a two level table to limit memory usage */
165#define MAX_IOPORTS 65536
bellard0824d6f2003-06-24 13:42:40 +0000166
bellard80cabfa2004-03-14 12:20:30 +0000167const char *bios_dir = CONFIG_QEMU_SHAREDIR;
j_mayer1192dad2007-10-05 13:08:35 +0000168const char *bios_name = NULL;
bellardc4b1fcc2004-03-14 21:44:30 +0000169void *ioport_opaque[MAX_IOPORTS];
bellardfc01f7e2003-06-30 10:03:06 +0000170IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
171IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
thse4bcb142007-12-02 04:51:10 +0000172/* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available
bellardfaea38e2006-08-05 21:31:00 +0000173 to store the VM snapshots */
thse4bcb142007-12-02 04:51:10 +0000174DriveInfo drives_table[MAX_DRIVES+1];
175int nb_drives;
bellardfaea38e2006-08-05 21:31:00 +0000176/* point to the block driver where the snapshots are managed */
177BlockDriverState *bs_snapshots;
bellard313aa562003-08-10 21:52:11 +0000178int vga_ram_size;
malccb5a7aa2008-09-28 00:42:12 +0000179enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
bellard313aa562003-08-10 21:52:11 +0000180static DisplayState display_state;
bellarda20dd502003-09-30 21:07:02 +0000181int nographic;
balrog4d3b6f62008-02-10 16:33:14 +0000182int curses;
bellard3d11d0e2004-12-12 16:56:30 +0000183const char* keyboard_layout = NULL;
bellard313aa562003-08-10 21:52:11 +0000184int64_t ticks_per_sec;
aurel3200f82b82008-04-27 21:12:55 +0000185ram_addr_t ram_size;
bellard80cabfa2004-03-14 12:20:30 +0000186int pit_min_timer_count = 0;
bellardc4b1fcc2004-03-14 21:44:30 +0000187int nb_nics;
bellard7c9d8e02005-11-15 22:16:05 +0000188NICInfo nd_table[MAX_NICS];
bellard8a7ddc32004-03-31 19:00:16 +0000189int vm_running;
balrogf6503052008-02-17 11:42:19 +0000190static int rtc_utc = 1;
191static int rtc_date_offset = -1; /* -1 means no change */
bellard1bfe8562004-07-08 21:17:50 +0000192int cirrus_vga_enabled = 1;
thsd34cab92007-04-02 01:10:46 +0000193int vmsvga_enabled = 0;
bellardd8272202005-04-06 20:32:23 +0000194#ifdef TARGET_SPARC
195int graphic_width = 1024;
196int graphic_height = 768;
blueswir1eee0b832007-04-21 19:45:49 +0000197int graphic_depth = 8;
bellardd8272202005-04-06 20:32:23 +0000198#else
bellard1bfe8562004-07-08 21:17:50 +0000199int graphic_width = 800;
200int graphic_height = 600;
bellarde9b137c2004-06-21 16:46:10 +0000201int graphic_depth = 15;
blueswir1eee0b832007-04-21 19:45:49 +0000202#endif
bellardd63d3072004-10-03 13:29:03 +0000203int full_screen = 0;
ths43523e92007-02-18 18:19:32 +0000204int no_frame = 0;
ths667acca2006-12-11 02:08:05 +0000205int no_quit = 0;
bellard8d11df92004-08-24 21:13:40 +0000206CharDriverState *serial_hds[MAX_SERIAL_PORTS];
bellard6508fe52005-01-15 12:02:56 +0000207CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
bellarda09db212005-04-30 16:10:35 +0000208#ifdef TARGET_I386
209int win2k_install_hack = 0;
210#endif
bellardbb36d472005-11-05 14:22:28 +0000211int usb_enabled = 0;
bellard7c9d8e02005-11-15 22:16:05 +0000212static VLANState *first_vlan;
bellard6a00d602005-11-21 23:25:50 +0000213int smp_cpus = 1;
ths73fc9742006-12-22 02:09:07 +0000214const char *vnc_display;
bellardd3e9db92005-12-17 01:27:28 +0000215#if defined(TARGET_SPARC)
bellardba3c64f2005-12-05 20:31:52 +0000216#define MAX_CPUS 16
bellardd3e9db92005-12-17 01:27:28 +0000217#elif defined(TARGET_I386)
218#define MAX_CPUS 255
bellardba3c64f2005-12-05 20:31:52 +0000219#else
bellardd3e9db92005-12-17 01:27:28 +0000220#define MAX_CPUS 1
bellardba3c64f2005-12-05 20:31:52 +0000221#endif
bellard6515b202006-05-03 22:02:44 +0000222int acpi_enabled = 1;
bellard52ca8d62006-06-14 16:03:05 +0000223int fd_bootchk = 1;
bellardd1beab82006-10-02 19:44:22 +0000224int no_reboot = 0;
aurel32b2f76162008-04-11 21:35:52 +0000225int no_shutdown = 0;
balrog9467cd42007-05-01 01:34:14 +0000226int cursor_hide = 1;
balroga171fe32007-04-30 01:48:07 +0000227int graphic_rotate = 0;
ths71e3ceb2006-12-22 02:11:31 +0000228int daemonize = 0;
ths9ae02552007-01-05 17:39:04 +0000229const char *option_rom[MAX_OPTION_ROMS];
230int nb_option_roms;
pbrook8e716212007-01-20 17:12:09 +0000231int semihosting_enabled = 0;
pbrook3c07f8e2007-01-21 16:47:01 +0000232int autostart = 1;
balrog2b8f2d42007-07-27 22:08:46 +0000233#ifdef TARGET_ARM
234int old_param = 0;
235#endif
thsc35734b2007-03-19 15:17:08 +0000236const char *qemu_name;
ths3780e192007-06-21 21:08:02 +0000237int alt_grab = 0;
blueswir166508602007-05-01 14:16:52 +0000238#ifdef TARGET_SPARC
239unsigned int nb_prom_envs = 0;
240const char *prom_envs[MAX_PROM_ENVS];
241#endif
thse4bcb142007-12-02 04:51:10 +0000242int nb_drives_opt;
balrog609497a2008-01-14 02:56:53 +0000243struct drive_opt {
244 const char *file;
245 char opt[1024];
246} drives_opt[MAX_DRIVES];
bellard0824d6f2003-06-24 13:42:40 +0000247
balrogee5605e2007-12-03 03:01:40 +0000248static CPUState *cur_cpu;
249static CPUState *next_cpu;
balrog76ea08f2007-12-16 11:48:54 +0000250static int event_pending = 1;
thsbf20dc02008-06-30 17:22:19 +0000251/* Conversion factor from emulated instructions to virtual clock ticks. */
pbrook2e70f6e2008-06-29 01:03:05 +0000252static int icount_time_shift;
thsbf20dc02008-06-30 17:22:19 +0000253/* Arbitrarily pick 1MIPS as the minimum allowable speed. */
pbrook2e70f6e2008-06-29 01:03:05 +0000254#define MAX_ICOUNT_SHIFT 10
255/* Compensate for varying guest execution speed. */
256static int64_t qemu_icount_bias;
257QEMUTimer *icount_rt_timer;
258QEMUTimer *icount_vm_timer;
balrogee5605e2007-12-03 03:01:40 +0000259
blueswir18fcb1b92008-09-18 18:29:08 +0000260uint8_t qemu_uuid[16];
261
balrogaeb30be2007-07-02 15:03:13 +0000262#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
263
bellard0824d6f2003-06-24 13:42:40 +0000264/***********************************************************/
bellard26aa7d72004-04-28 22:26:05 +0000265/* x86 ISA bus support */
266
267target_phys_addr_t isa_mem_base = 0;
bellard3de388f2005-07-02 18:11:44 +0000268PicState2 *isa_pic;
bellard0824d6f2003-06-24 13:42:40 +0000269
aliguori477e3ed2008-07-23 15:19:59 +0000270static IOPortReadFunc default_ioport_readb, default_ioport_readw, default_ioport_readl;
271static IOPortWriteFunc default_ioport_writeb, default_ioport_writew, default_ioport_writel;
272
273static uint32_t ioport_read(int index, uint32_t address)
274{
275 static IOPortReadFunc *default_func[3] = {
276 default_ioport_readb,
277 default_ioport_readw,
278 default_ioport_readl
279 };
280 IOPortReadFunc *func = ioport_read_table[index][address];
281 if (!func)
282 func = default_func[index];
283 return func(ioport_opaque[address], address);
284}
285
286static void ioport_write(int index, uint32_t address, uint32_t data)
287{
288 static IOPortWriteFunc *default_func[3] = {
289 default_ioport_writeb,
290 default_ioport_writew,
291 default_ioport_writel
292 };
293 IOPortWriteFunc *func = ioport_write_table[index][address];
294 if (!func)
295 func = default_func[index];
296 func(ioport_opaque[address], address, data);
297}
298
pbrook9596ebb2007-11-18 01:44:38 +0000299static uint32_t default_ioport_readb(void *opaque, uint32_t address)
bellard0824d6f2003-06-24 13:42:40 +0000300{
301#ifdef DEBUG_UNUSED_IOPORT
ths1196be32007-03-17 15:17:58 +0000302 fprintf(stderr, "unused inb: port=0x%04x\n", address);
bellard0824d6f2003-06-24 13:42:40 +0000303#endif
bellardfc01f7e2003-06-30 10:03:06 +0000304 return 0xff;
bellard0824d6f2003-06-24 13:42:40 +0000305}
306
pbrook9596ebb2007-11-18 01:44:38 +0000307static void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
bellard0824d6f2003-06-24 13:42:40 +0000308{
309#ifdef DEBUG_UNUSED_IOPORT
ths1196be32007-03-17 15:17:58 +0000310 fprintf(stderr, "unused outb: port=0x%04x data=0x%02x\n", address, data);
bellard0824d6f2003-06-24 13:42:40 +0000311#endif
312}
313
314/* default is to make two byte accesses */
pbrook9596ebb2007-11-18 01:44:38 +0000315static uint32_t default_ioport_readw(void *opaque, uint32_t address)
bellard0824d6f2003-06-24 13:42:40 +0000316{
317 uint32_t data;
aliguori477e3ed2008-07-23 15:19:59 +0000318 data = ioport_read(0, address);
bellarddb45c292004-05-12 19:50:26 +0000319 address = (address + 1) & (MAX_IOPORTS - 1);
aliguori477e3ed2008-07-23 15:19:59 +0000320 data |= ioport_read(0, address) << 8;
bellard0824d6f2003-06-24 13:42:40 +0000321 return data;
322}
323
pbrook9596ebb2007-11-18 01:44:38 +0000324static void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
bellard0824d6f2003-06-24 13:42:40 +0000325{
aliguori477e3ed2008-07-23 15:19:59 +0000326 ioport_write(0, address, data & 0xff);
bellarddb45c292004-05-12 19:50:26 +0000327 address = (address + 1) & (MAX_IOPORTS - 1);
aliguori477e3ed2008-07-23 15:19:59 +0000328 ioport_write(0, address, (data >> 8) & 0xff);
bellardfc01f7e2003-06-30 10:03:06 +0000329}
330
pbrook9596ebb2007-11-18 01:44:38 +0000331static uint32_t default_ioport_readl(void *opaque, uint32_t address)
bellardfc01f7e2003-06-30 10:03:06 +0000332{
333#ifdef DEBUG_UNUSED_IOPORT
ths1196be32007-03-17 15:17:58 +0000334 fprintf(stderr, "unused inl: port=0x%04x\n", address);
bellardfc01f7e2003-06-30 10:03:06 +0000335#endif
336 return 0xffffffff;
337}
338
pbrook9596ebb2007-11-18 01:44:38 +0000339static void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
bellardfc01f7e2003-06-30 10:03:06 +0000340{
341#ifdef DEBUG_UNUSED_IOPORT
ths1196be32007-03-17 15:17:58 +0000342 fprintf(stderr, "unused outl: port=0x%04x data=0x%02x\n", address, data);
bellardfc01f7e2003-06-30 10:03:06 +0000343#endif
bellard0824d6f2003-06-24 13:42:40 +0000344}
345
bellardfc01f7e2003-06-30 10:03:06 +0000346/* size is the word size in byte */
ths5fafdf22007-09-16 21:08:06 +0000347int register_ioport_read(int start, int length, int size,
bellardc4b1fcc2004-03-14 21:44:30 +0000348 IOPortReadFunc *func, void *opaque)
bellard0824d6f2003-06-24 13:42:40 +0000349{
bellardfc01f7e2003-06-30 10:03:06 +0000350 int i, bsize;
bellard0824d6f2003-06-24 13:42:40 +0000351
bellardc4b1fcc2004-03-14 21:44:30 +0000352 if (size == 1) {
bellardfc01f7e2003-06-30 10:03:06 +0000353 bsize = 0;
bellardc4b1fcc2004-03-14 21:44:30 +0000354 } else if (size == 2) {
bellardfc01f7e2003-06-30 10:03:06 +0000355 bsize = 1;
bellardc4b1fcc2004-03-14 21:44:30 +0000356 } else if (size == 4) {
bellardfc01f7e2003-06-30 10:03:06 +0000357 bsize = 2;
bellardc4b1fcc2004-03-14 21:44:30 +0000358 } else {
balrog88fdf562008-04-26 21:11:22 +0000359 hw_error("register_ioport_read: invalid size");
bellardfc01f7e2003-06-30 10:03:06 +0000360 return -1;
bellardc4b1fcc2004-03-14 21:44:30 +0000361 }
362 for(i = start; i < start + length; i += size) {
bellardfc01f7e2003-06-30 10:03:06 +0000363 ioport_read_table[bsize][i] = func;
bellardc4b1fcc2004-03-14 21:44:30 +0000364 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
balrog88fdf562008-04-26 21:11:22 +0000365 hw_error("register_ioport_read: invalid opaque");
bellardc4b1fcc2004-03-14 21:44:30 +0000366 ioport_opaque[i] = opaque;
367 }
bellard0824d6f2003-06-24 13:42:40 +0000368 return 0;
369}
370
bellardfc01f7e2003-06-30 10:03:06 +0000371/* size is the word size in byte */
ths5fafdf22007-09-16 21:08:06 +0000372int register_ioport_write(int start, int length, int size,
bellardc4b1fcc2004-03-14 21:44:30 +0000373 IOPortWriteFunc *func, void *opaque)
bellard0824d6f2003-06-24 13:42:40 +0000374{
bellardfc01f7e2003-06-30 10:03:06 +0000375 int i, bsize;
bellard0824d6f2003-06-24 13:42:40 +0000376
bellardc4b1fcc2004-03-14 21:44:30 +0000377 if (size == 1) {
bellardfc01f7e2003-06-30 10:03:06 +0000378 bsize = 0;
bellardc4b1fcc2004-03-14 21:44:30 +0000379 } else if (size == 2) {
bellardfc01f7e2003-06-30 10:03:06 +0000380 bsize = 1;
bellardc4b1fcc2004-03-14 21:44:30 +0000381 } else if (size == 4) {
bellardfc01f7e2003-06-30 10:03:06 +0000382 bsize = 2;
bellardc4b1fcc2004-03-14 21:44:30 +0000383 } else {
balrog88fdf562008-04-26 21:11:22 +0000384 hw_error("register_ioport_write: invalid size");
bellardfc01f7e2003-06-30 10:03:06 +0000385 return -1;
bellardc4b1fcc2004-03-14 21:44:30 +0000386 }
387 for(i = start; i < start + length; i += size) {
bellardfc01f7e2003-06-30 10:03:06 +0000388 ioport_write_table[bsize][i] = func;
balrog88fdf562008-04-26 21:11:22 +0000389 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
390 hw_error("register_ioport_write: invalid opaque");
bellardc4b1fcc2004-03-14 21:44:30 +0000391 ioport_opaque[i] = opaque;
392 }
bellardf1510b22003-06-25 00:07:40 +0000393 return 0;
394}
395
bellard69b91032004-05-18 23:05:28 +0000396void isa_unassign_ioport(int start, int length)
397{
398 int i;
399
400 for(i = start; i < start + length; i++) {
401 ioport_read_table[0][i] = default_ioport_readb;
402 ioport_read_table[1][i] = default_ioport_readw;
403 ioport_read_table[2][i] = default_ioport_readl;
404
405 ioport_write_table[0][i] = default_ioport_writeb;
406 ioport_write_table[1][i] = default_ioport_writew;
407 ioport_write_table[2][i] = default_ioport_writel;
408 }
409}
410
bellard20f32282005-01-03 23:36:21 +0000411/***********************************************************/
412
bellardc45886d2004-01-05 00:02:06 +0000413void cpu_outb(CPUState *env, int addr, int val)
bellard0824d6f2003-06-24 13:42:40 +0000414{
bellardfd872592004-05-12 19:11:15 +0000415#ifdef DEBUG_IOPORT
416 if (loglevel & CPU_LOG_IOPORT)
417 fprintf(logfile, "outb: %04x %02x\n", addr, val);
ths3b46e622007-09-17 08:09:54 +0000418#endif
aliguori477e3ed2008-07-23 15:19:59 +0000419 ioport_write(0, addr, val);
bellard89bfc102006-02-08 22:46:31 +0000420#ifdef USE_KQEMU
421 if (env)
422 env->last_io_time = cpu_get_time_fast();
423#endif
bellard0824d6f2003-06-24 13:42:40 +0000424}
425
bellardc45886d2004-01-05 00:02:06 +0000426void cpu_outw(CPUState *env, int addr, int val)
bellard0824d6f2003-06-24 13:42:40 +0000427{
bellardfd872592004-05-12 19:11:15 +0000428#ifdef DEBUG_IOPORT
429 if (loglevel & CPU_LOG_IOPORT)
430 fprintf(logfile, "outw: %04x %04x\n", addr, val);
ths3b46e622007-09-17 08:09:54 +0000431#endif
aliguori477e3ed2008-07-23 15:19:59 +0000432 ioport_write(1, addr, val);
bellard89bfc102006-02-08 22:46:31 +0000433#ifdef USE_KQEMU
434 if (env)
435 env->last_io_time = cpu_get_time_fast();
436#endif
bellard0824d6f2003-06-24 13:42:40 +0000437}
438
bellardc45886d2004-01-05 00:02:06 +0000439void cpu_outl(CPUState *env, int addr, int val)
bellard0824d6f2003-06-24 13:42:40 +0000440{
bellardfd872592004-05-12 19:11:15 +0000441#ifdef DEBUG_IOPORT
442 if (loglevel & CPU_LOG_IOPORT)
443 fprintf(logfile, "outl: %04x %08x\n", addr, val);
444#endif
aliguori477e3ed2008-07-23 15:19:59 +0000445 ioport_write(2, addr, val);
bellard89bfc102006-02-08 22:46:31 +0000446#ifdef USE_KQEMU
447 if (env)
448 env->last_io_time = cpu_get_time_fast();
449#endif
bellard0824d6f2003-06-24 13:42:40 +0000450}
451
bellardc45886d2004-01-05 00:02:06 +0000452int cpu_inb(CPUState *env, int addr)
bellard0824d6f2003-06-24 13:42:40 +0000453{
bellardfd872592004-05-12 19:11:15 +0000454 int val;
aliguori477e3ed2008-07-23 15:19:59 +0000455 val = ioport_read(0, addr);
bellardfd872592004-05-12 19:11:15 +0000456#ifdef DEBUG_IOPORT
457 if (loglevel & CPU_LOG_IOPORT)
458 fprintf(logfile, "inb : %04x %02x\n", addr, val);
459#endif
bellard89bfc102006-02-08 22:46:31 +0000460#ifdef USE_KQEMU
461 if (env)
462 env->last_io_time = cpu_get_time_fast();
463#endif
bellardfd872592004-05-12 19:11:15 +0000464 return val;
bellard0824d6f2003-06-24 13:42:40 +0000465}
466
bellardc45886d2004-01-05 00:02:06 +0000467int cpu_inw(CPUState *env, int addr)
bellard0824d6f2003-06-24 13:42:40 +0000468{
bellardfd872592004-05-12 19:11:15 +0000469 int val;
aliguori477e3ed2008-07-23 15:19:59 +0000470 val = ioport_read(1, addr);
bellardfd872592004-05-12 19:11:15 +0000471#ifdef DEBUG_IOPORT
472 if (loglevel & CPU_LOG_IOPORT)
473 fprintf(logfile, "inw : %04x %04x\n", addr, val);
474#endif
bellard89bfc102006-02-08 22:46:31 +0000475#ifdef USE_KQEMU
476 if (env)
477 env->last_io_time = cpu_get_time_fast();
478#endif
bellardfd872592004-05-12 19:11:15 +0000479 return val;
bellard0824d6f2003-06-24 13:42:40 +0000480}
481
bellardc45886d2004-01-05 00:02:06 +0000482int cpu_inl(CPUState *env, int addr)
bellard0824d6f2003-06-24 13:42:40 +0000483{
bellardfd872592004-05-12 19:11:15 +0000484 int val;
aliguori477e3ed2008-07-23 15:19:59 +0000485 val = ioport_read(2, addr);
bellardfd872592004-05-12 19:11:15 +0000486#ifdef DEBUG_IOPORT
487 if (loglevel & CPU_LOG_IOPORT)
488 fprintf(logfile, "inl : %04x %08x\n", addr, val);
489#endif
bellard89bfc102006-02-08 22:46:31 +0000490#ifdef USE_KQEMU
491 if (env)
492 env->last_io_time = cpu_get_time_fast();
493#endif
bellardfd872592004-05-12 19:11:15 +0000494 return val;
bellard0824d6f2003-06-24 13:42:40 +0000495}
496
497/***********************************************************/
bellard0824d6f2003-06-24 13:42:40 +0000498void hw_error(const char *fmt, ...)
499{
500 va_list ap;
bellard6a00d602005-11-21 23:25:50 +0000501 CPUState *env;
bellard0824d6f2003-06-24 13:42:40 +0000502
503 va_start(ap, fmt);
504 fprintf(stderr, "qemu: hardware error: ");
505 vfprintf(stderr, fmt, ap);
506 fprintf(stderr, "\n");
bellard6a00d602005-11-21 23:25:50 +0000507 for(env = first_cpu; env != NULL; env = env->next_cpu) {
508 fprintf(stderr, "CPU #%d:\n", env->cpu_index);
bellard0824d6f2003-06-24 13:42:40 +0000509#ifdef TARGET_I386
bellard6a00d602005-11-21 23:25:50 +0000510 cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
bellardc45886d2004-01-05 00:02:06 +0000511#else
bellard6a00d602005-11-21 23:25:50 +0000512 cpu_dump_state(env, stderr, fprintf, 0);
bellard0824d6f2003-06-24 13:42:40 +0000513#endif
bellard6a00d602005-11-21 23:25:50 +0000514 }
bellard0824d6f2003-06-24 13:42:40 +0000515 va_end(ap);
516 abort();
517}
518
bellard8a7ddc32004-03-31 19:00:16 +0000519/***********************************************************/
bellard63066f42004-06-03 18:45:02 +0000520/* keyboard/mouse */
521
522static QEMUPutKBDEvent *qemu_put_kbd_event;
523static void *qemu_put_kbd_event_opaque;
ths455204e2007-01-05 16:42:13 +0000524static QEMUPutMouseEntry *qemu_put_mouse_event_head;
525static QEMUPutMouseEntry *qemu_put_mouse_event_current;
bellard63066f42004-06-03 18:45:02 +0000526
527void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
528{
529 qemu_put_kbd_event_opaque = opaque;
530 qemu_put_kbd_event = func;
531}
532
ths455204e2007-01-05 16:42:13 +0000533QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
534 void *opaque, int absolute,
535 const char *name)
bellard63066f42004-06-03 18:45:02 +0000536{
ths455204e2007-01-05 16:42:13 +0000537 QEMUPutMouseEntry *s, *cursor;
538
539 s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
540 if (!s)
541 return NULL;
542
543 s->qemu_put_mouse_event = func;
544 s->qemu_put_mouse_event_opaque = opaque;
545 s->qemu_put_mouse_event_absolute = absolute;
546 s->qemu_put_mouse_event_name = qemu_strdup(name);
547 s->next = NULL;
548
549 if (!qemu_put_mouse_event_head) {
550 qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
551 return s;
552 }
553
554 cursor = qemu_put_mouse_event_head;
555 while (cursor->next != NULL)
556 cursor = cursor->next;
557
558 cursor->next = s;
559 qemu_put_mouse_event_current = s;
560
561 return s;
562}
563
564void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
565{
566 QEMUPutMouseEntry *prev = NULL, *cursor;
567
568 if (!qemu_put_mouse_event_head || entry == NULL)
569 return;
570
571 cursor = qemu_put_mouse_event_head;
572 while (cursor != NULL && cursor != entry) {
573 prev = cursor;
574 cursor = cursor->next;
575 }
576
577 if (cursor == NULL) // does not exist or list empty
578 return;
579 else if (prev == NULL) { // entry is head
580 qemu_put_mouse_event_head = cursor->next;
581 if (qemu_put_mouse_event_current == entry)
582 qemu_put_mouse_event_current = cursor->next;
583 qemu_free(entry->qemu_put_mouse_event_name);
584 qemu_free(entry);
585 return;
586 }
587
588 prev->next = entry->next;
589
590 if (qemu_put_mouse_event_current == entry)
591 qemu_put_mouse_event_current = prev;
592
593 qemu_free(entry->qemu_put_mouse_event_name);
594 qemu_free(entry);
bellard63066f42004-06-03 18:45:02 +0000595}
596
597void kbd_put_keycode(int keycode)
598{
599 if (qemu_put_kbd_event) {
600 qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
601 }
602}
603
604void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
605{
ths455204e2007-01-05 16:42:13 +0000606 QEMUPutMouseEvent *mouse_event;
607 void *mouse_event_opaque;
balroga171fe32007-04-30 01:48:07 +0000608 int width;
ths455204e2007-01-05 16:42:13 +0000609
610 if (!qemu_put_mouse_event_current) {
611 return;
612 }
613
614 mouse_event =
615 qemu_put_mouse_event_current->qemu_put_mouse_event;
616 mouse_event_opaque =
617 qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;
618
619 if (mouse_event) {
balroga171fe32007-04-30 01:48:07 +0000620 if (graphic_rotate) {
621 if (qemu_put_mouse_event_current->qemu_put_mouse_event_absolute)
622 width = 0x7fff;
623 else
aurel32b94ed572008-03-10 19:34:27 +0000624 width = graphic_width - 1;
balroga171fe32007-04-30 01:48:07 +0000625 mouse_event(mouse_event_opaque,
626 width - dy, dx, dz, buttons_state);
627 } else
628 mouse_event(mouse_event_opaque,
629 dx, dy, dz, buttons_state);
bellard63066f42004-06-03 18:45:02 +0000630 }
631}
632
bellard09b26c52006-04-12 21:09:08 +0000633int kbd_mouse_is_absolute(void)
634{
ths455204e2007-01-05 16:42:13 +0000635 if (!qemu_put_mouse_event_current)
636 return 0;
637
638 return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
639}
640
641void do_info_mice(void)
642{
643 QEMUPutMouseEntry *cursor;
644 int index = 0;
645
646 if (!qemu_put_mouse_event_head) {
647 term_printf("No mouse devices connected\n");
648 return;
649 }
650
651 term_printf("Mouse devices available:\n");
652 cursor = qemu_put_mouse_event_head;
653 while (cursor != NULL) {
654 term_printf("%c Mouse #%d: %s\n",
655 (cursor == qemu_put_mouse_event_current ? '*' : ' '),
656 index, cursor->qemu_put_mouse_event_name);
657 index++;
658 cursor = cursor->next;
659 }
660}
661
662void do_mouse_set(int index)
663{
664 QEMUPutMouseEntry *cursor;
665 int i = 0;
666
667 if (!qemu_put_mouse_event_head) {
668 term_printf("No mouse devices connected\n");
669 return;
670 }
671
672 cursor = qemu_put_mouse_event_head;
673 while (cursor != NULL && index != i) {
674 i++;
675 cursor = cursor->next;
676 }
677
678 if (cursor != NULL)
679 qemu_put_mouse_event_current = cursor;
680 else
681 term_printf("Mouse at given index not found\n");
bellard09b26c52006-04-12 21:09:08 +0000682}
683
bellard87858c82003-06-27 12:01:39 +0000684/* compute with 96 bit intermediate result: (a*b)/c */
bellard80cabfa2004-03-14 12:20:30 +0000685uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
bellard87858c82003-06-27 12:01:39 +0000686{
687 union {
688 uint64_t ll;
689 struct {
690#ifdef WORDS_BIGENDIAN
691 uint32_t high, low;
692#else
693 uint32_t low, high;
ths3b46e622007-09-17 08:09:54 +0000694#endif
bellard87858c82003-06-27 12:01:39 +0000695 } l;
696 } u, res;
697 uint64_t rl, rh;
698
699 u.ll = a;
700 rl = (uint64_t)u.l.low * (uint64_t)b;
701 rh = (uint64_t)u.l.high * (uint64_t)b;
702 rh += (rl >> 32);
703 res.l.high = rh / c;
704 res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
705 return res.ll;
706}
707
bellard1dce7c32006-07-13 23:20:22 +0000708/***********************************************************/
709/* real time host monotonic timer */
710
711#define QEMU_TIMER_BASE 1000000000LL
712
713#ifdef WIN32
714
715static int64_t clock_freq;
716
717static void init_get_clock(void)
718{
bellarda8e5ac32006-07-14 09:36:13 +0000719 LARGE_INTEGER freq;
720 int ret;
bellard1dce7c32006-07-13 23:20:22 +0000721 ret = QueryPerformanceFrequency(&freq);
722 if (ret == 0) {
723 fprintf(stderr, "Could not calibrate ticks\n");
724 exit(1);
725 }
726 clock_freq = freq.QuadPart;
727}
728
729static int64_t get_clock(void)
730{
731 LARGE_INTEGER ti;
732 QueryPerformanceCounter(&ti);
733 return muldiv64(ti.QuadPart, QEMU_TIMER_BASE, clock_freq);
734}
735
736#else
737
738static int use_rt_clock;
739
740static void init_get_clock(void)
741{
742 use_rt_clock = 0;
743#if defined(__linux__)
744 {
745 struct timespec ts;
746 if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
747 use_rt_clock = 1;
748 }
749 }
750#endif
751}
752
753static int64_t get_clock(void)
754{
755#if defined(__linux__)
756 if (use_rt_clock) {
757 struct timespec ts;
758 clock_gettime(CLOCK_MONOTONIC, &ts);
759 return ts.tv_sec * 1000000000LL + ts.tv_nsec;
ths5fafdf22007-09-16 21:08:06 +0000760 } else
bellard1dce7c32006-07-13 23:20:22 +0000761#endif
762 {
763 /* XXX: using gettimeofday leads to problems if the date
764 changes, so it should be avoided. */
765 struct timeval tv;
766 gettimeofday(&tv, NULL);
767 return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
768 }
769}
bellard1dce7c32006-07-13 23:20:22 +0000770#endif
771
pbrook2e70f6e2008-06-29 01:03:05 +0000772/* Return the virtual CPU time, based on the instruction counter. */
773static int64_t cpu_get_icount(void)
774{
775 int64_t icount;
776 CPUState *env = cpu_single_env;;
777 icount = qemu_icount;
778 if (env) {
779 if (!can_do_io(env))
780 fprintf(stderr, "Bad clock read\n");
781 icount -= (env->icount_decr.u16.low + env->icount_extra);
782 }
783 return qemu_icount_bias + (icount << icount_time_shift);
784}
785
bellard1dce7c32006-07-13 23:20:22 +0000786/***********************************************************/
787/* guest cycle counter */
788
789static int64_t cpu_ticks_prev;
790static int64_t cpu_ticks_offset;
791static int64_t cpu_clock_offset;
792static int cpu_ticks_enabled;
793
794/* return the host CPU cycle counter and handle stop/restart */
795int64_t cpu_get_ticks(void)
796{
pbrook2e70f6e2008-06-29 01:03:05 +0000797 if (use_icount) {
798 return cpu_get_icount();
799 }
bellard1dce7c32006-07-13 23:20:22 +0000800 if (!cpu_ticks_enabled) {
801 return cpu_ticks_offset;
802 } else {
803 int64_t ticks;
804 ticks = cpu_get_real_ticks();
805 if (cpu_ticks_prev > ticks) {
806 /* Note: non increasing ticks may happen if the host uses
807 software suspend */
808 cpu_ticks_offset += cpu_ticks_prev - ticks;
809 }
810 cpu_ticks_prev = ticks;
811 return ticks + cpu_ticks_offset;
812 }
813}
814
815/* return the host CPU monotonic timer and handle stop/restart */
816static int64_t cpu_get_clock(void)
817{
818 int64_t ti;
819 if (!cpu_ticks_enabled) {
820 return cpu_clock_offset;
821 } else {
822 ti = get_clock();
823 return ti + cpu_clock_offset;
824 }
825}
826
827/* enable cpu_get_ticks() */
828void cpu_enable_ticks(void)
829{
830 if (!cpu_ticks_enabled) {
831 cpu_ticks_offset -= cpu_get_real_ticks();
832 cpu_clock_offset -= get_clock();
833 cpu_ticks_enabled = 1;
834 }
835}
836
837/* disable cpu_get_ticks() : the clock is stopped. You must not call
838 cpu_get_ticks() after that. */
839void cpu_disable_ticks(void)
840{
841 if (cpu_ticks_enabled) {
842 cpu_ticks_offset = cpu_get_ticks();
843 cpu_clock_offset = cpu_get_clock();
844 cpu_ticks_enabled = 0;
845 }
846}
847
848/***********************************************************/
849/* timers */
ths5fafdf22007-09-16 21:08:06 +0000850
bellard8a7ddc32004-03-31 19:00:16 +0000851#define QEMU_TIMER_REALTIME 0
852#define QEMU_TIMER_VIRTUAL 1
853
854struct QEMUClock {
855 int type;
856 /* XXX: add frequency */
857};
858
859struct QEMUTimer {
860 QEMUClock *clock;
861 int64_t expire_time;
862 QEMUTimerCB *cb;
863 void *opaque;
864 struct QEMUTimer *next;
865};
866
thsc8994012007-08-19 21:56:03 +0000867struct qemu_alarm_timer {
868 char const *name;
thsefe75412007-08-24 01:36:32 +0000869 unsigned int flags;
thsc8994012007-08-19 21:56:03 +0000870
871 int (*start)(struct qemu_alarm_timer *t);
872 void (*stop)(struct qemu_alarm_timer *t);
thsefe75412007-08-24 01:36:32 +0000873 void (*rearm)(struct qemu_alarm_timer *t);
thsc8994012007-08-19 21:56:03 +0000874 void *priv;
875};
876
thsefe75412007-08-24 01:36:32 +0000877#define ALARM_FLAG_DYNTICKS 0x1
balrogd5d08332008-01-05 19:41:47 +0000878#define ALARM_FLAG_EXPIRED 0x2
thsefe75412007-08-24 01:36:32 +0000879
880static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
881{
882 return t->flags & ALARM_FLAG_DYNTICKS;
883}
884
885static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
886{
887 if (!alarm_has_dynticks(t))
888 return;
889
890 t->rearm(t);
891}
892
893/* TODO: MIN_TIMER_REARM_US should be optimized */
894#define MIN_TIMER_REARM_US 250
895
thsc8994012007-08-19 21:56:03 +0000896static struct qemu_alarm_timer *alarm_timer;
897
898#ifdef _WIN32
899
900struct qemu_alarm_win32 {
901 MMRESULT timerId;
902 HANDLE host_alarm;
903 unsigned int period;
904} alarm_win32_data = {0, NULL, -1};
905
906static int win32_start_timer(struct qemu_alarm_timer *t);
907static void win32_stop_timer(struct qemu_alarm_timer *t);
thsefe75412007-08-24 01:36:32 +0000908static void win32_rearm_timer(struct qemu_alarm_timer *t);
thsc8994012007-08-19 21:56:03 +0000909
910#else
911
912static int unix_start_timer(struct qemu_alarm_timer *t);
913static void unix_stop_timer(struct qemu_alarm_timer *t);
914
ths231c6582007-08-26 17:29:15 +0000915#ifdef __linux__
916
thsefe75412007-08-24 01:36:32 +0000917static int dynticks_start_timer(struct qemu_alarm_timer *t);
918static void dynticks_stop_timer(struct qemu_alarm_timer *t);
919static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
920
thsc40ec5a2007-08-19 22:09:40 +0000921static int hpet_start_timer(struct qemu_alarm_timer *t);
922static void hpet_stop_timer(struct qemu_alarm_timer *t);
923
thsc8994012007-08-19 21:56:03 +0000924static int rtc_start_timer(struct qemu_alarm_timer *t);
925static void rtc_stop_timer(struct qemu_alarm_timer *t);
926
thsefe75412007-08-24 01:36:32 +0000927#endif /* __linux__ */
thsc8994012007-08-19 21:56:03 +0000928
929#endif /* _WIN32 */
930
pbrook2e70f6e2008-06-29 01:03:05 +0000931/* Correlation between real and virtual time is always going to be
thsbf20dc02008-06-30 17:22:19 +0000932 fairly approximate, so ignore small variation.
pbrook2e70f6e2008-06-29 01:03:05 +0000933 When the guest is idle real and virtual time will be aligned in
934 the IO wait loop. */
935#define ICOUNT_WOBBLE (QEMU_TIMER_BASE / 10)
936
937static void icount_adjust(void)
938{
939 int64_t cur_time;
940 int64_t cur_icount;
941 int64_t delta;
942 static int64_t last_delta;
943 /* If the VM is not running, then do nothing. */
944 if (!vm_running)
945 return;
946
947 cur_time = cpu_get_clock();
948 cur_icount = qemu_get_clock(vm_clock);
949 delta = cur_icount - cur_time;
950 /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
951 if (delta > 0
952 && last_delta + ICOUNT_WOBBLE < delta * 2
953 && icount_time_shift > 0) {
954 /* The guest is getting too far ahead. Slow time down. */
955 icount_time_shift--;
956 }
957 if (delta < 0
958 && last_delta - ICOUNT_WOBBLE > delta * 2
959 && icount_time_shift < MAX_ICOUNT_SHIFT) {
960 /* The guest is getting too far behind. Speed time up. */
961 icount_time_shift++;
962 }
963 last_delta = delta;
964 qemu_icount_bias = cur_icount - (qemu_icount << icount_time_shift);
965}
966
967static void icount_adjust_rt(void * opaque)
968{
969 qemu_mod_timer(icount_rt_timer,
970 qemu_get_clock(rt_clock) + 1000);
971 icount_adjust();
972}
973
974static void icount_adjust_vm(void * opaque)
975{
976 qemu_mod_timer(icount_vm_timer,
977 qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
978 icount_adjust();
979}
980
981static void init_icount_adjust(void)
982{
983 /* Have both realtime and virtual time triggers for speed adjustment.
984 The realtime trigger catches emulated time passing too slowly,
985 the virtual time trigger catches emulated time passing too fast.
986 Realtime triggers occur even when idle, so use them less frequently
987 than VM triggers. */
988 icount_rt_timer = qemu_new_timer(rt_clock, icount_adjust_rt, NULL);
989 qemu_mod_timer(icount_rt_timer,
990 qemu_get_clock(rt_clock) + 1000);
991 icount_vm_timer = qemu_new_timer(vm_clock, icount_adjust_vm, NULL);
992 qemu_mod_timer(icount_vm_timer,
993 qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
994}
995
thsc8994012007-08-19 21:56:03 +0000996static struct qemu_alarm_timer alarm_timers[] = {
thsefe75412007-08-24 01:36:32 +0000997#ifndef _WIN32
ths231c6582007-08-26 17:29:15 +0000998#ifdef __linux__
thsefe75412007-08-24 01:36:32 +0000999 {"dynticks", ALARM_FLAG_DYNTICKS, dynticks_start_timer,
1000 dynticks_stop_timer, dynticks_rearm_timer, NULL},
thsc40ec5a2007-08-19 22:09:40 +00001001 /* HPET - if available - is preferred */
thsefe75412007-08-24 01:36:32 +00001002 {"hpet", 0, hpet_start_timer, hpet_stop_timer, NULL, NULL},
thsc40ec5a2007-08-19 22:09:40 +00001003 /* ...otherwise try RTC */
thsefe75412007-08-24 01:36:32 +00001004 {"rtc", 0, rtc_start_timer, rtc_stop_timer, NULL, NULL},
thsc8994012007-08-19 21:56:03 +00001005#endif
thsefe75412007-08-24 01:36:32 +00001006 {"unix", 0, unix_start_timer, unix_stop_timer, NULL, NULL},
thsc8994012007-08-19 21:56:03 +00001007#else
thsefe75412007-08-24 01:36:32 +00001008 {"dynticks", ALARM_FLAG_DYNTICKS, win32_start_timer,
1009 win32_stop_timer, win32_rearm_timer, &alarm_win32_data},
1010 {"win32", 0, win32_start_timer,
1011 win32_stop_timer, NULL, &alarm_win32_data},
thsc8994012007-08-19 21:56:03 +00001012#endif
1013 {NULL, }
1014};
1015
blueswir13f47aa82008-03-09 06:59:01 +00001016static void show_available_alarms(void)
thsf3dcfad2007-08-24 01:26:02 +00001017{
1018 int i;
1019
1020 printf("Available alarm timers, in order of precedence:\n");
1021 for (i = 0; alarm_timers[i].name; i++)
1022 printf("%s\n", alarm_timers[i].name);
1023}
1024
1025static void configure_alarms(char const *opt)
1026{
1027 int i;
1028 int cur = 0;
1029 int count = (sizeof(alarm_timers) / sizeof(*alarm_timers)) - 1;
1030 char *arg;
1031 char *name;
pbrook2e70f6e2008-06-29 01:03:05 +00001032 struct qemu_alarm_timer tmp;
thsf3dcfad2007-08-24 01:26:02 +00001033
aurel323adda042008-03-09 23:43:49 +00001034 if (!strcmp(opt, "?")) {
thsf3dcfad2007-08-24 01:26:02 +00001035 show_available_alarms();
1036 exit(0);
1037 }
1038
1039 arg = strdup(opt);
1040
1041 /* Reorder the array */
1042 name = strtok(arg, ",");
1043 while (name) {
balroge2b577e2007-09-17 21:25:20 +00001044 for (i = 0; i < count && alarm_timers[i].name; i++) {
thsf3dcfad2007-08-24 01:26:02 +00001045 if (!strcmp(alarm_timers[i].name, name))
1046 break;
1047 }
1048
1049 if (i == count) {
1050 fprintf(stderr, "Unknown clock %s\n", name);
1051 goto next;
1052 }
1053
1054 if (i < cur)
1055 /* Ignore */
1056 goto next;
1057
1058 /* Swap */
1059 tmp = alarm_timers[i];
1060 alarm_timers[i] = alarm_timers[cur];
1061 alarm_timers[cur] = tmp;
1062
1063 cur++;
1064next:
1065 name = strtok(NULL, ",");
1066 }
1067
1068 free(arg);
1069
1070 if (cur) {
pbrook2e70f6e2008-06-29 01:03:05 +00001071 /* Disable remaining timers */
thsf3dcfad2007-08-24 01:26:02 +00001072 for (i = cur; i < count; i++)
1073 alarm_timers[i].name = NULL;
aurel323adda042008-03-09 23:43:49 +00001074 } else {
1075 show_available_alarms();
1076 exit(1);
thsf3dcfad2007-08-24 01:26:02 +00001077 }
thsf3dcfad2007-08-24 01:26:02 +00001078}
1079
bellard8a7ddc32004-03-31 19:00:16 +00001080QEMUClock *rt_clock;
1081QEMUClock *vm_clock;
1082
1083static QEMUTimer *active_timers[2];
bellard8a7ddc32004-03-31 19:00:16 +00001084
pbrook9596ebb2007-11-18 01:44:38 +00001085static QEMUClock *qemu_new_clock(int type)
bellard8a7ddc32004-03-31 19:00:16 +00001086{
1087 QEMUClock *clock;
1088 clock = qemu_mallocz(sizeof(QEMUClock));
1089 if (!clock)
1090 return NULL;
1091 clock->type = type;
1092 return clock;
1093}
1094
1095QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
1096{
1097 QEMUTimer *ts;
1098
1099 ts = qemu_mallocz(sizeof(QEMUTimer));
1100 ts->clock = clock;
1101 ts->cb = cb;
1102 ts->opaque = opaque;
1103 return ts;
1104}
1105
1106void qemu_free_timer(QEMUTimer *ts)
1107{
1108 qemu_free(ts);
1109}
1110
1111/* stop a timer, but do not dealloc it */
1112void qemu_del_timer(QEMUTimer *ts)
1113{
1114 QEMUTimer **pt, *t;
1115
1116 /* NOTE: this code must be signal safe because
1117 qemu_timer_expired() can be called from a signal. */
1118 pt = &active_timers[ts->clock->type];
1119 for(;;) {
1120 t = *pt;
1121 if (!t)
1122 break;
1123 if (t == ts) {
1124 *pt = t->next;
1125 break;
1126 }
1127 pt = &t->next;
1128 }
1129}
1130
1131/* modify the current timer so that it will be fired when current_time
1132 >= expire_time. The corresponding callback will be called. */
1133void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
1134{
1135 QEMUTimer **pt, *t;
1136
1137 qemu_del_timer(ts);
1138
1139 /* add the timer in the sorted list */
1140 /* NOTE: this code must be signal safe because
1141 qemu_timer_expired() can be called from a signal. */
1142 pt = &active_timers[ts->clock->type];
1143 for(;;) {
1144 t = *pt;
1145 if (!t)
1146 break;
ths5fafdf22007-09-16 21:08:06 +00001147 if (t->expire_time > expire_time)
bellard8a7ddc32004-03-31 19:00:16 +00001148 break;
1149 pt = &t->next;
1150 }
1151 ts->expire_time = expire_time;
1152 ts->next = *pt;
1153 *pt = ts;
balrogd5d08332008-01-05 19:41:47 +00001154
1155 /* Rearm if necessary */
pbrook2e70f6e2008-06-29 01:03:05 +00001156 if (pt == &active_timers[ts->clock->type]) {
1157 if ((alarm_timer->flags & ALARM_FLAG_EXPIRED) == 0) {
1158 qemu_rearm_alarm_timer(alarm_timer);
1159 }
1160 /* Interrupt execution to force deadline recalculation. */
1161 if (use_icount && cpu_single_env) {
1162 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
1163 }
1164 }
bellard8a7ddc32004-03-31 19:00:16 +00001165}
1166
1167int qemu_timer_pending(QEMUTimer *ts)
1168{
1169 QEMUTimer *t;
1170 for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
1171 if (t == ts)
1172 return 1;
1173 }
1174 return 0;
1175}
1176
1177static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
1178{
1179 if (!timer_head)
1180 return 0;
1181 return (timer_head->expire_time <= current_time);
1182}
1183
1184static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
1185{
1186 QEMUTimer *ts;
ths3b46e622007-09-17 08:09:54 +00001187
bellard8a7ddc32004-03-31 19:00:16 +00001188 for(;;) {
1189 ts = *ptimer_head;
bellarde95c8d52004-09-30 22:22:08 +00001190 if (!ts || ts->expire_time > current_time)
bellard8a7ddc32004-03-31 19:00:16 +00001191 break;
1192 /* remove timer from the list before calling the callback */
1193 *ptimer_head = ts->next;
1194 ts->next = NULL;
ths3b46e622007-09-17 08:09:54 +00001195
bellard8a7ddc32004-03-31 19:00:16 +00001196 /* run the callback (the timer list can be modified) */
1197 ts->cb(ts->opaque);
1198 }
1199}
1200
1201int64_t qemu_get_clock(QEMUClock *clock)
1202{
1203 switch(clock->type) {
1204 case QEMU_TIMER_REALTIME:
bellard1dce7c32006-07-13 23:20:22 +00001205 return get_clock() / 1000000;
bellard8a7ddc32004-03-31 19:00:16 +00001206 default:
1207 case QEMU_TIMER_VIRTUAL:
pbrook2e70f6e2008-06-29 01:03:05 +00001208 if (use_icount) {
1209 return cpu_get_icount();
1210 } else {
1211 return cpu_get_clock();
1212 }
bellard8a7ddc32004-03-31 19:00:16 +00001213 }
1214}
1215
bellard1dce7c32006-07-13 23:20:22 +00001216static void init_timers(void)
1217{
1218 init_get_clock();
1219 ticks_per_sec = QEMU_TIMER_BASE;
1220 rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
1221 vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
1222}
1223
bellard8a7ddc32004-03-31 19:00:16 +00001224/* save a timer */
1225void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
1226{
1227 uint64_t expire_time;
1228
1229 if (qemu_timer_pending(ts)) {
1230 expire_time = ts->expire_time;
1231 } else {
1232 expire_time = -1;
1233 }
1234 qemu_put_be64(f, expire_time);
1235}
1236
1237void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
1238{
1239 uint64_t expire_time;
1240
1241 expire_time = qemu_get_be64(f);
1242 if (expire_time != -1) {
1243 qemu_mod_timer(ts, expire_time);
1244 } else {
1245 qemu_del_timer(ts);
1246 }
1247}
1248
1249static void timer_save(QEMUFile *f, void *opaque)
1250{
1251 if (cpu_ticks_enabled) {
1252 hw_error("cannot save state if virtual timers are running");
1253 }
thsbee8d682007-12-16 23:41:11 +00001254 qemu_put_be64(f, cpu_ticks_offset);
1255 qemu_put_be64(f, ticks_per_sec);
1256 qemu_put_be64(f, cpu_clock_offset);
bellard8a7ddc32004-03-31 19:00:16 +00001257}
1258
1259static int timer_load(QEMUFile *f, void *opaque, int version_id)
1260{
bellardc88676f2006-08-06 13:36:11 +00001261 if (version_id != 1 && version_id != 2)
bellard8a7ddc32004-03-31 19:00:16 +00001262 return -EINVAL;
1263 if (cpu_ticks_enabled) {
1264 return -EINVAL;
1265 }
thsbee8d682007-12-16 23:41:11 +00001266 cpu_ticks_offset=qemu_get_be64(f);
1267 ticks_per_sec=qemu_get_be64(f);
bellardc88676f2006-08-06 13:36:11 +00001268 if (version_id == 2) {
thsbee8d682007-12-16 23:41:11 +00001269 cpu_clock_offset=qemu_get_be64(f);
bellardc88676f2006-08-06 13:36:11 +00001270 }
bellard8a7ddc32004-03-31 19:00:16 +00001271 return 0;
1272}
1273
bellard67b915a2004-03-31 23:37:16 +00001274#ifdef _WIN32
ths5fafdf22007-09-16 21:08:06 +00001275void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
bellard67b915a2004-03-31 23:37:16 +00001276 DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
1277#else
bellard8a7ddc32004-03-31 19:00:16 +00001278static void host_alarm_handler(int host_signum)
bellard67b915a2004-03-31 23:37:16 +00001279#endif
bellard8a7ddc32004-03-31 19:00:16 +00001280{
bellard02ba45c2004-06-25 14:46:23 +00001281#if 0
1282#define DISP_FREQ 1000
1283 {
1284 static int64_t delta_min = INT64_MAX;
1285 static int64_t delta_max, delta_cum, last_clock, delta, ti;
1286 static int count;
1287 ti = qemu_get_clock(vm_clock);
1288 if (last_clock != 0) {
1289 delta = ti - last_clock;
1290 if (delta < delta_min)
1291 delta_min = delta;
1292 if (delta > delta_max)
1293 delta_max = delta;
1294 delta_cum += delta;
1295 if (++count == DISP_FREQ) {
bellard26a76462006-06-25 18:15:32 +00001296 printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
bellard02ba45c2004-06-25 14:46:23 +00001297 muldiv64(delta_min, 1000000, ticks_per_sec),
1298 muldiv64(delta_max, 1000000, ticks_per_sec),
1299 muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
1300 (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
1301 count = 0;
1302 delta_min = INT64_MAX;
1303 delta_max = 0;
1304 delta_cum = 0;
1305 }
1306 }
1307 last_clock = ti;
1308 }
1309#endif
thsefe75412007-08-24 01:36:32 +00001310 if (alarm_has_dynticks(alarm_timer) ||
pbrook2e70f6e2008-06-29 01:03:05 +00001311 (!use_icount &&
1312 qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
1313 qemu_get_clock(vm_clock))) ||
bellard8a7ddc32004-03-31 19:00:16 +00001314 qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
1315 qemu_get_clock(rt_clock))) {
bellard06d9f2f2006-05-01 13:23:04 +00001316#ifdef _WIN32
thsc8994012007-08-19 21:56:03 +00001317 struct qemu_alarm_win32 *data = ((struct qemu_alarm_timer*)dwUser)->priv;
1318 SetEvent(data->host_alarm);
bellard06d9f2f2006-05-01 13:23:04 +00001319#endif
balrogee5605e2007-12-03 03:01:40 +00001320 CPUState *env = next_cpu;
1321
balrogd5d08332008-01-05 19:41:47 +00001322 alarm_timer->flags |= ALARM_FLAG_EXPIRED;
1323
balrog4f8eb8d2007-12-16 12:39:38 +00001324 if (env) {
1325 /* stop the currently executing cpu because a timer occured */
1326 cpu_interrupt(env, CPU_INTERRUPT_EXIT);
bellarda332e112005-09-03 17:55:47 +00001327#ifdef USE_KQEMU
balrog4f8eb8d2007-12-16 12:39:38 +00001328 if (env->kqemu_enabled) {
1329 kqemu_cpu_interrupt(env);
1330 }
balrogee5605e2007-12-03 03:01:40 +00001331#endif
balrog4f8eb8d2007-12-16 12:39:38 +00001332 }
balrogee5605e2007-12-03 03:01:40 +00001333 event_pending = 1;
bellard8a7ddc32004-03-31 19:00:16 +00001334 }
1335}
1336
pbrook2e70f6e2008-06-29 01:03:05 +00001337static int64_t qemu_next_deadline(void)
thsefe75412007-08-24 01:36:32 +00001338{
pbrook2e70f6e2008-06-29 01:03:05 +00001339 int64_t delta;
thsefe75412007-08-24 01:36:32 +00001340
1341 if (active_timers[QEMU_TIMER_VIRTUAL]) {
pbrook2e70f6e2008-06-29 01:03:05 +00001342 delta = active_timers[QEMU_TIMER_VIRTUAL]->expire_time -
1343 qemu_get_clock(vm_clock);
1344 } else {
1345 /* To avoid problems with overflow limit this to 2^32. */
1346 delta = INT32_MAX;
thsefe75412007-08-24 01:36:32 +00001347 }
1348
pbrook2e70f6e2008-06-29 01:03:05 +00001349 if (delta < 0)
1350 delta = 0;
thsefe75412007-08-24 01:36:32 +00001351
pbrook2e70f6e2008-06-29 01:03:05 +00001352 return delta;
1353}
1354
blueswir18632fb92008-09-14 13:59:34 +00001355#if defined(__linux__) || defined(_WIN32)
pbrook2e70f6e2008-06-29 01:03:05 +00001356static uint64_t qemu_next_deadline_dyntick(void)
1357{
1358 int64_t delta;
1359 int64_t rtdelta;
1360
1361 if (use_icount)
1362 delta = INT32_MAX;
1363 else
1364 delta = (qemu_next_deadline() + 999) / 1000;
1365
1366 if (active_timers[QEMU_TIMER_REALTIME]) {
1367 rtdelta = (active_timers[QEMU_TIMER_REALTIME]->expire_time -
1368 qemu_get_clock(rt_clock))*1000;
1369 if (rtdelta < delta)
1370 delta = rtdelta;
1371 }
1372
1373 if (delta < MIN_TIMER_REARM_US)
1374 delta = MIN_TIMER_REARM_US;
1375
1376 return delta;
thsefe75412007-08-24 01:36:32 +00001377}
blueswir18632fb92008-09-14 13:59:34 +00001378#endif
thsefe75412007-08-24 01:36:32 +00001379
bellardfd872592004-05-12 19:11:15 +00001380#ifndef _WIN32
1381
bellard829309c2004-05-20 13:20:12 +00001382#if defined(__linux__)
1383
bellardfd872592004-05-12 19:11:15 +00001384#define RTC_FREQ 1024
1385
thsc8994012007-08-19 21:56:03 +00001386static void enable_sigio_timer(int fd)
bellardfd872592004-05-12 19:11:15 +00001387{
thsc8994012007-08-19 21:56:03 +00001388 struct sigaction act;
1389
1390 /* timer signal */
1391 sigfillset(&act.sa_mask);
1392 act.sa_flags = 0;
thsc8994012007-08-19 21:56:03 +00001393 act.sa_handler = host_alarm_handler;
1394
1395 sigaction(SIGIO, &act, NULL);
1396 fcntl(fd, F_SETFL, O_ASYNC);
1397 fcntl(fd, F_SETOWN, getpid());
1398}
1399
thsc40ec5a2007-08-19 22:09:40 +00001400static int hpet_start_timer(struct qemu_alarm_timer *t)
1401{
1402 struct hpet_info info;
1403 int r, fd;
1404
1405 fd = open("/dev/hpet", O_RDONLY);
1406 if (fd < 0)
1407 return -1;
1408
1409 /* Set frequency */
1410 r = ioctl(fd, HPET_IRQFREQ, RTC_FREQ);
1411 if (r < 0) {
1412 fprintf(stderr, "Could not configure '/dev/hpet' to have a 1024Hz timer. This is not a fatal\n"
1413 "error, but for better emulation accuracy type:\n"
1414 "'echo 1024 > /proc/sys/dev/hpet/max-user-freq' as root.\n");
1415 goto fail;
1416 }
1417
1418 /* Check capabilities */
1419 r = ioctl(fd, HPET_INFO, &info);
1420 if (r < 0)
1421 goto fail;
1422
1423 /* Enable periodic mode */
1424 r = ioctl(fd, HPET_EPI, 0);
1425 if (info.hi_flags && (r < 0))
1426 goto fail;
1427
1428 /* Enable interrupt */
1429 r = ioctl(fd, HPET_IE_ON, 0);
1430 if (r < 0)
1431 goto fail;
1432
1433 enable_sigio_timer(fd);
pbrookfcdc2122007-08-23 20:22:22 +00001434 t->priv = (void *)(long)fd;
thsc40ec5a2007-08-19 22:09:40 +00001435
1436 return 0;
1437fail:
1438 close(fd);
1439 return -1;
1440}
1441
1442static void hpet_stop_timer(struct qemu_alarm_timer *t)
1443{
pbrookfcdc2122007-08-23 20:22:22 +00001444 int fd = (long)t->priv;
thsc40ec5a2007-08-19 22:09:40 +00001445
1446 close(fd);
1447}
1448
thsc8994012007-08-19 21:56:03 +00001449static int rtc_start_timer(struct qemu_alarm_timer *t)
1450{
1451 int rtc_fd;
balrogb5a23ad2008-02-03 03:45:47 +00001452 unsigned long current_rtc_freq = 0;
thsc8994012007-08-19 21:56:03 +00001453
balrogaeb30be2007-07-02 15:03:13 +00001454 TFR(rtc_fd = open("/dev/rtc", O_RDONLY));
bellardfd872592004-05-12 19:11:15 +00001455 if (rtc_fd < 0)
1456 return -1;
balrogb5a23ad2008-02-03 03:45:47 +00001457 ioctl(rtc_fd, RTC_IRQP_READ, &current_rtc_freq);
1458 if (current_rtc_freq != RTC_FREQ &&
1459 ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
bellardfd872592004-05-12 19:11:15 +00001460 fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
1461 "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
1462 "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
1463 goto fail;
1464 }
1465 if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
1466 fail:
1467 close(rtc_fd);
1468 return -1;
1469 }
thsc8994012007-08-19 21:56:03 +00001470
1471 enable_sigio_timer(rtc_fd);
1472
pbrookfcdc2122007-08-23 20:22:22 +00001473 t->priv = (void *)(long)rtc_fd;
thsc8994012007-08-19 21:56:03 +00001474
bellardfd872592004-05-12 19:11:15 +00001475 return 0;
1476}
1477
thsc8994012007-08-19 21:56:03 +00001478static void rtc_stop_timer(struct qemu_alarm_timer *t)
bellard829309c2004-05-20 13:20:12 +00001479{
pbrookfcdc2122007-08-23 20:22:22 +00001480 int rtc_fd = (long)t->priv;
thsc8994012007-08-19 21:56:03 +00001481
1482 close(rtc_fd);
bellard829309c2004-05-20 13:20:12 +00001483}
1484
thsefe75412007-08-24 01:36:32 +00001485static int dynticks_start_timer(struct qemu_alarm_timer *t)
1486{
1487 struct sigevent ev;
1488 timer_t host_timer;
1489 struct sigaction act;
1490
1491 sigfillset(&act.sa_mask);
1492 act.sa_flags = 0;
thsefe75412007-08-24 01:36:32 +00001493 act.sa_handler = host_alarm_handler;
1494
1495 sigaction(SIGALRM, &act, NULL);
1496
1497 ev.sigev_value.sival_int = 0;
1498 ev.sigev_notify = SIGEV_SIGNAL;
1499 ev.sigev_signo = SIGALRM;
1500
1501 if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
1502 perror("timer_create");
1503
1504 /* disable dynticks */
1505 fprintf(stderr, "Dynamic Ticks disabled\n");
1506
1507 return -1;
1508 }
1509
1510 t->priv = (void *)host_timer;
1511
1512 return 0;
1513}
1514
1515static void dynticks_stop_timer(struct qemu_alarm_timer *t)
1516{
1517 timer_t host_timer = (timer_t)t->priv;
1518
1519 timer_delete(host_timer);
1520}
1521
1522static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
1523{
1524 timer_t host_timer = (timer_t)t->priv;
1525 struct itimerspec timeout;
1526 int64_t nearest_delta_us = INT64_MAX;
1527 int64_t current_us;
1528
1529 if (!active_timers[QEMU_TIMER_REALTIME] &&
1530 !active_timers[QEMU_TIMER_VIRTUAL])
balrogd5d08332008-01-05 19:41:47 +00001531 return;
thsefe75412007-08-24 01:36:32 +00001532
pbrook2e70f6e2008-06-29 01:03:05 +00001533 nearest_delta_us = qemu_next_deadline_dyntick();
thsefe75412007-08-24 01:36:32 +00001534
1535 /* check whether a timer is already running */
1536 if (timer_gettime(host_timer, &timeout)) {
1537 perror("gettime");
1538 fprintf(stderr, "Internal timer error: aborting\n");
1539 exit(1);
1540 }
1541 current_us = timeout.it_value.tv_sec * 1000000 + timeout.it_value.tv_nsec/1000;
1542 if (current_us && current_us <= nearest_delta_us)
1543 return;
1544
1545 timeout.it_interval.tv_sec = 0;
1546 timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
1547 timeout.it_value.tv_sec = nearest_delta_us / 1000000;
1548 timeout.it_value.tv_nsec = (nearest_delta_us % 1000000) * 1000;
1549 if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
1550 perror("settime");
1551 fprintf(stderr, "Internal timer error: aborting\n");
1552 exit(1);
1553 }
1554}
1555
ths70744b32007-08-26 17:31:30 +00001556#endif /* defined(__linux__) */
ths231c6582007-08-26 17:29:15 +00001557
thsc8994012007-08-19 21:56:03 +00001558static int unix_start_timer(struct qemu_alarm_timer *t)
1559{
1560 struct sigaction act;
1561 struct itimerval itv;
1562 int err;
1563
1564 /* timer signal */
1565 sigfillset(&act.sa_mask);
1566 act.sa_flags = 0;
thsc8994012007-08-19 21:56:03 +00001567 act.sa_handler = host_alarm_handler;
1568
1569 sigaction(SIGALRM, &act, NULL);
1570
1571 itv.it_interval.tv_sec = 0;
1572 /* for i386 kernel 2.6 to get 1 ms */
1573 itv.it_interval.tv_usec = 999;
1574 itv.it_value.tv_sec = 0;
1575 itv.it_value.tv_usec = 10 * 1000;
1576
1577 err = setitimer(ITIMER_REAL, &itv, NULL);
1578 if (err)
1579 return -1;
1580
1581 return 0;
1582}
1583
1584static void unix_stop_timer(struct qemu_alarm_timer *t)
1585{
1586 struct itimerval itv;
1587
1588 memset(&itv, 0, sizeof(itv));
1589 setitimer(ITIMER_REAL, &itv, NULL);
1590}
1591
bellard829309c2004-05-20 13:20:12 +00001592#endif /* !defined(_WIN32) */
bellardfd872592004-05-12 19:11:15 +00001593
thsc8994012007-08-19 21:56:03 +00001594#ifdef _WIN32
1595
1596static int win32_start_timer(struct qemu_alarm_timer *t)
1597{
1598 TIMECAPS tc;
1599 struct qemu_alarm_win32 *data = t->priv;
thsefe75412007-08-24 01:36:32 +00001600 UINT flags;
thsc8994012007-08-19 21:56:03 +00001601
1602 data->host_alarm = CreateEvent(NULL, FALSE, FALSE, NULL);
1603 if (!data->host_alarm) {
1604 perror("Failed CreateEvent");
thsc396a7f2007-08-20 15:42:22 +00001605 return -1;
thsc8994012007-08-19 21:56:03 +00001606 }
1607
1608 memset(&tc, 0, sizeof(tc));
1609 timeGetDevCaps(&tc, sizeof(tc));
1610
1611 if (data->period < tc.wPeriodMin)
1612 data->period = tc.wPeriodMin;
1613
1614 timeBeginPeriod(data->period);
1615
thsefe75412007-08-24 01:36:32 +00001616 flags = TIME_CALLBACK_FUNCTION;
1617 if (alarm_has_dynticks(t))
1618 flags |= TIME_ONESHOT;
1619 else
1620 flags |= TIME_PERIODIC;
1621
thsc8994012007-08-19 21:56:03 +00001622 data->timerId = timeSetEvent(1, // interval (ms)
1623 data->period, // resolution
1624 host_alarm_handler, // function
1625 (DWORD)t, // parameter
thsefe75412007-08-24 01:36:32 +00001626 flags);
thsc8994012007-08-19 21:56:03 +00001627
1628 if (!data->timerId) {
1629 perror("Failed to initialize win32 alarm timer");
1630
1631 timeEndPeriod(data->period);
1632 CloseHandle(data->host_alarm);
1633 return -1;
1634 }
1635
1636 qemu_add_wait_object(data->host_alarm, NULL, NULL);
1637
1638 return 0;
1639}
1640
1641static void win32_stop_timer(struct qemu_alarm_timer *t)
1642{
1643 struct qemu_alarm_win32 *data = t->priv;
1644
1645 timeKillEvent(data->timerId);
1646 timeEndPeriod(data->period);
1647
1648 CloseHandle(data->host_alarm);
1649}
1650
thsefe75412007-08-24 01:36:32 +00001651static void win32_rearm_timer(struct qemu_alarm_timer *t)
1652{
1653 struct qemu_alarm_win32 *data = t->priv;
1654 uint64_t nearest_delta_us;
1655
1656 if (!active_timers[QEMU_TIMER_REALTIME] &&
1657 !active_timers[QEMU_TIMER_VIRTUAL])
balrogd5d08332008-01-05 19:41:47 +00001658 return;
thsefe75412007-08-24 01:36:32 +00001659
pbrook2e70f6e2008-06-29 01:03:05 +00001660 nearest_delta_us = qemu_next_deadline_dyntick();
thsefe75412007-08-24 01:36:32 +00001661 nearest_delta_us /= 1000;
1662
1663 timeKillEvent(data->timerId);
1664
1665 data->timerId = timeSetEvent(1,
1666 data->period,
1667 host_alarm_handler,
1668 (DWORD)t,
1669 TIME_ONESHOT | TIME_PERIODIC);
1670
1671 if (!data->timerId) {
1672 perror("Failed to re-arm win32 alarm timer");
1673
1674 timeEndPeriod(data->period);
1675 CloseHandle(data->host_alarm);
1676 exit(1);
1677 }
1678}
1679
thsc8994012007-08-19 21:56:03 +00001680#endif /* _WIN32 */
1681
bellard1dce7c32006-07-13 23:20:22 +00001682static void init_timer_alarm(void)
bellard8a7ddc32004-03-31 19:00:16 +00001683{
blueswir1223f0d72008-09-30 18:12:18 +00001684 struct qemu_alarm_timer *t = NULL;
thsc8994012007-08-19 21:56:03 +00001685 int i, err = -1;
bellard06d9f2f2006-05-01 13:23:04 +00001686
thsc8994012007-08-19 21:56:03 +00001687 for (i = 0; alarm_timers[i].name; i++) {
1688 t = &alarm_timers[i];
1689
thsc8994012007-08-19 21:56:03 +00001690 err = t->start(t);
1691 if (!err)
1692 break;
bellard67b915a2004-03-31 23:37:16 +00001693 }
bellardfd872592004-05-12 19:11:15 +00001694
thsc8994012007-08-19 21:56:03 +00001695 if (err) {
1696 fprintf(stderr, "Unable to find any suitable alarm timer.\n");
1697 fprintf(stderr, "Terminating\n");
1698 exit(1);
bellard67b915a2004-03-31 23:37:16 +00001699 }
thsc8994012007-08-19 21:56:03 +00001700
1701 alarm_timer = t;
bellard8a7ddc32004-03-31 19:00:16 +00001702}
1703
pbrook9596ebb2007-11-18 01:44:38 +00001704static void quit_timers(void)
bellard40c3bac2004-04-04 12:56:28 +00001705{
thsc8994012007-08-19 21:56:03 +00001706 alarm_timer->stop(alarm_timer);
1707 alarm_timer = NULL;
bellard40c3bac2004-04-04 12:56:28 +00001708}
1709
bellardc4b1fcc2004-03-14 21:44:30 +00001710/***********************************************************/
balrogf6503052008-02-17 11:42:19 +00001711/* host time/date access */
1712void qemu_get_timedate(struct tm *tm, int offset)
1713{
1714 time_t ti;
1715 struct tm *ret;
1716
1717 time(&ti);
1718 ti += offset;
1719 if (rtc_date_offset == -1) {
1720 if (rtc_utc)
1721 ret = gmtime(&ti);
1722 else
1723 ret = localtime(&ti);
1724 } else {
1725 ti -= rtc_date_offset;
1726 ret = gmtime(&ti);
1727 }
1728
1729 memcpy(tm, ret, sizeof(struct tm));
1730}
1731
1732int qemu_timedate_diff(struct tm *tm)
1733{
1734 time_t seconds;
1735
1736 if (rtc_date_offset == -1)
1737 if (rtc_utc)
1738 seconds = mktimegm(tm);
1739 else
1740 seconds = mktime(tm);
1741 else
1742 seconds = mktimegm(tm) + rtc_date_offset;
1743
1744 return seconds - time(NULL);
1745}
1746
1747/***********************************************************/
bellard82c643f2004-07-14 17:28:13 +00001748/* character device */
bellardc45886d2004-01-05 00:02:06 +00001749
pbrooke5b0bc42007-01-27 23:46:43 +00001750static void qemu_chr_event(CharDriverState *s, int event)
1751{
1752 if (!s->chr_event)
1753 return;
1754 s->chr_event(s->handler_opaque, event);
1755}
1756
ths86e94de2007-01-05 22:01:59 +00001757static void qemu_chr_reset_bh(void *opaque)
1758{
1759 CharDriverState *s = opaque;
pbrooke5b0bc42007-01-27 23:46:43 +00001760 qemu_chr_event(s, CHR_EVENT_RESET);
ths86e94de2007-01-05 22:01:59 +00001761 qemu_bh_delete(s->bh);
1762 s->bh = NULL;
1763}
1764
1765void qemu_chr_reset(CharDriverState *s)
1766{
1767 if (s->bh == NULL) {
1768 s->bh = qemu_bh_new(qemu_chr_reset_bh, s);
1769 qemu_bh_schedule(s->bh);
1770 }
1771}
1772
bellard82c643f2004-07-14 17:28:13 +00001773int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len)
bellard67b915a2004-03-31 23:37:16 +00001774{
bellard82c643f2004-07-14 17:28:13 +00001775 return s->chr_write(s, buf, len);
bellard67b915a2004-03-31 23:37:16 +00001776}
1777
bellarde57a8c02005-11-10 23:58:52 +00001778int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg)
bellardf8d179e2005-11-08 22:30:36 +00001779{
bellarde57a8c02005-11-10 23:58:52 +00001780 if (!s->chr_ioctl)
1781 return -ENOTSUP;
1782 return s->chr_ioctl(s, cmd, arg);
bellardf8d179e2005-11-08 22:30:36 +00001783}
1784
pbrooke5b0bc42007-01-27 23:46:43 +00001785int qemu_chr_can_read(CharDriverState *s)
1786{
1787 if (!s->chr_can_read)
1788 return 0;
1789 return s->chr_can_read(s->handler_opaque);
1790}
1791
1792void qemu_chr_read(CharDriverState *s, uint8_t *buf, int len)
1793{
1794 s->chr_read(s->handler_opaque, buf, len);
1795}
1796
balrogbd9bdce2007-11-25 00:55:06 +00001797void qemu_chr_accept_input(CharDriverState *s)
1798{
1799 if (s->chr_accept_input)
1800 s->chr_accept_input(s);
1801}
pbrooke5b0bc42007-01-27 23:46:43 +00001802
bellard82c643f2004-07-14 17:28:13 +00001803void qemu_chr_printf(CharDriverState *s, const char *fmt, ...)
bellard0824d6f2003-06-24 13:42:40 +00001804{
bellard82c643f2004-07-14 17:28:13 +00001805 char buf[4096];
1806 va_list ap;
1807 va_start(ap, fmt);
1808 vsnprintf(buf, sizeof(buf), fmt, ap);
thsffe8ab82007-12-16 03:16:05 +00001809 qemu_chr_write(s, (uint8_t *)buf, strlen(buf));
bellard82c643f2004-07-14 17:28:13 +00001810 va_end(ap);
1811}
1812
bellard5905b2e2004-08-01 21:53:26 +00001813void qemu_chr_send_event(CharDriverState *s, int event)
1814{
1815 if (s->chr_send_event)
1816 s->chr_send_event(s, event);
1817}
1818
ths5fafdf22007-09-16 21:08:06 +00001819void qemu_chr_add_handlers(CharDriverState *s,
1820 IOCanRWHandler *fd_can_read,
pbrooke5b0bc42007-01-27 23:46:43 +00001821 IOReadHandler *fd_read,
1822 IOEventHandler *fd_event,
1823 void *opaque)
bellard82c643f2004-07-14 17:28:13 +00001824{
pbrooke5b0bc42007-01-27 23:46:43 +00001825 s->chr_can_read = fd_can_read;
1826 s->chr_read = fd_read;
1827 s->chr_event = fd_event;
1828 s->handler_opaque = opaque;
1829 if (s->chr_update_read_handler)
1830 s->chr_update_read_handler(s);
bellard82c643f2004-07-14 17:28:13 +00001831}
ths3b46e622007-09-17 08:09:54 +00001832
bellard82c643f2004-07-14 17:28:13 +00001833static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1834{
1835 return len;
1836}
1837
ths52f61fd2006-12-22 21:20:52 +00001838static CharDriverState *qemu_chr_open_null(void)
bellard82c643f2004-07-14 17:28:13 +00001839{
1840 CharDriverState *chr;
1841
1842 chr = qemu_mallocz(sizeof(CharDriverState));
1843 if (!chr)
1844 return NULL;
1845 chr->chr_write = null_chr_write;
bellard82c643f2004-07-14 17:28:13 +00001846 return chr;
1847}
1848
ths20d8a3e2007-02-18 17:04:49 +00001849/* MUX driver for serial I/O splitting */
1850static int term_timestamps;
1851static int64_t term_timestamps_start;
ths9c1de612007-02-21 17:25:30 +00001852#define MAX_MUX 4
balrogbd9bdce2007-11-25 00:55:06 +00001853#define MUX_BUFFER_SIZE 32 /* Must be a power of 2. */
1854#define MUX_BUFFER_MASK (MUX_BUFFER_SIZE - 1)
ths20d8a3e2007-02-18 17:04:49 +00001855typedef struct {
1856 IOCanRWHandler *chr_can_read[MAX_MUX];
1857 IOReadHandler *chr_read[MAX_MUX];
1858 IOEventHandler *chr_event[MAX_MUX];
1859 void *ext_opaque[MAX_MUX];
1860 CharDriverState *drv;
balrogbd9bdce2007-11-25 00:55:06 +00001861 unsigned char buffer[MUX_BUFFER_SIZE];
1862 int prod;
1863 int cons;
ths20d8a3e2007-02-18 17:04:49 +00001864 int mux_cnt;
1865 int term_got_escape;
1866 int max_size;
1867} MuxDriver;
1868
1869
1870static int mux_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1871{
1872 MuxDriver *d = chr->opaque;
1873 int ret;
1874 if (!term_timestamps) {
1875 ret = d->drv->chr_write(d->drv, buf, len);
1876 } else {
1877 int i;
1878
1879 ret = 0;
1880 for(i = 0; i < len; i++) {
1881 ret += d->drv->chr_write(d->drv, buf+i, 1);
1882 if (buf[i] == '\n') {
1883 char buf1[64];
1884 int64_t ti;
1885 int secs;
1886
1887 ti = get_clock();
1888 if (term_timestamps_start == -1)
1889 term_timestamps_start = ti;
1890 ti -= term_timestamps_start;
1891 secs = ti / 1000000000;
1892 snprintf(buf1, sizeof(buf1),
1893 "[%02d:%02d:%02d.%03d] ",
1894 secs / 3600,
1895 (secs / 60) % 60,
1896 secs % 60,
1897 (int)((ti / 1000000) % 1000));
thsffe8ab82007-12-16 03:16:05 +00001898 d->drv->chr_write(d->drv, (uint8_t *)buf1, strlen(buf1));
ths20d8a3e2007-02-18 17:04:49 +00001899 }
1900 }
1901 }
1902 return ret;
1903}
1904
blueswir17ccfb2e2008-09-14 06:45:34 +00001905static const char * const mux_help[] = {
ths20d8a3e2007-02-18 17:04:49 +00001906 "% h print this help\n\r",
1907 "% x exit emulator\n\r",
1908 "% s save disk data back to file (if -snapshot)\n\r",
1909 "% t toggle console timestamps\n\r"
1910 "% b send break (magic sysrq)\n\r",
1911 "% c switch between console and monitor\n\r",
1912 "% % sends %\n\r",
1913 NULL
1914};
1915
1916static int term_escape_char = 0x01; /* ctrl-a is used for escape */
1917static void mux_print_help(CharDriverState *chr)
1918{
1919 int i, j;
1920 char ebuf[15] = "Escape-Char";
1921 char cbuf[50] = "\n\r";
1922
1923 if (term_escape_char > 0 && term_escape_char < 26) {
blueswir1363a37d2008-08-21 17:58:08 +00001924 snprintf(cbuf, sizeof(cbuf), "\n\r");
1925 snprintf(ebuf, sizeof(ebuf), "C-%c", term_escape_char - 1 + 'a');
ths20d8a3e2007-02-18 17:04:49 +00001926 } else {
blueswir1363a37d2008-08-21 17:58:08 +00001927 snprintf(cbuf, sizeof(cbuf),
1928 "\n\rEscape-Char set to Ascii: 0x%02x\n\r\n\r",
1929 term_escape_char);
ths20d8a3e2007-02-18 17:04:49 +00001930 }
thsffe8ab82007-12-16 03:16:05 +00001931 chr->chr_write(chr, (uint8_t *)cbuf, strlen(cbuf));
ths20d8a3e2007-02-18 17:04:49 +00001932 for (i = 0; mux_help[i] != NULL; i++) {
1933 for (j=0; mux_help[i][j] != '\0'; j++) {
1934 if (mux_help[i][j] == '%')
thsffe8ab82007-12-16 03:16:05 +00001935 chr->chr_write(chr, (uint8_t *)ebuf, strlen(ebuf));
ths20d8a3e2007-02-18 17:04:49 +00001936 else
thsffe8ab82007-12-16 03:16:05 +00001937 chr->chr_write(chr, (uint8_t *)&mux_help[i][j], 1);
ths20d8a3e2007-02-18 17:04:49 +00001938 }
1939 }
1940}
1941
1942static int mux_proc_byte(CharDriverState *chr, MuxDriver *d, int ch)
1943{
1944 if (d->term_got_escape) {
1945 d->term_got_escape = 0;
1946 if (ch == term_escape_char)
1947 goto send_char;
1948 switch(ch) {
1949 case '?':
1950 case 'h':
1951 mux_print_help(chr);
1952 break;
1953 case 'x':
1954 {
blueswir17ccfb2e2008-09-14 06:45:34 +00001955 const char *term = "QEMU: Terminated\n\r";
thsffe8ab82007-12-16 03:16:05 +00001956 chr->chr_write(chr,(uint8_t *)term,strlen(term));
ths20d8a3e2007-02-18 17:04:49 +00001957 exit(0);
1958 break;
1959 }
1960 case 's':
1961 {
1962 int i;
thse4bcb142007-12-02 04:51:10 +00001963 for (i = 0; i < nb_drives; i++) {
1964 bdrv_commit(drives_table[i].bdrv);
ths20d8a3e2007-02-18 17:04:49 +00001965 }
1966 }
1967 break;
1968 case 'b':
balrog36ddb832007-05-18 17:46:59 +00001969 qemu_chr_event(chr, CHR_EVENT_BREAK);
ths20d8a3e2007-02-18 17:04:49 +00001970 break;
1971 case 'c':
1972 /* Switch to the next registered device */
1973 chr->focus++;
1974 if (chr->focus >= d->mux_cnt)
1975 chr->focus = 0;
1976 break;
1977 case 't':
1978 term_timestamps = !term_timestamps;
1979 term_timestamps_start = -1;
1980 break;
1981 }
1982 } else if (ch == term_escape_char) {
1983 d->term_got_escape = 1;
1984 } else {
1985 send_char:
1986 return 1;
1987 }
1988 return 0;
1989}
1990
balrogbd9bdce2007-11-25 00:55:06 +00001991static void mux_chr_accept_input(CharDriverState *chr)
1992{
1993 int m = chr->focus;
1994 MuxDriver *d = chr->opaque;
1995
1996 while (d->prod != d->cons &&
1997 d->chr_can_read[m] &&
1998 d->chr_can_read[m](d->ext_opaque[m])) {
1999 d->chr_read[m](d->ext_opaque[m],
2000 &d->buffer[d->cons++ & MUX_BUFFER_MASK], 1);
2001 }
2002}
2003
ths20d8a3e2007-02-18 17:04:49 +00002004static int mux_chr_can_read(void *opaque)
2005{
2006 CharDriverState *chr = opaque;
2007 MuxDriver *d = chr->opaque;
balrogbd9bdce2007-11-25 00:55:06 +00002008
2009 if ((d->prod - d->cons) < MUX_BUFFER_SIZE)
2010 return 1;
ths20d8a3e2007-02-18 17:04:49 +00002011 if (d->chr_can_read[chr->focus])
balrogbd9bdce2007-11-25 00:55:06 +00002012 return d->chr_can_read[chr->focus](d->ext_opaque[chr->focus]);
ths20d8a3e2007-02-18 17:04:49 +00002013 return 0;
2014}
2015
2016static void mux_chr_read(void *opaque, const uint8_t *buf, int size)
2017{
2018 CharDriverState *chr = opaque;
2019 MuxDriver *d = chr->opaque;
balrogbd9bdce2007-11-25 00:55:06 +00002020 int m = chr->focus;
ths20d8a3e2007-02-18 17:04:49 +00002021 int i;
balrogbd9bdce2007-11-25 00:55:06 +00002022
2023 mux_chr_accept_input (opaque);
2024
ths20d8a3e2007-02-18 17:04:49 +00002025 for(i = 0; i < size; i++)
balrogbd9bdce2007-11-25 00:55:06 +00002026 if (mux_proc_byte(chr, d, buf[i])) {
2027 if (d->prod == d->cons &&
2028 d->chr_can_read[m] &&
2029 d->chr_can_read[m](d->ext_opaque[m]))
2030 d->chr_read[m](d->ext_opaque[m], &buf[i], 1);
2031 else
2032 d->buffer[d->prod++ & MUX_BUFFER_MASK] = buf[i];
2033 }
ths20d8a3e2007-02-18 17:04:49 +00002034}
2035
2036static void mux_chr_event(void *opaque, int event)
2037{
2038 CharDriverState *chr = opaque;
2039 MuxDriver *d = chr->opaque;
2040 int i;
2041
2042 /* Send the event to all registered listeners */
2043 for (i = 0; i < d->mux_cnt; i++)
2044 if (d->chr_event[i])
2045 d->chr_event[i](d->ext_opaque[i], event);
2046}
2047
2048static void mux_chr_update_read_handler(CharDriverState *chr)
2049{
2050 MuxDriver *d = chr->opaque;
2051
2052 if (d->mux_cnt >= MAX_MUX) {
2053 fprintf(stderr, "Cannot add I/O handlers, MUX array is full\n");
2054 return;
2055 }
2056 d->ext_opaque[d->mux_cnt] = chr->handler_opaque;
2057 d->chr_can_read[d->mux_cnt] = chr->chr_can_read;
2058 d->chr_read[d->mux_cnt] = chr->chr_read;
2059 d->chr_event[d->mux_cnt] = chr->chr_event;
2060 /* Fix up the real driver with mux routines */
2061 if (d->mux_cnt == 0) {
2062 qemu_chr_add_handlers(d->drv, mux_chr_can_read, mux_chr_read,
2063 mux_chr_event, chr);
2064 }
2065 chr->focus = d->mux_cnt;
2066 d->mux_cnt++;
2067}
2068
pbrook9596ebb2007-11-18 01:44:38 +00002069static CharDriverState *qemu_chr_open_mux(CharDriverState *drv)
ths20d8a3e2007-02-18 17:04:49 +00002070{
2071 CharDriverState *chr;
2072 MuxDriver *d;
2073
2074 chr = qemu_mallocz(sizeof(CharDriverState));
2075 if (!chr)
2076 return NULL;
2077 d = qemu_mallocz(sizeof(MuxDriver));
2078 if (!d) {
2079 free(chr);
2080 return NULL;
2081 }
2082
2083 chr->opaque = d;
2084 d->drv = drv;
2085 chr->focus = -1;
2086 chr->chr_write = mux_chr_write;
2087 chr->chr_update_read_handler = mux_chr_update_read_handler;
balrogbd9bdce2007-11-25 00:55:06 +00002088 chr->chr_accept_input = mux_chr_accept_input;
ths20d8a3e2007-02-18 17:04:49 +00002089 return chr;
2090}
2091
2092
bellardfd1dff42006-02-01 21:29:26 +00002093#ifdef _WIN32
bellard82c643f2004-07-14 17:28:13 +00002094
bellardfd1dff42006-02-01 21:29:26 +00002095static void socket_cleanup(void)
2096{
2097 WSACleanup();
2098}
bellard82c643f2004-07-14 17:28:13 +00002099
bellardfd1dff42006-02-01 21:29:26 +00002100static int socket_init(void)
2101{
2102 WSADATA Data;
2103 int ret, err;
2104
2105 ret = WSAStartup(MAKEWORD(2,2), &Data);
2106 if (ret != 0) {
2107 err = WSAGetLastError();
2108 fprintf(stderr, "WSAStartup: %d\n", err);
2109 return -1;
2110 }
2111 atexit(socket_cleanup);
2112 return 0;
2113}
2114
2115static int send_all(int fd, const uint8_t *buf, int len1)
2116{
2117 int ret, len;
ths3b46e622007-09-17 08:09:54 +00002118
bellardfd1dff42006-02-01 21:29:26 +00002119 len = len1;
2120 while (len > 0) {
2121 ret = send(fd, buf, len, 0);
2122 if (ret < 0) {
2123 int errno;
2124 errno = WSAGetLastError();
2125 if (errno != WSAEWOULDBLOCK) {
2126 return -1;
2127 }
2128 } else if (ret == 0) {
2129 break;
2130 } else {
2131 buf += ret;
2132 len -= ret;
2133 }
2134 }
2135 return len1 - len;
2136}
2137
bellardfd1dff42006-02-01 21:29:26 +00002138#else
2139
bellard1d969052004-09-18 19:34:39 +00002140static int unix_write(int fd, const uint8_t *buf, int len1)
2141{
2142 int ret, len;
2143
2144 len = len1;
2145 while (len > 0) {
2146 ret = write(fd, buf, len);
2147 if (ret < 0) {
2148 if (errno != EINTR && errno != EAGAIN)
2149 return -1;
2150 } else if (ret == 0) {
2151 break;
2152 } else {
2153 buf += ret;
2154 len -= ret;
2155 }
2156 }
2157 return len1 - len;
2158}
2159
bellardfd1dff42006-02-01 21:29:26 +00002160static inline int send_all(int fd, const uint8_t *buf, int len1)
2161{
2162 return unix_write(fd, buf, len1);
2163}
bellardfd1dff42006-02-01 21:29:26 +00002164#endif /* !_WIN32 */
2165
2166#ifndef _WIN32
2167
2168typedef struct {
2169 int fd_in, fd_out;
bellardfd1dff42006-02-01 21:29:26 +00002170 int max_size;
2171} FDCharDriver;
2172
ths20d8a3e2007-02-18 17:04:49 +00002173#define STDIO_MAX_CLIENTS 1
2174static int stdio_nb_clients = 0;
bellardfd1dff42006-02-01 21:29:26 +00002175
bellard82c643f2004-07-14 17:28:13 +00002176static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
2177{
2178 FDCharDriver *s = chr->opaque;
bellard1d969052004-09-18 19:34:39 +00002179 return unix_write(s->fd_out, buf, len);
bellard82c643f2004-07-14 17:28:13 +00002180}
2181
bellard7c9d8e02005-11-15 22:16:05 +00002182static int fd_chr_read_poll(void *opaque)
2183{
2184 CharDriverState *chr = opaque;
2185 FDCharDriver *s = chr->opaque;
2186
pbrooke5b0bc42007-01-27 23:46:43 +00002187 s->max_size = qemu_chr_can_read(chr);
bellard7c9d8e02005-11-15 22:16:05 +00002188 return s->max_size;
2189}
2190
2191static void fd_chr_read(void *opaque)
2192{
2193 CharDriverState *chr = opaque;
2194 FDCharDriver *s = chr->opaque;
2195 int size, len;
2196 uint8_t buf[1024];
ths3b46e622007-09-17 08:09:54 +00002197
bellard7c9d8e02005-11-15 22:16:05 +00002198 len = sizeof(buf);
2199 if (len > s->max_size)
2200 len = s->max_size;
2201 if (len == 0)
2202 return;
2203 size = read(s->fd_in, buf, len);
pbrook188157f2006-11-01 01:44:16 +00002204 if (size == 0) {
2205 /* FD has been closed. Remove it from the active list. */
2206 qemu_set_fd_handler2(s->fd_in, NULL, NULL, NULL, NULL);
2207 return;
2208 }
bellard7c9d8e02005-11-15 22:16:05 +00002209 if (size > 0) {
pbrooke5b0bc42007-01-27 23:46:43 +00002210 qemu_chr_read(chr, buf, size);
bellard7c9d8e02005-11-15 22:16:05 +00002211 }
2212}
2213
pbrooke5b0bc42007-01-27 23:46:43 +00002214static void fd_chr_update_read_handler(CharDriverState *chr)
bellard82c643f2004-07-14 17:28:13 +00002215{
2216 FDCharDriver *s = chr->opaque;
2217
bellardf8d179e2005-11-08 22:30:36 +00002218 if (s->fd_in >= 0) {
2219 if (nographic && s->fd_in == 0) {
bellardf8d179e2005-11-08 22:30:36 +00002220 } else {
ths5fafdf22007-09-16 21:08:06 +00002221 qemu_set_fd_handler2(s->fd_in, fd_chr_read_poll,
bellard7c9d8e02005-11-15 22:16:05 +00002222 fd_chr_read, NULL, chr);
bellardf8d179e2005-11-08 22:30:36 +00002223 }
bellard0824d6f2003-06-24 13:42:40 +00002224 }
2225}
2226
balroga11d0702008-01-19 13:00:43 +00002227static void fd_chr_close(struct CharDriverState *chr)
2228{
2229 FDCharDriver *s = chr->opaque;
2230
2231 if (s->fd_in >= 0) {
2232 if (nographic && s->fd_in == 0) {
2233 } else {
2234 qemu_set_fd_handler2(s->fd_in, NULL, NULL, NULL, NULL);
2235 }
2236 }
2237
2238 qemu_free(s);
2239}
2240
bellard82c643f2004-07-14 17:28:13 +00002241/* open a character device to a unix fd */
ths52f61fd2006-12-22 21:20:52 +00002242static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
bellard82c643f2004-07-14 17:28:13 +00002243{
2244 CharDriverState *chr;
2245 FDCharDriver *s;
2246
2247 chr = qemu_mallocz(sizeof(CharDriverState));
2248 if (!chr)
2249 return NULL;
2250 s = qemu_mallocz(sizeof(FDCharDriver));
2251 if (!s) {
2252 free(chr);
2253 return NULL;
2254 }
2255 s->fd_in = fd_in;
2256 s->fd_out = fd_out;
2257 chr->opaque = s;
2258 chr->chr_write = fd_chr_write;
pbrooke5b0bc42007-01-27 23:46:43 +00002259 chr->chr_update_read_handler = fd_chr_update_read_handler;
balroga11d0702008-01-19 13:00:43 +00002260 chr->chr_close = fd_chr_close;
ths86e94de2007-01-05 22:01:59 +00002261
2262 qemu_chr_reset(chr);
2263
bellard82c643f2004-07-14 17:28:13 +00002264 return chr;
2265}
2266
ths52f61fd2006-12-22 21:20:52 +00002267static CharDriverState *qemu_chr_open_file_out(const char *file_out)
bellardf8d179e2005-11-08 22:30:36 +00002268{
2269 int fd_out;
2270
balrogaeb30be2007-07-02 15:03:13 +00002271 TFR(fd_out = open(file_out, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0666));
bellardf8d179e2005-11-08 22:30:36 +00002272 if (fd_out < 0)
2273 return NULL;
2274 return qemu_chr_open_fd(-1, fd_out);
2275}
2276
ths52f61fd2006-12-22 21:20:52 +00002277static CharDriverState *qemu_chr_open_pipe(const char *filename)
bellardf8d179e2005-11-08 22:30:36 +00002278{
thsc26c1c42006-12-22 19:25:31 +00002279 int fd_in, fd_out;
2280 char filename_in[256], filename_out[256];
bellardf8d179e2005-11-08 22:30:36 +00002281
thsc26c1c42006-12-22 19:25:31 +00002282 snprintf(filename_in, 256, "%s.in", filename);
2283 snprintf(filename_out, 256, "%s.out", filename);
balrogaeb30be2007-07-02 15:03:13 +00002284 TFR(fd_in = open(filename_in, O_RDWR | O_BINARY));
2285 TFR(fd_out = open(filename_out, O_RDWR | O_BINARY));
thsc26c1c42006-12-22 19:25:31 +00002286 if (fd_in < 0 || fd_out < 0) {
2287 if (fd_in >= 0)
2288 close(fd_in);
2289 if (fd_out >= 0)
2290 close(fd_out);
balrogaeb30be2007-07-02 15:03:13 +00002291 TFR(fd_in = fd_out = open(filename, O_RDWR | O_BINARY));
thsc26c1c42006-12-22 19:25:31 +00002292 if (fd_in < 0)
2293 return NULL;
2294 }
2295 return qemu_chr_open_fd(fd_in, fd_out);
bellardf8d179e2005-11-08 22:30:36 +00002296}
2297
2298
bellard82c643f2004-07-14 17:28:13 +00002299/* for STDIO, we handle the case where several clients use it
2300 (nographic mode) */
2301
bellardaa0bc6b2005-09-03 15:28:58 +00002302#define TERM_FIFO_MAX_SIZE 1
2303
bellardaa0bc6b2005-09-03 15:28:58 +00002304static uint8_t term_fifo[TERM_FIFO_MAX_SIZE];
bellard1dce7c32006-07-13 23:20:22 +00002305static int term_fifo_size;
bellard82c643f2004-07-14 17:28:13 +00002306
bellard7c9d8e02005-11-15 22:16:05 +00002307static int stdio_read_poll(void *opaque)
bellard82c643f2004-07-14 17:28:13 +00002308{
ths20d8a3e2007-02-18 17:04:49 +00002309 CharDriverState *chr = opaque;
bellardaa0bc6b2005-09-03 15:28:58 +00002310
ths20d8a3e2007-02-18 17:04:49 +00002311 /* try to flush the queue if needed */
2312 if (term_fifo_size != 0 && qemu_chr_can_read(chr) > 0) {
2313 qemu_chr_read(chr, term_fifo, 1);
2314 term_fifo_size = 0;
bellardaa0bc6b2005-09-03 15:28:58 +00002315 }
ths20d8a3e2007-02-18 17:04:49 +00002316 /* see if we can absorb more chars */
2317 if (term_fifo_size == 0)
2318 return 1;
2319 else
2320 return 0;
bellard82c643f2004-07-14 17:28:13 +00002321}
2322
bellard7c9d8e02005-11-15 22:16:05 +00002323static void stdio_read(void *opaque)
bellard82c643f2004-07-14 17:28:13 +00002324{
bellard7c9d8e02005-11-15 22:16:05 +00002325 int size;
2326 uint8_t buf[1];
ths20d8a3e2007-02-18 17:04:49 +00002327 CharDriverState *chr = opaque;
2328
bellard7c9d8e02005-11-15 22:16:05 +00002329 size = read(0, buf, 1);
pbrook519945d2006-09-10 14:39:54 +00002330 if (size == 0) {
2331 /* stdin has been closed. Remove it from the active list. */
2332 qemu_set_fd_handler2(0, NULL, NULL, NULL, NULL);
2333 return;
2334 }
ths20d8a3e2007-02-18 17:04:49 +00002335 if (size > 0) {
2336 if (qemu_chr_can_read(chr) > 0) {
2337 qemu_chr_read(chr, buf, 1);
2338 } else if (term_fifo_size == 0) {
2339 term_fifo[term_fifo_size++] = buf[0];
bellard1dce7c32006-07-13 23:20:22 +00002340 }
bellard1dce7c32006-07-13 23:20:22 +00002341 }
2342}
2343
bellard8d11df92004-08-24 21:13:40 +00002344/* init terminal so that we can grab keys */
2345static struct termios oldtty;
2346static int old_fd0_flags;
balroga11d0702008-01-19 13:00:43 +00002347static int term_atexit_done;
bellard8d11df92004-08-24 21:13:40 +00002348
2349static void term_exit(void)
2350{
2351 tcsetattr (0, TCSANOW, &oldtty);
2352 fcntl(0, F_SETFL, old_fd0_flags);
2353}
2354
2355static void term_init(void)
2356{
2357 struct termios tty;
2358
2359 tcgetattr (0, &tty);
2360 oldtty = tty;
2361 old_fd0_flags = fcntl(0, F_GETFL);
2362
2363 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
2364 |INLCR|IGNCR|ICRNL|IXON);
2365 tty.c_oflag |= OPOST;
2366 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
2367 /* if graphical mode, we allow Ctrl-C handling */
2368 if (nographic)
2369 tty.c_lflag &= ~ISIG;
2370 tty.c_cflag &= ~(CSIZE|PARENB);
2371 tty.c_cflag |= CS8;
2372 tty.c_cc[VMIN] = 1;
2373 tty.c_cc[VTIME] = 0;
ths3b46e622007-09-17 08:09:54 +00002374
bellard8d11df92004-08-24 21:13:40 +00002375 tcsetattr (0, TCSANOW, &tty);
2376
balroga11d0702008-01-19 13:00:43 +00002377 if (!term_atexit_done++)
2378 atexit(term_exit);
bellard8d11df92004-08-24 21:13:40 +00002379
2380 fcntl(0, F_SETFL, O_NONBLOCK);
2381}
2382
balroga11d0702008-01-19 13:00:43 +00002383static void qemu_chr_close_stdio(struct CharDriverState *chr)
2384{
2385 term_exit();
2386 stdio_nb_clients--;
2387 qemu_set_fd_handler2(0, NULL, NULL, NULL, NULL);
2388 fd_chr_close(chr);
2389}
2390
ths52f61fd2006-12-22 21:20:52 +00002391static CharDriverState *qemu_chr_open_stdio(void)
bellard82c643f2004-07-14 17:28:13 +00002392{
2393 CharDriverState *chr;
2394
ths20d8a3e2007-02-18 17:04:49 +00002395 if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
2396 return NULL;
2397 chr = qemu_chr_open_fd(0, 1);
balroga11d0702008-01-19 13:00:43 +00002398 chr->chr_close = qemu_chr_close_stdio;
ths20d8a3e2007-02-18 17:04:49 +00002399 qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, chr);
2400 stdio_nb_clients++;
2401 term_init();
2402
bellard82c643f2004-07-14 17:28:13 +00002403 return chr;
2404}
2405
aurel3264b7b732008-05-05 10:05:31 +00002406#ifdef __sun__
2407/* Once Solaris has openpty(), this is going to be removed. */
2408int openpty(int *amaster, int *aslave, char *name,
2409 struct termios *termp, struct winsize *winp)
2410{
2411 const char *slave;
2412 int mfd = -1, sfd = -1;
2413
2414 *amaster = *aslave = -1;
2415
2416 mfd = open("/dev/ptmx", O_RDWR | O_NOCTTY);
2417 if (mfd < 0)
2418 goto err;
2419
2420 if (grantpt(mfd) == -1 || unlockpt(mfd) == -1)
2421 goto err;
2422
2423 if ((slave = ptsname(mfd)) == NULL)
2424 goto err;
2425
2426 if ((sfd = open(slave, O_RDONLY | O_NOCTTY)) == -1)
2427 goto err;
2428
2429 if (ioctl(sfd, I_PUSH, "ptem") == -1 ||
2430 (termp != NULL && tcgetattr(sfd, termp) < 0))
2431 goto err;
2432
2433 if (amaster)
2434 *amaster = mfd;
2435 if (aslave)
2436 *aslave = sfd;
2437 if (winp)
2438 ioctl(sfd, TIOCSWINSZ, winp);
2439
2440 return 0;
2441
2442err:
2443 if (sfd != -1)
2444 close(sfd);
2445 close(mfd);
2446 return -1;
2447}
2448
2449void cfmakeraw (struct termios *termios_p)
2450{
2451 termios_p->c_iflag &=
2452 ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
2453 termios_p->c_oflag &= ~OPOST;
2454 termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
2455 termios_p->c_cflag &= ~(CSIZE|PARENB);
2456 termios_p->c_cflag |= CS8;
2457
2458 termios_p->c_cc[VMIN] = 0;
2459 termios_p->c_cc[VTIME] = 0;
2460}
2461#endif
2462
blueswir19892fbf2008-08-24 10:34:20 +00002463#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
2464 || defined(__NetBSD__) || defined(__OpenBSD__)
aliguori279e6942008-07-28 18:55:32 +00002465
2466typedef struct {
2467 int fd;
2468 int connected;
2469 int polling;
2470 int read_bytes;
2471 QEMUTimer *timer;
2472} PtyCharDriver;
2473
2474static void pty_chr_update_read_handler(CharDriverState *chr);
2475static void pty_chr_state(CharDriverState *chr, int connected);
2476
2477static int pty_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
2478{
2479 PtyCharDriver *s = chr->opaque;
2480
2481 if (!s->connected) {
2482 /* guest sends data, check for (re-)connect */
2483 pty_chr_update_read_handler(chr);
2484 return 0;
2485 }
2486 return unix_write(s->fd, buf, len);
2487}
2488
2489static int pty_chr_read_poll(void *opaque)
2490{
2491 CharDriverState *chr = opaque;
2492 PtyCharDriver *s = chr->opaque;
2493
2494 s->read_bytes = qemu_chr_can_read(chr);
2495 return s->read_bytes;
2496}
2497
2498static void pty_chr_read(void *opaque)
2499{
2500 CharDriverState *chr = opaque;
2501 PtyCharDriver *s = chr->opaque;
2502 int size, len;
2503 uint8_t buf[1024];
2504
2505 len = sizeof(buf);
2506 if (len > s->read_bytes)
2507 len = s->read_bytes;
2508 if (len == 0)
2509 return;
2510 size = read(s->fd, buf, len);
2511 if ((size == -1 && errno == EIO) ||
2512 (size == 0)) {
2513 pty_chr_state(chr, 0);
2514 return;
2515 }
2516 if (size > 0) {
2517 pty_chr_state(chr, 1);
2518 qemu_chr_read(chr, buf, size);
2519 }
2520}
2521
2522static void pty_chr_update_read_handler(CharDriverState *chr)
2523{
2524 PtyCharDriver *s = chr->opaque;
2525
2526 qemu_set_fd_handler2(s->fd, pty_chr_read_poll,
2527 pty_chr_read, NULL, chr);
2528 s->polling = 1;
2529 /*
2530 * Short timeout here: just need wait long enougth that qemu makes
2531 * it through the poll loop once. When reconnected we want a
2532 * short timeout so we notice it almost instantly. Otherwise
2533 * read() gives us -EIO instantly, making pty_chr_state() reset the
2534 * timeout to the normal (much longer) poll interval before the
2535 * timer triggers.
2536 */
2537 qemu_mod_timer(s->timer, qemu_get_clock(rt_clock) + 10);
2538}
2539
2540static void pty_chr_state(CharDriverState *chr, int connected)
2541{
2542 PtyCharDriver *s = chr->opaque;
2543
2544 if (!connected) {
2545 qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
2546 s->connected = 0;
2547 s->polling = 0;
2548 /* (re-)connect poll interval for idle guests: once per second.
2549 * We check more frequently in case the guests sends data to
2550 * the virtual device linked to our pty. */
2551 qemu_mod_timer(s->timer, qemu_get_clock(rt_clock) + 1000);
2552 } else {
2553 if (!s->connected)
2554 qemu_chr_reset(chr);
2555 s->connected = 1;
2556 }
2557}
2558
blueswir18fcd3692008-08-17 20:26:25 +00002559static void pty_chr_timer(void *opaque)
aliguori279e6942008-07-28 18:55:32 +00002560{
2561 struct CharDriverState *chr = opaque;
2562 PtyCharDriver *s = chr->opaque;
2563
2564 if (s->connected)
2565 return;
2566 if (s->polling) {
2567 /* If we arrive here without polling being cleared due
2568 * read returning -EIO, then we are (re-)connected */
2569 pty_chr_state(chr, 1);
2570 return;
2571 }
2572
2573 /* Next poll ... */
2574 pty_chr_update_read_handler(chr);
2575}
2576
2577static void pty_chr_close(struct CharDriverState *chr)
2578{
2579 PtyCharDriver *s = chr->opaque;
2580
2581 qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
2582 close(s->fd);
2583 qemu_free(s);
2584}
2585
ths52f61fd2006-12-22 21:20:52 +00002586static CharDriverState *qemu_chr_open_pty(void)
bellard82c643f2004-07-14 17:28:13 +00002587{
aliguori279e6942008-07-28 18:55:32 +00002588 CharDriverState *chr;
2589 PtyCharDriver *s;
bellard91fc2112005-12-18 19:09:37 +00002590 struct termios tty;
aliguori279e6942008-07-28 18:55:32 +00002591 int slave_fd;
blueswir19892fbf2008-08-24 10:34:20 +00002592#if defined(__OpenBSD__)
2593 char pty_name[PATH_MAX];
2594#define q_ptsname(x) pty_name
2595#else
2596 char *pty_name = NULL;
2597#define q_ptsname(x) ptsname(x)
2598#endif
ths3b46e622007-09-17 08:09:54 +00002599
aliguori279e6942008-07-28 18:55:32 +00002600 chr = qemu_mallocz(sizeof(CharDriverState));
2601 if (!chr)
2602 return NULL;
2603 s = qemu_mallocz(sizeof(PtyCharDriver));
2604 if (!s) {
2605 qemu_free(chr);
2606 return NULL;
2607 }
2608
blueswir19892fbf2008-08-24 10:34:20 +00002609 if (openpty(&s->fd, &slave_fd, pty_name, NULL, NULL) < 0) {
bellard82c643f2004-07-14 17:28:13 +00002610 return NULL;
2611 }
ths3b46e622007-09-17 08:09:54 +00002612
aurel3264b7b732008-05-05 10:05:31 +00002613 /* Set raw attributes on the pty. */
2614 cfmakeraw(&tty);
2615 tcsetattr(slave_fd, TCSAFLUSH, &tty);
aliguori279e6942008-07-28 18:55:32 +00002616 close(slave_fd);
bellard91fc2112005-12-18 19:09:37 +00002617
blueswir19892fbf2008-08-24 10:34:20 +00002618 fprintf(stderr, "char device redirected to %s\n", q_ptsname(s->fd));
aliguori279e6942008-07-28 18:55:32 +00002619
2620 chr->opaque = s;
2621 chr->chr_write = pty_chr_write;
2622 chr->chr_update_read_handler = pty_chr_update_read_handler;
2623 chr->chr_close = pty_chr_close;
2624
2625 s->timer = qemu_new_timer(rt_clock, pty_chr_timer, chr);
2626
2627 return chr;
bellard82c643f2004-07-14 17:28:13 +00002628}
bellardf8d179e2005-11-08 22:30:36 +00002629
ths5fafdf22007-09-16 21:08:06 +00002630static void tty_serial_init(int fd, int speed,
bellardf8d179e2005-11-08 22:30:36 +00002631 int parity, int data_bits, int stop_bits)
2632{
2633 struct termios tty;
2634 speed_t spd;
2635
bellarde57a8c02005-11-10 23:58:52 +00002636#if 0
ths5fafdf22007-09-16 21:08:06 +00002637 printf("tty_serial_init: speed=%d parity=%c data=%d stop=%d\n",
bellarde57a8c02005-11-10 23:58:52 +00002638 speed, parity, data_bits, stop_bits);
2639#endif
2640 tcgetattr (fd, &tty);
bellardf8d179e2005-11-08 22:30:36 +00002641
balroga7954212008-01-14 03:41:02 +00002642#define MARGIN 1.1
2643 if (speed <= 50 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002644 spd = B50;
balroga7954212008-01-14 03:41:02 +00002645 else if (speed <= 75 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002646 spd = B75;
balroga7954212008-01-14 03:41:02 +00002647 else if (speed <= 300 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002648 spd = B300;
balroga7954212008-01-14 03:41:02 +00002649 else if (speed <= 600 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002650 spd = B600;
balroga7954212008-01-14 03:41:02 +00002651 else if (speed <= 1200 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002652 spd = B1200;
balroga7954212008-01-14 03:41:02 +00002653 else if (speed <= 2400 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002654 spd = B2400;
balroga7954212008-01-14 03:41:02 +00002655 else if (speed <= 4800 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002656 spd = B4800;
balroga7954212008-01-14 03:41:02 +00002657 else if (speed <= 9600 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002658 spd = B9600;
balroga7954212008-01-14 03:41:02 +00002659 else if (speed <= 19200 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002660 spd = B19200;
balroga7954212008-01-14 03:41:02 +00002661 else if (speed <= 38400 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002662 spd = B38400;
balroga7954212008-01-14 03:41:02 +00002663 else if (speed <= 57600 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002664 spd = B57600;
balroga7954212008-01-14 03:41:02 +00002665 else if (speed <= 115200 * MARGIN)
bellardf8d179e2005-11-08 22:30:36 +00002666 spd = B115200;
balroga7954212008-01-14 03:41:02 +00002667 else
2668 spd = B115200;
bellardf8d179e2005-11-08 22:30:36 +00002669
2670 cfsetispeed(&tty, spd);
2671 cfsetospeed(&tty, spd);
2672
2673 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
2674 |INLCR|IGNCR|ICRNL|IXON);
2675 tty.c_oflag |= OPOST;
2676 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG);
bellard094eed62006-09-09 11:10:18 +00002677 tty.c_cflag &= ~(CSIZE|PARENB|PARODD|CRTSCTS|CSTOPB);
bellardf8d179e2005-11-08 22:30:36 +00002678 switch(data_bits) {
2679 default:
2680 case 8:
2681 tty.c_cflag |= CS8;
2682 break;
2683 case 7:
2684 tty.c_cflag |= CS7;
2685 break;
2686 case 6:
2687 tty.c_cflag |= CS6;
2688 break;
2689 case 5:
2690 tty.c_cflag |= CS5;
2691 break;
2692 }
2693 switch(parity) {
2694 default:
2695 case 'N':
2696 break;
2697 case 'E':
2698 tty.c_cflag |= PARENB;
2699 break;
2700 case 'O':
2701 tty.c_cflag |= PARENB | PARODD;
2702 break;
2703 }
bellard094eed62006-09-09 11:10:18 +00002704 if (stop_bits == 2)
2705 tty.c_cflag |= CSTOPB;
ths3b46e622007-09-17 08:09:54 +00002706
bellardf8d179e2005-11-08 22:30:36 +00002707 tcsetattr (fd, TCSANOW, &tty);
2708}
2709
bellarde57a8c02005-11-10 23:58:52 +00002710static int tty_serial_ioctl(CharDriverState *chr, int cmd, void *arg)
bellardf8d179e2005-11-08 22:30:36 +00002711{
2712 FDCharDriver *s = chr->opaque;
ths3b46e622007-09-17 08:09:54 +00002713
bellarde57a8c02005-11-10 23:58:52 +00002714 switch(cmd) {
2715 case CHR_IOCTL_SERIAL_SET_PARAMS:
2716 {
2717 QEMUSerialSetParams *ssp = arg;
ths5fafdf22007-09-16 21:08:06 +00002718 tty_serial_init(s->fd_in, ssp->speed, ssp->parity,
bellarde57a8c02005-11-10 23:58:52 +00002719 ssp->data_bits, ssp->stop_bits);
2720 }
2721 break;
2722 case CHR_IOCTL_SERIAL_SET_BREAK:
2723 {
2724 int enable = *(int *)arg;
2725 if (enable)
2726 tcsendbreak(s->fd_in, 1);
2727 }
2728 break;
aliguori81174da2008-08-11 14:17:04 +00002729 case CHR_IOCTL_SERIAL_GET_TIOCM:
2730 {
2731 int sarg = 0;
2732 int *targ = (int *)arg;
2733 ioctl(s->fd_in, TIOCMGET, &sarg);
2734 *targ = 0;
2735 if (sarg | TIOCM_CTS)
2736 *targ |= CHR_TIOCM_CTS;
2737 if (sarg | TIOCM_CAR)
2738 *targ |= CHR_TIOCM_CAR;
2739 if (sarg | TIOCM_DSR)
2740 *targ |= CHR_TIOCM_DSR;
2741 if (sarg | TIOCM_RI)
2742 *targ |= CHR_TIOCM_RI;
2743 if (sarg | TIOCM_DTR)
2744 *targ |= CHR_TIOCM_DTR;
2745 if (sarg | TIOCM_RTS)
2746 *targ |= CHR_TIOCM_RTS;
2747 }
2748 break;
2749 case CHR_IOCTL_SERIAL_SET_TIOCM:
2750 {
2751 int sarg = *(int *)arg;
2752 int targ = 0;
2753 if (sarg | CHR_TIOCM_DTR)
2754 targ |= TIOCM_DTR;
2755 if (sarg | CHR_TIOCM_RTS)
2756 targ |= TIOCM_RTS;
2757 ioctl(s->fd_in, TIOCMSET, &targ);
2758 }
2759 break;
bellarde57a8c02005-11-10 23:58:52 +00002760 default:
2761 return -ENOTSUP;
2762 }
2763 return 0;
bellardf8d179e2005-11-08 22:30:36 +00002764}
2765
ths52f61fd2006-12-22 21:20:52 +00002766static CharDriverState *qemu_chr_open_tty(const char *filename)
bellardf8d179e2005-11-08 22:30:36 +00002767{
2768 CharDriverState *chr;
2769 int fd;
2770
balrogaeb30be2007-07-02 15:03:13 +00002771 TFR(fd = open(filename, O_RDWR | O_NONBLOCK));
bellardf8d179e2005-11-08 22:30:36 +00002772 tty_serial_init(fd, 115200, 'N', 8, 1);
2773 chr = qemu_chr_open_fd(fd, fd);
balrogaeb30be2007-07-02 15:03:13 +00002774 if (!chr) {
2775 close(fd);
bellardf8d179e2005-11-08 22:30:36 +00002776 return NULL;
balrogaeb30be2007-07-02 15:03:13 +00002777 }
bellarde57a8c02005-11-10 23:58:52 +00002778 chr->chr_ioctl = tty_serial_ioctl;
ths86e94de2007-01-05 22:01:59 +00002779 qemu_chr_reset(chr);
bellarde57a8c02005-11-10 23:58:52 +00002780 return chr;
2781}
thsaec62502007-06-25 11:48:07 +00002782#else /* ! __linux__ && ! __sun__ */
2783static CharDriverState *qemu_chr_open_pty(void)
2784{
2785 return NULL;
2786}
2787#endif /* __linux__ || __sun__ */
bellarde57a8c02005-11-10 23:58:52 +00002788
thsaec62502007-06-25 11:48:07 +00002789#if defined(__linux__)
ths5867c882007-02-17 23:44:43 +00002790typedef struct {
2791 int fd;
2792 int mode;
2793} ParallelCharDriver;
2794
2795static int pp_hw_mode(ParallelCharDriver *s, uint16_t mode)
2796{
2797 if (s->mode != mode) {
2798 int m = mode;
2799 if (ioctl(s->fd, PPSETMODE, &m) < 0)
2800 return 0;
2801 s->mode = mode;
2802 }
2803 return 1;
2804}
2805
bellarde57a8c02005-11-10 23:58:52 +00002806static int pp_ioctl(CharDriverState *chr, int cmd, void *arg)
2807{
ths5867c882007-02-17 23:44:43 +00002808 ParallelCharDriver *drv = chr->opaque;
2809 int fd = drv->fd;
bellarde57a8c02005-11-10 23:58:52 +00002810 uint8_t b;
2811
2812 switch(cmd) {
2813 case CHR_IOCTL_PP_READ_DATA:
2814 if (ioctl(fd, PPRDATA, &b) < 0)
2815 return -ENOTSUP;
2816 *(uint8_t *)arg = b;
2817 break;
2818 case CHR_IOCTL_PP_WRITE_DATA:
2819 b = *(uint8_t *)arg;
2820 if (ioctl(fd, PPWDATA, &b) < 0)
2821 return -ENOTSUP;
2822 break;
2823 case CHR_IOCTL_PP_READ_CONTROL:
2824 if (ioctl(fd, PPRCONTROL, &b) < 0)
2825 return -ENOTSUP;
ths5867c882007-02-17 23:44:43 +00002826 /* Linux gives only the lowest bits, and no way to know data
2827 direction! For better compatibility set the fixed upper
2828 bits. */
2829 *(uint8_t *)arg = b | 0xc0;
bellarde57a8c02005-11-10 23:58:52 +00002830 break;
2831 case CHR_IOCTL_PP_WRITE_CONTROL:
2832 b = *(uint8_t *)arg;
2833 if (ioctl(fd, PPWCONTROL, &b) < 0)
2834 return -ENOTSUP;
2835 break;
2836 case CHR_IOCTL_PP_READ_STATUS:
2837 if (ioctl(fd, PPRSTATUS, &b) < 0)
2838 return -ENOTSUP;
2839 *(uint8_t *)arg = b;
2840 break;
aurel32563e3c62008-08-22 08:57:09 +00002841 case CHR_IOCTL_PP_DATA_DIR:
2842 if (ioctl(fd, PPDATADIR, (int *)arg) < 0)
2843 return -ENOTSUP;
2844 break;
ths5867c882007-02-17 23:44:43 +00002845 case CHR_IOCTL_PP_EPP_READ_ADDR:
2846 if (pp_hw_mode(drv, IEEE1284_MODE_EPP|IEEE1284_ADDR)) {
2847 struct ParallelIOArg *parg = arg;
2848 int n = read(fd, parg->buffer, parg->count);
2849 if (n != parg->count) {
2850 return -EIO;
2851 }
2852 }
2853 break;
2854 case CHR_IOCTL_PP_EPP_READ:
2855 if (pp_hw_mode(drv, IEEE1284_MODE_EPP)) {
2856 struct ParallelIOArg *parg = arg;
2857 int n = read(fd, parg->buffer, parg->count);
2858 if (n != parg->count) {
2859 return -EIO;
2860 }
2861 }
2862 break;
2863 case CHR_IOCTL_PP_EPP_WRITE_ADDR:
2864 if (pp_hw_mode(drv, IEEE1284_MODE_EPP|IEEE1284_ADDR)) {
2865 struct ParallelIOArg *parg = arg;
2866 int n = write(fd, parg->buffer, parg->count);
2867 if (n != parg->count) {
2868 return -EIO;
2869 }
2870 }
2871 break;
2872 case CHR_IOCTL_PP_EPP_WRITE:
2873 if (pp_hw_mode(drv, IEEE1284_MODE_EPP)) {
2874 struct ParallelIOArg *parg = arg;
2875 int n = write(fd, parg->buffer, parg->count);
2876 if (n != parg->count) {
2877 return -EIO;
2878 }
2879 }
2880 break;
bellarde57a8c02005-11-10 23:58:52 +00002881 default:
2882 return -ENOTSUP;
2883 }
2884 return 0;
2885}
2886
ths5867c882007-02-17 23:44:43 +00002887static void pp_close(CharDriverState *chr)
2888{
2889 ParallelCharDriver *drv = chr->opaque;
2890 int fd = drv->fd;
2891
2892 pp_hw_mode(drv, IEEE1284_MODE_COMPAT);
2893 ioctl(fd, PPRELEASE);
2894 close(fd);
2895 qemu_free(drv);
2896}
2897
ths52f61fd2006-12-22 21:20:52 +00002898static CharDriverState *qemu_chr_open_pp(const char *filename)
bellarde57a8c02005-11-10 23:58:52 +00002899{
2900 CharDriverState *chr;
ths5867c882007-02-17 23:44:43 +00002901 ParallelCharDriver *drv;
bellarde57a8c02005-11-10 23:58:52 +00002902 int fd;
2903
balrogaeb30be2007-07-02 15:03:13 +00002904 TFR(fd = open(filename, O_RDWR));
bellarde57a8c02005-11-10 23:58:52 +00002905 if (fd < 0)
2906 return NULL;
2907
2908 if (ioctl(fd, PPCLAIM) < 0) {
2909 close(fd);
2910 return NULL;
2911 }
2912
ths5867c882007-02-17 23:44:43 +00002913 drv = qemu_mallocz(sizeof(ParallelCharDriver));
2914 if (!drv) {
bellarde57a8c02005-11-10 23:58:52 +00002915 close(fd);
2916 return NULL;
2917 }
ths5867c882007-02-17 23:44:43 +00002918 drv->fd = fd;
2919 drv->mode = IEEE1284_MODE_COMPAT;
2920
2921 chr = qemu_mallocz(sizeof(CharDriverState));
2922 if (!chr) {
2923 qemu_free(drv);
2924 close(fd);
2925 return NULL;
2926 }
bellarde57a8c02005-11-10 23:58:52 +00002927 chr->chr_write = null_chr_write;
bellarde57a8c02005-11-10 23:58:52 +00002928 chr->chr_ioctl = pp_ioctl;
ths5867c882007-02-17 23:44:43 +00002929 chr->chr_close = pp_close;
2930 chr->opaque = drv;
ths86e94de2007-01-05 22:01:59 +00002931
2932 qemu_chr_reset(chr);
2933
bellardf8d179e2005-11-08 22:30:36 +00002934 return chr;
2935}
thsaec62502007-06-25 11:48:07 +00002936#endif /* __linux__ */
bellardf8d179e2005-11-08 22:30:36 +00002937
thsaec62502007-06-25 11:48:07 +00002938#else /* _WIN32 */
bellard67b915a2004-03-31 23:37:16 +00002939
bellardf3311102006-04-12 20:21:17 +00002940typedef struct {
bellardf3311102006-04-12 20:21:17 +00002941 int max_size;
2942 HANDLE hcom, hrecv, hsend;
2943 OVERLAPPED orecv, osend;
2944 BOOL fpipe;
2945 DWORD len;
2946} WinCharState;
2947
2948#define NSENDBUF 2048
2949#define NRECVBUF 2048
2950#define MAXCONNECT 1
2951#define NTIMEOUT 5000
2952
2953static int win_chr_poll(void *opaque);
2954static int win_chr_pipe_poll(void *opaque);
2955
ths087f4ae2007-02-10 21:50:42 +00002956static void win_chr_close(CharDriverState *chr)
bellardf3311102006-04-12 20:21:17 +00002957{
ths087f4ae2007-02-10 21:50:42 +00002958 WinCharState *s = chr->opaque;
2959
bellardf3311102006-04-12 20:21:17 +00002960 if (s->hsend) {
2961 CloseHandle(s->hsend);
2962 s->hsend = NULL;
2963 }
2964 if (s->hrecv) {
2965 CloseHandle(s->hrecv);
2966 s->hrecv = NULL;
2967 }
2968 if (s->hcom) {
2969 CloseHandle(s->hcom);
2970 s->hcom = NULL;
2971 }
2972 if (s->fpipe)
ths087f4ae2007-02-10 21:50:42 +00002973 qemu_del_polling_cb(win_chr_pipe_poll, chr);
bellardf3311102006-04-12 20:21:17 +00002974 else
ths087f4ae2007-02-10 21:50:42 +00002975 qemu_del_polling_cb(win_chr_poll, chr);
bellardf3311102006-04-12 20:21:17 +00002976}
2977
ths087f4ae2007-02-10 21:50:42 +00002978static int win_chr_init(CharDriverState *chr, const char *filename)
bellardf3311102006-04-12 20:21:17 +00002979{
2980 WinCharState *s = chr->opaque;
bellardf3311102006-04-12 20:21:17 +00002981 COMMCONFIG comcfg;
2982 COMMTIMEOUTS cto = { 0, 0, 0, 0, 0};
2983 COMSTAT comstat;
2984 DWORD size;
2985 DWORD err;
ths3b46e622007-09-17 08:09:54 +00002986
bellardf3311102006-04-12 20:21:17 +00002987 s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
2988 if (!s->hsend) {
2989 fprintf(stderr, "Failed CreateEvent\n");
2990 goto fail;
2991 }
2992 s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
2993 if (!s->hrecv) {
2994 fprintf(stderr, "Failed CreateEvent\n");
2995 goto fail;
2996 }
2997
2998 s->hcom = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL,
2999 OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
3000 if (s->hcom == INVALID_HANDLE_VALUE) {
3001 fprintf(stderr, "Failed CreateFile (%lu)\n", GetLastError());
3002 s->hcom = NULL;
3003 goto fail;
3004 }
ths3b46e622007-09-17 08:09:54 +00003005
bellardf3311102006-04-12 20:21:17 +00003006 if (!SetupComm(s->hcom, NRECVBUF, NSENDBUF)) {
3007 fprintf(stderr, "Failed SetupComm\n");
3008 goto fail;
3009 }
ths3b46e622007-09-17 08:09:54 +00003010
bellardf3311102006-04-12 20:21:17 +00003011 ZeroMemory(&comcfg, sizeof(COMMCONFIG));
3012 size = sizeof(COMMCONFIG);
3013 GetDefaultCommConfig(filename, &comcfg, &size);
3014 comcfg.dcb.DCBlength = sizeof(DCB);
3015 CommConfigDialog(filename, NULL, &comcfg);
3016
3017 if (!SetCommState(s->hcom, &comcfg.dcb)) {
3018 fprintf(stderr, "Failed SetCommState\n");
3019 goto fail;
3020 }
3021
3022 if (!SetCommMask(s->hcom, EV_ERR)) {
3023 fprintf(stderr, "Failed SetCommMask\n");
3024 goto fail;
3025 }
3026
3027 cto.ReadIntervalTimeout = MAXDWORD;
3028 if (!SetCommTimeouts(s->hcom, &cto)) {
3029 fprintf(stderr, "Failed SetCommTimeouts\n");
3030 goto fail;
3031 }
ths3b46e622007-09-17 08:09:54 +00003032
bellardf3311102006-04-12 20:21:17 +00003033 if (!ClearCommError(s->hcom, &err, &comstat)) {
3034 fprintf(stderr, "Failed ClearCommError\n");
3035 goto fail;
3036 }
ths087f4ae2007-02-10 21:50:42 +00003037 qemu_add_polling_cb(win_chr_poll, chr);
bellardf3311102006-04-12 20:21:17 +00003038 return 0;
3039
3040 fail:
ths087f4ae2007-02-10 21:50:42 +00003041 win_chr_close(chr);
bellardf3311102006-04-12 20:21:17 +00003042 return -1;
3043}
3044
3045static int win_chr_write(CharDriverState *chr, const uint8_t *buf, int len1)
3046{
3047 WinCharState *s = chr->opaque;
3048 DWORD len, ret, size, err;
3049
3050 len = len1;
3051 ZeroMemory(&s->osend, sizeof(s->osend));
3052 s->osend.hEvent = s->hsend;
3053 while (len > 0) {
3054 if (s->hsend)
3055 ret = WriteFile(s->hcom, buf, len, &size, &s->osend);
3056 else
3057 ret = WriteFile(s->hcom, buf, len, &size, NULL);
3058 if (!ret) {
3059 err = GetLastError();
3060 if (err == ERROR_IO_PENDING) {
3061 ret = GetOverlappedResult(s->hcom, &s->osend, &size, TRUE);
3062 if (ret) {
3063 buf += size;
3064 len -= size;
3065 } else {
3066 break;
3067 }
3068 } else {
3069 break;
3070 }
3071 } else {
3072 buf += size;
3073 len -= size;
3074 }
3075 }
3076 return len1 - len;
3077}
3078
ths087f4ae2007-02-10 21:50:42 +00003079static int win_chr_read_poll(CharDriverState *chr)
bellardf3311102006-04-12 20:21:17 +00003080{
ths087f4ae2007-02-10 21:50:42 +00003081 WinCharState *s = chr->opaque;
3082
3083 s->max_size = qemu_chr_can_read(chr);
bellardf3311102006-04-12 20:21:17 +00003084 return s->max_size;
3085}
pbrooke5b0bc42007-01-27 23:46:43 +00003086
ths087f4ae2007-02-10 21:50:42 +00003087static void win_chr_readfile(CharDriverState *chr)
bellardf3311102006-04-12 20:21:17 +00003088{
ths087f4ae2007-02-10 21:50:42 +00003089 WinCharState *s = chr->opaque;
bellardf3311102006-04-12 20:21:17 +00003090 int ret, err;
3091 uint8_t buf[1024];
3092 DWORD size;
ths3b46e622007-09-17 08:09:54 +00003093
bellardf3311102006-04-12 20:21:17 +00003094 ZeroMemory(&s->orecv, sizeof(s->orecv));
3095 s->orecv.hEvent = s->hrecv;
3096 ret = ReadFile(s->hcom, buf, s->len, &size, &s->orecv);
3097 if (!ret) {
3098 err = GetLastError();
3099 if (err == ERROR_IO_PENDING) {
3100 ret = GetOverlappedResult(s->hcom, &s->orecv, &size, TRUE);
3101 }
3102 }
3103
3104 if (size > 0) {
ths087f4ae2007-02-10 21:50:42 +00003105 qemu_chr_read(chr, buf, size);
bellardf3311102006-04-12 20:21:17 +00003106 }
3107}
3108
ths087f4ae2007-02-10 21:50:42 +00003109static void win_chr_read(CharDriverState *chr)
bellardf3311102006-04-12 20:21:17 +00003110{
ths087f4ae2007-02-10 21:50:42 +00003111 WinCharState *s = chr->opaque;
3112
bellardf3311102006-04-12 20:21:17 +00003113 if (s->len > s->max_size)
3114 s->len = s->max_size;
3115 if (s->len == 0)
3116 return;
ths3b46e622007-09-17 08:09:54 +00003117
ths087f4ae2007-02-10 21:50:42 +00003118 win_chr_readfile(chr);
bellardf3311102006-04-12 20:21:17 +00003119}
3120
3121static int win_chr_poll(void *opaque)
3122{
ths087f4ae2007-02-10 21:50:42 +00003123 CharDriverState *chr = opaque;
3124 WinCharState *s = chr->opaque;
bellardf3311102006-04-12 20:21:17 +00003125 COMSTAT status;
3126 DWORD comerr;
ths3b46e622007-09-17 08:09:54 +00003127
bellardf3311102006-04-12 20:21:17 +00003128 ClearCommError(s->hcom, &comerr, &status);
3129 if (status.cbInQue > 0) {
3130 s->len = status.cbInQue;
ths087f4ae2007-02-10 21:50:42 +00003131 win_chr_read_poll(chr);
3132 win_chr_read(chr);
bellardf3311102006-04-12 20:21:17 +00003133 return 1;
3134 }
3135 return 0;
3136}
3137
ths52f61fd2006-12-22 21:20:52 +00003138static CharDriverState *qemu_chr_open_win(const char *filename)
bellardf3311102006-04-12 20:21:17 +00003139{
3140 CharDriverState *chr;
3141 WinCharState *s;
ths3b46e622007-09-17 08:09:54 +00003142
bellardf3311102006-04-12 20:21:17 +00003143 chr = qemu_mallocz(sizeof(CharDriverState));
3144 if (!chr)
3145 return NULL;
3146 s = qemu_mallocz(sizeof(WinCharState));
3147 if (!s) {
3148 free(chr);
3149 return NULL;
3150 }
3151 chr->opaque = s;
3152 chr->chr_write = win_chr_write;
bellardf3311102006-04-12 20:21:17 +00003153 chr->chr_close = win_chr_close;
3154
ths087f4ae2007-02-10 21:50:42 +00003155 if (win_chr_init(chr, filename) < 0) {
bellardf3311102006-04-12 20:21:17 +00003156 free(s);
3157 free(chr);
3158 return NULL;
3159 }
ths86e94de2007-01-05 22:01:59 +00003160 qemu_chr_reset(chr);
bellardf3311102006-04-12 20:21:17 +00003161 return chr;
3162}
3163
3164static int win_chr_pipe_poll(void *opaque)
3165{
ths087f4ae2007-02-10 21:50:42 +00003166 CharDriverState *chr = opaque;
3167 WinCharState *s = chr->opaque;
bellardf3311102006-04-12 20:21:17 +00003168 DWORD size;
3169
3170 PeekNamedPipe(s->hcom, NULL, 0, NULL, &size, NULL);
3171 if (size > 0) {
3172 s->len = size;
ths087f4ae2007-02-10 21:50:42 +00003173 win_chr_read_poll(chr);
3174 win_chr_read(chr);
bellardf3311102006-04-12 20:21:17 +00003175 return 1;
3176 }
3177 return 0;
3178}
3179
ths087f4ae2007-02-10 21:50:42 +00003180static int win_chr_pipe_init(CharDriverState *chr, const char *filename)
bellardf3311102006-04-12 20:21:17 +00003181{
ths087f4ae2007-02-10 21:50:42 +00003182 WinCharState *s = chr->opaque;
bellardf3311102006-04-12 20:21:17 +00003183 OVERLAPPED ov;
3184 int ret;
3185 DWORD size;
3186 char openname[256];
ths3b46e622007-09-17 08:09:54 +00003187
bellardf3311102006-04-12 20:21:17 +00003188 s->fpipe = TRUE;
3189
3190 s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
3191 if (!s->hsend) {
3192 fprintf(stderr, "Failed CreateEvent\n");
3193 goto fail;
3194 }
3195 s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
3196 if (!s->hrecv) {
3197 fprintf(stderr, "Failed CreateEvent\n");
3198 goto fail;
3199 }
ths3b46e622007-09-17 08:09:54 +00003200
bellardf3311102006-04-12 20:21:17 +00003201 snprintf(openname, sizeof(openname), "\\\\.\\pipe\\%s", filename);
3202 s->hcom = CreateNamedPipe(openname, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
3203 PIPE_TYPE_BYTE | PIPE_READMODE_BYTE |
3204 PIPE_WAIT,
3205 MAXCONNECT, NSENDBUF, NRECVBUF, NTIMEOUT, NULL);
3206 if (s->hcom == INVALID_HANDLE_VALUE) {
3207 fprintf(stderr, "Failed CreateNamedPipe (%lu)\n", GetLastError());
3208 s->hcom = NULL;
3209 goto fail;
3210 }
3211
3212 ZeroMemory(&ov, sizeof(ov));
3213 ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
3214 ret = ConnectNamedPipe(s->hcom, &ov);
3215 if (ret) {
3216 fprintf(stderr, "Failed ConnectNamedPipe\n");
3217 goto fail;
3218 }
3219
3220 ret = GetOverlappedResult(s->hcom, &ov, &size, TRUE);
3221 if (!ret) {
3222 fprintf(stderr, "Failed GetOverlappedResult\n");
3223 if (ov.hEvent) {
3224 CloseHandle(ov.hEvent);
3225 ov.hEvent = NULL;
3226 }
3227 goto fail;
3228 }
3229
3230 if (ov.hEvent) {
3231 CloseHandle(ov.hEvent);
3232 ov.hEvent = NULL;
3233 }
ths087f4ae2007-02-10 21:50:42 +00003234 qemu_add_polling_cb(win_chr_pipe_poll, chr);
bellardf3311102006-04-12 20:21:17 +00003235 return 0;
3236
3237 fail:
ths087f4ae2007-02-10 21:50:42 +00003238 win_chr_close(chr);
bellardf3311102006-04-12 20:21:17 +00003239 return -1;
3240}
3241
3242
ths52f61fd2006-12-22 21:20:52 +00003243static CharDriverState *qemu_chr_open_win_pipe(const char *filename)
bellardf3311102006-04-12 20:21:17 +00003244{
3245 CharDriverState *chr;
3246 WinCharState *s;
3247
3248 chr = qemu_mallocz(sizeof(CharDriverState));
3249 if (!chr)
3250 return NULL;
3251 s = qemu_mallocz(sizeof(WinCharState));
3252 if (!s) {
3253 free(chr);
3254 return NULL;
3255 }
3256 chr->opaque = s;
3257 chr->chr_write = win_chr_write;
bellardf3311102006-04-12 20:21:17 +00003258 chr->chr_close = win_chr_close;
ths3b46e622007-09-17 08:09:54 +00003259
ths087f4ae2007-02-10 21:50:42 +00003260 if (win_chr_pipe_init(chr, filename) < 0) {
bellardf3311102006-04-12 20:21:17 +00003261 free(s);
3262 free(chr);
3263 return NULL;
3264 }
ths86e94de2007-01-05 22:01:59 +00003265 qemu_chr_reset(chr);
bellardf3311102006-04-12 20:21:17 +00003266 return chr;
3267}
3268
ths52f61fd2006-12-22 21:20:52 +00003269static CharDriverState *qemu_chr_open_win_file(HANDLE fd_out)
bellardf3311102006-04-12 20:21:17 +00003270{
3271 CharDriverState *chr;
3272 WinCharState *s;
3273
3274 chr = qemu_mallocz(sizeof(CharDriverState));
3275 if (!chr)
3276 return NULL;
3277 s = qemu_mallocz(sizeof(WinCharState));
3278 if (!s) {
3279 free(chr);
3280 return NULL;
3281 }
3282 s->hcom = fd_out;
3283 chr->opaque = s;
3284 chr->chr_write = win_chr_write;
ths86e94de2007-01-05 22:01:59 +00003285 qemu_chr_reset(chr);
bellardf3311102006-04-12 20:21:17 +00003286 return chr;
3287}
ths72d46472007-05-13 14:54:54 +00003288
3289static CharDriverState *qemu_chr_open_win_con(const char *filename)
3290{
3291 return qemu_chr_open_win_file(GetStdHandle(STD_OUTPUT_HANDLE));
3292}
3293
ths52f61fd2006-12-22 21:20:52 +00003294static CharDriverState *qemu_chr_open_win_file_out(const char *file_out)
bellardf3311102006-04-12 20:21:17 +00003295{
3296 HANDLE fd_out;
ths3b46e622007-09-17 08:09:54 +00003297
bellardf3311102006-04-12 20:21:17 +00003298 fd_out = CreateFile(file_out, GENERIC_WRITE, FILE_SHARE_READ, NULL,
3299 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
3300 if (fd_out == INVALID_HANDLE_VALUE)
3301 return NULL;
3302
3303 return qemu_chr_open_win_file(fd_out);
3304}
thsaec62502007-06-25 11:48:07 +00003305#endif /* !_WIN32 */
bellardf3311102006-04-12 20:21:17 +00003306
bellard0bab00f2006-06-25 14:49:44 +00003307/***********************************************************/
3308/* UDP Net console */
3309
3310typedef struct {
bellard0bab00f2006-06-25 14:49:44 +00003311 int fd;
3312 struct sockaddr_in daddr;
ths60fe76f2007-12-16 03:02:09 +00003313 uint8_t buf[1024];
bellard0bab00f2006-06-25 14:49:44 +00003314 int bufcnt;
3315 int bufptr;
3316 int max_size;
3317} NetCharDriver;
3318
3319static int udp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
3320{
3321 NetCharDriver *s = chr->opaque;
3322
3323 return sendto(s->fd, buf, len, 0,
3324 (struct sockaddr *)&s->daddr, sizeof(struct sockaddr_in));
3325}
3326
3327static int udp_chr_read_poll(void *opaque)
3328{
3329 CharDriverState *chr = opaque;
3330 NetCharDriver *s = chr->opaque;
3331
pbrooke5b0bc42007-01-27 23:46:43 +00003332 s->max_size = qemu_chr_can_read(chr);
bellard0bab00f2006-06-25 14:49:44 +00003333
3334 /* If there were any stray characters in the queue process them
3335 * first
3336 */
3337 while (s->max_size > 0 && s->bufptr < s->bufcnt) {
pbrooke5b0bc42007-01-27 23:46:43 +00003338 qemu_chr_read(chr, &s->buf[s->bufptr], 1);
bellard0bab00f2006-06-25 14:49:44 +00003339 s->bufptr++;
pbrooke5b0bc42007-01-27 23:46:43 +00003340 s->max_size = qemu_chr_can_read(chr);
bellard0bab00f2006-06-25 14:49:44 +00003341 }
3342 return s->max_size;
3343}
3344
3345static void udp_chr_read(void *opaque)
3346{
3347 CharDriverState *chr = opaque;
3348 NetCharDriver *s = chr->opaque;
3349
3350 if (s->max_size == 0)
3351 return;
3352 s->bufcnt = recv(s->fd, s->buf, sizeof(s->buf), 0);
3353 s->bufptr = s->bufcnt;
3354 if (s->bufcnt <= 0)
3355 return;
3356
3357 s->bufptr = 0;
3358 while (s->max_size > 0 && s->bufptr < s->bufcnt) {
pbrooke5b0bc42007-01-27 23:46:43 +00003359 qemu_chr_read(chr, &s->buf[s->bufptr], 1);
bellard0bab00f2006-06-25 14:49:44 +00003360 s->bufptr++;
pbrooke5b0bc42007-01-27 23:46:43 +00003361 s->max_size = qemu_chr_can_read(chr);
bellard0bab00f2006-06-25 14:49:44 +00003362 }
3363}
3364
pbrooke5b0bc42007-01-27 23:46:43 +00003365static void udp_chr_update_read_handler(CharDriverState *chr)
bellard0bab00f2006-06-25 14:49:44 +00003366{
3367 NetCharDriver *s = chr->opaque;
3368
3369 if (s->fd >= 0) {
bellard0bab00f2006-06-25 14:49:44 +00003370 qemu_set_fd_handler2(s->fd, udp_chr_read_poll,
3371 udp_chr_read, NULL, chr);
3372 }
3373}
3374
3375int parse_host_port(struct sockaddr_in *saddr, const char *str);
ths52f61fd2006-12-22 21:20:52 +00003376#ifndef _WIN32
3377static int parse_unix_path(struct sockaddr_un *uaddr, const char *str);
3378#endif
bellard951f1352006-06-27 21:02:43 +00003379int parse_host_src_port(struct sockaddr_in *haddr,
3380 struct sockaddr_in *saddr,
3381 const char *str);
bellard0bab00f2006-06-25 14:49:44 +00003382
ths52f61fd2006-12-22 21:20:52 +00003383static CharDriverState *qemu_chr_open_udp(const char *def)
bellard0bab00f2006-06-25 14:49:44 +00003384{
3385 CharDriverState *chr = NULL;
3386 NetCharDriver *s = NULL;
3387 int fd = -1;
bellard951f1352006-06-27 21:02:43 +00003388 struct sockaddr_in saddr;
bellard0bab00f2006-06-25 14:49:44 +00003389
3390 chr = qemu_mallocz(sizeof(CharDriverState));
3391 if (!chr)
3392 goto return_err;
3393 s = qemu_mallocz(sizeof(NetCharDriver));
3394 if (!s)
3395 goto return_err;
3396
3397 fd = socket(PF_INET, SOCK_DGRAM, 0);
3398 if (fd < 0) {
3399 perror("socket(PF_INET, SOCK_DGRAM)");
3400 goto return_err;
3401 }
3402
bellard951f1352006-06-27 21:02:43 +00003403 if (parse_host_src_port(&s->daddr, &saddr, def) < 0) {
3404 printf("Could not parse: %s\n", def);
3405 goto return_err;
bellard0bab00f2006-06-25 14:49:44 +00003406 }
3407
bellard951f1352006-06-27 21:02:43 +00003408 if (bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0)
bellard0bab00f2006-06-25 14:49:44 +00003409 {
3410 perror("bind");
3411 goto return_err;
3412 }
3413
3414 s->fd = fd;
3415 s->bufcnt = 0;
3416 s->bufptr = 0;
3417 chr->opaque = s;
3418 chr->chr_write = udp_chr_write;
pbrooke5b0bc42007-01-27 23:46:43 +00003419 chr->chr_update_read_handler = udp_chr_update_read_handler;
bellard0bab00f2006-06-25 14:49:44 +00003420 return chr;
3421
3422return_err:
3423 if (chr)
3424 free(chr);
3425 if (s)
3426 free(s);
3427 if (fd >= 0)
3428 closesocket(fd);
3429 return NULL;
3430}
3431
3432/***********************************************************/
3433/* TCP Net console */
3434
3435typedef struct {
bellard0bab00f2006-06-25 14:49:44 +00003436 int fd, listen_fd;
3437 int connected;
3438 int max_size;
bellard951f1352006-06-27 21:02:43 +00003439 int do_telnetopt;
pbrooke5b0bc42007-01-27 23:46:43 +00003440 int do_nodelay;
thsffd843b2006-12-21 19:46:43 +00003441 int is_unix;
bellard0bab00f2006-06-25 14:49:44 +00003442} TCPCharDriver;
3443
3444static void tcp_chr_accept(void *opaque);
3445
3446static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
3447{
3448 TCPCharDriver *s = chr->opaque;
3449 if (s->connected) {
3450 return send_all(s->fd, buf, len);
3451 } else {
3452 /* XXX: indicate an error ? */
3453 return len;
3454 }
3455}
3456
3457static int tcp_chr_read_poll(void *opaque)
3458{
3459 CharDriverState *chr = opaque;
3460 TCPCharDriver *s = chr->opaque;
3461 if (!s->connected)
3462 return 0;
pbrooke5b0bc42007-01-27 23:46:43 +00003463 s->max_size = qemu_chr_can_read(chr);
bellard0bab00f2006-06-25 14:49:44 +00003464 return s->max_size;
3465}
3466
bellard951f1352006-06-27 21:02:43 +00003467#define IAC 255
3468#define IAC_BREAK 243
3469static void tcp_chr_process_IAC_bytes(CharDriverState *chr,
3470 TCPCharDriver *s,
ths60fe76f2007-12-16 03:02:09 +00003471 uint8_t *buf, int *size)
bellard951f1352006-06-27 21:02:43 +00003472{
3473 /* Handle any telnet client's basic IAC options to satisfy char by
3474 * char mode with no echo. All IAC options will be removed from
3475 * the buf and the do_telnetopt variable will be used to track the
3476 * state of the width of the IAC information.
3477 *
3478 * IAC commands come in sets of 3 bytes with the exception of the
3479 * "IAC BREAK" command and the double IAC.
3480 */
3481
3482 int i;
3483 int j = 0;
3484
3485 for (i = 0; i < *size; i++) {
3486 if (s->do_telnetopt > 1) {
3487 if ((unsigned char)buf[i] == IAC && s->do_telnetopt == 2) {
3488 /* Double IAC means send an IAC */
3489 if (j != i)
3490 buf[j] = buf[i];
3491 j++;
3492 s->do_telnetopt = 1;
3493 } else {
3494 if ((unsigned char)buf[i] == IAC_BREAK && s->do_telnetopt == 2) {
3495 /* Handle IAC break commands by sending a serial break */
pbrooke5b0bc42007-01-27 23:46:43 +00003496 qemu_chr_event(chr, CHR_EVENT_BREAK);
bellard951f1352006-06-27 21:02:43 +00003497 s->do_telnetopt++;
3498 }
3499 s->do_telnetopt++;
3500 }
3501 if (s->do_telnetopt >= 4) {
3502 s->do_telnetopt = 1;
3503 }
3504 } else {
3505 if ((unsigned char)buf[i] == IAC) {
3506 s->do_telnetopt = 2;
3507 } else {
3508 if (j != i)
3509 buf[j] = buf[i];
3510 j++;
3511 }
3512 }
3513 }
3514 *size = j;
3515}
3516
bellard0bab00f2006-06-25 14:49:44 +00003517static void tcp_chr_read(void *opaque)
3518{
3519 CharDriverState *chr = opaque;
3520 TCPCharDriver *s = chr->opaque;
3521 uint8_t buf[1024];
3522 int len, size;
3523
3524 if (!s->connected || s->max_size <= 0)
3525 return;
3526 len = sizeof(buf);
3527 if (len > s->max_size)
3528 len = s->max_size;
3529 size = recv(s->fd, buf, len, 0);
3530 if (size == 0) {
3531 /* connection closed */
3532 s->connected = 0;
3533 if (s->listen_fd >= 0) {
3534 qemu_set_fd_handler(s->listen_fd, tcp_chr_accept, NULL, chr);
3535 }
3536 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
3537 closesocket(s->fd);
3538 s->fd = -1;
3539 } else if (size > 0) {
bellard951f1352006-06-27 21:02:43 +00003540 if (s->do_telnetopt)
3541 tcp_chr_process_IAC_bytes(chr, s, buf, &size);
3542 if (size > 0)
pbrooke5b0bc42007-01-27 23:46:43 +00003543 qemu_chr_read(chr, buf, size);
bellard0bab00f2006-06-25 14:49:44 +00003544 }
3545}
3546
bellard0bab00f2006-06-25 14:49:44 +00003547static void tcp_chr_connect(void *opaque)
3548{
3549 CharDriverState *chr = opaque;
3550 TCPCharDriver *s = chr->opaque;
3551
3552 s->connected = 1;
3553 qemu_set_fd_handler2(s->fd, tcp_chr_read_poll,
3554 tcp_chr_read, NULL, chr);
ths86e94de2007-01-05 22:01:59 +00003555 qemu_chr_reset(chr);
bellard0bab00f2006-06-25 14:49:44 +00003556}
3557
bellard951f1352006-06-27 21:02:43 +00003558#define IACSET(x,a,b,c) x[0] = a; x[1] = b; x[2] = c;
3559static void tcp_chr_telnet_init(int fd)
3560{
3561 char buf[3];
3562 /* Send the telnet negotion to put telnet in binary, no echo, single char mode */
3563 IACSET(buf, 0xff, 0xfb, 0x01); /* IAC WILL ECHO */
3564 send(fd, (char *)buf, 3, 0);
3565 IACSET(buf, 0xff, 0xfb, 0x03); /* IAC WILL Suppress go ahead */
3566 send(fd, (char *)buf, 3, 0);
3567 IACSET(buf, 0xff, 0xfb, 0x00); /* IAC WILL Binary */
3568 send(fd, (char *)buf, 3, 0);
3569 IACSET(buf, 0xff, 0xfd, 0x00); /* IAC DO Binary */
3570 send(fd, (char *)buf, 3, 0);
3571}
3572
pbrookf7499982007-01-28 00:10:01 +00003573static void socket_set_nodelay(int fd)
3574{
3575 int val = 1;
3576 setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
3577}
3578
bellard0bab00f2006-06-25 14:49:44 +00003579static void tcp_chr_accept(void *opaque)
3580{
3581 CharDriverState *chr = opaque;
3582 TCPCharDriver *s = chr->opaque;
3583 struct sockaddr_in saddr;
thsffd843b2006-12-21 19:46:43 +00003584#ifndef _WIN32
3585 struct sockaddr_un uaddr;
3586#endif
3587 struct sockaddr *addr;
bellard0bab00f2006-06-25 14:49:44 +00003588 socklen_t len;
3589 int fd;
3590
3591 for(;;) {
thsffd843b2006-12-21 19:46:43 +00003592#ifndef _WIN32
3593 if (s->is_unix) {
3594 len = sizeof(uaddr);
3595 addr = (struct sockaddr *)&uaddr;
3596 } else
3597#endif
3598 {
3599 len = sizeof(saddr);
3600 addr = (struct sockaddr *)&saddr;
3601 }
3602 fd = accept(s->listen_fd, addr, &len);
bellard0bab00f2006-06-25 14:49:44 +00003603 if (fd < 0 && errno != EINTR) {
3604 return;
3605 } else if (fd >= 0) {
bellard951f1352006-06-27 21:02:43 +00003606 if (s->do_telnetopt)
3607 tcp_chr_telnet_init(fd);
bellard0bab00f2006-06-25 14:49:44 +00003608 break;
3609 }
3610 }
3611 socket_set_nonblock(fd);
pbrookf7499982007-01-28 00:10:01 +00003612 if (s->do_nodelay)
3613 socket_set_nodelay(fd);
bellard0bab00f2006-06-25 14:49:44 +00003614 s->fd = fd;
3615 qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
3616 tcp_chr_connect(chr);
3617}
3618
3619static void tcp_chr_close(CharDriverState *chr)
3620{
3621 TCPCharDriver *s = chr->opaque;
3622 if (s->fd >= 0)
3623 closesocket(s->fd);
3624 if (s->listen_fd >= 0)
3625 closesocket(s->listen_fd);
3626 qemu_free(s);
3627}
3628
ths5fafdf22007-09-16 21:08:06 +00003629static CharDriverState *qemu_chr_open_tcp(const char *host_str,
thsffd843b2006-12-21 19:46:43 +00003630 int is_telnet,
3631 int is_unix)
bellard0bab00f2006-06-25 14:49:44 +00003632{
3633 CharDriverState *chr = NULL;
3634 TCPCharDriver *s = NULL;
3635 int fd = -1, ret, err, val;
bellard951f1352006-06-27 21:02:43 +00003636 int is_listen = 0;
3637 int is_waitconnect = 1;
pbrookf7499982007-01-28 00:10:01 +00003638 int do_nodelay = 0;
bellard951f1352006-06-27 21:02:43 +00003639 const char *ptr;
bellard0bab00f2006-06-25 14:49:44 +00003640 struct sockaddr_in saddr;
thsffd843b2006-12-21 19:46:43 +00003641#ifndef _WIN32
3642 struct sockaddr_un uaddr;
3643#endif
3644 struct sockaddr *addr;
3645 socklen_t addrlen;
bellard0bab00f2006-06-25 14:49:44 +00003646
thsffd843b2006-12-21 19:46:43 +00003647#ifndef _WIN32
3648 if (is_unix) {
3649 addr = (struct sockaddr *)&uaddr;
3650 addrlen = sizeof(uaddr);
3651 if (parse_unix_path(&uaddr, host_str) < 0)
3652 goto fail;
3653 } else
3654#endif
3655 {
3656 addr = (struct sockaddr *)&saddr;
3657 addrlen = sizeof(saddr);
3658 if (parse_host_port(&saddr, host_str) < 0)
3659 goto fail;
3660 }
bellard0bab00f2006-06-25 14:49:44 +00003661
bellard951f1352006-06-27 21:02:43 +00003662 ptr = host_str;
3663 while((ptr = strchr(ptr,','))) {
3664 ptr++;
3665 if (!strncmp(ptr,"server",6)) {
3666 is_listen = 1;
3667 } else if (!strncmp(ptr,"nowait",6)) {
3668 is_waitconnect = 0;
pbrookf7499982007-01-28 00:10:01 +00003669 } else if (!strncmp(ptr,"nodelay",6)) {
3670 do_nodelay = 1;
bellard951f1352006-06-27 21:02:43 +00003671 } else {
3672 printf("Unknown option: %s\n", ptr);
3673 goto fail;
3674 }
3675 }
3676 if (!is_listen)
3677 is_waitconnect = 0;
3678
bellard0bab00f2006-06-25 14:49:44 +00003679 chr = qemu_mallocz(sizeof(CharDriverState));
3680 if (!chr)
3681 goto fail;
3682 s = qemu_mallocz(sizeof(TCPCharDriver));
3683 if (!s)
3684 goto fail;
thsffd843b2006-12-21 19:46:43 +00003685
3686#ifndef _WIN32
3687 if (is_unix)
3688 fd = socket(PF_UNIX, SOCK_STREAM, 0);
3689 else
3690#endif
3691 fd = socket(PF_INET, SOCK_STREAM, 0);
ths5fafdf22007-09-16 21:08:06 +00003692
3693 if (fd < 0)
bellard0bab00f2006-06-25 14:49:44 +00003694 goto fail;
bellard951f1352006-06-27 21:02:43 +00003695
3696 if (!is_waitconnect)
3697 socket_set_nonblock(fd);
bellard0bab00f2006-06-25 14:49:44 +00003698
3699 s->connected = 0;
3700 s->fd = -1;
3701 s->listen_fd = -1;
thsffd843b2006-12-21 19:46:43 +00003702 s->is_unix = is_unix;
pbrookf7499982007-01-28 00:10:01 +00003703 s->do_nodelay = do_nodelay && !is_unix;
thsffd843b2006-12-21 19:46:43 +00003704
3705 chr->opaque = s;
3706 chr->chr_write = tcp_chr_write;
thsffd843b2006-12-21 19:46:43 +00003707 chr->chr_close = tcp_chr_close;
3708
bellard0bab00f2006-06-25 14:49:44 +00003709 if (is_listen) {
3710 /* allow fast reuse */
thsffd843b2006-12-21 19:46:43 +00003711#ifndef _WIN32
3712 if (is_unix) {
3713 char path[109];
bellardae45d362008-06-11 09:44:44 +00003714 pstrcpy(path, sizeof(path), uaddr.sun_path);
thsffd843b2006-12-21 19:46:43 +00003715 unlink(path);
3716 } else
3717#endif
3718 {
3719 val = 1;
3720 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
3721 }
ths3b46e622007-09-17 08:09:54 +00003722
thsffd843b2006-12-21 19:46:43 +00003723 ret = bind(fd, addr, addrlen);
3724 if (ret < 0)
bellard0bab00f2006-06-25 14:49:44 +00003725 goto fail;
thsffd843b2006-12-21 19:46:43 +00003726
bellard0bab00f2006-06-25 14:49:44 +00003727 ret = listen(fd, 0);
3728 if (ret < 0)
3729 goto fail;
thsffd843b2006-12-21 19:46:43 +00003730
bellard0bab00f2006-06-25 14:49:44 +00003731 s->listen_fd = fd;
3732 qemu_set_fd_handler(s->listen_fd, tcp_chr_accept, NULL, chr);
bellard951f1352006-06-27 21:02:43 +00003733 if (is_telnet)
3734 s->do_telnetopt = 1;
bellard0bab00f2006-06-25 14:49:44 +00003735 } else {
3736 for(;;) {
thsffd843b2006-12-21 19:46:43 +00003737 ret = connect(fd, addr, addrlen);
bellard0bab00f2006-06-25 14:49:44 +00003738 if (ret < 0) {
3739 err = socket_error();
3740 if (err == EINTR || err == EWOULDBLOCK) {
3741 } else if (err == EINPROGRESS) {
3742 break;
thsf5b12262007-03-25 15:58:03 +00003743#ifdef _WIN32
3744 } else if (err == WSAEALREADY) {
3745 break;
3746#endif
bellard0bab00f2006-06-25 14:49:44 +00003747 } else {
3748 goto fail;
3749 }
3750 } else {
3751 s->connected = 1;
3752 break;
3753 }
3754 }
3755 s->fd = fd;
pbrookf7499982007-01-28 00:10:01 +00003756 socket_set_nodelay(fd);
bellard0bab00f2006-06-25 14:49:44 +00003757 if (s->connected)
3758 tcp_chr_connect(chr);
3759 else
3760 qemu_set_fd_handler(s->fd, NULL, tcp_chr_connect, chr);
3761 }
ths3b46e622007-09-17 08:09:54 +00003762
bellard951f1352006-06-27 21:02:43 +00003763 if (is_listen && is_waitconnect) {
3764 printf("QEMU waiting for connection on: %s\n", host_str);
3765 tcp_chr_accept(chr);
3766 socket_set_nonblock(s->listen_fd);
3767 }
3768
bellard0bab00f2006-06-25 14:49:44 +00003769 return chr;
3770 fail:
3771 if (fd >= 0)
3772 closesocket(fd);
3773 qemu_free(s);
3774 qemu_free(chr);
3775 return NULL;
3776}
3777
bellard82c643f2004-07-14 17:28:13 +00003778CharDriverState *qemu_chr_open(const char *filename)
3779{
bellardf8d179e2005-11-08 22:30:36 +00003780 const char *p;
bellardfd1dff42006-02-01 21:29:26 +00003781
bellard82c643f2004-07-14 17:28:13 +00003782 if (!strcmp(filename, "vc")) {
thsaf3a9032007-07-11 23:14:59 +00003783 return text_console_init(&display_state, 0);
3784 } else if (strstart(filename, "vc:", &p)) {
3785 return text_console_init(&display_state, p);
bellard82c643f2004-07-14 17:28:13 +00003786 } else if (!strcmp(filename, "null")) {
3787 return qemu_chr_open_null();
ths5fafdf22007-09-16 21:08:06 +00003788 } else
bellard0bab00f2006-06-25 14:49:44 +00003789 if (strstart(filename, "tcp:", &p)) {
thsffd843b2006-12-21 19:46:43 +00003790 return qemu_chr_open_tcp(p, 0, 0);
bellard0bab00f2006-06-25 14:49:44 +00003791 } else
bellard951f1352006-06-27 21:02:43 +00003792 if (strstart(filename, "telnet:", &p)) {
thsffd843b2006-12-21 19:46:43 +00003793 return qemu_chr_open_tcp(p, 1, 0);
bellard0bab00f2006-06-25 14:49:44 +00003794 } else
3795 if (strstart(filename, "udp:", &p)) {
3796 return qemu_chr_open_udp(p);
3797 } else
ths20d8a3e2007-02-18 17:04:49 +00003798 if (strstart(filename, "mon:", &p)) {
3799 CharDriverState *drv = qemu_chr_open(p);
3800 if (drv) {
3801 drv = qemu_chr_open_mux(drv);
3802 monitor_init(drv, !nographic);
3803 return drv;
3804 }
3805 printf("Unable to open driver: %s\n", p);
3806 return 0;
3807 } else
bellard76647282005-11-27 19:10:42 +00003808#ifndef _WIN32
thsffd843b2006-12-21 19:46:43 +00003809 if (strstart(filename, "unix:", &p)) {
3810 return qemu_chr_open_tcp(p, 0, 1);
3811 } else if (strstart(filename, "file:", &p)) {
bellardf8d179e2005-11-08 22:30:36 +00003812 return qemu_chr_open_file_out(p);
3813 } else if (strstart(filename, "pipe:", &p)) {
3814 return qemu_chr_open_pipe(p);
bellard76647282005-11-27 19:10:42 +00003815 } else if (!strcmp(filename, "pty")) {
bellard82c643f2004-07-14 17:28:13 +00003816 return qemu_chr_open_pty();
3817 } else if (!strcmp(filename, "stdio")) {
3818 return qemu_chr_open_stdio();
ths5fafdf22007-09-16 21:08:06 +00003819 } else
bellardf8d179e2005-11-08 22:30:36 +00003820#if defined(__linux__)
bellarde57a8c02005-11-10 23:58:52 +00003821 if (strstart(filename, "/dev/parport", NULL)) {
3822 return qemu_chr_open_pp(filename);
ths5fafdf22007-09-16 21:08:06 +00003823 } else
thsaec62502007-06-25 11:48:07 +00003824#endif
blueswir19892fbf2008-08-24 10:34:20 +00003825#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
3826 || defined(__NetBSD__) || defined(__OpenBSD__)
bellardf8d179e2005-11-08 22:30:36 +00003827 if (strstart(filename, "/dev/", NULL)) {
3828 return qemu_chr_open_tty(filename);
ths3fda3882007-06-28 15:14:49 +00003829 } else
3830#endif
thsaec62502007-06-25 11:48:07 +00003831#else /* !_WIN32 */
bellardf3311102006-04-12 20:21:17 +00003832 if (strstart(filename, "COM", NULL)) {
3833 return qemu_chr_open_win(filename);
3834 } else
3835 if (strstart(filename, "pipe:", &p)) {
3836 return qemu_chr_open_win_pipe(p);
3837 } else
ths72d46472007-05-13 14:54:54 +00003838 if (strstart(filename, "con:", NULL)) {
3839 return qemu_chr_open_win_con(filename);
3840 } else
bellardf3311102006-04-12 20:21:17 +00003841 if (strstart(filename, "file:", &p)) {
3842 return qemu_chr_open_win_file_out(p);
aurel322e4d9fb2008-04-08 06:01:02 +00003843 } else
3844#endif
3845#ifdef CONFIG_BRLAPI
3846 if (!strcmp(filename, "braille")) {
3847 return chr_baum_init();
3848 } else
bellardf3311102006-04-12 20:21:17 +00003849#endif
bellard82c643f2004-07-14 17:28:13 +00003850 {
3851 return NULL;
3852 }
3853}
3854
bellardf3311102006-04-12 20:21:17 +00003855void qemu_chr_close(CharDriverState *chr)
3856{
3857 if (chr->chr_close)
3858 chr->chr_close(chr);
balroga11d0702008-01-19 13:00:43 +00003859 qemu_free(chr);
bellardf3311102006-04-12 20:21:17 +00003860}
3861
bellardf1510b22003-06-25 00:07:40 +00003862/***********************************************************/
bellard7c9d8e02005-11-15 22:16:05 +00003863/* network device redirectors */
bellardf1510b22003-06-25 00:07:40 +00003864
j_mayer3f4afa12007-11-19 01:05:22 +00003865__attribute__ (( unused ))
pbrook9596ebb2007-11-18 01:44:38 +00003866static void hex_dump(FILE *f, const uint8_t *buf, int size)
bellard67b915a2004-03-31 23:37:16 +00003867{
bellardc20709a2004-04-21 23:27:19 +00003868 int len, i, j, c;
3869
3870 for(i=0;i<size;i+=16) {
3871 len = size - i;
3872 if (len > 16)
3873 len = 16;
3874 fprintf(f, "%08x ", i);
3875 for(j=0;j<16;j++) {
3876 if (j < len)
3877 fprintf(f, " %02x", buf[i+j]);
3878 else
3879 fprintf(f, " ");
3880 }
3881 fprintf(f, " ");
3882 for(j=0;j<len;j++) {
3883 c = buf[i+j];
3884 if (c < ' ' || c > '~')
3885 c = '.';
3886 fprintf(f, "%c", c);
3887 }
3888 fprintf(f, "\n");
3889 }
3890}
3891
bellard7c9d8e02005-11-15 22:16:05 +00003892static int parse_macaddr(uint8_t *macaddr, const char *p)
bellardc20709a2004-04-21 23:27:19 +00003893{
bellard7c9d8e02005-11-15 22:16:05 +00003894 int i;
balrog76ea08f2007-12-16 11:48:54 +00003895 char *last_char;
3896 long int offset;
3897
3898 errno = 0;
3899 offset = strtol(p, &last_char, 0);
3900 if (0 == errno && '\0' == *last_char &&
3901 offset >= 0 && offset <= 0xFFFFFF) {
3902 macaddr[3] = (offset & 0xFF0000) >> 16;
3903 macaddr[4] = (offset & 0xFF00) >> 8;
3904 macaddr[5] = offset & 0xFF;
3905 return 0;
3906 } else {
3907 for(i = 0; i < 6; i++) {
3908 macaddr[i] = strtol(p, (char **)&p, 16);
3909 if (i == 5) {
3910 if (*p != '\0')
3911 return -1;
3912 } else {
3913 if (*p != ':' && *p != '-')
3914 return -1;
3915 p++;
3916 }
bellard7c9d8e02005-11-15 22:16:05 +00003917 }
balrog76ea08f2007-12-16 11:48:54 +00003918 return 0;
bellardc20709a2004-04-21 23:27:19 +00003919 }
balrog76ea08f2007-12-16 11:48:54 +00003920
3921 return -1;
bellardc20709a2004-04-21 23:27:19 +00003922}
3923
bellard9bf05442004-08-25 22:12:49 +00003924static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
3925{
3926 const char *p, *p1;
3927 int len;
3928 p = *pp;
3929 p1 = strchr(p, sep);
3930 if (!p1)
3931 return -1;
3932 len = p1 - p;
3933 p1++;
3934 if (buf_size > 0) {
3935 if (len > buf_size - 1)
3936 len = buf_size - 1;
3937 memcpy(buf, p, len);
3938 buf[len] = '\0';
3939 }
3940 *pp = p1;
3941 return 0;
3942}
3943
bellard951f1352006-06-27 21:02:43 +00003944int parse_host_src_port(struct sockaddr_in *haddr,
3945 struct sockaddr_in *saddr,
3946 const char *input_str)
3947{
3948 char *str = strdup(input_str);
3949 char *host_str = str;
3950 char *src_str;
blueswir17ccfb2e2008-09-14 06:45:34 +00003951 const char *src_str2;
bellard951f1352006-06-27 21:02:43 +00003952 char *ptr;
3953
3954 /*
3955 * Chop off any extra arguments at the end of the string which
3956 * would start with a comma, then fill in the src port information
3957 * if it was provided else use the "any address" and "any port".
3958 */
3959 if ((ptr = strchr(str,',')))
3960 *ptr = '\0';
3961
3962 if ((src_str = strchr(input_str,'@'))) {
3963 *src_str = '\0';
3964 src_str++;
3965 }
3966
3967 if (parse_host_port(haddr, host_str) < 0)
3968 goto fail;
3969
blueswir17ccfb2e2008-09-14 06:45:34 +00003970 src_str2 = src_str;
bellard951f1352006-06-27 21:02:43 +00003971 if (!src_str || *src_str == '\0')
blueswir17ccfb2e2008-09-14 06:45:34 +00003972 src_str2 = ":0";
bellard951f1352006-06-27 21:02:43 +00003973
blueswir17ccfb2e2008-09-14 06:45:34 +00003974 if (parse_host_port(saddr, src_str2) < 0)
bellard951f1352006-06-27 21:02:43 +00003975 goto fail;
3976
3977 free(str);
3978 return(0);
3979
3980fail:
3981 free(str);
3982 return -1;
3983}
3984
bellard7c9d8e02005-11-15 22:16:05 +00003985int parse_host_port(struct sockaddr_in *saddr, const char *str)
3986{
3987 char buf[512];
3988 struct hostent *he;
3989 const char *p, *r;
3990 int port;
3991
3992 p = str;
3993 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3994 return -1;
3995 saddr->sin_family = AF_INET;
3996 if (buf[0] == '\0') {
3997 saddr->sin_addr.s_addr = 0;
3998 } else {
3999 if (isdigit(buf[0])) {
4000 if (!inet_aton(buf, &saddr->sin_addr))
4001 return -1;
4002 } else {
bellard7c9d8e02005-11-15 22:16:05 +00004003 if ((he = gethostbyname(buf)) == NULL)
4004 return - 1;
4005 saddr->sin_addr = *(struct in_addr *)he->h_addr;
bellard7c9d8e02005-11-15 22:16:05 +00004006 }
4007 }
4008 port = strtol(p, (char **)&r, 0);
4009 if (r == p)
4010 return -1;
4011 saddr->sin_port = htons(port);
4012 return 0;
4013}
4014
ths52f61fd2006-12-22 21:20:52 +00004015#ifndef _WIN32
4016static int parse_unix_path(struct sockaddr_un *uaddr, const char *str)
thsffd843b2006-12-21 19:46:43 +00004017{
4018 const char *p;
4019 int len;
4020
4021 len = MIN(108, strlen(str));
4022 p = strchr(str, ',');
4023 if (p)
4024 len = MIN(len, p - str);
4025
4026 memset(uaddr, 0, sizeof(*uaddr));
4027
4028 uaddr->sun_family = AF_UNIX;
4029 memcpy(uaddr->sun_path, str, len);
4030
4031 return 0;
4032}
ths52f61fd2006-12-22 21:20:52 +00004033#endif
thsffd843b2006-12-21 19:46:43 +00004034
bellard7c9d8e02005-11-15 22:16:05 +00004035/* find or alloc a new VLAN */
4036VLANState *qemu_find_vlan(int id)
4037{
4038 VLANState **pvlan, *vlan;
4039 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
4040 if (vlan->id == id)
4041 return vlan;
4042 }
4043 vlan = qemu_mallocz(sizeof(VLANState));
4044 if (!vlan)
4045 return NULL;
4046 vlan->id = id;
4047 vlan->next = NULL;
4048 pvlan = &first_vlan;
4049 while (*pvlan != NULL)
4050 pvlan = &(*pvlan)->next;
4051 *pvlan = vlan;
4052 return vlan;
4053}
4054
4055VLANClientState *qemu_new_vlan_client(VLANState *vlan,
pbrookd861b052006-02-04 22:15:28 +00004056 IOReadHandler *fd_read,
4057 IOCanRWHandler *fd_can_read,
4058 void *opaque)
bellard7c9d8e02005-11-15 22:16:05 +00004059{
4060 VLANClientState *vc, **pvc;
4061 vc = qemu_mallocz(sizeof(VLANClientState));
4062 if (!vc)
4063 return NULL;
4064 vc->fd_read = fd_read;
pbrookd861b052006-02-04 22:15:28 +00004065 vc->fd_can_read = fd_can_read;
bellard7c9d8e02005-11-15 22:16:05 +00004066 vc->opaque = opaque;
4067 vc->vlan = vlan;
4068
4069 vc->next = NULL;
4070 pvc = &vlan->first_client;
4071 while (*pvc != NULL)
4072 pvc = &(*pvc)->next;
4073 *pvc = vc;
4074 return vc;
4075}
4076
balrogdcf414d2008-07-17 21:00:05 +00004077void qemu_del_vlan_client(VLANClientState *vc)
4078{
4079 VLANClientState **pvc = &vc->vlan->first_client;
4080
4081 while (*pvc != NULL)
4082 if (*pvc == vc) {
4083 *pvc = vc->next;
4084 free(vc);
4085 break;
4086 } else
4087 pvc = &(*pvc)->next;
4088}
4089
pbrookd861b052006-02-04 22:15:28 +00004090int qemu_can_send_packet(VLANClientState *vc1)
4091{
4092 VLANState *vlan = vc1->vlan;
4093 VLANClientState *vc;
4094
4095 for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
4096 if (vc != vc1) {
balrogfbd17112007-07-02 13:31:53 +00004097 if (vc->fd_can_read && vc->fd_can_read(vc->opaque))
4098 return 1;
pbrookd861b052006-02-04 22:15:28 +00004099 }
4100 }
balrogfbd17112007-07-02 13:31:53 +00004101 return 0;
pbrookd861b052006-02-04 22:15:28 +00004102}
4103
bellard7c9d8e02005-11-15 22:16:05 +00004104void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size)
4105{
4106 VLANState *vlan = vc1->vlan;
4107 VLANClientState *vc;
4108
4109#if 0
4110 printf("vlan %d send:\n", vlan->id);
4111 hex_dump(stdout, buf, size);
4112#endif
4113 for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
4114 if (vc != vc1) {
4115 vc->fd_read(vc->opaque, buf, size);
4116 }
4117 }
4118}
4119
4120#if defined(CONFIG_SLIRP)
4121
4122/* slirp network adapter */
4123
4124static int slirp_inited;
4125static VLANClientState *slirp_vc;
4126
4127int slirp_can_output(void)
4128{
pbrook3b7f5d42006-02-10 17:34:02 +00004129 return !slirp_vc || qemu_can_send_packet(slirp_vc);
bellard7c9d8e02005-11-15 22:16:05 +00004130}
4131
4132void slirp_output(const uint8_t *pkt, int pkt_len)
4133{
4134#if 0
4135 printf("slirp output:\n");
4136 hex_dump(stdout, pkt, pkt_len);
4137#endif
pbrook3b7f5d42006-02-10 17:34:02 +00004138 if (!slirp_vc)
4139 return;
bellard7c9d8e02005-11-15 22:16:05 +00004140 qemu_send_packet(slirp_vc, pkt, pkt_len);
4141}
4142
4143static void slirp_receive(void *opaque, const uint8_t *buf, int size)
4144{
4145#if 0
4146 printf("slirp input:\n");
4147 hex_dump(stdout, buf, size);
4148#endif
4149 slirp_input(buf, size);
4150}
4151
4152static int net_slirp_init(VLANState *vlan)
4153{
4154 if (!slirp_inited) {
4155 slirp_inited = 1;
4156 slirp_init();
4157 }
ths5fafdf22007-09-16 21:08:06 +00004158 slirp_vc = qemu_new_vlan_client(vlan,
pbrookd861b052006-02-04 22:15:28 +00004159 slirp_receive, NULL, NULL);
bellard7c9d8e02005-11-15 22:16:05 +00004160 snprintf(slirp_vc->info_str, sizeof(slirp_vc->info_str), "user redirector");
4161 return 0;
4162}
4163
bellard9bf05442004-08-25 22:12:49 +00004164static void net_slirp_redir(const char *redir_str)
4165{
4166 int is_udp;
4167 char buf[256], *r;
4168 const char *p;
4169 struct in_addr guest_addr;
4170 int host_port, guest_port;
ths3b46e622007-09-17 08:09:54 +00004171
bellard9bf05442004-08-25 22:12:49 +00004172 if (!slirp_inited) {
4173 slirp_inited = 1;
4174 slirp_init();
4175 }
4176
4177 p = redir_str;
4178 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
4179 goto fail;
4180 if (!strcmp(buf, "tcp")) {
4181 is_udp = 0;
4182 } else if (!strcmp(buf, "udp")) {
4183 is_udp = 1;
4184 } else {
4185 goto fail;
4186 }
4187
4188 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
4189 goto fail;
4190 host_port = strtol(buf, &r, 0);
4191 if (r == buf)
4192 goto fail;
4193
4194 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
4195 goto fail;
4196 if (buf[0] == '\0') {
4197 pstrcpy(buf, sizeof(buf), "10.0.2.15");
4198 }
4199 if (!inet_aton(buf, &guest_addr))
4200 goto fail;
ths3b46e622007-09-17 08:09:54 +00004201
bellard9bf05442004-08-25 22:12:49 +00004202 guest_port = strtol(p, &r, 0);
4203 if (r == p)
4204 goto fail;
ths3b46e622007-09-17 08:09:54 +00004205
bellard9bf05442004-08-25 22:12:49 +00004206 if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
4207 fprintf(stderr, "qemu: could not set up redirection\n");
4208 exit(1);
4209 }
4210 return;
4211 fail:
4212 fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n");
4213 exit(1);
4214}
ths3b46e622007-09-17 08:09:54 +00004215
bellardc94c8d62004-09-13 21:37:34 +00004216#ifndef _WIN32
4217
bellard9d728e82004-09-05 23:09:03 +00004218char smb_dir[1024];
4219
balrog044fae82008-01-14 03:11:16 +00004220static void erase_dir(char *dir_name)
bellard9d728e82004-09-05 23:09:03 +00004221{
4222 DIR *d;
4223 struct dirent *de;
4224 char filename[1024];
4225
4226 /* erase all the files in the directory */
balrog044fae82008-01-14 03:11:16 +00004227 if ((d = opendir(dir_name)) != 0) {
4228 for(;;) {
4229 de = readdir(d);
4230 if (!de)
4231 break;
4232 if (strcmp(de->d_name, ".") != 0 &&
4233 strcmp(de->d_name, "..") != 0) {
4234 snprintf(filename, sizeof(filename), "%s/%s",
4235 smb_dir, de->d_name);
4236 if (unlink(filename) != 0) /* is it a directory? */
4237 erase_dir(filename);
4238 }
bellard9d728e82004-09-05 23:09:03 +00004239 }
balrog044fae82008-01-14 03:11:16 +00004240 closedir(d);
4241 rmdir(dir_name);
bellard9d728e82004-09-05 23:09:03 +00004242 }
balrog044fae82008-01-14 03:11:16 +00004243}
4244
4245/* automatic user mode samba server configuration */
4246static void smb_exit(void)
4247{
4248 erase_dir(smb_dir);
bellard9d728e82004-09-05 23:09:03 +00004249}
4250
4251/* automatic user mode samba server configuration */
pbrook9596ebb2007-11-18 01:44:38 +00004252static void net_slirp_smb(const char *exported_dir)
bellard9d728e82004-09-05 23:09:03 +00004253{
4254 char smb_conf[1024];
4255 char smb_cmdline[1024];
4256 FILE *f;
4257
4258 if (!slirp_inited) {
4259 slirp_inited = 1;
4260 slirp_init();
4261 }
4262
4263 /* XXX: better tmp dir construction */
4264 snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%d", getpid());
4265 if (mkdir(smb_dir, 0700) < 0) {
4266 fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
4267 exit(1);
4268 }
4269 snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
ths3b46e622007-09-17 08:09:54 +00004270
bellard9d728e82004-09-05 23:09:03 +00004271 f = fopen(smb_conf, "w");
4272 if (!f) {
4273 fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
4274 exit(1);
4275 }
ths5fafdf22007-09-16 21:08:06 +00004276 fprintf(f,
bellard9d728e82004-09-05 23:09:03 +00004277 "[global]\n"
bellard157777e2005-03-01 21:28:45 +00004278 "private dir=%s\n"
4279 "smb ports=0\n"
4280 "socket address=127.0.0.1\n"
bellard9d728e82004-09-05 23:09:03 +00004281 "pid directory=%s\n"
4282 "lock directory=%s\n"
4283 "log file=%s/log.smbd\n"
4284 "smb passwd file=%s/smbpasswd\n"
bellard03ffbb62004-09-06 00:14:04 +00004285 "security = share\n"
bellard9d728e82004-09-05 23:09:03 +00004286 "[qemu]\n"
4287 "path=%s\n"
4288 "read only=no\n"
4289 "guest ok=yes\n",
4290 smb_dir,
4291 smb_dir,
4292 smb_dir,
4293 smb_dir,
bellard157777e2005-03-01 21:28:45 +00004294 smb_dir,
bellard9d728e82004-09-05 23:09:03 +00004295 exported_dir
4296 );
4297 fclose(f);
4298 atexit(smb_exit);
4299
pbrooka14d6c82006-12-23 15:37:33 +00004300 snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
4301 SMBD_COMMAND, smb_conf);
ths3b46e622007-09-17 08:09:54 +00004302
bellard9d728e82004-09-05 23:09:03 +00004303 slirp_add_exec(0, smb_cmdline, 4, 139);
4304}
bellard9bf05442004-08-25 22:12:49 +00004305
bellardc94c8d62004-09-13 21:37:34 +00004306#endif /* !defined(_WIN32) */
blueswir131a60e22007-10-26 18:42:59 +00004307void do_info_slirp(void)
4308{
4309 slirp_stats();
4310}
bellardc94c8d62004-09-13 21:37:34 +00004311
bellardc20709a2004-04-21 23:27:19 +00004312#endif /* CONFIG_SLIRP */
4313
4314#if !defined(_WIN32)
bellard7c9d8e02005-11-15 22:16:05 +00004315
4316typedef struct TAPState {
4317 VLANClientState *vc;
4318 int fd;
thsb46a8902007-10-21 23:20:45 +00004319 char down_script[1024];
bellard7c9d8e02005-11-15 22:16:05 +00004320} TAPState;
4321
4322static void tap_receive(void *opaque, const uint8_t *buf, int size)
4323{
4324 TAPState *s = opaque;
4325 int ret;
4326 for(;;) {
4327 ret = write(s->fd, buf, size);
4328 if (ret < 0 && (errno == EINTR || errno == EAGAIN)) {
4329 } else {
4330 break;
4331 }
4332 }
4333}
4334
4335static void tap_send(void *opaque)
4336{
4337 TAPState *s = opaque;
4338 uint8_t buf[4096];
4339 int size;
4340
thsd5d10bc2007-02-17 22:54:49 +00004341#ifdef __sun__
4342 struct strbuf sbuf;
4343 int f = 0;
4344 sbuf.maxlen = sizeof(buf);
4345 sbuf.buf = buf;
4346 size = getmsg(s->fd, NULL, &sbuf, &f) >=0 ? sbuf.len : -1;
4347#else
bellard7c9d8e02005-11-15 22:16:05 +00004348 size = read(s->fd, buf, sizeof(buf));
thsd5d10bc2007-02-17 22:54:49 +00004349#endif
bellard7c9d8e02005-11-15 22:16:05 +00004350 if (size > 0) {
4351 qemu_send_packet(s->vc, buf, size);
4352 }
4353}
4354
4355/* fd support */
4356
4357static TAPState *net_tap_fd_init(VLANState *vlan, int fd)
4358{
4359 TAPState *s;
4360
4361 s = qemu_mallocz(sizeof(TAPState));
4362 if (!s)
4363 return NULL;
4364 s->fd = fd;
pbrookd861b052006-02-04 22:15:28 +00004365 s->vc = qemu_new_vlan_client(vlan, tap_receive, NULL, s);
bellard7c9d8e02005-11-15 22:16:05 +00004366 qemu_set_fd_handler(s->fd, tap_send, NULL, s);
4367 snprintf(s->vc->info_str, sizeof(s->vc->info_str), "tap: fd=%d", fd);
4368 return s;
4369}
4370
ths5c40d2b2007-06-23 16:03:36 +00004371#if defined (_BSD) || defined (__FreeBSD_kernel__)
bellard7c9d8e02005-11-15 22:16:05 +00004372static int tap_open(char *ifname, int ifname_size)
bellard7d3505c2004-05-12 19:32:15 +00004373{
4374 int fd;
4375 char *dev;
4376 struct stat s;
bellard67b915a2004-03-31 23:37:16 +00004377
balrogaeb30be2007-07-02 15:03:13 +00004378 TFR(fd = open("/dev/tap", O_RDWR));
bellard7d3505c2004-05-12 19:32:15 +00004379 if (fd < 0) {
4380 fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
4381 return -1;
4382 }
4383
4384 fstat(fd, &s);
4385 dev = devname(s.st_rdev, S_IFCHR);
4386 pstrcpy(ifname, ifname_size, dev);
4387
4388 fcntl(fd, F_SETFL, O_NONBLOCK);
4389 return fd;
4390}
bellardec530c82006-04-25 22:36:06 +00004391#elif defined(__sun__)
thsd5d10bc2007-02-17 22:54:49 +00004392#define TUNNEWPPA (('T'<<16) | 0x0001)
ths5fafdf22007-09-16 21:08:06 +00004393/*
4394 * Allocate TAP device, returns opened fd.
thsd5d10bc2007-02-17 22:54:49 +00004395 * Stores dev name in the first arg(must be large enough).
ths3b46e622007-09-17 08:09:54 +00004396 */
blueswir1363a37d2008-08-21 17:58:08 +00004397int tap_alloc(char *dev, size_t dev_size)
thsd5d10bc2007-02-17 22:54:49 +00004398{
4399 int tap_fd, if_fd, ppa = -1;
4400 static int ip_fd = 0;
4401 char *ptr;
4402
4403 static int arp_fd = 0;
4404 int ip_muxid, arp_muxid;
4405 struct strioctl strioc_if, strioc_ppa;
4406 int link_type = I_PLINK;;
4407 struct lifreq ifr;
4408 char actual_name[32] = "";
4409
4410 memset(&ifr, 0x0, sizeof(ifr));
4411
4412 if( *dev ){
ths5fafdf22007-09-16 21:08:06 +00004413 ptr = dev;
4414 while( *ptr && !isdigit((int)*ptr) ) ptr++;
thsd5d10bc2007-02-17 22:54:49 +00004415 ppa = atoi(ptr);
4416 }
4417
4418 /* Check if IP device was opened */
4419 if( ip_fd )
4420 close(ip_fd);
4421
balrogaeb30be2007-07-02 15:03:13 +00004422 TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
4423 if (ip_fd < 0) {
thsd5d10bc2007-02-17 22:54:49 +00004424 syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
4425 return -1;
4426 }
4427
balrogaeb30be2007-07-02 15:03:13 +00004428 TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
4429 if (tap_fd < 0) {
thsd5d10bc2007-02-17 22:54:49 +00004430 syslog(LOG_ERR, "Can't open /dev/tap");
4431 return -1;
4432 }
4433
4434 /* Assign a new PPA and get its unit number. */
4435 strioc_ppa.ic_cmd = TUNNEWPPA;
4436 strioc_ppa.ic_timout = 0;
4437 strioc_ppa.ic_len = sizeof(ppa);
4438 strioc_ppa.ic_dp = (char *)&ppa;
4439 if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
4440 syslog (LOG_ERR, "Can't assign new interface");
4441
balrogaeb30be2007-07-02 15:03:13 +00004442 TFR(if_fd = open("/dev/tap", O_RDWR, 0));
4443 if (if_fd < 0) {
thsd5d10bc2007-02-17 22:54:49 +00004444 syslog(LOG_ERR, "Can't open /dev/tap (2)");
4445 return -1;
4446 }
4447 if(ioctl(if_fd, I_PUSH, "ip") < 0){
4448 syslog(LOG_ERR, "Can't push IP module");
4449 return -1;
4450 }
4451
4452 if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
4453 syslog(LOG_ERR, "Can't get flags\n");
4454
4455 snprintf (actual_name, 32, "tap%d", ppa);
4456 strncpy (ifr.lifr_name, actual_name, sizeof (ifr.lifr_name));
4457
4458 ifr.lifr_ppa = ppa;
4459 /* Assign ppa according to the unit number returned by tun device */
4460
4461 if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
4462 syslog (LOG_ERR, "Can't set PPA %d", ppa);
4463 if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
4464 syslog (LOG_ERR, "Can't get flags\n");
4465 /* Push arp module to if_fd */
4466 if (ioctl (if_fd, I_PUSH, "arp") < 0)
4467 syslog (LOG_ERR, "Can't push ARP module (2)");
4468
4469 /* Push arp module to ip_fd */
4470 if (ioctl (ip_fd, I_POP, NULL) < 0)
4471 syslog (LOG_ERR, "I_POP failed\n");
4472 if (ioctl (ip_fd, I_PUSH, "arp") < 0)
4473 syslog (LOG_ERR, "Can't push ARP module (3)\n");
4474 /* Open arp_fd */
balrogaeb30be2007-07-02 15:03:13 +00004475 TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
4476 if (arp_fd < 0)
thsd5d10bc2007-02-17 22:54:49 +00004477 syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
4478
4479 /* Set ifname to arp */
4480 strioc_if.ic_cmd = SIOCSLIFNAME;
4481 strioc_if.ic_timout = 0;
4482 strioc_if.ic_len = sizeof(ifr);
4483 strioc_if.ic_dp = (char *)&ifr;
4484 if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
4485 syslog (LOG_ERR, "Can't set ifname to arp\n");
4486 }
4487
4488 if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
4489 syslog(LOG_ERR, "Can't link TAP device to IP");
4490 return -1;
4491 }
4492
4493 if ((arp_muxid = ioctl (ip_fd, link_type, arp_fd)) < 0)
4494 syslog (LOG_ERR, "Can't link TAP device to ARP");
4495
4496 close (if_fd);
4497
4498 memset(&ifr, 0x0, sizeof(ifr));
4499 strncpy (ifr.lifr_name, actual_name, sizeof (ifr.lifr_name));
4500 ifr.lifr_ip_muxid = ip_muxid;
4501 ifr.lifr_arp_muxid = arp_muxid;
4502
4503 if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
4504 {
4505 ioctl (ip_fd, I_PUNLINK , arp_muxid);
4506 ioctl (ip_fd, I_PUNLINK, ip_muxid);
4507 syslog (LOG_ERR, "Can't set multiplexor id");
4508 }
4509
blueswir1363a37d2008-08-21 17:58:08 +00004510 snprintf(dev, dev_size, "tap%d", ppa);
thsd5d10bc2007-02-17 22:54:49 +00004511 return tap_fd;
4512}
4513
bellardec530c82006-04-25 22:36:06 +00004514static int tap_open(char *ifname, int ifname_size)
4515{
thsd5d10bc2007-02-17 22:54:49 +00004516 char dev[10]="";
4517 int fd;
blueswir1363a37d2008-08-21 17:58:08 +00004518 if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
thsd5d10bc2007-02-17 22:54:49 +00004519 fprintf(stderr, "Cannot allocate TAP device\n");
4520 return -1;
4521 }
4522 pstrcpy(ifname, ifname_size, dev);
4523 fcntl(fd, F_SETFL, O_NONBLOCK);
4524 return fd;
bellardec530c82006-04-25 22:36:06 +00004525}
bellard7d3505c2004-05-12 19:32:15 +00004526#else
bellard7c9d8e02005-11-15 22:16:05 +00004527static int tap_open(char *ifname, int ifname_size)
bellardf1510b22003-06-25 00:07:40 +00004528{
4529 struct ifreq ifr;
bellardc4b1fcc2004-03-14 21:44:30 +00004530 int fd, ret;
ths3b46e622007-09-17 08:09:54 +00004531
balrogaeb30be2007-07-02 15:03:13 +00004532 TFR(fd = open("/dev/net/tun", O_RDWR));
bellardf1510b22003-06-25 00:07:40 +00004533 if (fd < 0) {
4534 fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
4535 return -1;
4536 }
4537 memset(&ifr, 0, sizeof(ifr));
4538 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
bellard7c9d8e02005-11-15 22:16:05 +00004539 if (ifname[0] != '\0')
4540 pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
4541 else
4542 pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
bellardf1510b22003-06-25 00:07:40 +00004543 ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
4544 if (ret != 0) {
4545 fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
4546 close(fd);
4547 return -1;
4548 }
bellardc4b1fcc2004-03-14 21:44:30 +00004549 pstrcpy(ifname, ifname_size, ifr.ifr_name);
bellardf1510b22003-06-25 00:07:40 +00004550 fcntl(fd, F_SETFL, O_NONBLOCK);
bellardc4b1fcc2004-03-14 21:44:30 +00004551 return fd;
4552}
bellard7d3505c2004-05-12 19:32:15 +00004553#endif
bellardf1510b22003-06-25 00:07:40 +00004554
thsb46a8902007-10-21 23:20:45 +00004555static int launch_script(const char *setup_script, const char *ifname, int fd)
bellardc4b1fcc2004-03-14 21:44:30 +00004556{
thsb46a8902007-10-21 23:20:45 +00004557 int pid, status;
bellardc20709a2004-04-21 23:27:19 +00004558 char *args[3];
4559 char **parg;
4560
thsb46a8902007-10-21 23:20:45 +00004561 /* try to launch network script */
bellard7c9d8e02005-11-15 22:16:05 +00004562 pid = fork();
4563 if (pid >= 0) {
4564 if (pid == 0) {
ths50d3eea2007-03-19 16:36:43 +00004565 int open_max = sysconf (_SC_OPEN_MAX), i;
4566 for (i = 0; i < open_max; i++)
4567 if (i != STDIN_FILENO &&
4568 i != STDOUT_FILENO &&
4569 i != STDERR_FILENO &&
4570 i != fd)
4571 close(i);
4572
bellard7c9d8e02005-11-15 22:16:05 +00004573 parg = args;
4574 *parg++ = (char *)setup_script;
thsb46a8902007-10-21 23:20:45 +00004575 *parg++ = (char *)ifname;
bellard7c9d8e02005-11-15 22:16:05 +00004576 *parg++ = NULL;
4577 execv(setup_script, args);
bellard4a389402005-11-26 20:10:07 +00004578 _exit(1);
bellard7c9d8e02005-11-15 22:16:05 +00004579 }
4580 while (waitpid(pid, &status, 0) != pid);
4581 if (!WIFEXITED(status) ||
4582 WEXITSTATUS(status) != 0) {
4583 fprintf(stderr, "%s: could not launch network script\n",
4584 setup_script);
4585 return -1;
4586 }
bellardc20709a2004-04-21 23:27:19 +00004587 }
thsb46a8902007-10-21 23:20:45 +00004588 return 0;
4589}
4590
4591static int net_tap_init(VLANState *vlan, const char *ifname1,
4592 const char *setup_script, const char *down_script)
4593{
4594 TAPState *s;
4595 int fd;
4596 char ifname[128];
4597
4598 if (ifname1 != NULL)
4599 pstrcpy(ifname, sizeof(ifname), ifname1);
4600 else
4601 ifname[0] = '\0';
4602 TFR(fd = tap_open(ifname, sizeof(ifname)));
4603 if (fd < 0)
4604 return -1;
4605
4606 if (!setup_script || !strcmp(setup_script, "no"))
4607 setup_script = "";
4608 if (setup_script[0] != '\0') {
4609 if (launch_script(setup_script, ifname, fd))
4610 return -1;
bellardc20709a2004-04-21 23:27:19 +00004611 }
bellard7c9d8e02005-11-15 22:16:05 +00004612 s = net_tap_fd_init(vlan, fd);
4613 if (!s)
4614 return -1;
ths5fafdf22007-09-16 21:08:06 +00004615 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
bellard7c9d8e02005-11-15 22:16:05 +00004616 "tap: ifname=%s setup_script=%s", ifname, setup_script);
thsb46a8902007-10-21 23:20:45 +00004617 if (down_script && strcmp(down_script, "no"))
4618 snprintf(s->down_script, sizeof(s->down_script), "%s", down_script);
bellardc20709a2004-04-21 23:27:19 +00004619 return 0;
4620}
4621
bellardfd1dff42006-02-01 21:29:26 +00004622#endif /* !_WIN32 */
4623
ths8a16d272008-07-19 09:56:24 +00004624#if defined(CONFIG_VDE)
4625typedef struct VDEState {
4626 VLANClientState *vc;
4627 VDECONN *vde;
4628} VDEState;
4629
4630static void vde_to_qemu(void *opaque)
4631{
4632 VDEState *s = opaque;
4633 uint8_t buf[4096];
4634 int size;
4635
4636 size = vde_recv(s->vde, buf, sizeof(buf), 0);
4637 if (size > 0) {
4638 qemu_send_packet(s->vc, buf, size);
4639 }
4640}
4641
4642static void vde_from_qemu(void *opaque, const uint8_t *buf, int size)
4643{
4644 VDEState *s = opaque;
4645 int ret;
4646 for(;;) {
4647 ret = vde_send(s->vde, buf, size, 0);
4648 if (ret < 0 && errno == EINTR) {
4649 } else {
4650 break;
4651 }
4652 }
4653}
4654
4655static int net_vde_init(VLANState *vlan, const char *sock, int port,
4656 const char *group, int mode)
4657{
4658 VDEState *s;
4659 char *init_group = strlen(group) ? (char *)group : NULL;
4660 char *init_sock = strlen(sock) ? (char *)sock : NULL;
4661
4662 struct vde_open_args args = {
4663 .port = port,
4664 .group = init_group,
4665 .mode = mode,
4666 };
4667
4668 s = qemu_mallocz(sizeof(VDEState));
4669 if (!s)
4670 return -1;
4671 s->vde = vde_open(init_sock, "QEMU", &args);
4672 if (!s->vde){
4673 free(s);
4674 return -1;
4675 }
4676 s->vc = qemu_new_vlan_client(vlan, vde_from_qemu, NULL, s);
4677 qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
4678 snprintf(s->vc->info_str, sizeof(s->vc->info_str), "vde: sock=%s fd=%d",
4679 sock, vde_datafd(s->vde));
4680 return 0;
4681}
4682#endif
4683
bellard7c9d8e02005-11-15 22:16:05 +00004684/* network connection */
4685typedef struct NetSocketState {
4686 VLANClientState *vc;
4687 int fd;
4688 int state; /* 0 = getting length, 1 = getting data */
4689 int index;
4690 int packet_len;
4691 uint8_t buf[4096];
bellard3d830452005-12-18 16:36:49 +00004692 struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
bellard7c9d8e02005-11-15 22:16:05 +00004693} NetSocketState;
4694
4695typedef struct NetSocketListenState {
4696 VLANState *vlan;
4697 int fd;
4698} NetSocketListenState;
4699
4700/* XXX: we consider we can send the whole packet without blocking */
4701static void net_socket_receive(void *opaque, const uint8_t *buf, int size)
bellardc20709a2004-04-21 23:27:19 +00004702{
bellard7c9d8e02005-11-15 22:16:05 +00004703 NetSocketState *s = opaque;
4704 uint32_t len;
4705 len = htonl(size);
4706
bellardfd1dff42006-02-01 21:29:26 +00004707 send_all(s->fd, (const uint8_t *)&len, sizeof(len));
4708 send_all(s->fd, buf, size);
bellard7c9d8e02005-11-15 22:16:05 +00004709}
4710
bellard3d830452005-12-18 16:36:49 +00004711static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, int size)
4712{
4713 NetSocketState *s = opaque;
ths5fafdf22007-09-16 21:08:06 +00004714 sendto(s->fd, buf, size, 0,
bellard3d830452005-12-18 16:36:49 +00004715 (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
4716}
4717
bellard7c9d8e02005-11-15 22:16:05 +00004718static void net_socket_send(void *opaque)
4719{
4720 NetSocketState *s = opaque;
bellardfd1dff42006-02-01 21:29:26 +00004721 int l, size, err;
bellard7c9d8e02005-11-15 22:16:05 +00004722 uint8_t buf1[4096];
4723 const uint8_t *buf;
4724
bellardfd1dff42006-02-01 21:29:26 +00004725 size = recv(s->fd, buf1, sizeof(buf1), 0);
4726 if (size < 0) {
4727 err = socket_error();
ths5fafdf22007-09-16 21:08:06 +00004728 if (err != EWOULDBLOCK)
bellardfd1dff42006-02-01 21:29:26 +00004729 goto eoc;
4730 } else if (size == 0) {
bellard7c9d8e02005-11-15 22:16:05 +00004731 /* end of connection */
bellardfd1dff42006-02-01 21:29:26 +00004732 eoc:
bellard7c9d8e02005-11-15 22:16:05 +00004733 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
bellardfd1dff42006-02-01 21:29:26 +00004734 closesocket(s->fd);
bellard7c9d8e02005-11-15 22:16:05 +00004735 return;
4736 }
4737 buf = buf1;
4738 while (size > 0) {
4739 /* reassemble a packet from the network */
4740 switch(s->state) {
4741 case 0:
4742 l = 4 - s->index;
4743 if (l > size)
4744 l = size;
4745 memcpy(s->buf + s->index, buf, l);
4746 buf += l;
4747 size -= l;
4748 s->index += l;
4749 if (s->index == 4) {
4750 /* got length */
4751 s->packet_len = ntohl(*(uint32_t *)s->buf);
4752 s->index = 0;
4753 s->state = 1;
4754 }
4755 break;
4756 case 1:
4757 l = s->packet_len - s->index;
4758 if (l > size)
4759 l = size;
4760 memcpy(s->buf + s->index, buf, l);
4761 s->index += l;
4762 buf += l;
4763 size -= l;
4764 if (s->index >= s->packet_len) {
4765 qemu_send_packet(s->vc, s->buf, s->packet_len);
4766 s->index = 0;
4767 s->state = 0;
4768 }
4769 break;
4770 }
4771 }
4772}
4773
bellard3d830452005-12-18 16:36:49 +00004774static void net_socket_send_dgram(void *opaque)
4775{
4776 NetSocketState *s = opaque;
4777 int size;
4778
4779 size = recv(s->fd, s->buf, sizeof(s->buf), 0);
ths5fafdf22007-09-16 21:08:06 +00004780 if (size < 0)
bellard3d830452005-12-18 16:36:49 +00004781 return;
4782 if (size == 0) {
4783 /* end of connection */
4784 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
4785 return;
4786 }
4787 qemu_send_packet(s->vc, s->buf, size);
4788}
4789
4790static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
4791{
4792 struct ip_mreq imr;
4793 int fd;
4794 int val, ret;
4795 if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
4796 fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
ths5fafdf22007-09-16 21:08:06 +00004797 inet_ntoa(mcastaddr->sin_addr),
bellardfd1dff42006-02-01 21:29:26 +00004798 (int)ntohl(mcastaddr->sin_addr.s_addr));
bellard3d830452005-12-18 16:36:49 +00004799 return -1;
4800
4801 }
4802 fd = socket(PF_INET, SOCK_DGRAM, 0);
4803 if (fd < 0) {
4804 perror("socket(PF_INET, SOCK_DGRAM)");
4805 return -1;
4806 }
4807
bellardfd1dff42006-02-01 21:29:26 +00004808 val = 1;
ths5fafdf22007-09-16 21:08:06 +00004809 ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
bellardfd1dff42006-02-01 21:29:26 +00004810 (const char *)&val, sizeof(val));
4811 if (ret < 0) {
4812 perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
4813 goto fail;
4814 }
4815
4816 ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
4817 if (ret < 0) {
4818 perror("bind");
4819 goto fail;
4820 }
ths3b46e622007-09-17 08:09:54 +00004821
bellard3d830452005-12-18 16:36:49 +00004822 /* Add host to multicast group */
4823 imr.imr_multiaddr = mcastaddr->sin_addr;
4824 imr.imr_interface.s_addr = htonl(INADDR_ANY);
4825
ths5fafdf22007-09-16 21:08:06 +00004826 ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
bellardfd1dff42006-02-01 21:29:26 +00004827 (const char *)&imr, sizeof(struct ip_mreq));
bellard3d830452005-12-18 16:36:49 +00004828 if (ret < 0) {
4829 perror("setsockopt(IP_ADD_MEMBERSHIP)");
4830 goto fail;
4831 }
4832
4833 /* Force mcast msgs to loopback (eg. several QEMUs in same host */
4834 val = 1;
ths5fafdf22007-09-16 21:08:06 +00004835 ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
bellardfd1dff42006-02-01 21:29:26 +00004836 (const char *)&val, sizeof(val));
bellard3d830452005-12-18 16:36:49 +00004837 if (ret < 0) {
4838 perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
4839 goto fail;
4840 }
4841
bellardfd1dff42006-02-01 21:29:26 +00004842 socket_set_nonblock(fd);
bellard3d830452005-12-18 16:36:49 +00004843 return fd;
4844fail:
ths5fafdf22007-09-16 21:08:06 +00004845 if (fd >= 0)
bellard0bab00f2006-06-25 14:49:44 +00004846 closesocket(fd);
bellard3d830452005-12-18 16:36:49 +00004847 return -1;
4848}
4849
ths5fafdf22007-09-16 21:08:06 +00004850static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan, int fd,
bellard3d830452005-12-18 16:36:49 +00004851 int is_connected)
4852{
4853 struct sockaddr_in saddr;
4854 int newfd;
4855 socklen_t saddr_len;
4856 NetSocketState *s;
4857
4858 /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
ths5fafdf22007-09-16 21:08:06 +00004859 * Because this may be "shared" socket from a "master" process, datagrams would be recv()
bellard3d830452005-12-18 16:36:49 +00004860 * by ONLY ONE process: we must "clone" this dgram socket --jjo
4861 */
4862
4863 if (is_connected) {
4864 if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
4865 /* must be bound */
4866 if (saddr.sin_addr.s_addr==0) {
4867 fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
4868 fd);
4869 return NULL;
4870 }
4871 /* clone dgram socket */
4872 newfd = net_socket_mcast_create(&saddr);
4873 if (newfd < 0) {
4874 /* error already reported by net_socket_mcast_create() */
4875 close(fd);
4876 return NULL;
4877 }
4878 /* clone newfd to fd, close newfd */
4879 dup2(newfd, fd);
4880 close(newfd);
ths5fafdf22007-09-16 21:08:06 +00004881
bellard3d830452005-12-18 16:36:49 +00004882 } else {
4883 fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
4884 fd, strerror(errno));
4885 return NULL;
4886 }
4887 }
4888
4889 s = qemu_mallocz(sizeof(NetSocketState));
4890 if (!s)
4891 return NULL;
4892 s->fd = fd;
4893
pbrookd861b052006-02-04 22:15:28 +00004894 s->vc = qemu_new_vlan_client(vlan, net_socket_receive_dgram, NULL, s);
bellard3d830452005-12-18 16:36:49 +00004895 qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
4896
4897 /* mcast: save bound address as dst */
4898 if (is_connected) s->dgram_dst=saddr;
4899
4900 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
ths5fafdf22007-09-16 21:08:06 +00004901 "socket: fd=%d (%s mcast=%s:%d)",
bellard3d830452005-12-18 16:36:49 +00004902 fd, is_connected? "cloned" : "",
4903 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4904 return s;
4905}
4906
bellard7c9d8e02005-11-15 22:16:05 +00004907static void net_socket_connect(void *opaque)
4908{
4909 NetSocketState *s = opaque;
4910 qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
4911}
4912
ths5fafdf22007-09-16 21:08:06 +00004913static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, int fd,
bellard7c9d8e02005-11-15 22:16:05 +00004914 int is_connected)
4915{
4916 NetSocketState *s;
4917 s = qemu_mallocz(sizeof(NetSocketState));
4918 if (!s)
4919 return NULL;
4920 s->fd = fd;
ths5fafdf22007-09-16 21:08:06 +00004921 s->vc = qemu_new_vlan_client(vlan,
pbrookd861b052006-02-04 22:15:28 +00004922 net_socket_receive, NULL, s);
bellard7c9d8e02005-11-15 22:16:05 +00004923 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4924 "socket: fd=%d", fd);
4925 if (is_connected) {
4926 net_socket_connect(s);
4927 } else {
4928 qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
4929 }
4930 return s;
4931}
4932
ths5fafdf22007-09-16 21:08:06 +00004933static NetSocketState *net_socket_fd_init(VLANState *vlan, int fd,
bellard3d830452005-12-18 16:36:49 +00004934 int is_connected)
4935{
4936 int so_type=-1, optlen=sizeof(so_type);
4937
ths69b34972007-12-17 03:15:52 +00004938 if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
4939 (socklen_t *)&optlen)< 0) {
ths931f03e2007-04-28 20:49:36 +00004940 fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
bellard3d830452005-12-18 16:36:49 +00004941 return NULL;
4942 }
4943 switch(so_type) {
4944 case SOCK_DGRAM:
4945 return net_socket_fd_init_dgram(vlan, fd, is_connected);
4946 case SOCK_STREAM:
4947 return net_socket_fd_init_stream(vlan, fd, is_connected);
4948 default:
4949 /* who knows ... this could be a eg. a pty, do warn and continue as stream */
4950 fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
4951 return net_socket_fd_init_stream(vlan, fd, is_connected);
4952 }
4953 return NULL;
4954}
4955
bellard7c9d8e02005-11-15 22:16:05 +00004956static void net_socket_accept(void *opaque)
4957{
ths3b46e622007-09-17 08:09:54 +00004958 NetSocketListenState *s = opaque;
bellard7c9d8e02005-11-15 22:16:05 +00004959 NetSocketState *s1;
4960 struct sockaddr_in saddr;
4961 socklen_t len;
4962 int fd;
4963
4964 for(;;) {
4965 len = sizeof(saddr);
4966 fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
4967 if (fd < 0 && errno != EINTR) {
4968 return;
4969 } else if (fd >= 0) {
4970 break;
4971 }
4972 }
ths5fafdf22007-09-16 21:08:06 +00004973 s1 = net_socket_fd_init(s->vlan, fd, 1);
bellard7c9d8e02005-11-15 22:16:05 +00004974 if (!s1) {
bellard0bab00f2006-06-25 14:49:44 +00004975 closesocket(fd);
bellard7c9d8e02005-11-15 22:16:05 +00004976 } else {
4977 snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
ths5fafdf22007-09-16 21:08:06 +00004978 "socket: connection from %s:%d",
bellard7c9d8e02005-11-15 22:16:05 +00004979 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4980 }
4981}
4982
4983static int net_socket_listen_init(VLANState *vlan, const char *host_str)
4984{
4985 NetSocketListenState *s;
4986 int fd, val, ret;
4987 struct sockaddr_in saddr;
4988
4989 if (parse_host_port(&saddr, host_str) < 0)
4990 return -1;
ths3b46e622007-09-17 08:09:54 +00004991
bellard7c9d8e02005-11-15 22:16:05 +00004992 s = qemu_mallocz(sizeof(NetSocketListenState));
4993 if (!s)
4994 return -1;
4995
4996 fd = socket(PF_INET, SOCK_STREAM, 0);
4997 if (fd < 0) {
4998 perror("socket");
4999 return -1;
5000 }
bellardfd1dff42006-02-01 21:29:26 +00005001 socket_set_nonblock(fd);
bellard7c9d8e02005-11-15 22:16:05 +00005002
5003 /* allow fast reuse */
5004 val = 1;
bellardfd1dff42006-02-01 21:29:26 +00005005 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
ths3b46e622007-09-17 08:09:54 +00005006
bellard7c9d8e02005-11-15 22:16:05 +00005007 ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
5008 if (ret < 0) {
5009 perror("bind");
5010 return -1;
5011 }
5012 ret = listen(fd, 0);
5013 if (ret < 0) {
5014 perror("listen");
5015 return -1;
5016 }
5017 s->vlan = vlan;
5018 s->fd = fd;
5019 qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
5020 return 0;
5021}
5022
5023static int net_socket_connect_init(VLANState *vlan, const char *host_str)
5024{
5025 NetSocketState *s;
bellardfd1dff42006-02-01 21:29:26 +00005026 int fd, connected, ret, err;
bellard7c9d8e02005-11-15 22:16:05 +00005027 struct sockaddr_in saddr;
5028
5029 if (parse_host_port(&saddr, host_str) < 0)
5030 return -1;
5031
5032 fd = socket(PF_INET, SOCK_STREAM, 0);
5033 if (fd < 0) {
5034 perror("socket");
5035 return -1;
5036 }
bellardfd1dff42006-02-01 21:29:26 +00005037 socket_set_nonblock(fd);
bellard7c9d8e02005-11-15 22:16:05 +00005038
5039 connected = 0;
5040 for(;;) {
5041 ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
5042 if (ret < 0) {
bellardfd1dff42006-02-01 21:29:26 +00005043 err = socket_error();
5044 if (err == EINTR || err == EWOULDBLOCK) {
5045 } else if (err == EINPROGRESS) {
bellard7c9d8e02005-11-15 22:16:05 +00005046 break;
thsf5b12262007-03-25 15:58:03 +00005047#ifdef _WIN32
5048 } else if (err == WSAEALREADY) {
5049 break;
5050#endif
bellard7c9d8e02005-11-15 22:16:05 +00005051 } else {
5052 perror("connect");
bellardfd1dff42006-02-01 21:29:26 +00005053 closesocket(fd);
bellard7c9d8e02005-11-15 22:16:05 +00005054 return -1;
5055 }
5056 } else {
5057 connected = 1;
5058 break;
5059 }
5060 }
5061 s = net_socket_fd_init(vlan, fd, connected);
5062 if (!s)
5063 return -1;
5064 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
ths5fafdf22007-09-16 21:08:06 +00005065 "socket: connect to %s:%d",
bellard7c9d8e02005-11-15 22:16:05 +00005066 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
bellardc20709a2004-04-21 23:27:19 +00005067 return 0;
5068}
5069
bellard3d830452005-12-18 16:36:49 +00005070static int net_socket_mcast_init(VLANState *vlan, const char *host_str)
5071{
5072 NetSocketState *s;
5073 int fd;
5074 struct sockaddr_in saddr;
5075
5076 if (parse_host_port(&saddr, host_str) < 0)
5077 return -1;
5078
5079
5080 fd = net_socket_mcast_create(&saddr);
5081 if (fd < 0)
5082 return -1;
5083
5084 s = net_socket_fd_init(vlan, fd, 0);
5085 if (!s)
5086 return -1;
5087
5088 s->dgram_dst = saddr;
ths3b46e622007-09-17 08:09:54 +00005089
bellard3d830452005-12-18 16:36:49 +00005090 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
ths5fafdf22007-09-16 21:08:06 +00005091 "socket: mcast=%s:%d",
bellard3d830452005-12-18 16:36:49 +00005092 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
5093 return 0;
5094
5095}
5096
balrog609497a2008-01-14 02:56:53 +00005097static const char *get_opt_name(char *buf, int buf_size, const char *p)
thse4bcb142007-12-02 04:51:10 +00005098{
5099 char *q;
thse4bcb142007-12-02 04:51:10 +00005100
balrog609497a2008-01-14 02:56:53 +00005101 q = buf;
5102 while (*p != '\0' && *p != '=') {
5103 if (q && (q - buf) < buf_size - 1)
5104 *q++ = *p;
5105 p++;
5106 }
5107 if (q)
5108 *q = '\0';
5109
5110 return p;
5111}
5112
5113static const char *get_opt_value(char *buf, int buf_size, const char *p)
5114{
5115 char *q;
5116
thse4bcb142007-12-02 04:51:10 +00005117 q = buf;
5118 while (*p != '\0') {
balrog609497a2008-01-14 02:56:53 +00005119 if (*p == ',') {
5120 if (*(p + 1) != ',')
thse4bcb142007-12-02 04:51:10 +00005121 break;
thse4bcb142007-12-02 04:51:10 +00005122 p++;
balrog609497a2008-01-14 02:56:53 +00005123 }
thse4bcb142007-12-02 04:51:10 +00005124 if (q && (q - buf) < buf_size - 1)
5125 *q++ = *p;
5126 p++;
5127 }
5128 if (q)
5129 *q = '\0';
5130
5131 return p;
5132}
5133
bellard7c9d8e02005-11-15 22:16:05 +00005134static int get_param_value(char *buf, int buf_size,
5135 const char *tag, const char *str)
5136{
5137 const char *p;
bellard7c9d8e02005-11-15 22:16:05 +00005138 char option[128];
5139
5140 p = str;
5141 for(;;) {
balrog609497a2008-01-14 02:56:53 +00005142 p = get_opt_name(option, sizeof(option), p);
bellard7c9d8e02005-11-15 22:16:05 +00005143 if (*p != '=')
5144 break;
5145 p++;
5146 if (!strcmp(tag, option)) {
balrog609497a2008-01-14 02:56:53 +00005147 (void)get_opt_value(buf, buf_size, p);
thse4bcb142007-12-02 04:51:10 +00005148 return strlen(buf);
bellard7c9d8e02005-11-15 22:16:05 +00005149 } else {
balrog609497a2008-01-14 02:56:53 +00005150 p = get_opt_value(NULL, 0, p);
bellard7c9d8e02005-11-15 22:16:05 +00005151 }
5152 if (*p != ',')
5153 break;
5154 p++;
5155 }
5156 return 0;
5157}
5158
thse4bcb142007-12-02 04:51:10 +00005159static int check_params(char *buf, int buf_size,
blueswir17ccfb2e2008-09-14 06:45:34 +00005160 const char * const *params, const char *str)
thse4bcb142007-12-02 04:51:10 +00005161{
5162 const char *p;
5163 int i;
5164
5165 p = str;
5166 for(;;) {
balrog609497a2008-01-14 02:56:53 +00005167 p = get_opt_name(buf, buf_size, p);
thse4bcb142007-12-02 04:51:10 +00005168 if (*p != '=')
5169 return -1;
5170 p++;
5171 for(i = 0; params[i] != NULL; i++)
5172 if (!strcmp(params[i], buf))
5173 break;
5174 if (params[i] == NULL)
5175 return -1;
balrog609497a2008-01-14 02:56:53 +00005176 p = get_opt_value(NULL, 0, p);
thse4bcb142007-12-02 04:51:10 +00005177 if (*p != ',')
5178 break;
5179 p++;
5180 }
5181 return 0;
5182}
5183
balrog9ad97e62008-07-29 13:16:31 +00005184static int net_client_init(const char *device, const char *p)
bellard7c9d8e02005-11-15 22:16:05 +00005185{
bellard7c9d8e02005-11-15 22:16:05 +00005186 char buf[1024];
5187 int vlan_id, ret;
5188 VLANState *vlan;
5189
bellard7c9d8e02005-11-15 22:16:05 +00005190 vlan_id = 0;
5191 if (get_param_value(buf, sizeof(buf), "vlan", p)) {
5192 vlan_id = strtol(buf, NULL, 0);
5193 }
5194 vlan = qemu_find_vlan(vlan_id);
5195 if (!vlan) {
5196 fprintf(stderr, "Could not create vlan %d\n", vlan_id);
5197 return -1;
5198 }
5199 if (!strcmp(device, "nic")) {
5200 NICInfo *nd;
5201 uint8_t *macaddr;
5202
5203 if (nb_nics >= MAX_NICS) {
5204 fprintf(stderr, "Too Many NICs\n");
5205 return -1;
5206 }
5207 nd = &nd_table[nb_nics];
5208 macaddr = nd->macaddr;
5209 macaddr[0] = 0x52;
5210 macaddr[1] = 0x54;
5211 macaddr[2] = 0x00;
5212 macaddr[3] = 0x12;
5213 macaddr[4] = 0x34;
5214 macaddr[5] = 0x56 + nb_nics;
5215
5216 if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
5217 if (parse_macaddr(macaddr, buf) < 0) {
5218 fprintf(stderr, "invalid syntax for ethernet address\n");
5219 return -1;
5220 }
5221 }
pbrooka41b2ff2006-02-05 04:14:41 +00005222 if (get_param_value(buf, sizeof(buf), "model", p)) {
5223 nd->model = strdup(buf);
5224 }
bellard7c9d8e02005-11-15 22:16:05 +00005225 nd->vlan = vlan;
5226 nb_nics++;
blueswir1833c7172007-05-27 19:36:43 +00005227 vlan->nb_guest_devs++;
bellard7c9d8e02005-11-15 22:16:05 +00005228 ret = 0;
5229 } else
5230 if (!strcmp(device, "none")) {
5231 /* does nothing. It is needed to signal that no network cards
5232 are wanted */
5233 ret = 0;
5234 } else
5235#ifdef CONFIG_SLIRP
5236 if (!strcmp(device, "user")) {
pbrook115defd2006-04-16 11:06:58 +00005237 if (get_param_value(buf, sizeof(buf), "hostname", p)) {
bellard3f423c92006-04-30 21:34:15 +00005238 pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf);
pbrook115defd2006-04-16 11:06:58 +00005239 }
blueswir1833c7172007-05-27 19:36:43 +00005240 vlan->nb_host_devs++;
bellard7c9d8e02005-11-15 22:16:05 +00005241 ret = net_slirp_init(vlan);
5242 } else
5243#endif
bellard7fb843f2006-02-01 23:06:55 +00005244#ifdef _WIN32
5245 if (!strcmp(device, "tap")) {
5246 char ifname[64];
5247 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
5248 fprintf(stderr, "tap: no interface name\n");
5249 return -1;
5250 }
blueswir1833c7172007-05-27 19:36:43 +00005251 vlan->nb_host_devs++;
bellard7fb843f2006-02-01 23:06:55 +00005252 ret = tap_win32_init(vlan, ifname);
5253 } else
5254#else
bellard7c9d8e02005-11-15 22:16:05 +00005255 if (!strcmp(device, "tap")) {
5256 char ifname[64];
thsb46a8902007-10-21 23:20:45 +00005257 char setup_script[1024], down_script[1024];
bellard7c9d8e02005-11-15 22:16:05 +00005258 int fd;
pbrook4f010352007-05-28 02:29:59 +00005259 vlan->nb_host_devs++;
bellard7c9d8e02005-11-15 22:16:05 +00005260 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
5261 fd = strtol(buf, NULL, 0);
pbrook64538cd2008-03-24 02:31:33 +00005262 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard7c9d8e02005-11-15 22:16:05 +00005263 ret = -1;
5264 if (net_tap_fd_init(vlan, fd))
5265 ret = 0;
5266 } else {
bellardbf8c5342007-01-09 19:44:41 +00005267 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
5268 ifname[0] = '\0';
5269 }
bellard7c9d8e02005-11-15 22:16:05 +00005270 if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
5271 pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
5272 }
thsb46a8902007-10-21 23:20:45 +00005273 if (get_param_value(down_script, sizeof(down_script), "downscript", p) == 0) {
5274 pstrcpy(down_script, sizeof(down_script), DEFAULT_NETWORK_DOWN_SCRIPT);
5275 }
5276 ret = net_tap_init(vlan, ifname, setup_script, down_script);
bellard7c9d8e02005-11-15 22:16:05 +00005277 }
5278 } else
bellardfd1dff42006-02-01 21:29:26 +00005279#endif
bellard7c9d8e02005-11-15 22:16:05 +00005280 if (!strcmp(device, "socket")) {
5281 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
5282 int fd;
5283 fd = strtol(buf, NULL, 0);
5284 ret = -1;
5285 if (net_socket_fd_init(vlan, fd, 1))
5286 ret = 0;
5287 } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
5288 ret = net_socket_listen_init(vlan, buf);
5289 } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
5290 ret = net_socket_connect_init(vlan, buf);
bellard3d830452005-12-18 16:36:49 +00005291 } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
5292 ret = net_socket_mcast_init(vlan, buf);
bellard7c9d8e02005-11-15 22:16:05 +00005293 } else {
5294 fprintf(stderr, "Unknown socket options: %s\n", p);
5295 return -1;
5296 }
blueswir1833c7172007-05-27 19:36:43 +00005297 vlan->nb_host_devs++;
bellard7c9d8e02005-11-15 22:16:05 +00005298 } else
ths8a16d272008-07-19 09:56:24 +00005299#ifdef CONFIG_VDE
5300 if (!strcmp(device, "vde")) {
5301 char vde_sock[1024], vde_group[512];
5302 int vde_port, vde_mode;
5303 vlan->nb_host_devs++;
5304 if (get_param_value(vde_sock, sizeof(vde_sock), "sock", p) <= 0) {
5305 vde_sock[0] = '\0';
5306 }
5307 if (get_param_value(buf, sizeof(buf), "port", p) > 0) {
5308 vde_port = strtol(buf, NULL, 10);
5309 } else {
5310 vde_port = 0;
5311 }
5312 if (get_param_value(vde_group, sizeof(vde_group), "group", p) <= 0) {
5313 vde_group[0] = '\0';
5314 }
5315 if (get_param_value(buf, sizeof(buf), "mode", p) > 0) {
5316 vde_mode = strtol(buf, NULL, 8);
5317 } else {
5318 vde_mode = 0700;
5319 }
5320 ret = net_vde_init(vlan, vde_sock, vde_port, vde_group, vde_mode);
5321 } else
5322#endif
bellard7c9d8e02005-11-15 22:16:05 +00005323 {
5324 fprintf(stderr, "Unknown network device: %s\n", device);
5325 return -1;
5326 }
5327 if (ret < 0) {
5328 fprintf(stderr, "Could not initialize device '%s'\n", device);
5329 }
ths3b46e622007-09-17 08:09:54 +00005330
bellard7c9d8e02005-11-15 22:16:05 +00005331 return ret;
5332}
5333
balrog9ad97e62008-07-29 13:16:31 +00005334static int net_client_parse(const char *str)
5335{
5336 const char *p;
5337 char *q;
5338 char device[64];
5339
5340 p = str;
5341 q = device;
5342 while (*p != '\0' && *p != ',') {
5343 if ((q - device) < sizeof(device) - 1)
5344 *q++ = *p;
5345 p++;
5346 }
5347 *q = '\0';
5348 if (*p == ',')
5349 p++;
5350
5351 return net_client_init(device, p);
5352}
5353
bellard7c9d8e02005-11-15 22:16:05 +00005354void do_info_network(void)
5355{
5356 VLANState *vlan;
5357 VLANClientState *vc;
5358
5359 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
5360 term_printf("VLAN %d devices:\n", vlan->id);
5361 for(vc = vlan->first_client; vc != NULL; vc = vc->next)
5362 term_printf(" %s\n", vc->info_str);
5363 }
5364}
ths42550fd2006-12-22 16:34:12 +00005365
balrog1ae26a12008-09-28 23:19:47 +00005366/***********************************************************/
5367/* Bluetooth support */
5368static int nb_hcis;
5369static int cur_hci;
5370static struct HCIInfo *hci_table[MAX_NICS];
5371static struct bt_vlan_s {
5372 struct bt_scatternet_s net;
5373 int id;
5374 struct bt_vlan_s *next;
5375} *first_bt_vlan;
5376
5377/* find or alloc a new bluetooth "VLAN" */
blueswir1674bb262008-09-30 18:18:27 +00005378static struct bt_scatternet_s *qemu_find_bt_vlan(int id)
balrog1ae26a12008-09-28 23:19:47 +00005379{
5380 struct bt_vlan_s **pvlan, *vlan;
5381 for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
5382 if (vlan->id == id)
5383 return &vlan->net;
5384 }
5385 vlan = qemu_mallocz(sizeof(struct bt_vlan_s));
5386 vlan->id = id;
5387 pvlan = &first_bt_vlan;
5388 while (*pvlan != NULL)
5389 pvlan = &(*pvlan)->next;
5390 *pvlan = vlan;
5391 return &vlan->net;
5392}
5393
5394static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
5395{
5396}
5397
5398static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
5399{
5400 return -ENOTSUP;
5401}
5402
5403static struct HCIInfo null_hci = {
5404 .cmd_send = null_hci_send,
5405 .sco_send = null_hci_send,
5406 .acl_send = null_hci_send,
5407 .bdaddr_set = null_hci_addr_set,
5408};
5409
5410struct HCIInfo *qemu_next_hci(void)
5411{
5412 if (cur_hci == nb_hcis)
5413 return &null_hci;
5414
5415 return hci_table[cur_hci++];
5416}
5417
5418/***********************************************************/
5419/* QEMU Block devices */
5420
balrog609497a2008-01-14 02:56:53 +00005421#define HD_ALIAS "index=%d,media=disk"
thse4bcb142007-12-02 04:51:10 +00005422#ifdef TARGET_PPC
5423#define CDROM_ALIAS "index=1,media=cdrom"
5424#else
5425#define CDROM_ALIAS "index=2,media=cdrom"
5426#endif
5427#define FD_ALIAS "index=%d,if=floppy"
balrog609497a2008-01-14 02:56:53 +00005428#define PFLASH_ALIAS "if=pflash"
5429#define MTD_ALIAS "if=mtd"
balrog9d413d12007-12-04 00:10:34 +00005430#define SD_ALIAS "index=0,if=sd"
thse4bcb142007-12-02 04:51:10 +00005431
balrog609497a2008-01-14 02:56:53 +00005432static int drive_add(const char *file, const char *fmt, ...)
thse4bcb142007-12-02 04:51:10 +00005433{
5434 va_list ap;
5435
5436 if (nb_drives_opt >= MAX_DRIVES) {
5437 fprintf(stderr, "qemu: too many drives\n");
5438 exit(1);
5439 }
5440
balrog609497a2008-01-14 02:56:53 +00005441 drives_opt[nb_drives_opt].file = file;
thse4bcb142007-12-02 04:51:10 +00005442 va_start(ap, fmt);
balrog609497a2008-01-14 02:56:53 +00005443 vsnprintf(drives_opt[nb_drives_opt].opt,
5444 sizeof(drives_opt[0].opt), fmt, ap);
thse4bcb142007-12-02 04:51:10 +00005445 va_end(ap);
5446
5447 return nb_drives_opt++;
5448}
5449
thsf60d39b2007-12-17 03:55:57 +00005450int drive_get_index(BlockInterfaceType type, int bus, int unit)
thse4bcb142007-12-02 04:51:10 +00005451{
5452 int index;
5453
5454 /* seek interface, bus and unit */
5455
5456 for (index = 0; index < nb_drives; index++)
thsf60d39b2007-12-17 03:55:57 +00005457 if (drives_table[index].type == type &&
thse4bcb142007-12-02 04:51:10 +00005458 drives_table[index].bus == bus &&
5459 drives_table[index].unit == unit)
5460 return index;
5461
5462 return -1;
5463}
5464
thsf60d39b2007-12-17 03:55:57 +00005465int drive_get_max_bus(BlockInterfaceType type)
thse4bcb142007-12-02 04:51:10 +00005466{
5467 int max_bus;
5468 int index;
5469
5470 max_bus = -1;
5471 for (index = 0; index < nb_drives; index++) {
thsf60d39b2007-12-17 03:55:57 +00005472 if(drives_table[index].type == type &&
thse4bcb142007-12-02 04:51:10 +00005473 drives_table[index].bus > max_bus)
5474 max_bus = drives_table[index].bus;
5475 }
5476 return max_bus;
5477}
5478
aurel32a1620fa2008-04-29 05:58:01 +00005479static void bdrv_format_print(void *opaque, const char *name)
5480{
5481 fprintf(stderr, " %s", name);
5482}
5483
balrog609497a2008-01-14 02:56:53 +00005484static int drive_init(struct drive_opt *arg, int snapshot,
5485 QEMUMachine *machine)
thse4bcb142007-12-02 04:51:10 +00005486{
5487 char buf[128];
5488 char file[1024];
balrogc8522bd2007-12-06 22:11:20 +00005489 char devname[128];
5490 const char *mediastr = "";
thsf60d39b2007-12-17 03:55:57 +00005491 BlockInterfaceType type;
thse4bcb142007-12-02 04:51:10 +00005492 enum { MEDIA_DISK, MEDIA_CDROM } media;
5493 int bus_id, unit_id;
5494 int cyls, heads, secs, translation;
5495 BlockDriverState *bdrv;
aurel321e72d3b2008-04-28 20:26:45 +00005496 BlockDriver *drv = NULL;
thse4bcb142007-12-02 04:51:10 +00005497 int max_devs;
5498 int index;
balrog33f00272007-12-24 14:33:24 +00005499 int cache;
5500 int bdrv_flags;
balrog609497a2008-01-14 02:56:53 +00005501 char *str = arg->opt;
blueswir17ccfb2e2008-09-14 06:45:34 +00005502 static const char * const params[] = { "bus", "unit", "if", "index",
5503 "cyls", "heads", "secs", "trans",
5504 "media", "snapshot", "file",
5505 "cache", "format", NULL };
thse4bcb142007-12-02 04:51:10 +00005506
5507 if (check_params(buf, sizeof(buf), params, str) < 0) {
balrogff993632008-02-10 13:21:25 +00005508 fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n",
thse4bcb142007-12-02 04:51:10 +00005509 buf, str);
5510 return -1;
5511 }
5512
5513 file[0] = 0;
5514 cyls = heads = secs = 0;
5515 bus_id = 0;
5516 unit_id = -1;
5517 translation = BIOS_ATA_TRANSLATION_AUTO;
5518 index = -1;
balrog33f00272007-12-24 14:33:24 +00005519 cache = 1;
thse4bcb142007-12-02 04:51:10 +00005520
blueswir1c9b1ae22008-09-28 18:55:17 +00005521 if (machine->use_scsi) {
thsf60d39b2007-12-17 03:55:57 +00005522 type = IF_SCSI;
thse4bcb142007-12-02 04:51:10 +00005523 max_devs = MAX_SCSI_DEVS;
blueswir1363a37d2008-08-21 17:58:08 +00005524 pstrcpy(devname, sizeof(devname), "scsi");
thse4bcb142007-12-02 04:51:10 +00005525 } else {
thsf60d39b2007-12-17 03:55:57 +00005526 type = IF_IDE;
thse4bcb142007-12-02 04:51:10 +00005527 max_devs = MAX_IDE_DEVS;
blueswir1363a37d2008-08-21 17:58:08 +00005528 pstrcpy(devname, sizeof(devname), "ide");
thse4bcb142007-12-02 04:51:10 +00005529 }
5530 media = MEDIA_DISK;
5531
5532 /* extract parameters */
5533
5534 if (get_param_value(buf, sizeof(buf), "bus", str)) {
5535 bus_id = strtol(buf, NULL, 0);
5536 if (bus_id < 0) {
5537 fprintf(stderr, "qemu: '%s' invalid bus id\n", str);
5538 return -1;
5539 }
5540 }
5541
5542 if (get_param_value(buf, sizeof(buf), "unit", str)) {
5543 unit_id = strtol(buf, NULL, 0);
5544 if (unit_id < 0) {
5545 fprintf(stderr, "qemu: '%s' invalid unit id\n", str);
5546 return -1;
5547 }
5548 }
5549
5550 if (get_param_value(buf, sizeof(buf), "if", str)) {
bellardae45d362008-06-11 09:44:44 +00005551 pstrcpy(devname, sizeof(devname), buf);
thse4bcb142007-12-02 04:51:10 +00005552 if (!strcmp(buf, "ide")) {
thsf60d39b2007-12-17 03:55:57 +00005553 type = IF_IDE;
thse4bcb142007-12-02 04:51:10 +00005554 max_devs = MAX_IDE_DEVS;
5555 } else if (!strcmp(buf, "scsi")) {
thsf60d39b2007-12-17 03:55:57 +00005556 type = IF_SCSI;
thse4bcb142007-12-02 04:51:10 +00005557 max_devs = MAX_SCSI_DEVS;
5558 } else if (!strcmp(buf, "floppy")) {
thsf60d39b2007-12-17 03:55:57 +00005559 type = IF_FLOPPY;
thse4bcb142007-12-02 04:51:10 +00005560 max_devs = 0;
5561 } else if (!strcmp(buf, "pflash")) {
thsf60d39b2007-12-17 03:55:57 +00005562 type = IF_PFLASH;
thse4bcb142007-12-02 04:51:10 +00005563 max_devs = 0;
5564 } else if (!strcmp(buf, "mtd")) {
thsf60d39b2007-12-17 03:55:57 +00005565 type = IF_MTD;
thse4bcb142007-12-02 04:51:10 +00005566 max_devs = 0;
5567 } else if (!strcmp(buf, "sd")) {
thsf60d39b2007-12-17 03:55:57 +00005568 type = IF_SD;
thse4bcb142007-12-02 04:51:10 +00005569 max_devs = 0;
5570 } else {
5571 fprintf(stderr, "qemu: '%s' unsupported bus type '%s'\n", str, buf);
5572 return -1;
5573 }
5574 }
5575
5576 if (get_param_value(buf, sizeof(buf), "index", str)) {
5577 index = strtol(buf, NULL, 0);
5578 if (index < 0) {
5579 fprintf(stderr, "qemu: '%s' invalid index\n", str);
5580 return -1;
5581 }
5582 }
5583
5584 if (get_param_value(buf, sizeof(buf), "cyls", str)) {
5585 cyls = strtol(buf, NULL, 0);
5586 }
5587
5588 if (get_param_value(buf, sizeof(buf), "heads", str)) {
5589 heads = strtol(buf, NULL, 0);
5590 }
5591
5592 if (get_param_value(buf, sizeof(buf), "secs", str)) {
5593 secs = strtol(buf, NULL, 0);
5594 }
5595
5596 if (cyls || heads || secs) {
5597 if (cyls < 1 || cyls > 16383) {
5598 fprintf(stderr, "qemu: '%s' invalid physical cyls number\n", str);
5599 return -1;
5600 }
5601 if (heads < 1 || heads > 16) {
5602 fprintf(stderr, "qemu: '%s' invalid physical heads number\n", str);
5603 return -1;
5604 }
5605 if (secs < 1 || secs > 63) {
5606 fprintf(stderr, "qemu: '%s' invalid physical secs number\n", str);
5607 return -1;
5608 }
5609 }
5610
5611 if (get_param_value(buf, sizeof(buf), "trans", str)) {
5612 if (!cyls) {
5613 fprintf(stderr,
5614 "qemu: '%s' trans must be used with cyls,heads and secs\n",
5615 str);
5616 return -1;
5617 }
5618 if (!strcmp(buf, "none"))
5619 translation = BIOS_ATA_TRANSLATION_NONE;
5620 else if (!strcmp(buf, "lba"))
5621 translation = BIOS_ATA_TRANSLATION_LBA;
5622 else if (!strcmp(buf, "auto"))
5623 translation = BIOS_ATA_TRANSLATION_AUTO;
5624 else {
5625 fprintf(stderr, "qemu: '%s' invalid translation type\n", str);
5626 return -1;
5627 }
5628 }
5629
5630 if (get_param_value(buf, sizeof(buf), "media", str)) {
5631 if (!strcmp(buf, "disk")) {
5632 media = MEDIA_DISK;
5633 } else if (!strcmp(buf, "cdrom")) {
5634 if (cyls || secs || heads) {
5635 fprintf(stderr,
5636 "qemu: '%s' invalid physical CHS format\n", str);
5637 return -1;
5638 }
5639 media = MEDIA_CDROM;
5640 } else {
5641 fprintf(stderr, "qemu: '%s' invalid media\n", str);
5642 return -1;
5643 }
5644 }
5645
5646 if (get_param_value(buf, sizeof(buf), "snapshot", str)) {
5647 if (!strcmp(buf, "on"))
5648 snapshot = 1;
5649 else if (!strcmp(buf, "off"))
5650 snapshot = 0;
5651 else {
5652 fprintf(stderr, "qemu: '%s' invalid snapshot option\n", str);
5653 return -1;
5654 }
5655 }
5656
balrog33f00272007-12-24 14:33:24 +00005657 if (get_param_value(buf, sizeof(buf), "cache", str)) {
5658 if (!strcmp(buf, "off"))
5659 cache = 0;
5660 else if (!strcmp(buf, "on"))
5661 cache = 1;
5662 else {
5663 fprintf(stderr, "qemu: invalid cache option\n");
5664 return -1;
5665 }
5666 }
5667
aurel321e72d3b2008-04-28 20:26:45 +00005668 if (get_param_value(buf, sizeof(buf), "format", str)) {
aurel32a1620fa2008-04-29 05:58:01 +00005669 if (strcmp(buf, "?") == 0) {
5670 fprintf(stderr, "qemu: Supported formats:");
5671 bdrv_iterate_format(bdrv_format_print, NULL);
5672 fprintf(stderr, "\n");
5673 return -1;
5674 }
aurel321e72d3b2008-04-28 20:26:45 +00005675 drv = bdrv_find_format(buf);
5676 if (!drv) {
5677 fprintf(stderr, "qemu: '%s' invalid format\n", buf);
5678 return -1;
5679 }
5680 }
5681
balrog609497a2008-01-14 02:56:53 +00005682 if (arg->file == NULL)
5683 get_param_value(file, sizeof(file), "file", str);
5684 else
5685 pstrcpy(file, sizeof(file), arg->file);
thse4bcb142007-12-02 04:51:10 +00005686
5687 /* compute bus and unit according index */
5688
5689 if (index != -1) {
5690 if (bus_id != 0 || unit_id != -1) {
5691 fprintf(stderr,
5692 "qemu: '%s' index cannot be used with bus and unit\n", str);
5693 return -1;
5694 }
5695 if (max_devs == 0)
5696 {
5697 unit_id = index;
5698 bus_id = 0;
5699 } else {
5700 unit_id = index % max_devs;
5701 bus_id = index / max_devs;
5702 }
5703 }
5704
5705 /* if user doesn't specify a unit_id,
5706 * try to find the first free
5707 */
5708
5709 if (unit_id == -1) {
5710 unit_id = 0;
thsf60d39b2007-12-17 03:55:57 +00005711 while (drive_get_index(type, bus_id, unit_id) != -1) {
thse4bcb142007-12-02 04:51:10 +00005712 unit_id++;
5713 if (max_devs && unit_id >= max_devs) {
5714 unit_id -= max_devs;
5715 bus_id++;
5716 }
5717 }
5718 }
5719
5720 /* check unit id */
5721
5722 if (max_devs && unit_id >= max_devs) {
5723 fprintf(stderr, "qemu: '%s' unit %d too big (max is %d)\n",
5724 str, unit_id, max_devs - 1);
5725 return -1;
5726 }
5727
5728 /*
5729 * ignore multiple definitions
5730 */
5731
thsf60d39b2007-12-17 03:55:57 +00005732 if (drive_get_index(type, bus_id, unit_id) != -1)
thse4bcb142007-12-02 04:51:10 +00005733 return 0;
5734
5735 /* init */
5736
thsf60d39b2007-12-17 03:55:57 +00005737 if (type == IF_IDE || type == IF_SCSI)
balrogc8522bd2007-12-06 22:11:20 +00005738 mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd";
balroge6198a72007-12-24 13:58:47 +00005739 if (max_devs)
5740 snprintf(buf, sizeof(buf), "%s%i%s%i",
5741 devname, bus_id, mediastr, unit_id);
5742 else
5743 snprintf(buf, sizeof(buf), "%s%s%i",
5744 devname, mediastr, unit_id);
thse4bcb142007-12-02 04:51:10 +00005745 bdrv = bdrv_new(buf);
5746 drives_table[nb_drives].bdrv = bdrv;
thsf60d39b2007-12-17 03:55:57 +00005747 drives_table[nb_drives].type = type;
thse4bcb142007-12-02 04:51:10 +00005748 drives_table[nb_drives].bus = bus_id;
5749 drives_table[nb_drives].unit = unit_id;
5750 nb_drives++;
5751
thsf60d39b2007-12-17 03:55:57 +00005752 switch(type) {
thse4bcb142007-12-02 04:51:10 +00005753 case IF_IDE:
5754 case IF_SCSI:
5755 switch(media) {
5756 case MEDIA_DISK:
5757 if (cyls != 0) {
5758 bdrv_set_geometry_hint(bdrv, cyls, heads, secs);
5759 bdrv_set_translation_hint(bdrv, translation);
5760 }
5761 break;
5762 case MEDIA_CDROM:
5763 bdrv_set_type_hint(bdrv, BDRV_TYPE_CDROM);
5764 break;
5765 }
5766 break;
5767 case IF_SD:
5768 /* FIXME: This isn't really a floppy, but it's a reasonable
5769 approximation. */
5770 case IF_FLOPPY:
5771 bdrv_set_type_hint(bdrv, BDRV_TYPE_FLOPPY);
5772 break;
5773 case IF_PFLASH:
5774 case IF_MTD:
5775 break;
5776 }
5777 if (!file[0])
5778 return 0;
balrog33f00272007-12-24 14:33:24 +00005779 bdrv_flags = 0;
5780 if (snapshot)
5781 bdrv_flags |= BDRV_O_SNAPSHOT;
5782 if (!cache)
5783 bdrv_flags |= BDRV_O_DIRECT;
aliguori83ab7952008-08-19 14:44:22 +00005784 if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0 || qemu_key_check(bdrv, file)) {
thse4bcb142007-12-02 04:51:10 +00005785 fprintf(stderr, "qemu: could not open disk image %s\n",
5786 file);
5787 return -1;
5788 }
5789 return 0;
5790}
5791
bellard330d0412003-07-26 18:11:40 +00005792/***********************************************************/
bellarda594cfb2005-11-06 16:13:29 +00005793/* USB devices */
5794
pbrook0d92ed32006-05-21 16:30:15 +00005795static USBPort *used_usb_ports;
5796static USBPort *free_usb_ports;
5797
5798/* ??? Maybe change this to register a hub to keep track of the topology. */
5799void qemu_register_usb_port(USBPort *port, void *opaque, int index,
5800 usb_attachfn attach)
5801{
5802 port->opaque = opaque;
5803 port->index = index;
5804 port->attach = attach;
5805 port->next = free_usb_ports;
5806 free_usb_ports = port;
5807}
5808
aliguori4b096fc2008-08-21 19:28:55 +00005809int usb_device_add_dev(USBDevice *dev)
5810{
5811 USBPort *port;
5812
5813 /* Find a USB port to add the device to. */
5814 port = free_usb_ports;
5815 if (!port->next) {
5816 USBDevice *hub;
5817
5818 /* Create a new hub and chain it on. */
5819 free_usb_ports = NULL;
5820 port->next = used_usb_ports;
5821 used_usb_ports = port;
5822
5823 hub = usb_hub_init(VM_USB_HUB_SIZE);
5824 usb_attach(port, hub);
5825 port = free_usb_ports;
5826 }
5827
5828 free_usb_ports = port->next;
5829 port->next = used_usb_ports;
5830 used_usb_ports = port;
5831 usb_attach(port, dev);
5832 return 0;
5833}
5834
bellarda594cfb2005-11-06 16:13:29 +00005835static int usb_device_add(const char *devname)
5836{
5837 const char *p;
5838 USBDevice *dev;
bellarda594cfb2005-11-06 16:13:29 +00005839
pbrook0d92ed32006-05-21 16:30:15 +00005840 if (!free_usb_ports)
bellarda594cfb2005-11-06 16:13:29 +00005841 return -1;
5842
5843 if (strstart(devname, "host:", &p)) {
5844 dev = usb_host_device_open(p);
bellarda594cfb2005-11-06 16:13:29 +00005845 } else if (!strcmp(devname, "mouse")) {
5846 dev = usb_mouse_init();
bellard09b26c52006-04-12 21:09:08 +00005847 } else if (!strcmp(devname, "tablet")) {
balrog47b2d332007-06-22 08:16:00 +00005848 dev = usb_tablet_init();
5849 } else if (!strcmp(devname, "keyboard")) {
5850 dev = usb_keyboard_init();
pbrook2e5d83b2006-05-25 23:58:51 +00005851 } else if (strstart(devname, "disk:", &p)) {
5852 dev = usb_msd_init(p);
balrogf6d2a312007-06-10 19:21:04 +00005853 } else if (!strcmp(devname, "wacom-tablet")) {
5854 dev = usb_wacom_init();
balroga7954212008-01-14 03:41:02 +00005855 } else if (strstart(devname, "serial:", &p)) {
5856 dev = usb_serial_init(p);
aurel322e4d9fb2008-04-08 06:01:02 +00005857#ifdef CONFIG_BRLAPI
5858 } else if (!strcmp(devname, "braille")) {
5859 dev = usb_baum_init();
5860#endif
balrog6c9f8862008-07-17 20:47:13 +00005861 } else if (strstart(devname, "net:", &p)) {
balrog9ad97e62008-07-29 13:16:31 +00005862 int nic = nb_nics;
balrog6c9f8862008-07-17 20:47:13 +00005863
balrog9ad97e62008-07-29 13:16:31 +00005864 if (net_client_init("nic", p) < 0)
balrog6c9f8862008-07-17 20:47:13 +00005865 return -1;
balrog9ad97e62008-07-29 13:16:31 +00005866 nd_table[nic].model = "usb";
5867 dev = usb_net_init(&nd_table[nic]);
bellarda594cfb2005-11-06 16:13:29 +00005868 } else {
5869 return -1;
5870 }
pbrook0d92ed32006-05-21 16:30:15 +00005871 if (!dev)
5872 return -1;
5873
aliguori4b096fc2008-08-21 19:28:55 +00005874 return usb_device_add_dev(dev);
bellarda594cfb2005-11-06 16:13:29 +00005875}
5876
aliguori1f3870a2008-08-21 19:27:48 +00005877int usb_device_del_addr(int bus_num, int addr)
bellarda594cfb2005-11-06 16:13:29 +00005878{
pbrook0d92ed32006-05-21 16:30:15 +00005879 USBPort *port;
5880 USBPort **lastp;
bellard059809e2006-07-19 18:06:15 +00005881 USBDevice *dev;
bellarda594cfb2005-11-06 16:13:29 +00005882
pbrook0d92ed32006-05-21 16:30:15 +00005883 if (!used_usb_ports)
bellarda594cfb2005-11-06 16:13:29 +00005884 return -1;
5885
bellarda594cfb2005-11-06 16:13:29 +00005886 if (bus_num != 0)
5887 return -1;
pbrook0d92ed32006-05-21 16:30:15 +00005888
5889 lastp = &used_usb_ports;
5890 port = used_usb_ports;
5891 while (port && port->dev->addr != addr) {
5892 lastp = &port->next;
5893 port = port->next;
bellarda594cfb2005-11-06 16:13:29 +00005894 }
pbrook0d92ed32006-05-21 16:30:15 +00005895
5896 if (!port)
bellarda594cfb2005-11-06 16:13:29 +00005897 return -1;
pbrook0d92ed32006-05-21 16:30:15 +00005898
bellard059809e2006-07-19 18:06:15 +00005899 dev = port->dev;
pbrook0d92ed32006-05-21 16:30:15 +00005900 *lastp = port->next;
5901 usb_attach(port, NULL);
bellard059809e2006-07-19 18:06:15 +00005902 dev->handle_destroy(dev);
pbrook0d92ed32006-05-21 16:30:15 +00005903 port->next = free_usb_ports;
5904 free_usb_ports = port;
bellarda594cfb2005-11-06 16:13:29 +00005905 return 0;
5906}
5907
aliguori1f3870a2008-08-21 19:27:48 +00005908static int usb_device_del(const char *devname)
5909{
5910 int bus_num, addr;
5911 const char *p;
5912
aliguori5d0c5752008-09-14 01:07:41 +00005913 if (strstart(devname, "host:", &p))
5914 return usb_host_device_close(p);
5915
aliguori1f3870a2008-08-21 19:27:48 +00005916 if (!used_usb_ports)
5917 return -1;
5918
5919 p = strchr(devname, '.');
5920 if (!p)
5921 return -1;
5922 bus_num = strtoul(devname, NULL, 0);
5923 addr = strtoul(p + 1, NULL, 0);
5924
5925 return usb_device_del_addr(bus_num, addr);
5926}
5927
bellarda594cfb2005-11-06 16:13:29 +00005928void do_usb_add(const char *devname)
5929{
aliguori4b096fc2008-08-21 19:28:55 +00005930 usb_device_add(devname);
bellarda594cfb2005-11-06 16:13:29 +00005931}
5932
5933void do_usb_del(const char *devname)
5934{
aliguori4b096fc2008-08-21 19:28:55 +00005935 usb_device_del(devname);
bellarda594cfb2005-11-06 16:13:29 +00005936}
5937
5938void usb_info(void)
5939{
5940 USBDevice *dev;
pbrook0d92ed32006-05-21 16:30:15 +00005941 USBPort *port;
bellarda594cfb2005-11-06 16:13:29 +00005942 const char *speed_str;
5943
pbrook0d92ed32006-05-21 16:30:15 +00005944 if (!usb_enabled) {
bellarda594cfb2005-11-06 16:13:29 +00005945 term_printf("USB support not enabled\n");
5946 return;
5947 }
5948
pbrook0d92ed32006-05-21 16:30:15 +00005949 for (port = used_usb_ports; port; port = port->next) {
5950 dev = port->dev;
5951 if (!dev)
5952 continue;
5953 switch(dev->speed) {
ths5fafdf22007-09-16 21:08:06 +00005954 case USB_SPEED_LOW:
5955 speed_str = "1.5";
pbrook0d92ed32006-05-21 16:30:15 +00005956 break;
ths5fafdf22007-09-16 21:08:06 +00005957 case USB_SPEED_FULL:
5958 speed_str = "12";
pbrook0d92ed32006-05-21 16:30:15 +00005959 break;
ths5fafdf22007-09-16 21:08:06 +00005960 case USB_SPEED_HIGH:
5961 speed_str = "480";
pbrook0d92ed32006-05-21 16:30:15 +00005962 break;
5963 default:
ths5fafdf22007-09-16 21:08:06 +00005964 speed_str = "?";
pbrook0d92ed32006-05-21 16:30:15 +00005965 break;
bellarda594cfb2005-11-06 16:13:29 +00005966 }
ths5fafdf22007-09-16 21:08:06 +00005967 term_printf(" Device %d.%d, Speed %s Mb/s, Product %s\n",
bellard1f6e24e2006-06-26 21:00:51 +00005968 0, dev->addr, speed_str, dev->devname);
bellarda594cfb2005-11-06 16:13:29 +00005969 }
5970}
5971
bellardf7cce892004-12-08 22:21:25 +00005972/***********************************************************/
balrog201a51f2007-04-30 00:51:09 +00005973/* PCMCIA/Cardbus */
5974
5975static struct pcmcia_socket_entry_s {
5976 struct pcmcia_socket_s *socket;
5977 struct pcmcia_socket_entry_s *next;
5978} *pcmcia_sockets = 0;
5979
5980void pcmcia_socket_register(struct pcmcia_socket_s *socket)
5981{
5982 struct pcmcia_socket_entry_s *entry;
5983
5984 entry = qemu_malloc(sizeof(struct pcmcia_socket_entry_s));
5985 entry->socket = socket;
5986 entry->next = pcmcia_sockets;
5987 pcmcia_sockets = entry;
5988}
5989
5990void pcmcia_socket_unregister(struct pcmcia_socket_s *socket)
5991{
5992 struct pcmcia_socket_entry_s *entry, **ptr;
5993
5994 ptr = &pcmcia_sockets;
5995 for (entry = *ptr; entry; ptr = &entry->next, entry = *ptr)
5996 if (entry->socket == socket) {
5997 *ptr = entry->next;
5998 qemu_free(entry);
5999 }
6000}
6001
6002void pcmcia_info(void)
6003{
6004 struct pcmcia_socket_entry_s *iter;
6005 if (!pcmcia_sockets)
6006 term_printf("No PCMCIA sockets\n");
6007
6008 for (iter = pcmcia_sockets; iter; iter = iter->next)
6009 term_printf("%s: %s\n", iter->socket->slot_string,
6010 iter->socket->attached ? iter->socket->card_string :
6011 "Empty");
6012}
6013
6014/***********************************************************/
ths2ff89792007-06-21 23:34:19 +00006015/* dumb display */
6016
6017static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
6018{
6019}
6020
6021static void dumb_resize(DisplayState *ds, int w, int h)
6022{
6023}
6024
6025static void dumb_refresh(DisplayState *ds)
6026{
6027#if defined(CONFIG_SDL)
6028 vga_hw_update();
6029#endif
6030}
6031
6032static void dumb_display_init(DisplayState *ds)
6033{
6034 ds->data = NULL;
6035 ds->linesize = 0;
6036 ds->depth = 0;
6037 ds->dpy_update = dumb_update;
6038 ds->dpy_resize = dumb_resize;
6039 ds->dpy_refresh = dumb_refresh;
aliguoribcfad702008-08-21 20:08:55 +00006040 ds->gui_timer_interval = 500;
6041 ds->idle = 1;
ths2ff89792007-06-21 23:34:19 +00006042}
6043
6044/***********************************************************/
bellard8a7ddc32004-03-31 19:00:16 +00006045/* I/O handling */
bellard0824d6f2003-06-24 13:42:40 +00006046
bellardc4b1fcc2004-03-14 21:44:30 +00006047#define MAX_IO_HANDLERS 64
6048
6049typedef struct IOHandlerRecord {
6050 int fd;
bellard7c9d8e02005-11-15 22:16:05 +00006051 IOCanRWHandler *fd_read_poll;
6052 IOHandler *fd_read;
6053 IOHandler *fd_write;
thscafffd42007-02-28 21:59:44 +00006054 int deleted;
bellardc4b1fcc2004-03-14 21:44:30 +00006055 void *opaque;
6056 /* temporary data */
6057 struct pollfd *ufd;
bellard8a7ddc32004-03-31 19:00:16 +00006058 struct IOHandlerRecord *next;
bellardc4b1fcc2004-03-14 21:44:30 +00006059} IOHandlerRecord;
6060
bellard8a7ddc32004-03-31 19:00:16 +00006061static IOHandlerRecord *first_io_handler;
bellardc4b1fcc2004-03-14 21:44:30 +00006062
bellard7c9d8e02005-11-15 22:16:05 +00006063/* XXX: fd_read_poll should be suppressed, but an API change is
6064 necessary in the character devices to suppress fd_can_read(). */
ths5fafdf22007-09-16 21:08:06 +00006065int qemu_set_fd_handler2(int fd,
6066 IOCanRWHandler *fd_read_poll,
6067 IOHandler *fd_read,
6068 IOHandler *fd_write,
bellard7c9d8e02005-11-15 22:16:05 +00006069 void *opaque)
bellardb4608c02003-06-27 17:34:32 +00006070{
bellard8a7ddc32004-03-31 19:00:16 +00006071 IOHandlerRecord **pioh, *ioh;
6072
bellard7c9d8e02005-11-15 22:16:05 +00006073 if (!fd_read && !fd_write) {
6074 pioh = &first_io_handler;
6075 for(;;) {
6076 ioh = *pioh;
6077 if (ioh == NULL)
6078 break;
6079 if (ioh->fd == fd) {
thscafffd42007-02-28 21:59:44 +00006080 ioh->deleted = 1;
bellard7c9d8e02005-11-15 22:16:05 +00006081 break;
6082 }
6083 pioh = &ioh->next;
bellard8a7ddc32004-03-31 19:00:16 +00006084 }
bellard7c9d8e02005-11-15 22:16:05 +00006085 } else {
6086 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
6087 if (ioh->fd == fd)
6088 goto found;
6089 }
6090 ioh = qemu_mallocz(sizeof(IOHandlerRecord));
6091 if (!ioh)
6092 return -1;
6093 ioh->next = first_io_handler;
6094 first_io_handler = ioh;
6095 found:
6096 ioh->fd = fd;
6097 ioh->fd_read_poll = fd_read_poll;
6098 ioh->fd_read = fd_read;
6099 ioh->fd_write = fd_write;
6100 ioh->opaque = opaque;
thscafffd42007-02-28 21:59:44 +00006101 ioh->deleted = 0;
bellard8a7ddc32004-03-31 19:00:16 +00006102 }
bellard7c9d8e02005-11-15 22:16:05 +00006103 return 0;
6104}
6105
ths5fafdf22007-09-16 21:08:06 +00006106int qemu_set_fd_handler(int fd,
6107 IOHandler *fd_read,
6108 IOHandler *fd_write,
bellard7c9d8e02005-11-15 22:16:05 +00006109 void *opaque)
6110{
6111 return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
bellardb4608c02003-06-27 17:34:32 +00006112}
6113
bellard8a7ddc32004-03-31 19:00:16 +00006114/***********************************************************/
bellardf3311102006-04-12 20:21:17 +00006115/* Polling handling */
6116
6117typedef struct PollingEntry {
6118 PollingFunc *func;
6119 void *opaque;
6120 struct PollingEntry *next;
6121} PollingEntry;
6122
6123static PollingEntry *first_polling_entry;
6124
6125int qemu_add_polling_cb(PollingFunc *func, void *opaque)
6126{
6127 PollingEntry **ppe, *pe;
6128 pe = qemu_mallocz(sizeof(PollingEntry));
6129 if (!pe)
6130 return -1;
6131 pe->func = func;
6132 pe->opaque = opaque;
6133 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
6134 *ppe = pe;
6135 return 0;
6136}
6137
6138void qemu_del_polling_cb(PollingFunc *func, void *opaque)
6139{
6140 PollingEntry **ppe, *pe;
6141 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
6142 pe = *ppe;
6143 if (pe->func == func && pe->opaque == opaque) {
6144 *ppe = pe->next;
6145 qemu_free(pe);
6146 break;
6147 }
6148 }
6149}
6150
bellarda18e5242006-06-25 17:18:27 +00006151#ifdef _WIN32
6152/***********************************************************/
6153/* Wait objects support */
6154typedef struct WaitObjects {
6155 int num;
6156 HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
6157 WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
6158 void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
6159} WaitObjects;
6160
6161static WaitObjects wait_objects = {0};
ths3b46e622007-09-17 08:09:54 +00006162
bellarda18e5242006-06-25 17:18:27 +00006163int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
6164{
6165 WaitObjects *w = &wait_objects;
6166
6167 if (w->num >= MAXIMUM_WAIT_OBJECTS)
6168 return -1;
6169 w->events[w->num] = handle;
6170 w->func[w->num] = func;
6171 w->opaque[w->num] = opaque;
6172 w->num++;
6173 return 0;
6174}
6175
6176void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
6177{
6178 int i, found;
6179 WaitObjects *w = &wait_objects;
6180
6181 found = 0;
6182 for (i = 0; i < w->num; i++) {
6183 if (w->events[i] == handle)
6184 found = 1;
6185 if (found) {
6186 w->events[i] = w->events[i + 1];
6187 w->func[i] = w->func[i + 1];
6188 w->opaque[i] = w->opaque[i + 1];
ths3b46e622007-09-17 08:09:54 +00006189 }
bellarda18e5242006-06-25 17:18:27 +00006190 }
6191 if (found)
6192 w->num--;
6193}
6194#endif
6195
bellardf3311102006-04-12 20:21:17 +00006196/***********************************************************/
bellard8a7ddc32004-03-31 19:00:16 +00006197/* savevm/loadvm support */
bellardb4608c02003-06-27 17:34:32 +00006198
bellardfaea38e2006-08-05 21:31:00 +00006199#define IO_BUF_SIZE 32768
6200
6201struct QEMUFile {
aliguori5dafc532008-09-29 16:25:16 +00006202 QEMUFilePutBufferFunc *put_buffer;
6203 QEMUFileGetBufferFunc *get_buffer;
6204 QEMUFileCloseFunc *close;
6205 QEMUFileRateLimit *rate_limit;
6206 void *opaque;
6207
bellardfaea38e2006-08-05 21:31:00 +00006208 int64_t buf_offset; /* start of buffer when writing, end of buffer
6209 when reading */
6210 int buf_index;
6211 int buf_size; /* 0 when writing */
6212 uint8_t buf[IO_BUF_SIZE];
6213};
6214
aliguori5dafc532008-09-29 16:25:16 +00006215typedef struct QEMUFileFD
6216{
6217 int fd;
6218 QEMUFile *file;
6219} QEMUFileFD;
6220
6221static void fd_put_notify(void *opaque)
6222{
6223 QEMUFileFD *s = opaque;
6224
6225 /* Remove writable callback and do a put notify */
6226 qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
6227 qemu_file_put_notify(s->file);
6228}
6229
6230static int fd_put_buffer(void *opaque, const uint8_t *buf,
6231 int64_t pos, int size)
6232{
6233 QEMUFileFD *s = opaque;
6234 ssize_t len;
6235
6236 do {
6237 len = write(s->fd, buf, size);
6238 } while (len == -1 && errno == EINTR);
6239
6240 if (len == -1)
6241 len = -errno;
6242
6243 /* When the fd becomes writable again, register a callback to do
6244 * a put notify */
6245 if (len == -EAGAIN)
6246 qemu_set_fd_handler2(s->fd, NULL, NULL, fd_put_notify, s);
6247
6248 return len;
6249}
6250
6251static int fd_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
6252{
6253 QEMUFileFD *s = opaque;
6254 ssize_t len;
6255
6256 do {
6257 len = read(s->fd, buf, size);
6258 } while (len == -1 && errno == EINTR);
6259
6260 if (len == -1)
6261 len = -errno;
6262
6263 return len;
6264}
6265
6266static int fd_close(void *opaque)
6267{
6268 QEMUFileFD *s = opaque;
6269 qemu_free(s);
6270 return 0;
6271}
6272
6273QEMUFile *qemu_fopen_fd(int fd)
6274{
6275 QEMUFileFD *s = qemu_mallocz(sizeof(QEMUFileFD));
6276
6277 if (s == NULL)
6278 return NULL;
6279
6280 s->fd = fd;
6281 s->file = qemu_fopen_ops(s, fd_put_buffer, fd_get_buffer, fd_close, NULL);
6282 return s->file;
6283}
6284
6285typedef struct QEMUFileStdio
6286{
6287 FILE *outfile;
6288} QEMUFileStdio;
6289
6290static void file_put_buffer(void *opaque, const uint8_t *buf,
6291 int64_t pos, int size)
6292{
6293 QEMUFileStdio *s = opaque;
6294 fseek(s->outfile, pos, SEEK_SET);
6295 fwrite(buf, 1, size, s->outfile);
6296}
6297
6298static int file_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
6299{
6300 QEMUFileStdio *s = opaque;
6301 fseek(s->outfile, pos, SEEK_SET);
6302 return fread(buf, 1, size, s->outfile);
6303}
6304
6305static int file_close(void *opaque)
6306{
6307 QEMUFileStdio *s = opaque;
6308 fclose(s->outfile);
6309 qemu_free(s);
6310 return 0;
6311}
6312
bellardfaea38e2006-08-05 21:31:00 +00006313QEMUFile *qemu_fopen(const char *filename, const char *mode)
6314{
aliguori5dafc532008-09-29 16:25:16 +00006315 QEMUFileStdio *s;
bellardfaea38e2006-08-05 21:31:00 +00006316
aliguori5dafc532008-09-29 16:25:16 +00006317 s = qemu_mallocz(sizeof(QEMUFileStdio));
6318 if (!s)
bellardfaea38e2006-08-05 21:31:00 +00006319 return NULL;
aliguori5dafc532008-09-29 16:25:16 +00006320
6321 s->outfile = fopen(filename, mode);
6322 if (!s->outfile)
bellardfaea38e2006-08-05 21:31:00 +00006323 goto fail;
aliguori5dafc532008-09-29 16:25:16 +00006324
6325 if (!strcmp(mode, "wb"))
6326 return qemu_fopen_ops(s, file_put_buffer, NULL, file_close, NULL);
6327 else if (!strcmp(mode, "rb"))
6328 return qemu_fopen_ops(s, NULL, file_get_buffer, file_close, NULL);
6329
6330fail:
6331 if (s->outfile)
6332 fclose(s->outfile);
6333 qemu_free(s);
bellardfaea38e2006-08-05 21:31:00 +00006334 return NULL;
6335}
6336
aliguori5dafc532008-09-29 16:25:16 +00006337typedef struct QEMUFileBdrv
6338{
6339 BlockDriverState *bs;
6340 int64_t base_offset;
6341} QEMUFileBdrv;
6342
6343static void bdrv_put_buffer(void *opaque, const uint8_t *buf,
6344 int64_t pos, int size)
6345{
6346 QEMUFileBdrv *s = opaque;
6347 bdrv_pwrite(s->bs, s->base_offset + pos, buf, size);
6348}
6349
6350static int bdrv_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
6351{
6352 QEMUFileBdrv *s = opaque;
6353 return bdrv_pread(s->bs, s->base_offset + pos, buf, size);
6354}
6355
6356static int bdrv_fclose(void *opaque)
6357{
6358 QEMUFileBdrv *s = opaque;
6359 qemu_free(s);
6360 return 0;
6361}
6362
blueswir1674bb262008-09-30 18:18:27 +00006363static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int64_t offset, int is_writable)
aliguori5dafc532008-09-29 16:25:16 +00006364{
6365 QEMUFileBdrv *s;
6366
6367 s = qemu_mallocz(sizeof(QEMUFileBdrv));
6368 if (!s)
6369 return NULL;
6370
6371 s->bs = bs;
6372 s->base_offset = offset;
6373
6374 if (is_writable)
6375 return qemu_fopen_ops(s, bdrv_put_buffer, NULL, bdrv_fclose, NULL);
6376
6377 return qemu_fopen_ops(s, NULL, bdrv_get_buffer, bdrv_fclose, NULL);
6378}
6379
6380QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,
6381 QEMUFileGetBufferFunc *get_buffer,
6382 QEMUFileCloseFunc *close,
6383 QEMUFileRateLimit *rate_limit)
bellardfaea38e2006-08-05 21:31:00 +00006384{
6385 QEMUFile *f;
6386
6387 f = qemu_mallocz(sizeof(QEMUFile));
6388 if (!f)
6389 return NULL;
aliguori5dafc532008-09-29 16:25:16 +00006390
6391 f->opaque = opaque;
6392 f->put_buffer = put_buffer;
6393 f->get_buffer = get_buffer;
6394 f->close = close;
6395 f->rate_limit = rate_limit;
6396
bellardfaea38e2006-08-05 21:31:00 +00006397 return f;
6398}
6399
6400void qemu_fflush(QEMUFile *f)
6401{
aliguori5dafc532008-09-29 16:25:16 +00006402 if (!f->put_buffer)
bellardfaea38e2006-08-05 21:31:00 +00006403 return;
aliguori5dafc532008-09-29 16:25:16 +00006404
bellardfaea38e2006-08-05 21:31:00 +00006405 if (f->buf_index > 0) {
aliguori5dafc532008-09-29 16:25:16 +00006406 f->put_buffer(f->opaque, f->buf, f->buf_offset, f->buf_index);
bellardfaea38e2006-08-05 21:31:00 +00006407 f->buf_offset += f->buf_index;
6408 f->buf_index = 0;
6409 }
6410}
6411
6412static void qemu_fill_buffer(QEMUFile *f)
6413{
6414 int len;
6415
aliguori5dafc532008-09-29 16:25:16 +00006416 if (!f->get_buffer)
bellardfaea38e2006-08-05 21:31:00 +00006417 return;
aliguori5dafc532008-09-29 16:25:16 +00006418
6419 len = f->get_buffer(f->opaque, f->buf, f->buf_offset, IO_BUF_SIZE);
6420 if (len < 0)
6421 len = 0;
6422
bellardfaea38e2006-08-05 21:31:00 +00006423 f->buf_index = 0;
6424 f->buf_size = len;
6425 f->buf_offset += len;
6426}
6427
aliguori5dafc532008-09-29 16:25:16 +00006428int qemu_fclose(QEMUFile *f)
bellardfaea38e2006-08-05 21:31:00 +00006429{
aliguori5dafc532008-09-29 16:25:16 +00006430 int ret = 0;
6431 qemu_fflush(f);
6432 if (f->close)
6433 ret = f->close(f->opaque);
bellardfaea38e2006-08-05 21:31:00 +00006434 qemu_free(f);
aliguori5dafc532008-09-29 16:25:16 +00006435 return ret;
6436}
6437
6438void qemu_file_put_notify(QEMUFile *f)
6439{
6440 f->put_buffer(f->opaque, NULL, 0, 0);
bellardfaea38e2006-08-05 21:31:00 +00006441}
6442
blueswir12ca83a82008-09-25 20:24:19 +00006443void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
bellard8a7ddc32004-03-31 19:00:16 +00006444{
blueswir12ca83a82008-09-25 20:24:19 +00006445 int l;
bellardfaea38e2006-08-05 21:31:00 +00006446 while (size > 0) {
6447 l = IO_BUF_SIZE - f->buf_index;
6448 if (l > size)
6449 l = size;
6450 memcpy(f->buf + f->buf_index, buf, l);
6451 f->buf_index += l;
6452 buf += l;
6453 size -= l;
6454 if (f->buf_index >= IO_BUF_SIZE)
6455 qemu_fflush(f);
6456 }
bellard8a7ddc32004-03-31 19:00:16 +00006457}
6458
blueswir12ca83a82008-09-25 20:24:19 +00006459void qemu_put_byte(QEMUFile *f, int v)
bellard8a7ddc32004-03-31 19:00:16 +00006460{
bellardfaea38e2006-08-05 21:31:00 +00006461 f->buf[f->buf_index++] = v;
6462 if (f->buf_index >= IO_BUF_SIZE)
6463 qemu_fflush(f);
6464}
6465
blueswir12ca83a82008-09-25 20:24:19 +00006466int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size1)
bellardfaea38e2006-08-05 21:31:00 +00006467{
blueswir12ca83a82008-09-25 20:24:19 +00006468 int size, l;
bellardfaea38e2006-08-05 21:31:00 +00006469
6470 size = size1;
6471 while (size > 0) {
6472 l = f->buf_size - f->buf_index;
6473 if (l == 0) {
6474 qemu_fill_buffer(f);
6475 l = f->buf_size - f->buf_index;
6476 if (l == 0)
6477 break;
6478 }
6479 if (l > size)
6480 l = size;
6481 memcpy(buf, f->buf + f->buf_index, l);
6482 f->buf_index += l;
6483 buf += l;
6484 size -= l;
6485 }
6486 return size1 - size;
6487}
6488
blueswir12ca83a82008-09-25 20:24:19 +00006489int qemu_get_byte(QEMUFile *f)
bellardfaea38e2006-08-05 21:31:00 +00006490{
6491 if (f->buf_index >= f->buf_size) {
6492 qemu_fill_buffer(f);
6493 if (f->buf_index >= f->buf_size)
6494 return 0;
6495 }
6496 return f->buf[f->buf_index++];
6497}
6498
6499int64_t qemu_ftell(QEMUFile *f)
6500{
6501 return f->buf_offset - f->buf_size + f->buf_index;
6502}
6503
6504int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
6505{
6506 if (whence == SEEK_SET) {
6507 /* nothing to do */
6508 } else if (whence == SEEK_CUR) {
6509 pos += qemu_ftell(f);
6510 } else {
6511 /* SEEK_END not supported */
6512 return -1;
6513 }
aliguori5dafc532008-09-29 16:25:16 +00006514 if (f->put_buffer) {
bellardfaea38e2006-08-05 21:31:00 +00006515 qemu_fflush(f);
6516 f->buf_offset = pos;
6517 } else {
6518 f->buf_offset = pos;
6519 f->buf_index = 0;
6520 f->buf_size = 0;
6521 }
6522 return pos;
bellard8a7ddc32004-03-31 19:00:16 +00006523}
6524
aliguori5dafc532008-09-29 16:25:16 +00006525int qemu_file_rate_limit(QEMUFile *f)
6526{
6527 if (f->rate_limit)
6528 return f->rate_limit(f->opaque);
6529
6530 return 0;
6531}
6532
blueswir12ca83a82008-09-25 20:24:19 +00006533void qemu_put_be16(QEMUFile *f, unsigned int v)
bellard8a7ddc32004-03-31 19:00:16 +00006534{
6535 qemu_put_byte(f, v >> 8);
6536 qemu_put_byte(f, v);
6537}
6538
blueswir12ca83a82008-09-25 20:24:19 +00006539void qemu_put_be32(QEMUFile *f, unsigned int v)
bellard8a7ddc32004-03-31 19:00:16 +00006540{
6541 qemu_put_byte(f, v >> 24);
6542 qemu_put_byte(f, v >> 16);
6543 qemu_put_byte(f, v >> 8);
6544 qemu_put_byte(f, v);
6545}
6546
6547void qemu_put_be64(QEMUFile *f, uint64_t v)
6548{
6549 qemu_put_be32(f, v >> 32);
6550 qemu_put_be32(f, v);
6551}
6552
blueswir12ca83a82008-09-25 20:24:19 +00006553unsigned int qemu_get_be16(QEMUFile *f)
bellard8a7ddc32004-03-31 19:00:16 +00006554{
blueswir12ca83a82008-09-25 20:24:19 +00006555 unsigned int v;
bellard8a7ddc32004-03-31 19:00:16 +00006556 v = qemu_get_byte(f) << 8;
6557 v |= qemu_get_byte(f);
6558 return v;
6559}
6560
blueswir12ca83a82008-09-25 20:24:19 +00006561unsigned int qemu_get_be32(QEMUFile *f)
bellard8a7ddc32004-03-31 19:00:16 +00006562{
blueswir12ca83a82008-09-25 20:24:19 +00006563 unsigned int v;
bellard8a7ddc32004-03-31 19:00:16 +00006564 v = qemu_get_byte(f) << 24;
6565 v |= qemu_get_byte(f) << 16;
6566 v |= qemu_get_byte(f) << 8;
6567 v |= qemu_get_byte(f);
6568 return v;
6569}
6570
6571uint64_t qemu_get_be64(QEMUFile *f)
6572{
6573 uint64_t v;
6574 v = (uint64_t)qemu_get_be32(f) << 32;
6575 v |= qemu_get_be32(f);
6576 return v;
6577}
6578
bellard8a7ddc32004-03-31 19:00:16 +00006579typedef struct SaveStateEntry {
6580 char idstr[256];
6581 int instance_id;
6582 int version_id;
6583 SaveStateHandler *save_state;
6584 LoadStateHandler *load_state;
6585 void *opaque;
6586 struct SaveStateEntry *next;
6587} SaveStateEntry;
6588
6589static SaveStateEntry *first_se;
6590
pbrook18be5182008-07-01 21:31:54 +00006591/* TODO: Individual devices generally have very little idea about the rest
ths18fdb1c2008-07-18 18:02:34 +00006592 of the system, so instance_id should be removed/replaced.
6593 Meanwhile pass -1 as instance_id if you do not already have a clearly
6594 distinguishing id for all instances of your device class. */
ths5fafdf22007-09-16 21:08:06 +00006595int register_savevm(const char *idstr,
6596 int instance_id,
bellard8a7ddc32004-03-31 19:00:16 +00006597 int version_id,
6598 SaveStateHandler *save_state,
6599 LoadStateHandler *load_state,
6600 void *opaque)
6601{
6602 SaveStateEntry *se, **pse;
6603
6604 se = qemu_malloc(sizeof(SaveStateEntry));
6605 if (!se)
6606 return -1;
6607 pstrcpy(se->idstr, sizeof(se->idstr), idstr);
pbrook18be5182008-07-01 21:31:54 +00006608 se->instance_id = (instance_id == -1) ? 0 : instance_id;
bellard8a7ddc32004-03-31 19:00:16 +00006609 se->version_id = version_id;
6610 se->save_state = save_state;
6611 se->load_state = load_state;
6612 se->opaque = opaque;
6613 se->next = NULL;
6614
6615 /* add at the end of list */
6616 pse = &first_se;
pbrook18be5182008-07-01 21:31:54 +00006617 while (*pse != NULL) {
6618 if (instance_id == -1
6619 && strcmp(se->idstr, (*pse)->idstr) == 0
6620 && se->instance_id <= (*pse)->instance_id)
6621 se->instance_id = (*pse)->instance_id + 1;
bellard8a7ddc32004-03-31 19:00:16 +00006622 pse = &(*pse)->next;
pbrook18be5182008-07-01 21:31:54 +00006623 }
bellard8a7ddc32004-03-31 19:00:16 +00006624 *pse = se;
6625 return 0;
6626}
6627
6628#define QEMU_VM_FILE_MAGIC 0x5145564d
bellardfaea38e2006-08-05 21:31:00 +00006629#define QEMU_VM_FILE_VERSION 0x00000002
bellard8a7ddc32004-03-31 19:00:16 +00006630
pbrook9596ebb2007-11-18 01:44:38 +00006631static int qemu_savevm_state(QEMUFile *f)
bellard8a7ddc32004-03-31 19:00:16 +00006632{
6633 SaveStateEntry *se;
bellardfaea38e2006-08-05 21:31:00 +00006634 int len, ret;
6635 int64_t cur_pos, len_pos, total_len_pos;
bellard313aa562003-08-10 21:52:11 +00006636
bellard8a7ddc32004-03-31 19:00:16 +00006637 qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
6638 qemu_put_be32(f, QEMU_VM_FILE_VERSION);
bellardfaea38e2006-08-05 21:31:00 +00006639 total_len_pos = qemu_ftell(f);
6640 qemu_put_be64(f, 0); /* total size */
bellard8a7ddc32004-03-31 19:00:16 +00006641
6642 for(se = first_se; se != NULL; se = se->next) {
aurel32d978c022008-06-18 22:10:21 +00006643 if (se->save_state == NULL)
6644 /* this one has a loader only, for backwards compatibility */
6645 continue;
6646
bellard8a7ddc32004-03-31 19:00:16 +00006647 /* ID string */
6648 len = strlen(se->idstr);
6649 qemu_put_byte(f, len);
thsffe8ab82007-12-16 03:16:05 +00006650 qemu_put_buffer(f, (uint8_t *)se->idstr, len);
bellard8a7ddc32004-03-31 19:00:16 +00006651
6652 qemu_put_be32(f, se->instance_id);
6653 qemu_put_be32(f, se->version_id);
6654
6655 /* record size: filled later */
bellardfaea38e2006-08-05 21:31:00 +00006656 len_pos = qemu_ftell(f);
bellard8a7ddc32004-03-31 19:00:16 +00006657 qemu_put_be32(f, 0);
bellard8a7ddc32004-03-31 19:00:16 +00006658 se->save_state(f, se->opaque);
6659
6660 /* fill record size */
bellardfaea38e2006-08-05 21:31:00 +00006661 cur_pos = qemu_ftell(f);
6662 len = cur_pos - len_pos - 4;
6663 qemu_fseek(f, len_pos, SEEK_SET);
bellard8a7ddc32004-03-31 19:00:16 +00006664 qemu_put_be32(f, len);
bellardfaea38e2006-08-05 21:31:00 +00006665 qemu_fseek(f, cur_pos, SEEK_SET);
bellard8a7ddc32004-03-31 19:00:16 +00006666 }
bellardfaea38e2006-08-05 21:31:00 +00006667 cur_pos = qemu_ftell(f);
6668 qemu_fseek(f, total_len_pos, SEEK_SET);
6669 qemu_put_be64(f, cur_pos - total_len_pos - 8);
6670 qemu_fseek(f, cur_pos, SEEK_SET);
bellard8a7ddc32004-03-31 19:00:16 +00006671
bellard8a7ddc32004-03-31 19:00:16 +00006672 ret = 0;
bellard8a7ddc32004-03-31 19:00:16 +00006673 return ret;
6674}
6675
6676static SaveStateEntry *find_se(const char *idstr, int instance_id)
6677{
6678 SaveStateEntry *se;
6679
6680 for(se = first_se; se != NULL; se = se->next) {
ths5fafdf22007-09-16 21:08:06 +00006681 if (!strcmp(se->idstr, idstr) &&
bellard8a7ddc32004-03-31 19:00:16 +00006682 instance_id == se->instance_id)
6683 return se;
6684 }
6685 return NULL;
6686}
6687
pbrook9596ebb2007-11-18 01:44:38 +00006688static int qemu_loadvm_state(QEMUFile *f)
bellard8a7ddc32004-03-31 19:00:16 +00006689{
6690 SaveStateEntry *se;
bellardfaea38e2006-08-05 21:31:00 +00006691 int len, ret, instance_id, record_len, version_id;
6692 int64_t total_len, end_pos, cur_pos;
bellard8a7ddc32004-03-31 19:00:16 +00006693 unsigned int v;
6694 char idstr[256];
ths3b46e622007-09-17 08:09:54 +00006695
bellard8a7ddc32004-03-31 19:00:16 +00006696 v = qemu_get_be32(f);
6697 if (v != QEMU_VM_FILE_MAGIC)
6698 goto fail;
6699 v = qemu_get_be32(f);
6700 if (v != QEMU_VM_FILE_VERSION) {
6701 fail:
bellard8a7ddc32004-03-31 19:00:16 +00006702 ret = -1;
6703 goto the_end;
6704 }
bellardfaea38e2006-08-05 21:31:00 +00006705 total_len = qemu_get_be64(f);
6706 end_pos = total_len + qemu_ftell(f);
bellardb4608c02003-06-27 17:34:32 +00006707 for(;;) {
bellardfaea38e2006-08-05 21:31:00 +00006708 if (qemu_ftell(f) >= end_pos)
bellard8a7ddc32004-03-31 19:00:16 +00006709 break;
bellardfaea38e2006-08-05 21:31:00 +00006710 len = qemu_get_byte(f);
thsffe8ab82007-12-16 03:16:05 +00006711 qemu_get_buffer(f, (uint8_t *)idstr, len);
bellard8a7ddc32004-03-31 19:00:16 +00006712 idstr[len] = '\0';
6713 instance_id = qemu_get_be32(f);
6714 version_id = qemu_get_be32(f);
6715 record_len = qemu_get_be32(f);
6716#if 0
ths5fafdf22007-09-16 21:08:06 +00006717 printf("idstr=%s instance=0x%x version=%d len=%d\n",
bellard8a7ddc32004-03-31 19:00:16 +00006718 idstr, instance_id, version_id, record_len);
bellardc45886d2004-01-05 00:02:06 +00006719#endif
bellardfaea38e2006-08-05 21:31:00 +00006720 cur_pos = qemu_ftell(f);
bellard8a7ddc32004-03-31 19:00:16 +00006721 se = find_se(idstr, instance_id);
6722 if (!se) {
ths5fafdf22007-09-16 21:08:06 +00006723 fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n",
bellard8a7ddc32004-03-31 19:00:16 +00006724 instance_id, idstr);
6725 } else {
6726 ret = se->load_state(f, se->opaque, version_id);
6727 if (ret < 0) {
ths5fafdf22007-09-16 21:08:06 +00006728 fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
bellard8a7ddc32004-03-31 19:00:16 +00006729 instance_id, idstr);
6730 }
bellard34865132003-10-05 14:28:56 +00006731 }
bellard8a7ddc32004-03-31 19:00:16 +00006732 /* always seek to exact end of record */
6733 qemu_fseek(f, cur_pos + record_len, SEEK_SET);
6734 }
bellard8a7ddc32004-03-31 19:00:16 +00006735 ret = 0;
6736 the_end:
bellardfaea38e2006-08-05 21:31:00 +00006737 return ret;
6738}
6739
6740/* device can contain snapshots */
6741static int bdrv_can_snapshot(BlockDriverState *bs)
6742{
6743 return (bs &&
6744 !bdrv_is_removable(bs) &&
6745 !bdrv_is_read_only(bs));
6746}
6747
6748/* device must be snapshots in order to have a reliable snapshot */
6749static int bdrv_has_snapshot(BlockDriverState *bs)
6750{
6751 return (bs &&
6752 !bdrv_is_removable(bs) &&
6753 !bdrv_is_read_only(bs));
6754}
6755
6756static BlockDriverState *get_bs_snapshots(void)
6757{
6758 BlockDriverState *bs;
6759 int i;
6760
6761 if (bs_snapshots)
6762 return bs_snapshots;
thse4bcb142007-12-02 04:51:10 +00006763 for(i = 0; i <= nb_drives; i++) {
6764 bs = drives_table[i].bdrv;
bellardfaea38e2006-08-05 21:31:00 +00006765 if (bdrv_can_snapshot(bs))
6766 goto ok;
6767 }
6768 return NULL;
6769 ok:
6770 bs_snapshots = bs;
6771 return bs;
6772}
6773
6774static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
6775 const char *name)
6776{
6777 QEMUSnapshotInfo *sn_tab, *sn;
6778 int nb_sns, i, ret;
ths3b46e622007-09-17 08:09:54 +00006779
bellardfaea38e2006-08-05 21:31:00 +00006780 ret = -ENOENT;
6781 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
6782 if (nb_sns < 0)
6783 return ret;
6784 for(i = 0; i < nb_sns; i++) {
6785 sn = &sn_tab[i];
6786 if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
6787 *sn_info = *sn;
6788 ret = 0;
6789 break;
6790 }
6791 }
6792 qemu_free(sn_tab);
6793 return ret;
6794}
6795
6796void do_savevm(const char *name)
6797{
6798 BlockDriverState *bs, *bs1;
6799 QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
6800 int must_delete, ret, i;
6801 BlockDriverInfo bdi1, *bdi = &bdi1;
6802 QEMUFile *f;
6803 int saved_vm_running;
bellard4c279bd2006-08-17 09:43:50 +00006804#ifdef _WIN32
6805 struct _timeb tb;
6806#else
bellardfaea38e2006-08-05 21:31:00 +00006807 struct timeval tv;
bellard4c279bd2006-08-17 09:43:50 +00006808#endif
bellardfaea38e2006-08-05 21:31:00 +00006809
6810 bs = get_bs_snapshots();
6811 if (!bs) {
6812 term_printf("No block device can accept snapshots\n");
6813 return;
6814 }
6815
pbrook6192bc32006-09-03 12:08:37 +00006816 /* ??? Should this occur after vm_stop? */
6817 qemu_aio_flush();
6818
bellardfaea38e2006-08-05 21:31:00 +00006819 saved_vm_running = vm_running;
6820 vm_stop(0);
ths3b46e622007-09-17 08:09:54 +00006821
bellardfaea38e2006-08-05 21:31:00 +00006822 must_delete = 0;
6823 if (name) {
6824 ret = bdrv_snapshot_find(bs, old_sn, name);
6825 if (ret >= 0) {
6826 must_delete = 1;
6827 }
6828 }
6829 memset(sn, 0, sizeof(*sn));
6830 if (must_delete) {
6831 pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
6832 pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
6833 } else {
6834 if (name)
6835 pstrcpy(sn->name, sizeof(sn->name), name);
6836 }
6837
6838 /* fill auxiliary fields */
bellard4c279bd2006-08-17 09:43:50 +00006839#ifdef _WIN32
6840 _ftime(&tb);
6841 sn->date_sec = tb.time;
6842 sn->date_nsec = tb.millitm * 1000000;
6843#else
bellardfaea38e2006-08-05 21:31:00 +00006844 gettimeofday(&tv, NULL);
6845 sn->date_sec = tv.tv_sec;
6846 sn->date_nsec = tv.tv_usec * 1000;
bellard4c279bd2006-08-17 09:43:50 +00006847#endif
bellardfaea38e2006-08-05 21:31:00 +00006848 sn->vm_clock_nsec = qemu_get_clock(vm_clock);
ths3b46e622007-09-17 08:09:54 +00006849
bellardfaea38e2006-08-05 21:31:00 +00006850 if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
6851 term_printf("Device %s does not support VM state snapshots\n",
6852 bdrv_get_device_name(bs));
6853 goto the_end;
6854 }
ths3b46e622007-09-17 08:09:54 +00006855
bellardfaea38e2006-08-05 21:31:00 +00006856 /* save the VM state */
6857 f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 1);
6858 if (!f) {
6859 term_printf("Could not open VM state file\n");
6860 goto the_end;
6861 }
6862 ret = qemu_savevm_state(f);
6863 sn->vm_state_size = qemu_ftell(f);
6864 qemu_fclose(f);
6865 if (ret < 0) {
6866 term_printf("Error %d while writing VM\n", ret);
6867 goto the_end;
6868 }
ths3b46e622007-09-17 08:09:54 +00006869
bellardfaea38e2006-08-05 21:31:00 +00006870 /* create the snapshots */
6871
thse4bcb142007-12-02 04:51:10 +00006872 for(i = 0; i < nb_drives; i++) {
6873 bs1 = drives_table[i].bdrv;
bellardfaea38e2006-08-05 21:31:00 +00006874 if (bdrv_has_snapshot(bs1)) {
6875 if (must_delete) {
6876 ret = bdrv_snapshot_delete(bs1, old_sn->id_str);
6877 if (ret < 0) {
6878 term_printf("Error while deleting snapshot on '%s'\n",
6879 bdrv_get_device_name(bs1));
6880 }
6881 }
6882 ret = bdrv_snapshot_create(bs1, sn);
6883 if (ret < 0) {
6884 term_printf("Error while creating snapshot on '%s'\n",
6885 bdrv_get_device_name(bs1));
6886 }
6887 }
6888 }
6889
6890 the_end:
bellard8a7ddc32004-03-31 19:00:16 +00006891 if (saved_vm_running)
6892 vm_start();
bellardfaea38e2006-08-05 21:31:00 +00006893}
6894
6895void do_loadvm(const char *name)
6896{
6897 BlockDriverState *bs, *bs1;
6898 BlockDriverInfo bdi1, *bdi = &bdi1;
6899 QEMUFile *f;
6900 int i, ret;
6901 int saved_vm_running;
6902
6903 bs = get_bs_snapshots();
6904 if (!bs) {
6905 term_printf("No block device supports snapshots\n");
6906 return;
6907 }
ths3b46e622007-09-17 08:09:54 +00006908
pbrook6192bc32006-09-03 12:08:37 +00006909 /* Flush all IO requests so they don't interfere with the new state. */
6910 qemu_aio_flush();
6911
bellardfaea38e2006-08-05 21:31:00 +00006912 saved_vm_running = vm_running;
6913 vm_stop(0);
6914
thse4bcb142007-12-02 04:51:10 +00006915 for(i = 0; i <= nb_drives; i++) {
6916 bs1 = drives_table[i].bdrv;
bellardfaea38e2006-08-05 21:31:00 +00006917 if (bdrv_has_snapshot(bs1)) {
6918 ret = bdrv_snapshot_goto(bs1, name);
6919 if (ret < 0) {
6920 if (bs != bs1)
6921 term_printf("Warning: ");
6922 switch(ret) {
6923 case -ENOTSUP:
6924 term_printf("Snapshots not supported on device '%s'\n",
6925 bdrv_get_device_name(bs1));
6926 break;
6927 case -ENOENT:
6928 term_printf("Could not find snapshot '%s' on device '%s'\n",
6929 name, bdrv_get_device_name(bs1));
6930 break;
6931 default:
6932 term_printf("Error %d while activating snapshot on '%s'\n",
6933 ret, bdrv_get_device_name(bs1));
6934 break;
6935 }
6936 /* fatal on snapshot block device */
6937 if (bs == bs1)
6938 goto the_end;
6939 }
6940 }
6941 }
6942
6943 if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
6944 term_printf("Device %s does not support VM state snapshots\n",
6945 bdrv_get_device_name(bs));
6946 return;
6947 }
ths3b46e622007-09-17 08:09:54 +00006948
bellardfaea38e2006-08-05 21:31:00 +00006949 /* restore the VM state */
6950 f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 0);
6951 if (!f) {
6952 term_printf("Could not open VM state file\n");
6953 goto the_end;
6954 }
6955 ret = qemu_loadvm_state(f);
6956 qemu_fclose(f);
6957 if (ret < 0) {
6958 term_printf("Error %d while loading VM state\n", ret);
6959 }
6960 the_end:
6961 if (saved_vm_running)
6962 vm_start();
6963}
6964
6965void do_delvm(const char *name)
6966{
6967 BlockDriverState *bs, *bs1;
6968 int i, ret;
6969
6970 bs = get_bs_snapshots();
6971 if (!bs) {
6972 term_printf("No block device supports snapshots\n");
6973 return;
6974 }
ths3b46e622007-09-17 08:09:54 +00006975
thse4bcb142007-12-02 04:51:10 +00006976 for(i = 0; i <= nb_drives; i++) {
6977 bs1 = drives_table[i].bdrv;
bellardfaea38e2006-08-05 21:31:00 +00006978 if (bdrv_has_snapshot(bs1)) {
6979 ret = bdrv_snapshot_delete(bs1, name);
6980 if (ret < 0) {
6981 if (ret == -ENOTSUP)
6982 term_printf("Snapshots not supported on device '%s'\n",
6983 bdrv_get_device_name(bs1));
6984 else
6985 term_printf("Error %d while deleting snapshot on '%s'\n",
6986 ret, bdrv_get_device_name(bs1));
6987 }
6988 }
6989 }
6990}
6991
6992void do_info_snapshots(void)
6993{
6994 BlockDriverState *bs, *bs1;
6995 QEMUSnapshotInfo *sn_tab, *sn;
6996 int nb_sns, i;
6997 char buf[256];
6998
6999 bs = get_bs_snapshots();
7000 if (!bs) {
7001 term_printf("No available block device supports snapshots\n");
7002 return;
7003 }
7004 term_printf("Snapshot devices:");
thse4bcb142007-12-02 04:51:10 +00007005 for(i = 0; i <= nb_drives; i++) {
7006 bs1 = drives_table[i].bdrv;
bellardfaea38e2006-08-05 21:31:00 +00007007 if (bdrv_has_snapshot(bs1)) {
7008 if (bs == bs1)
7009 term_printf(" %s", bdrv_get_device_name(bs1));
7010 }
7011 }
7012 term_printf("\n");
7013
7014 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
7015 if (nb_sns < 0) {
7016 term_printf("bdrv_snapshot_list: error %d\n", nb_sns);
7017 return;
7018 }
7019 term_printf("Snapshot list (from %s):\n", bdrv_get_device_name(bs));
7020 term_printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
7021 for(i = 0; i < nb_sns; i++) {
7022 sn = &sn_tab[i];
7023 term_printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
7024 }
7025 qemu_free(sn_tab);
bellard8a7ddc32004-03-31 19:00:16 +00007026}
7027
7028/***********************************************************/
bellard8a7ddc32004-03-31 19:00:16 +00007029/* ram save/restore */
7030
bellard8a7ddc32004-03-31 19:00:16 +00007031static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
7032{
7033 int v;
7034
7035 v = qemu_get_byte(f);
7036 switch(v) {
7037 case 0:
7038 if (qemu_get_buffer(f, buf, len) != len)
7039 return -EIO;
7040 break;
7041 case 1:
7042 v = qemu_get_byte(f);
7043 memset(buf, v, len);
7044 break;
7045 default:
7046 return -EINVAL;
7047 }
7048 return 0;
7049}
7050
bellardc88676f2006-08-06 13:36:11 +00007051static int ram_load_v1(QEMUFile *f, void *opaque)
bellard8a7ddc32004-03-31 19:00:16 +00007052{
aurel3200f82b82008-04-27 21:12:55 +00007053 int ret;
7054 ram_addr_t i;
bellard8a7ddc32004-03-31 19:00:16 +00007055
bellard8a7ddc32004-03-31 19:00:16 +00007056 if (qemu_get_be32(f) != phys_ram_size)
7057 return -EINVAL;
7058 for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
7059 ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
7060 if (ret)
7061 return ret;
7062 }
7063 return 0;
7064}
7065
bellardc88676f2006-08-06 13:36:11 +00007066#define BDRV_HASH_BLOCK_SIZE 1024
7067#define IOBUF_SIZE 4096
7068#define RAM_CBLOCK_MAGIC 0xfabe
7069
7070typedef struct RamCompressState {
7071 z_stream zstream;
7072 QEMUFile *f;
7073 uint8_t buf[IOBUF_SIZE];
7074} RamCompressState;
7075
7076static int ram_compress_open(RamCompressState *s, QEMUFile *f)
7077{
7078 int ret;
7079 memset(s, 0, sizeof(*s));
7080 s->f = f;
7081 ret = deflateInit2(&s->zstream, 1,
ths5fafdf22007-09-16 21:08:06 +00007082 Z_DEFLATED, 15,
bellardc88676f2006-08-06 13:36:11 +00007083 9, Z_DEFAULT_STRATEGY);
7084 if (ret != Z_OK)
7085 return -1;
7086 s->zstream.avail_out = IOBUF_SIZE;
7087 s->zstream.next_out = s->buf;
7088 return 0;
7089}
7090
7091static void ram_put_cblock(RamCompressState *s, const uint8_t *buf, int len)
7092{
7093 qemu_put_be16(s->f, RAM_CBLOCK_MAGIC);
7094 qemu_put_be16(s->f, len);
7095 qemu_put_buffer(s->f, buf, len);
7096}
7097
7098static int ram_compress_buf(RamCompressState *s, const uint8_t *buf, int len)
7099{
7100 int ret;
7101
7102 s->zstream.avail_in = len;
7103 s->zstream.next_in = (uint8_t *)buf;
7104 while (s->zstream.avail_in > 0) {
7105 ret = deflate(&s->zstream, Z_NO_FLUSH);
7106 if (ret != Z_OK)
7107 return -1;
7108 if (s->zstream.avail_out == 0) {
7109 ram_put_cblock(s, s->buf, IOBUF_SIZE);
7110 s->zstream.avail_out = IOBUF_SIZE;
7111 s->zstream.next_out = s->buf;
7112 }
7113 }
7114 return 0;
7115}
7116
7117static void ram_compress_close(RamCompressState *s)
7118{
7119 int len, ret;
7120
7121 /* compress last bytes */
7122 for(;;) {
7123 ret = deflate(&s->zstream, Z_FINISH);
7124 if (ret == Z_OK || ret == Z_STREAM_END) {
7125 len = IOBUF_SIZE - s->zstream.avail_out;
7126 if (len > 0) {
7127 ram_put_cblock(s, s->buf, len);
7128 }
7129 s->zstream.avail_out = IOBUF_SIZE;
7130 s->zstream.next_out = s->buf;
7131 if (ret == Z_STREAM_END)
7132 break;
7133 } else {
7134 goto fail;
7135 }
7136 }
7137fail:
7138 deflateEnd(&s->zstream);
7139}
7140
7141typedef struct RamDecompressState {
7142 z_stream zstream;
7143 QEMUFile *f;
7144 uint8_t buf[IOBUF_SIZE];
7145} RamDecompressState;
7146
7147static int ram_decompress_open(RamDecompressState *s, QEMUFile *f)
7148{
7149 int ret;
7150 memset(s, 0, sizeof(*s));
7151 s->f = f;
7152 ret = inflateInit(&s->zstream);
7153 if (ret != Z_OK)
7154 return -1;
7155 return 0;
7156}
7157
7158static int ram_decompress_buf(RamDecompressState *s, uint8_t *buf, int len)
7159{
7160 int ret, clen;
7161
7162 s->zstream.avail_out = len;
7163 s->zstream.next_out = buf;
7164 while (s->zstream.avail_out > 0) {
7165 if (s->zstream.avail_in == 0) {
7166 if (qemu_get_be16(s->f) != RAM_CBLOCK_MAGIC)
7167 return -1;
7168 clen = qemu_get_be16(s->f);
7169 if (clen > IOBUF_SIZE)
7170 return -1;
7171 qemu_get_buffer(s->f, s->buf, clen);
7172 s->zstream.avail_in = clen;
7173 s->zstream.next_in = s->buf;
7174 }
7175 ret = inflate(&s->zstream, Z_PARTIAL_FLUSH);
7176 if (ret != Z_OK && ret != Z_STREAM_END) {
7177 return -1;
7178 }
7179 }
7180 return 0;
7181}
7182
7183static void ram_decompress_close(RamDecompressState *s)
7184{
7185 inflateEnd(&s->zstream);
7186}
7187
7188static void ram_save(QEMUFile *f, void *opaque)
7189{
aurel3200f82b82008-04-27 21:12:55 +00007190 ram_addr_t i;
bellardc88676f2006-08-06 13:36:11 +00007191 RamCompressState s1, *s = &s1;
7192 uint8_t buf[10];
ths3b46e622007-09-17 08:09:54 +00007193
bellardc88676f2006-08-06 13:36:11 +00007194 qemu_put_be32(f, phys_ram_size);
7195 if (ram_compress_open(s, f) < 0)
7196 return;
7197 for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
7198#if 0
7199 if (tight_savevm_enabled) {
7200 int64_t sector_num;
7201 int j;
7202
7203 /* find if the memory block is available on a virtual
7204 block device */
7205 sector_num = -1;
thse4bcb142007-12-02 04:51:10 +00007206 for(j = 0; j < nb_drives; j++) {
7207 sector_num = bdrv_hash_find(drives_table[j].bdrv,
7208 phys_ram_base + i,
7209 BDRV_HASH_BLOCK_SIZE);
7210 if (sector_num >= 0)
7211 break;
bellardc88676f2006-08-06 13:36:11 +00007212 }
thse4bcb142007-12-02 04:51:10 +00007213 if (j == nb_drives)
bellardc88676f2006-08-06 13:36:11 +00007214 goto normal_compress;
7215 buf[0] = 1;
7216 buf[1] = j;
7217 cpu_to_be64wu((uint64_t *)(buf + 2), sector_num);
7218 ram_compress_buf(s, buf, 10);
ths5fafdf22007-09-16 21:08:06 +00007219 } else
bellardc88676f2006-08-06 13:36:11 +00007220#endif
7221 {
7222 // normal_compress:
7223 buf[0] = 0;
7224 ram_compress_buf(s, buf, 1);
7225 ram_compress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE);
7226 }
7227 }
7228 ram_compress_close(s);
7229}
7230
7231static int ram_load(QEMUFile *f, void *opaque, int version_id)
7232{
7233 RamDecompressState s1, *s = &s1;
7234 uint8_t buf[10];
aurel3200f82b82008-04-27 21:12:55 +00007235 ram_addr_t i;
bellardc88676f2006-08-06 13:36:11 +00007236
7237 if (version_id == 1)
7238 return ram_load_v1(f, opaque);
7239 if (version_id != 2)
7240 return -EINVAL;
7241 if (qemu_get_be32(f) != phys_ram_size)
7242 return -EINVAL;
7243 if (ram_decompress_open(s, f) < 0)
7244 return -EINVAL;
7245 for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
7246 if (ram_decompress_buf(s, buf, 1) < 0) {
7247 fprintf(stderr, "Error while reading ram block header\n");
7248 goto error;
7249 }
7250 if (buf[0] == 0) {
7251 if (ram_decompress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE) < 0) {
aurel3200f82b82008-04-27 21:12:55 +00007252 fprintf(stderr, "Error while reading ram block address=0x%08" PRIx64, (uint64_t)i);
bellardc88676f2006-08-06 13:36:11 +00007253 goto error;
7254 }
ths5fafdf22007-09-16 21:08:06 +00007255 } else
bellardc88676f2006-08-06 13:36:11 +00007256#if 0
7257 if (buf[0] == 1) {
7258 int bs_index;
7259 int64_t sector_num;
7260
7261 ram_decompress_buf(s, buf + 1, 9);
7262 bs_index = buf[1];
7263 sector_num = be64_to_cpupu((const uint64_t *)(buf + 2));
thse4bcb142007-12-02 04:51:10 +00007264 if (bs_index >= nb_drives) {
bellardc88676f2006-08-06 13:36:11 +00007265 fprintf(stderr, "Invalid block device index %d\n", bs_index);
7266 goto error;
7267 }
thse4bcb142007-12-02 04:51:10 +00007268 if (bdrv_read(drives_table[bs_index].bdrv, sector_num,
7269 phys_ram_base + i,
bellardc88676f2006-08-06 13:36:11 +00007270 BDRV_HASH_BLOCK_SIZE / 512) < 0) {
ths5fafdf22007-09-16 21:08:06 +00007271 fprintf(stderr, "Error while reading sector %d:%" PRId64 "\n",
bellardc88676f2006-08-06 13:36:11 +00007272 bs_index, sector_num);
7273 goto error;
7274 }
ths5fafdf22007-09-16 21:08:06 +00007275 } else
bellardc88676f2006-08-06 13:36:11 +00007276#endif
7277 {
7278 error:
7279 printf("Error block header\n");
7280 return -EINVAL;
7281 }
7282 }
7283 ram_decompress_close(s);
7284 return 0;
7285}
7286
bellard8a7ddc32004-03-31 19:00:16 +00007287/***********************************************************/
bellard83f64092006-08-01 16:21:11 +00007288/* bottom halves (can be seen as timers which expire ASAP) */
7289
7290struct QEMUBH {
7291 QEMUBHFunc *cb;
7292 void *opaque;
7293 int scheduled;
7294 QEMUBH *next;
7295};
7296
7297static QEMUBH *first_bh = NULL;
7298
7299QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
7300{
7301 QEMUBH *bh;
7302 bh = qemu_mallocz(sizeof(QEMUBH));
7303 if (!bh)
7304 return NULL;
7305 bh->cb = cb;
7306 bh->opaque = opaque;
7307 return bh;
7308}
7309
bellard6eb57332006-08-06 09:51:25 +00007310int qemu_bh_poll(void)
bellard83f64092006-08-01 16:21:11 +00007311{
7312 QEMUBH *bh, **pbh;
bellard6eb57332006-08-06 09:51:25 +00007313 int ret;
bellard83f64092006-08-01 16:21:11 +00007314
bellard6eb57332006-08-06 09:51:25 +00007315 ret = 0;
bellard83f64092006-08-01 16:21:11 +00007316 for(;;) {
7317 pbh = &first_bh;
7318 bh = *pbh;
7319 if (!bh)
7320 break;
bellard6eb57332006-08-06 09:51:25 +00007321 ret = 1;
bellard83f64092006-08-01 16:21:11 +00007322 *pbh = bh->next;
7323 bh->scheduled = 0;
7324 bh->cb(bh->opaque);
7325 }
bellard6eb57332006-08-06 09:51:25 +00007326 return ret;
bellard83f64092006-08-01 16:21:11 +00007327}
7328
7329void qemu_bh_schedule(QEMUBH *bh)
7330{
7331 CPUState *env = cpu_single_env;
7332 if (bh->scheduled)
7333 return;
7334 bh->scheduled = 1;
7335 bh->next = first_bh;
7336 first_bh = bh;
7337
7338 /* stop the currently executing CPU to execute the BH ASAP */
7339 if (env) {
7340 cpu_interrupt(env, CPU_INTERRUPT_EXIT);
7341 }
7342}
7343
7344void qemu_bh_cancel(QEMUBH *bh)
7345{
7346 QEMUBH **pbh;
7347 if (bh->scheduled) {
7348 pbh = &first_bh;
7349 while (*pbh != bh)
7350 pbh = &(*pbh)->next;
7351 *pbh = bh->next;
7352 bh->scheduled = 0;
7353 }
7354}
7355
7356void qemu_bh_delete(QEMUBH *bh)
7357{
7358 qemu_bh_cancel(bh);
7359 qemu_free(bh);
7360}
7361
7362/***********************************************************/
bellardcc1daa42005-06-05 14:49:17 +00007363/* machine registration */
7364
7365QEMUMachine *first_machine = NULL;
7366
7367int qemu_register_machine(QEMUMachine *m)
7368{
7369 QEMUMachine **pm;
7370 pm = &first_machine;
7371 while (*pm != NULL)
7372 pm = &(*pm)->next;
7373 m->next = NULL;
7374 *pm = m;
7375 return 0;
7376}
7377
pbrook9596ebb2007-11-18 01:44:38 +00007378static QEMUMachine *find_machine(const char *name)
bellardcc1daa42005-06-05 14:49:17 +00007379{
7380 QEMUMachine *m;
7381
7382 for(m = first_machine; m != NULL; m = m->next) {
7383 if (!strcmp(m->name, name))
7384 return m;
7385 }
7386 return NULL;
7387}
7388
7389/***********************************************************/
bellard8a7ddc32004-03-31 19:00:16 +00007390/* main execution loop */
7391
pbrook9596ebb2007-11-18 01:44:38 +00007392static void gui_update(void *opaque)
bellard8a7ddc32004-03-31 19:00:16 +00007393{
ths740733b2007-06-08 01:57:56 +00007394 DisplayState *ds = opaque;
7395 ds->dpy_refresh(ds);
aurel32f442e082008-03-13 19:20:33 +00007396 qemu_mod_timer(ds->gui_timer,
7397 (ds->gui_timer_interval ?
7398 ds->gui_timer_interval :
7399 GUI_REFRESH_INTERVAL)
7400 + qemu_get_clock(rt_clock));
bellard8a7ddc32004-03-31 19:00:16 +00007401}
7402
bellard0bd48852005-11-11 00:00:47 +00007403struct vm_change_state_entry {
7404 VMChangeStateHandler *cb;
7405 void *opaque;
7406 LIST_ENTRY (vm_change_state_entry) entries;
7407};
7408
7409static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
7410
7411VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
7412 void *opaque)
7413{
7414 VMChangeStateEntry *e;
7415
7416 e = qemu_mallocz(sizeof (*e));
7417 if (!e)
7418 return NULL;
7419
7420 e->cb = cb;
7421 e->opaque = opaque;
7422 LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
7423 return e;
7424}
7425
7426void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
7427{
7428 LIST_REMOVE (e, entries);
7429 qemu_free (e);
7430}
7431
7432static void vm_state_notify(int running)
7433{
7434 VMChangeStateEntry *e;
7435
7436 for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
7437 e->cb(e->opaque, running);
7438 }
7439}
7440
bellard8a7ddc32004-03-31 19:00:16 +00007441/* XXX: support several handlers */
bellard0bd48852005-11-11 00:00:47 +00007442static VMStopHandler *vm_stop_cb;
7443static void *vm_stop_opaque;
bellard8a7ddc32004-03-31 19:00:16 +00007444
7445int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
7446{
7447 vm_stop_cb = cb;
7448 vm_stop_opaque = opaque;
7449 return 0;
7450}
7451
7452void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
7453{
7454 vm_stop_cb = NULL;
7455}
7456
7457void vm_start(void)
7458{
7459 if (!vm_running) {
7460 cpu_enable_ticks();
7461 vm_running = 1;
bellard0bd48852005-11-11 00:00:47 +00007462 vm_state_notify(1);
thsefe75412007-08-24 01:36:32 +00007463 qemu_rearm_alarm_timer(alarm_timer);
bellard8a7ddc32004-03-31 19:00:16 +00007464 }
7465}
7466
ths5fafdf22007-09-16 21:08:06 +00007467void vm_stop(int reason)
bellard8a7ddc32004-03-31 19:00:16 +00007468{
7469 if (vm_running) {
7470 cpu_disable_ticks();
7471 vm_running = 0;
7472 if (reason != 0) {
7473 if (vm_stop_cb) {
7474 vm_stop_cb(vm_stop_opaque, reason);
7475 }
7476 }
bellard0bd48852005-11-11 00:00:47 +00007477 vm_state_notify(0);
bellard8a7ddc32004-03-31 19:00:16 +00007478 }
7479}
7480
bellardbb0c6722004-06-20 12:37:32 +00007481/* reset/shutdown handler */
7482
7483typedef struct QEMUResetEntry {
7484 QEMUResetHandler *func;
7485 void *opaque;
7486 struct QEMUResetEntry *next;
7487} QEMUResetEntry;
7488
7489static QEMUResetEntry *first_reset_entry;
7490static int reset_requested;
7491static int shutdown_requested;
bellard34751872005-07-02 14:31:34 +00007492static int powerdown_requested;
bellardbb0c6722004-06-20 12:37:32 +00007493
aurel32cf7a2fe2008-03-18 06:53:05 +00007494int qemu_shutdown_requested(void)
7495{
7496 int r = shutdown_requested;
7497 shutdown_requested = 0;
7498 return r;
7499}
7500
7501int qemu_reset_requested(void)
7502{
7503 int r = reset_requested;
7504 reset_requested = 0;
7505 return r;
7506}
7507
7508int qemu_powerdown_requested(void)
7509{
7510 int r = powerdown_requested;
7511 powerdown_requested = 0;
7512 return r;
7513}
7514
bellardbb0c6722004-06-20 12:37:32 +00007515void qemu_register_reset(QEMUResetHandler *func, void *opaque)
7516{
7517 QEMUResetEntry **pre, *re;
7518
7519 pre = &first_reset_entry;
7520 while (*pre != NULL)
7521 pre = &(*pre)->next;
7522 re = qemu_mallocz(sizeof(QEMUResetEntry));
7523 re->func = func;
7524 re->opaque = opaque;
7525 re->next = NULL;
7526 *pre = re;
7527}
7528
aurel32cf7a2fe2008-03-18 06:53:05 +00007529void qemu_system_reset(void)
bellardbb0c6722004-06-20 12:37:32 +00007530{
7531 QEMUResetEntry *re;
7532
7533 /* reset all devices */
7534 for(re = first_reset_entry; re != NULL; re = re->next) {
7535 re->func(re->opaque);
7536 }
7537}
7538
7539void qemu_system_reset_request(void)
7540{
bellardd1beab82006-10-02 19:44:22 +00007541 if (no_reboot) {
7542 shutdown_requested = 1;
7543 } else {
7544 reset_requested = 1;
7545 }
bellard6a00d602005-11-21 23:25:50 +00007546 if (cpu_single_env)
7547 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
bellardbb0c6722004-06-20 12:37:32 +00007548}
7549
7550void qemu_system_shutdown_request(void)
7551{
7552 shutdown_requested = 1;
bellard6a00d602005-11-21 23:25:50 +00007553 if (cpu_single_env)
7554 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
bellardbb0c6722004-06-20 12:37:32 +00007555}
7556
bellard34751872005-07-02 14:31:34 +00007557void qemu_system_powerdown_request(void)
7558{
7559 powerdown_requested = 1;
bellard6a00d602005-11-21 23:25:50 +00007560 if (cpu_single_env)
7561 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
bellardbb0c6722004-06-20 12:37:32 +00007562}
7563
bellard5905b2e2004-08-01 21:53:26 +00007564void main_loop_wait(int timeout)
bellard8a7ddc32004-03-31 19:00:16 +00007565{
thscafffd42007-02-28 21:59:44 +00007566 IOHandlerRecord *ioh;
bellarde0356492006-05-01 13:33:02 +00007567 fd_set rfds, wfds, xfds;
ths877cf882007-04-18 18:11:47 +00007568 int ret, nfds;
7569#ifdef _WIN32
7570 int ret2, i;
7571#endif
bellardfd1dff42006-02-01 21:29:26 +00007572 struct timeval tv;
bellardf3311102006-04-12 20:21:17 +00007573 PollingEntry *pe;
bellardc4b1fcc2004-03-14 21:44:30 +00007574
bellardf3311102006-04-12 20:21:17 +00007575
7576 /* XXX: need to suppress polling by better using win32 events */
7577 ret = 0;
7578 for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
7579 ret |= pe->func(pe->opaque);
7580 }
bellard38e205a2004-04-06 19:29:17 +00007581#ifdef _WIN32
thse6b1e552007-04-18 17:56:02 +00007582 if (ret == 0) {
bellarda18e5242006-06-25 17:18:27 +00007583 int err;
7584 WaitObjects *w = &wait_objects;
ths3b46e622007-09-17 08:09:54 +00007585
bellarda18e5242006-06-25 17:18:27 +00007586 ret = WaitForMultipleObjects(w->num, w->events, FALSE, timeout);
7587 if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
7588 if (w->func[ret - WAIT_OBJECT_0])
7589 w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
ths3b46e622007-09-17 08:09:54 +00007590
ths5fafdf22007-09-16 21:08:06 +00007591 /* Check for additional signaled events */
thse6b1e552007-04-18 17:56:02 +00007592 for(i = (ret - WAIT_OBJECT_0 + 1); i < w->num; i++) {
ths3b46e622007-09-17 08:09:54 +00007593
thse6b1e552007-04-18 17:56:02 +00007594 /* Check if event is signaled */
7595 ret2 = WaitForSingleObject(w->events[i], 0);
7596 if(ret2 == WAIT_OBJECT_0) {
7597 if (w->func[i])
7598 w->func[i](w->opaque[i]);
7599 } else if (ret2 == WAIT_TIMEOUT) {
7600 } else {
7601 err = GetLastError();
7602 fprintf(stderr, "WaitForSingleObject error %d %d\n", i, err);
ths3b46e622007-09-17 08:09:54 +00007603 }
7604 }
bellarda18e5242006-06-25 17:18:27 +00007605 } else if (ret == WAIT_TIMEOUT) {
7606 } else {
7607 err = GetLastError();
thse6b1e552007-04-18 17:56:02 +00007608 fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
bellarda18e5242006-06-25 17:18:27 +00007609 }
bellardf3311102006-04-12 20:21:17 +00007610 }
bellardfd1dff42006-02-01 21:29:26 +00007611#endif
7612 /* poll any events */
7613 /* XXX: separate device handlers from system ones */
7614 nfds = -1;
7615 FD_ZERO(&rfds);
7616 FD_ZERO(&wfds);
bellarde0356492006-05-01 13:33:02 +00007617 FD_ZERO(&xfds);
bellardfd1dff42006-02-01 21:29:26 +00007618 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
thscafffd42007-02-28 21:59:44 +00007619 if (ioh->deleted)
7620 continue;
bellardfd1dff42006-02-01 21:29:26 +00007621 if (ioh->fd_read &&
7622 (!ioh->fd_read_poll ||
7623 ioh->fd_read_poll(ioh->opaque) != 0)) {
7624 FD_SET(ioh->fd, &rfds);
7625 if (ioh->fd > nfds)
7626 nfds = ioh->fd;
7627 }
7628 if (ioh->fd_write) {
7629 FD_SET(ioh->fd, &wfds);
7630 if (ioh->fd > nfds)
7631 nfds = ioh->fd;
7632 }
7633 }
ths3b46e622007-09-17 08:09:54 +00007634
bellardfd1dff42006-02-01 21:29:26 +00007635 tv.tv_sec = 0;
7636#ifdef _WIN32
7637 tv.tv_usec = 0;
bellard38e205a2004-04-06 19:29:17 +00007638#else
bellardfd1dff42006-02-01 21:29:26 +00007639 tv.tv_usec = timeout * 1000;
7640#endif
bellarde0356492006-05-01 13:33:02 +00007641#if defined(CONFIG_SLIRP)
7642 if (slirp_inited) {
7643 slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
7644 }
7645#endif
7646 ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
bellardfd1dff42006-02-01 21:29:26 +00007647 if (ret > 0) {
thscafffd42007-02-28 21:59:44 +00007648 IOHandlerRecord **pioh;
7649
7650 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
ths6ab43fd2007-08-25 01:34:19 +00007651 if (!ioh->deleted && ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) {
bellardfd1dff42006-02-01 21:29:26 +00007652 ioh->fd_read(ioh->opaque);
bellardc4b1fcc2004-03-14 21:44:30 +00007653 }
ths6ab43fd2007-08-25 01:34:19 +00007654 if (!ioh->deleted && ioh->fd_write && FD_ISSET(ioh->fd, &wfds)) {
bellardfd1dff42006-02-01 21:29:26 +00007655 ioh->fd_write(ioh->opaque);
bellardb4608c02003-06-27 17:34:32 +00007656 }
7657 }
thscafffd42007-02-28 21:59:44 +00007658
7659 /* remove deleted IO handlers */
7660 pioh = &first_io_handler;
7661 while (*pioh) {
7662 ioh = *pioh;
7663 if (ioh->deleted) {
7664 *pioh = ioh->next;
7665 qemu_free(ioh);
ths5fafdf22007-09-16 21:08:06 +00007666 } else
thscafffd42007-02-28 21:59:44 +00007667 pioh = &ioh->next;
7668 }
bellardfd1dff42006-02-01 21:29:26 +00007669 }
bellarde0356492006-05-01 13:33:02 +00007670#if defined(CONFIG_SLIRP)
7671 if (slirp_inited) {
7672 if (ret < 0) {
7673 FD_ZERO(&rfds);
7674 FD_ZERO(&wfds);
7675 FD_ZERO(&xfds);
7676 }
7677 slirp_select_poll(&rfds, &wfds, &xfds);
7678 }
7679#endif
bellardc20709a2004-04-21 23:27:19 +00007680
bellardfd1dff42006-02-01 21:29:26 +00007681 if (vm_running) {
edgar_igl21b20812008-05-15 19:54:00 +00007682 if (likely(!(cur_cpu->singlestep_enabled & SSTEP_NOTIMER)))
ths5fafdf22007-09-16 21:08:06 +00007683 qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
bellardfd1dff42006-02-01 21:29:26 +00007684 qemu_get_clock(vm_clock));
7685 /* run dma transfers, if any */
7686 DMA_run();
7687 }
pbrook423f0742007-05-23 00:06:54 +00007688
bellardfd1dff42006-02-01 21:29:26 +00007689 /* real time timers */
ths5fafdf22007-09-16 21:08:06 +00007690 qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
bellardfd1dff42006-02-01 21:29:26 +00007691 qemu_get_clock(rt_clock));
pbrook423f0742007-05-23 00:06:54 +00007692
balrogd5d08332008-01-05 19:41:47 +00007693 if (alarm_timer->flags & ALARM_FLAG_EXPIRED) {
7694 alarm_timer->flags &= ~(ALARM_FLAG_EXPIRED);
7695 qemu_rearm_alarm_timer(alarm_timer);
7696 }
balrogb99dc0d2007-12-16 13:17:12 +00007697
pbrook423f0742007-05-23 00:06:54 +00007698 /* Check bottom-halves last in case any of the earlier events triggered
7699 them. */
7700 qemu_bh_poll();
ths3b46e622007-09-17 08:09:54 +00007701
bellard5905b2e2004-08-01 21:53:26 +00007702}
7703
pbrook9596ebb2007-11-18 01:44:38 +00007704static int main_loop(void)
bellard5905b2e2004-08-01 21:53:26 +00007705{
7706 int ret, timeout;
bellard89bfc102006-02-08 22:46:31 +00007707#ifdef CONFIG_PROFILER
7708 int64_t ti;
7709#endif
bellard6a00d602005-11-21 23:25:50 +00007710 CPUState *env;
bellard5905b2e2004-08-01 21:53:26 +00007711
bellard6a00d602005-11-21 23:25:50 +00007712 cur_cpu = first_cpu;
balrogee5605e2007-12-03 03:01:40 +00007713 next_cpu = cur_cpu->next_cpu ?: first_cpu;
bellard5905b2e2004-08-01 21:53:26 +00007714 for(;;) {
7715 if (vm_running) {
bellard15a76442005-11-23 21:01:03 +00007716
bellard15a76442005-11-23 21:01:03 +00007717 for(;;) {
7718 /* get next cpu */
balrogee5605e2007-12-03 03:01:40 +00007719 env = next_cpu;
bellard89bfc102006-02-08 22:46:31 +00007720#ifdef CONFIG_PROFILER
7721 ti = profile_getclock();
7722#endif
pbrook2e70f6e2008-06-29 01:03:05 +00007723 if (use_icount) {
7724 int64_t count;
7725 int decr;
7726 qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
7727 env->icount_decr.u16.low = 0;
7728 env->icount_extra = 0;
7729 count = qemu_next_deadline();
7730 count = (count + (1 << icount_time_shift) - 1)
7731 >> icount_time_shift;
7732 qemu_icount += count;
7733 decr = (count > 0xffff) ? 0xffff : count;
7734 count -= decr;
7735 env->icount_decr.u16.low = decr;
7736 env->icount_extra = count;
7737 }
bellard6a00d602005-11-21 23:25:50 +00007738 ret = cpu_exec(env);
bellard89bfc102006-02-08 22:46:31 +00007739#ifdef CONFIG_PROFILER
7740 qemu_time += profile_getclock() - ti;
7741#endif
pbrook2e70f6e2008-06-29 01:03:05 +00007742 if (use_icount) {
7743 /* Fold pending instructions back into the
7744 instruction counter, and clear the interrupt flag. */
7745 qemu_icount -= (env->icount_decr.u16.low
7746 + env->icount_extra);
7747 env->icount_decr.u32 = 0;
7748 env->icount_extra = 0;
7749 }
balrogee5605e2007-12-03 03:01:40 +00007750 next_cpu = env->next_cpu ?: first_cpu;
aurel3295b01002008-04-04 17:16:35 +00007751 if (event_pending && likely(ret != EXCP_DEBUG)) {
balrogee5605e2007-12-03 03:01:40 +00007752 ret = EXCP_INTERRUPT;
7753 event_pending = 0;
7754 break;
7755 }
pbrookbd967e02007-03-11 18:54:57 +00007756 if (ret == EXCP_HLT) {
7757 /* Give the next CPU a chance to run. */
7758 cur_cpu = env;
7759 continue;
7760 }
bellard15a76442005-11-23 21:01:03 +00007761 if (ret != EXCP_HALTED)
7762 break;
7763 /* all CPUs are halted ? */
pbrookbd967e02007-03-11 18:54:57 +00007764 if (env == cur_cpu)
bellard15a76442005-11-23 21:01:03 +00007765 break;
bellard15a76442005-11-23 21:01:03 +00007766 }
7767 cur_cpu = env;
7768
bellard5905b2e2004-08-01 21:53:26 +00007769 if (shutdown_requested) {
bellard34751872005-07-02 14:31:34 +00007770 ret = EXCP_INTERRUPT;
aurel32b2f76162008-04-11 21:35:52 +00007771 if (no_shutdown) {
7772 vm_stop(0);
7773 no_shutdown = 0;
7774 }
7775 else
7776 break;
bellard5905b2e2004-08-01 21:53:26 +00007777 }
7778 if (reset_requested) {
7779 reset_requested = 0;
7780 qemu_system_reset();
bellard34751872005-07-02 14:31:34 +00007781 ret = EXCP_INTERRUPT;
7782 }
7783 if (powerdown_requested) {
7784 powerdown_requested = 0;
7785 qemu_system_powerdown();
7786 ret = EXCP_INTERRUPT;
bellard5905b2e2004-08-01 21:53:26 +00007787 }
aurel3295b01002008-04-04 17:16:35 +00007788 if (unlikely(ret == EXCP_DEBUG)) {
bellard5905b2e2004-08-01 21:53:26 +00007789 vm_stop(EXCP_DEBUG);
7790 }
pbrookbd967e02007-03-11 18:54:57 +00007791 /* If all cpus are halted then wait until the next IRQ */
bellard5905b2e2004-08-01 21:53:26 +00007792 /* XXX: use timeout computed from timers */
pbrook2e70f6e2008-06-29 01:03:05 +00007793 if (ret == EXCP_HALTED) {
7794 if (use_icount) {
7795 int64_t add;
7796 int64_t delta;
7797 /* Advance virtual time to the next event. */
7798 if (use_icount == 1) {
7799 /* When not using an adaptive execution frequency
7800 we tend to get badly out of sync with real time,
thsbf20dc02008-06-30 17:22:19 +00007801 so just delay for a reasonable amount of time. */
pbrook2e70f6e2008-06-29 01:03:05 +00007802 delta = 0;
7803 } else {
7804 delta = cpu_get_icount() - cpu_get_clock();
7805 }
7806 if (delta > 0) {
7807 /* If virtual time is ahead of real time then just
7808 wait for IO. */
7809 timeout = (delta / 1000000) + 1;
7810 } else {
7811 /* Wait for either IO to occur or the next
7812 timer event. */
7813 add = qemu_next_deadline();
7814 /* We advance the timer before checking for IO.
7815 Limit the amount we advance so that early IO
7816 activity won't get the guest too far ahead. */
7817 if (add > 10000000)
7818 add = 10000000;
7819 delta += add;
7820 add = (add + (1 << icount_time_shift) - 1)
7821 >> icount_time_shift;
7822 qemu_icount += add;
7823 timeout = delta / 1000000;
7824 if (timeout < 0)
7825 timeout = 0;
7826 }
7827 } else {
7828 timeout = 10;
7829 }
7830 } else {
bellard5905b2e2004-08-01 21:53:26 +00007831 timeout = 0;
pbrook2e70f6e2008-06-29 01:03:05 +00007832 }
bellard5905b2e2004-08-01 21:53:26 +00007833 } else {
blueswir198448f52008-09-30 18:16:09 +00007834 if (shutdown_requested) {
7835 ret = EXCP_INTERRUPT;
aliguori5b08fc12008-08-21 20:08:03 +00007836 break;
blueswir198448f52008-09-30 18:16:09 +00007837 }
bellard5905b2e2004-08-01 21:53:26 +00007838 timeout = 10;
7839 }
bellard89bfc102006-02-08 22:46:31 +00007840#ifdef CONFIG_PROFILER
7841 ti = profile_getclock();
7842#endif
bellard5905b2e2004-08-01 21:53:26 +00007843 main_loop_wait(timeout);
bellard89bfc102006-02-08 22:46:31 +00007844#ifdef CONFIG_PROFILER
7845 dev_time += profile_getclock() - ti;
7846#endif
bellardb4608c02003-06-27 17:34:32 +00007847 }
bellard34865132003-10-05 14:28:56 +00007848 cpu_disable_ticks();
7849 return ret;
bellardb4608c02003-06-27 17:34:32 +00007850}
7851
ths15f82202007-06-29 23:26:08 +00007852static void help(int exitcode)
bellard0824d6f2003-06-24 13:42:40 +00007853{
bellard68d0f702008-01-06 17:21:48 +00007854 printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n"
bellard0db63472003-10-27 21:37:46 +00007855 "usage: %s [options] [disk_image]\n"
bellard0824d6f2003-06-24 13:42:40 +00007856 "\n"
bellarda20dd502003-09-30 21:07:02 +00007857 "'disk_image' is a raw hard image image for IDE hard disk 0\n"
bellardfc01f7e2003-06-30 10:03:06 +00007858 "\n"
bellarda20dd502003-09-30 21:07:02 +00007859 "Standard options:\n"
bellardcc1daa42005-06-05 14:49:17 +00007860 "-M machine select emulated machine (-M ? for list)\n"
pbrook5adb4832007-03-08 03:15:18 +00007861 "-cpu cpu select CPU (-cpu ? for list)\n"
bellardc45886d2004-01-05 00:02:06 +00007862 "-fda/-fdb file use 'file' as floppy disk 0/1 image\n"
bellard36b486b2003-11-11 13:36:08 +00007863 "-hda/-hdb file use 'file' as IDE hard disk 0/1 image\n"
7864 "-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n"
bellardc4b1fcc2004-03-14 21:44:30 +00007865 "-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
aurel32a1620fa2008-04-29 05:58:01 +00007866 "-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n"
7867 " [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
7868 " [,cache=on|off][,format=f]\n"
thse4bcb142007-12-02 04:51:10 +00007869 " use 'file' as a drive image\n"
balrog3e3d5812007-04-30 02:09:25 +00007870 "-mtdblock file use 'file' as on-board Flash memory image\n"
pbrooka1bb27b2007-04-06 16:49:48 +00007871 "-sd file use 'file' as SecureDigital card image\n"
j_mayer86f55662007-04-24 06:52:59 +00007872 "-pflash file use 'file' as a parallel flash image\n"
thseec85c22007-01-05 17:41:07 +00007873 "-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n)\n"
ths667acca2006-12-11 02:08:05 +00007874 "-snapshot write to temporary files instead of disk image files\n"
7875#ifdef CONFIG_SDL
ths43523e92007-02-18 18:19:32 +00007876 "-no-frame open SDL window without a frame and window decorations\n"
ths3780e192007-06-21 21:08:02 +00007877 "-alt-grab use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)\n"
ths667acca2006-12-11 02:08:05 +00007878 "-no-quit disable SDL window close capability\n"
7879#endif
bellard52ca8d62006-06-14 16:03:05 +00007880#ifdef TARGET_I386
7881 "-no-fd-bootchk disable boot signature checking for floppy disks\n"
7882#endif
bellarda00bad72004-05-22 21:39:06 +00007883 "-m megs set virtual RAM size to megs MB [default=%d]\n"
bellard91fc2112005-12-18 19:09:37 +00007884 "-smp n set the number of CPUs to 'n' [default=1]\n"
bellardc4b1fcc2004-03-14 21:44:30 +00007885 "-nographic disable graphical output and redirect serial I/Os to console\n"
balroga171fe32007-04-30 01:48:07 +00007886 "-portrait rotate graphical output 90 deg left (only PXA LCD)\n"
bellard4ca00742004-12-12 22:20:04 +00007887#ifndef _WIN32
ths667acca2006-12-11 02:08:05 +00007888 "-k language use keyboard layout (for example \"fr\" for French)\n"
bellard4ca00742004-12-12 22:20:04 +00007889#endif
bellard1d14ffa2005-10-30 18:58:22 +00007890#ifdef HAS_AUDIO
bellard1d14ffa2005-10-30 18:58:22 +00007891 "-audio-help print list of audio drivers and their options\n"
bellardc0fe3822005-11-05 18:55:28 +00007892 "-soundhw c1,... enable audio support\n"
7893 " and only specified sound cards (comma separated list)\n"
7894 " use -soundhw ? to get the list of supported cards\n"
bellard6a36d842005-12-18 20:34:32 +00007895 " use -soundhw all to enable all of them\n"
bellard1d14ffa2005-10-30 18:58:22 +00007896#endif
malc3893c122008-09-28 00:42:05 +00007897 "-vga [std|cirrus|vmware]\n"
7898 " select video card type\n"
bellard89980282004-06-03 14:04:03 +00007899 "-localtime set the real time clock to local time [default=utc]\n"
bellardd63d3072004-10-03 13:29:03 +00007900 "-full-screen start in full screen\n"
bellarda09db212005-04-30 16:10:35 +00007901#ifdef TARGET_I386
7902 "-win2k-hack use it when installing Windows 2000 to avoid a disk full bug\n"
7903#endif
bellardb389dbf2005-11-06 16:49:55 +00007904 "-usb enable the USB driver (will be the default soon)\n"
7905 "-usbdevice name add the host or guest USB device 'name'\n"
bellard6f7e9ae2005-03-13 09:43:36 +00007906#if defined(TARGET_PPC) || defined(TARGET_SPARC)
7907 "-g WxH[xDEPTH] Set the initial graphical resolution and depth\n"
bellardbb0c6722004-06-20 12:37:32 +00007908#endif
thsc35734b2007-03-19 15:17:08 +00007909 "-name string set the name of the guest\n"
blueswir18fcb1b92008-09-18 18:29:08 +00007910 "-uuid %%08x-%%04x-%%04x-%%04x-%%012x specify machine UUID\n"
bellarda20dd502003-09-30 21:07:02 +00007911 "\n"
bellardc4b1fcc2004-03-14 21:44:30 +00007912 "Network options:\n"
pbrooka41b2ff2006-02-05 04:14:41 +00007913 "-net nic[,vlan=n][,macaddr=addr][,model=type]\n"
bellard7c9d8e02005-11-15 22:16:05 +00007914 " create a new Network Interface Card and connect it to VLAN 'n'\n"
bellardc20709a2004-04-21 23:27:19 +00007915#ifdef CONFIG_SLIRP
pbrook115defd2006-04-16 11:06:58 +00007916 "-net user[,vlan=n][,hostname=host]\n"
7917 " connect the user mode network stack to VLAN 'n' and send\n"
7918 " hostname 'host' to DHCP clients\n"
bellard7c9d8e02005-11-15 22:16:05 +00007919#endif
bellard7fb843f2006-02-01 23:06:55 +00007920#ifdef _WIN32
7921 "-net tap[,vlan=n],ifname=name\n"
7922 " connect the host TAP network interface to VLAN 'n'\n"
7923#else
thsb46a8902007-10-21 23:20:45 +00007924 "-net tap[,vlan=n][,fd=h][,ifname=name][,script=file][,downscript=dfile]\n"
7925 " connect the host TAP network interface to VLAN 'n' and use the\n"
7926 " network scripts 'file' (default=%s)\n"
7927 " and 'dfile' (default=%s);\n"
7928 " use '[down]script=no' to disable script execution;\n"
bellard7c9d8e02005-11-15 22:16:05 +00007929 " use 'fd=h' to connect to an already opened TAP interface\n"
bellard7fb843f2006-02-01 23:06:55 +00007930#endif
bellard6a00d602005-11-21 23:25:50 +00007931 "-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]\n"
bellard7c9d8e02005-11-15 22:16:05 +00007932 " connect the vlan 'n' to another VLAN using a socket connection\n"
bellard3d830452005-12-18 16:36:49 +00007933 "-net socket[,vlan=n][,fd=h][,mcast=maddr:port]\n"
7934 " connect the vlan 'n' to multicast maddr and port\n"
ths8a16d272008-07-19 09:56:24 +00007935#ifdef CONFIG_VDE
7936 "-net vde[,vlan=n][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode]\n"
7937 " connect the vlan 'n' to port 'n' of a vde switch running\n"
7938 " on host and listening for incoming connections on 'socketpath'.\n"
7939 " Use group 'groupname' and mode 'octalmode' to change default\n"
7940 " ownership and permissions for communication port.\n"
7941#endif
bellard7c9d8e02005-11-15 22:16:05 +00007942 "-net none use it alone to have zero network devices; if no -net option\n"
7943 " is provided, the default is '-net nic -net user'\n"
7944 "\n"
7945#ifdef CONFIG_SLIRP
ths0db11372007-02-20 00:12:07 +00007946 "-tftp dir allow tftp access to files in dir [-net user]\n"
ths47d5d012007-02-20 00:05:08 +00007947 "-bootp file advertise file in BOOTP replies\n"
bellard7c9d8e02005-11-15 22:16:05 +00007948#ifndef _WIN32
7949 "-smb dir allow SMB access to files in 'dir' [-net user]\n"
bellardc94c8d62004-09-13 21:37:34 +00007950#endif
bellard9bf05442004-08-25 22:12:49 +00007951 "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n"
bellard7c9d8e02005-11-15 22:16:05 +00007952 " redirect TCP or UDP connections from host to guest [-net user]\n"
bellardc20709a2004-04-21 23:27:19 +00007953#endif
bellardc4b1fcc2004-03-14 21:44:30 +00007954 "\n"
7955 "Linux boot specific:\n"
bellarda20dd502003-09-30 21:07:02 +00007956 "-kernel bzImage use 'bzImage' as kernel image\n"
7957 "-append cmdline use 'cmdline' as kernel command line\n"
7958 "-initrd file use 'file' as initial ram disk\n"
bellardfc01f7e2003-06-30 10:03:06 +00007959 "\n"
bellard330d0412003-07-26 18:11:40 +00007960 "Debug/Expert options:\n"
bellard82c643f2004-07-14 17:28:13 +00007961 "-monitor dev redirect the monitor to char device 'dev'\n"
7962 "-serial dev redirect the serial port to char device 'dev'\n"
bellard6508fe52005-01-15 12:02:56 +00007963 "-parallel dev redirect the parallel port to char device 'dev'\n"
bellardf7cce892004-12-08 22:21:25 +00007964 "-pidfile file Write PID to 'file'\n"
bellardcd6f1162004-05-13 22:02:20 +00007965 "-S freeze CPU at startup (use 'c' to start execution)\n"
pbrookcfc34752007-02-22 01:48:01 +00007966 "-s wait gdb connection to port\n"
7967 "-p port set gdb connection port [default=%s]\n"
bellardf193c792004-03-21 17:06:25 +00007968 "-d item1,... output log to %s (use -d ? for a list of log items)\n"
bellard46d47672004-11-16 01:45:27 +00007969 "-hdachs c,h,s[,t] force hard disk 0 physical geometry and the optional BIOS\n"
7970 " translation (t=none or lba) (usually qemu can guess them)\n"
bellard87b47352006-08-17 17:22:54 +00007971 "-L path set the directory for the BIOS, VGA BIOS and keymaps\n"
bellardd993e022005-02-10 22:00:06 +00007972#ifdef USE_KQEMU
bellard6515b202006-05-03 22:02:44 +00007973 "-kernel-kqemu enable KQEMU full virtualization (default is user mode only)\n"
bellardd993e022005-02-10 22:00:06 +00007974 "-no-kqemu disable KQEMU kernel module usage\n"
7975#endif
bellardbb0c6722004-06-20 12:37:32 +00007976#ifdef TARGET_I386
bellard6515b202006-05-03 22:02:44 +00007977 "-no-acpi disable ACPI\n"
bellardbb0c6722004-06-20 12:37:32 +00007978#endif
balrog4d3b6f62008-02-10 16:33:14 +00007979#ifdef CONFIG_CURSES
7980 "-curses use a curses/ncurses interface instead of SDL\n"
7981#endif
bellardd1beab82006-10-02 19:44:22 +00007982 "-no-reboot exit instead of rebooting\n"
aurel32b2f76162008-04-11 21:35:52 +00007983 "-no-shutdown stop before shutdown\n"
aurel32a8080002008-05-10 23:28:26 +00007984 "-loadvm [tag|id] start right away with a saved state (loadvm in monitor)\n"
bellard24236862006-04-30 21:28:36 +00007985 "-vnc display start a VNC server on display\n"
ths71e3ceb2006-12-22 02:11:31 +00007986#ifndef _WIN32
7987 "-daemonize daemonize QEMU after initializing\n"
7988#endif
ths9ae02552007-01-05 17:39:04 +00007989 "-option-rom rom load a file, rom, into the option ROM space\n"
blueswir166508602007-05-01 14:16:52 +00007990#ifdef TARGET_SPARC
7991 "-prom-env variable=value set OpenBIOS nvram variables\n"
7992#endif
thsf3dcfad2007-08-24 01:26:02 +00007993 "-clock force the use of the given methods for timer alarm.\n"
aurel323adda042008-03-09 23:43:49 +00007994 " To see what timers are available use -clock ?\n"
bellardbce61842008-02-01 22:18:51 +00007995 "-startdate select initial date of the clock\n"
pbrook2e70f6e2008-06-29 01:03:05 +00007996 "-icount [N|auto]\n"
pbrookdd5d6fe2008-06-29 10:43:16 +00007997 " Enable virtual instruction counter with 2^N clock ticks per instruction\n"
bellard0824d6f2003-06-24 13:42:40 +00007998 "\n"
bellard82c643f2004-07-14 17:28:13 +00007999 "During emulation, the following keys are useful:\n"
bellard032a8c92004-10-09 22:56:44 +00008000 "ctrl-alt-f toggle full screen\n"
8001 "ctrl-alt-n switch to virtual console 'n'\n"
8002 "ctrl-alt toggle mouse and keyboard grab\n"
bellard82c643f2004-07-14 17:28:13 +00008003 "\n"
8004 "When using -nographic, press 'ctrl-a h' to get some help.\n"
8005 ,
bellard0db63472003-10-27 21:37:46 +00008006 "qemu",
bellarda00bad72004-05-22 21:39:06 +00008007 DEFAULT_RAM_SIZE,
bellard7c9d8e02005-11-15 22:16:05 +00008008#ifndef _WIN32
bellarda00bad72004-05-22 21:39:06 +00008009 DEFAULT_NETWORK_SCRIPT,
thsb46a8902007-10-21 23:20:45 +00008010 DEFAULT_NETWORK_DOWN_SCRIPT,
bellard7c9d8e02005-11-15 22:16:05 +00008011#endif
bellard6e44ba72004-01-18 21:56:49 +00008012 DEFAULT_GDBSTUB_PORT,
bellardbce61842008-02-01 22:18:51 +00008013 "/tmp/qemu.log");
ths15f82202007-06-29 23:26:08 +00008014 exit(exitcode);
bellard0824d6f2003-06-24 13:42:40 +00008015}
8016
bellardcd6f1162004-05-13 22:02:20 +00008017#define HAS_ARG 0x0001
8018
8019enum {
8020 QEMU_OPTION_h,
8021
bellardcc1daa42005-06-05 14:49:17 +00008022 QEMU_OPTION_M,
j_mayer94fc95c2007-03-05 19:44:02 +00008023 QEMU_OPTION_cpu,
bellardcd6f1162004-05-13 22:02:20 +00008024 QEMU_OPTION_fda,
8025 QEMU_OPTION_fdb,
8026 QEMU_OPTION_hda,
8027 QEMU_OPTION_hdb,
8028 QEMU_OPTION_hdc,
8029 QEMU_OPTION_hdd,
thse4bcb142007-12-02 04:51:10 +00008030 QEMU_OPTION_drive,
bellardcd6f1162004-05-13 22:02:20 +00008031 QEMU_OPTION_cdrom,
balrog3e3d5812007-04-30 02:09:25 +00008032 QEMU_OPTION_mtdblock,
pbrooka1bb27b2007-04-06 16:49:48 +00008033 QEMU_OPTION_sd,
j_mayer86f55662007-04-24 06:52:59 +00008034 QEMU_OPTION_pflash,
bellardcd6f1162004-05-13 22:02:20 +00008035 QEMU_OPTION_boot,
8036 QEMU_OPTION_snapshot,
bellard52ca8d62006-06-14 16:03:05 +00008037#ifdef TARGET_I386
8038 QEMU_OPTION_no_fd_bootchk,
8039#endif
bellardcd6f1162004-05-13 22:02:20 +00008040 QEMU_OPTION_m,
8041 QEMU_OPTION_nographic,
balroga171fe32007-04-30 01:48:07 +00008042 QEMU_OPTION_portrait,
bellard1d14ffa2005-10-30 18:58:22 +00008043#ifdef HAS_AUDIO
bellard1d14ffa2005-10-30 18:58:22 +00008044 QEMU_OPTION_audio_help,
8045 QEMU_OPTION_soundhw,
8046#endif
bellardcd6f1162004-05-13 22:02:20 +00008047
bellard7c9d8e02005-11-15 22:16:05 +00008048 QEMU_OPTION_net,
bellardc7f74642004-08-24 21:57:12 +00008049 QEMU_OPTION_tftp,
ths47d5d012007-02-20 00:05:08 +00008050 QEMU_OPTION_bootp,
bellard9d728e82004-09-05 23:09:03 +00008051 QEMU_OPTION_smb,
bellard9bf05442004-08-25 22:12:49 +00008052 QEMU_OPTION_redir,
bellardcd6f1162004-05-13 22:02:20 +00008053
8054 QEMU_OPTION_kernel,
8055 QEMU_OPTION_append,
8056 QEMU_OPTION_initrd,
8057
8058 QEMU_OPTION_S,
8059 QEMU_OPTION_s,
8060 QEMU_OPTION_p,
8061 QEMU_OPTION_d,
8062 QEMU_OPTION_hdachs,
8063 QEMU_OPTION_L,
j_mayer1192dad2007-10-05 13:08:35 +00008064 QEMU_OPTION_bios,
bellard3d11d0e2004-12-12 16:56:30 +00008065 QEMU_OPTION_k,
bellardee22c2f2004-06-03 12:49:50 +00008066 QEMU_OPTION_localtime,
bellarde9b137c2004-06-21 16:46:10 +00008067 QEMU_OPTION_g,
malc3893c122008-09-28 00:42:05 +00008068 QEMU_OPTION_vga,
ths20d8a3e2007-02-18 17:04:49 +00008069 QEMU_OPTION_echr,
bellard82c643f2004-07-14 17:28:13 +00008070 QEMU_OPTION_monitor,
8071 QEMU_OPTION_serial,
bellard6508fe52005-01-15 12:02:56 +00008072 QEMU_OPTION_parallel,
bellardd63d3072004-10-03 13:29:03 +00008073 QEMU_OPTION_loadvm,
8074 QEMU_OPTION_full_screen,
ths43523e92007-02-18 18:19:32 +00008075 QEMU_OPTION_no_frame,
ths3780e192007-06-21 21:08:02 +00008076 QEMU_OPTION_alt_grab,
ths667acca2006-12-11 02:08:05 +00008077 QEMU_OPTION_no_quit,
bellardf7cce892004-12-08 22:21:25 +00008078 QEMU_OPTION_pidfile,
bellardd993e022005-02-10 22:00:06 +00008079 QEMU_OPTION_no_kqemu,
bellard89bfc102006-02-08 22:46:31 +00008080 QEMU_OPTION_kernel_kqemu,
bellarda09db212005-04-30 16:10:35 +00008081 QEMU_OPTION_win2k_hack,
bellardbb36d472005-11-05 14:22:28 +00008082 QEMU_OPTION_usb,
bellarda594cfb2005-11-06 16:13:29 +00008083 QEMU_OPTION_usbdevice,
bellard6a00d602005-11-21 23:25:50 +00008084 QEMU_OPTION_smp,
bellard24236862006-04-30 21:28:36 +00008085 QEMU_OPTION_vnc,
bellard6515b202006-05-03 22:02:44 +00008086 QEMU_OPTION_no_acpi,
balrog4d3b6f62008-02-10 16:33:14 +00008087 QEMU_OPTION_curses,
bellardd1beab82006-10-02 19:44:22 +00008088 QEMU_OPTION_no_reboot,
aurel32b2f76162008-04-11 21:35:52 +00008089 QEMU_OPTION_no_shutdown,
balrog9467cd42007-05-01 01:34:14 +00008090 QEMU_OPTION_show_cursor,
ths71e3ceb2006-12-22 02:11:31 +00008091 QEMU_OPTION_daemonize,
ths9ae02552007-01-05 17:39:04 +00008092 QEMU_OPTION_option_rom,
thsc35734b2007-03-19 15:17:08 +00008093 QEMU_OPTION_semihosting,
8094 QEMU_OPTION_name,
blueswir166508602007-05-01 14:16:52 +00008095 QEMU_OPTION_prom_env,
balrog2b8f2d42007-07-27 22:08:46 +00008096 QEMU_OPTION_old_param,
thsf3dcfad2007-08-24 01:26:02 +00008097 QEMU_OPTION_clock,
bellard7e0af5d02007-11-07 16:24:33 +00008098 QEMU_OPTION_startdate,
bellard26a5f132008-05-28 12:30:31 +00008099 QEMU_OPTION_tb_size,
pbrook2e70f6e2008-06-29 01:03:05 +00008100 QEMU_OPTION_icount,
blueswir18fcb1b92008-09-18 18:29:08 +00008101 QEMU_OPTION_uuid,
bellardcd6f1162004-05-13 22:02:20 +00008102};
8103
8104typedef struct QEMUOption {
8105 const char *name;
8106 int flags;
8107 int index;
8108} QEMUOption;
8109
8110const QEMUOption qemu_options[] = {
8111 { "h", 0, QEMU_OPTION_h },
pbrook64423fb2007-01-27 17:11:41 +00008112 { "help", 0, QEMU_OPTION_h },
bellardcd6f1162004-05-13 22:02:20 +00008113
bellardcc1daa42005-06-05 14:49:17 +00008114 { "M", HAS_ARG, QEMU_OPTION_M },
j_mayer94fc95c2007-03-05 19:44:02 +00008115 { "cpu", HAS_ARG, QEMU_OPTION_cpu },
bellardcd6f1162004-05-13 22:02:20 +00008116 { "fda", HAS_ARG, QEMU_OPTION_fda },
8117 { "fdb", HAS_ARG, QEMU_OPTION_fdb },
8118 { "hda", HAS_ARG, QEMU_OPTION_hda },
8119 { "hdb", HAS_ARG, QEMU_OPTION_hdb },
8120 { "hdc", HAS_ARG, QEMU_OPTION_hdc },
8121 { "hdd", HAS_ARG, QEMU_OPTION_hdd },
thse4bcb142007-12-02 04:51:10 +00008122 { "drive", HAS_ARG, QEMU_OPTION_drive },
bellardcd6f1162004-05-13 22:02:20 +00008123 { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
balrog3e3d5812007-04-30 02:09:25 +00008124 { "mtdblock", HAS_ARG, QEMU_OPTION_mtdblock },
pbrooka1bb27b2007-04-06 16:49:48 +00008125 { "sd", HAS_ARG, QEMU_OPTION_sd },
j_mayer86f55662007-04-24 06:52:59 +00008126 { "pflash", HAS_ARG, QEMU_OPTION_pflash },
bellardcd6f1162004-05-13 22:02:20 +00008127 { "boot", HAS_ARG, QEMU_OPTION_boot },
8128 { "snapshot", 0, QEMU_OPTION_snapshot },
bellard52ca8d62006-06-14 16:03:05 +00008129#ifdef TARGET_I386
8130 { "no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk },
8131#endif
bellardcd6f1162004-05-13 22:02:20 +00008132 { "m", HAS_ARG, QEMU_OPTION_m },
8133 { "nographic", 0, QEMU_OPTION_nographic },
balroga171fe32007-04-30 01:48:07 +00008134 { "portrait", 0, QEMU_OPTION_portrait },
bellard3d11d0e2004-12-12 16:56:30 +00008135 { "k", HAS_ARG, QEMU_OPTION_k },
bellard1d14ffa2005-10-30 18:58:22 +00008136#ifdef HAS_AUDIO
bellard1d14ffa2005-10-30 18:58:22 +00008137 { "audio-help", 0, QEMU_OPTION_audio_help },
8138 { "soundhw", HAS_ARG, QEMU_OPTION_soundhw },
8139#endif
bellardcd6f1162004-05-13 22:02:20 +00008140
bellard7c9d8e02005-11-15 22:16:05 +00008141 { "net", HAS_ARG, QEMU_OPTION_net},
bellard158156d2004-05-17 21:13:42 +00008142#ifdef CONFIG_SLIRP
bellardc7f74642004-08-24 21:57:12 +00008143 { "tftp", HAS_ARG, QEMU_OPTION_tftp },
ths47d5d012007-02-20 00:05:08 +00008144 { "bootp", HAS_ARG, QEMU_OPTION_bootp },
bellardc94c8d62004-09-13 21:37:34 +00008145#ifndef _WIN32
bellard9d728e82004-09-05 23:09:03 +00008146 { "smb", HAS_ARG, QEMU_OPTION_smb },
bellardc94c8d62004-09-13 21:37:34 +00008147#endif
bellard9bf05442004-08-25 22:12:49 +00008148 { "redir", HAS_ARG, QEMU_OPTION_redir },
bellard158156d2004-05-17 21:13:42 +00008149#endif
bellardcd6f1162004-05-13 22:02:20 +00008150
8151 { "kernel", HAS_ARG, QEMU_OPTION_kernel },
8152 { "append", HAS_ARG, QEMU_OPTION_append },
8153 { "initrd", HAS_ARG, QEMU_OPTION_initrd },
8154
8155 { "S", 0, QEMU_OPTION_S },
8156 { "s", 0, QEMU_OPTION_s },
8157 { "p", HAS_ARG, QEMU_OPTION_p },
8158 { "d", HAS_ARG, QEMU_OPTION_d },
8159 { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
8160 { "L", HAS_ARG, QEMU_OPTION_L },
j_mayer1192dad2007-10-05 13:08:35 +00008161 { "bios", HAS_ARG, QEMU_OPTION_bios },
bellardd993e022005-02-10 22:00:06 +00008162#ifdef USE_KQEMU
8163 { "no-kqemu", 0, QEMU_OPTION_no_kqemu },
bellard89bfc102006-02-08 22:46:31 +00008164 { "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu },
bellardd993e022005-02-10 22:00:06 +00008165#endif
bellard6f7e9ae2005-03-13 09:43:36 +00008166#if defined(TARGET_PPC) || defined(TARGET_SPARC)
bellarde9b137c2004-06-21 16:46:10 +00008167 { "g", 1, QEMU_OPTION_g },
bellard77d4bc32004-05-26 22:13:53 +00008168#endif
bellardee22c2f2004-06-03 12:49:50 +00008169 { "localtime", 0, QEMU_OPTION_localtime },
malc3893c122008-09-28 00:42:05 +00008170 { "vga", HAS_ARG, QEMU_OPTION_vga },
balrog8b6e0722007-06-22 08:23:44 +00008171 { "echr", HAS_ARG, QEMU_OPTION_echr },
8172 { "monitor", HAS_ARG, QEMU_OPTION_monitor },
8173 { "serial", HAS_ARG, QEMU_OPTION_serial },
8174 { "parallel", HAS_ARG, QEMU_OPTION_parallel },
bellardd63d3072004-10-03 13:29:03 +00008175 { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
8176 { "full-screen", 0, QEMU_OPTION_full_screen },
ths667acca2006-12-11 02:08:05 +00008177#ifdef CONFIG_SDL
ths43523e92007-02-18 18:19:32 +00008178 { "no-frame", 0, QEMU_OPTION_no_frame },
ths3780e192007-06-21 21:08:02 +00008179 { "alt-grab", 0, QEMU_OPTION_alt_grab },
ths667acca2006-12-11 02:08:05 +00008180 { "no-quit", 0, QEMU_OPTION_no_quit },
8181#endif
bellardf7cce892004-12-08 22:21:25 +00008182 { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
bellarda09db212005-04-30 16:10:35 +00008183 { "win2k-hack", 0, QEMU_OPTION_win2k_hack },
bellarda594cfb2005-11-06 16:13:29 +00008184 { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
bellard6a00d602005-11-21 23:25:50 +00008185 { "smp", HAS_ARG, QEMU_OPTION_smp },
bellard24236862006-04-30 21:28:36 +00008186 { "vnc", HAS_ARG, QEMU_OPTION_vnc },
balrog4d3b6f62008-02-10 16:33:14 +00008187#ifdef CONFIG_CURSES
8188 { "curses", 0, QEMU_OPTION_curses },
8189#endif
blueswir18fcb1b92008-09-18 18:29:08 +00008190 { "uuid", HAS_ARG, QEMU_OPTION_uuid },
ths96d30e42007-01-07 20:42:14 +00008191
bellard1f042752004-06-05 13:46:47 +00008192 /* temporary options */
bellarda594cfb2005-11-06 16:13:29 +00008193 { "usb", 0, QEMU_OPTION_usb },
bellard6515b202006-05-03 22:02:44 +00008194 { "no-acpi", 0, QEMU_OPTION_no_acpi },
bellardd1beab82006-10-02 19:44:22 +00008195 { "no-reboot", 0, QEMU_OPTION_no_reboot },
aurel32b2f76162008-04-11 21:35:52 +00008196 { "no-shutdown", 0, QEMU_OPTION_no_shutdown },
balrog9467cd42007-05-01 01:34:14 +00008197 { "show-cursor", 0, QEMU_OPTION_show_cursor },
ths71e3ceb2006-12-22 02:11:31 +00008198 { "daemonize", 0, QEMU_OPTION_daemonize },
ths9ae02552007-01-05 17:39:04 +00008199 { "option-rom", HAS_ARG, QEMU_OPTION_option_rom },
pbrooka87295e2007-05-26 15:09:38 +00008200#if defined(TARGET_ARM) || defined(TARGET_M68K)
pbrook8e716212007-01-20 17:12:09 +00008201 { "semihosting", 0, QEMU_OPTION_semihosting },
8202#endif
thsc35734b2007-03-19 15:17:08 +00008203 { "name", HAS_ARG, QEMU_OPTION_name },
blueswir166508602007-05-01 14:16:52 +00008204#if defined(TARGET_SPARC)
8205 { "prom-env", HAS_ARG, QEMU_OPTION_prom_env },
8206#endif
balrog2b8f2d42007-07-27 22:08:46 +00008207#if defined(TARGET_ARM)
8208 { "old-param", 0, QEMU_OPTION_old_param },
8209#endif
thsf3dcfad2007-08-24 01:26:02 +00008210 { "clock", HAS_ARG, QEMU_OPTION_clock },
bellard7e0af5d02007-11-07 16:24:33 +00008211 { "startdate", HAS_ARG, QEMU_OPTION_startdate },
bellard26a5f132008-05-28 12:30:31 +00008212 { "tb-size", HAS_ARG, QEMU_OPTION_tb_size },
pbrook2e70f6e2008-06-29 01:03:05 +00008213 { "icount", HAS_ARG, QEMU_OPTION_icount },
bellardcd6f1162004-05-13 22:02:20 +00008214 { NULL },
bellardfc01f7e2003-06-30 10:03:06 +00008215};
8216
bellard5905b2e2004-08-01 21:53:26 +00008217/* password input */
8218
balrog2bac6012007-04-30 01:34:31 +00008219int qemu_key_check(BlockDriverState *bs, const char *name)
8220{
8221 char password[256];
8222 int i;
8223
8224 if (!bdrv_is_encrypted(bs))
8225 return 0;
8226
8227 term_printf("%s is encrypted.\n", name);
8228 for(i = 0; i < 3; i++) {
8229 monitor_readline("Password: ", 1, password, sizeof(password));
8230 if (bdrv_set_key(bs, password) == 0)
8231 return 0;
8232 term_printf("invalid password\n");
8233 }
8234 return -EPERM;
8235}
8236
aliguori83ab7952008-08-19 14:44:22 +00008237static BlockDriverState *get_bdrv(int index)
8238{
8239 if (index > nb_drives)
8240 return NULL;
8241 return drives_table[index].bdrv;
8242}
8243
bellard5905b2e2004-08-01 21:53:26 +00008244static void read_passwords(void)
8245{
8246 BlockDriverState *bs;
balrog2bac6012007-04-30 01:34:31 +00008247 int i;
bellard5905b2e2004-08-01 21:53:26 +00008248
aliguori83ab7952008-08-19 14:44:22 +00008249 for(i = 0; i < 6; i++) {
8250 bs = get_bdrv(i);
8251 if (bs)
8252 qemu_key_check(bs, bdrv_get_device_name(bs));
bellard5905b2e2004-08-01 21:53:26 +00008253 }
8254}
8255
bellard1d14ffa2005-10-30 18:58:22 +00008256#ifdef HAS_AUDIO
bellard6a36d842005-12-18 20:34:32 +00008257struct soundhw soundhw[] = {
balrogb00052e2007-04-30 02:22:06 +00008258#ifdef HAS_AUDIO_CHOICE
aurel324ce7ff62008-04-07 19:47:14 +00008259#if defined(TARGET_I386) || defined(TARGET_MIPS)
bellardfd06c372006-04-24 21:58:30 +00008260 {
8261 "pcspk",
8262 "PC speaker",
8263 0,
8264 1,
8265 { .init_isa = pcspk_audio_init }
8266 },
8267#endif
bellard6a36d842005-12-18 20:34:32 +00008268 {
8269 "sb16",
8270 "Creative Sound Blaster 16",
8271 0,
8272 1,
8273 { .init_isa = SB16_init }
8274 },
8275
malccc53d262008-06-13 10:48:22 +00008276#ifdef CONFIG_CS4231A
8277 {
8278 "cs4231a",
8279 "CS4231A",
8280 0,
8281 1,
8282 { .init_isa = cs4231a_init }
8283 },
8284#endif
8285
bellard6a36d842005-12-18 20:34:32 +00008286#ifdef CONFIG_ADLIB
8287 {
8288 "adlib",
8289#ifdef HAS_YMF262
8290 "Yamaha YMF262 (OPL3)",
8291#else
8292 "Yamaha YM3812 (OPL2)",
8293#endif
8294 0,
8295 1,
8296 { .init_isa = Adlib_init }
8297 },
8298#endif
8299
8300#ifdef CONFIG_GUS
8301 {
8302 "gus",
8303 "Gravis Ultrasound GF1",
8304 0,
8305 1,
8306 { .init_isa = GUS_init }
8307 },
8308#endif
8309
balroge5c9a132008-01-14 04:27:55 +00008310#ifdef CONFIG_AC97
8311 {
8312 "ac97",
8313 "Intel 82801AA AC97 Audio",
8314 0,
8315 0,
8316 { .init_pci = ac97_init }
8317 },
8318#endif
8319
bellard6a36d842005-12-18 20:34:32 +00008320 {
8321 "es1370",
8322 "ENSONIQ AudioPCI ES1370",
8323 0,
8324 0,
8325 { .init_pci = es1370_init }
8326 },
balrogb00052e2007-04-30 02:22:06 +00008327#endif
bellard6a36d842005-12-18 20:34:32 +00008328
8329 { NULL, NULL, 0, 0, { NULL } }
8330};
8331
bellard1d14ffa2005-10-30 18:58:22 +00008332static void select_soundhw (const char *optarg)
8333{
bellard6a36d842005-12-18 20:34:32 +00008334 struct soundhw *c;
8335
bellard1d14ffa2005-10-30 18:58:22 +00008336 if (*optarg == '?') {
8337 show_valid_cards:
bellard6a36d842005-12-18 20:34:32 +00008338
bellard1d14ffa2005-10-30 18:58:22 +00008339 printf ("Valid sound card names (comma separated):\n");
bellard6a36d842005-12-18 20:34:32 +00008340 for (c = soundhw; c->name; ++c) {
8341 printf ("%-11s %s\n", c->name, c->descr);
8342 }
8343 printf ("\n-soundhw all will enable all of the above\n");
bellard1d14ffa2005-10-30 18:58:22 +00008344 exit (*optarg != '?');
8345 }
8346 else {
bellard6a36d842005-12-18 20:34:32 +00008347 size_t l;
bellard1d14ffa2005-10-30 18:58:22 +00008348 const char *p;
8349 char *e;
8350 int bad_card = 0;
8351
bellard6a36d842005-12-18 20:34:32 +00008352 if (!strcmp (optarg, "all")) {
8353 for (c = soundhw; c->name; ++c) {
8354 c->enabled = 1;
8355 }
8356 return;
8357 }
bellard1d14ffa2005-10-30 18:58:22 +00008358
bellard6a36d842005-12-18 20:34:32 +00008359 p = optarg;
bellard1d14ffa2005-10-30 18:58:22 +00008360 while (*p) {
8361 e = strchr (p, ',');
8362 l = !e ? strlen (p) : (size_t) (e - p);
bellard6a36d842005-12-18 20:34:32 +00008363
8364 for (c = soundhw; c->name; ++c) {
8365 if (!strncmp (c->name, p, l)) {
8366 c->enabled = 1;
bellard1d14ffa2005-10-30 18:58:22 +00008367 break;
8368 }
8369 }
bellard6a36d842005-12-18 20:34:32 +00008370
8371 if (!c->name) {
bellard1d14ffa2005-10-30 18:58:22 +00008372 if (l > 80) {
8373 fprintf (stderr,
8374 "Unknown sound card name (too big to show)\n");
8375 }
8376 else {
8377 fprintf (stderr, "Unknown sound card name `%.*s'\n",
8378 (int) l, p);
8379 }
8380 bad_card = 1;
8381 }
8382 p += l + (e != NULL);
8383 }
8384
8385 if (bad_card)
8386 goto show_valid_cards;
8387 }
8388}
8389#endif
8390
malc3893c122008-09-28 00:42:05 +00008391static void select_vgahw (const char *p)
8392{
8393 const char *opts;
8394
8395 if (strstart(p, "std", &opts)) {
8396 cirrus_vga_enabled = 0;
8397 vmsvga_enabled = 0;
8398 } else if (strstart(p, "cirrus", &opts)) {
8399 cirrus_vga_enabled = 1;
8400 vmsvga_enabled = 0;
8401 } else if (strstart(p, "vmware", &opts)) {
8402 cirrus_vga_enabled = 0;
8403 vmsvga_enabled = 1;
8404 } else {
8405 invalid_vga:
8406 fprintf(stderr, "Unknown vga type: %s\n", p);
8407 exit(1);
8408 }
malccb5a7aa2008-09-28 00:42:12 +00008409 while (*opts) {
8410 const char *nextopt;
8411
8412 if (strstart(opts, ",retrace=", &nextopt)) {
8413 opts = nextopt;
8414 if (strstart(opts, "dumb", &nextopt))
8415 vga_retrace_method = VGA_RETRACE_DUMB;
8416 else if (strstart(opts, "precise", &nextopt))
8417 vga_retrace_method = VGA_RETRACE_PRECISE;
8418 else goto invalid_vga;
8419 } else goto invalid_vga;
8420 opts = nextopt;
8421 }
malc3893c122008-09-28 00:42:05 +00008422}
8423
bellard3587d7e2006-06-26 20:03:44 +00008424#ifdef _WIN32
8425static BOOL WINAPI qemu_ctrl_handler(DWORD type)
8426{
8427 exit(STATUS_CONTROL_C_EXIT);
8428 return TRUE;
8429}
8430#endif
8431
blueswir18fcb1b92008-09-18 18:29:08 +00008432static int qemu_uuid_parse(const char *str, uint8_t *uuid)
8433{
8434 int ret;
8435
8436 if(strlen(str) != 36)
8437 return -1;
8438
8439 ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
8440 &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
8441 &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]);
8442
8443 if(ret != 16)
8444 return -1;
8445
8446 return 0;
8447}
8448
bellard7c9d8e02005-11-15 22:16:05 +00008449#define MAX_NET_CLIENTS 32
bellardc20709a2004-04-21 23:27:19 +00008450
aliguori5b08fc12008-08-21 20:08:03 +00008451#ifndef _WIN32
8452
8453static void termsig_handler(int signal)
8454{
8455 qemu_system_shutdown_request();
8456}
8457
blueswir16f9e3802008-09-09 18:56:59 +00008458static void termsig_setup(void)
aliguori5b08fc12008-08-21 20:08:03 +00008459{
8460 struct sigaction act;
8461
8462 memset(&act, 0, sizeof(act));
8463 act.sa_handler = termsig_handler;
8464 sigaction(SIGINT, &act, NULL);
8465 sigaction(SIGHUP, &act, NULL);
8466 sigaction(SIGTERM, &act, NULL);
8467}
8468
8469#endif
8470
bellard0824d6f2003-06-24 13:42:40 +00008471int main(int argc, char **argv)
8472{
bellard67b915a2004-03-31 23:37:16 +00008473#ifdef CONFIG_GDBSTUB
pbrookcfc34752007-02-22 01:48:01 +00008474 int use_gdbstub;
8475 const char *gdbstub_port;
bellard67b915a2004-03-31 23:37:16 +00008476#endif
j_mayer28c5af52007-11-11 01:50:45 +00008477 uint32_t boot_devices_bitmap = 0;
thse4bcb142007-12-02 04:51:10 +00008478 int i;
j_mayer28c5af52007-11-11 01:50:45 +00008479 int snapshot, linux_boot, net_boot;
bellard7f7f9872003-10-30 01:11:23 +00008480 const char *initrd_filename;
bellarda20dd502003-09-30 21:07:02 +00008481 const char *kernel_filename, *kernel_cmdline;
j_mayer28c5af52007-11-11 01:50:45 +00008482 const char *boot_devices = "";
bellard313aa562003-08-10 21:52:11 +00008483 DisplayState *ds = &display_state;
bellard46d47672004-11-16 01:45:27 +00008484 int cyls, heads, secs, translation;
pbrookfd5f3932008-03-26 20:55:43 +00008485 const char *net_clients[MAX_NET_CLIENTS];
bellard7c9d8e02005-11-15 22:16:05 +00008486 int nb_net_clients;
thse4bcb142007-12-02 04:51:10 +00008487 int hda_index;
bellardcd6f1162004-05-13 22:02:20 +00008488 int optind;
8489 const char *r, *optarg;
bellard82c643f2004-07-14 17:28:13 +00008490 CharDriverState *monitor_hd;
pbrookfd5f3932008-03-26 20:55:43 +00008491 const char *monitor_device;
8492 const char *serial_devices[MAX_SERIAL_PORTS];
bellard8d11df92004-08-24 21:13:40 +00008493 int serial_device_index;
pbrookfd5f3932008-03-26 20:55:43 +00008494 const char *parallel_devices[MAX_PARALLEL_PORTS];
bellard6508fe52005-01-15 12:02:56 +00008495 int parallel_device_index;
bellardd63d3072004-10-03 13:29:03 +00008496 const char *loadvm = NULL;
bellardcc1daa42005-06-05 14:49:17 +00008497 QEMUMachine *machine;
j_mayer94fc95c2007-03-05 19:44:02 +00008498 const char *cpu_model;
pbrookfd5f3932008-03-26 20:55:43 +00008499 const char *usb_devices[MAX_USB_CMDLINE];
bellarda594cfb2005-11-06 16:13:29 +00008500 int usb_devices_index;
ths71e3ceb2006-12-22 02:11:31 +00008501 int fds[2];
bellard26a5f132008-05-28 12:30:31 +00008502 int tb_size;
ths93815bc2007-03-19 15:58:31 +00008503 const char *pid_file = NULL;
blueswir1833c7172007-05-27 19:36:43 +00008504 VLANState *vlan;
bellard0bd48852005-11-11 00:00:47 +00008505
8506 LIST_INIT (&vm_change_state_head);
bellardbe995c22006-06-25 16:25:21 +00008507#ifndef _WIN32
8508 {
8509 struct sigaction act;
8510 sigfillset(&act.sa_mask);
8511 act.sa_flags = 0;
8512 act.sa_handler = SIG_IGN;
8513 sigaction(SIGPIPE, &act, NULL);
8514 }
bellard3587d7e2006-06-26 20:03:44 +00008515#else
8516 SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
bellarda8e5ac32006-07-14 09:36:13 +00008517 /* Note: cpu_interrupt() is currently not SMP safe, so we force
8518 QEMU to run on a single CPU */
8519 {
8520 HANDLE h;
8521 DWORD mask, smask;
8522 int i;
8523 h = GetCurrentProcess();
8524 if (GetProcessAffinityMask(h, &mask, &smask)) {
8525 for(i = 0; i < 32; i++) {
8526 if (mask & (1 << i))
8527 break;
8528 }
8529 if (i != 32) {
8530 mask = 1 << i;
8531 SetProcessAffinityMask(h, mask);
8532 }
8533 }
8534 }
bellard67b915a2004-03-31 23:37:16 +00008535#endif
bellardbe995c22006-06-25 16:25:21 +00008536
bellardcc1daa42005-06-05 14:49:17 +00008537 register_machines();
8538 machine = first_machine;
j_mayer94fc95c2007-03-05 19:44:02 +00008539 cpu_model = NULL;
bellardfc01f7e2003-06-30 10:03:06 +00008540 initrd_filename = NULL;
aurel324fc5d072008-04-27 21:39:40 +00008541 ram_size = 0;
bellard313aa562003-08-10 21:52:11 +00008542 vga_ram_size = VGA_RAM_SIZE;
bellard67b915a2004-03-31 23:37:16 +00008543#ifdef CONFIG_GDBSTUB
bellardb4608c02003-06-27 17:34:32 +00008544 use_gdbstub = 0;
bellardc636bb62007-02-05 20:46:05 +00008545 gdbstub_port = DEFAULT_GDBSTUB_PORT;
bellard67b915a2004-03-31 23:37:16 +00008546#endif
bellard33e39632003-07-06 17:15:21 +00008547 snapshot = 0;
bellarda20dd502003-09-30 21:07:02 +00008548 nographic = 0;
balrog4d3b6f62008-02-10 16:33:14 +00008549 curses = 0;
bellarda20dd502003-09-30 21:07:02 +00008550 kernel_filename = NULL;
8551 kernel_cmdline = "";
bellardc4b1fcc2004-03-14 21:44:30 +00008552 cyls = heads = secs = 0;
bellard46d47672004-11-16 01:45:27 +00008553 translation = BIOS_ATA_TRANSLATION_AUTO;
pbrookc60e08d2008-07-01 16:24:38 +00008554 monitor_device = "vc";
bellardc4b1fcc2004-03-14 21:44:30 +00008555
aurel32c75a8232008-05-04 00:50:34 +00008556 serial_devices[0] = "vc:80Cx24C";
bellard8d11df92004-08-24 21:13:40 +00008557 for(i = 1; i < MAX_SERIAL_PORTS; i++)
pbrookfd5f3932008-03-26 20:55:43 +00008558 serial_devices[i] = NULL;
bellard8d11df92004-08-24 21:13:40 +00008559 serial_device_index = 0;
ths3b46e622007-09-17 08:09:54 +00008560
aurel32c75a8232008-05-04 00:50:34 +00008561 parallel_devices[0] = "vc:640x480";
bellard6508fe52005-01-15 12:02:56 +00008562 for(i = 1; i < MAX_PARALLEL_PORTS; i++)
pbrookfd5f3932008-03-26 20:55:43 +00008563 parallel_devices[i] = NULL;
bellard6508fe52005-01-15 12:02:56 +00008564 parallel_device_index = 0;
ths3b46e622007-09-17 08:09:54 +00008565
bellarda594cfb2005-11-06 16:13:29 +00008566 usb_devices_index = 0;
ths3b46e622007-09-17 08:09:54 +00008567
bellard7c9d8e02005-11-15 22:16:05 +00008568 nb_net_clients = 0;
thse4bcb142007-12-02 04:51:10 +00008569 nb_drives = 0;
8570 nb_drives_opt = 0;
8571 hda_index = -1;
bellard7c9d8e02005-11-15 22:16:05 +00008572
8573 nb_nics = 0;
ths3b46e622007-09-17 08:09:54 +00008574
bellard26a5f132008-05-28 12:30:31 +00008575 tb_size = 0;
8576
bellardcd6f1162004-05-13 22:02:20 +00008577 optind = 1;
bellard0824d6f2003-06-24 13:42:40 +00008578 for(;;) {
bellardcd6f1162004-05-13 22:02:20 +00008579 if (optind >= argc)
bellard0824d6f2003-06-24 13:42:40 +00008580 break;
bellardcd6f1162004-05-13 22:02:20 +00008581 r = argv[optind];
8582 if (r[0] != '-') {
balrog609497a2008-01-14 02:56:53 +00008583 hda_index = drive_add(argv[optind++], HD_ALIAS, 0);
bellardcd6f1162004-05-13 22:02:20 +00008584 } else {
8585 const QEMUOption *popt;
8586
8587 optind++;
pbrookdff5efc2007-01-27 17:19:39 +00008588 /* Treat --foo the same as -foo. */
8589 if (r[1] == '-')
8590 r++;
bellardcd6f1162004-05-13 22:02:20 +00008591 popt = qemu_options;
8592 for(;;) {
8593 if (!popt->name) {
ths5fafdf22007-09-16 21:08:06 +00008594 fprintf(stderr, "%s: invalid option -- '%s'\n",
bellardcd6f1162004-05-13 22:02:20 +00008595 argv[0], r);
8596 exit(1);
8597 }
8598 if (!strcmp(popt->name, r + 1))
8599 break;
8600 popt++;
8601 }
8602 if (popt->flags & HAS_ARG) {
8603 if (optind >= argc) {
8604 fprintf(stderr, "%s: option '%s' requires an argument\n",
8605 argv[0], r);
8606 exit(1);
8607 }
8608 optarg = argv[optind++];
8609 } else {
8610 optarg = NULL;
8611 }
8612
8613 switch(popt->index) {
bellardcc1daa42005-06-05 14:49:17 +00008614 case QEMU_OPTION_M:
8615 machine = find_machine(optarg);
8616 if (!machine) {
8617 QEMUMachine *m;
8618 printf("Supported machines are:\n");
8619 for(m = first_machine; m != NULL; m = m->next) {
8620 printf("%-10s %s%s\n",
ths5fafdf22007-09-16 21:08:06 +00008621 m->name, m->desc,
bellardcc1daa42005-06-05 14:49:17 +00008622 m == first_machine ? " (default)" : "");
8623 }
ths15f82202007-06-29 23:26:08 +00008624 exit(*optarg != '?');
bellardcc1daa42005-06-05 14:49:17 +00008625 }
8626 break;
j_mayer94fc95c2007-03-05 19:44:02 +00008627 case QEMU_OPTION_cpu:
8628 /* hw initialization will check this */
ths15f82202007-06-29 23:26:08 +00008629 if (*optarg == '?') {
j_mayerc732abe2007-10-12 06:47:46 +00008630/* XXX: implement xxx_cpu_list for targets that still miss it */
8631#if defined(cpu_list)
8632 cpu_list(stdout, &fprintf);
j_mayer94fc95c2007-03-05 19:44:02 +00008633#endif
ths15f82202007-06-29 23:26:08 +00008634 exit(0);
j_mayer94fc95c2007-03-05 19:44:02 +00008635 } else {
8636 cpu_model = optarg;
8637 }
8638 break;
bellardcd6f1162004-05-13 22:02:20 +00008639 case QEMU_OPTION_initrd:
bellardfc01f7e2003-06-30 10:03:06 +00008640 initrd_filename = optarg;
8641 break;
bellardcd6f1162004-05-13 22:02:20 +00008642 case QEMU_OPTION_hda:
thse4bcb142007-12-02 04:51:10 +00008643 if (cyls == 0)
balrog609497a2008-01-14 02:56:53 +00008644 hda_index = drive_add(optarg, HD_ALIAS, 0);
thse4bcb142007-12-02 04:51:10 +00008645 else
balrog609497a2008-01-14 02:56:53 +00008646 hda_index = drive_add(optarg, HD_ALIAS
thse4bcb142007-12-02 04:51:10 +00008647 ",cyls=%d,heads=%d,secs=%d%s",
balrog609497a2008-01-14 02:56:53 +00008648 0, cyls, heads, secs,
thse4bcb142007-12-02 04:51:10 +00008649 translation == BIOS_ATA_TRANSLATION_LBA ?
8650 ",trans=lba" :
8651 translation == BIOS_ATA_TRANSLATION_NONE ?
8652 ",trans=none" : "");
8653 break;
bellardcd6f1162004-05-13 22:02:20 +00008654 case QEMU_OPTION_hdb:
bellardcc1daa42005-06-05 14:49:17 +00008655 case QEMU_OPTION_hdc:
8656 case QEMU_OPTION_hdd:
balrog609497a2008-01-14 02:56:53 +00008657 drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda);
bellardfc01f7e2003-06-30 10:03:06 +00008658 break;
thse4bcb142007-12-02 04:51:10 +00008659 case QEMU_OPTION_drive:
balrog609497a2008-01-14 02:56:53 +00008660 drive_add(NULL, "%s", optarg);
thse4bcb142007-12-02 04:51:10 +00008661 break;
balrog3e3d5812007-04-30 02:09:25 +00008662 case QEMU_OPTION_mtdblock:
balrog609497a2008-01-14 02:56:53 +00008663 drive_add(optarg, MTD_ALIAS);
balrog3e3d5812007-04-30 02:09:25 +00008664 break;
pbrooka1bb27b2007-04-06 16:49:48 +00008665 case QEMU_OPTION_sd:
balrog609497a2008-01-14 02:56:53 +00008666 drive_add(optarg, SD_ALIAS);
pbrooka1bb27b2007-04-06 16:49:48 +00008667 break;
j_mayer86f55662007-04-24 06:52:59 +00008668 case QEMU_OPTION_pflash:
balrog609497a2008-01-14 02:56:53 +00008669 drive_add(optarg, PFLASH_ALIAS);
j_mayer86f55662007-04-24 06:52:59 +00008670 break;
bellardcd6f1162004-05-13 22:02:20 +00008671 case QEMU_OPTION_snapshot:
bellard33e39632003-07-06 17:15:21 +00008672 snapshot = 1;
8673 break;
bellardcd6f1162004-05-13 22:02:20 +00008674 case QEMU_OPTION_hdachs:
bellard330d0412003-07-26 18:11:40 +00008675 {
bellard330d0412003-07-26 18:11:40 +00008676 const char *p;
8677 p = optarg;
8678 cyls = strtol(p, (char **)&p, 0);
bellard46d47672004-11-16 01:45:27 +00008679 if (cyls < 1 || cyls > 16383)
8680 goto chs_fail;
bellard330d0412003-07-26 18:11:40 +00008681 if (*p != ',')
8682 goto chs_fail;
8683 p++;
8684 heads = strtol(p, (char **)&p, 0);
bellard46d47672004-11-16 01:45:27 +00008685 if (heads < 1 || heads > 16)
8686 goto chs_fail;
bellard330d0412003-07-26 18:11:40 +00008687 if (*p != ',')
8688 goto chs_fail;
8689 p++;
8690 secs = strtol(p, (char **)&p, 0);
bellard46d47672004-11-16 01:45:27 +00008691 if (secs < 1 || secs > 63)
8692 goto chs_fail;
8693 if (*p == ',') {
8694 p++;
8695 if (!strcmp(p, "none"))
8696 translation = BIOS_ATA_TRANSLATION_NONE;
8697 else if (!strcmp(p, "lba"))
8698 translation = BIOS_ATA_TRANSLATION_LBA;
8699 else if (!strcmp(p, "auto"))
8700 translation = BIOS_ATA_TRANSLATION_AUTO;
8701 else
8702 goto chs_fail;
8703 } else if (*p != '\0') {
bellardc4b1fcc2004-03-14 21:44:30 +00008704 chs_fail:
bellard46d47672004-11-16 01:45:27 +00008705 fprintf(stderr, "qemu: invalid physical CHS format\n");
8706 exit(1);
bellardc4b1fcc2004-03-14 21:44:30 +00008707 }
thse4bcb142007-12-02 04:51:10 +00008708 if (hda_index != -1)
balrog609497a2008-01-14 02:56:53 +00008709 snprintf(drives_opt[hda_index].opt,
8710 sizeof(drives_opt[hda_index].opt),
8711 HD_ALIAS ",cyls=%d,heads=%d,secs=%d%s",
8712 0, cyls, heads, secs,
thse4bcb142007-12-02 04:51:10 +00008713 translation == BIOS_ATA_TRANSLATION_LBA ?
8714 ",trans=lba" :
8715 translation == BIOS_ATA_TRANSLATION_NONE ?
8716 ",trans=none" : "");
bellard330d0412003-07-26 18:11:40 +00008717 }
8718 break;
bellardcd6f1162004-05-13 22:02:20 +00008719 case QEMU_OPTION_nographic:
bellarda20dd502003-09-30 21:07:02 +00008720 nographic = 1;
8721 break;
balrog4d3b6f62008-02-10 16:33:14 +00008722#ifdef CONFIG_CURSES
8723 case QEMU_OPTION_curses:
8724 curses = 1;
8725 break;
8726#endif
balroga171fe32007-04-30 01:48:07 +00008727 case QEMU_OPTION_portrait:
8728 graphic_rotate = 1;
8729 break;
bellardcd6f1162004-05-13 22:02:20 +00008730 case QEMU_OPTION_kernel:
bellarda20dd502003-09-30 21:07:02 +00008731 kernel_filename = optarg;
8732 break;
bellardcd6f1162004-05-13 22:02:20 +00008733 case QEMU_OPTION_append:
bellarda20dd502003-09-30 21:07:02 +00008734 kernel_cmdline = optarg;
bellard313aa562003-08-10 21:52:11 +00008735 break;
bellardcd6f1162004-05-13 22:02:20 +00008736 case QEMU_OPTION_cdrom:
balrog609497a2008-01-14 02:56:53 +00008737 drive_add(optarg, CDROM_ALIAS);
bellard36b486b2003-11-11 13:36:08 +00008738 break;
bellardcd6f1162004-05-13 22:02:20 +00008739 case QEMU_OPTION_boot:
j_mayer28c5af52007-11-11 01:50:45 +00008740 boot_devices = optarg;
8741 /* We just do some generic consistency checks */
8742 {
8743 /* Could easily be extended to 64 devices if needed */
ths60fe76f2007-12-16 03:02:09 +00008744 const char *p;
j_mayer28c5af52007-11-11 01:50:45 +00008745
8746 boot_devices_bitmap = 0;
8747 for (p = boot_devices; *p != '\0'; p++) {
8748 /* Allowed boot devices are:
8749 * a b : floppy disk drives
8750 * c ... f : IDE disk drives
8751 * g ... m : machine implementation dependant drives
8752 * n ... p : network devices
8753 * It's up to each machine implementation to check
8754 * if the given boot devices match the actual hardware
8755 * implementation and firmware features.
8756 */
8757 if (*p < 'a' || *p > 'q') {
8758 fprintf(stderr, "Invalid boot device '%c'\n", *p);
8759 exit(1);
8760 }
8761 if (boot_devices_bitmap & (1 << (*p - 'a'))) {
8762 fprintf(stderr,
8763 "Boot device '%c' was given twice\n",*p);
8764 exit(1);
8765 }
8766 boot_devices_bitmap |= 1 << (*p - 'a');
8767 }
bellard36b486b2003-11-11 13:36:08 +00008768 }
8769 break;
bellardcd6f1162004-05-13 22:02:20 +00008770 case QEMU_OPTION_fda:
bellardcd6f1162004-05-13 22:02:20 +00008771 case QEMU_OPTION_fdb:
balrog609497a2008-01-14 02:56:53 +00008772 drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda);
bellardc45886d2004-01-05 00:02:06 +00008773 break;
bellard52ca8d62006-06-14 16:03:05 +00008774#ifdef TARGET_I386
8775 case QEMU_OPTION_no_fd_bootchk:
8776 fd_bootchk = 0;
8777 break;
8778#endif
bellard7c9d8e02005-11-15 22:16:05 +00008779 case QEMU_OPTION_net:
8780 if (nb_net_clients >= MAX_NET_CLIENTS) {
8781 fprintf(stderr, "qemu: too many network clients\n");
bellardc4b1fcc2004-03-14 21:44:30 +00008782 exit(1);
8783 }
pbrookfd5f3932008-03-26 20:55:43 +00008784 net_clients[nb_net_clients] = optarg;
bellard7c9d8e02005-11-15 22:16:05 +00008785 nb_net_clients++;
bellard702c6512004-04-02 21:21:32 +00008786 break;
bellardc7f74642004-08-24 21:57:12 +00008787#ifdef CONFIG_SLIRP
8788 case QEMU_OPTION_tftp:
bellardc7f74642004-08-24 21:57:12 +00008789 tftp_prefix = optarg;
bellard9bf05442004-08-25 22:12:49 +00008790 break;
ths47d5d012007-02-20 00:05:08 +00008791 case QEMU_OPTION_bootp:
8792 bootp_filename = optarg;
8793 break;
bellardc94c8d62004-09-13 21:37:34 +00008794#ifndef _WIN32
bellard9d728e82004-09-05 23:09:03 +00008795 case QEMU_OPTION_smb:
8796 net_slirp_smb(optarg);
8797 break;
bellardc94c8d62004-09-13 21:37:34 +00008798#endif
bellard9bf05442004-08-25 22:12:49 +00008799 case QEMU_OPTION_redir:
ths3b46e622007-09-17 08:09:54 +00008800 net_slirp_redir(optarg);
bellard9bf05442004-08-25 22:12:49 +00008801 break;
bellardc7f74642004-08-24 21:57:12 +00008802#endif
bellard1d14ffa2005-10-30 18:58:22 +00008803#ifdef HAS_AUDIO
bellard1d14ffa2005-10-30 18:58:22 +00008804 case QEMU_OPTION_audio_help:
8805 AUD_help ();
8806 exit (0);
8807 break;
8808 case QEMU_OPTION_soundhw:
8809 select_soundhw (optarg);
8810 break;
8811#endif
bellardcd6f1162004-05-13 22:02:20 +00008812 case QEMU_OPTION_h:
ths15f82202007-06-29 23:26:08 +00008813 help(0);
bellardcd6f1162004-05-13 22:02:20 +00008814 break;
aurel3200f82b82008-04-27 21:12:55 +00008815 case QEMU_OPTION_m: {
8816 uint64_t value;
8817 char *ptr;
8818
8819 value = strtoul(optarg, &ptr, 10);
8820 switch (*ptr) {
8821 case 0: case 'M': case 'm':
8822 value <<= 20;
8823 break;
8824 case 'G': case 'g':
8825 value <<= 30;
8826 break;
8827 default:
8828 fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
bellardcd6f1162004-05-13 22:02:20 +00008829 exit(1);
8830 }
aurel3200f82b82008-04-27 21:12:55 +00008831
8832 /* On 32-bit hosts, QEMU is limited by virtual address space */
8833 if (value > (2047 << 20)
8834#ifndef USE_KQEMU
8835 && HOST_LONG_BITS == 32
8836#endif
8837 ) {
8838 fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n");
8839 exit(1);
8840 }
8841 if (value != (uint64_t)(ram_addr_t)value) {
8842 fprintf(stderr, "qemu: ram size too large\n");
8843 exit(1);
8844 }
8845 ram_size = value;
bellardcd6f1162004-05-13 22:02:20 +00008846 break;
aurel3200f82b82008-04-27 21:12:55 +00008847 }
bellardcd6f1162004-05-13 22:02:20 +00008848 case QEMU_OPTION_d:
8849 {
8850 int mask;
8851 CPULogItem *item;
ths3b46e622007-09-17 08:09:54 +00008852
bellardcd6f1162004-05-13 22:02:20 +00008853 mask = cpu_str_to_log_mask(optarg);
8854 if (!mask) {
8855 printf("Log items (comma separated):\n");
bellardf193c792004-03-21 17:06:25 +00008856 for(item = cpu_log_items; item->mask != 0; item++) {
8857 printf("%-10s %s\n", item->name, item->help);
8858 }
8859 exit(1);
bellardcd6f1162004-05-13 22:02:20 +00008860 }
8861 cpu_set_log(mask);
bellardf193c792004-03-21 17:06:25 +00008862 }
bellardcd6f1162004-05-13 22:02:20 +00008863 break;
bellard67b915a2004-03-31 23:37:16 +00008864#ifdef CONFIG_GDBSTUB
bellardcd6f1162004-05-13 22:02:20 +00008865 case QEMU_OPTION_s:
8866 use_gdbstub = 1;
8867 break;
8868 case QEMU_OPTION_p:
pbrookcfc34752007-02-22 01:48:01 +00008869 gdbstub_port = optarg;
bellardcd6f1162004-05-13 22:02:20 +00008870 break;
bellard67b915a2004-03-31 23:37:16 +00008871#endif
bellardcd6f1162004-05-13 22:02:20 +00008872 case QEMU_OPTION_L:
8873 bios_dir = optarg;
8874 break;
j_mayer1192dad2007-10-05 13:08:35 +00008875 case QEMU_OPTION_bios:
8876 bios_name = optarg;
8877 break;
bellardcd6f1162004-05-13 22:02:20 +00008878 case QEMU_OPTION_S:
pbrook3c07f8e2007-01-21 16:47:01 +00008879 autostart = 0;
bellardcd6f1162004-05-13 22:02:20 +00008880 break;
bellard3d11d0e2004-12-12 16:56:30 +00008881 case QEMU_OPTION_k:
8882 keyboard_layout = optarg;
8883 break;
bellardee22c2f2004-06-03 12:49:50 +00008884 case QEMU_OPTION_localtime:
8885 rtc_utc = 0;
8886 break;
malc3893c122008-09-28 00:42:05 +00008887 case QEMU_OPTION_vga:
8888 select_vgahw (optarg);
bellard1bfe8562004-07-08 21:17:50 +00008889 break;
bellarde9b137c2004-06-21 16:46:10 +00008890 case QEMU_OPTION_g:
8891 {
8892 const char *p;
8893 int w, h, depth;
8894 p = optarg;
8895 w = strtol(p, (char **)&p, 10);
8896 if (w <= 0) {
8897 graphic_error:
8898 fprintf(stderr, "qemu: invalid resolution or depth\n");
8899 exit(1);
8900 }
8901 if (*p != 'x')
8902 goto graphic_error;
8903 p++;
8904 h = strtol(p, (char **)&p, 10);
8905 if (h <= 0)
8906 goto graphic_error;
8907 if (*p == 'x') {
8908 p++;
8909 depth = strtol(p, (char **)&p, 10);
ths5fafdf22007-09-16 21:08:06 +00008910 if (depth != 8 && depth != 15 && depth != 16 &&
bellarde9b137c2004-06-21 16:46:10 +00008911 depth != 24 && depth != 32)
8912 goto graphic_error;
8913 } else if (*p == '\0') {
8914 depth = graphic_depth;
8915 } else {
8916 goto graphic_error;
8917 }
ths3b46e622007-09-17 08:09:54 +00008918
bellarde9b137c2004-06-21 16:46:10 +00008919 graphic_width = w;
8920 graphic_height = h;
8921 graphic_depth = depth;
8922 }
8923 break;
ths20d8a3e2007-02-18 17:04:49 +00008924 case QEMU_OPTION_echr:
8925 {
8926 char *r;
8927 term_escape_char = strtol(optarg, &r, 0);
8928 if (r == optarg)
8929 printf("Bad argument to echr\n");
8930 break;
8931 }
bellard82c643f2004-07-14 17:28:13 +00008932 case QEMU_OPTION_monitor:
pbrookfd5f3932008-03-26 20:55:43 +00008933 monitor_device = optarg;
bellard82c643f2004-07-14 17:28:13 +00008934 break;
8935 case QEMU_OPTION_serial:
bellard8d11df92004-08-24 21:13:40 +00008936 if (serial_device_index >= MAX_SERIAL_PORTS) {
8937 fprintf(stderr, "qemu: too many serial ports\n");
8938 exit(1);
8939 }
pbrookfd5f3932008-03-26 20:55:43 +00008940 serial_devices[serial_device_index] = optarg;
bellard8d11df92004-08-24 21:13:40 +00008941 serial_device_index++;
bellard82c643f2004-07-14 17:28:13 +00008942 break;
bellard6508fe52005-01-15 12:02:56 +00008943 case QEMU_OPTION_parallel:
8944 if (parallel_device_index >= MAX_PARALLEL_PORTS) {
8945 fprintf(stderr, "qemu: too many parallel ports\n");
8946 exit(1);
8947 }
pbrookfd5f3932008-03-26 20:55:43 +00008948 parallel_devices[parallel_device_index] = optarg;
bellard6508fe52005-01-15 12:02:56 +00008949 parallel_device_index++;
8950 break;
bellardd63d3072004-10-03 13:29:03 +00008951 case QEMU_OPTION_loadvm:
8952 loadvm = optarg;
8953 break;
8954 case QEMU_OPTION_full_screen:
8955 full_screen = 1;
8956 break;
ths667acca2006-12-11 02:08:05 +00008957#ifdef CONFIG_SDL
ths43523e92007-02-18 18:19:32 +00008958 case QEMU_OPTION_no_frame:
8959 no_frame = 1;
8960 break;
ths3780e192007-06-21 21:08:02 +00008961 case QEMU_OPTION_alt_grab:
8962 alt_grab = 1;
8963 break;
ths667acca2006-12-11 02:08:05 +00008964 case QEMU_OPTION_no_quit:
8965 no_quit = 1;
8966 break;
8967#endif
bellardf7cce892004-12-08 22:21:25 +00008968 case QEMU_OPTION_pidfile:
ths93815bc2007-03-19 15:58:31 +00008969 pid_file = optarg;
bellardf7cce892004-12-08 22:21:25 +00008970 break;
bellarda09db212005-04-30 16:10:35 +00008971#ifdef TARGET_I386
8972 case QEMU_OPTION_win2k_hack:
8973 win2k_install_hack = 1;
8974 break;
8975#endif
bellardd993e022005-02-10 22:00:06 +00008976#ifdef USE_KQEMU
8977 case QEMU_OPTION_no_kqemu:
8978 kqemu_allowed = 0;
8979 break;
bellard89bfc102006-02-08 22:46:31 +00008980 case QEMU_OPTION_kernel_kqemu:
8981 kqemu_allowed = 2;
8982 break;
bellardd993e022005-02-10 22:00:06 +00008983#endif
bellardbb36d472005-11-05 14:22:28 +00008984 case QEMU_OPTION_usb:
8985 usb_enabled = 1;
8986 break;
bellarda594cfb2005-11-06 16:13:29 +00008987 case QEMU_OPTION_usbdevice:
8988 usb_enabled = 1;
pbrook0d92ed32006-05-21 16:30:15 +00008989 if (usb_devices_index >= MAX_USB_CMDLINE) {
bellarda594cfb2005-11-06 16:13:29 +00008990 fprintf(stderr, "Too many USB devices\n");
8991 exit(1);
8992 }
pbrookfd5f3932008-03-26 20:55:43 +00008993 usb_devices[usb_devices_index] = optarg;
bellarda594cfb2005-11-06 16:13:29 +00008994 usb_devices_index++;
8995 break;
bellard6a00d602005-11-21 23:25:50 +00008996 case QEMU_OPTION_smp:
8997 smp_cpus = atoi(optarg);
bellardba3c64f2005-12-05 20:31:52 +00008998 if (smp_cpus < 1 || smp_cpus > MAX_CPUS) {
bellard6a00d602005-11-21 23:25:50 +00008999 fprintf(stderr, "Invalid number of CPUs\n");
9000 exit(1);
9001 }
9002 break;
bellard24236862006-04-30 21:28:36 +00009003 case QEMU_OPTION_vnc:
ths73fc9742006-12-22 02:09:07 +00009004 vnc_display = optarg;
bellard24236862006-04-30 21:28:36 +00009005 break;
bellard6515b202006-05-03 22:02:44 +00009006 case QEMU_OPTION_no_acpi:
9007 acpi_enabled = 0;
9008 break;
bellardd1beab82006-10-02 19:44:22 +00009009 case QEMU_OPTION_no_reboot:
9010 no_reboot = 1;
9011 break;
aurel32b2f76162008-04-11 21:35:52 +00009012 case QEMU_OPTION_no_shutdown:
9013 no_shutdown = 1;
9014 break;
balrog9467cd42007-05-01 01:34:14 +00009015 case QEMU_OPTION_show_cursor:
9016 cursor_hide = 0;
9017 break;
blueswir18fcb1b92008-09-18 18:29:08 +00009018 case QEMU_OPTION_uuid:
9019 if(qemu_uuid_parse(optarg, qemu_uuid) < 0) {
9020 fprintf(stderr, "Fail to parse UUID string."
9021 " Wrong format.\n");
9022 exit(1);
9023 }
9024 break;
ths71e3ceb2006-12-22 02:11:31 +00009025 case QEMU_OPTION_daemonize:
9026 daemonize = 1;
9027 break;
ths9ae02552007-01-05 17:39:04 +00009028 case QEMU_OPTION_option_rom:
9029 if (nb_option_roms >= MAX_OPTION_ROMS) {
9030 fprintf(stderr, "Too many option ROMs\n");
9031 exit(1);
9032 }
9033 option_rom[nb_option_roms] = optarg;
9034 nb_option_roms++;
9035 break;
pbrook8e716212007-01-20 17:12:09 +00009036 case QEMU_OPTION_semihosting:
9037 semihosting_enabled = 1;
9038 break;
thsc35734b2007-03-19 15:17:08 +00009039 case QEMU_OPTION_name:
9040 qemu_name = optarg;
9041 break;
blueswir166508602007-05-01 14:16:52 +00009042#ifdef TARGET_SPARC
9043 case QEMU_OPTION_prom_env:
9044 if (nb_prom_envs >= MAX_PROM_ENVS) {
9045 fprintf(stderr, "Too many prom variables\n");
9046 exit(1);
9047 }
9048 prom_envs[nb_prom_envs] = optarg;
9049 nb_prom_envs++;
9050 break;
9051#endif
balrog2b8f2d42007-07-27 22:08:46 +00009052#ifdef TARGET_ARM
9053 case QEMU_OPTION_old_param:
9054 old_param = 1;
ths05ebd532008-01-08 19:32:16 +00009055 break;
balrog2b8f2d42007-07-27 22:08:46 +00009056#endif
thsf3dcfad2007-08-24 01:26:02 +00009057 case QEMU_OPTION_clock:
9058 configure_alarms(optarg);
9059 break;
bellard7e0af5d02007-11-07 16:24:33 +00009060 case QEMU_OPTION_startdate:
9061 {
9062 struct tm tm;
balrogf6503052008-02-17 11:42:19 +00009063 time_t rtc_start_date;
bellard7e0af5d02007-11-07 16:24:33 +00009064 if (!strcmp(optarg, "now")) {
balrogf6503052008-02-17 11:42:19 +00009065 rtc_date_offset = -1;
bellard7e0af5d02007-11-07 16:24:33 +00009066 } else {
9067 if (sscanf(optarg, "%d-%d-%dT%d:%d:%d",
9068 &tm.tm_year,
9069 &tm.tm_mon,
9070 &tm.tm_mday,
9071 &tm.tm_hour,
9072 &tm.tm_min,
9073 &tm.tm_sec) == 6) {
9074 /* OK */
9075 } else if (sscanf(optarg, "%d-%d-%d",
9076 &tm.tm_year,
9077 &tm.tm_mon,
9078 &tm.tm_mday) == 3) {
9079 tm.tm_hour = 0;
9080 tm.tm_min = 0;
9081 tm.tm_sec = 0;
9082 } else {
9083 goto date_fail;
9084 }
9085 tm.tm_year -= 1900;
9086 tm.tm_mon--;
bellard3c6b2082007-11-10 19:36:39 +00009087 rtc_start_date = mktimegm(&tm);
bellard7e0af5d02007-11-07 16:24:33 +00009088 if (rtc_start_date == -1) {
9089 date_fail:
9090 fprintf(stderr, "Invalid date format. Valid format are:\n"
9091 "'now' or '2006-06-17T16:01:21' or '2006-06-17'\n");
9092 exit(1);
9093 }
balrogf6503052008-02-17 11:42:19 +00009094 rtc_date_offset = time(NULL) - rtc_start_date;
bellard7e0af5d02007-11-07 16:24:33 +00009095 }
9096 }
9097 break;
bellard26a5f132008-05-28 12:30:31 +00009098 case QEMU_OPTION_tb_size:
9099 tb_size = strtol(optarg, NULL, 0);
9100 if (tb_size < 0)
9101 tb_size = 0;
9102 break;
pbrook2e70f6e2008-06-29 01:03:05 +00009103 case QEMU_OPTION_icount:
9104 use_icount = 1;
9105 if (strcmp(optarg, "auto") == 0) {
9106 icount_time_shift = -1;
9107 } else {
9108 icount_time_shift = strtol(optarg, NULL, 0);
9109 }
9110 break;
bellardcd6f1162004-05-13 22:02:20 +00009111 }
bellard0824d6f2003-06-24 13:42:40 +00009112 }
9113 }
bellard330d0412003-07-26 18:11:40 +00009114
aliguoribc0129d2008-08-01 15:12:34 +00009115 if (nographic) {
9116 if (serial_device_index == 0)
9117 serial_devices[0] = "stdio";
9118 if (parallel_device_index == 0)
9119 parallel_devices[0] = "null";
9120 if (strncmp(monitor_device, "vc", 2) == 0)
9121 monitor_device = "stdio";
9122 }
9123
ths71e3ceb2006-12-22 02:11:31 +00009124#ifndef _WIN32
ths71e3ceb2006-12-22 02:11:31 +00009125 if (daemonize) {
9126 pid_t pid;
9127
9128 if (pipe(fds) == -1)
9129 exit(1);
9130
9131 pid = fork();
9132 if (pid > 0) {
9133 uint8_t status;
9134 ssize_t len;
9135
9136 close(fds[1]);
9137
9138 again:
ths93815bc2007-03-19 15:58:31 +00009139 len = read(fds[0], &status, 1);
9140 if (len == -1 && (errno == EINTR))
9141 goto again;
9142
9143 if (len != 1)
9144 exit(1);
9145 else if (status == 1) {
9146 fprintf(stderr, "Could not acquire pidfile\n");
9147 exit(1);
9148 } else
9149 exit(0);
ths71e3ceb2006-12-22 02:11:31 +00009150 } else if (pid < 0)
ths93815bc2007-03-19 15:58:31 +00009151 exit(1);
ths71e3ceb2006-12-22 02:11:31 +00009152
9153 setsid();
9154
9155 pid = fork();
9156 if (pid > 0)
9157 exit(0);
9158 else if (pid < 0)
9159 exit(1);
9160
9161 umask(027);
ths71e3ceb2006-12-22 02:11:31 +00009162
9163 signal(SIGTSTP, SIG_IGN);
9164 signal(SIGTTOU, SIG_IGN);
9165 signal(SIGTTIN, SIG_IGN);
9166 }
9167#endif
9168
thsaa26bb22007-03-25 21:33:06 +00009169 if (pid_file && qemu_create_pidfile(pid_file) != 0) {
ths93815bc2007-03-19 15:58:31 +00009170 if (daemonize) {
9171 uint8_t status = 1;
9172 write(fds[1], &status, 1);
9173 } else
9174 fprintf(stderr, "Could not acquire pid file\n");
9175 exit(1);
9176 }
9177
bellardff3fbb32006-01-08 10:53:14 +00009178#ifdef USE_KQEMU
9179 if (smp_cpus > 1)
9180 kqemu_allowed = 0;
9181#endif
bellarda20dd502003-09-30 21:07:02 +00009182 linux_boot = (kernel_filename != NULL);
balrog7317b8c2007-11-18 02:09:36 +00009183 net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
balrog6c41b272007-11-17 12:12:29 +00009184
j_mayer28c5af52007-11-11 01:50:45 +00009185 if (!linux_boot && net_boot == 0 &&
blueswir1f88e4b92008-08-12 15:58:35 +00009186 !machine->nodisk_ok && nb_drives_opt == 0)
ths15f82202007-06-29 23:26:08 +00009187 help(1);
bellard0824d6f2003-06-24 13:42:40 +00009188
thsf8d39c02008-07-03 10:01:15 +00009189 if (!linux_boot && *kernel_cmdline != '\0') {
9190 fprintf(stderr, "-append only allowed with -kernel option\n");
9191 exit(1);
9192 }
9193
9194 if (!linux_boot && initrd_filename != NULL) {
9195 fprintf(stderr, "-initrd only allowed with -kernel option\n");
9196 exit(1);
9197 }
9198
ths96d30e42007-01-07 20:42:14 +00009199 /* boot to floppy or the default cd if no hard disk defined yet */
j_mayer28c5af52007-11-11 01:50:45 +00009200 if (!boot_devices[0]) {
thse4bcb142007-12-02 04:51:10 +00009201 boot_devices = "cad";
ths96d30e42007-01-07 20:42:14 +00009202 }
bellardb118d612003-06-30 23:36:21 +00009203 setvbuf(stdout, NULL, _IOLBF, 0);
ths3b46e622007-09-17 08:09:54 +00009204
pbrook634fce92006-07-15 17:40:09 +00009205 init_timers();
9206 init_timer_alarm();
pbrook2e70f6e2008-06-29 01:03:05 +00009207 if (use_icount && icount_time_shift < 0) {
9208 use_icount = 2;
9209 /* 125MIPS seems a reasonable initial guess at the guest speed.
9210 It will be corrected fairly quickly anyway. */
9211 icount_time_shift = 3;
9212 init_icount_adjust();
9213 }
pbrook634fce92006-07-15 17:40:09 +00009214
bellardfd1dff42006-02-01 21:29:26 +00009215#ifdef _WIN32
9216 socket_init();
9217#endif
9218
bellard7c9d8e02005-11-15 22:16:05 +00009219 /* init network clients */
9220 if (nb_net_clients == 0) {
9221 /* if no clients, we use a default config */
aliguorif441b282008-08-28 20:05:14 +00009222 net_clients[nb_net_clients++] = "nic";
9223#ifdef CONFIG_SLIRP
9224 net_clients[nb_net_clients++] = "user";
9225#endif
bellardc20709a2004-04-21 23:27:19 +00009226 }
9227
bellard7c9d8e02005-11-15 22:16:05 +00009228 for(i = 0;i < nb_net_clients; i++) {
balrog9ad97e62008-07-29 13:16:31 +00009229 if (net_client_parse(net_clients[i]) < 0)
bellard7c9d8e02005-11-15 22:16:05 +00009230 exit(1);
bellard702c6512004-04-02 21:21:32 +00009231 }
blueswir1833c7172007-05-27 19:36:43 +00009232 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
9233 if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
9234 continue;
balrog9ad97e62008-07-29 13:16:31 +00009235 if (vlan->nb_guest_devs == 0)
9236 fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
blueswir1833c7172007-05-27 19:36:43 +00009237 if (vlan->nb_host_devs == 0)
9238 fprintf(stderr,
9239 "Warning: vlan %d is not connected to host network\n",
9240 vlan->id);
9241 }
bellardf1510b22003-06-25 00:07:40 +00009242
thseec85c22007-01-05 17:41:07 +00009243#ifdef TARGET_I386
balroged494d82007-12-11 23:23:52 +00009244 /* XXX: this should be moved in the PC machine instantiation code */
j_mayer28c5af52007-11-11 01:50:45 +00009245 if (net_boot != 0) {
9246 int netroms = 0;
9247 for (i = 0; i < nb_nics && i < 4; i++) {
thseec85c22007-01-05 17:41:07 +00009248 const char *model = nd_table[i].model;
9249 char buf[1024];
j_mayer28c5af52007-11-11 01:50:45 +00009250 if (net_boot & (1 << i)) {
9251 if (model == NULL)
9252 model = "ne2k_pci";
9253 snprintf(buf, sizeof(buf), "%s/pxe-%s.bin", bios_dir, model);
9254 if (get_image_size(buf) > 0) {
9255 if (nb_option_roms >= MAX_OPTION_ROMS) {
9256 fprintf(stderr, "Too many option ROMs\n");
9257 exit(1);
9258 }
9259 option_rom[nb_option_roms] = strdup(buf);
9260 nb_option_roms++;
9261 netroms++;
9262 }
9263 }
thseec85c22007-01-05 17:41:07 +00009264 }
j_mayer28c5af52007-11-11 01:50:45 +00009265 if (netroms == 0) {
thseec85c22007-01-05 17:41:07 +00009266 fprintf(stderr, "No valid PXE rom found for network device\n");
9267 exit(1);
9268 }
thseec85c22007-01-05 17:41:07 +00009269 }
9270#endif
9271
bellard0824d6f2003-06-24 13:42:40 +00009272 /* init the memory */
balrog7fb4fdc2008-04-24 17:59:27 +00009273 phys_ram_size = machine->ram_require & ~RAMSIZE_FIXED;
9274
9275 if (machine->ram_require & RAMSIZE_FIXED) {
9276 if (ram_size > 0) {
9277 if (ram_size < phys_ram_size) {
aurel32cd940062008-04-28 20:26:54 +00009278 fprintf(stderr, "Machine `%s' requires %llu bytes of memory\n",
9279 machine->name, (unsigned long long) phys_ram_size);
balrog7fb4fdc2008-04-24 17:59:27 +00009280 exit(-1);
9281 }
9282
9283 phys_ram_size = ram_size;
9284 } else
9285 ram_size = phys_ram_size;
9286 } else {
aurel324fc5d072008-04-27 21:39:40 +00009287 if (ram_size == 0)
balrog7fb4fdc2008-04-24 17:59:27 +00009288 ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
9289
9290 phys_ram_size += ram_size;
9291 }
ths9ae02552007-01-05 17:39:04 +00009292
bellardd993e022005-02-10 22:00:06 +00009293 phys_ram_base = qemu_vmalloc(phys_ram_size);
bellard7f7f9872003-10-30 01:11:23 +00009294 if (!phys_ram_base) {
9295 fprintf(stderr, "Could not allocate physical memory\n");
bellard0824d6f2003-06-24 13:42:40 +00009296 exit(1);
9297 }
9298
bellard26a5f132008-05-28 12:30:31 +00009299 /* init the dynamic translator */
9300 cpu_exec_init_all(tb_size * 1024 * 1024);
9301
bellard5905b2e2004-08-01 21:53:26 +00009302 bdrv_init();
thse4bcb142007-12-02 04:51:10 +00009303
9304 /* we always create the cdrom drive, even if no disk is there */
9305
9306 if (nb_drives_opt < MAX_DRIVES)
balrog609497a2008-01-14 02:56:53 +00009307 drive_add(NULL, CDROM_ALIAS);
thse4bcb142007-12-02 04:51:10 +00009308
balrog9d413d12007-12-04 00:10:34 +00009309 /* we always create at least one floppy */
thse4bcb142007-12-02 04:51:10 +00009310
9311 if (nb_drives_opt < MAX_DRIVES)
balrog609497a2008-01-14 02:56:53 +00009312 drive_add(NULL, FD_ALIAS, 0);
bellardc4b1fcc2004-03-14 21:44:30 +00009313
balrog9d413d12007-12-04 00:10:34 +00009314 /* we always create one sd slot, even if no card is in it */
9315
9316 if (nb_drives_opt < MAX_DRIVES)
balrog609497a2008-01-14 02:56:53 +00009317 drive_add(NULL, SD_ALIAS);
balrog9d413d12007-12-04 00:10:34 +00009318
ths96d30e42007-01-07 20:42:14 +00009319 /* open the virtual block devices */
bellardc4b1fcc2004-03-14 21:44:30 +00009320
thse4bcb142007-12-02 04:51:10 +00009321 for(i = 0; i < nb_drives_opt; i++)
balrog609497a2008-01-14 02:56:53 +00009322 if (drive_init(&drives_opt[i], snapshot, machine) == -1)
thse4bcb142007-12-02 04:51:10 +00009323 exit(1);
balrog3e3d5812007-04-30 02:09:25 +00009324
bellardc88676f2006-08-06 13:36:11 +00009325 register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
9326 register_savevm("ram", 0, 2, ram_save, ram_load, NULL);
bellard8a7ddc32004-03-31 19:00:16 +00009327
bellard313aa562003-08-10 21:52:11 +00009328 /* terminal init */
ths740733b2007-06-08 01:57:56 +00009329 memset(&display_state, 0, sizeof(display_state));
bellarda20dd502003-09-30 21:07:02 +00009330 if (nographic) {
balrog4d3b6f62008-02-10 16:33:14 +00009331 if (curses) {
9332 fprintf(stderr, "fatal: -nographic can't be used with -curses\n");
9333 exit(1);
9334 }
ths2ff89792007-06-21 23:34:19 +00009335 /* nearly nothing to do */
9336 dumb_display_init(ds);
ths73fc9742006-12-22 02:09:07 +00009337 } else if (vnc_display != NULL) {
ths71cab5c2007-08-25 01:35:38 +00009338 vnc_display_init(ds);
9339 if (vnc_display_open(ds, vnc_display) < 0)
9340 exit(1);
balrog4d3b6f62008-02-10 16:33:14 +00009341 } else
9342#if defined(CONFIG_CURSES)
9343 if (curses) {
9344 curses_display_init(ds, full_screen);
9345 } else
9346#endif
9347 {
bellard5b0753e2005-03-01 21:37:28 +00009348#if defined(CONFIG_SDL)
ths43523e92007-02-18 18:19:32 +00009349 sdl_display_init(ds, full_screen, no_frame);
bellard5b0753e2005-03-01 21:37:28 +00009350#elif defined(CONFIG_COCOA)
9351 cocoa_display_init(ds, full_screen);
pbrook67276f52007-11-15 19:04:08 +00009352#else
9353 dumb_display_init(ds);
bellard313aa562003-08-10 21:52:11 +00009354#endif
9355 }
bellard0824d6f2003-06-24 13:42:40 +00009356
aliguori5b08fc12008-08-21 20:08:03 +00009357#ifndef _WIN32
9358 /* must be after terminal init, SDL library changes signal handlers */
9359 termsig_setup();
9360#endif
9361
ths20d8a3e2007-02-18 17:04:49 +00009362 /* Maintain compatibility with multiple stdio monitors */
9363 if (!strcmp(monitor_device,"stdio")) {
9364 for (i = 0; i < MAX_SERIAL_PORTS; i++) {
pbrookfd5f3932008-03-26 20:55:43 +00009365 const char *devname = serial_devices[i];
9366 if (devname && !strcmp(devname,"mon:stdio")) {
9367 monitor_device = NULL;
ths20d8a3e2007-02-18 17:04:49 +00009368 break;
pbrookfd5f3932008-03-26 20:55:43 +00009369 } else if (devname && !strcmp(devname,"stdio")) {
9370 monitor_device = NULL;
9371 serial_devices[i] = "mon:stdio";
ths20d8a3e2007-02-18 17:04:49 +00009372 break;
9373 }
9374 }
bellard82c643f2004-07-14 17:28:13 +00009375 }
pbrookfd5f3932008-03-26 20:55:43 +00009376 if (monitor_device) {
ths20d8a3e2007-02-18 17:04:49 +00009377 monitor_hd = qemu_chr_open(monitor_device);
9378 if (!monitor_hd) {
9379 fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
9380 exit(1);
9381 }
9382 monitor_init(monitor_hd, !nographic);
9383 }
bellard82c643f2004-07-14 17:28:13 +00009384
bellard8d11df92004-08-24 21:13:40 +00009385 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
bellardc03b0f02006-09-03 14:10:53 +00009386 const char *devname = serial_devices[i];
pbrookfd5f3932008-03-26 20:55:43 +00009387 if (devname && strcmp(devname, "none")) {
bellardc03b0f02006-09-03 14:10:53 +00009388 serial_hds[i] = qemu_chr_open(devname);
bellard8d11df92004-08-24 21:13:40 +00009389 if (!serial_hds[i]) {
ths5fafdf22007-09-16 21:08:06 +00009390 fprintf(stderr, "qemu: could not open serial device '%s'\n",
bellardc03b0f02006-09-03 14:10:53 +00009391 devname);
bellard8d11df92004-08-24 21:13:40 +00009392 exit(1);
9393 }
thsaf3a9032007-07-11 23:14:59 +00009394 if (strstart(devname, "vc", 0))
bellard7ba12602006-07-14 20:26:42 +00009395 qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
bellard8d11df92004-08-24 21:13:40 +00009396 }
bellard82c643f2004-07-14 17:28:13 +00009397 }
bellard82c643f2004-07-14 17:28:13 +00009398
bellard6508fe52005-01-15 12:02:56 +00009399 for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
bellardc03b0f02006-09-03 14:10:53 +00009400 const char *devname = parallel_devices[i];
pbrookfd5f3932008-03-26 20:55:43 +00009401 if (devname && strcmp(devname, "none")) {
bellardc03b0f02006-09-03 14:10:53 +00009402 parallel_hds[i] = qemu_chr_open(devname);
bellard6508fe52005-01-15 12:02:56 +00009403 if (!parallel_hds[i]) {
ths5fafdf22007-09-16 21:08:06 +00009404 fprintf(stderr, "qemu: could not open parallel device '%s'\n",
bellardc03b0f02006-09-03 14:10:53 +00009405 devname);
bellard6508fe52005-01-15 12:02:56 +00009406 exit(1);
9407 }
thsaf3a9032007-07-11 23:14:59 +00009408 if (strstart(devname, "vc", 0))
bellard7ba12602006-07-14 20:26:42 +00009409 qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
bellard6508fe52005-01-15 12:02:56 +00009410 }
9411 }
9412
blueswir1b881c2c2007-11-18 08:46:58 +00009413 machine->init(ram_size, vga_ram_size, boot_devices, ds,
j_mayer94fc95c2007-03-05 19:44:02 +00009414 kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
bellard73332e52004-04-04 20:22:28 +00009415
pbrook0d92ed32006-05-21 16:30:15 +00009416 /* init USB devices */
9417 if (usb_enabled) {
9418 for(i = 0; i < usb_devices_index; i++) {
9419 if (usb_device_add(usb_devices[i]) < 0) {
9420 fprintf(stderr, "Warning: could not add USB device %s\n",
9421 usb_devices[i]);
9422 }
9423 }
9424 }
9425
ths740733b2007-06-08 01:57:56 +00009426 if (display_state.dpy_refresh) {
9427 display_state.gui_timer = qemu_new_timer(rt_clock, gui_update, &display_state);
9428 qemu_mod_timer(display_state.gui_timer, qemu_get_clock(rt_clock));
9429 }
bellard7f7f9872003-10-30 01:11:23 +00009430
bellard67b915a2004-03-31 23:37:16 +00009431#ifdef CONFIG_GDBSTUB
bellardb4608c02003-06-27 17:34:32 +00009432 if (use_gdbstub) {
bellardc636bb62007-02-05 20:46:05 +00009433 /* XXX: use standard host:port notation and modify options
9434 accordingly. */
pbrookcfc34752007-02-22 01:48:01 +00009435 if (gdbserver_start(gdbstub_port) < 0) {
9436 fprintf(stderr, "qemu: could not open gdbstub device on port '%s'\n",
bellardc636bb62007-02-05 20:46:05 +00009437 gdbstub_port);
bellard8a7ddc32004-03-31 19:00:16 +00009438 exit(1);
bellard8a7ddc32004-03-31 19:00:16 +00009439 }
balrog45669e02007-07-02 13:20:17 +00009440 }
bellard67b915a2004-03-31 23:37:16 +00009441#endif
balrog45669e02007-07-02 13:20:17 +00009442
bellardd63d3072004-10-03 13:29:03 +00009443 if (loadvm)
bellardfaea38e2006-08-05 21:31:00 +00009444 do_loadvm(loadvm);
bellardd63d3072004-10-03 13:29:03 +00009445
bellard67b915a2004-03-31 23:37:16 +00009446 {
bellard5905b2e2004-08-01 21:53:26 +00009447 /* XXX: simplify init */
aliguori83ab7952008-08-19 14:44:22 +00009448 read_passwords();
pbrook3c07f8e2007-01-21 16:47:01 +00009449 if (autostart) {
bellard5905b2e2004-08-01 21:53:26 +00009450 vm_start();
9451 }
bellard0824d6f2003-06-24 13:42:40 +00009452 }
thsffd843b2006-12-21 19:46:43 +00009453
ths71e3ceb2006-12-22 02:11:31 +00009454 if (daemonize) {
9455 uint8_t status = 0;
9456 ssize_t len;
9457 int fd;
9458
9459 again1:
9460 len = write(fds[1], &status, 1);
9461 if (len == -1 && (errno == EINTR))
9462 goto again1;
9463
9464 if (len != 1)
9465 exit(1);
9466
aliguoribd54b862008-07-23 00:58:33 +00009467 chdir("/");
balrogaeb30be2007-07-02 15:03:13 +00009468 TFR(fd = open("/dev/null", O_RDWR));
ths71e3ceb2006-12-22 02:11:31 +00009469 if (fd == -1)
9470 exit(1);
9471
9472 dup2(fd, 0);
9473 dup2(fd, 1);
9474 dup2(fd, 2);
9475
9476 close(fd);
9477 }
9478
bellard8a7ddc32004-03-31 19:00:16 +00009479 main_loop();
bellard40c3bac2004-04-04 12:56:28 +00009480 quit_timers();
thsb46a8902007-10-21 23:20:45 +00009481
ths7d294b62007-10-26 17:21:58 +00009482#if !defined(_WIN32)
thsb46a8902007-10-21 23:20:45 +00009483 /* close network clients */
9484 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
9485 VLANClientState *vc;
9486
ths7d294b62007-10-26 17:21:58 +00009487 for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
thsb46a8902007-10-21 23:20:45 +00009488 if (vc->fd_read == tap_receive) {
9489 char ifname[64];
9490 TAPState *s = vc->opaque;
9491
9492 if (sscanf(vc->info_str, "tap: ifname=%63s ", ifname) == 1 &&
9493 s->down_script[0])
9494 launch_script(s->down_script, ifname, s->fd);
9495 }
ths8a16d272008-07-19 09:56:24 +00009496#if defined(CONFIG_VDE)
9497 if (vc->fd_read == vde_from_qemu) {
9498 VDEState *s = vc->opaque;
9499 vde_close(s->vde);
9500 }
9501#endif
ths4fddf622007-12-17 04:42:29 +00009502 }
ths7d294b62007-10-26 17:21:58 +00009503 }
9504#endif
bellard0824d6f2003-06-24 13:42:40 +00009505 return 0;
9506}