blob: dbdbefb75920750026ad77ab88a978b378b4c3b0 [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 */
bellard0824d6f2003-06-24 13:42:40 +000024#include <unistd.h>
bellard0824d6f2003-06-24 13:42:40 +000025#include <fcntl.h>
26#include <signal.h>
27#include <time.h>
bellard0824d6f2003-06-24 13:42:40 +000028#include <errno.h>
bellard67b915a2004-03-31 23:37:16 +000029#include <sys/time.h>
bellardc88676f2006-08-06 13:36:11 +000030#include <zlib.h>
bellard67b915a2004-03-31 23:37:16 +000031
blueswir1179a2c12009-03-08 08:23:32 +000032/* Needed early for HOST_BSD etc. */
blueswir1d40cdb12009-03-07 16:52:02 +000033#include "config-host.h"
34
bellard67b915a2004-03-31 23:37:16 +000035#ifndef _WIN32
aliguori08585322009-02-27 22:09:45 +000036#include <pwd.h>
bellard67b915a2004-03-31 23:37:16 +000037#include <sys/times.h>
bellardf1510b22003-06-25 00:07:40 +000038#include <sys/wait.h>
bellard67b915a2004-03-31 23:37:16 +000039#include <termios.h>
bellard67b915a2004-03-31 23:37:16 +000040#include <sys/mman.h>
bellardf1510b22003-06-25 00:07:40 +000041#include <sys/ioctl.h>
blueswir124646c72008-11-07 16:55:48 +000042#include <sys/resource.h>
bellardf1510b22003-06-25 00:07:40 +000043#include <sys/socket.h>
bellardc94c8d62004-09-13 21:37:34 +000044#include <netinet/in.h>
blueswir124646c72008-11-07 16:55:48 +000045#include <net/if.h>
46#if defined(__NetBSD__)
47#include <net/if_tap.h>
48#endif
49#ifdef __linux__
50#include <linux/if_tun.h>
51#endif
52#include <arpa/inet.h>
bellard9d728e82004-09-05 23:09:03 +000053#include <dirent.h>
bellard7c9d8e02005-11-15 22:16:05 +000054#include <netdb.h>
thscb4b9762007-09-13 12:39:35 +000055#include <sys/select.h>
blueswir1179a2c12009-03-08 08:23:32 +000056#ifdef HOST_BSD
bellard7d3505c2004-05-12 19:32:15 +000057#include <sys/stat.h>
blueswir1c5e97232009-03-07 20:06:23 +000058#if defined(__FreeBSD__) || defined(__DragonFly__)
bellard7d3505c2004-05-12 19:32:15 +000059#include <libutil.h>
blueswir124646c72008-11-07 16:55:48 +000060#else
61#include <util.h>
blueswir1128ab2f2008-08-15 18:33:42 +000062#endif
ths5c40d2b2007-06-23 16:03:36 +000063#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
64#include <freebsd/stdlib.h>
bellard7d3505c2004-05-12 19:32:15 +000065#else
blueswir1223f0d72008-09-30 18:12:18 +000066#ifdef __linux__
bellard7d3505c2004-05-12 19:32:15 +000067#include <pty.h>
68#include <malloc.h>
bellardfd872592004-05-12 19:11:15 +000069#include <linux/rtc.h>
thsbd494f42007-09-16 20:03:23 +000070
71/* For the benefit of older linux systems which don't supply it,
72 we use a local copy of hpet.h. */
73/* #include <linux/hpet.h> */
74#include "hpet.h"
75
bellarde57a8c02005-11-10 23:58:52 +000076#include <linux/ppdev.h>
ths5867c882007-02-17 23:44:43 +000077#include <linux/parport.h>
blueswir1223f0d72008-09-30 18:12:18 +000078#endif
79#ifdef __sun__
thsd5d10bc2007-02-17 22:54:49 +000080#include <sys/stat.h>
81#include <sys/ethernet.h>
82#include <sys/sockio.h>
thsd5d10bc2007-02-17 22:54:49 +000083#include <netinet/arp.h>
84#include <netinet/in.h>
85#include <netinet/in_systm.h>
86#include <netinet/ip.h>
87#include <netinet/ip_icmp.h> // must come after ip.h
88#include <netinet/udp.h>
89#include <netinet/tcp.h>
90#include <net/if.h>
91#include <syslog.h>
92#include <stropts.h>
bellard67b915a2004-03-31 23:37:16 +000093#endif
bellard7d3505c2004-05-12 19:32:15 +000094#endif
bellardec530c82006-04-25 22:36:06 +000095#endif
bellard67b915a2004-03-31 23:37:16 +000096
blueswir19892fbf2008-08-24 10:34:20 +000097#if defined(__OpenBSD__)
98#include <util.h>
99#endif
100
ths8a16d272008-07-19 09:56:24 +0000101#if defined(CONFIG_VDE)
102#include <libvdeplug.h>
103#endif
104
bellard67b915a2004-03-31 23:37:16 +0000105#ifdef _WIN32
aliguori49dc7682009-03-08 16:26:59 +0000106#include <windows.h>
bellard7d3505c2004-05-12 19:32:15 +0000107#include <malloc.h>
bellard67b915a2004-03-31 23:37:16 +0000108#include <sys/timeb.h>
ths4fddf622007-12-17 04:42:29 +0000109#include <mmsystem.h>
bellard67b915a2004-03-31 23:37:16 +0000110#define getopt_long_only getopt_long
111#define memalign(align, size) malloc(size)
112#endif
113
bellard73332e52004-04-04 20:22:28 +0000114#ifdef CONFIG_SDL
bellard96bcd4f2004-07-10 16:26:15 +0000115#ifdef __APPLE__
bellard83fb7ad2004-07-05 21:25:26 +0000116#include <SDL/SDL.h>
malc880fec52009-02-15 20:18:41 +0000117int qemu_main(int argc, char **argv, char **envp);
118int main(int argc, char **argv)
119{
120 qemu_main(argc, argv, NULL);
121}
122#undef main
123#define main qemu_main
bellard96bcd4f2004-07-10 16:26:15 +0000124#endif
bellard73332e52004-04-04 20:22:28 +0000125#endif /* CONFIG_SDL */
bellard0824d6f2003-06-24 13:42:40 +0000126
bellard5b0753e2005-03-01 21:37:28 +0000127#ifdef CONFIG_COCOA
128#undef main
129#define main qemu_main
130#endif /* CONFIG_COCOA */
131
blueswir1511d2b12009-03-07 15:32:56 +0000132#include "hw/hw.h"
133#include "hw/boards.h"
134#include "hw/usb.h"
135#include "hw/pcmcia.h"
136#include "hw/pc.h"
137#include "hw/audiodev.h"
138#include "hw/isa.h"
139#include "hw/baum.h"
140#include "hw/bt.h"
aliguorib6f6e3d2009-04-17 18:59:56 +0000141#include "hw/smbios.h"
aliguorie37630c2009-04-22 15:19:10 +0000142#include "hw/xen.h"
aurel325ef4efa2009-03-10 21:43:35 +0000143#include "bt-host.h"
blueswir1511d2b12009-03-07 15:32:56 +0000144#include "net.h"
145#include "monitor.h"
146#include "console.h"
147#include "sysemu.h"
148#include "gdbstub.h"
149#include "qemu-timer.h"
150#include "qemu-char.h"
151#include "cache-utils.h"
152#include "block.h"
blueswir1a718ace2009-03-28 08:24:44 +0000153#include "dma.h"
blueswir1511d2b12009-03-07 15:32:56 +0000154#include "audio/audio.h"
155#include "migration.h"
156#include "kvm.h"
157#include "balloon.h"
158
bellard0824d6f2003-06-24 13:42:40 +0000159#include "disas.h"
bellardfc01f7e2003-06-30 10:03:06 +0000160
bellard8a7ddc32004-03-31 19:00:16 +0000161#include "exec-all.h"
bellard0824d6f2003-06-24 13:42:40 +0000162
blueswir1511d2b12009-03-07 15:32:56 +0000163#include "qemu_socket.h"
164
165#if defined(CONFIG_SLIRP)
166#include "libslirp.h"
167#endif
168
bellard0824d6f2003-06-24 13:42:40 +0000169//#define DEBUG_UNUSED_IOPORT
bellardfd872592004-05-12 19:11:15 +0000170//#define DEBUG_IOPORT
blueswir19dc63a12008-10-04 07:25:46 +0000171//#define DEBUG_NET
172//#define DEBUG_SLIRP
bellard330d0412003-07-26 18:11:40 +0000173
aliguorid12d51d2009-01-15 21:48:06 +0000174
175#ifdef DEBUG_IOPORT
aliguori93fcfe32009-01-15 22:34:14 +0000176# define LOG_IOPORT(...) qemu_log_mask(CPU_LOG_IOPORT, ## __VA_ARGS__)
aliguorid12d51d2009-01-15 21:48:06 +0000177#else
178# define LOG_IOPORT(...) do { } while (0)
179#endif
180
bellard1bfe8562004-07-08 21:17:50 +0000181#define DEFAULT_RAM_SIZE 128
bellard313aa562003-08-10 21:52:11 +0000182
pbrook0d92ed32006-05-21 16:30:15 +0000183/* Max number of USB devices that can be specified on the commandline. */
184#define MAX_USB_CMDLINE 8
185
balrogdc72ac12008-11-09 00:04:26 +0000186/* Max number of bluetooth switches on the commandline. */
187#define MAX_BT_CMDLINE 10
188
bellard7dea1da2003-11-16 15:59:30 +0000189/* XXX: use a two level table to limit memory usage */
190#define MAX_IOPORTS 65536
bellard0824d6f2003-06-24 13:42:40 +0000191
bellard80cabfa2004-03-14 12:20:30 +0000192const char *bios_dir = CONFIG_QEMU_SHAREDIR;
j_mayer1192dad2007-10-05 13:08:35 +0000193const char *bios_name = NULL;
blueswir1dbed7e42008-10-01 19:38:09 +0000194static void *ioport_opaque[MAX_IOPORTS];
195static IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
196static IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
thse4bcb142007-12-02 04:51:10 +0000197/* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available
bellardfaea38e2006-08-05 21:31:00 +0000198 to store the VM snapshots */
thse4bcb142007-12-02 04:51:10 +0000199DriveInfo drives_table[MAX_DRIVES+1];
200int nb_drives;
blueswir1dbed7e42008-10-01 19:38:09 +0000201static int vga_ram_size;
malccb5a7aa2008-09-28 00:42:12 +0000202enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
aliguori3023f332009-01-16 19:04:14 +0000203static DisplayState *display_state;
bellarda20dd502003-09-30 21:07:02 +0000204int nographic;
blueswir1dbed7e42008-10-01 19:38:09 +0000205static int curses;
aliguori7d957bd2009-01-15 22:14:11 +0000206static int sdl;
bellard3d11d0e2004-12-12 16:56:30 +0000207const char* keyboard_layout = NULL;
bellard313aa562003-08-10 21:52:11 +0000208int64_t ticks_per_sec;
aurel3200f82b82008-04-27 21:12:55 +0000209ram_addr_t ram_size;
bellardc4b1fcc2004-03-14 21:44:30 +0000210int nb_nics;
bellard7c9d8e02005-11-15 22:16:05 +0000211NICInfo nd_table[MAX_NICS];
bellard8a7ddc32004-03-31 19:00:16 +0000212int vm_running;
aliguoric0f4ce72009-03-05 23:01:01 +0000213static int autostart;
balrogf6503052008-02-17 11:42:19 +0000214static int rtc_utc = 1;
215static int rtc_date_offset = -1; /* -1 means no change */
bellard1bfe8562004-07-08 21:17:50 +0000216int cirrus_vga_enabled = 1;
aliguoric2b3b412009-01-15 20:37:28 +0000217int std_vga_enabled = 0;
thsd34cab92007-04-02 01:10:46 +0000218int vmsvga_enabled = 0;
aliguori94909d92009-04-22 15:19:53 +0000219int xenfb_enabled = 0;
bellardd8272202005-04-06 20:32:23 +0000220#ifdef TARGET_SPARC
221int graphic_width = 1024;
222int graphic_height = 768;
blueswir1eee0b832007-04-21 19:45:49 +0000223int graphic_depth = 8;
bellardd8272202005-04-06 20:32:23 +0000224#else
bellard1bfe8562004-07-08 21:17:50 +0000225int graphic_width = 800;
226int graphic_height = 600;
bellarde9b137c2004-06-21 16:46:10 +0000227int graphic_depth = 15;
blueswir1eee0b832007-04-21 19:45:49 +0000228#endif
blueswir1dbed7e42008-10-01 19:38:09 +0000229static int full_screen = 0;
blueswir1634a21f2008-11-16 11:34:07 +0000230#ifdef CONFIG_SDL
blueswir1dbed7e42008-10-01 19:38:09 +0000231static int no_frame = 0;
blueswir1634a21f2008-11-16 11:34:07 +0000232#endif
ths667acca2006-12-11 02:08:05 +0000233int no_quit = 0;
bellard8d11df92004-08-24 21:13:40 +0000234CharDriverState *serial_hds[MAX_SERIAL_PORTS];
bellard6508fe52005-01-15 12:02:56 +0000235CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
aliguori9ede2fd2009-01-15 20:05:25 +0000236CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES];
bellarda09db212005-04-30 16:10:35 +0000237#ifdef TARGET_I386
238int win2k_install_hack = 0;
aliguori73822ec2009-01-15 20:11:34 +0000239int rtc_td_hack = 0;
bellarda09db212005-04-30 16:10:35 +0000240#endif
bellardbb36d472005-11-05 14:22:28 +0000241int usb_enabled = 0;
aurel321b530a62009-04-05 20:08:59 +0000242int singlestep = 0;
bellard6a00d602005-11-21 23:25:50 +0000243int smp_cpus = 1;
ths73fc9742006-12-22 02:09:07 +0000244const char *vnc_display;
bellard6515b202006-05-03 22:02:44 +0000245int acpi_enabled = 1;
aliguori16b29ae2008-12-17 23:28:44 +0000246int no_hpet = 0;
bellard52ca8d62006-06-14 16:03:05 +0000247int fd_bootchk = 1;
bellardd1beab82006-10-02 19:44:22 +0000248int no_reboot = 0;
aurel32b2f76162008-04-11 21:35:52 +0000249int no_shutdown = 0;
balrog9467cd42007-05-01 01:34:14 +0000250int cursor_hide = 1;
balroga171fe32007-04-30 01:48:07 +0000251int graphic_rotate = 0;
blueswir1b9e82a52009-04-05 18:03:31 +0000252#ifndef _WIN32
ths71e3ceb2006-12-22 02:11:31 +0000253int daemonize = 0;
blueswir1b9e82a52009-04-05 18:03:31 +0000254#endif
ths9ae02552007-01-05 17:39:04 +0000255const char *option_rom[MAX_OPTION_ROMS];
256int nb_option_roms;
pbrook8e716212007-01-20 17:12:09 +0000257int semihosting_enabled = 0;
balrog2b8f2d42007-07-27 22:08:46 +0000258#ifdef TARGET_ARM
259int old_param = 0;
260#endif
thsc35734b2007-03-19 15:17:08 +0000261const char *qemu_name;
ths3780e192007-06-21 21:08:02 +0000262int alt_grab = 0;
blueswir195efd112008-12-24 20:26:14 +0000263#if defined(TARGET_SPARC) || defined(TARGET_PPC)
blueswir166508602007-05-01 14:16:52 +0000264unsigned int nb_prom_envs = 0;
265const char *prom_envs[MAX_PROM_ENVS];
266#endif
aliguoriec691c82009-02-11 15:20:37 +0000267int nb_drives_opt;
268struct drive_opt drives_opt[MAX_DRIVES];
bellard0824d6f2003-06-24 13:42:40 +0000269
aliguori268a3622009-04-21 22:30:27 +0000270int nb_numa_nodes;
271uint64_t node_mem[MAX_NODES];
272uint64_t node_cpumask[MAX_NODES];
273
balrogee5605e2007-12-03 03:01:40 +0000274static CPUState *cur_cpu;
275static CPUState *next_cpu;
balrog76ea08f2007-12-16 11:48:54 +0000276static int event_pending = 1;
thsbf20dc02008-06-30 17:22:19 +0000277/* Conversion factor from emulated instructions to virtual clock ticks. */
pbrook2e70f6e2008-06-29 01:03:05 +0000278static int icount_time_shift;
thsbf20dc02008-06-30 17:22:19 +0000279/* Arbitrarily pick 1MIPS as the minimum allowable speed. */
pbrook2e70f6e2008-06-29 01:03:05 +0000280#define MAX_ICOUNT_SHIFT 10
281/* Compensate for varying guest execution speed. */
282static int64_t qemu_icount_bias;
blueswir1dbed7e42008-10-01 19:38:09 +0000283static QEMUTimer *icount_rt_timer;
284static QEMUTimer *icount_vm_timer;
blueswir19043b622009-01-21 19:28:13 +0000285static QEMUTimer *nographic_timer;
balrogee5605e2007-12-03 03:01:40 +0000286
blueswir18fcb1b92008-09-18 18:29:08 +0000287uint8_t qemu_uuid[16];
288
bellard0824d6f2003-06-24 13:42:40 +0000289/***********************************************************/
bellard26aa7d72004-04-28 22:26:05 +0000290/* x86 ISA bus support */
291
292target_phys_addr_t isa_mem_base = 0;
bellard3de388f2005-07-02 18:11:44 +0000293PicState2 *isa_pic;
bellard0824d6f2003-06-24 13:42:40 +0000294
aliguori477e3ed2008-07-23 15:19:59 +0000295static IOPortReadFunc default_ioport_readb, default_ioport_readw, default_ioport_readl;
296static IOPortWriteFunc default_ioport_writeb, default_ioport_writew, default_ioport_writel;
297
298static uint32_t ioport_read(int index, uint32_t address)
299{
300 static IOPortReadFunc *default_func[3] = {
301 default_ioport_readb,
302 default_ioport_readw,
303 default_ioport_readl
304 };
305 IOPortReadFunc *func = ioport_read_table[index][address];
306 if (!func)
307 func = default_func[index];
308 return func(ioport_opaque[address], address);
309}
310
311static void ioport_write(int index, uint32_t address, uint32_t data)
312{
313 static IOPortWriteFunc *default_func[3] = {
314 default_ioport_writeb,
315 default_ioport_writew,
316 default_ioport_writel
317 };
318 IOPortWriteFunc *func = ioport_write_table[index][address];
319 if (!func)
320 func = default_func[index];
321 func(ioport_opaque[address], address, data);
322}
323
pbrook9596ebb2007-11-18 01:44:38 +0000324static uint32_t default_ioport_readb(void *opaque, uint32_t address)
bellard0824d6f2003-06-24 13:42:40 +0000325{
326#ifdef DEBUG_UNUSED_IOPORT
ths1196be32007-03-17 15:17:58 +0000327 fprintf(stderr, "unused inb: port=0x%04x\n", address);
bellard0824d6f2003-06-24 13:42:40 +0000328#endif
bellardfc01f7e2003-06-30 10:03:06 +0000329 return 0xff;
bellard0824d6f2003-06-24 13:42:40 +0000330}
331
pbrook9596ebb2007-11-18 01:44:38 +0000332static void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
bellard0824d6f2003-06-24 13:42:40 +0000333{
334#ifdef DEBUG_UNUSED_IOPORT
ths1196be32007-03-17 15:17:58 +0000335 fprintf(stderr, "unused outb: port=0x%04x data=0x%02x\n", address, data);
bellard0824d6f2003-06-24 13:42:40 +0000336#endif
337}
338
339/* default is to make two byte accesses */
pbrook9596ebb2007-11-18 01:44:38 +0000340static uint32_t default_ioport_readw(void *opaque, uint32_t address)
bellard0824d6f2003-06-24 13:42:40 +0000341{
342 uint32_t data;
aliguori477e3ed2008-07-23 15:19:59 +0000343 data = ioport_read(0, address);
bellarddb45c292004-05-12 19:50:26 +0000344 address = (address + 1) & (MAX_IOPORTS - 1);
aliguori477e3ed2008-07-23 15:19:59 +0000345 data |= ioport_read(0, address) << 8;
bellard0824d6f2003-06-24 13:42:40 +0000346 return data;
347}
348
pbrook9596ebb2007-11-18 01:44:38 +0000349static void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
bellard0824d6f2003-06-24 13:42:40 +0000350{
aliguori477e3ed2008-07-23 15:19:59 +0000351 ioport_write(0, address, data & 0xff);
bellarddb45c292004-05-12 19:50:26 +0000352 address = (address + 1) & (MAX_IOPORTS - 1);
aliguori477e3ed2008-07-23 15:19:59 +0000353 ioport_write(0, address, (data >> 8) & 0xff);
bellardfc01f7e2003-06-30 10:03:06 +0000354}
355
pbrook9596ebb2007-11-18 01:44:38 +0000356static uint32_t default_ioport_readl(void *opaque, uint32_t address)
bellardfc01f7e2003-06-30 10:03:06 +0000357{
358#ifdef DEBUG_UNUSED_IOPORT
ths1196be32007-03-17 15:17:58 +0000359 fprintf(stderr, "unused inl: port=0x%04x\n", address);
bellardfc01f7e2003-06-30 10:03:06 +0000360#endif
361 return 0xffffffff;
362}
363
pbrook9596ebb2007-11-18 01:44:38 +0000364static void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
bellardfc01f7e2003-06-30 10:03:06 +0000365{
366#ifdef DEBUG_UNUSED_IOPORT
ths1196be32007-03-17 15:17:58 +0000367 fprintf(stderr, "unused outl: port=0x%04x data=0x%02x\n", address, data);
bellardfc01f7e2003-06-30 10:03:06 +0000368#endif
bellard0824d6f2003-06-24 13:42:40 +0000369}
370
bellardfc01f7e2003-06-30 10:03:06 +0000371/* size is the word size in byte */
ths5fafdf22007-09-16 21:08:06 +0000372int register_ioport_read(int start, int length, int size,
bellardc4b1fcc2004-03-14 21:44:30 +0000373 IOPortReadFunc *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_read: 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_read_table[bsize][i] = func;
bellardc4b1fcc2004-03-14 21:44:30 +0000389 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
balrog88fdf562008-04-26 21:11:22 +0000390 hw_error("register_ioport_read: invalid opaque");
bellardc4b1fcc2004-03-14 21:44:30 +0000391 ioport_opaque[i] = opaque;
392 }
bellard0824d6f2003-06-24 13:42:40 +0000393 return 0;
394}
395
bellardfc01f7e2003-06-30 10:03:06 +0000396/* size is the word size in byte */
ths5fafdf22007-09-16 21:08:06 +0000397int register_ioport_write(int start, int length, int size,
bellardc4b1fcc2004-03-14 21:44:30 +0000398 IOPortWriteFunc *func, void *opaque)
bellard0824d6f2003-06-24 13:42:40 +0000399{
bellardfc01f7e2003-06-30 10:03:06 +0000400 int i, bsize;
bellard0824d6f2003-06-24 13:42:40 +0000401
bellardc4b1fcc2004-03-14 21:44:30 +0000402 if (size == 1) {
bellardfc01f7e2003-06-30 10:03:06 +0000403 bsize = 0;
bellardc4b1fcc2004-03-14 21:44:30 +0000404 } else if (size == 2) {
bellardfc01f7e2003-06-30 10:03:06 +0000405 bsize = 1;
bellardc4b1fcc2004-03-14 21:44:30 +0000406 } else if (size == 4) {
bellardfc01f7e2003-06-30 10:03:06 +0000407 bsize = 2;
bellardc4b1fcc2004-03-14 21:44:30 +0000408 } else {
balrog88fdf562008-04-26 21:11:22 +0000409 hw_error("register_ioport_write: invalid size");
bellardfc01f7e2003-06-30 10:03:06 +0000410 return -1;
bellardc4b1fcc2004-03-14 21:44:30 +0000411 }
412 for(i = start; i < start + length; i += size) {
bellardfc01f7e2003-06-30 10:03:06 +0000413 ioport_write_table[bsize][i] = func;
balrog88fdf562008-04-26 21:11:22 +0000414 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
415 hw_error("register_ioport_write: invalid opaque");
bellardc4b1fcc2004-03-14 21:44:30 +0000416 ioport_opaque[i] = opaque;
417 }
bellardf1510b22003-06-25 00:07:40 +0000418 return 0;
419}
420
bellard69b91032004-05-18 23:05:28 +0000421void isa_unassign_ioport(int start, int length)
422{
423 int i;
424
425 for(i = start; i < start + length; i++) {
426 ioport_read_table[0][i] = default_ioport_readb;
427 ioport_read_table[1][i] = default_ioport_readw;
428 ioport_read_table[2][i] = default_ioport_readl;
429
430 ioport_write_table[0][i] = default_ioport_writeb;
431 ioport_write_table[1][i] = default_ioport_writew;
432 ioport_write_table[2][i] = default_ioport_writel;
aliguoria7607f72009-02-11 15:21:29 +0000433
434 ioport_opaque[i] = NULL;
bellard69b91032004-05-18 23:05:28 +0000435 }
436}
437
bellard20f32282005-01-03 23:36:21 +0000438/***********************************************************/
439
bellardc45886d2004-01-05 00:02:06 +0000440void cpu_outb(CPUState *env, int addr, int val)
bellard0824d6f2003-06-24 13:42:40 +0000441{
aliguorid12d51d2009-01-15 21:48:06 +0000442 LOG_IOPORT("outb: %04x %02x\n", addr, val);
aliguori477e3ed2008-07-23 15:19:59 +0000443 ioport_write(0, addr, val);
blueswir1640f42e2009-04-19 10:18:01 +0000444#ifdef CONFIG_KQEMU
bellard89bfc102006-02-08 22:46:31 +0000445 if (env)
446 env->last_io_time = cpu_get_time_fast();
447#endif
bellard0824d6f2003-06-24 13:42:40 +0000448}
449
bellardc45886d2004-01-05 00:02:06 +0000450void cpu_outw(CPUState *env, int addr, int val)
bellard0824d6f2003-06-24 13:42:40 +0000451{
aliguorid12d51d2009-01-15 21:48:06 +0000452 LOG_IOPORT("outw: %04x %04x\n", addr, val);
aliguori477e3ed2008-07-23 15:19:59 +0000453 ioport_write(1, addr, val);
blueswir1640f42e2009-04-19 10:18:01 +0000454#ifdef CONFIG_KQEMU
bellard89bfc102006-02-08 22:46:31 +0000455 if (env)
456 env->last_io_time = cpu_get_time_fast();
457#endif
bellard0824d6f2003-06-24 13:42:40 +0000458}
459
bellardc45886d2004-01-05 00:02:06 +0000460void cpu_outl(CPUState *env, int addr, int val)
bellard0824d6f2003-06-24 13:42:40 +0000461{
aliguorid12d51d2009-01-15 21:48:06 +0000462 LOG_IOPORT("outl: %04x %08x\n", addr, val);
aliguori477e3ed2008-07-23 15:19:59 +0000463 ioport_write(2, addr, val);
blueswir1640f42e2009-04-19 10:18:01 +0000464#ifdef CONFIG_KQEMU
bellard89bfc102006-02-08 22:46:31 +0000465 if (env)
466 env->last_io_time = cpu_get_time_fast();
467#endif
bellard0824d6f2003-06-24 13:42:40 +0000468}
469
bellardc45886d2004-01-05 00:02:06 +0000470int cpu_inb(CPUState *env, int addr)
bellard0824d6f2003-06-24 13:42:40 +0000471{
bellardfd872592004-05-12 19:11:15 +0000472 int val;
aliguori477e3ed2008-07-23 15:19:59 +0000473 val = ioport_read(0, addr);
aliguorid12d51d2009-01-15 21:48:06 +0000474 LOG_IOPORT("inb : %04x %02x\n", addr, val);
blueswir1640f42e2009-04-19 10:18:01 +0000475#ifdef CONFIG_KQEMU
bellard89bfc102006-02-08 22:46:31 +0000476 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_inw(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(1, addr);
aliguorid12d51d2009-01-15 21:48:06 +0000486 LOG_IOPORT("inw : %04x %04x\n", addr, val);
blueswir1640f42e2009-04-19 10:18:01 +0000487#ifdef CONFIG_KQEMU
bellard89bfc102006-02-08 22:46:31 +0000488 if (env)
489 env->last_io_time = cpu_get_time_fast();
490#endif
bellardfd872592004-05-12 19:11:15 +0000491 return val;
bellard0824d6f2003-06-24 13:42:40 +0000492}
493
bellardc45886d2004-01-05 00:02:06 +0000494int cpu_inl(CPUState *env, int addr)
bellard0824d6f2003-06-24 13:42:40 +0000495{
bellardfd872592004-05-12 19:11:15 +0000496 int val;
aliguori477e3ed2008-07-23 15:19:59 +0000497 val = ioport_read(2, addr);
aliguorid12d51d2009-01-15 21:48:06 +0000498 LOG_IOPORT("inl : %04x %08x\n", addr, val);
blueswir1640f42e2009-04-19 10:18:01 +0000499#ifdef CONFIG_KQEMU
bellard89bfc102006-02-08 22:46:31 +0000500 if (env)
501 env->last_io_time = cpu_get_time_fast();
502#endif
bellardfd872592004-05-12 19:11:15 +0000503 return val;
bellard0824d6f2003-06-24 13:42:40 +0000504}
505
506/***********************************************************/
bellard0824d6f2003-06-24 13:42:40 +0000507void hw_error(const char *fmt, ...)
508{
509 va_list ap;
bellard6a00d602005-11-21 23:25:50 +0000510 CPUState *env;
bellard0824d6f2003-06-24 13:42:40 +0000511
512 va_start(ap, fmt);
513 fprintf(stderr, "qemu: hardware error: ");
514 vfprintf(stderr, fmt, ap);
515 fprintf(stderr, "\n");
bellard6a00d602005-11-21 23:25:50 +0000516 for(env = first_cpu; env != NULL; env = env->next_cpu) {
517 fprintf(stderr, "CPU #%d:\n", env->cpu_index);
bellard0824d6f2003-06-24 13:42:40 +0000518#ifdef TARGET_I386
bellard6a00d602005-11-21 23:25:50 +0000519 cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
bellardc45886d2004-01-05 00:02:06 +0000520#else
bellard6a00d602005-11-21 23:25:50 +0000521 cpu_dump_state(env, stderr, fprintf, 0);
bellard0824d6f2003-06-24 13:42:40 +0000522#endif
bellard6a00d602005-11-21 23:25:50 +0000523 }
bellard0824d6f2003-06-24 13:42:40 +0000524 va_end(ap);
525 abort();
526}
aliguoridf751fa2008-12-04 20:19:35 +0000527
528/***************/
529/* ballooning */
530
531static QEMUBalloonEvent *qemu_balloon_event;
532void *qemu_balloon_event_opaque;
533
534void qemu_add_balloon_handler(QEMUBalloonEvent *func, void *opaque)
535{
536 qemu_balloon_event = func;
537 qemu_balloon_event_opaque = opaque;
538}
539
540void qemu_balloon(ram_addr_t target)
541{
542 if (qemu_balloon_event)
543 qemu_balloon_event(qemu_balloon_event_opaque, target);
544}
545
546ram_addr_t qemu_balloon_status(void)
547{
548 if (qemu_balloon_event)
549 return qemu_balloon_event(qemu_balloon_event_opaque, 0);
550 return 0;
551}
bellard0824d6f2003-06-24 13:42:40 +0000552
bellard8a7ddc32004-03-31 19:00:16 +0000553/***********************************************************/
bellard63066f42004-06-03 18:45:02 +0000554/* keyboard/mouse */
555
556static QEMUPutKBDEvent *qemu_put_kbd_event;
557static void *qemu_put_kbd_event_opaque;
ths455204e2007-01-05 16:42:13 +0000558static QEMUPutMouseEntry *qemu_put_mouse_event_head;
559static QEMUPutMouseEntry *qemu_put_mouse_event_current;
bellard63066f42004-06-03 18:45:02 +0000560
561void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
562{
563 qemu_put_kbd_event_opaque = opaque;
564 qemu_put_kbd_event = func;
565}
566
ths455204e2007-01-05 16:42:13 +0000567QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
568 void *opaque, int absolute,
569 const char *name)
bellard63066f42004-06-03 18:45:02 +0000570{
ths455204e2007-01-05 16:42:13 +0000571 QEMUPutMouseEntry *s, *cursor;
572
573 s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
ths455204e2007-01-05 16:42:13 +0000574
575 s->qemu_put_mouse_event = func;
576 s->qemu_put_mouse_event_opaque = opaque;
577 s->qemu_put_mouse_event_absolute = absolute;
578 s->qemu_put_mouse_event_name = qemu_strdup(name);
579 s->next = NULL;
580
581 if (!qemu_put_mouse_event_head) {
582 qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
583 return s;
584 }
585
586 cursor = qemu_put_mouse_event_head;
587 while (cursor->next != NULL)
588 cursor = cursor->next;
589
590 cursor->next = s;
591 qemu_put_mouse_event_current = s;
592
593 return s;
594}
595
596void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
597{
598 QEMUPutMouseEntry *prev = NULL, *cursor;
599
600 if (!qemu_put_mouse_event_head || entry == NULL)
601 return;
602
603 cursor = qemu_put_mouse_event_head;
604 while (cursor != NULL && cursor != entry) {
605 prev = cursor;
606 cursor = cursor->next;
607 }
608
609 if (cursor == NULL) // does not exist or list empty
610 return;
611 else if (prev == NULL) { // entry is head
612 qemu_put_mouse_event_head = cursor->next;
613 if (qemu_put_mouse_event_current == entry)
614 qemu_put_mouse_event_current = cursor->next;
615 qemu_free(entry->qemu_put_mouse_event_name);
616 qemu_free(entry);
617 return;
618 }
619
620 prev->next = entry->next;
621
622 if (qemu_put_mouse_event_current == entry)
623 qemu_put_mouse_event_current = prev;
624
625 qemu_free(entry->qemu_put_mouse_event_name);
626 qemu_free(entry);
bellard63066f42004-06-03 18:45:02 +0000627}
628
629void kbd_put_keycode(int keycode)
630{
631 if (qemu_put_kbd_event) {
632 qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
633 }
634}
635
636void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
637{
ths455204e2007-01-05 16:42:13 +0000638 QEMUPutMouseEvent *mouse_event;
639 void *mouse_event_opaque;
balroga171fe32007-04-30 01:48:07 +0000640 int width;
ths455204e2007-01-05 16:42:13 +0000641
642 if (!qemu_put_mouse_event_current) {
643 return;
644 }
645
646 mouse_event =
647 qemu_put_mouse_event_current->qemu_put_mouse_event;
648 mouse_event_opaque =
649 qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;
650
651 if (mouse_event) {
balroga171fe32007-04-30 01:48:07 +0000652 if (graphic_rotate) {
653 if (qemu_put_mouse_event_current->qemu_put_mouse_event_absolute)
654 width = 0x7fff;
655 else
aurel32b94ed572008-03-10 19:34:27 +0000656 width = graphic_width - 1;
balroga171fe32007-04-30 01:48:07 +0000657 mouse_event(mouse_event_opaque,
658 width - dy, dx, dz, buttons_state);
659 } else
660 mouse_event(mouse_event_opaque,
661 dx, dy, dz, buttons_state);
bellard63066f42004-06-03 18:45:02 +0000662 }
663}
664
bellard09b26c52006-04-12 21:09:08 +0000665int kbd_mouse_is_absolute(void)
666{
ths455204e2007-01-05 16:42:13 +0000667 if (!qemu_put_mouse_event_current)
668 return 0;
669
670 return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
671}
672
aliguori376253e2009-03-05 23:01:23 +0000673void do_info_mice(Monitor *mon)
ths455204e2007-01-05 16:42:13 +0000674{
675 QEMUPutMouseEntry *cursor;
676 int index = 0;
677
678 if (!qemu_put_mouse_event_head) {
aliguori376253e2009-03-05 23:01:23 +0000679 monitor_printf(mon, "No mouse devices connected\n");
ths455204e2007-01-05 16:42:13 +0000680 return;
681 }
682
aliguori376253e2009-03-05 23:01:23 +0000683 monitor_printf(mon, "Mouse devices available:\n");
ths455204e2007-01-05 16:42:13 +0000684 cursor = qemu_put_mouse_event_head;
685 while (cursor != NULL) {
aliguori376253e2009-03-05 23:01:23 +0000686 monitor_printf(mon, "%c Mouse #%d: %s\n",
687 (cursor == qemu_put_mouse_event_current ? '*' : ' '),
688 index, cursor->qemu_put_mouse_event_name);
ths455204e2007-01-05 16:42:13 +0000689 index++;
690 cursor = cursor->next;
691 }
692}
693
aliguori376253e2009-03-05 23:01:23 +0000694void do_mouse_set(Monitor *mon, int index)
ths455204e2007-01-05 16:42:13 +0000695{
696 QEMUPutMouseEntry *cursor;
697 int i = 0;
698
699 if (!qemu_put_mouse_event_head) {
aliguori376253e2009-03-05 23:01:23 +0000700 monitor_printf(mon, "No mouse devices connected\n");
ths455204e2007-01-05 16:42:13 +0000701 return;
702 }
703
704 cursor = qemu_put_mouse_event_head;
705 while (cursor != NULL && index != i) {
706 i++;
707 cursor = cursor->next;
708 }
709
710 if (cursor != NULL)
711 qemu_put_mouse_event_current = cursor;
712 else
aliguori376253e2009-03-05 23:01:23 +0000713 monitor_printf(mon, "Mouse at given index not found\n");
bellard09b26c52006-04-12 21:09:08 +0000714}
715
bellard87858c82003-06-27 12:01:39 +0000716/* compute with 96 bit intermediate result: (a*b)/c */
bellard80cabfa2004-03-14 12:20:30 +0000717uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
bellard87858c82003-06-27 12:01:39 +0000718{
719 union {
720 uint64_t ll;
721 struct {
722#ifdef WORDS_BIGENDIAN
723 uint32_t high, low;
724#else
725 uint32_t low, high;
ths3b46e622007-09-17 08:09:54 +0000726#endif
bellard87858c82003-06-27 12:01:39 +0000727 } l;
728 } u, res;
729 uint64_t rl, rh;
730
731 u.ll = a;
732 rl = (uint64_t)u.l.low * (uint64_t)b;
733 rh = (uint64_t)u.l.high * (uint64_t)b;
734 rh += (rl >> 32);
735 res.l.high = rh / c;
736 res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
737 return res.ll;
738}
739
bellard1dce7c32006-07-13 23:20:22 +0000740/***********************************************************/
741/* real time host monotonic timer */
742
743#define QEMU_TIMER_BASE 1000000000LL
744
745#ifdef WIN32
746
747static int64_t clock_freq;
748
749static void init_get_clock(void)
750{
bellarda8e5ac32006-07-14 09:36:13 +0000751 LARGE_INTEGER freq;
752 int ret;
bellard1dce7c32006-07-13 23:20:22 +0000753 ret = QueryPerformanceFrequency(&freq);
754 if (ret == 0) {
755 fprintf(stderr, "Could not calibrate ticks\n");
756 exit(1);
757 }
758 clock_freq = freq.QuadPart;
759}
760
761static int64_t get_clock(void)
762{
763 LARGE_INTEGER ti;
764 QueryPerformanceCounter(&ti);
765 return muldiv64(ti.QuadPart, QEMU_TIMER_BASE, clock_freq);
766}
767
768#else
769
770static int use_rt_clock;
771
772static void init_get_clock(void)
773{
774 use_rt_clock = 0;
blueswir1c5e97232009-03-07 20:06:23 +0000775#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
776 || defined(__DragonFly__)
bellard1dce7c32006-07-13 23:20:22 +0000777 {
778 struct timespec ts;
779 if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
780 use_rt_clock = 1;
781 }
782 }
783#endif
784}
785
786static int64_t get_clock(void)
787{
blueswir1c5e97232009-03-07 20:06:23 +0000788#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
789 || defined(__DragonFly__)
bellard1dce7c32006-07-13 23:20:22 +0000790 if (use_rt_clock) {
791 struct timespec ts;
792 clock_gettime(CLOCK_MONOTONIC, &ts);
793 return ts.tv_sec * 1000000000LL + ts.tv_nsec;
ths5fafdf22007-09-16 21:08:06 +0000794 } else
bellard1dce7c32006-07-13 23:20:22 +0000795#endif
796 {
797 /* XXX: using gettimeofday leads to problems if the date
798 changes, so it should be avoided. */
799 struct timeval tv;
800 gettimeofday(&tv, NULL);
801 return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
802 }
803}
bellard1dce7c32006-07-13 23:20:22 +0000804#endif
805
pbrook2e70f6e2008-06-29 01:03:05 +0000806/* Return the virtual CPU time, based on the instruction counter. */
807static int64_t cpu_get_icount(void)
808{
809 int64_t icount;
810 CPUState *env = cpu_single_env;;
811 icount = qemu_icount;
812 if (env) {
813 if (!can_do_io(env))
814 fprintf(stderr, "Bad clock read\n");
815 icount -= (env->icount_decr.u16.low + env->icount_extra);
816 }
817 return qemu_icount_bias + (icount << icount_time_shift);
818}
819
bellard1dce7c32006-07-13 23:20:22 +0000820/***********************************************************/
821/* guest cycle counter */
822
823static int64_t cpu_ticks_prev;
824static int64_t cpu_ticks_offset;
825static int64_t cpu_clock_offset;
826static int cpu_ticks_enabled;
827
828/* return the host CPU cycle counter and handle stop/restart */
829int64_t cpu_get_ticks(void)
830{
pbrook2e70f6e2008-06-29 01:03:05 +0000831 if (use_icount) {
832 return cpu_get_icount();
833 }
bellard1dce7c32006-07-13 23:20:22 +0000834 if (!cpu_ticks_enabled) {
835 return cpu_ticks_offset;
836 } else {
837 int64_t ticks;
838 ticks = cpu_get_real_ticks();
839 if (cpu_ticks_prev > ticks) {
840 /* Note: non increasing ticks may happen if the host uses
841 software suspend */
842 cpu_ticks_offset += cpu_ticks_prev - ticks;
843 }
844 cpu_ticks_prev = ticks;
845 return ticks + cpu_ticks_offset;
846 }
847}
848
849/* return the host CPU monotonic timer and handle stop/restart */
850static int64_t cpu_get_clock(void)
851{
852 int64_t ti;
853 if (!cpu_ticks_enabled) {
854 return cpu_clock_offset;
855 } else {
856 ti = get_clock();
857 return ti + cpu_clock_offset;
858 }
859}
860
861/* enable cpu_get_ticks() */
862void cpu_enable_ticks(void)
863{
864 if (!cpu_ticks_enabled) {
865 cpu_ticks_offset -= cpu_get_real_ticks();
866 cpu_clock_offset -= get_clock();
867 cpu_ticks_enabled = 1;
868 }
869}
870
871/* disable cpu_get_ticks() : the clock is stopped. You must not call
872 cpu_get_ticks() after that. */
873void cpu_disable_ticks(void)
874{
875 if (cpu_ticks_enabled) {
876 cpu_ticks_offset = cpu_get_ticks();
877 cpu_clock_offset = cpu_get_clock();
878 cpu_ticks_enabled = 0;
879 }
880}
881
882/***********************************************************/
883/* timers */
ths5fafdf22007-09-16 21:08:06 +0000884
bellard8a7ddc32004-03-31 19:00:16 +0000885#define QEMU_TIMER_REALTIME 0
886#define QEMU_TIMER_VIRTUAL 1
887
888struct QEMUClock {
889 int type;
890 /* XXX: add frequency */
891};
892
893struct QEMUTimer {
894 QEMUClock *clock;
895 int64_t expire_time;
896 QEMUTimerCB *cb;
897 void *opaque;
898 struct QEMUTimer *next;
899};
900
thsc8994012007-08-19 21:56:03 +0000901struct qemu_alarm_timer {
902 char const *name;
thsefe75412007-08-24 01:36:32 +0000903 unsigned int flags;
thsc8994012007-08-19 21:56:03 +0000904
905 int (*start)(struct qemu_alarm_timer *t);
906 void (*stop)(struct qemu_alarm_timer *t);
thsefe75412007-08-24 01:36:32 +0000907 void (*rearm)(struct qemu_alarm_timer *t);
thsc8994012007-08-19 21:56:03 +0000908 void *priv;
909};
910
thsefe75412007-08-24 01:36:32 +0000911#define ALARM_FLAG_DYNTICKS 0x1
balrogd5d08332008-01-05 19:41:47 +0000912#define ALARM_FLAG_EXPIRED 0x2
thsefe75412007-08-24 01:36:32 +0000913
914static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
915{
916 return t->flags & ALARM_FLAG_DYNTICKS;
917}
918
919static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
920{
921 if (!alarm_has_dynticks(t))
922 return;
923
924 t->rearm(t);
925}
926
927/* TODO: MIN_TIMER_REARM_US should be optimized */
928#define MIN_TIMER_REARM_US 250
929
thsc8994012007-08-19 21:56:03 +0000930static struct qemu_alarm_timer *alarm_timer;
aliguorif49e58d2008-11-05 21:22:34 +0000931#ifndef _WIN32
aliguoric96f1a42008-11-05 20:29:45 +0000932static int alarm_timer_rfd, alarm_timer_wfd;
aliguorif49e58d2008-11-05 21:22:34 +0000933#endif
thsc8994012007-08-19 21:56:03 +0000934
935#ifdef _WIN32
936
937struct qemu_alarm_win32 {
938 MMRESULT timerId;
939 HANDLE host_alarm;
940 unsigned int period;
941} alarm_win32_data = {0, NULL, -1};
942
943static int win32_start_timer(struct qemu_alarm_timer *t);
944static void win32_stop_timer(struct qemu_alarm_timer *t);
thsefe75412007-08-24 01:36:32 +0000945static void win32_rearm_timer(struct qemu_alarm_timer *t);
thsc8994012007-08-19 21:56:03 +0000946
947#else
948
949static int unix_start_timer(struct qemu_alarm_timer *t);
950static void unix_stop_timer(struct qemu_alarm_timer *t);
951
ths231c6582007-08-26 17:29:15 +0000952#ifdef __linux__
953
thsefe75412007-08-24 01:36:32 +0000954static int dynticks_start_timer(struct qemu_alarm_timer *t);
955static void dynticks_stop_timer(struct qemu_alarm_timer *t);
956static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
957
thsc40ec5a2007-08-19 22:09:40 +0000958static int hpet_start_timer(struct qemu_alarm_timer *t);
959static void hpet_stop_timer(struct qemu_alarm_timer *t);
960
thsc8994012007-08-19 21:56:03 +0000961static int rtc_start_timer(struct qemu_alarm_timer *t);
962static void rtc_stop_timer(struct qemu_alarm_timer *t);
963
thsefe75412007-08-24 01:36:32 +0000964#endif /* __linux__ */
thsc8994012007-08-19 21:56:03 +0000965
966#endif /* _WIN32 */
967
pbrook2e70f6e2008-06-29 01:03:05 +0000968/* Correlation between real and virtual time is always going to be
thsbf20dc02008-06-30 17:22:19 +0000969 fairly approximate, so ignore small variation.
pbrook2e70f6e2008-06-29 01:03:05 +0000970 When the guest is idle real and virtual time will be aligned in
971 the IO wait loop. */
972#define ICOUNT_WOBBLE (QEMU_TIMER_BASE / 10)
973
974static void icount_adjust(void)
975{
976 int64_t cur_time;
977 int64_t cur_icount;
978 int64_t delta;
979 static int64_t last_delta;
980 /* If the VM is not running, then do nothing. */
981 if (!vm_running)
982 return;
983
984 cur_time = cpu_get_clock();
985 cur_icount = qemu_get_clock(vm_clock);
986 delta = cur_icount - cur_time;
987 /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
988 if (delta > 0
989 && last_delta + ICOUNT_WOBBLE < delta * 2
990 && icount_time_shift > 0) {
991 /* The guest is getting too far ahead. Slow time down. */
992 icount_time_shift--;
993 }
994 if (delta < 0
995 && last_delta - ICOUNT_WOBBLE > delta * 2
996 && icount_time_shift < MAX_ICOUNT_SHIFT) {
997 /* The guest is getting too far behind. Speed time up. */
998 icount_time_shift++;
999 }
1000 last_delta = delta;
1001 qemu_icount_bias = cur_icount - (qemu_icount << icount_time_shift);
1002}
1003
1004static void icount_adjust_rt(void * opaque)
1005{
1006 qemu_mod_timer(icount_rt_timer,
1007 qemu_get_clock(rt_clock) + 1000);
1008 icount_adjust();
1009}
1010
1011static void icount_adjust_vm(void * opaque)
1012{
1013 qemu_mod_timer(icount_vm_timer,
1014 qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
1015 icount_adjust();
1016}
1017
1018static void init_icount_adjust(void)
1019{
1020 /* Have both realtime and virtual time triggers for speed adjustment.
1021 The realtime trigger catches emulated time passing too slowly,
1022 the virtual time trigger catches emulated time passing too fast.
1023 Realtime triggers occur even when idle, so use them less frequently
1024 than VM triggers. */
1025 icount_rt_timer = qemu_new_timer(rt_clock, icount_adjust_rt, NULL);
1026 qemu_mod_timer(icount_rt_timer,
1027 qemu_get_clock(rt_clock) + 1000);
1028 icount_vm_timer = qemu_new_timer(vm_clock, icount_adjust_vm, NULL);
1029 qemu_mod_timer(icount_vm_timer,
1030 qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
1031}
1032
thsc8994012007-08-19 21:56:03 +00001033static struct qemu_alarm_timer alarm_timers[] = {
thsefe75412007-08-24 01:36:32 +00001034#ifndef _WIN32
ths231c6582007-08-26 17:29:15 +00001035#ifdef __linux__
thsefe75412007-08-24 01:36:32 +00001036 {"dynticks", ALARM_FLAG_DYNTICKS, dynticks_start_timer,
1037 dynticks_stop_timer, dynticks_rearm_timer, NULL},
thsc40ec5a2007-08-19 22:09:40 +00001038 /* HPET - if available - is preferred */
thsefe75412007-08-24 01:36:32 +00001039 {"hpet", 0, hpet_start_timer, hpet_stop_timer, NULL, NULL},
thsc40ec5a2007-08-19 22:09:40 +00001040 /* ...otherwise try RTC */
thsefe75412007-08-24 01:36:32 +00001041 {"rtc", 0, rtc_start_timer, rtc_stop_timer, NULL, NULL},
thsc8994012007-08-19 21:56:03 +00001042#endif
thsefe75412007-08-24 01:36:32 +00001043 {"unix", 0, unix_start_timer, unix_stop_timer, NULL, NULL},
thsc8994012007-08-19 21:56:03 +00001044#else
thsefe75412007-08-24 01:36:32 +00001045 {"dynticks", ALARM_FLAG_DYNTICKS, win32_start_timer,
1046 win32_stop_timer, win32_rearm_timer, &alarm_win32_data},
1047 {"win32", 0, win32_start_timer,
1048 win32_stop_timer, NULL, &alarm_win32_data},
thsc8994012007-08-19 21:56:03 +00001049#endif
1050 {NULL, }
1051};
1052
blueswir13f47aa82008-03-09 06:59:01 +00001053static void show_available_alarms(void)
thsf3dcfad2007-08-24 01:26:02 +00001054{
1055 int i;
1056
1057 printf("Available alarm timers, in order of precedence:\n");
1058 for (i = 0; alarm_timers[i].name; i++)
1059 printf("%s\n", alarm_timers[i].name);
1060}
1061
1062static void configure_alarms(char const *opt)
1063{
1064 int i;
1065 int cur = 0;
malcb1503cd2008-12-22 20:33:55 +00001066 int count = ARRAY_SIZE(alarm_timers) - 1;
thsf3dcfad2007-08-24 01:26:02 +00001067 char *arg;
1068 char *name;
pbrook2e70f6e2008-06-29 01:03:05 +00001069 struct qemu_alarm_timer tmp;
thsf3dcfad2007-08-24 01:26:02 +00001070
aurel323adda042008-03-09 23:43:49 +00001071 if (!strcmp(opt, "?")) {
thsf3dcfad2007-08-24 01:26:02 +00001072 show_available_alarms();
1073 exit(0);
1074 }
1075
1076 arg = strdup(opt);
1077
1078 /* Reorder the array */
1079 name = strtok(arg, ",");
1080 while (name) {
balroge2b577e2007-09-17 21:25:20 +00001081 for (i = 0; i < count && alarm_timers[i].name; i++) {
thsf3dcfad2007-08-24 01:26:02 +00001082 if (!strcmp(alarm_timers[i].name, name))
1083 break;
1084 }
1085
1086 if (i == count) {
1087 fprintf(stderr, "Unknown clock %s\n", name);
1088 goto next;
1089 }
1090
1091 if (i < cur)
1092 /* Ignore */
1093 goto next;
1094
1095 /* Swap */
1096 tmp = alarm_timers[i];
1097 alarm_timers[i] = alarm_timers[cur];
1098 alarm_timers[cur] = tmp;
1099
1100 cur++;
1101next:
1102 name = strtok(NULL, ",");
1103 }
1104
1105 free(arg);
1106
1107 if (cur) {
pbrook2e70f6e2008-06-29 01:03:05 +00001108 /* Disable remaining timers */
thsf3dcfad2007-08-24 01:26:02 +00001109 for (i = cur; i < count; i++)
1110 alarm_timers[i].name = NULL;
aurel323adda042008-03-09 23:43:49 +00001111 } else {
1112 show_available_alarms();
1113 exit(1);
thsf3dcfad2007-08-24 01:26:02 +00001114 }
thsf3dcfad2007-08-24 01:26:02 +00001115}
1116
bellard8a7ddc32004-03-31 19:00:16 +00001117QEMUClock *rt_clock;
1118QEMUClock *vm_clock;
1119
1120static QEMUTimer *active_timers[2];
bellard8a7ddc32004-03-31 19:00:16 +00001121
pbrook9596ebb2007-11-18 01:44:38 +00001122static QEMUClock *qemu_new_clock(int type)
bellard8a7ddc32004-03-31 19:00:16 +00001123{
1124 QEMUClock *clock;
1125 clock = qemu_mallocz(sizeof(QEMUClock));
bellard8a7ddc32004-03-31 19:00:16 +00001126 clock->type = type;
1127 return clock;
1128}
1129
1130QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
1131{
1132 QEMUTimer *ts;
1133
1134 ts = qemu_mallocz(sizeof(QEMUTimer));
1135 ts->clock = clock;
1136 ts->cb = cb;
1137 ts->opaque = opaque;
1138 return ts;
1139}
1140
1141void qemu_free_timer(QEMUTimer *ts)
1142{
1143 qemu_free(ts);
1144}
1145
1146/* stop a timer, but do not dealloc it */
1147void qemu_del_timer(QEMUTimer *ts)
1148{
1149 QEMUTimer **pt, *t;
1150
1151 /* NOTE: this code must be signal safe because
1152 qemu_timer_expired() can be called from a signal. */
1153 pt = &active_timers[ts->clock->type];
1154 for(;;) {
1155 t = *pt;
1156 if (!t)
1157 break;
1158 if (t == ts) {
1159 *pt = t->next;
1160 break;
1161 }
1162 pt = &t->next;
1163 }
1164}
1165
1166/* modify the current timer so that it will be fired when current_time
1167 >= expire_time. The corresponding callback will be called. */
1168void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
1169{
1170 QEMUTimer **pt, *t;
1171
1172 qemu_del_timer(ts);
1173
1174 /* add the timer in the sorted list */
1175 /* NOTE: this code must be signal safe because
1176 qemu_timer_expired() can be called from a signal. */
1177 pt = &active_timers[ts->clock->type];
1178 for(;;) {
1179 t = *pt;
1180 if (!t)
1181 break;
ths5fafdf22007-09-16 21:08:06 +00001182 if (t->expire_time > expire_time)
bellard8a7ddc32004-03-31 19:00:16 +00001183 break;
1184 pt = &t->next;
1185 }
1186 ts->expire_time = expire_time;
1187 ts->next = *pt;
1188 *pt = ts;
balrogd5d08332008-01-05 19:41:47 +00001189
1190 /* Rearm if necessary */
pbrook2e70f6e2008-06-29 01:03:05 +00001191 if (pt == &active_timers[ts->clock->type]) {
1192 if ((alarm_timer->flags & ALARM_FLAG_EXPIRED) == 0) {
1193 qemu_rearm_alarm_timer(alarm_timer);
1194 }
1195 /* Interrupt execution to force deadline recalculation. */
aliguorid9f75a42009-04-24 18:03:11 +00001196 if (use_icount)
1197 qemu_notify_event();
pbrook2e70f6e2008-06-29 01:03:05 +00001198 }
bellard8a7ddc32004-03-31 19:00:16 +00001199}
1200
1201int qemu_timer_pending(QEMUTimer *ts)
1202{
1203 QEMUTimer *t;
1204 for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
1205 if (t == ts)
1206 return 1;
1207 }
1208 return 0;
1209}
1210
1211static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
1212{
1213 if (!timer_head)
1214 return 0;
1215 return (timer_head->expire_time <= current_time);
1216}
1217
1218static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
1219{
1220 QEMUTimer *ts;
ths3b46e622007-09-17 08:09:54 +00001221
bellard8a7ddc32004-03-31 19:00:16 +00001222 for(;;) {
1223 ts = *ptimer_head;
bellarde95c8d52004-09-30 22:22:08 +00001224 if (!ts || ts->expire_time > current_time)
bellard8a7ddc32004-03-31 19:00:16 +00001225 break;
1226 /* remove timer from the list before calling the callback */
1227 *ptimer_head = ts->next;
1228 ts->next = NULL;
ths3b46e622007-09-17 08:09:54 +00001229
bellard8a7ddc32004-03-31 19:00:16 +00001230 /* run the callback (the timer list can be modified) */
1231 ts->cb(ts->opaque);
1232 }
1233}
1234
1235int64_t qemu_get_clock(QEMUClock *clock)
1236{
1237 switch(clock->type) {
1238 case QEMU_TIMER_REALTIME:
bellard1dce7c32006-07-13 23:20:22 +00001239 return get_clock() / 1000000;
bellard8a7ddc32004-03-31 19:00:16 +00001240 default:
1241 case QEMU_TIMER_VIRTUAL:
pbrook2e70f6e2008-06-29 01:03:05 +00001242 if (use_icount) {
1243 return cpu_get_icount();
1244 } else {
1245 return cpu_get_clock();
1246 }
bellard8a7ddc32004-03-31 19:00:16 +00001247 }
1248}
1249
bellard1dce7c32006-07-13 23:20:22 +00001250static void init_timers(void)
1251{
1252 init_get_clock();
1253 ticks_per_sec = QEMU_TIMER_BASE;
1254 rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
1255 vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
1256}
1257
bellard8a7ddc32004-03-31 19:00:16 +00001258/* save a timer */
1259void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
1260{
1261 uint64_t expire_time;
1262
1263 if (qemu_timer_pending(ts)) {
1264 expire_time = ts->expire_time;
1265 } else {
1266 expire_time = -1;
1267 }
1268 qemu_put_be64(f, expire_time);
1269}
1270
1271void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
1272{
1273 uint64_t expire_time;
1274
1275 expire_time = qemu_get_be64(f);
1276 if (expire_time != -1) {
1277 qemu_mod_timer(ts, expire_time);
1278 } else {
1279 qemu_del_timer(ts);
1280 }
1281}
1282
1283static void timer_save(QEMUFile *f, void *opaque)
1284{
1285 if (cpu_ticks_enabled) {
1286 hw_error("cannot save state if virtual timers are running");
1287 }
thsbee8d682007-12-16 23:41:11 +00001288 qemu_put_be64(f, cpu_ticks_offset);
1289 qemu_put_be64(f, ticks_per_sec);
1290 qemu_put_be64(f, cpu_clock_offset);
bellard8a7ddc32004-03-31 19:00:16 +00001291}
1292
1293static int timer_load(QEMUFile *f, void *opaque, int version_id)
1294{
bellardc88676f2006-08-06 13:36:11 +00001295 if (version_id != 1 && version_id != 2)
bellard8a7ddc32004-03-31 19:00:16 +00001296 return -EINVAL;
1297 if (cpu_ticks_enabled) {
1298 return -EINVAL;
1299 }
thsbee8d682007-12-16 23:41:11 +00001300 cpu_ticks_offset=qemu_get_be64(f);
1301 ticks_per_sec=qemu_get_be64(f);
bellardc88676f2006-08-06 13:36:11 +00001302 if (version_id == 2) {
thsbee8d682007-12-16 23:41:11 +00001303 cpu_clock_offset=qemu_get_be64(f);
bellardc88676f2006-08-06 13:36:11 +00001304 }
bellard8a7ddc32004-03-31 19:00:16 +00001305 return 0;
1306}
1307
bellard67b915a2004-03-31 23:37:16 +00001308#ifdef _WIN32
blueswir1b9e82a52009-04-05 18:03:31 +00001309static void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
1310 DWORD_PTR dwUser, DWORD_PTR dw1,
1311 DWORD_PTR dw2)
bellard67b915a2004-03-31 23:37:16 +00001312#else
bellard8a7ddc32004-03-31 19:00:16 +00001313static void host_alarm_handler(int host_signum)
bellard67b915a2004-03-31 23:37:16 +00001314#endif
bellard8a7ddc32004-03-31 19:00:16 +00001315{
bellard02ba45c2004-06-25 14:46:23 +00001316#if 0
1317#define DISP_FREQ 1000
1318 {
1319 static int64_t delta_min = INT64_MAX;
1320 static int64_t delta_max, delta_cum, last_clock, delta, ti;
1321 static int count;
1322 ti = qemu_get_clock(vm_clock);
1323 if (last_clock != 0) {
1324 delta = ti - last_clock;
1325 if (delta < delta_min)
1326 delta_min = delta;
1327 if (delta > delta_max)
1328 delta_max = delta;
1329 delta_cum += delta;
1330 if (++count == DISP_FREQ) {
bellard26a76462006-06-25 18:15:32 +00001331 printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
bellard02ba45c2004-06-25 14:46:23 +00001332 muldiv64(delta_min, 1000000, ticks_per_sec),
1333 muldiv64(delta_max, 1000000, ticks_per_sec),
1334 muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
1335 (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
1336 count = 0;
1337 delta_min = INT64_MAX;
1338 delta_max = 0;
1339 delta_cum = 0;
1340 }
1341 }
1342 last_clock = ti;
1343 }
1344#endif
thsefe75412007-08-24 01:36:32 +00001345 if (alarm_has_dynticks(alarm_timer) ||
pbrook2e70f6e2008-06-29 01:03:05 +00001346 (!use_icount &&
1347 qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
1348 qemu_get_clock(vm_clock))) ||
bellard8a7ddc32004-03-31 19:00:16 +00001349 qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
1350 qemu_get_clock(rt_clock))) {
aliguoric96f1a42008-11-05 20:29:45 +00001351 CPUState *env = next_cpu;
aliguoric96f1a42008-11-05 20:29:45 +00001352
bellard06d9f2f2006-05-01 13:23:04 +00001353#ifdef _WIN32
thsc8994012007-08-19 21:56:03 +00001354 struct qemu_alarm_win32 *data = ((struct qemu_alarm_timer*)dwUser)->priv;
1355 SetEvent(data->host_alarm);
aliguorif49e58d2008-11-05 21:22:34 +00001356#else
1357 static const char byte = 0;
aliguoric96f1a42008-11-05 20:29:45 +00001358 write(alarm_timer_wfd, &byte, sizeof(byte));
aliguorif49e58d2008-11-05 21:22:34 +00001359#endif
balrogd5d08332008-01-05 19:41:47 +00001360 alarm_timer->flags |= ALARM_FLAG_EXPIRED;
1361
balrog4f8eb8d2007-12-16 12:39:38 +00001362 if (env) {
1363 /* stop the currently executing cpu because a timer occured */
aurel323098dba2009-03-07 21:28:24 +00001364 cpu_exit(env);
blueswir1640f42e2009-04-19 10:18:01 +00001365#ifdef CONFIG_KQEMU
balrog4f8eb8d2007-12-16 12:39:38 +00001366 if (env->kqemu_enabled) {
1367 kqemu_cpu_interrupt(env);
1368 }
balrogee5605e2007-12-03 03:01:40 +00001369#endif
balrog4f8eb8d2007-12-16 12:39:38 +00001370 }
balrogee5605e2007-12-03 03:01:40 +00001371 event_pending = 1;
aliguorid9f75a42009-04-24 18:03:11 +00001372 qemu_notify_event();
bellard8a7ddc32004-03-31 19:00:16 +00001373 }
1374}
1375
pbrook2e70f6e2008-06-29 01:03:05 +00001376static int64_t qemu_next_deadline(void)
thsefe75412007-08-24 01:36:32 +00001377{
pbrook2e70f6e2008-06-29 01:03:05 +00001378 int64_t delta;
thsefe75412007-08-24 01:36:32 +00001379
1380 if (active_timers[QEMU_TIMER_VIRTUAL]) {
pbrook2e70f6e2008-06-29 01:03:05 +00001381 delta = active_timers[QEMU_TIMER_VIRTUAL]->expire_time -
1382 qemu_get_clock(vm_clock);
1383 } else {
1384 /* To avoid problems with overflow limit this to 2^32. */
1385 delta = INT32_MAX;
thsefe75412007-08-24 01:36:32 +00001386 }
1387
pbrook2e70f6e2008-06-29 01:03:05 +00001388 if (delta < 0)
1389 delta = 0;
thsefe75412007-08-24 01:36:32 +00001390
pbrook2e70f6e2008-06-29 01:03:05 +00001391 return delta;
1392}
1393
blueswir18632fb92008-09-14 13:59:34 +00001394#if defined(__linux__) || defined(_WIN32)
pbrook2e70f6e2008-06-29 01:03:05 +00001395static uint64_t qemu_next_deadline_dyntick(void)
1396{
1397 int64_t delta;
1398 int64_t rtdelta;
1399
1400 if (use_icount)
1401 delta = INT32_MAX;
1402 else
1403 delta = (qemu_next_deadline() + 999) / 1000;
1404
1405 if (active_timers[QEMU_TIMER_REALTIME]) {
1406 rtdelta = (active_timers[QEMU_TIMER_REALTIME]->expire_time -
1407 qemu_get_clock(rt_clock))*1000;
1408 if (rtdelta < delta)
1409 delta = rtdelta;
1410 }
1411
1412 if (delta < MIN_TIMER_REARM_US)
1413 delta = MIN_TIMER_REARM_US;
1414
1415 return delta;
thsefe75412007-08-24 01:36:32 +00001416}
blueswir18632fb92008-09-14 13:59:34 +00001417#endif
thsefe75412007-08-24 01:36:32 +00001418
bellardfd872592004-05-12 19:11:15 +00001419#ifndef _WIN32
1420
aliguori7183b4b2008-11-05 20:40:18 +00001421/* Sets a specific flag */
1422static int fcntl_setfl(int fd, int flag)
1423{
1424 int flags;
1425
1426 flags = fcntl(fd, F_GETFL);
1427 if (flags == -1)
1428 return -errno;
1429
1430 if (fcntl(fd, F_SETFL, flags | flag) == -1)
1431 return -errno;
1432
1433 return 0;
1434}
1435
bellard829309c2004-05-20 13:20:12 +00001436#if defined(__linux__)
1437
bellardfd872592004-05-12 19:11:15 +00001438#define RTC_FREQ 1024
1439
aurel32de9a95f2008-11-11 13:41:01 +00001440static void enable_sigio_timer(int fd)
bellardfd872592004-05-12 19:11:15 +00001441{
thsc8994012007-08-19 21:56:03 +00001442 struct sigaction act;
1443
1444 /* timer signal */
1445 sigfillset(&act.sa_mask);
1446 act.sa_flags = 0;
thsc8994012007-08-19 21:56:03 +00001447 act.sa_handler = host_alarm_handler;
1448
1449 sigaction(SIGIO, &act, NULL);
aliguori7183b4b2008-11-05 20:40:18 +00001450 fcntl_setfl(fd, O_ASYNC);
thsc8994012007-08-19 21:56:03 +00001451 fcntl(fd, F_SETOWN, getpid());
1452}
1453
thsc40ec5a2007-08-19 22:09:40 +00001454static int hpet_start_timer(struct qemu_alarm_timer *t)
1455{
1456 struct hpet_info info;
1457 int r, fd;
1458
1459 fd = open("/dev/hpet", O_RDONLY);
1460 if (fd < 0)
1461 return -1;
1462
1463 /* Set frequency */
1464 r = ioctl(fd, HPET_IRQFREQ, RTC_FREQ);
1465 if (r < 0) {
1466 fprintf(stderr, "Could not configure '/dev/hpet' to have a 1024Hz timer. This is not a fatal\n"
1467 "error, but for better emulation accuracy type:\n"
1468 "'echo 1024 > /proc/sys/dev/hpet/max-user-freq' as root.\n");
1469 goto fail;
1470 }
1471
1472 /* Check capabilities */
1473 r = ioctl(fd, HPET_INFO, &info);
1474 if (r < 0)
1475 goto fail;
1476
1477 /* Enable periodic mode */
1478 r = ioctl(fd, HPET_EPI, 0);
1479 if (info.hi_flags && (r < 0))
1480 goto fail;
1481
1482 /* Enable interrupt */
1483 r = ioctl(fd, HPET_IE_ON, 0);
1484 if (r < 0)
1485 goto fail;
1486
1487 enable_sigio_timer(fd);
pbrookfcdc2122007-08-23 20:22:22 +00001488 t->priv = (void *)(long)fd;
thsc40ec5a2007-08-19 22:09:40 +00001489
1490 return 0;
1491fail:
1492 close(fd);
1493 return -1;
1494}
1495
1496static void hpet_stop_timer(struct qemu_alarm_timer *t)
1497{
pbrookfcdc2122007-08-23 20:22:22 +00001498 int fd = (long)t->priv;
thsc40ec5a2007-08-19 22:09:40 +00001499
1500 close(fd);
1501}
1502
thsc8994012007-08-19 21:56:03 +00001503static int rtc_start_timer(struct qemu_alarm_timer *t)
1504{
1505 int rtc_fd;
balrogb5a23ad2008-02-03 03:45:47 +00001506 unsigned long current_rtc_freq = 0;
thsc8994012007-08-19 21:56:03 +00001507
balrogaeb30be2007-07-02 15:03:13 +00001508 TFR(rtc_fd = open("/dev/rtc", O_RDONLY));
bellardfd872592004-05-12 19:11:15 +00001509 if (rtc_fd < 0)
1510 return -1;
balrogb5a23ad2008-02-03 03:45:47 +00001511 ioctl(rtc_fd, RTC_IRQP_READ, &current_rtc_freq);
1512 if (current_rtc_freq != RTC_FREQ &&
1513 ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
bellardfd872592004-05-12 19:11:15 +00001514 fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
1515 "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
1516 "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
1517 goto fail;
1518 }
1519 if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
1520 fail:
1521 close(rtc_fd);
1522 return -1;
1523 }
thsc8994012007-08-19 21:56:03 +00001524
1525 enable_sigio_timer(rtc_fd);
1526
pbrookfcdc2122007-08-23 20:22:22 +00001527 t->priv = (void *)(long)rtc_fd;
thsc8994012007-08-19 21:56:03 +00001528
bellardfd872592004-05-12 19:11:15 +00001529 return 0;
1530}
1531
thsc8994012007-08-19 21:56:03 +00001532static void rtc_stop_timer(struct qemu_alarm_timer *t)
bellard829309c2004-05-20 13:20:12 +00001533{
pbrookfcdc2122007-08-23 20:22:22 +00001534 int rtc_fd = (long)t->priv;
thsc8994012007-08-19 21:56:03 +00001535
1536 close(rtc_fd);
bellard829309c2004-05-20 13:20:12 +00001537}
1538
thsefe75412007-08-24 01:36:32 +00001539static int dynticks_start_timer(struct qemu_alarm_timer *t)
1540{
1541 struct sigevent ev;
1542 timer_t host_timer;
1543 struct sigaction act;
1544
1545 sigfillset(&act.sa_mask);
1546 act.sa_flags = 0;
thsefe75412007-08-24 01:36:32 +00001547 act.sa_handler = host_alarm_handler;
1548
1549 sigaction(SIGALRM, &act, NULL);
1550
1551 ev.sigev_value.sival_int = 0;
1552 ev.sigev_notify = SIGEV_SIGNAL;
1553 ev.sigev_signo = SIGALRM;
1554
1555 if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
1556 perror("timer_create");
1557
1558 /* disable dynticks */
1559 fprintf(stderr, "Dynamic Ticks disabled\n");
1560
1561 return -1;
1562 }
1563
blueswir10399bfe2008-11-16 11:37:18 +00001564 t->priv = (void *)(long)host_timer;
thsefe75412007-08-24 01:36:32 +00001565
1566 return 0;
1567}
1568
1569static void dynticks_stop_timer(struct qemu_alarm_timer *t)
1570{
blueswir10399bfe2008-11-16 11:37:18 +00001571 timer_t host_timer = (timer_t)(long)t->priv;
thsefe75412007-08-24 01:36:32 +00001572
1573 timer_delete(host_timer);
1574}
1575
1576static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
1577{
blueswir10399bfe2008-11-16 11:37:18 +00001578 timer_t host_timer = (timer_t)(long)t->priv;
thsefe75412007-08-24 01:36:32 +00001579 struct itimerspec timeout;
1580 int64_t nearest_delta_us = INT64_MAX;
1581 int64_t current_us;
1582
1583 if (!active_timers[QEMU_TIMER_REALTIME] &&
1584 !active_timers[QEMU_TIMER_VIRTUAL])
balrogd5d08332008-01-05 19:41:47 +00001585 return;
thsefe75412007-08-24 01:36:32 +00001586
pbrook2e70f6e2008-06-29 01:03:05 +00001587 nearest_delta_us = qemu_next_deadline_dyntick();
thsefe75412007-08-24 01:36:32 +00001588
1589 /* check whether a timer is already running */
1590 if (timer_gettime(host_timer, &timeout)) {
1591 perror("gettime");
1592 fprintf(stderr, "Internal timer error: aborting\n");
1593 exit(1);
1594 }
1595 current_us = timeout.it_value.tv_sec * 1000000 + timeout.it_value.tv_nsec/1000;
1596 if (current_us && current_us <= nearest_delta_us)
1597 return;
1598
1599 timeout.it_interval.tv_sec = 0;
1600 timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
1601 timeout.it_value.tv_sec = nearest_delta_us / 1000000;
1602 timeout.it_value.tv_nsec = (nearest_delta_us % 1000000) * 1000;
1603 if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
1604 perror("settime");
1605 fprintf(stderr, "Internal timer error: aborting\n");
1606 exit(1);
1607 }
1608}
1609
ths70744b32007-08-26 17:31:30 +00001610#endif /* defined(__linux__) */
ths231c6582007-08-26 17:29:15 +00001611
thsc8994012007-08-19 21:56:03 +00001612static int unix_start_timer(struct qemu_alarm_timer *t)
1613{
1614 struct sigaction act;
1615 struct itimerval itv;
1616 int err;
1617
1618 /* timer signal */
1619 sigfillset(&act.sa_mask);
1620 act.sa_flags = 0;
thsc8994012007-08-19 21:56:03 +00001621 act.sa_handler = host_alarm_handler;
1622
1623 sigaction(SIGALRM, &act, NULL);
1624
1625 itv.it_interval.tv_sec = 0;
1626 /* for i386 kernel 2.6 to get 1 ms */
1627 itv.it_interval.tv_usec = 999;
1628 itv.it_value.tv_sec = 0;
1629 itv.it_value.tv_usec = 10 * 1000;
1630
1631 err = setitimer(ITIMER_REAL, &itv, NULL);
1632 if (err)
1633 return -1;
1634
1635 return 0;
1636}
1637
1638static void unix_stop_timer(struct qemu_alarm_timer *t)
1639{
1640 struct itimerval itv;
1641
1642 memset(&itv, 0, sizeof(itv));
1643 setitimer(ITIMER_REAL, &itv, NULL);
1644}
1645
bellard829309c2004-05-20 13:20:12 +00001646#endif /* !defined(_WIN32) */
bellardfd872592004-05-12 19:11:15 +00001647
aliguorif49e58d2008-11-05 21:22:34 +00001648static void try_to_rearm_timer(void *opaque)
1649{
1650 struct qemu_alarm_timer *t = opaque;
1651#ifndef _WIN32
1652 ssize_t len;
1653
1654 /* Drain the notify pipe */
1655 do {
1656 char buffer[512];
1657 len = read(alarm_timer_rfd, buffer, sizeof(buffer));
1658 } while ((len == -1 && errno == EINTR) || len > 0);
1659#endif
1660
aliguorif49e58d2008-11-05 21:22:34 +00001661 if (t->flags & ALARM_FLAG_EXPIRED) {
1662 alarm_timer->flags &= ~ALARM_FLAG_EXPIRED;
1663 qemu_rearm_alarm_timer(alarm_timer);
1664 }
1665}
1666
thsc8994012007-08-19 21:56:03 +00001667#ifdef _WIN32
1668
1669static int win32_start_timer(struct qemu_alarm_timer *t)
1670{
1671 TIMECAPS tc;
1672 struct qemu_alarm_win32 *data = t->priv;
thsefe75412007-08-24 01:36:32 +00001673 UINT flags;
thsc8994012007-08-19 21:56:03 +00001674
1675 data->host_alarm = CreateEvent(NULL, FALSE, FALSE, NULL);
1676 if (!data->host_alarm) {
1677 perror("Failed CreateEvent");
thsc396a7f2007-08-20 15:42:22 +00001678 return -1;
thsc8994012007-08-19 21:56:03 +00001679 }
1680
1681 memset(&tc, 0, sizeof(tc));
1682 timeGetDevCaps(&tc, sizeof(tc));
1683
1684 if (data->period < tc.wPeriodMin)
1685 data->period = tc.wPeriodMin;
1686
1687 timeBeginPeriod(data->period);
1688
thsefe75412007-08-24 01:36:32 +00001689 flags = TIME_CALLBACK_FUNCTION;
1690 if (alarm_has_dynticks(t))
1691 flags |= TIME_ONESHOT;
1692 else
1693 flags |= TIME_PERIODIC;
1694
thsc8994012007-08-19 21:56:03 +00001695 data->timerId = timeSetEvent(1, // interval (ms)
1696 data->period, // resolution
1697 host_alarm_handler, // function
1698 (DWORD)t, // parameter
thsefe75412007-08-24 01:36:32 +00001699 flags);
thsc8994012007-08-19 21:56:03 +00001700
1701 if (!data->timerId) {
1702 perror("Failed to initialize win32 alarm timer");
1703
1704 timeEndPeriod(data->period);
1705 CloseHandle(data->host_alarm);
1706 return -1;
1707 }
1708
aliguorif49e58d2008-11-05 21:22:34 +00001709 qemu_add_wait_object(data->host_alarm, try_to_rearm_timer, t);
thsc8994012007-08-19 21:56:03 +00001710
1711 return 0;
1712}
1713
1714static void win32_stop_timer(struct qemu_alarm_timer *t)
1715{
1716 struct qemu_alarm_win32 *data = t->priv;
1717
1718 timeKillEvent(data->timerId);
1719 timeEndPeriod(data->period);
1720
1721 CloseHandle(data->host_alarm);
1722}
1723
thsefe75412007-08-24 01:36:32 +00001724static void win32_rearm_timer(struct qemu_alarm_timer *t)
1725{
1726 struct qemu_alarm_win32 *data = t->priv;
1727 uint64_t nearest_delta_us;
1728
1729 if (!active_timers[QEMU_TIMER_REALTIME] &&
1730 !active_timers[QEMU_TIMER_VIRTUAL])
balrogd5d08332008-01-05 19:41:47 +00001731 return;
thsefe75412007-08-24 01:36:32 +00001732
pbrook2e70f6e2008-06-29 01:03:05 +00001733 nearest_delta_us = qemu_next_deadline_dyntick();
thsefe75412007-08-24 01:36:32 +00001734 nearest_delta_us /= 1000;
1735
1736 timeKillEvent(data->timerId);
1737
1738 data->timerId = timeSetEvent(1,
1739 data->period,
1740 host_alarm_handler,
1741 (DWORD)t,
1742 TIME_ONESHOT | TIME_PERIODIC);
1743
1744 if (!data->timerId) {
1745 perror("Failed to re-arm win32 alarm timer");
1746
1747 timeEndPeriod(data->period);
1748 CloseHandle(data->host_alarm);
1749 exit(1);
1750 }
1751}
1752
thsc8994012007-08-19 21:56:03 +00001753#endif /* _WIN32 */
1754
aliguori7183b4b2008-11-05 20:40:18 +00001755static int init_timer_alarm(void)
bellard8a7ddc32004-03-31 19:00:16 +00001756{
blueswir1223f0d72008-09-30 18:12:18 +00001757 struct qemu_alarm_timer *t = NULL;
thsc8994012007-08-19 21:56:03 +00001758 int i, err = -1;
aliguorif49e58d2008-11-05 21:22:34 +00001759
1760#ifndef _WIN32
aliguoric96f1a42008-11-05 20:29:45 +00001761 int fds[2];
1762
aliguori7183b4b2008-11-05 20:40:18 +00001763 err = pipe(fds);
1764 if (err == -1)
1765 return -errno;
1766
1767 err = fcntl_setfl(fds[0], O_NONBLOCK);
1768 if (err < 0)
1769 goto fail;
1770
1771 err = fcntl_setfl(fds[1], O_NONBLOCK);
1772 if (err < 0)
1773 goto fail;
1774
aliguoric96f1a42008-11-05 20:29:45 +00001775 alarm_timer_rfd = fds[0];
1776 alarm_timer_wfd = fds[1];
aliguorif49e58d2008-11-05 21:22:34 +00001777#endif
bellard06d9f2f2006-05-01 13:23:04 +00001778
thsc8994012007-08-19 21:56:03 +00001779 for (i = 0; alarm_timers[i].name; i++) {
1780 t = &alarm_timers[i];
1781
thsc8994012007-08-19 21:56:03 +00001782 err = t->start(t);
1783 if (!err)
1784 break;
bellard67b915a2004-03-31 23:37:16 +00001785 }
bellardfd872592004-05-12 19:11:15 +00001786
thsc8994012007-08-19 21:56:03 +00001787 if (err) {
aliguori7183b4b2008-11-05 20:40:18 +00001788 err = -ENOENT;
1789 goto fail;
bellard67b915a2004-03-31 23:37:16 +00001790 }
thsc8994012007-08-19 21:56:03 +00001791
aliguorif49e58d2008-11-05 21:22:34 +00001792#ifndef _WIN32
aliguori6abfbd72008-11-05 20:49:37 +00001793 qemu_set_fd_handler2(alarm_timer_rfd, NULL,
1794 try_to_rearm_timer, NULL, t);
aliguorif49e58d2008-11-05 21:22:34 +00001795#endif
aliguori6abfbd72008-11-05 20:49:37 +00001796
thsc8994012007-08-19 21:56:03 +00001797 alarm_timer = t;
aliguori7183b4b2008-11-05 20:40:18 +00001798
aliguori6abfbd72008-11-05 20:49:37 +00001799 return 0;
aliguori7183b4b2008-11-05 20:40:18 +00001800
1801fail:
aliguorif49e58d2008-11-05 21:22:34 +00001802#ifndef _WIN32
aliguori7183b4b2008-11-05 20:40:18 +00001803 close(fds[0]);
1804 close(fds[1]);
aliguorif49e58d2008-11-05 21:22:34 +00001805#endif
aliguori7183b4b2008-11-05 20:40:18 +00001806 return err;
bellard8a7ddc32004-03-31 19:00:16 +00001807}
1808
pbrook9596ebb2007-11-18 01:44:38 +00001809static void quit_timers(void)
bellard40c3bac2004-04-04 12:56:28 +00001810{
thsc8994012007-08-19 21:56:03 +00001811 alarm_timer->stop(alarm_timer);
1812 alarm_timer = NULL;
bellard40c3bac2004-04-04 12:56:28 +00001813}
1814
bellardc4b1fcc2004-03-14 21:44:30 +00001815/***********************************************************/
balrogf6503052008-02-17 11:42:19 +00001816/* host time/date access */
1817void qemu_get_timedate(struct tm *tm, int offset)
1818{
1819 time_t ti;
1820 struct tm *ret;
1821
1822 time(&ti);
1823 ti += offset;
1824 if (rtc_date_offset == -1) {
1825 if (rtc_utc)
1826 ret = gmtime(&ti);
1827 else
1828 ret = localtime(&ti);
1829 } else {
1830 ti -= rtc_date_offset;
1831 ret = gmtime(&ti);
1832 }
1833
1834 memcpy(tm, ret, sizeof(struct tm));
1835}
1836
1837int qemu_timedate_diff(struct tm *tm)
1838{
1839 time_t seconds;
1840
1841 if (rtc_date_offset == -1)
1842 if (rtc_utc)
1843 seconds = mktimegm(tm);
1844 else
1845 seconds = mktime(tm);
1846 else
1847 seconds = mktimegm(tm) + rtc_date_offset;
1848
1849 return seconds - time(NULL);
1850}
1851
bellardfd1dff42006-02-01 21:29:26 +00001852#ifdef _WIN32
bellardfd1dff42006-02-01 21:29:26 +00001853static void socket_cleanup(void)
1854{
1855 WSACleanup();
1856}
bellard82c643f2004-07-14 17:28:13 +00001857
bellardfd1dff42006-02-01 21:29:26 +00001858static int socket_init(void)
1859{
1860 WSADATA Data;
1861 int ret, err;
1862
1863 ret = WSAStartup(MAKEWORD(2,2), &Data);
1864 if (ret != 0) {
1865 err = WSAGetLastError();
1866 fprintf(stderr, "WSAStartup: %d\n", err);
1867 return -1;
1868 }
1869 atexit(socket_cleanup);
1870 return 0;
1871}
aurel3264b7b732008-05-05 10:05:31 +00001872#endif
1873
aliguori268a3622009-04-21 22:30:27 +00001874const char *get_opt_name(char *buf, int buf_size, const char *p, char delim)
thse4bcb142007-12-02 04:51:10 +00001875{
1876 char *q;
thse4bcb142007-12-02 04:51:10 +00001877
balrog609497a2008-01-14 02:56:53 +00001878 q = buf;
aliguori268a3622009-04-21 22:30:27 +00001879 while (*p != '\0' && *p != delim) {
balrog609497a2008-01-14 02:56:53 +00001880 if (q && (q - buf) < buf_size - 1)
1881 *q++ = *p;
1882 p++;
1883 }
1884 if (q)
1885 *q = '\0';
1886
1887 return p;
1888}
1889
aliguori63a01ef2008-10-31 19:10:00 +00001890const char *get_opt_value(char *buf, int buf_size, const char *p)
balrog609497a2008-01-14 02:56:53 +00001891{
1892 char *q;
1893
thse4bcb142007-12-02 04:51:10 +00001894 q = buf;
1895 while (*p != '\0') {
balrog609497a2008-01-14 02:56:53 +00001896 if (*p == ',') {
1897 if (*(p + 1) != ',')
thse4bcb142007-12-02 04:51:10 +00001898 break;
thse4bcb142007-12-02 04:51:10 +00001899 p++;
balrog609497a2008-01-14 02:56:53 +00001900 }
thse4bcb142007-12-02 04:51:10 +00001901 if (q && (q - buf) < buf_size - 1)
1902 *q++ = *p;
1903 p++;
1904 }
1905 if (q)
1906 *q = '\0';
1907
1908 return p;
1909}
1910
aliguori63a01ef2008-10-31 19:10:00 +00001911int get_param_value(char *buf, int buf_size,
1912 const char *tag, const char *str)
bellard7c9d8e02005-11-15 22:16:05 +00001913{
1914 const char *p;
bellard7c9d8e02005-11-15 22:16:05 +00001915 char option[128];
1916
1917 p = str;
1918 for(;;) {
aliguori268a3622009-04-21 22:30:27 +00001919 p = get_opt_name(option, sizeof(option), p, '=');
bellard7c9d8e02005-11-15 22:16:05 +00001920 if (*p != '=')
1921 break;
1922 p++;
1923 if (!strcmp(tag, option)) {
balrog609497a2008-01-14 02:56:53 +00001924 (void)get_opt_value(buf, buf_size, p);
thse4bcb142007-12-02 04:51:10 +00001925 return strlen(buf);
bellard7c9d8e02005-11-15 22:16:05 +00001926 } else {
balrog609497a2008-01-14 02:56:53 +00001927 p = get_opt_value(NULL, 0, p);
bellard7c9d8e02005-11-15 22:16:05 +00001928 }
1929 if (*p != ',')
1930 break;
1931 p++;
1932 }
1933 return 0;
1934}
1935
aliguori63a01ef2008-10-31 19:10:00 +00001936int check_params(char *buf, int buf_size,
1937 const char * const *params, const char *str)
thse4bcb142007-12-02 04:51:10 +00001938{
1939 const char *p;
1940 int i;
1941
1942 p = str;
aliguori10300212009-04-21 19:56:23 +00001943 while (*p != '\0') {
aliguori268a3622009-04-21 22:30:27 +00001944 p = get_opt_name(buf, buf_size, p, '=');
thse4bcb142007-12-02 04:51:10 +00001945 if (*p != '=')
1946 return -1;
1947 p++;
1948 for(i = 0; params[i] != NULL; i++)
1949 if (!strcmp(params[i], buf))
1950 break;
1951 if (params[i] == NULL)
1952 return -1;
balrog609497a2008-01-14 02:56:53 +00001953 p = get_opt_value(NULL, 0, p);
thse4bcb142007-12-02 04:51:10 +00001954 if (*p != ',')
1955 break;
1956 p++;
1957 }
1958 return 0;
1959}
1960
balrog1ae26a12008-09-28 23:19:47 +00001961/***********************************************************/
1962/* Bluetooth support */
1963static int nb_hcis;
1964static int cur_hci;
1965static struct HCIInfo *hci_table[MAX_NICS];
balrogdc72ac12008-11-09 00:04:26 +00001966
balrog1ae26a12008-09-28 23:19:47 +00001967static struct bt_vlan_s {
1968 struct bt_scatternet_s net;
1969 int id;
1970 struct bt_vlan_s *next;
1971} *first_bt_vlan;
1972
1973/* find or alloc a new bluetooth "VLAN" */
blueswir1674bb262008-09-30 18:18:27 +00001974static struct bt_scatternet_s *qemu_find_bt_vlan(int id)
balrog1ae26a12008-09-28 23:19:47 +00001975{
1976 struct bt_vlan_s **pvlan, *vlan;
1977 for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
1978 if (vlan->id == id)
1979 return &vlan->net;
1980 }
1981 vlan = qemu_mallocz(sizeof(struct bt_vlan_s));
1982 vlan->id = id;
1983 pvlan = &first_bt_vlan;
1984 while (*pvlan != NULL)
1985 pvlan = &(*pvlan)->next;
1986 *pvlan = vlan;
1987 return &vlan->net;
1988}
1989
1990static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
1991{
1992}
1993
1994static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
1995{
1996 return -ENOTSUP;
1997}
1998
1999static struct HCIInfo null_hci = {
2000 .cmd_send = null_hci_send,
2001 .sco_send = null_hci_send,
2002 .acl_send = null_hci_send,
2003 .bdaddr_set = null_hci_addr_set,
2004};
2005
2006struct HCIInfo *qemu_next_hci(void)
2007{
2008 if (cur_hci == nb_hcis)
2009 return &null_hci;
2010
2011 return hci_table[cur_hci++];
2012}
2013
balrogdc72ac12008-11-09 00:04:26 +00002014static struct HCIInfo *hci_init(const char *str)
2015{
2016 char *endp;
2017 struct bt_scatternet_s *vlan = 0;
2018
2019 if (!strcmp(str, "null"))
2020 /* null */
2021 return &null_hci;
2022 else if (!strncmp(str, "host", 4) && (str[4] == '\0' || str[4] == ':'))
2023 /* host[:hciN] */
2024 return bt_host_hci(str[4] ? str + 5 : "hci0");
2025 else if (!strncmp(str, "hci", 3)) {
2026 /* hci[,vlan=n] */
2027 if (str[3]) {
2028 if (!strncmp(str + 3, ",vlan=", 6)) {
2029 vlan = qemu_find_bt_vlan(strtol(str + 9, &endp, 0));
2030 if (*endp)
2031 vlan = 0;
2032 }
2033 } else
2034 vlan = qemu_find_bt_vlan(0);
2035 if (vlan)
2036 return bt_new_hci(vlan);
2037 }
2038
2039 fprintf(stderr, "qemu: Unknown bluetooth HCI `%s'.\n", str);
2040
2041 return 0;
2042}
2043
2044static int bt_hci_parse(const char *str)
2045{
2046 struct HCIInfo *hci;
2047 bdaddr_t bdaddr;
2048
2049 if (nb_hcis >= MAX_NICS) {
2050 fprintf(stderr, "qemu: Too many bluetooth HCIs (max %i).\n", MAX_NICS);
2051 return -1;
2052 }
2053
2054 hci = hci_init(str);
2055 if (!hci)
2056 return -1;
2057
2058 bdaddr.b[0] = 0x52;
2059 bdaddr.b[1] = 0x54;
2060 bdaddr.b[2] = 0x00;
2061 bdaddr.b[3] = 0x12;
2062 bdaddr.b[4] = 0x34;
2063 bdaddr.b[5] = 0x56 + nb_hcis;
2064 hci->bdaddr_set(hci, bdaddr.b);
2065
2066 hci_table[nb_hcis++] = hci;
2067
2068 return 0;
2069}
2070
2071static void bt_vhci_add(int vlan_id)
2072{
2073 struct bt_scatternet_s *vlan = qemu_find_bt_vlan(vlan_id);
2074
2075 if (!vlan->slave)
2076 fprintf(stderr, "qemu: warning: adding a VHCI to "
2077 "an empty scatternet %i\n", vlan_id);
2078
2079 bt_vhci_init(bt_new_hci(vlan));
2080}
2081
2082static struct bt_device_s *bt_device_add(const char *opt)
2083{
2084 struct bt_scatternet_s *vlan;
2085 int vlan_id = 0;
2086 char *endp = strstr(opt, ",vlan=");
2087 int len = (endp ? endp - opt : strlen(opt)) + 1;
2088 char devname[10];
2089
2090 pstrcpy(devname, MIN(sizeof(devname), len), opt);
2091
2092 if (endp) {
2093 vlan_id = strtol(endp + 6, &endp, 0);
2094 if (*endp) {
2095 fprintf(stderr, "qemu: unrecognised bluetooth vlan Id\n");
2096 return 0;
2097 }
2098 }
2099
2100 vlan = qemu_find_bt_vlan(vlan_id);
2101
2102 if (!vlan->slave)
2103 fprintf(stderr, "qemu: warning: adding a slave device to "
2104 "an empty scatternet %i\n", vlan_id);
2105
2106 if (!strcmp(devname, "keyboard"))
2107 return bt_keyboard_init(vlan);
2108
2109 fprintf(stderr, "qemu: unsupported bluetooth device `%s'\n", devname);
2110 return 0;
2111}
2112
2113static int bt_parse(const char *opt)
2114{
2115 const char *endp, *p;
2116 int vlan;
2117
2118 if (strstart(opt, "hci", &endp)) {
2119 if (!*endp || *endp == ',') {
2120 if (*endp)
2121 if (!strstart(endp, ",vlan=", 0))
2122 opt = endp + 1;
2123
2124 return bt_hci_parse(opt);
2125 }
2126 } else if (strstart(opt, "vhci", &endp)) {
2127 if (!*endp || *endp == ',') {
2128 if (*endp) {
2129 if (strstart(endp, ",vlan=", &p)) {
2130 vlan = strtol(p, (char **) &endp, 0);
2131 if (*endp) {
2132 fprintf(stderr, "qemu: bad scatternet '%s'\n", p);
2133 return 1;
2134 }
2135 } else {
2136 fprintf(stderr, "qemu: bad parameter '%s'\n", endp + 1);
2137 return 1;
2138 }
2139 } else
2140 vlan = 0;
2141
2142 bt_vhci_add(vlan);
2143 return 0;
2144 }
2145 } else if (strstart(opt, "device:", &endp))
2146 return !bt_device_add(endp);
2147
2148 fprintf(stderr, "qemu: bad bluetooth parameter '%s'\n", opt);
2149 return 1;
2150}
2151
balrog1ae26a12008-09-28 23:19:47 +00002152/***********************************************************/
2153/* QEMU Block devices */
2154
balrog609497a2008-01-14 02:56:53 +00002155#define HD_ALIAS "index=%d,media=disk"
thse4bcb142007-12-02 04:51:10 +00002156#define CDROM_ALIAS "index=2,media=cdrom"
thse4bcb142007-12-02 04:51:10 +00002157#define FD_ALIAS "index=%d,if=floppy"
balrog609497a2008-01-14 02:56:53 +00002158#define PFLASH_ALIAS "if=pflash"
2159#define MTD_ALIAS "if=mtd"
balrog9d413d12007-12-04 00:10:34 +00002160#define SD_ALIAS "index=0,if=sd"
thse4bcb142007-12-02 04:51:10 +00002161
aliguori7d5aca92009-02-11 15:19:58 +00002162static int drive_opt_get_free_idx(void)
2163{
2164 int index;
2165
2166 for (index = 0; index < MAX_DRIVES; index++)
2167 if (!drives_opt[index].used) {
2168 drives_opt[index].used = 1;
2169 return index;
2170 }
2171
2172 return -1;
2173}
2174
2175static int drive_get_free_idx(void)
2176{
2177 int index;
2178
2179 for (index = 0; index < MAX_DRIVES; index++)
2180 if (!drives_table[index].used) {
2181 drives_table[index].used = 1;
2182 return index;
2183 }
2184
2185 return -1;
2186}
2187
aliguori4d73cd32009-02-11 15:20:46 +00002188int drive_add(const char *file, const char *fmt, ...)
thse4bcb142007-12-02 04:51:10 +00002189{
2190 va_list ap;
aliguori7d5aca92009-02-11 15:19:58 +00002191 int index = drive_opt_get_free_idx();
thse4bcb142007-12-02 04:51:10 +00002192
aliguori7d5aca92009-02-11 15:19:58 +00002193 if (nb_drives_opt >= MAX_DRIVES || index == -1) {
thse4bcb142007-12-02 04:51:10 +00002194 fprintf(stderr, "qemu: too many drives\n");
aliguori4d73cd32009-02-11 15:20:46 +00002195 return -1;
thse4bcb142007-12-02 04:51:10 +00002196 }
2197
aliguori7d5aca92009-02-11 15:19:58 +00002198 drives_opt[index].file = file;
thse4bcb142007-12-02 04:51:10 +00002199 va_start(ap, fmt);
aliguori7d5aca92009-02-11 15:19:58 +00002200 vsnprintf(drives_opt[index].opt,
balrog609497a2008-01-14 02:56:53 +00002201 sizeof(drives_opt[0].opt), fmt, ap);
thse4bcb142007-12-02 04:51:10 +00002202 va_end(ap);
2203
aliguori7d5aca92009-02-11 15:19:58 +00002204 nb_drives_opt++;
2205 return index;
thse4bcb142007-12-02 04:51:10 +00002206}
2207
aliguorib01b1112009-02-11 15:20:20 +00002208void drive_remove(int index)
2209{
2210 drives_opt[index].used = 0;
2211 nb_drives_opt--;
2212}
2213
thsf60d39b2007-12-17 03:55:57 +00002214int drive_get_index(BlockInterfaceType type, int bus, int unit)
thse4bcb142007-12-02 04:51:10 +00002215{
2216 int index;
2217
2218 /* seek interface, bus and unit */
2219
aliguori7d5aca92009-02-11 15:19:58 +00002220 for (index = 0; index < MAX_DRIVES; index++)
thsf60d39b2007-12-17 03:55:57 +00002221 if (drives_table[index].type == type &&
thse4bcb142007-12-02 04:51:10 +00002222 drives_table[index].bus == bus &&
aliguori7d5aca92009-02-11 15:19:58 +00002223 drives_table[index].unit == unit &&
2224 drives_table[index].used)
thse4bcb142007-12-02 04:51:10 +00002225 return index;
2226
2227 return -1;
2228}
2229
thsf60d39b2007-12-17 03:55:57 +00002230int drive_get_max_bus(BlockInterfaceType type)
thse4bcb142007-12-02 04:51:10 +00002231{
2232 int max_bus;
2233 int index;
2234
2235 max_bus = -1;
2236 for (index = 0; index < nb_drives; index++) {
thsf60d39b2007-12-17 03:55:57 +00002237 if(drives_table[index].type == type &&
thse4bcb142007-12-02 04:51:10 +00002238 drives_table[index].bus > max_bus)
2239 max_bus = drives_table[index].bus;
2240 }
2241 return max_bus;
2242}
2243
aliguorifa879c62009-01-07 17:32:33 +00002244const char *drive_get_serial(BlockDriverState *bdrv)
2245{
2246 int index;
2247
2248 for (index = 0; index < nb_drives; index++)
2249 if (drives_table[index].bdrv == bdrv)
2250 return drives_table[index].serial;
2251
2252 return "\0";
2253}
2254
aliguori428c5702009-01-21 18:59:04 +00002255BlockInterfaceErrorAction drive_get_onerror(BlockDriverState *bdrv)
2256{
2257 int index;
2258
2259 for (index = 0; index < nb_drives; index++)
2260 if (drives_table[index].bdrv == bdrv)
2261 return drives_table[index].onerror;
2262
aliguoricdad4bd2009-02-28 16:51:01 +00002263 return BLOCK_ERR_STOP_ENOSPC;
aliguori428c5702009-01-21 18:59:04 +00002264}
2265
aurel32a1620fa2008-04-29 05:58:01 +00002266static void bdrv_format_print(void *opaque, const char *name)
2267{
2268 fprintf(stderr, " %s", name);
2269}
2270
aliguorib01b1112009-02-11 15:20:20 +00002271void drive_uninit(BlockDriverState *bdrv)
2272{
2273 int i;
2274
2275 for (i = 0; i < MAX_DRIVES; i++)
2276 if (drives_table[i].bdrv == bdrv) {
2277 drives_table[i].bdrv = NULL;
2278 drives_table[i].used = 0;
2279 drive_remove(drives_table[i].drive_opt_idx);
2280 nb_drives--;
2281 break;
2282 }
2283}
2284
aliguori4d73cd32009-02-11 15:20:46 +00002285int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
thse4bcb142007-12-02 04:51:10 +00002286{
2287 char buf[128];
2288 char file[1024];
balrogc8522bd2007-12-06 22:11:20 +00002289 char devname[128];
aliguorifa879c62009-01-07 17:32:33 +00002290 char serial[21];
balrogc8522bd2007-12-06 22:11:20 +00002291 const char *mediastr = "";
thsf60d39b2007-12-17 03:55:57 +00002292 BlockInterfaceType type;
thse4bcb142007-12-02 04:51:10 +00002293 enum { MEDIA_DISK, MEDIA_CDROM } media;
2294 int bus_id, unit_id;
2295 int cyls, heads, secs, translation;
2296 BlockDriverState *bdrv;
aurel321e72d3b2008-04-28 20:26:45 +00002297 BlockDriver *drv = NULL;
aliguori4d73cd32009-02-11 15:20:46 +00002298 QEMUMachine *machine = opaque;
thse4bcb142007-12-02 04:51:10 +00002299 int max_devs;
2300 int index;
balrog33f00272007-12-24 14:33:24 +00002301 int cache;
aliguori428c5702009-01-21 18:59:04 +00002302 int bdrv_flags, onerror;
aliguori7d5aca92009-02-11 15:19:58 +00002303 int drives_table_idx;
balrog609497a2008-01-14 02:56:53 +00002304 char *str = arg->opt;
blueswir17ccfb2e2008-09-14 06:45:34 +00002305 static const char * const params[] = { "bus", "unit", "if", "index",
2306 "cyls", "heads", "secs", "trans",
2307 "media", "snapshot", "file",
aliguori428c5702009-01-21 18:59:04 +00002308 "cache", "format", "serial", "werror",
2309 NULL };
thse4bcb142007-12-02 04:51:10 +00002310
2311 if (check_params(buf, sizeof(buf), params, str) < 0) {
balrogff993632008-02-10 13:21:25 +00002312 fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n",
thse4bcb142007-12-02 04:51:10 +00002313 buf, str);
2314 return -1;
2315 }
2316
2317 file[0] = 0;
2318 cyls = heads = secs = 0;
2319 bus_id = 0;
2320 unit_id = -1;
2321 translation = BIOS_ATA_TRANSLATION_AUTO;
2322 index = -1;
aliguori4dc822d2008-12-04 21:39:21 +00002323 cache = 3;
thse4bcb142007-12-02 04:51:10 +00002324
blueswir1c9b1ae22008-09-28 18:55:17 +00002325 if (machine->use_scsi) {
thsf60d39b2007-12-17 03:55:57 +00002326 type = IF_SCSI;
thse4bcb142007-12-02 04:51:10 +00002327 max_devs = MAX_SCSI_DEVS;
blueswir1363a37d2008-08-21 17:58:08 +00002328 pstrcpy(devname, sizeof(devname), "scsi");
thse4bcb142007-12-02 04:51:10 +00002329 } else {
thsf60d39b2007-12-17 03:55:57 +00002330 type = IF_IDE;
thse4bcb142007-12-02 04:51:10 +00002331 max_devs = MAX_IDE_DEVS;
blueswir1363a37d2008-08-21 17:58:08 +00002332 pstrcpy(devname, sizeof(devname), "ide");
thse4bcb142007-12-02 04:51:10 +00002333 }
2334 media = MEDIA_DISK;
2335
2336 /* extract parameters */
2337
2338 if (get_param_value(buf, sizeof(buf), "bus", str)) {
2339 bus_id = strtol(buf, NULL, 0);
2340 if (bus_id < 0) {
2341 fprintf(stderr, "qemu: '%s' invalid bus id\n", str);
2342 return -1;
2343 }
2344 }
2345
2346 if (get_param_value(buf, sizeof(buf), "unit", str)) {
2347 unit_id = strtol(buf, NULL, 0);
2348 if (unit_id < 0) {
2349 fprintf(stderr, "qemu: '%s' invalid unit id\n", str);
2350 return -1;
2351 }
2352 }
2353
2354 if (get_param_value(buf, sizeof(buf), "if", str)) {
bellardae45d362008-06-11 09:44:44 +00002355 pstrcpy(devname, sizeof(devname), buf);
thse4bcb142007-12-02 04:51:10 +00002356 if (!strcmp(buf, "ide")) {
thsf60d39b2007-12-17 03:55:57 +00002357 type = IF_IDE;
thse4bcb142007-12-02 04:51:10 +00002358 max_devs = MAX_IDE_DEVS;
2359 } else if (!strcmp(buf, "scsi")) {
thsf60d39b2007-12-17 03:55:57 +00002360 type = IF_SCSI;
thse4bcb142007-12-02 04:51:10 +00002361 max_devs = MAX_SCSI_DEVS;
2362 } else if (!strcmp(buf, "floppy")) {
thsf60d39b2007-12-17 03:55:57 +00002363 type = IF_FLOPPY;
thse4bcb142007-12-02 04:51:10 +00002364 max_devs = 0;
2365 } else if (!strcmp(buf, "pflash")) {
thsf60d39b2007-12-17 03:55:57 +00002366 type = IF_PFLASH;
thse4bcb142007-12-02 04:51:10 +00002367 max_devs = 0;
2368 } else if (!strcmp(buf, "mtd")) {
thsf60d39b2007-12-17 03:55:57 +00002369 type = IF_MTD;
thse4bcb142007-12-02 04:51:10 +00002370 max_devs = 0;
2371 } else if (!strcmp(buf, "sd")) {
thsf60d39b2007-12-17 03:55:57 +00002372 type = IF_SD;
thse4bcb142007-12-02 04:51:10 +00002373 max_devs = 0;
aliguori6e02c382008-12-04 19:52:44 +00002374 } else if (!strcmp(buf, "virtio")) {
2375 type = IF_VIRTIO;
2376 max_devs = 0;
aliguori62d23ef2009-04-22 15:19:30 +00002377 } else if (!strcmp(buf, "xen")) {
2378 type = IF_XEN;
2379 max_devs = 0;
2380 } else {
thse4bcb142007-12-02 04:51:10 +00002381 fprintf(stderr, "qemu: '%s' unsupported bus type '%s'\n", str, buf);
2382 return -1;
2383 }
2384 }
2385
2386 if (get_param_value(buf, sizeof(buf), "index", str)) {
2387 index = strtol(buf, NULL, 0);
2388 if (index < 0) {
2389 fprintf(stderr, "qemu: '%s' invalid index\n", str);
2390 return -1;
2391 }
2392 }
2393
2394 if (get_param_value(buf, sizeof(buf), "cyls", str)) {
2395 cyls = strtol(buf, NULL, 0);
2396 }
2397
2398 if (get_param_value(buf, sizeof(buf), "heads", str)) {
2399 heads = strtol(buf, NULL, 0);
2400 }
2401
2402 if (get_param_value(buf, sizeof(buf), "secs", str)) {
2403 secs = strtol(buf, NULL, 0);
2404 }
2405
2406 if (cyls || heads || secs) {
2407 if (cyls < 1 || cyls > 16383) {
2408 fprintf(stderr, "qemu: '%s' invalid physical cyls number\n", str);
2409 return -1;
2410 }
2411 if (heads < 1 || heads > 16) {
2412 fprintf(stderr, "qemu: '%s' invalid physical heads number\n", str);
2413 return -1;
2414 }
2415 if (secs < 1 || secs > 63) {
2416 fprintf(stderr, "qemu: '%s' invalid physical secs number\n", str);
2417 return -1;
2418 }
2419 }
2420
2421 if (get_param_value(buf, sizeof(buf), "trans", str)) {
2422 if (!cyls) {
2423 fprintf(stderr,
2424 "qemu: '%s' trans must be used with cyls,heads and secs\n",
2425 str);
2426 return -1;
2427 }
2428 if (!strcmp(buf, "none"))
2429 translation = BIOS_ATA_TRANSLATION_NONE;
2430 else if (!strcmp(buf, "lba"))
2431 translation = BIOS_ATA_TRANSLATION_LBA;
2432 else if (!strcmp(buf, "auto"))
2433 translation = BIOS_ATA_TRANSLATION_AUTO;
2434 else {
2435 fprintf(stderr, "qemu: '%s' invalid translation type\n", str);
2436 return -1;
2437 }
2438 }
2439
2440 if (get_param_value(buf, sizeof(buf), "media", str)) {
2441 if (!strcmp(buf, "disk")) {
2442 media = MEDIA_DISK;
2443 } else if (!strcmp(buf, "cdrom")) {
2444 if (cyls || secs || heads) {
2445 fprintf(stderr,
2446 "qemu: '%s' invalid physical CHS format\n", str);
2447 return -1;
2448 }
2449 media = MEDIA_CDROM;
2450 } else {
2451 fprintf(stderr, "qemu: '%s' invalid media\n", str);
2452 return -1;
2453 }
2454 }
2455
2456 if (get_param_value(buf, sizeof(buf), "snapshot", str)) {
2457 if (!strcmp(buf, "on"))
2458 snapshot = 1;
2459 else if (!strcmp(buf, "off"))
2460 snapshot = 0;
2461 else {
2462 fprintf(stderr, "qemu: '%s' invalid snapshot option\n", str);
2463 return -1;
2464 }
2465 }
2466
balrog33f00272007-12-24 14:33:24 +00002467 if (get_param_value(buf, sizeof(buf), "cache", str)) {
aliguori9f7965c2008-10-14 14:42:54 +00002468 if (!strcmp(buf, "off") || !strcmp(buf, "none"))
balrog33f00272007-12-24 14:33:24 +00002469 cache = 0;
aliguori9f7965c2008-10-14 14:42:54 +00002470 else if (!strcmp(buf, "writethrough"))
balrog33f00272007-12-24 14:33:24 +00002471 cache = 1;
aliguori9f7965c2008-10-14 14:42:54 +00002472 else if (!strcmp(buf, "writeback"))
2473 cache = 2;
balrog33f00272007-12-24 14:33:24 +00002474 else {
2475 fprintf(stderr, "qemu: invalid cache option\n");
2476 return -1;
2477 }
2478 }
2479
aurel321e72d3b2008-04-28 20:26:45 +00002480 if (get_param_value(buf, sizeof(buf), "format", str)) {
aurel32a1620fa2008-04-29 05:58:01 +00002481 if (strcmp(buf, "?") == 0) {
2482 fprintf(stderr, "qemu: Supported formats:");
2483 bdrv_iterate_format(bdrv_format_print, NULL);
2484 fprintf(stderr, "\n");
2485 return -1;
2486 }
aurel321e72d3b2008-04-28 20:26:45 +00002487 drv = bdrv_find_format(buf);
2488 if (!drv) {
2489 fprintf(stderr, "qemu: '%s' invalid format\n", buf);
2490 return -1;
2491 }
2492 }
2493
balrog609497a2008-01-14 02:56:53 +00002494 if (arg->file == NULL)
2495 get_param_value(file, sizeof(file), "file", str);
2496 else
2497 pstrcpy(file, sizeof(file), arg->file);
thse4bcb142007-12-02 04:51:10 +00002498
aliguorifa879c62009-01-07 17:32:33 +00002499 if (!get_param_value(serial, sizeof(serial), "serial", str))
2500 memset(serial, 0, sizeof(serial));
2501
aliguoricdad4bd2009-02-28 16:51:01 +00002502 onerror = BLOCK_ERR_STOP_ENOSPC;
aliguori428c5702009-01-21 18:59:04 +00002503 if (get_param_value(buf, sizeof(serial), "werror", str)) {
aliguori869a5c62009-01-22 19:52:25 +00002504 if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO) {
aliguoriea8a5d72009-01-22 19:52:21 +00002505 fprintf(stderr, "werror is no supported by this format\n");
aliguori428c5702009-01-21 18:59:04 +00002506 return -1;
2507 }
2508 if (!strcmp(buf, "ignore"))
2509 onerror = BLOCK_ERR_IGNORE;
2510 else if (!strcmp(buf, "enospc"))
2511 onerror = BLOCK_ERR_STOP_ENOSPC;
2512 else if (!strcmp(buf, "stop"))
2513 onerror = BLOCK_ERR_STOP_ANY;
2514 else if (!strcmp(buf, "report"))
2515 onerror = BLOCK_ERR_REPORT;
2516 else {
2517 fprintf(stderr, "qemu: '%s' invalid write error action\n", buf);
2518 return -1;
2519 }
2520 }
2521
thse4bcb142007-12-02 04:51:10 +00002522 /* compute bus and unit according index */
2523
2524 if (index != -1) {
2525 if (bus_id != 0 || unit_id != -1) {
2526 fprintf(stderr,
2527 "qemu: '%s' index cannot be used with bus and unit\n", str);
2528 return -1;
2529 }
2530 if (max_devs == 0)
2531 {
2532 unit_id = index;
2533 bus_id = 0;
2534 } else {
2535 unit_id = index % max_devs;
2536 bus_id = index / max_devs;
2537 }
2538 }
2539
2540 /* if user doesn't specify a unit_id,
2541 * try to find the first free
2542 */
2543
2544 if (unit_id == -1) {
2545 unit_id = 0;
thsf60d39b2007-12-17 03:55:57 +00002546 while (drive_get_index(type, bus_id, unit_id) != -1) {
thse4bcb142007-12-02 04:51:10 +00002547 unit_id++;
2548 if (max_devs && unit_id >= max_devs) {
2549 unit_id -= max_devs;
2550 bus_id++;
2551 }
2552 }
2553 }
2554
2555 /* check unit id */
2556
2557 if (max_devs && unit_id >= max_devs) {
2558 fprintf(stderr, "qemu: '%s' unit %d too big (max is %d)\n",
2559 str, unit_id, max_devs - 1);
2560 return -1;
2561 }
2562
2563 /*
2564 * ignore multiple definitions
2565 */
2566
thsf60d39b2007-12-17 03:55:57 +00002567 if (drive_get_index(type, bus_id, unit_id) != -1)
aliguori4d73cd32009-02-11 15:20:46 +00002568 return -2;
thse4bcb142007-12-02 04:51:10 +00002569
2570 /* init */
2571
thsf60d39b2007-12-17 03:55:57 +00002572 if (type == IF_IDE || type == IF_SCSI)
balrogc8522bd2007-12-06 22:11:20 +00002573 mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd";
balroge6198a72007-12-24 13:58:47 +00002574 if (max_devs)
2575 snprintf(buf, sizeof(buf), "%s%i%s%i",
2576 devname, bus_id, mediastr, unit_id);
2577 else
2578 snprintf(buf, sizeof(buf), "%s%s%i",
2579 devname, mediastr, unit_id);
thse4bcb142007-12-02 04:51:10 +00002580 bdrv = bdrv_new(buf);
aliguori7d5aca92009-02-11 15:19:58 +00002581 drives_table_idx = drive_get_free_idx();
2582 drives_table[drives_table_idx].bdrv = bdrv;
2583 drives_table[drives_table_idx].type = type;
2584 drives_table[drives_table_idx].bus = bus_id;
2585 drives_table[drives_table_idx].unit = unit_id;
2586 drives_table[drives_table_idx].onerror = onerror;
aliguorib01b1112009-02-11 15:20:20 +00002587 drives_table[drives_table_idx].drive_opt_idx = arg - drives_opt;
aliguorifa879c62009-01-07 17:32:33 +00002588 strncpy(drives_table[nb_drives].serial, serial, sizeof(serial));
thse4bcb142007-12-02 04:51:10 +00002589 nb_drives++;
2590
thsf60d39b2007-12-17 03:55:57 +00002591 switch(type) {
thse4bcb142007-12-02 04:51:10 +00002592 case IF_IDE:
2593 case IF_SCSI:
aliguori62d23ef2009-04-22 15:19:30 +00002594 case IF_XEN:
thse4bcb142007-12-02 04:51:10 +00002595 switch(media) {
2596 case MEDIA_DISK:
2597 if (cyls != 0) {
2598 bdrv_set_geometry_hint(bdrv, cyls, heads, secs);
2599 bdrv_set_translation_hint(bdrv, translation);
2600 }
2601 break;
2602 case MEDIA_CDROM:
2603 bdrv_set_type_hint(bdrv, BDRV_TYPE_CDROM);
2604 break;
2605 }
2606 break;
2607 case IF_SD:
2608 /* FIXME: This isn't really a floppy, but it's a reasonable
2609 approximation. */
2610 case IF_FLOPPY:
2611 bdrv_set_type_hint(bdrv, BDRV_TYPE_FLOPPY);
2612 break;
2613 case IF_PFLASH:
2614 case IF_MTD:
aliguori6e02c382008-12-04 19:52:44 +00002615 case IF_VIRTIO:
thse4bcb142007-12-02 04:51:10 +00002616 break;
2617 }
2618 if (!file[0])
aliguori4d73cd32009-02-11 15:20:46 +00002619 return -2;
balrog33f00272007-12-24 14:33:24 +00002620 bdrv_flags = 0;
aliguori9f7965c2008-10-14 14:42:54 +00002621 if (snapshot) {
balrog33f00272007-12-24 14:33:24 +00002622 bdrv_flags |= BDRV_O_SNAPSHOT;
aliguori9f7965c2008-10-14 14:42:54 +00002623 cache = 2; /* always use write-back with snapshot */
2624 }
2625 if (cache == 0) /* no caching */
2626 bdrv_flags |= BDRV_O_NOCACHE;
2627 else if (cache == 2) /* write-back */
2628 bdrv_flags |= BDRV_O_CACHE_WB;
aliguori4dc822d2008-12-04 21:39:21 +00002629 else if (cache == 3) /* not specified */
2630 bdrv_flags |= BDRV_O_CACHE_DEF;
aliguoric0f4ce72009-03-05 23:01:01 +00002631 if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0) {
thse4bcb142007-12-02 04:51:10 +00002632 fprintf(stderr, "qemu: could not open disk image %s\n",
2633 file);
2634 return -1;
2635 }
aliguoric0f4ce72009-03-05 23:01:01 +00002636 if (bdrv_key_required(bdrv))
2637 autostart = 0;
aliguori4d73cd32009-02-11 15:20:46 +00002638 return drives_table_idx;
thse4bcb142007-12-02 04:51:10 +00002639}
2640
aliguori268a3622009-04-21 22:30:27 +00002641static void numa_add(const char *optarg)
2642{
2643 char option[128];
2644 char *endptr;
2645 unsigned long long value, endvalue;
2646 int nodenr;
2647
2648 optarg = get_opt_name(option, 128, optarg, ',') + 1;
2649 if (!strcmp(option, "node")) {
2650 if (get_param_value(option, 128, "nodeid", optarg) == 0) {
2651 nodenr = nb_numa_nodes;
2652 } else {
2653 nodenr = strtoull(option, NULL, 10);
2654 }
2655
2656 if (get_param_value(option, 128, "mem", optarg) == 0) {
2657 node_mem[nodenr] = 0;
2658 } else {
2659 value = strtoull(option, &endptr, 0);
2660 switch (*endptr) {
2661 case 0: case 'M': case 'm':
2662 value <<= 20;
2663 break;
2664 case 'G': case 'g':
2665 value <<= 30;
2666 break;
2667 }
2668 node_mem[nodenr] = value;
2669 }
2670 if (get_param_value(option, 128, "cpus", optarg) == 0) {
2671 node_cpumask[nodenr] = 0;
2672 } else {
2673 value = strtoull(option, &endptr, 10);
2674 if (value >= 64) {
2675 value = 63;
2676 fprintf(stderr, "only 64 CPUs in NUMA mode supported.\n");
2677 } else {
2678 if (*endptr == '-') {
2679 endvalue = strtoull(endptr+1, &endptr, 10);
2680 if (endvalue >= 63) {
2681 endvalue = 62;
2682 fprintf(stderr,
2683 "only 63 CPUs in NUMA mode supported.\n");
2684 }
2685 value = (1 << (endvalue + 1)) - (1 << value);
2686 } else {
2687 value = 1 << value;
2688 }
2689 }
2690 node_cpumask[nodenr] = value;
2691 }
2692 nb_numa_nodes++;
2693 }
2694 return;
2695}
2696
bellard330d0412003-07-26 18:11:40 +00002697/***********************************************************/
bellarda594cfb2005-11-06 16:13:29 +00002698/* USB devices */
2699
pbrook0d92ed32006-05-21 16:30:15 +00002700static USBPort *used_usb_ports;
2701static USBPort *free_usb_ports;
2702
2703/* ??? Maybe change this to register a hub to keep track of the topology. */
2704void qemu_register_usb_port(USBPort *port, void *opaque, int index,
2705 usb_attachfn attach)
2706{
2707 port->opaque = opaque;
2708 port->index = index;
2709 port->attach = attach;
2710 port->next = free_usb_ports;
2711 free_usb_ports = port;
2712}
2713
aliguori4b096fc2008-08-21 19:28:55 +00002714int usb_device_add_dev(USBDevice *dev)
2715{
2716 USBPort *port;
2717
2718 /* Find a USB port to add the device to. */
2719 port = free_usb_ports;
2720 if (!port->next) {
2721 USBDevice *hub;
2722
2723 /* Create a new hub and chain it on. */
2724 free_usb_ports = NULL;
2725 port->next = used_usb_ports;
2726 used_usb_ports = port;
2727
2728 hub = usb_hub_init(VM_USB_HUB_SIZE);
2729 usb_attach(port, hub);
2730 port = free_usb_ports;
2731 }
2732
2733 free_usb_ports = port->next;
2734 port->next = used_usb_ports;
2735 used_usb_ports = port;
2736 usb_attach(port, dev);
2737 return 0;
2738}
2739
aliguoribb5fc202009-03-05 23:01:15 +00002740static void usb_msd_password_cb(void *opaque, int err)
2741{
2742 USBDevice *dev = opaque;
2743
2744 if (!err)
2745 usb_device_add_dev(dev);
2746 else
2747 dev->handle_destroy(dev);
2748}
2749
aliguoric0f4ce72009-03-05 23:01:01 +00002750static int usb_device_add(const char *devname, int is_hotplug)
bellarda594cfb2005-11-06 16:13:29 +00002751{
2752 const char *p;
2753 USBDevice *dev;
bellarda594cfb2005-11-06 16:13:29 +00002754
pbrook0d92ed32006-05-21 16:30:15 +00002755 if (!free_usb_ports)
bellarda594cfb2005-11-06 16:13:29 +00002756 return -1;
2757
2758 if (strstart(devname, "host:", &p)) {
2759 dev = usb_host_device_open(p);
bellarda594cfb2005-11-06 16:13:29 +00002760 } else if (!strcmp(devname, "mouse")) {
2761 dev = usb_mouse_init();
bellard09b26c52006-04-12 21:09:08 +00002762 } else if (!strcmp(devname, "tablet")) {
balrog47b2d332007-06-22 08:16:00 +00002763 dev = usb_tablet_init();
2764 } else if (!strcmp(devname, "keyboard")) {
2765 dev = usb_keyboard_init();
pbrook2e5d83b2006-05-25 23:58:51 +00002766 } else if (strstart(devname, "disk:", &p)) {
aliguoric0f4ce72009-03-05 23:01:01 +00002767 BlockDriverState *bs;
2768
aliguoribb5fc202009-03-05 23:01:15 +00002769 dev = usb_msd_init(p);
aliguoric0f4ce72009-03-05 23:01:01 +00002770 if (!dev)
2771 return -1;
aliguoribb5fc202009-03-05 23:01:15 +00002772 bs = usb_msd_get_bdrv(dev);
aliguoric0f4ce72009-03-05 23:01:01 +00002773 if (bdrv_key_required(bs)) {
2774 autostart = 0;
aliguoribb5fc202009-03-05 23:01:15 +00002775 if (is_hotplug) {
aliguori376253e2009-03-05 23:01:23 +00002776 monitor_read_bdrv_key_start(cur_mon, bs, usb_msd_password_cb,
2777 dev);
aliguoribb5fc202009-03-05 23:01:15 +00002778 return 0;
aliguoric0f4ce72009-03-05 23:01:01 +00002779 }
2780 }
balrogf6d2a312007-06-10 19:21:04 +00002781 } else if (!strcmp(devname, "wacom-tablet")) {
2782 dev = usb_wacom_init();
balroga7954212008-01-14 03:41:02 +00002783 } else if (strstart(devname, "serial:", &p)) {
2784 dev = usb_serial_init(p);
aurel322e4d9fb2008-04-08 06:01:02 +00002785#ifdef CONFIG_BRLAPI
2786 } else if (!strcmp(devname, "braille")) {
2787 dev = usb_baum_init();
2788#endif
balrog6c9f8862008-07-17 20:47:13 +00002789 } else if (strstart(devname, "net:", &p)) {
balrog9ad97e62008-07-29 13:16:31 +00002790 int nic = nb_nics;
balrog6c9f8862008-07-17 20:47:13 +00002791
balrog9ad97e62008-07-29 13:16:31 +00002792 if (net_client_init("nic", p) < 0)
balrog6c9f8862008-07-17 20:47:13 +00002793 return -1;
balrog9ad97e62008-07-29 13:16:31 +00002794 nd_table[nic].model = "usb";
2795 dev = usb_net_init(&nd_table[nic]);
balrogdc72ac12008-11-09 00:04:26 +00002796 } else if (!strcmp(devname, "bt") || strstart(devname, "bt:", &p)) {
2797 dev = usb_bt_init(devname[2] ? hci_init(p) :
2798 bt_new_hci(qemu_find_bt_vlan(0)));
bellarda594cfb2005-11-06 16:13:29 +00002799 } else {
2800 return -1;
2801 }
pbrook0d92ed32006-05-21 16:30:15 +00002802 if (!dev)
2803 return -1;
2804
aliguori4b096fc2008-08-21 19:28:55 +00002805 return usb_device_add_dev(dev);
bellarda594cfb2005-11-06 16:13:29 +00002806}
2807
aliguori1f3870a2008-08-21 19:27:48 +00002808int usb_device_del_addr(int bus_num, int addr)
bellarda594cfb2005-11-06 16:13:29 +00002809{
pbrook0d92ed32006-05-21 16:30:15 +00002810 USBPort *port;
2811 USBPort **lastp;
bellard059809e2006-07-19 18:06:15 +00002812 USBDevice *dev;
bellarda594cfb2005-11-06 16:13:29 +00002813
pbrook0d92ed32006-05-21 16:30:15 +00002814 if (!used_usb_ports)
bellarda594cfb2005-11-06 16:13:29 +00002815 return -1;
2816
bellarda594cfb2005-11-06 16:13:29 +00002817 if (bus_num != 0)
2818 return -1;
pbrook0d92ed32006-05-21 16:30:15 +00002819
2820 lastp = &used_usb_ports;
2821 port = used_usb_ports;
2822 while (port && port->dev->addr != addr) {
2823 lastp = &port->next;
2824 port = port->next;
bellarda594cfb2005-11-06 16:13:29 +00002825 }
pbrook0d92ed32006-05-21 16:30:15 +00002826
2827 if (!port)
bellarda594cfb2005-11-06 16:13:29 +00002828 return -1;
pbrook0d92ed32006-05-21 16:30:15 +00002829
bellard059809e2006-07-19 18:06:15 +00002830 dev = port->dev;
pbrook0d92ed32006-05-21 16:30:15 +00002831 *lastp = port->next;
2832 usb_attach(port, NULL);
bellard059809e2006-07-19 18:06:15 +00002833 dev->handle_destroy(dev);
pbrook0d92ed32006-05-21 16:30:15 +00002834 port->next = free_usb_ports;
2835 free_usb_ports = port;
bellarda594cfb2005-11-06 16:13:29 +00002836 return 0;
2837}
2838
aliguori1f3870a2008-08-21 19:27:48 +00002839static int usb_device_del(const char *devname)
2840{
2841 int bus_num, addr;
2842 const char *p;
2843
aliguori5d0c5752008-09-14 01:07:41 +00002844 if (strstart(devname, "host:", &p))
2845 return usb_host_device_close(p);
2846
aliguori1f3870a2008-08-21 19:27:48 +00002847 if (!used_usb_ports)
2848 return -1;
2849
2850 p = strchr(devname, '.');
2851 if (!p)
2852 return -1;
2853 bus_num = strtoul(devname, NULL, 0);
2854 addr = strtoul(p + 1, NULL, 0);
2855
2856 return usb_device_del_addr(bus_num, addr);
2857}
2858
aliguori376253e2009-03-05 23:01:23 +00002859void do_usb_add(Monitor *mon, const char *devname)
bellarda594cfb2005-11-06 16:13:29 +00002860{
aliguoric0f4ce72009-03-05 23:01:01 +00002861 usb_device_add(devname, 1);
bellarda594cfb2005-11-06 16:13:29 +00002862}
2863
aliguori376253e2009-03-05 23:01:23 +00002864void do_usb_del(Monitor *mon, const char *devname)
bellarda594cfb2005-11-06 16:13:29 +00002865{
aliguori4b096fc2008-08-21 19:28:55 +00002866 usb_device_del(devname);
bellarda594cfb2005-11-06 16:13:29 +00002867}
2868
aliguori376253e2009-03-05 23:01:23 +00002869void usb_info(Monitor *mon)
bellarda594cfb2005-11-06 16:13:29 +00002870{
2871 USBDevice *dev;
pbrook0d92ed32006-05-21 16:30:15 +00002872 USBPort *port;
bellarda594cfb2005-11-06 16:13:29 +00002873 const char *speed_str;
2874
pbrook0d92ed32006-05-21 16:30:15 +00002875 if (!usb_enabled) {
aliguori376253e2009-03-05 23:01:23 +00002876 monitor_printf(mon, "USB support not enabled\n");
bellarda594cfb2005-11-06 16:13:29 +00002877 return;
2878 }
2879
pbrook0d92ed32006-05-21 16:30:15 +00002880 for (port = used_usb_ports; port; port = port->next) {
2881 dev = port->dev;
2882 if (!dev)
2883 continue;
2884 switch(dev->speed) {
ths5fafdf22007-09-16 21:08:06 +00002885 case USB_SPEED_LOW:
2886 speed_str = "1.5";
pbrook0d92ed32006-05-21 16:30:15 +00002887 break;
ths5fafdf22007-09-16 21:08:06 +00002888 case USB_SPEED_FULL:
2889 speed_str = "12";
pbrook0d92ed32006-05-21 16:30:15 +00002890 break;
ths5fafdf22007-09-16 21:08:06 +00002891 case USB_SPEED_HIGH:
2892 speed_str = "480";
pbrook0d92ed32006-05-21 16:30:15 +00002893 break;
2894 default:
ths5fafdf22007-09-16 21:08:06 +00002895 speed_str = "?";
pbrook0d92ed32006-05-21 16:30:15 +00002896 break;
bellarda594cfb2005-11-06 16:13:29 +00002897 }
aliguori376253e2009-03-05 23:01:23 +00002898 monitor_printf(mon, " Device %d.%d, Speed %s Mb/s, Product %s\n",
2899 0, dev->addr, speed_str, dev->devname);
bellarda594cfb2005-11-06 16:13:29 +00002900 }
2901}
2902
bellardf7cce892004-12-08 22:21:25 +00002903/***********************************************************/
balrog201a51f2007-04-30 00:51:09 +00002904/* PCMCIA/Cardbus */
2905
2906static struct pcmcia_socket_entry_s {
2907 struct pcmcia_socket_s *socket;
2908 struct pcmcia_socket_entry_s *next;
2909} *pcmcia_sockets = 0;
2910
2911void pcmcia_socket_register(struct pcmcia_socket_s *socket)
2912{
2913 struct pcmcia_socket_entry_s *entry;
2914
2915 entry = qemu_malloc(sizeof(struct pcmcia_socket_entry_s));
2916 entry->socket = socket;
2917 entry->next = pcmcia_sockets;
2918 pcmcia_sockets = entry;
2919}
2920
2921void pcmcia_socket_unregister(struct pcmcia_socket_s *socket)
2922{
2923 struct pcmcia_socket_entry_s *entry, **ptr;
2924
2925 ptr = &pcmcia_sockets;
2926 for (entry = *ptr; entry; ptr = &entry->next, entry = *ptr)
2927 if (entry->socket == socket) {
2928 *ptr = entry->next;
2929 qemu_free(entry);
2930 }
2931}
2932
aliguori376253e2009-03-05 23:01:23 +00002933void pcmcia_info(Monitor *mon)
balrog201a51f2007-04-30 00:51:09 +00002934{
2935 struct pcmcia_socket_entry_s *iter;
aliguori376253e2009-03-05 23:01:23 +00002936
balrog201a51f2007-04-30 00:51:09 +00002937 if (!pcmcia_sockets)
aliguori376253e2009-03-05 23:01:23 +00002938 monitor_printf(mon, "No PCMCIA sockets\n");
balrog201a51f2007-04-30 00:51:09 +00002939
2940 for (iter = pcmcia_sockets; iter; iter = iter->next)
aliguori376253e2009-03-05 23:01:23 +00002941 monitor_printf(mon, "%s: %s\n", iter->socket->slot_string,
2942 iter->socket->attached ? iter->socket->card_string :
2943 "Empty");
balrog201a51f2007-04-30 00:51:09 +00002944}
2945
2946/***********************************************************/
aliguori3023f332009-01-16 19:04:14 +00002947/* register display */
2948
aliguori7b5d76d2009-03-13 15:02:13 +00002949struct DisplayAllocator default_allocator = {
2950 defaultallocator_create_displaysurface,
2951 defaultallocator_resize_displaysurface,
2952 defaultallocator_free_displaysurface
2953};
2954
aliguori3023f332009-01-16 19:04:14 +00002955void register_displaystate(DisplayState *ds)
2956{
2957 DisplayState **s;
2958 s = &display_state;
2959 while (*s != NULL)
2960 s = &(*s)->next;
2961 ds->next = NULL;
2962 *s = ds;
2963}
2964
2965DisplayState *get_displaystate(void)
2966{
2967 return display_state;
2968}
2969
aliguori7b5d76d2009-03-13 15:02:13 +00002970DisplayAllocator *register_displayallocator(DisplayState *ds, DisplayAllocator *da)
2971{
2972 if(ds->allocator == &default_allocator) ds->allocator = da;
2973 return ds->allocator;
2974}
2975
ths2ff89792007-06-21 23:34:19 +00002976/* dumb display */
2977
aliguori8f391ab2009-01-19 16:34:10 +00002978static void dumb_display_init(void)
ths2ff89792007-06-21 23:34:19 +00002979{
aliguori8f391ab2009-01-19 16:34:10 +00002980 DisplayState *ds = qemu_mallocz(sizeof(DisplayState));
aliguori7b5d76d2009-03-13 15:02:13 +00002981 ds->allocator = &default_allocator;
2982 ds->surface = qemu_create_displaysurface(ds, 640, 480);
aliguori8f391ab2009-01-19 16:34:10 +00002983 register_displaystate(ds);
ths2ff89792007-06-21 23:34:19 +00002984}
2985
2986/***********************************************************/
bellard8a7ddc32004-03-31 19:00:16 +00002987/* I/O handling */
bellard0824d6f2003-06-24 13:42:40 +00002988
bellardc4b1fcc2004-03-14 21:44:30 +00002989typedef struct IOHandlerRecord {
2990 int fd;
bellard7c9d8e02005-11-15 22:16:05 +00002991 IOCanRWHandler *fd_read_poll;
2992 IOHandler *fd_read;
2993 IOHandler *fd_write;
thscafffd42007-02-28 21:59:44 +00002994 int deleted;
bellardc4b1fcc2004-03-14 21:44:30 +00002995 void *opaque;
2996 /* temporary data */
2997 struct pollfd *ufd;
bellard8a7ddc32004-03-31 19:00:16 +00002998 struct IOHandlerRecord *next;
bellardc4b1fcc2004-03-14 21:44:30 +00002999} IOHandlerRecord;
3000
bellard8a7ddc32004-03-31 19:00:16 +00003001static IOHandlerRecord *first_io_handler;
bellardc4b1fcc2004-03-14 21:44:30 +00003002
bellard7c9d8e02005-11-15 22:16:05 +00003003/* XXX: fd_read_poll should be suppressed, but an API change is
3004 necessary in the character devices to suppress fd_can_read(). */
ths5fafdf22007-09-16 21:08:06 +00003005int qemu_set_fd_handler2(int fd,
3006 IOCanRWHandler *fd_read_poll,
3007 IOHandler *fd_read,
3008 IOHandler *fd_write,
bellard7c9d8e02005-11-15 22:16:05 +00003009 void *opaque)
bellardb4608c02003-06-27 17:34:32 +00003010{
bellard8a7ddc32004-03-31 19:00:16 +00003011 IOHandlerRecord **pioh, *ioh;
3012
bellard7c9d8e02005-11-15 22:16:05 +00003013 if (!fd_read && !fd_write) {
3014 pioh = &first_io_handler;
3015 for(;;) {
3016 ioh = *pioh;
3017 if (ioh == NULL)
3018 break;
3019 if (ioh->fd == fd) {
thscafffd42007-02-28 21:59:44 +00003020 ioh->deleted = 1;
bellard7c9d8e02005-11-15 22:16:05 +00003021 break;
3022 }
3023 pioh = &ioh->next;
bellard8a7ddc32004-03-31 19:00:16 +00003024 }
bellard7c9d8e02005-11-15 22:16:05 +00003025 } else {
3026 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
3027 if (ioh->fd == fd)
3028 goto found;
3029 }
3030 ioh = qemu_mallocz(sizeof(IOHandlerRecord));
bellard7c9d8e02005-11-15 22:16:05 +00003031 ioh->next = first_io_handler;
3032 first_io_handler = ioh;
3033 found:
3034 ioh->fd = fd;
3035 ioh->fd_read_poll = fd_read_poll;
3036 ioh->fd_read = fd_read;
3037 ioh->fd_write = fd_write;
3038 ioh->opaque = opaque;
thscafffd42007-02-28 21:59:44 +00003039 ioh->deleted = 0;
bellard8a7ddc32004-03-31 19:00:16 +00003040 }
bellard7c9d8e02005-11-15 22:16:05 +00003041 return 0;
3042}
3043
ths5fafdf22007-09-16 21:08:06 +00003044int qemu_set_fd_handler(int fd,
3045 IOHandler *fd_read,
3046 IOHandler *fd_write,
bellard7c9d8e02005-11-15 22:16:05 +00003047 void *opaque)
3048{
3049 return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
bellardb4608c02003-06-27 17:34:32 +00003050}
3051
aliguori56f3a5d2008-10-31 18:07:17 +00003052#ifdef _WIN32
bellard8a7ddc32004-03-31 19:00:16 +00003053/***********************************************************/
bellardf3311102006-04-12 20:21:17 +00003054/* Polling handling */
3055
3056typedef struct PollingEntry {
3057 PollingFunc *func;
3058 void *opaque;
3059 struct PollingEntry *next;
3060} PollingEntry;
3061
3062static PollingEntry *first_polling_entry;
3063
3064int qemu_add_polling_cb(PollingFunc *func, void *opaque)
3065{
3066 PollingEntry **ppe, *pe;
3067 pe = qemu_mallocz(sizeof(PollingEntry));
bellardf3311102006-04-12 20:21:17 +00003068 pe->func = func;
3069 pe->opaque = opaque;
3070 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
3071 *ppe = pe;
3072 return 0;
3073}
3074
3075void qemu_del_polling_cb(PollingFunc *func, void *opaque)
3076{
3077 PollingEntry **ppe, *pe;
3078 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
3079 pe = *ppe;
3080 if (pe->func == func && pe->opaque == opaque) {
3081 *ppe = pe->next;
3082 qemu_free(pe);
3083 break;
3084 }
3085 }
3086}
3087
bellarda18e5242006-06-25 17:18:27 +00003088/***********************************************************/
3089/* Wait objects support */
3090typedef struct WaitObjects {
3091 int num;
3092 HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
3093 WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
3094 void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
3095} WaitObjects;
3096
3097static WaitObjects wait_objects = {0};
ths3b46e622007-09-17 08:09:54 +00003098
bellarda18e5242006-06-25 17:18:27 +00003099int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
3100{
3101 WaitObjects *w = &wait_objects;
3102
3103 if (w->num >= MAXIMUM_WAIT_OBJECTS)
3104 return -1;
3105 w->events[w->num] = handle;
3106 w->func[w->num] = func;
3107 w->opaque[w->num] = opaque;
3108 w->num++;
3109 return 0;
3110}
3111
3112void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
3113{
3114 int i, found;
3115 WaitObjects *w = &wait_objects;
3116
3117 found = 0;
3118 for (i = 0; i < w->num; i++) {
3119 if (w->events[i] == handle)
3120 found = 1;
3121 if (found) {
3122 w->events[i] = w->events[i + 1];
3123 w->func[i] = w->func[i + 1];
3124 w->opaque[i] = w->opaque[i + 1];
ths3b46e622007-09-17 08:09:54 +00003125 }
bellarda18e5242006-06-25 17:18:27 +00003126 }
3127 if (found)
3128 w->num--;
3129}
3130#endif
3131
bellard8a7ddc32004-03-31 19:00:16 +00003132/***********************************************************/
bellard8a7ddc32004-03-31 19:00:16 +00003133/* ram save/restore */
3134
bellard8a7ddc32004-03-31 19:00:16 +00003135static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
3136{
3137 int v;
3138
3139 v = qemu_get_byte(f);
3140 switch(v) {
3141 case 0:
3142 if (qemu_get_buffer(f, buf, len) != len)
3143 return -EIO;
3144 break;
3145 case 1:
3146 v = qemu_get_byte(f);
3147 memset(buf, v, len);
3148 break;
3149 default:
3150 return -EINVAL;
3151 }
aliguori871d2f02008-10-13 03:07:56 +00003152
3153 if (qemu_file_has_error(f))
3154 return -EIO;
3155
bellard8a7ddc32004-03-31 19:00:16 +00003156 return 0;
3157}
3158
bellardc88676f2006-08-06 13:36:11 +00003159static int ram_load_v1(QEMUFile *f, void *opaque)
bellard8a7ddc32004-03-31 19:00:16 +00003160{
aurel3200f82b82008-04-27 21:12:55 +00003161 int ret;
3162 ram_addr_t i;
bellard8a7ddc32004-03-31 19:00:16 +00003163
pbrook94a6b542009-04-11 17:15:54 +00003164 if (qemu_get_be32(f) != last_ram_offset)
bellard8a7ddc32004-03-31 19:00:16 +00003165 return -EINVAL;
pbrook94a6b542009-04-11 17:15:54 +00003166 for(i = 0; i < last_ram_offset; i+= TARGET_PAGE_SIZE) {
pbrook5579c7f2009-04-11 14:47:08 +00003167 ret = ram_get_page(f, qemu_get_ram_ptr(i), TARGET_PAGE_SIZE);
bellard8a7ddc32004-03-31 19:00:16 +00003168 if (ret)
3169 return ret;
3170 }
3171 return 0;
3172}
3173
bellardc88676f2006-08-06 13:36:11 +00003174#define BDRV_HASH_BLOCK_SIZE 1024
3175#define IOBUF_SIZE 4096
3176#define RAM_CBLOCK_MAGIC 0xfabe
3177
bellardc88676f2006-08-06 13:36:11 +00003178typedef struct RamDecompressState {
3179 z_stream zstream;
3180 QEMUFile *f;
3181 uint8_t buf[IOBUF_SIZE];
3182} RamDecompressState;
3183
3184static int ram_decompress_open(RamDecompressState *s, QEMUFile *f)
3185{
3186 int ret;
3187 memset(s, 0, sizeof(*s));
3188 s->f = f;
3189 ret = inflateInit(&s->zstream);
3190 if (ret != Z_OK)
3191 return -1;
3192 return 0;
3193}
3194
3195static int ram_decompress_buf(RamDecompressState *s, uint8_t *buf, int len)
3196{
3197 int ret, clen;
3198
3199 s->zstream.avail_out = len;
3200 s->zstream.next_out = buf;
3201 while (s->zstream.avail_out > 0) {
3202 if (s->zstream.avail_in == 0) {
3203 if (qemu_get_be16(s->f) != RAM_CBLOCK_MAGIC)
3204 return -1;
3205 clen = qemu_get_be16(s->f);
3206 if (clen > IOBUF_SIZE)
3207 return -1;
3208 qemu_get_buffer(s->f, s->buf, clen);
3209 s->zstream.avail_in = clen;
3210 s->zstream.next_in = s->buf;
3211 }
3212 ret = inflate(&s->zstream, Z_PARTIAL_FLUSH);
3213 if (ret != Z_OK && ret != Z_STREAM_END) {
3214 return -1;
3215 }
3216 }
3217 return 0;
3218}
3219
3220static void ram_decompress_close(RamDecompressState *s)
3221{
3222 inflateEnd(&s->zstream);
3223}
3224
aliguori475e4272008-10-06 20:21:51 +00003225#define RAM_SAVE_FLAG_FULL 0x01
3226#define RAM_SAVE_FLAG_COMPRESS 0x02
3227#define RAM_SAVE_FLAG_MEM_SIZE 0x04
3228#define RAM_SAVE_FLAG_PAGE 0x08
3229#define RAM_SAVE_FLAG_EOS 0x10
3230
3231static int is_dup_page(uint8_t *page, uint8_t ch)
bellardc88676f2006-08-06 13:36:11 +00003232{
aliguori475e4272008-10-06 20:21:51 +00003233 uint32_t val = ch << 24 | ch << 16 | ch << 8 | ch;
3234 uint32_t *array = (uint32_t *)page;
3235 int i;
ths3b46e622007-09-17 08:09:54 +00003236
aliguori475e4272008-10-06 20:21:51 +00003237 for (i = 0; i < (TARGET_PAGE_SIZE / 4); i++) {
3238 if (array[i] != val)
3239 return 0;
bellardc88676f2006-08-06 13:36:11 +00003240 }
aliguori475e4272008-10-06 20:21:51 +00003241
3242 return 1;
bellardc88676f2006-08-06 13:36:11 +00003243}
3244
aliguori475e4272008-10-06 20:21:51 +00003245static int ram_save_block(QEMUFile *f)
3246{
3247 static ram_addr_t current_addr = 0;
3248 ram_addr_t saved_addr = current_addr;
3249 ram_addr_t addr = 0;
3250 int found = 0;
3251
pbrook94a6b542009-04-11 17:15:54 +00003252 while (addr < last_ram_offset) {
aliguori475e4272008-10-06 20:21:51 +00003253 if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) {
pbrook5579c7f2009-04-11 14:47:08 +00003254 uint8_t *p;
aliguori475e4272008-10-06 20:21:51 +00003255
3256 cpu_physical_memory_reset_dirty(current_addr,
3257 current_addr + TARGET_PAGE_SIZE,
3258 MIGRATION_DIRTY_FLAG);
3259
pbrook5579c7f2009-04-11 14:47:08 +00003260 p = qemu_get_ram_ptr(current_addr);
aliguori475e4272008-10-06 20:21:51 +00003261
pbrook5579c7f2009-04-11 14:47:08 +00003262 if (is_dup_page(p, *p)) {
aliguori475e4272008-10-06 20:21:51 +00003263 qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_COMPRESS);
pbrook5579c7f2009-04-11 14:47:08 +00003264 qemu_put_byte(f, *p);
aliguori475e4272008-10-06 20:21:51 +00003265 } else {
3266 qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_PAGE);
pbrook5579c7f2009-04-11 14:47:08 +00003267 qemu_put_buffer(f, p, TARGET_PAGE_SIZE);
aliguori475e4272008-10-06 20:21:51 +00003268 }
3269
3270 found = 1;
3271 break;
3272 }
3273 addr += TARGET_PAGE_SIZE;
pbrook94a6b542009-04-11 17:15:54 +00003274 current_addr = (saved_addr + addr) % last_ram_offset;
aliguori475e4272008-10-06 20:21:51 +00003275 }
3276
3277 return found;
3278}
3279
3280static ram_addr_t ram_save_threshold = 10;
3281
3282static ram_addr_t ram_save_remaining(void)
3283{
3284 ram_addr_t addr;
3285 ram_addr_t count = 0;
3286
pbrook94a6b542009-04-11 17:15:54 +00003287 for (addr = 0; addr < last_ram_offset; addr += TARGET_PAGE_SIZE) {
aliguori475e4272008-10-06 20:21:51 +00003288 if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
3289 count++;
3290 }
3291
3292 return count;
3293}
3294
3295static int ram_save_live(QEMUFile *f, int stage, void *opaque)
3296{
3297 ram_addr_t addr;
3298
3299 if (stage == 1) {
3300 /* Make sure all dirty bits are set */
pbrook94a6b542009-04-11 17:15:54 +00003301 for (addr = 0; addr < last_ram_offset; addr += TARGET_PAGE_SIZE) {
aliguori475e4272008-10-06 20:21:51 +00003302 if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
3303 cpu_physical_memory_set_dirty(addr);
3304 }
3305
3306 /* Enable dirty memory tracking */
3307 cpu_physical_memory_set_dirty_tracking(1);
3308
pbrook94a6b542009-04-11 17:15:54 +00003309 qemu_put_be64(f, last_ram_offset | RAM_SAVE_FLAG_MEM_SIZE);
aliguori475e4272008-10-06 20:21:51 +00003310 }
3311
3312 while (!qemu_file_rate_limit(f)) {
3313 int ret;
3314
3315 ret = ram_save_block(f);
3316 if (ret == 0) /* no more blocks */
3317 break;
3318 }
3319
3320 /* try transferring iterative blocks of memory */
3321
3322 if (stage == 3) {
aliguori475e4272008-10-06 20:21:51 +00003323
3324 /* flush all remaining blocks regardless of rate limiting */
3325 while (ram_save_block(f) != 0);
aliguori8215e912009-04-05 19:30:55 +00003326 cpu_physical_memory_set_dirty_tracking(0);
aliguori475e4272008-10-06 20:21:51 +00003327 }
3328
3329 qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
3330
3331 return (stage == 2) && (ram_save_remaining() < ram_save_threshold);
3332}
3333
3334static int ram_load_dead(QEMUFile *f, void *opaque)
bellardc88676f2006-08-06 13:36:11 +00003335{
3336 RamDecompressState s1, *s = &s1;
3337 uint8_t buf[10];
aurel3200f82b82008-04-27 21:12:55 +00003338 ram_addr_t i;
bellardc88676f2006-08-06 13:36:11 +00003339
bellardc88676f2006-08-06 13:36:11 +00003340 if (ram_decompress_open(s, f) < 0)
3341 return -EINVAL;
pbrook94a6b542009-04-11 17:15:54 +00003342 for(i = 0; i < last_ram_offset; i+= BDRV_HASH_BLOCK_SIZE) {
bellardc88676f2006-08-06 13:36:11 +00003343 if (ram_decompress_buf(s, buf, 1) < 0) {
3344 fprintf(stderr, "Error while reading ram block header\n");
3345 goto error;
3346 }
3347 if (buf[0] == 0) {
pbrook5579c7f2009-04-11 14:47:08 +00003348 if (ram_decompress_buf(s, qemu_get_ram_ptr(i),
3349 BDRV_HASH_BLOCK_SIZE) < 0) {
aurel3200f82b82008-04-27 21:12:55 +00003350 fprintf(stderr, "Error while reading ram block address=0x%08" PRIx64, (uint64_t)i);
bellardc88676f2006-08-06 13:36:11 +00003351 goto error;
3352 }
aliguori475e4272008-10-06 20:21:51 +00003353 } else {
bellardc88676f2006-08-06 13:36:11 +00003354 error:
3355 printf("Error block header\n");
3356 return -EINVAL;
3357 }
3358 }
3359 ram_decompress_close(s);
aliguori475e4272008-10-06 20:21:51 +00003360
3361 return 0;
3362}
3363
3364static int ram_load(QEMUFile *f, void *opaque, int version_id)
3365{
3366 ram_addr_t addr;
3367 int flags;
3368
3369 if (version_id == 1)
3370 return ram_load_v1(f, opaque);
3371
3372 if (version_id == 2) {
pbrook94a6b542009-04-11 17:15:54 +00003373 if (qemu_get_be32(f) != last_ram_offset)
aliguori475e4272008-10-06 20:21:51 +00003374 return -EINVAL;
3375 return ram_load_dead(f, opaque);
3376 }
3377
3378 if (version_id != 3)
3379 return -EINVAL;
3380
3381 do {
3382 addr = qemu_get_be64(f);
3383
3384 flags = addr & ~TARGET_PAGE_MASK;
3385 addr &= TARGET_PAGE_MASK;
3386
3387 if (flags & RAM_SAVE_FLAG_MEM_SIZE) {
pbrook94a6b542009-04-11 17:15:54 +00003388 if (addr != last_ram_offset)
aliguori475e4272008-10-06 20:21:51 +00003389 return -EINVAL;
3390 }
3391
3392 if (flags & RAM_SAVE_FLAG_FULL) {
3393 if (ram_load_dead(f, opaque) < 0)
3394 return -EINVAL;
3395 }
3396
3397 if (flags & RAM_SAVE_FLAG_COMPRESS) {
3398 uint8_t ch = qemu_get_byte(f);
pbrook5579c7f2009-04-11 14:47:08 +00003399 memset(qemu_get_ram_ptr(addr), ch, TARGET_PAGE_SIZE);
aliguori475e4272008-10-06 20:21:51 +00003400 } else if (flags & RAM_SAVE_FLAG_PAGE)
pbrook5579c7f2009-04-11 14:47:08 +00003401 qemu_get_buffer(f, qemu_get_ram_ptr(addr), TARGET_PAGE_SIZE);
aliguori475e4272008-10-06 20:21:51 +00003402 } while (!(flags & RAM_SAVE_FLAG_EOS));
3403
bellardc88676f2006-08-06 13:36:11 +00003404 return 0;
3405}
3406
aliguori9e472e12008-10-08 19:50:24 +00003407void qemu_service_io(void)
3408{
aliguorid9f75a42009-04-24 18:03:11 +00003409 qemu_notify_event();
aliguori9e472e12008-10-08 19:50:24 +00003410}
3411
bellard8a7ddc32004-03-31 19:00:16 +00003412/***********************************************************/
bellard83f64092006-08-01 16:21:11 +00003413/* bottom halves (can be seen as timers which expire ASAP) */
3414
3415struct QEMUBH {
3416 QEMUBHFunc *cb;
3417 void *opaque;
3418 int scheduled;
aliguori1b435b12008-10-31 17:24:21 +00003419 int idle;
3420 int deleted;
bellard83f64092006-08-01 16:21:11 +00003421 QEMUBH *next;
3422};
3423
3424static QEMUBH *first_bh = NULL;
3425
3426QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
3427{
3428 QEMUBH *bh;
3429 bh = qemu_mallocz(sizeof(QEMUBH));
bellard83f64092006-08-01 16:21:11 +00003430 bh->cb = cb;
3431 bh->opaque = opaque;
aliguori1b435b12008-10-31 17:24:21 +00003432 bh->next = first_bh;
3433 first_bh = bh;
bellard83f64092006-08-01 16:21:11 +00003434 return bh;
3435}
3436
bellard6eb57332006-08-06 09:51:25 +00003437int qemu_bh_poll(void)
bellard83f64092006-08-01 16:21:11 +00003438{
aliguori1b435b12008-10-31 17:24:21 +00003439 QEMUBH *bh, **bhp;
bellard6eb57332006-08-06 09:51:25 +00003440 int ret;
bellard83f64092006-08-01 16:21:11 +00003441
bellard6eb57332006-08-06 09:51:25 +00003442 ret = 0;
aliguori1b435b12008-10-31 17:24:21 +00003443 for (bh = first_bh; bh; bh = bh->next) {
3444 if (!bh->deleted && bh->scheduled) {
3445 bh->scheduled = 0;
3446 if (!bh->idle)
3447 ret = 1;
3448 bh->idle = 0;
3449 bh->cb(bh->opaque);
3450 }
bellard83f64092006-08-01 16:21:11 +00003451 }
aliguori1b435b12008-10-31 17:24:21 +00003452
3453 /* remove deleted bhs */
3454 bhp = &first_bh;
3455 while (*bhp) {
3456 bh = *bhp;
3457 if (bh->deleted) {
3458 *bhp = bh->next;
3459 qemu_free(bh);
3460 } else
3461 bhp = &bh->next;
3462 }
3463
bellard6eb57332006-08-06 09:51:25 +00003464 return ret;
bellard83f64092006-08-01 16:21:11 +00003465}
3466
aliguori1b435b12008-10-31 17:24:21 +00003467void qemu_bh_schedule_idle(QEMUBH *bh)
3468{
3469 if (bh->scheduled)
3470 return;
3471 bh->scheduled = 1;
3472 bh->idle = 1;
3473}
3474
bellard83f64092006-08-01 16:21:11 +00003475void qemu_bh_schedule(QEMUBH *bh)
3476{
bellard83f64092006-08-01 16:21:11 +00003477 if (bh->scheduled)
3478 return;
3479 bh->scheduled = 1;
aliguori1b435b12008-10-31 17:24:21 +00003480 bh->idle = 0;
bellard83f64092006-08-01 16:21:11 +00003481 /* stop the currently executing CPU to execute the BH ASAP */
aliguorid9f75a42009-04-24 18:03:11 +00003482 qemu_notify_event();
bellard83f64092006-08-01 16:21:11 +00003483}
3484
3485void qemu_bh_cancel(QEMUBH *bh)
3486{
aliguori1b435b12008-10-31 17:24:21 +00003487 bh->scheduled = 0;
bellard83f64092006-08-01 16:21:11 +00003488}
3489
3490void qemu_bh_delete(QEMUBH *bh)
3491{
aliguori1b435b12008-10-31 17:24:21 +00003492 bh->scheduled = 0;
3493 bh->deleted = 1;
bellard83f64092006-08-01 16:21:11 +00003494}
3495
aliguori56f3a5d2008-10-31 18:07:17 +00003496static void qemu_bh_update_timeout(int *timeout)
3497{
3498 QEMUBH *bh;
3499
3500 for (bh = first_bh; bh; bh = bh->next) {
3501 if (!bh->deleted && bh->scheduled) {
3502 if (bh->idle) {
3503 /* idle bottom halves will be polled at least
3504 * every 10ms */
3505 *timeout = MIN(10, *timeout);
3506 } else {
3507 /* non-idle bottom halves will be executed
3508 * immediately */
3509 *timeout = 0;
3510 break;
3511 }
3512 }
3513 }
3514}
3515
bellard83f64092006-08-01 16:21:11 +00003516/***********************************************************/
bellardcc1daa42005-06-05 14:49:17 +00003517/* machine registration */
3518
blueswir1bdaf78e2008-10-04 07:24:27 +00003519static QEMUMachine *first_machine = NULL;
aliguori6f338c32009-02-11 15:21:54 +00003520QEMUMachine *current_machine = NULL;
bellardcc1daa42005-06-05 14:49:17 +00003521
3522int qemu_register_machine(QEMUMachine *m)
3523{
3524 QEMUMachine **pm;
3525 pm = &first_machine;
3526 while (*pm != NULL)
3527 pm = &(*pm)->next;
3528 m->next = NULL;
3529 *pm = m;
3530 return 0;
3531}
3532
pbrook9596ebb2007-11-18 01:44:38 +00003533static QEMUMachine *find_machine(const char *name)
bellardcc1daa42005-06-05 14:49:17 +00003534{
3535 QEMUMachine *m;
3536
3537 for(m = first_machine; m != NULL; m = m->next) {
3538 if (!strcmp(m->name, name))
3539 return m;
3540 }
3541 return NULL;
3542}
3543
3544/***********************************************************/
bellard8a7ddc32004-03-31 19:00:16 +00003545/* main execution loop */
3546
pbrook9596ebb2007-11-18 01:44:38 +00003547static void gui_update(void *opaque)
bellard8a7ddc32004-03-31 19:00:16 +00003548{
aliguori7d957bd2009-01-15 22:14:11 +00003549 uint64_t interval = GUI_REFRESH_INTERVAL;
ths740733b2007-06-08 01:57:56 +00003550 DisplayState *ds = opaque;
aliguori7d957bd2009-01-15 22:14:11 +00003551 DisplayChangeListener *dcl = ds->listeners;
3552
3553 dpy_refresh(ds);
3554
3555 while (dcl != NULL) {
3556 if (dcl->gui_timer_interval &&
3557 dcl->gui_timer_interval < interval)
3558 interval = dcl->gui_timer_interval;
3559 dcl = dcl->next;
3560 }
3561 qemu_mod_timer(ds->gui_timer, interval + qemu_get_clock(rt_clock));
bellard8a7ddc32004-03-31 19:00:16 +00003562}
3563
blueswir19043b622009-01-21 19:28:13 +00003564static void nographic_update(void *opaque)
3565{
3566 uint64_t interval = GUI_REFRESH_INTERVAL;
3567
3568 qemu_mod_timer(nographic_timer, interval + qemu_get_clock(rt_clock));
3569}
3570
bellard0bd48852005-11-11 00:00:47 +00003571struct vm_change_state_entry {
3572 VMChangeStateHandler *cb;
3573 void *opaque;
3574 LIST_ENTRY (vm_change_state_entry) entries;
3575};
3576
3577static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
3578
3579VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
3580 void *opaque)
3581{
3582 VMChangeStateEntry *e;
3583
3584 e = qemu_mallocz(sizeof (*e));
bellard0bd48852005-11-11 00:00:47 +00003585
3586 e->cb = cb;
3587 e->opaque = opaque;
3588 LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
3589 return e;
3590}
3591
3592void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
3593{
3594 LIST_REMOVE (e, entries);
3595 qemu_free (e);
3596}
3597
aliguori9781e042009-01-22 17:15:29 +00003598static void vm_state_notify(int running, int reason)
bellard0bd48852005-11-11 00:00:47 +00003599{
3600 VMChangeStateEntry *e;
3601
3602 for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
aliguori9781e042009-01-22 17:15:29 +00003603 e->cb(e->opaque, running, reason);
bellard0bd48852005-11-11 00:00:47 +00003604 }
3605}
3606
bellard8a7ddc32004-03-31 19:00:16 +00003607void vm_start(void)
3608{
3609 if (!vm_running) {
3610 cpu_enable_ticks();
3611 vm_running = 1;
aliguori9781e042009-01-22 17:15:29 +00003612 vm_state_notify(1, 0);
thsefe75412007-08-24 01:36:32 +00003613 qemu_rearm_alarm_timer(alarm_timer);
bellard8a7ddc32004-03-31 19:00:16 +00003614 }
3615}
3616
ths5fafdf22007-09-16 21:08:06 +00003617void vm_stop(int reason)
bellard8a7ddc32004-03-31 19:00:16 +00003618{
3619 if (vm_running) {
3620 cpu_disable_ticks();
3621 vm_running = 0;
aliguori9781e042009-01-22 17:15:29 +00003622 vm_state_notify(0, reason);
bellard8a7ddc32004-03-31 19:00:16 +00003623 }
3624}
3625
bellardbb0c6722004-06-20 12:37:32 +00003626/* reset/shutdown handler */
3627
3628typedef struct QEMUResetEntry {
3629 QEMUResetHandler *func;
3630 void *opaque;
3631 struct QEMUResetEntry *next;
3632} QEMUResetEntry;
3633
3634static QEMUResetEntry *first_reset_entry;
3635static int reset_requested;
3636static int shutdown_requested;
bellard34751872005-07-02 14:31:34 +00003637static int powerdown_requested;
bellardbb0c6722004-06-20 12:37:32 +00003638
aurel32cf7a2fe2008-03-18 06:53:05 +00003639int qemu_shutdown_requested(void)
3640{
3641 int r = shutdown_requested;
3642 shutdown_requested = 0;
3643 return r;
3644}
3645
3646int qemu_reset_requested(void)
3647{
3648 int r = reset_requested;
3649 reset_requested = 0;
3650 return r;
3651}
3652
3653int qemu_powerdown_requested(void)
3654{
3655 int r = powerdown_requested;
3656 powerdown_requested = 0;
3657 return r;
3658}
3659
bellardbb0c6722004-06-20 12:37:32 +00003660void qemu_register_reset(QEMUResetHandler *func, void *opaque)
3661{
3662 QEMUResetEntry **pre, *re;
3663
3664 pre = &first_reset_entry;
3665 while (*pre != NULL)
3666 pre = &(*pre)->next;
3667 re = qemu_mallocz(sizeof(QEMUResetEntry));
3668 re->func = func;
3669 re->opaque = opaque;
3670 re->next = NULL;
3671 *pre = re;
3672}
3673
aurel32cf7a2fe2008-03-18 06:53:05 +00003674void qemu_system_reset(void)
bellardbb0c6722004-06-20 12:37:32 +00003675{
3676 QEMUResetEntry *re;
3677
3678 /* reset all devices */
3679 for(re = first_reset_entry; re != NULL; re = re->next) {
3680 re->func(re->opaque);
3681 }
aliguori29203dc2009-04-17 14:26:17 +00003682 if (kvm_enabled())
3683 kvm_sync_vcpus();
bellardbb0c6722004-06-20 12:37:32 +00003684}
3685
3686void qemu_system_reset_request(void)
3687{
bellardd1beab82006-10-02 19:44:22 +00003688 if (no_reboot) {
3689 shutdown_requested = 1;
3690 } else {
3691 reset_requested = 1;
3692 }
aliguorid9f75a42009-04-24 18:03:11 +00003693 qemu_notify_event();
bellardbb0c6722004-06-20 12:37:32 +00003694}
3695
3696void qemu_system_shutdown_request(void)
3697{
3698 shutdown_requested = 1;
aliguorid9f75a42009-04-24 18:03:11 +00003699 qemu_notify_event();
bellardbb0c6722004-06-20 12:37:32 +00003700}
3701
bellard34751872005-07-02 14:31:34 +00003702void qemu_system_powerdown_request(void)
3703{
3704 powerdown_requested = 1;
aliguorid9f75a42009-04-24 18:03:11 +00003705 qemu_notify_event();
3706}
3707
3708void qemu_notify_event(void)
3709{
3710 CPUState *env = cpu_single_env;
3711
3712 if (env) {
3713 cpu_exit(env);
3714#ifdef USE_KQEMU
3715 if (env->kqemu_enabled)
3716 kqemu_cpu_interrupt(env);
3717#endif
3718 }
bellardbb0c6722004-06-20 12:37:32 +00003719}
3720
aliguori3fcf7b62009-04-24 18:03:25 +00003721static int qemu_init_main_loop(void)
3722{
3723 return 0;
3724}
3725
ths877cf882007-04-18 18:11:47 +00003726#ifdef _WIN32
blueswir169d64512008-12-07 19:30:18 +00003727static void host_main_loop_wait(int *timeout)
aliguori56f3a5d2008-10-31 18:07:17 +00003728{
3729 int ret, ret2, i;
bellardf3311102006-04-12 20:21:17 +00003730 PollingEntry *pe;
bellardc4b1fcc2004-03-14 21:44:30 +00003731
bellardf3311102006-04-12 20:21:17 +00003732
3733 /* XXX: need to suppress polling by better using win32 events */
3734 ret = 0;
3735 for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
3736 ret |= pe->func(pe->opaque);
3737 }
thse6b1e552007-04-18 17:56:02 +00003738 if (ret == 0) {
bellarda18e5242006-06-25 17:18:27 +00003739 int err;
3740 WaitObjects *w = &wait_objects;
ths3b46e622007-09-17 08:09:54 +00003741
aliguori56f3a5d2008-10-31 18:07:17 +00003742 ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout);
bellarda18e5242006-06-25 17:18:27 +00003743 if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
3744 if (w->func[ret - WAIT_OBJECT_0])
3745 w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
ths3b46e622007-09-17 08:09:54 +00003746
ths5fafdf22007-09-16 21:08:06 +00003747 /* Check for additional signaled events */
thse6b1e552007-04-18 17:56:02 +00003748 for(i = (ret - WAIT_OBJECT_0 + 1); i < w->num; i++) {
ths3b46e622007-09-17 08:09:54 +00003749
thse6b1e552007-04-18 17:56:02 +00003750 /* Check if event is signaled */
3751 ret2 = WaitForSingleObject(w->events[i], 0);
3752 if(ret2 == WAIT_OBJECT_0) {
3753 if (w->func[i])
3754 w->func[i](w->opaque[i]);
3755 } else if (ret2 == WAIT_TIMEOUT) {
3756 } else {
3757 err = GetLastError();
3758 fprintf(stderr, "WaitForSingleObject error %d %d\n", i, err);
ths3b46e622007-09-17 08:09:54 +00003759 }
3760 }
bellarda18e5242006-06-25 17:18:27 +00003761 } else if (ret == WAIT_TIMEOUT) {
3762 } else {
3763 err = GetLastError();
thse6b1e552007-04-18 17:56:02 +00003764 fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
bellarda18e5242006-06-25 17:18:27 +00003765 }
bellardf3311102006-04-12 20:21:17 +00003766 }
aliguori56f3a5d2008-10-31 18:07:17 +00003767
3768 *timeout = 0;
3769}
3770#else
blueswir169d64512008-12-07 19:30:18 +00003771static void host_main_loop_wait(int *timeout)
aliguori56f3a5d2008-10-31 18:07:17 +00003772{
3773}
bellardfd1dff42006-02-01 21:29:26 +00003774#endif
aliguori56f3a5d2008-10-31 18:07:17 +00003775
3776void main_loop_wait(int timeout)
3777{
3778 IOHandlerRecord *ioh;
3779 fd_set rfds, wfds, xfds;
3780 int ret, nfds;
3781 struct timeval tv;
3782
3783 qemu_bh_update_timeout(&timeout);
3784
3785 host_main_loop_wait(&timeout);
3786
bellardfd1dff42006-02-01 21:29:26 +00003787 /* poll any events */
3788 /* XXX: separate device handlers from system ones */
aliguori6abfbd72008-11-05 20:49:37 +00003789 nfds = -1;
bellardfd1dff42006-02-01 21:29:26 +00003790 FD_ZERO(&rfds);
3791 FD_ZERO(&wfds);
bellarde0356492006-05-01 13:33:02 +00003792 FD_ZERO(&xfds);
bellardfd1dff42006-02-01 21:29:26 +00003793 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
thscafffd42007-02-28 21:59:44 +00003794 if (ioh->deleted)
3795 continue;
bellardfd1dff42006-02-01 21:29:26 +00003796 if (ioh->fd_read &&
3797 (!ioh->fd_read_poll ||
3798 ioh->fd_read_poll(ioh->opaque) != 0)) {
3799 FD_SET(ioh->fd, &rfds);
3800 if (ioh->fd > nfds)
3801 nfds = ioh->fd;
3802 }
3803 if (ioh->fd_write) {
3804 FD_SET(ioh->fd, &wfds);
3805 if (ioh->fd > nfds)
3806 nfds = ioh->fd;
3807 }
3808 }
ths3b46e622007-09-17 08:09:54 +00003809
aliguori56f3a5d2008-10-31 18:07:17 +00003810 tv.tv_sec = timeout / 1000;
3811 tv.tv_usec = (timeout % 1000) * 1000;
3812
bellarde0356492006-05-01 13:33:02 +00003813#if defined(CONFIG_SLIRP)
aliguori63a01ef2008-10-31 19:10:00 +00003814 if (slirp_is_inited()) {
bellarde0356492006-05-01 13:33:02 +00003815 slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
3816 }
3817#endif
3818 ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
bellardfd1dff42006-02-01 21:29:26 +00003819 if (ret > 0) {
thscafffd42007-02-28 21:59:44 +00003820 IOHandlerRecord **pioh;
3821
3822 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
ths6ab43fd2007-08-25 01:34:19 +00003823 if (!ioh->deleted && ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) {
bellardfd1dff42006-02-01 21:29:26 +00003824 ioh->fd_read(ioh->opaque);
bellardc4b1fcc2004-03-14 21:44:30 +00003825 }
ths6ab43fd2007-08-25 01:34:19 +00003826 if (!ioh->deleted && ioh->fd_write && FD_ISSET(ioh->fd, &wfds)) {
bellardfd1dff42006-02-01 21:29:26 +00003827 ioh->fd_write(ioh->opaque);
bellardb4608c02003-06-27 17:34:32 +00003828 }
3829 }
thscafffd42007-02-28 21:59:44 +00003830
3831 /* remove deleted IO handlers */
3832 pioh = &first_io_handler;
3833 while (*pioh) {
3834 ioh = *pioh;
3835 if (ioh->deleted) {
3836 *pioh = ioh->next;
3837 qemu_free(ioh);
ths5fafdf22007-09-16 21:08:06 +00003838 } else
thscafffd42007-02-28 21:59:44 +00003839 pioh = &ioh->next;
3840 }
bellardfd1dff42006-02-01 21:29:26 +00003841 }
bellarde0356492006-05-01 13:33:02 +00003842#if defined(CONFIG_SLIRP)
aliguori63a01ef2008-10-31 19:10:00 +00003843 if (slirp_is_inited()) {
bellarde0356492006-05-01 13:33:02 +00003844 if (ret < 0) {
3845 FD_ZERO(&rfds);
3846 FD_ZERO(&wfds);
3847 FD_ZERO(&xfds);
3848 }
3849 slirp_select_poll(&rfds, &wfds, &xfds);
3850 }
3851#endif
bellardc20709a2004-04-21 23:27:19 +00003852
aliguori357c6922008-11-25 17:26:09 +00003853 /* vm time timers */
3854 if (vm_running && likely(!(cur_cpu->singlestep_enabled & SSTEP_NOTIMER)))
3855 qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
3856 qemu_get_clock(vm_clock));
3857
3858 /* real time timers */
3859 qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
3860 qemu_get_clock(rt_clock));
3861
pbrook423f0742007-05-23 00:06:54 +00003862 /* Check bottom-halves last in case any of the earlier events triggered
3863 them. */
3864 qemu_bh_poll();
ths3b46e622007-09-17 08:09:54 +00003865
bellard5905b2e2004-08-01 21:53:26 +00003866}
3867
pbrook9596ebb2007-11-18 01:44:38 +00003868static int main_loop(void)
bellard5905b2e2004-08-01 21:53:26 +00003869{
3870 int ret, timeout;
bellard89bfc102006-02-08 22:46:31 +00003871#ifdef CONFIG_PROFILER
3872 int64_t ti;
3873#endif
bellard6a00d602005-11-21 23:25:50 +00003874 CPUState *env;
bellard5905b2e2004-08-01 21:53:26 +00003875
bellard6a00d602005-11-21 23:25:50 +00003876 cur_cpu = first_cpu;
balrogee5605e2007-12-03 03:01:40 +00003877 next_cpu = cur_cpu->next_cpu ?: first_cpu;
bellard5905b2e2004-08-01 21:53:26 +00003878 for(;;) {
3879 if (vm_running) {
bellard15a76442005-11-23 21:01:03 +00003880
bellard15a76442005-11-23 21:01:03 +00003881 for(;;) {
3882 /* get next cpu */
balrogee5605e2007-12-03 03:01:40 +00003883 env = next_cpu;
bellard89bfc102006-02-08 22:46:31 +00003884#ifdef CONFIG_PROFILER
3885 ti = profile_getclock();
3886#endif
pbrook2e70f6e2008-06-29 01:03:05 +00003887 if (use_icount) {
3888 int64_t count;
3889 int decr;
3890 qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
3891 env->icount_decr.u16.low = 0;
3892 env->icount_extra = 0;
3893 count = qemu_next_deadline();
3894 count = (count + (1 << icount_time_shift) - 1)
3895 >> icount_time_shift;
3896 qemu_icount += count;
3897 decr = (count > 0xffff) ? 0xffff : count;
3898 count -= decr;
3899 env->icount_decr.u16.low = decr;
3900 env->icount_extra = count;
3901 }
bellard6a00d602005-11-21 23:25:50 +00003902 ret = cpu_exec(env);
bellard89bfc102006-02-08 22:46:31 +00003903#ifdef CONFIG_PROFILER
3904 qemu_time += profile_getclock() - ti;
3905#endif
pbrook2e70f6e2008-06-29 01:03:05 +00003906 if (use_icount) {
3907 /* Fold pending instructions back into the
3908 instruction counter, and clear the interrupt flag. */
3909 qemu_icount -= (env->icount_decr.u16.low
3910 + env->icount_extra);
3911 env->icount_decr.u32 = 0;
3912 env->icount_extra = 0;
3913 }
balrogee5605e2007-12-03 03:01:40 +00003914 next_cpu = env->next_cpu ?: first_cpu;
aurel3295b01002008-04-04 17:16:35 +00003915 if (event_pending && likely(ret != EXCP_DEBUG)) {
balrogee5605e2007-12-03 03:01:40 +00003916 ret = EXCP_INTERRUPT;
3917 event_pending = 0;
3918 break;
3919 }
pbrookbd967e02007-03-11 18:54:57 +00003920 if (ret == EXCP_HLT) {
3921 /* Give the next CPU a chance to run. */
3922 cur_cpu = env;
3923 continue;
3924 }
bellard15a76442005-11-23 21:01:03 +00003925 if (ret != EXCP_HALTED)
3926 break;
3927 /* all CPUs are halted ? */
pbrookbd967e02007-03-11 18:54:57 +00003928 if (env == cur_cpu)
bellard15a76442005-11-23 21:01:03 +00003929 break;
bellard15a76442005-11-23 21:01:03 +00003930 }
3931 cur_cpu = env;
3932
bellard5905b2e2004-08-01 21:53:26 +00003933 if (shutdown_requested) {
bellard34751872005-07-02 14:31:34 +00003934 ret = EXCP_INTERRUPT;
aurel32b2f76162008-04-11 21:35:52 +00003935 if (no_shutdown) {
3936 vm_stop(0);
3937 no_shutdown = 0;
3938 }
3939 else
3940 break;
bellard5905b2e2004-08-01 21:53:26 +00003941 }
3942 if (reset_requested) {
3943 reset_requested = 0;
3944 qemu_system_reset();
bellard34751872005-07-02 14:31:34 +00003945 ret = EXCP_INTERRUPT;
3946 }
3947 if (powerdown_requested) {
3948 powerdown_requested = 0;
3949 qemu_system_powerdown();
3950 ret = EXCP_INTERRUPT;
bellard5905b2e2004-08-01 21:53:26 +00003951 }
aurel3295b01002008-04-04 17:16:35 +00003952 if (unlikely(ret == EXCP_DEBUG)) {
aliguori880a7572008-11-18 20:30:24 +00003953 gdb_set_stop_cpu(cur_cpu);
bellard5905b2e2004-08-01 21:53:26 +00003954 vm_stop(EXCP_DEBUG);
3955 }
pbrookbd967e02007-03-11 18:54:57 +00003956 /* If all cpus are halted then wait until the next IRQ */
bellard5905b2e2004-08-01 21:53:26 +00003957 /* XXX: use timeout computed from timers */
pbrook2e70f6e2008-06-29 01:03:05 +00003958 if (ret == EXCP_HALTED) {
3959 if (use_icount) {
3960 int64_t add;
3961 int64_t delta;
3962 /* Advance virtual time to the next event. */
3963 if (use_icount == 1) {
3964 /* When not using an adaptive execution frequency
3965 we tend to get badly out of sync with real time,
thsbf20dc02008-06-30 17:22:19 +00003966 so just delay for a reasonable amount of time. */
pbrook2e70f6e2008-06-29 01:03:05 +00003967 delta = 0;
3968 } else {
3969 delta = cpu_get_icount() - cpu_get_clock();
3970 }
3971 if (delta > 0) {
3972 /* If virtual time is ahead of real time then just
3973 wait for IO. */
3974 timeout = (delta / 1000000) + 1;
3975 } else {
3976 /* Wait for either IO to occur or the next
3977 timer event. */
3978 add = qemu_next_deadline();
3979 /* We advance the timer before checking for IO.
3980 Limit the amount we advance so that early IO
3981 activity won't get the guest too far ahead. */
3982 if (add > 10000000)
3983 add = 10000000;
3984 delta += add;
3985 add = (add + (1 << icount_time_shift) - 1)
3986 >> icount_time_shift;
3987 qemu_icount += add;
3988 timeout = delta / 1000000;
3989 if (timeout < 0)
3990 timeout = 0;
3991 }
3992 } else {
aliguori0a1af392008-10-31 18:40:25 +00003993 timeout = 5000;
pbrook2e70f6e2008-06-29 01:03:05 +00003994 }
3995 } else {
bellard5905b2e2004-08-01 21:53:26 +00003996 timeout = 0;
pbrook2e70f6e2008-06-29 01:03:05 +00003997 }
bellard5905b2e2004-08-01 21:53:26 +00003998 } else {
blueswir198448f52008-09-30 18:16:09 +00003999 if (shutdown_requested) {
4000 ret = EXCP_INTERRUPT;
aliguori5b08fc12008-08-21 20:08:03 +00004001 break;
blueswir198448f52008-09-30 18:16:09 +00004002 }
aliguori0a1af392008-10-31 18:40:25 +00004003 timeout = 5000;
bellard5905b2e2004-08-01 21:53:26 +00004004 }
bellard89bfc102006-02-08 22:46:31 +00004005#ifdef CONFIG_PROFILER
4006 ti = profile_getclock();
4007#endif
bellard5905b2e2004-08-01 21:53:26 +00004008 main_loop_wait(timeout);
bellard89bfc102006-02-08 22:46:31 +00004009#ifdef CONFIG_PROFILER
4010 dev_time += profile_getclock() - ti;
4011#endif
bellardb4608c02003-06-27 17:34:32 +00004012 }
bellard34865132003-10-05 14:28:56 +00004013 cpu_disable_ticks();
4014 return ret;
bellardb4608c02003-06-27 17:34:32 +00004015}
4016
pbrook9bd7e6d2009-04-07 22:58:45 +00004017static void version(void)
4018{
pbrook4a19f1e2009-04-07 23:17:49 +00004019 printf("QEMU PC emulator version " QEMU_VERSION QEMU_PKGVERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n");
pbrook9bd7e6d2009-04-07 22:58:45 +00004020}
4021
ths15f82202007-06-29 23:26:08 +00004022static void help(int exitcode)
bellard0824d6f2003-06-24 13:42:40 +00004023{
pbrook9bd7e6d2009-04-07 22:58:45 +00004024 version();
4025 printf("usage: %s [options] [disk_image]\n"
bellard0824d6f2003-06-24 13:42:40 +00004026 "\n"
bellarda20dd502003-09-30 21:07:02 +00004027 "'disk_image' is a raw hard image image for IDE hard disk 0\n"
bellardfc01f7e2003-06-30 10:03:06 +00004028 "\n"
blueswir15824d652009-03-28 06:44:27 +00004029#define DEF(option, opt_arg, opt_enum, opt_help) \
4030 opt_help
4031#define DEFHEADING(text) stringify(text) "\n"
4032#include "qemu-options.h"
4033#undef DEF
4034#undef DEFHEADING
4035#undef GEN_DOCS
bellard0824d6f2003-06-24 13:42:40 +00004036 "\n"
bellard82c643f2004-07-14 17:28:13 +00004037 "During emulation, the following keys are useful:\n"
bellard032a8c92004-10-09 22:56:44 +00004038 "ctrl-alt-f toggle full screen\n"
4039 "ctrl-alt-n switch to virtual console 'n'\n"
4040 "ctrl-alt toggle mouse and keyboard grab\n"
bellard82c643f2004-07-14 17:28:13 +00004041 "\n"
4042 "When using -nographic, press 'ctrl-a h' to get some help.\n"
4043 ,
bellard0db63472003-10-27 21:37:46 +00004044 "qemu",
bellarda00bad72004-05-22 21:39:06 +00004045 DEFAULT_RAM_SIZE,
bellard7c9d8e02005-11-15 22:16:05 +00004046#ifndef _WIN32
bellarda00bad72004-05-22 21:39:06 +00004047 DEFAULT_NETWORK_SCRIPT,
thsb46a8902007-10-21 23:20:45 +00004048 DEFAULT_NETWORK_DOWN_SCRIPT,
bellard7c9d8e02005-11-15 22:16:05 +00004049#endif
bellard6e44ba72004-01-18 21:56:49 +00004050 DEFAULT_GDBSTUB_PORT,
bellardbce61842008-02-01 22:18:51 +00004051 "/tmp/qemu.log");
ths15f82202007-06-29 23:26:08 +00004052 exit(exitcode);
bellard0824d6f2003-06-24 13:42:40 +00004053}
4054
bellardcd6f1162004-05-13 22:02:20 +00004055#define HAS_ARG 0x0001
4056
4057enum {
blueswir15824d652009-03-28 06:44:27 +00004058#define DEF(option, opt_arg, opt_enum, opt_help) \
4059 opt_enum,
4060#define DEFHEADING(text)
4061#include "qemu-options.h"
4062#undef DEF
4063#undef DEFHEADING
4064#undef GEN_DOCS
bellardcd6f1162004-05-13 22:02:20 +00004065};
4066
4067typedef struct QEMUOption {
4068 const char *name;
4069 int flags;
4070 int index;
4071} QEMUOption;
4072
blueswir1dbed7e42008-10-01 19:38:09 +00004073static const QEMUOption qemu_options[] = {
bellardcd6f1162004-05-13 22:02:20 +00004074 { "h", 0, QEMU_OPTION_h },
blueswir15824d652009-03-28 06:44:27 +00004075#define DEF(option, opt_arg, opt_enum, opt_help) \
4076 { option, opt_arg, opt_enum },
4077#define DEFHEADING(text)
4078#include "qemu-options.h"
4079#undef DEF
4080#undef DEFHEADING
4081#undef GEN_DOCS
bellardcd6f1162004-05-13 22:02:20 +00004082 { NULL },
bellardfc01f7e2003-06-30 10:03:06 +00004083};
4084
bellard1d14ffa2005-10-30 18:58:22 +00004085#ifdef HAS_AUDIO
bellard6a36d842005-12-18 20:34:32 +00004086struct soundhw soundhw[] = {
balrogb00052e2007-04-30 02:22:06 +00004087#ifdef HAS_AUDIO_CHOICE
aurel324ce7ff62008-04-07 19:47:14 +00004088#if defined(TARGET_I386) || defined(TARGET_MIPS)
bellardfd06c372006-04-24 21:58:30 +00004089 {
4090 "pcspk",
4091 "PC speaker",
4092 0,
4093 1,
4094 { .init_isa = pcspk_audio_init }
4095 },
4096#endif
malc4c9b53e2009-01-09 10:46:34 +00004097
4098#ifdef CONFIG_SB16
bellard6a36d842005-12-18 20:34:32 +00004099 {
4100 "sb16",
4101 "Creative Sound Blaster 16",
4102 0,
4103 1,
4104 { .init_isa = SB16_init }
4105 },
malc4c9b53e2009-01-09 10:46:34 +00004106#endif
bellard6a36d842005-12-18 20:34:32 +00004107
malccc53d262008-06-13 10:48:22 +00004108#ifdef CONFIG_CS4231A
4109 {
4110 "cs4231a",
4111 "CS4231A",
4112 0,
4113 1,
4114 { .init_isa = cs4231a_init }
4115 },
4116#endif
4117
bellard6a36d842005-12-18 20:34:32 +00004118#ifdef CONFIG_ADLIB
4119 {
4120 "adlib",
4121#ifdef HAS_YMF262
4122 "Yamaha YMF262 (OPL3)",
4123#else
4124 "Yamaha YM3812 (OPL2)",
4125#endif
4126 0,
4127 1,
4128 { .init_isa = Adlib_init }
4129 },
4130#endif
4131
4132#ifdef CONFIG_GUS
4133 {
4134 "gus",
4135 "Gravis Ultrasound GF1",
4136 0,
4137 1,
4138 { .init_isa = GUS_init }
4139 },
4140#endif
4141
malc4c9b53e2009-01-09 10:46:34 +00004142#ifdef CONFIG_AC97
balroge5c9a132008-01-14 04:27:55 +00004143 {
4144 "ac97",
4145 "Intel 82801AA AC97 Audio",
4146 0,
4147 0,
4148 { .init_pci = ac97_init }
4149 },
malc4c9b53e2009-01-09 10:46:34 +00004150#endif
balroge5c9a132008-01-14 04:27:55 +00004151
malc4c9b53e2009-01-09 10:46:34 +00004152#ifdef CONFIG_ES1370
bellard6a36d842005-12-18 20:34:32 +00004153 {
4154 "es1370",
4155 "ENSONIQ AudioPCI ES1370",
4156 0,
4157 0,
4158 { .init_pci = es1370_init }
4159 },
balrogb00052e2007-04-30 02:22:06 +00004160#endif
bellard6a36d842005-12-18 20:34:32 +00004161
malc4c9b53e2009-01-09 10:46:34 +00004162#endif /* HAS_AUDIO_CHOICE */
4163
bellard6a36d842005-12-18 20:34:32 +00004164 { NULL, NULL, 0, 0, { NULL } }
4165};
4166
bellard1d14ffa2005-10-30 18:58:22 +00004167static void select_soundhw (const char *optarg)
4168{
bellard6a36d842005-12-18 20:34:32 +00004169 struct soundhw *c;
4170
bellard1d14ffa2005-10-30 18:58:22 +00004171 if (*optarg == '?') {
4172 show_valid_cards:
bellard6a36d842005-12-18 20:34:32 +00004173
bellard1d14ffa2005-10-30 18:58:22 +00004174 printf ("Valid sound card names (comma separated):\n");
bellard6a36d842005-12-18 20:34:32 +00004175 for (c = soundhw; c->name; ++c) {
4176 printf ("%-11s %s\n", c->name, c->descr);
4177 }
4178 printf ("\n-soundhw all will enable all of the above\n");
bellard1d14ffa2005-10-30 18:58:22 +00004179 exit (*optarg != '?');
4180 }
4181 else {
bellard6a36d842005-12-18 20:34:32 +00004182 size_t l;
bellard1d14ffa2005-10-30 18:58:22 +00004183 const char *p;
4184 char *e;
4185 int bad_card = 0;
4186
bellard6a36d842005-12-18 20:34:32 +00004187 if (!strcmp (optarg, "all")) {
4188 for (c = soundhw; c->name; ++c) {
4189 c->enabled = 1;
4190 }
4191 return;
4192 }
bellard1d14ffa2005-10-30 18:58:22 +00004193
bellard6a36d842005-12-18 20:34:32 +00004194 p = optarg;
bellard1d14ffa2005-10-30 18:58:22 +00004195 while (*p) {
4196 e = strchr (p, ',');
4197 l = !e ? strlen (p) : (size_t) (e - p);
bellard6a36d842005-12-18 20:34:32 +00004198
4199 for (c = soundhw; c->name; ++c) {
4200 if (!strncmp (c->name, p, l)) {
4201 c->enabled = 1;
bellard1d14ffa2005-10-30 18:58:22 +00004202 break;
4203 }
4204 }
bellard6a36d842005-12-18 20:34:32 +00004205
4206 if (!c->name) {
bellard1d14ffa2005-10-30 18:58:22 +00004207 if (l > 80) {
4208 fprintf (stderr,
4209 "Unknown sound card name (too big to show)\n");
4210 }
4211 else {
4212 fprintf (stderr, "Unknown sound card name `%.*s'\n",
4213 (int) l, p);
4214 }
4215 bad_card = 1;
4216 }
4217 p += l + (e != NULL);
4218 }
4219
4220 if (bad_card)
4221 goto show_valid_cards;
4222 }
4223}
4224#endif
4225
malc3893c122008-09-28 00:42:05 +00004226static void select_vgahw (const char *p)
4227{
4228 const char *opts;
4229
aliguori28b85ed2009-04-22 15:19:48 +00004230 cirrus_vga_enabled = 0;
4231 std_vga_enabled = 0;
4232 vmsvga_enabled = 0;
aliguori94909d92009-04-22 15:19:53 +00004233 xenfb_enabled = 0;
malc3893c122008-09-28 00:42:05 +00004234 if (strstart(p, "std", &opts)) {
aliguoric2b3b412009-01-15 20:37:28 +00004235 std_vga_enabled = 1;
malc3893c122008-09-28 00:42:05 +00004236 } else if (strstart(p, "cirrus", &opts)) {
4237 cirrus_vga_enabled = 1;
malc3893c122008-09-28 00:42:05 +00004238 } else if (strstart(p, "vmware", &opts)) {
malc3893c122008-09-28 00:42:05 +00004239 vmsvga_enabled = 1;
aliguori94909d92009-04-22 15:19:53 +00004240 } else if (strstart(p, "xenfb", &opts)) {
4241 xenfb_enabled = 1;
aliguori28b85ed2009-04-22 15:19:48 +00004242 } else if (!strstart(p, "none", &opts)) {
malc3893c122008-09-28 00:42:05 +00004243 invalid_vga:
4244 fprintf(stderr, "Unknown vga type: %s\n", p);
4245 exit(1);
4246 }
malccb5a7aa2008-09-28 00:42:12 +00004247 while (*opts) {
4248 const char *nextopt;
4249
4250 if (strstart(opts, ",retrace=", &nextopt)) {
4251 opts = nextopt;
4252 if (strstart(opts, "dumb", &nextopt))
4253 vga_retrace_method = VGA_RETRACE_DUMB;
4254 else if (strstart(opts, "precise", &nextopt))
4255 vga_retrace_method = VGA_RETRACE_PRECISE;
4256 else goto invalid_vga;
4257 } else goto invalid_vga;
4258 opts = nextopt;
4259 }
malc3893c122008-09-28 00:42:05 +00004260}
4261
bellard3587d7e2006-06-26 20:03:44 +00004262#ifdef _WIN32
4263static BOOL WINAPI qemu_ctrl_handler(DWORD type)
4264{
4265 exit(STATUS_CONTROL_C_EXIT);
4266 return TRUE;
4267}
4268#endif
4269
aliguoric4be29f2009-04-17 18:58:14 +00004270int qemu_uuid_parse(const char *str, uint8_t *uuid)
blueswir18fcb1b92008-09-18 18:29:08 +00004271{
4272 int ret;
4273
4274 if(strlen(str) != 36)
4275 return -1;
4276
4277 ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
4278 &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
4279 &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]);
4280
4281 if(ret != 16)
4282 return -1;
4283
aliguorib6f6e3d2009-04-17 18:59:56 +00004284#ifdef TARGET_I386
4285 smbios_add_field(1, offsetof(struct smbios_type_1, uuid), 16, uuid);
4286#endif
4287
blueswir18fcb1b92008-09-18 18:29:08 +00004288 return 0;
4289}
4290
bellard7c9d8e02005-11-15 22:16:05 +00004291#define MAX_NET_CLIENTS 32
bellardc20709a2004-04-21 23:27:19 +00004292
aliguori5b08fc12008-08-21 20:08:03 +00004293#ifndef _WIN32
4294
4295static void termsig_handler(int signal)
4296{
4297 qemu_system_shutdown_request();
4298}
4299
blueswir16f9e3802008-09-09 18:56:59 +00004300static void termsig_setup(void)
aliguori5b08fc12008-08-21 20:08:03 +00004301{
4302 struct sigaction act;
4303
4304 memset(&act, 0, sizeof(act));
4305 act.sa_handler = termsig_handler;
4306 sigaction(SIGINT, &act, NULL);
4307 sigaction(SIGHUP, &act, NULL);
4308 sigaction(SIGTERM, &act, NULL);
4309}
4310
4311#endif
4312
malc902b3d52008-12-10 19:18:40 +00004313int main(int argc, char **argv, char **envp)
bellard0824d6f2003-06-24 13:42:40 +00004314{
bellard67b915a2004-03-31 23:37:16 +00004315#ifdef CONFIG_GDBSTUB
aliguori59030a82009-04-05 18:43:41 +00004316 const char *gdbstub_dev = NULL;
bellard67b915a2004-03-31 23:37:16 +00004317#endif
j_mayer28c5af52007-11-11 01:50:45 +00004318 uint32_t boot_devices_bitmap = 0;
thse4bcb142007-12-02 04:51:10 +00004319 int i;
j_mayer28c5af52007-11-11 01:50:45 +00004320 int snapshot, linux_boot, net_boot;
bellard7f7f9872003-10-30 01:11:23 +00004321 const char *initrd_filename;
bellarda20dd502003-09-30 21:07:02 +00004322 const char *kernel_filename, *kernel_cmdline;
j_mayer28c5af52007-11-11 01:50:45 +00004323 const char *boot_devices = "";
aliguori3023f332009-01-16 19:04:14 +00004324 DisplayState *ds;
aliguori7d957bd2009-01-15 22:14:11 +00004325 DisplayChangeListener *dcl;
bellard46d47672004-11-16 01:45:27 +00004326 int cyls, heads, secs, translation;
pbrookfd5f3932008-03-26 20:55:43 +00004327 const char *net_clients[MAX_NET_CLIENTS];
bellard7c9d8e02005-11-15 22:16:05 +00004328 int nb_net_clients;
balrogdc72ac12008-11-09 00:04:26 +00004329 const char *bt_opts[MAX_BT_CMDLINE];
4330 int nb_bt_opts;
thse4bcb142007-12-02 04:51:10 +00004331 int hda_index;
bellardcd6f1162004-05-13 22:02:20 +00004332 int optind;
4333 const char *r, *optarg;
aliguori4c621802009-01-16 21:48:20 +00004334 CharDriverState *monitor_hd = NULL;
pbrookfd5f3932008-03-26 20:55:43 +00004335 const char *monitor_device;
4336 const char *serial_devices[MAX_SERIAL_PORTS];
bellard8d11df92004-08-24 21:13:40 +00004337 int serial_device_index;
pbrookfd5f3932008-03-26 20:55:43 +00004338 const char *parallel_devices[MAX_PARALLEL_PORTS];
bellard6508fe52005-01-15 12:02:56 +00004339 int parallel_device_index;
aliguori9ede2fd2009-01-15 20:05:25 +00004340 const char *virtio_consoles[MAX_VIRTIO_CONSOLES];
4341 int virtio_console_index;
bellardd63d3072004-10-03 13:29:03 +00004342 const char *loadvm = NULL;
bellardcc1daa42005-06-05 14:49:17 +00004343 QEMUMachine *machine;
j_mayer94fc95c2007-03-05 19:44:02 +00004344 const char *cpu_model;
pbrookfd5f3932008-03-26 20:55:43 +00004345 const char *usb_devices[MAX_USB_CMDLINE];
bellarda594cfb2005-11-06 16:13:29 +00004346 int usb_devices_index;
blueswir1b9e82a52009-04-05 18:03:31 +00004347#ifndef _WIN32
ths71e3ceb2006-12-22 02:11:31 +00004348 int fds[2];
blueswir1b9e82a52009-04-05 18:03:31 +00004349#endif
bellard26a5f132008-05-28 12:30:31 +00004350 int tb_size;
ths93815bc2007-03-19 15:58:31 +00004351 const char *pid_file = NULL;
aliguori5bb79102008-10-13 03:12:02 +00004352 const char *incoming = NULL;
blueswir1b9e82a52009-04-05 18:03:31 +00004353#ifndef _WIN32
aliguori54042bc2009-02-27 22:16:47 +00004354 int fd = 0;
4355 struct passwd *pwd = NULL;
aliguori08585322009-02-27 22:09:45 +00004356 const char *chroot_dir = NULL;
4357 const char *run_as = NULL;
blueswir1b9e82a52009-04-05 18:03:31 +00004358#endif
aliguori268a3622009-04-21 22:30:27 +00004359 CPUState *env;
bellard0bd48852005-11-11 00:00:47 +00004360
malc902b3d52008-12-10 19:18:40 +00004361 qemu_cache_utils_init(envp);
4362
bellard0bd48852005-11-11 00:00:47 +00004363 LIST_INIT (&vm_change_state_head);
bellardbe995c22006-06-25 16:25:21 +00004364#ifndef _WIN32
4365 {
4366 struct sigaction act;
4367 sigfillset(&act.sa_mask);
4368 act.sa_flags = 0;
4369 act.sa_handler = SIG_IGN;
4370 sigaction(SIGPIPE, &act, NULL);
4371 }
bellard3587d7e2006-06-26 20:03:44 +00004372#else
4373 SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
bellarda8e5ac32006-07-14 09:36:13 +00004374 /* Note: cpu_interrupt() is currently not SMP safe, so we force
4375 QEMU to run on a single CPU */
4376 {
4377 HANDLE h;
4378 DWORD mask, smask;
4379 int i;
4380 h = GetCurrentProcess();
4381 if (GetProcessAffinityMask(h, &mask, &smask)) {
4382 for(i = 0; i < 32; i++) {
4383 if (mask & (1 << i))
4384 break;
4385 }
4386 if (i != 32) {
4387 mask = 1 << i;
4388 SetProcessAffinityMask(h, mask);
4389 }
4390 }
4391 }
bellard67b915a2004-03-31 23:37:16 +00004392#endif
bellardbe995c22006-06-25 16:25:21 +00004393
bellardcc1daa42005-06-05 14:49:17 +00004394 register_machines();
4395 machine = first_machine;
j_mayer94fc95c2007-03-05 19:44:02 +00004396 cpu_model = NULL;
bellardfc01f7e2003-06-30 10:03:06 +00004397 initrd_filename = NULL;
aurel324fc5d072008-04-27 21:39:40 +00004398 ram_size = 0;
bellard313aa562003-08-10 21:52:11 +00004399 vga_ram_size = VGA_RAM_SIZE;
bellard33e39632003-07-06 17:15:21 +00004400 snapshot = 0;
bellarda20dd502003-09-30 21:07:02 +00004401 nographic = 0;
balrog4d3b6f62008-02-10 16:33:14 +00004402 curses = 0;
bellarda20dd502003-09-30 21:07:02 +00004403 kernel_filename = NULL;
4404 kernel_cmdline = "";
bellardc4b1fcc2004-03-14 21:44:30 +00004405 cyls = heads = secs = 0;
bellard46d47672004-11-16 01:45:27 +00004406 translation = BIOS_ATA_TRANSLATION_AUTO;
aliguorid47d13b2009-03-05 23:00:53 +00004407 monitor_device = "vc:80Cx24C";
bellardc4b1fcc2004-03-14 21:44:30 +00004408
aurel32c75a8232008-05-04 00:50:34 +00004409 serial_devices[0] = "vc:80Cx24C";
bellard8d11df92004-08-24 21:13:40 +00004410 for(i = 1; i < MAX_SERIAL_PORTS; i++)
pbrookfd5f3932008-03-26 20:55:43 +00004411 serial_devices[i] = NULL;
bellard8d11df92004-08-24 21:13:40 +00004412 serial_device_index = 0;
ths3b46e622007-09-17 08:09:54 +00004413
aliguori8290edd2009-02-27 20:14:29 +00004414 parallel_devices[0] = "vc:80Cx24C";
bellard6508fe52005-01-15 12:02:56 +00004415 for(i = 1; i < MAX_PARALLEL_PORTS; i++)
pbrookfd5f3932008-03-26 20:55:43 +00004416 parallel_devices[i] = NULL;
bellard6508fe52005-01-15 12:02:56 +00004417 parallel_device_index = 0;
ths3b46e622007-09-17 08:09:54 +00004418
aliguori1b8fc812009-02-27 20:01:39 +00004419 for(i = 0; i < MAX_VIRTIO_CONSOLES; i++)
aliguori9ede2fd2009-01-15 20:05:25 +00004420 virtio_consoles[i] = NULL;
4421 virtio_console_index = 0;
4422
aliguori268a3622009-04-21 22:30:27 +00004423 for (i = 0; i < MAX_NODES; i++) {
4424 node_mem[i] = 0;
4425 node_cpumask[i] = 0;
4426 }
4427
bellarda594cfb2005-11-06 16:13:29 +00004428 usb_devices_index = 0;
ths3b46e622007-09-17 08:09:54 +00004429
bellard7c9d8e02005-11-15 22:16:05 +00004430 nb_net_clients = 0;
balrogdc72ac12008-11-09 00:04:26 +00004431 nb_bt_opts = 0;
thse4bcb142007-12-02 04:51:10 +00004432 nb_drives = 0;
4433 nb_drives_opt = 0;
aliguori268a3622009-04-21 22:30:27 +00004434 nb_numa_nodes = 0;
thse4bcb142007-12-02 04:51:10 +00004435 hda_index = -1;
bellard7c9d8e02005-11-15 22:16:05 +00004436
4437 nb_nics = 0;
ths3b46e622007-09-17 08:09:54 +00004438
bellard26a5f132008-05-28 12:30:31 +00004439 tb_size = 0;
blueswir141bd6392008-10-05 09:56:21 +00004440 autostart= 1;
4441
bellardcd6f1162004-05-13 22:02:20 +00004442 optind = 1;
bellard0824d6f2003-06-24 13:42:40 +00004443 for(;;) {
bellardcd6f1162004-05-13 22:02:20 +00004444 if (optind >= argc)
bellard0824d6f2003-06-24 13:42:40 +00004445 break;
bellardcd6f1162004-05-13 22:02:20 +00004446 r = argv[optind];
4447 if (r[0] != '-') {
balrog609497a2008-01-14 02:56:53 +00004448 hda_index = drive_add(argv[optind++], HD_ALIAS, 0);
bellardcd6f1162004-05-13 22:02:20 +00004449 } else {
4450 const QEMUOption *popt;
4451
4452 optind++;
pbrookdff5efc2007-01-27 17:19:39 +00004453 /* Treat --foo the same as -foo. */
4454 if (r[1] == '-')
4455 r++;
bellardcd6f1162004-05-13 22:02:20 +00004456 popt = qemu_options;
4457 for(;;) {
4458 if (!popt->name) {
ths5fafdf22007-09-16 21:08:06 +00004459 fprintf(stderr, "%s: invalid option -- '%s'\n",
bellardcd6f1162004-05-13 22:02:20 +00004460 argv[0], r);
4461 exit(1);
4462 }
4463 if (!strcmp(popt->name, r + 1))
4464 break;
4465 popt++;
4466 }
4467 if (popt->flags & HAS_ARG) {
4468 if (optind >= argc) {
4469 fprintf(stderr, "%s: option '%s' requires an argument\n",
4470 argv[0], r);
4471 exit(1);
4472 }
4473 optarg = argv[optind++];
4474 } else {
4475 optarg = NULL;
4476 }
4477
4478 switch(popt->index) {
bellardcc1daa42005-06-05 14:49:17 +00004479 case QEMU_OPTION_M:
4480 machine = find_machine(optarg);
4481 if (!machine) {
4482 QEMUMachine *m;
4483 printf("Supported machines are:\n");
4484 for(m = first_machine; m != NULL; m = m->next) {
4485 printf("%-10s %s%s\n",
ths5fafdf22007-09-16 21:08:06 +00004486 m->name, m->desc,
bellardcc1daa42005-06-05 14:49:17 +00004487 m == first_machine ? " (default)" : "");
4488 }
ths15f82202007-06-29 23:26:08 +00004489 exit(*optarg != '?');
bellardcc1daa42005-06-05 14:49:17 +00004490 }
4491 break;
j_mayer94fc95c2007-03-05 19:44:02 +00004492 case QEMU_OPTION_cpu:
4493 /* hw initialization will check this */
ths15f82202007-06-29 23:26:08 +00004494 if (*optarg == '?') {
j_mayerc732abe2007-10-12 06:47:46 +00004495/* XXX: implement xxx_cpu_list for targets that still miss it */
4496#if defined(cpu_list)
4497 cpu_list(stdout, &fprintf);
j_mayer94fc95c2007-03-05 19:44:02 +00004498#endif
ths15f82202007-06-29 23:26:08 +00004499 exit(0);
j_mayer94fc95c2007-03-05 19:44:02 +00004500 } else {
4501 cpu_model = optarg;
4502 }
4503 break;
bellardcd6f1162004-05-13 22:02:20 +00004504 case QEMU_OPTION_initrd:
bellardfc01f7e2003-06-30 10:03:06 +00004505 initrd_filename = optarg;
4506 break;
bellardcd6f1162004-05-13 22:02:20 +00004507 case QEMU_OPTION_hda:
thse4bcb142007-12-02 04:51:10 +00004508 if (cyls == 0)
balrog609497a2008-01-14 02:56:53 +00004509 hda_index = drive_add(optarg, HD_ALIAS, 0);
thse4bcb142007-12-02 04:51:10 +00004510 else
balrog609497a2008-01-14 02:56:53 +00004511 hda_index = drive_add(optarg, HD_ALIAS
thse4bcb142007-12-02 04:51:10 +00004512 ",cyls=%d,heads=%d,secs=%d%s",
balrog609497a2008-01-14 02:56:53 +00004513 0, cyls, heads, secs,
thse4bcb142007-12-02 04:51:10 +00004514 translation == BIOS_ATA_TRANSLATION_LBA ?
4515 ",trans=lba" :
4516 translation == BIOS_ATA_TRANSLATION_NONE ?
4517 ",trans=none" : "");
4518 break;
bellardcd6f1162004-05-13 22:02:20 +00004519 case QEMU_OPTION_hdb:
bellardcc1daa42005-06-05 14:49:17 +00004520 case QEMU_OPTION_hdc:
4521 case QEMU_OPTION_hdd:
balrog609497a2008-01-14 02:56:53 +00004522 drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda);
bellardfc01f7e2003-06-30 10:03:06 +00004523 break;
thse4bcb142007-12-02 04:51:10 +00004524 case QEMU_OPTION_drive:
balrog609497a2008-01-14 02:56:53 +00004525 drive_add(NULL, "%s", optarg);
thse4bcb142007-12-02 04:51:10 +00004526 break;
balrog3e3d5812007-04-30 02:09:25 +00004527 case QEMU_OPTION_mtdblock:
balrog609497a2008-01-14 02:56:53 +00004528 drive_add(optarg, MTD_ALIAS);
balrog3e3d5812007-04-30 02:09:25 +00004529 break;
pbrooka1bb27b2007-04-06 16:49:48 +00004530 case QEMU_OPTION_sd:
balrog609497a2008-01-14 02:56:53 +00004531 drive_add(optarg, SD_ALIAS);
pbrooka1bb27b2007-04-06 16:49:48 +00004532 break;
j_mayer86f55662007-04-24 06:52:59 +00004533 case QEMU_OPTION_pflash:
balrog609497a2008-01-14 02:56:53 +00004534 drive_add(optarg, PFLASH_ALIAS);
j_mayer86f55662007-04-24 06:52:59 +00004535 break;
bellardcd6f1162004-05-13 22:02:20 +00004536 case QEMU_OPTION_snapshot:
bellard33e39632003-07-06 17:15:21 +00004537 snapshot = 1;
4538 break;
bellardcd6f1162004-05-13 22:02:20 +00004539 case QEMU_OPTION_hdachs:
bellard330d0412003-07-26 18:11:40 +00004540 {
bellard330d0412003-07-26 18:11:40 +00004541 const char *p;
4542 p = optarg;
4543 cyls = strtol(p, (char **)&p, 0);
bellard46d47672004-11-16 01:45:27 +00004544 if (cyls < 1 || cyls > 16383)
4545 goto chs_fail;
bellard330d0412003-07-26 18:11:40 +00004546 if (*p != ',')
4547 goto chs_fail;
4548 p++;
4549 heads = strtol(p, (char **)&p, 0);
bellard46d47672004-11-16 01:45:27 +00004550 if (heads < 1 || heads > 16)
4551 goto chs_fail;
bellard330d0412003-07-26 18:11:40 +00004552 if (*p != ',')
4553 goto chs_fail;
4554 p++;
4555 secs = strtol(p, (char **)&p, 0);
bellard46d47672004-11-16 01:45:27 +00004556 if (secs < 1 || secs > 63)
4557 goto chs_fail;
4558 if (*p == ',') {
4559 p++;
4560 if (!strcmp(p, "none"))
4561 translation = BIOS_ATA_TRANSLATION_NONE;
4562 else if (!strcmp(p, "lba"))
4563 translation = BIOS_ATA_TRANSLATION_LBA;
4564 else if (!strcmp(p, "auto"))
4565 translation = BIOS_ATA_TRANSLATION_AUTO;
4566 else
4567 goto chs_fail;
4568 } else if (*p != '\0') {
bellardc4b1fcc2004-03-14 21:44:30 +00004569 chs_fail:
bellard46d47672004-11-16 01:45:27 +00004570 fprintf(stderr, "qemu: invalid physical CHS format\n");
4571 exit(1);
bellardc4b1fcc2004-03-14 21:44:30 +00004572 }
thse4bcb142007-12-02 04:51:10 +00004573 if (hda_index != -1)
balrog609497a2008-01-14 02:56:53 +00004574 snprintf(drives_opt[hda_index].opt,
4575 sizeof(drives_opt[hda_index].opt),
4576 HD_ALIAS ",cyls=%d,heads=%d,secs=%d%s",
4577 0, cyls, heads, secs,
thse4bcb142007-12-02 04:51:10 +00004578 translation == BIOS_ATA_TRANSLATION_LBA ?
4579 ",trans=lba" :
4580 translation == BIOS_ATA_TRANSLATION_NONE ?
4581 ",trans=none" : "");
bellard330d0412003-07-26 18:11:40 +00004582 }
4583 break;
aliguori268a3622009-04-21 22:30:27 +00004584 case QEMU_OPTION_numa:
4585 if (nb_numa_nodes >= MAX_NODES) {
4586 fprintf(stderr, "qemu: too many NUMA nodes\n");
4587 exit(1);
4588 }
4589 numa_add(optarg);
4590 break;
bellardcd6f1162004-05-13 22:02:20 +00004591 case QEMU_OPTION_nographic:
bellarda20dd502003-09-30 21:07:02 +00004592 nographic = 1;
4593 break;
balrog4d3b6f62008-02-10 16:33:14 +00004594#ifdef CONFIG_CURSES
4595 case QEMU_OPTION_curses:
4596 curses = 1;
4597 break;
4598#endif
balroga171fe32007-04-30 01:48:07 +00004599 case QEMU_OPTION_portrait:
4600 graphic_rotate = 1;
4601 break;
bellardcd6f1162004-05-13 22:02:20 +00004602 case QEMU_OPTION_kernel:
bellarda20dd502003-09-30 21:07:02 +00004603 kernel_filename = optarg;
4604 break;
bellardcd6f1162004-05-13 22:02:20 +00004605 case QEMU_OPTION_append:
bellarda20dd502003-09-30 21:07:02 +00004606 kernel_cmdline = optarg;
bellard313aa562003-08-10 21:52:11 +00004607 break;
bellardcd6f1162004-05-13 22:02:20 +00004608 case QEMU_OPTION_cdrom:
balrog609497a2008-01-14 02:56:53 +00004609 drive_add(optarg, CDROM_ALIAS);
bellard36b486b2003-11-11 13:36:08 +00004610 break;
bellardcd6f1162004-05-13 22:02:20 +00004611 case QEMU_OPTION_boot:
j_mayer28c5af52007-11-11 01:50:45 +00004612 boot_devices = optarg;
4613 /* We just do some generic consistency checks */
4614 {
4615 /* Could easily be extended to 64 devices if needed */
ths60fe76f2007-12-16 03:02:09 +00004616 const char *p;
j_mayer28c5af52007-11-11 01:50:45 +00004617
4618 boot_devices_bitmap = 0;
4619 for (p = boot_devices; *p != '\0'; p++) {
4620 /* Allowed boot devices are:
4621 * a b : floppy disk drives
4622 * c ... f : IDE disk drives
4623 * g ... m : machine implementation dependant drives
4624 * n ... p : network devices
4625 * It's up to each machine implementation to check
4626 * if the given boot devices match the actual hardware
4627 * implementation and firmware features.
4628 */
4629 if (*p < 'a' || *p > 'q') {
4630 fprintf(stderr, "Invalid boot device '%c'\n", *p);
4631 exit(1);
4632 }
4633 if (boot_devices_bitmap & (1 << (*p - 'a'))) {
4634 fprintf(stderr,
4635 "Boot device '%c' was given twice\n",*p);
4636 exit(1);
4637 }
4638 boot_devices_bitmap |= 1 << (*p - 'a');
4639 }
bellard36b486b2003-11-11 13:36:08 +00004640 }
4641 break;
bellardcd6f1162004-05-13 22:02:20 +00004642 case QEMU_OPTION_fda:
bellardcd6f1162004-05-13 22:02:20 +00004643 case QEMU_OPTION_fdb:
balrog609497a2008-01-14 02:56:53 +00004644 drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda);
bellardc45886d2004-01-05 00:02:06 +00004645 break;
bellard52ca8d62006-06-14 16:03:05 +00004646#ifdef TARGET_I386
4647 case QEMU_OPTION_no_fd_bootchk:
4648 fd_bootchk = 0;
4649 break;
4650#endif
bellard7c9d8e02005-11-15 22:16:05 +00004651 case QEMU_OPTION_net:
4652 if (nb_net_clients >= MAX_NET_CLIENTS) {
4653 fprintf(stderr, "qemu: too many network clients\n");
bellardc4b1fcc2004-03-14 21:44:30 +00004654 exit(1);
4655 }
pbrookfd5f3932008-03-26 20:55:43 +00004656 net_clients[nb_net_clients] = optarg;
bellard7c9d8e02005-11-15 22:16:05 +00004657 nb_net_clients++;
bellard702c6512004-04-02 21:21:32 +00004658 break;
bellardc7f74642004-08-24 21:57:12 +00004659#ifdef CONFIG_SLIRP
4660 case QEMU_OPTION_tftp:
bellardc7f74642004-08-24 21:57:12 +00004661 tftp_prefix = optarg;
bellard9bf05442004-08-25 22:12:49 +00004662 break;
ths47d5d012007-02-20 00:05:08 +00004663 case QEMU_OPTION_bootp:
4664 bootp_filename = optarg;
4665 break;
bellardc94c8d62004-09-13 21:37:34 +00004666#ifndef _WIN32
bellard9d728e82004-09-05 23:09:03 +00004667 case QEMU_OPTION_smb:
4668 net_slirp_smb(optarg);
4669 break;
bellardc94c8d62004-09-13 21:37:34 +00004670#endif
bellard9bf05442004-08-25 22:12:49 +00004671 case QEMU_OPTION_redir:
aliguorid4ebe192009-04-21 19:56:44 +00004672 net_slirp_redir(NULL, optarg);
bellard9bf05442004-08-25 22:12:49 +00004673 break;
bellardc7f74642004-08-24 21:57:12 +00004674#endif
balrogdc72ac12008-11-09 00:04:26 +00004675 case QEMU_OPTION_bt:
4676 if (nb_bt_opts >= MAX_BT_CMDLINE) {
4677 fprintf(stderr, "qemu: too many bluetooth options\n");
4678 exit(1);
4679 }
4680 bt_opts[nb_bt_opts++] = optarg;
4681 break;
bellard1d14ffa2005-10-30 18:58:22 +00004682#ifdef HAS_AUDIO
bellard1d14ffa2005-10-30 18:58:22 +00004683 case QEMU_OPTION_audio_help:
4684 AUD_help ();
4685 exit (0);
4686 break;
4687 case QEMU_OPTION_soundhw:
4688 select_soundhw (optarg);
4689 break;
4690#endif
bellardcd6f1162004-05-13 22:02:20 +00004691 case QEMU_OPTION_h:
ths15f82202007-06-29 23:26:08 +00004692 help(0);
bellardcd6f1162004-05-13 22:02:20 +00004693 break;
pbrook9bd7e6d2009-04-07 22:58:45 +00004694 case QEMU_OPTION_version:
4695 version();
4696 exit(0);
4697 break;
aurel3200f82b82008-04-27 21:12:55 +00004698 case QEMU_OPTION_m: {
4699 uint64_t value;
4700 char *ptr;
4701
4702 value = strtoul(optarg, &ptr, 10);
4703 switch (*ptr) {
4704 case 0: case 'M': case 'm':
4705 value <<= 20;
4706 break;
4707 case 'G': case 'g':
4708 value <<= 30;
4709 break;
4710 default:
4711 fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
bellardcd6f1162004-05-13 22:02:20 +00004712 exit(1);
4713 }
aurel3200f82b82008-04-27 21:12:55 +00004714
4715 /* On 32-bit hosts, QEMU is limited by virtual address space */
4716 if (value > (2047 << 20)
blueswir1640f42e2009-04-19 10:18:01 +00004717#ifndef CONFIG_KQEMU
aurel3200f82b82008-04-27 21:12:55 +00004718 && HOST_LONG_BITS == 32
4719#endif
4720 ) {
4721 fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n");
4722 exit(1);
4723 }
4724 if (value != (uint64_t)(ram_addr_t)value) {
4725 fprintf(stderr, "qemu: ram size too large\n");
4726 exit(1);
4727 }
4728 ram_size = value;
bellardcd6f1162004-05-13 22:02:20 +00004729 break;
aurel3200f82b82008-04-27 21:12:55 +00004730 }
bellardcd6f1162004-05-13 22:02:20 +00004731 case QEMU_OPTION_d:
4732 {
4733 int mask;
blueswir1c7cd6a32008-10-02 18:27:46 +00004734 const CPULogItem *item;
ths3b46e622007-09-17 08:09:54 +00004735
bellardcd6f1162004-05-13 22:02:20 +00004736 mask = cpu_str_to_log_mask(optarg);
4737 if (!mask) {
4738 printf("Log items (comma separated):\n");
bellardf193c792004-03-21 17:06:25 +00004739 for(item = cpu_log_items; item->mask != 0; item++) {
4740 printf("%-10s %s\n", item->name, item->help);
4741 }
4742 exit(1);
bellardcd6f1162004-05-13 22:02:20 +00004743 }
4744 cpu_set_log(mask);
bellardf193c792004-03-21 17:06:25 +00004745 }
bellardcd6f1162004-05-13 22:02:20 +00004746 break;
bellard67b915a2004-03-31 23:37:16 +00004747#ifdef CONFIG_GDBSTUB
bellardcd6f1162004-05-13 22:02:20 +00004748 case QEMU_OPTION_s:
aliguori59030a82009-04-05 18:43:41 +00004749 gdbstub_dev = "tcp::" DEFAULT_GDBSTUB_PORT;
bellardcd6f1162004-05-13 22:02:20 +00004750 break;
aliguori59030a82009-04-05 18:43:41 +00004751 case QEMU_OPTION_gdb:
4752 gdbstub_dev = optarg;
bellardcd6f1162004-05-13 22:02:20 +00004753 break;
bellard67b915a2004-03-31 23:37:16 +00004754#endif
bellardcd6f1162004-05-13 22:02:20 +00004755 case QEMU_OPTION_L:
4756 bios_dir = optarg;
4757 break;
j_mayer1192dad2007-10-05 13:08:35 +00004758 case QEMU_OPTION_bios:
4759 bios_name = optarg;
4760 break;
aurel321b530a62009-04-05 20:08:59 +00004761 case QEMU_OPTION_singlestep:
4762 singlestep = 1;
4763 break;
bellardcd6f1162004-05-13 22:02:20 +00004764 case QEMU_OPTION_S:
pbrook3c07f8e2007-01-21 16:47:01 +00004765 autostart = 0;
bellardcd6f1162004-05-13 22:02:20 +00004766 break;
blueswir15824d652009-03-28 06:44:27 +00004767#ifndef _WIN32
bellard3d11d0e2004-12-12 16:56:30 +00004768 case QEMU_OPTION_k:
4769 keyboard_layout = optarg;
4770 break;
blueswir15824d652009-03-28 06:44:27 +00004771#endif
bellardee22c2f2004-06-03 12:49:50 +00004772 case QEMU_OPTION_localtime:
4773 rtc_utc = 0;
4774 break;
malc3893c122008-09-28 00:42:05 +00004775 case QEMU_OPTION_vga:
4776 select_vgahw (optarg);
bellard1bfe8562004-07-08 21:17:50 +00004777 break;
blueswir15824d652009-03-28 06:44:27 +00004778#if defined(TARGET_PPC) || defined(TARGET_SPARC)
bellarde9b137c2004-06-21 16:46:10 +00004779 case QEMU_OPTION_g:
4780 {
4781 const char *p;
4782 int w, h, depth;
4783 p = optarg;
4784 w = strtol(p, (char **)&p, 10);
4785 if (w <= 0) {
4786 graphic_error:
4787 fprintf(stderr, "qemu: invalid resolution or depth\n");
4788 exit(1);
4789 }
4790 if (*p != 'x')
4791 goto graphic_error;
4792 p++;
4793 h = strtol(p, (char **)&p, 10);
4794 if (h <= 0)
4795 goto graphic_error;
4796 if (*p == 'x') {
4797 p++;
4798 depth = strtol(p, (char **)&p, 10);
ths5fafdf22007-09-16 21:08:06 +00004799 if (depth != 8 && depth != 15 && depth != 16 &&
bellarde9b137c2004-06-21 16:46:10 +00004800 depth != 24 && depth != 32)
4801 goto graphic_error;
4802 } else if (*p == '\0') {
4803 depth = graphic_depth;
4804 } else {
4805 goto graphic_error;
4806 }
ths3b46e622007-09-17 08:09:54 +00004807
bellarde9b137c2004-06-21 16:46:10 +00004808 graphic_width = w;
4809 graphic_height = h;
4810 graphic_depth = depth;
4811 }
4812 break;
blueswir15824d652009-03-28 06:44:27 +00004813#endif
ths20d8a3e2007-02-18 17:04:49 +00004814 case QEMU_OPTION_echr:
4815 {
4816 char *r;
4817 term_escape_char = strtol(optarg, &r, 0);
4818 if (r == optarg)
4819 printf("Bad argument to echr\n");
4820 break;
4821 }
bellard82c643f2004-07-14 17:28:13 +00004822 case QEMU_OPTION_monitor:
pbrookfd5f3932008-03-26 20:55:43 +00004823 monitor_device = optarg;
bellard82c643f2004-07-14 17:28:13 +00004824 break;
4825 case QEMU_OPTION_serial:
bellard8d11df92004-08-24 21:13:40 +00004826 if (serial_device_index >= MAX_SERIAL_PORTS) {
4827 fprintf(stderr, "qemu: too many serial ports\n");
4828 exit(1);
4829 }
pbrookfd5f3932008-03-26 20:55:43 +00004830 serial_devices[serial_device_index] = optarg;
bellard8d11df92004-08-24 21:13:40 +00004831 serial_device_index++;
bellard82c643f2004-07-14 17:28:13 +00004832 break;
aliguori51ecf132009-01-15 20:06:40 +00004833 case QEMU_OPTION_virtiocon:
4834 if (virtio_console_index >= MAX_VIRTIO_CONSOLES) {
4835 fprintf(stderr, "qemu: too many virtio consoles\n");
4836 exit(1);
4837 }
4838 virtio_consoles[virtio_console_index] = optarg;
4839 virtio_console_index++;
4840 break;
bellard6508fe52005-01-15 12:02:56 +00004841 case QEMU_OPTION_parallel:
4842 if (parallel_device_index >= MAX_PARALLEL_PORTS) {
4843 fprintf(stderr, "qemu: too many parallel ports\n");
4844 exit(1);
4845 }
pbrookfd5f3932008-03-26 20:55:43 +00004846 parallel_devices[parallel_device_index] = optarg;
bellard6508fe52005-01-15 12:02:56 +00004847 parallel_device_index++;
4848 break;
bellardd63d3072004-10-03 13:29:03 +00004849 case QEMU_OPTION_loadvm:
4850 loadvm = optarg;
4851 break;
4852 case QEMU_OPTION_full_screen:
4853 full_screen = 1;
4854 break;
ths667acca2006-12-11 02:08:05 +00004855#ifdef CONFIG_SDL
ths43523e92007-02-18 18:19:32 +00004856 case QEMU_OPTION_no_frame:
4857 no_frame = 1;
4858 break;
ths3780e192007-06-21 21:08:02 +00004859 case QEMU_OPTION_alt_grab:
4860 alt_grab = 1;
4861 break;
ths667acca2006-12-11 02:08:05 +00004862 case QEMU_OPTION_no_quit:
4863 no_quit = 1;
4864 break;
aliguori7d957bd2009-01-15 22:14:11 +00004865 case QEMU_OPTION_sdl:
4866 sdl = 1;
4867 break;
ths667acca2006-12-11 02:08:05 +00004868#endif
bellardf7cce892004-12-08 22:21:25 +00004869 case QEMU_OPTION_pidfile:
ths93815bc2007-03-19 15:58:31 +00004870 pid_file = optarg;
bellardf7cce892004-12-08 22:21:25 +00004871 break;
bellarda09db212005-04-30 16:10:35 +00004872#ifdef TARGET_I386
4873 case QEMU_OPTION_win2k_hack:
4874 win2k_install_hack = 1;
4875 break;
aliguori73822ec2009-01-15 20:11:34 +00004876 case QEMU_OPTION_rtc_td_hack:
4877 rtc_td_hack = 1;
4878 break;
aliguori8a92ea22009-02-27 20:12:36 +00004879 case QEMU_OPTION_acpitable:
4880 if(acpi_table_add(optarg) < 0) {
4881 fprintf(stderr, "Wrong acpi table provided\n");
4882 exit(1);
4883 }
4884 break;
aliguorib6f6e3d2009-04-17 18:59:56 +00004885 case QEMU_OPTION_smbios:
4886 if(smbios_entry_add(optarg) < 0) {
4887 fprintf(stderr, "Wrong smbios provided\n");
4888 exit(1);
4889 }
4890 break;
bellarda09db212005-04-30 16:10:35 +00004891#endif
blueswir1640f42e2009-04-19 10:18:01 +00004892#ifdef CONFIG_KQEMU
bellardd993e022005-02-10 22:00:06 +00004893 case QEMU_OPTION_no_kqemu:
4894 kqemu_allowed = 0;
4895 break;
bellard89bfc102006-02-08 22:46:31 +00004896 case QEMU_OPTION_kernel_kqemu:
4897 kqemu_allowed = 2;
4898 break;
bellardd993e022005-02-10 22:00:06 +00004899#endif
aliguori7ba1e612008-11-05 16:04:33 +00004900#ifdef CONFIG_KVM
4901 case QEMU_OPTION_enable_kvm:
4902 kvm_allowed = 1;
blueswir1640f42e2009-04-19 10:18:01 +00004903#ifdef CONFIG_KQEMU
aliguori7ba1e612008-11-05 16:04:33 +00004904 kqemu_allowed = 0;
4905#endif
4906 break;
4907#endif
bellardbb36d472005-11-05 14:22:28 +00004908 case QEMU_OPTION_usb:
4909 usb_enabled = 1;
4910 break;
bellarda594cfb2005-11-06 16:13:29 +00004911 case QEMU_OPTION_usbdevice:
4912 usb_enabled = 1;
pbrook0d92ed32006-05-21 16:30:15 +00004913 if (usb_devices_index >= MAX_USB_CMDLINE) {
bellarda594cfb2005-11-06 16:13:29 +00004914 fprintf(stderr, "Too many USB devices\n");
4915 exit(1);
4916 }
pbrookfd5f3932008-03-26 20:55:43 +00004917 usb_devices[usb_devices_index] = optarg;
bellarda594cfb2005-11-06 16:13:29 +00004918 usb_devices_index++;
4919 break;
bellard6a00d602005-11-21 23:25:50 +00004920 case QEMU_OPTION_smp:
4921 smp_cpus = atoi(optarg);
aliguorib2097002008-10-07 20:39:39 +00004922 if (smp_cpus < 1) {
bellard6a00d602005-11-21 23:25:50 +00004923 fprintf(stderr, "Invalid number of CPUs\n");
4924 exit(1);
4925 }
4926 break;
bellard24236862006-04-30 21:28:36 +00004927 case QEMU_OPTION_vnc:
ths73fc9742006-12-22 02:09:07 +00004928 vnc_display = optarg;
bellard24236862006-04-30 21:28:36 +00004929 break;
blueswir15824d652009-03-28 06:44:27 +00004930#ifdef TARGET_I386
bellard6515b202006-05-03 22:02:44 +00004931 case QEMU_OPTION_no_acpi:
4932 acpi_enabled = 0;
4933 break;
aliguori16b29ae2008-12-17 23:28:44 +00004934 case QEMU_OPTION_no_hpet:
4935 no_hpet = 1;
4936 break;
blueswir15824d652009-03-28 06:44:27 +00004937#endif
bellardd1beab82006-10-02 19:44:22 +00004938 case QEMU_OPTION_no_reboot:
4939 no_reboot = 1;
4940 break;
aurel32b2f76162008-04-11 21:35:52 +00004941 case QEMU_OPTION_no_shutdown:
4942 no_shutdown = 1;
4943 break;
balrog9467cd42007-05-01 01:34:14 +00004944 case QEMU_OPTION_show_cursor:
4945 cursor_hide = 0;
4946 break;
blueswir18fcb1b92008-09-18 18:29:08 +00004947 case QEMU_OPTION_uuid:
4948 if(qemu_uuid_parse(optarg, qemu_uuid) < 0) {
4949 fprintf(stderr, "Fail to parse UUID string."
4950 " Wrong format.\n");
4951 exit(1);
4952 }
4953 break;
blueswir15824d652009-03-28 06:44:27 +00004954#ifndef _WIN32
ths71e3ceb2006-12-22 02:11:31 +00004955 case QEMU_OPTION_daemonize:
4956 daemonize = 1;
4957 break;
blueswir15824d652009-03-28 06:44:27 +00004958#endif
ths9ae02552007-01-05 17:39:04 +00004959 case QEMU_OPTION_option_rom:
4960 if (nb_option_roms >= MAX_OPTION_ROMS) {
4961 fprintf(stderr, "Too many option ROMs\n");
4962 exit(1);
4963 }
4964 option_rom[nb_option_roms] = optarg;
4965 nb_option_roms++;
4966 break;
blueswir15824d652009-03-28 06:44:27 +00004967#if defined(TARGET_ARM) || defined(TARGET_M68K)
pbrook8e716212007-01-20 17:12:09 +00004968 case QEMU_OPTION_semihosting:
4969 semihosting_enabled = 1;
4970 break;
blueswir15824d652009-03-28 06:44:27 +00004971#endif
thsc35734b2007-03-19 15:17:08 +00004972 case QEMU_OPTION_name:
4973 qemu_name = optarg;
4974 break;
blueswir195efd112008-12-24 20:26:14 +00004975#if defined(TARGET_SPARC) || defined(TARGET_PPC)
blueswir166508602007-05-01 14:16:52 +00004976 case QEMU_OPTION_prom_env:
4977 if (nb_prom_envs >= MAX_PROM_ENVS) {
4978 fprintf(stderr, "Too many prom variables\n");
4979 exit(1);
4980 }
4981 prom_envs[nb_prom_envs] = optarg;
4982 nb_prom_envs++;
4983 break;
4984#endif
balrog2b8f2d42007-07-27 22:08:46 +00004985#ifdef TARGET_ARM
4986 case QEMU_OPTION_old_param:
4987 old_param = 1;
ths05ebd532008-01-08 19:32:16 +00004988 break;
balrog2b8f2d42007-07-27 22:08:46 +00004989#endif
thsf3dcfad2007-08-24 01:26:02 +00004990 case QEMU_OPTION_clock:
4991 configure_alarms(optarg);
4992 break;
bellard7e0af5d02007-11-07 16:24:33 +00004993 case QEMU_OPTION_startdate:
4994 {
4995 struct tm tm;
balrogf6503052008-02-17 11:42:19 +00004996 time_t rtc_start_date;
bellard7e0af5d02007-11-07 16:24:33 +00004997 if (!strcmp(optarg, "now")) {
balrogf6503052008-02-17 11:42:19 +00004998 rtc_date_offset = -1;
bellard7e0af5d02007-11-07 16:24:33 +00004999 } else {
5000 if (sscanf(optarg, "%d-%d-%dT%d:%d:%d",
5001 &tm.tm_year,
5002 &tm.tm_mon,
5003 &tm.tm_mday,
5004 &tm.tm_hour,
5005 &tm.tm_min,
5006 &tm.tm_sec) == 6) {
5007 /* OK */
5008 } else if (sscanf(optarg, "%d-%d-%d",
5009 &tm.tm_year,
5010 &tm.tm_mon,
5011 &tm.tm_mday) == 3) {
5012 tm.tm_hour = 0;
5013 tm.tm_min = 0;
5014 tm.tm_sec = 0;
5015 } else {
5016 goto date_fail;
5017 }
5018 tm.tm_year -= 1900;
5019 tm.tm_mon--;
bellard3c6b2082007-11-10 19:36:39 +00005020 rtc_start_date = mktimegm(&tm);
bellard7e0af5d02007-11-07 16:24:33 +00005021 if (rtc_start_date == -1) {
5022 date_fail:
5023 fprintf(stderr, "Invalid date format. Valid format are:\n"
5024 "'now' or '2006-06-17T16:01:21' or '2006-06-17'\n");
5025 exit(1);
5026 }
balrogf6503052008-02-17 11:42:19 +00005027 rtc_date_offset = time(NULL) - rtc_start_date;
bellard7e0af5d02007-11-07 16:24:33 +00005028 }
5029 }
5030 break;
bellard26a5f132008-05-28 12:30:31 +00005031 case QEMU_OPTION_tb_size:
5032 tb_size = strtol(optarg, NULL, 0);
5033 if (tb_size < 0)
5034 tb_size = 0;
5035 break;
pbrook2e70f6e2008-06-29 01:03:05 +00005036 case QEMU_OPTION_icount:
5037 use_icount = 1;
5038 if (strcmp(optarg, "auto") == 0) {
5039 icount_time_shift = -1;
5040 } else {
5041 icount_time_shift = strtol(optarg, NULL, 0);
5042 }
5043 break;
aliguori5bb79102008-10-13 03:12:02 +00005044 case QEMU_OPTION_incoming:
5045 incoming = optarg;
5046 break;
blueswir15824d652009-03-28 06:44:27 +00005047#ifndef _WIN32
aliguori08585322009-02-27 22:09:45 +00005048 case QEMU_OPTION_chroot:
5049 chroot_dir = optarg;
5050 break;
5051 case QEMU_OPTION_runas:
5052 run_as = optarg;
5053 break;
blueswir15824d652009-03-28 06:44:27 +00005054#endif
aliguorie37630c2009-04-22 15:19:10 +00005055#ifdef CONFIG_XEN
5056 case QEMU_OPTION_xen_domid:
5057 xen_domid = atoi(optarg);
5058 break;
5059 case QEMU_OPTION_xen_create:
5060 xen_mode = XEN_CREATE;
5061 break;
5062 case QEMU_OPTION_xen_attach:
5063 xen_mode = XEN_ATTACH;
5064 break;
5065#endif
bellardcd6f1162004-05-13 22:02:20 +00005066 }
bellard0824d6f2003-06-24 13:42:40 +00005067 }
5068 }
bellard330d0412003-07-26 18:11:40 +00005069
blueswir1640f42e2009-04-19 10:18:01 +00005070#if defined(CONFIG_KVM) && defined(CONFIG_KQEMU)
aliguori7ba1e612008-11-05 16:04:33 +00005071 if (kvm_allowed && kqemu_allowed) {
5072 fprintf(stderr,
5073 "You can not enable both KVM and kqemu at the same time\n");
5074 exit(1);
5075 }
5076#endif
5077
balrog3d878ca2008-10-28 10:59:59 +00005078 machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
aliguorib2097002008-10-07 20:39:39 +00005079 if (smp_cpus > machine->max_cpus) {
5080 fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus "
5081 "supported by machine `%s' (%d)\n", smp_cpus, machine->name,
5082 machine->max_cpus);
5083 exit(1);
5084 }
5085
aliguoribc0129d2008-08-01 15:12:34 +00005086 if (nographic) {
5087 if (serial_device_index == 0)
5088 serial_devices[0] = "stdio";
5089 if (parallel_device_index == 0)
5090 parallel_devices[0] = "null";
5091 if (strncmp(monitor_device, "vc", 2) == 0)
5092 monitor_device = "stdio";
5093 }
5094
ths71e3ceb2006-12-22 02:11:31 +00005095#ifndef _WIN32
ths71e3ceb2006-12-22 02:11:31 +00005096 if (daemonize) {
5097 pid_t pid;
5098
5099 if (pipe(fds) == -1)
5100 exit(1);
5101
5102 pid = fork();
5103 if (pid > 0) {
5104 uint8_t status;
5105 ssize_t len;
5106
5107 close(fds[1]);
5108
5109 again:
ths93815bc2007-03-19 15:58:31 +00005110 len = read(fds[0], &status, 1);
5111 if (len == -1 && (errno == EINTR))
5112 goto again;
5113
5114 if (len != 1)
5115 exit(1);
5116 else if (status == 1) {
5117 fprintf(stderr, "Could not acquire pidfile\n");
5118 exit(1);
5119 } else
5120 exit(0);
ths71e3ceb2006-12-22 02:11:31 +00005121 } else if (pid < 0)
ths93815bc2007-03-19 15:58:31 +00005122 exit(1);
ths71e3ceb2006-12-22 02:11:31 +00005123
5124 setsid();
5125
5126 pid = fork();
5127 if (pid > 0)
5128 exit(0);
5129 else if (pid < 0)
5130 exit(1);
5131
5132 umask(027);
ths71e3ceb2006-12-22 02:11:31 +00005133
5134 signal(SIGTSTP, SIG_IGN);
5135 signal(SIGTTOU, SIG_IGN);
5136 signal(SIGTTIN, SIG_IGN);
5137 }
ths71e3ceb2006-12-22 02:11:31 +00005138
thsaa26bb22007-03-25 21:33:06 +00005139 if (pid_file && qemu_create_pidfile(pid_file) != 0) {
ths93815bc2007-03-19 15:58:31 +00005140 if (daemonize) {
5141 uint8_t status = 1;
5142 write(fds[1], &status, 1);
5143 } else
5144 fprintf(stderr, "Could not acquire pid file\n");
5145 exit(1);
5146 }
blueswir1b9e82a52009-04-05 18:03:31 +00005147#endif
ths93815bc2007-03-19 15:58:31 +00005148
blueswir1640f42e2009-04-19 10:18:01 +00005149#ifdef CONFIG_KQEMU
bellardff3fbb32006-01-08 10:53:14 +00005150 if (smp_cpus > 1)
5151 kqemu_allowed = 0;
5152#endif
aliguori3fcf7b62009-04-24 18:03:25 +00005153 if (qemu_init_main_loop()) {
5154 fprintf(stderr, "qemu_init_main_loop failed\n");
5155 exit(1);
5156 }
bellarda20dd502003-09-30 21:07:02 +00005157 linux_boot = (kernel_filename != NULL);
balrog7317b8c2007-11-18 02:09:36 +00005158 net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
balrog6c41b272007-11-17 12:12:29 +00005159
thsf8d39c02008-07-03 10:01:15 +00005160 if (!linux_boot && *kernel_cmdline != '\0') {
5161 fprintf(stderr, "-append only allowed with -kernel option\n");
5162 exit(1);
5163 }
5164
5165 if (!linux_boot && initrd_filename != NULL) {
5166 fprintf(stderr, "-initrd only allowed with -kernel option\n");
5167 exit(1);
5168 }
5169
ths96d30e42007-01-07 20:42:14 +00005170 /* boot to floppy or the default cd if no hard disk defined yet */
j_mayer28c5af52007-11-11 01:50:45 +00005171 if (!boot_devices[0]) {
thse4bcb142007-12-02 04:51:10 +00005172 boot_devices = "cad";
ths96d30e42007-01-07 20:42:14 +00005173 }
bellardb118d612003-06-30 23:36:21 +00005174 setvbuf(stdout, NULL, _IOLBF, 0);
ths3b46e622007-09-17 08:09:54 +00005175
pbrook634fce92006-07-15 17:40:09 +00005176 init_timers();
aliguori7183b4b2008-11-05 20:40:18 +00005177 if (init_timer_alarm() < 0) {
5178 fprintf(stderr, "could not initialize alarm timer\n");
5179 exit(1);
5180 }
pbrook2e70f6e2008-06-29 01:03:05 +00005181 if (use_icount && icount_time_shift < 0) {
5182 use_icount = 2;
5183 /* 125MIPS seems a reasonable initial guess at the guest speed.
5184 It will be corrected fairly quickly anyway. */
5185 icount_time_shift = 3;
5186 init_icount_adjust();
5187 }
pbrook634fce92006-07-15 17:40:09 +00005188
bellardfd1dff42006-02-01 21:29:26 +00005189#ifdef _WIN32
5190 socket_init();
5191#endif
5192
bellard7c9d8e02005-11-15 22:16:05 +00005193 /* init network clients */
5194 if (nb_net_clients == 0) {
5195 /* if no clients, we use a default config */
aliguorif441b282008-08-28 20:05:14 +00005196 net_clients[nb_net_clients++] = "nic";
5197#ifdef CONFIG_SLIRP
5198 net_clients[nb_net_clients++] = "user";
5199#endif
bellardc20709a2004-04-21 23:27:19 +00005200 }
5201
bellard7c9d8e02005-11-15 22:16:05 +00005202 for(i = 0;i < nb_net_clients; i++) {
balrog9ad97e62008-07-29 13:16:31 +00005203 if (net_client_parse(net_clients[i]) < 0)
bellard7c9d8e02005-11-15 22:16:05 +00005204 exit(1);
bellard702c6512004-04-02 21:21:32 +00005205 }
aliguori63a01ef2008-10-31 19:10:00 +00005206 net_client_check();
bellardf1510b22003-06-25 00:07:40 +00005207
thseec85c22007-01-05 17:41:07 +00005208#ifdef TARGET_I386
balroged494d82007-12-11 23:23:52 +00005209 /* XXX: this should be moved in the PC machine instantiation code */
j_mayer28c5af52007-11-11 01:50:45 +00005210 if (net_boot != 0) {
5211 int netroms = 0;
5212 for (i = 0; i < nb_nics && i < 4; i++) {
thseec85c22007-01-05 17:41:07 +00005213 const char *model = nd_table[i].model;
5214 char buf[1024];
j_mayer28c5af52007-11-11 01:50:45 +00005215 if (net_boot & (1 << i)) {
5216 if (model == NULL)
5217 model = "ne2k_pci";
5218 snprintf(buf, sizeof(buf), "%s/pxe-%s.bin", bios_dir, model);
5219 if (get_image_size(buf) > 0) {
5220 if (nb_option_roms >= MAX_OPTION_ROMS) {
5221 fprintf(stderr, "Too many option ROMs\n");
5222 exit(1);
5223 }
5224 option_rom[nb_option_roms] = strdup(buf);
5225 nb_option_roms++;
5226 netroms++;
5227 }
5228 }
thseec85c22007-01-05 17:41:07 +00005229 }
j_mayer28c5af52007-11-11 01:50:45 +00005230 if (netroms == 0) {
thseec85c22007-01-05 17:41:07 +00005231 fprintf(stderr, "No valid PXE rom found for network device\n");
5232 exit(1);
5233 }
thseec85c22007-01-05 17:41:07 +00005234 }
5235#endif
5236
balrogdc72ac12008-11-09 00:04:26 +00005237 /* init the bluetooth world */
5238 for (i = 0; i < nb_bt_opts; i++)
5239 if (bt_parse(bt_opts[i]))
5240 exit(1);
5241
bellard0824d6f2003-06-24 13:42:40 +00005242 /* init the memory */
pbrook94a6b542009-04-11 17:15:54 +00005243 if (ram_size == 0)
5244 ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
balrog7fb4fdc2008-04-24 17:59:27 +00005245
blueswir1640f42e2009-04-19 10:18:01 +00005246#ifdef CONFIG_KQEMU
pbrook94a6b542009-04-11 17:15:54 +00005247 /* FIXME: This is a nasty hack because kqemu can't cope with dynamic
5248 guest ram allocation. It needs to go away. */
5249 if (kqemu_allowed) {
5250 kqemu_phys_ram_size = ram_size + VGA_RAM_SIZE + 4 * 1024 * 1024;
5251 kqemu_phys_ram_base = qemu_vmalloc(kqemu_phys_ram_size);
5252 if (!kqemu_phys_ram_base) {
5253 fprintf(stderr, "Could not allocate physical memory\n");
5254 exit(1);
5255 }
balrog7fb4fdc2008-04-24 17:59:27 +00005256 }
pbrook94a6b542009-04-11 17:15:54 +00005257#endif
bellard0824d6f2003-06-24 13:42:40 +00005258
bellard26a5f132008-05-28 12:30:31 +00005259 /* init the dynamic translator */
5260 cpu_exec_init_all(tb_size * 1024 * 1024);
5261
bellard5905b2e2004-08-01 21:53:26 +00005262 bdrv_init();
aliguori6512a2a2009-03-20 18:26:07 +00005263 dma_helper_init();
thse4bcb142007-12-02 04:51:10 +00005264
5265 /* we always create the cdrom drive, even if no disk is there */
5266
5267 if (nb_drives_opt < MAX_DRIVES)
balrog609497a2008-01-14 02:56:53 +00005268 drive_add(NULL, CDROM_ALIAS);
thse4bcb142007-12-02 04:51:10 +00005269
balrog9d413d12007-12-04 00:10:34 +00005270 /* we always create at least one floppy */
thse4bcb142007-12-02 04:51:10 +00005271
5272 if (nb_drives_opt < MAX_DRIVES)
balrog609497a2008-01-14 02:56:53 +00005273 drive_add(NULL, FD_ALIAS, 0);
bellardc4b1fcc2004-03-14 21:44:30 +00005274
balrog9d413d12007-12-04 00:10:34 +00005275 /* we always create one sd slot, even if no card is in it */
5276
5277 if (nb_drives_opt < MAX_DRIVES)
balrog609497a2008-01-14 02:56:53 +00005278 drive_add(NULL, SD_ALIAS);
balrog9d413d12007-12-04 00:10:34 +00005279
ths96d30e42007-01-07 20:42:14 +00005280 /* open the virtual block devices */
bellardc4b1fcc2004-03-14 21:44:30 +00005281
thse4bcb142007-12-02 04:51:10 +00005282 for(i = 0; i < nb_drives_opt; i++)
balrog609497a2008-01-14 02:56:53 +00005283 if (drive_init(&drives_opt[i], snapshot, machine) == -1)
thse4bcb142007-12-02 04:51:10 +00005284 exit(1);
balrog3e3d5812007-04-30 02:09:25 +00005285
bellardc88676f2006-08-06 13:36:11 +00005286 register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
aliguori475e4272008-10-06 20:21:51 +00005287 register_savevm_live("ram", 0, 3, ram_save_live, NULL, ram_load, NULL);
bellard8a7ddc32004-03-31 19:00:16 +00005288
aliguori3023f332009-01-16 19:04:14 +00005289#ifndef _WIN32
5290 /* must be after terminal init, SDL library changes signal handlers */
5291 termsig_setup();
5292#endif
5293
5294 /* Maintain compatibility with multiple stdio monitors */
5295 if (!strcmp(monitor_device,"stdio")) {
5296 for (i = 0; i < MAX_SERIAL_PORTS; i++) {
5297 const char *devname = serial_devices[i];
5298 if (devname && !strcmp(devname,"mon:stdio")) {
5299 monitor_device = NULL;
5300 break;
5301 } else if (devname && !strcmp(devname,"stdio")) {
5302 monitor_device = NULL;
5303 serial_devices[i] = "mon:stdio";
5304 break;
5305 }
5306 }
5307 }
5308
aliguori268a3622009-04-21 22:30:27 +00005309 if (nb_numa_nodes > 0) {
5310 int i;
5311
5312 if (nb_numa_nodes > smp_cpus) {
5313 nb_numa_nodes = smp_cpus;
5314 }
5315
5316 /* If no memory size if given for any node, assume the default case
5317 * and distribute the available memory equally across all nodes
5318 */
5319 for (i = 0; i < nb_numa_nodes; i++) {
5320 if (node_mem[i] != 0)
5321 break;
5322 }
5323 if (i == nb_numa_nodes) {
5324 uint64_t usedmem = 0;
5325
5326 /* On Linux, the each node's border has to be 8MB aligned,
5327 * the final node gets the rest.
5328 */
5329 for (i = 0; i < nb_numa_nodes - 1; i++) {
5330 node_mem[i] = (ram_size / nb_numa_nodes) & ~((1 << 23UL) - 1);
5331 usedmem += node_mem[i];
5332 }
5333 node_mem[i] = ram_size - usedmem;
5334 }
5335
5336 for (i = 0; i < nb_numa_nodes; i++) {
5337 if (node_cpumask[i] != 0)
5338 break;
5339 }
5340 /* assigning the VCPUs round-robin is easier to implement, guest OSes
5341 * must cope with this anyway, because there are BIOSes out there in
5342 * real machines which also use this scheme.
5343 */
5344 if (i == nb_numa_nodes) {
5345 for (i = 0; i < smp_cpus; i++) {
5346 node_cpumask[i % nb_numa_nodes] |= 1 << i;
5347 }
5348 }
5349 }
5350
aliguori3023f332009-01-16 19:04:14 +00005351 if (kvm_enabled()) {
5352 int ret;
5353
5354 ret = kvm_init(smp_cpus);
5355 if (ret < 0) {
5356 fprintf(stderr, "failed to initialize KVM\n");
5357 exit(1);
5358 }
5359 }
5360
aliguori4c621802009-01-16 21:48:20 +00005361 if (monitor_device) {
aurel32ceecf1d2009-01-18 14:08:04 +00005362 monitor_hd = qemu_chr_open("monitor", monitor_device, NULL);
aliguori4c621802009-01-16 21:48:20 +00005363 if (!monitor_hd) {
5364 fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
5365 exit(1);
5366 }
5367 }
5368
aliguori2796dae2009-01-16 20:23:27 +00005369 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
5370 const char *devname = serial_devices[i];
5371 if (devname && strcmp(devname, "none")) {
5372 char label[32];
5373 snprintf(label, sizeof(label), "serial%d", i);
aurel32ceecf1d2009-01-18 14:08:04 +00005374 serial_hds[i] = qemu_chr_open(label, devname, NULL);
aliguori2796dae2009-01-16 20:23:27 +00005375 if (!serial_hds[i]) {
5376 fprintf(stderr, "qemu: could not open serial device '%s'\n",
5377 devname);
5378 exit(1);
5379 }
5380 }
5381 }
5382
5383 for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
5384 const char *devname = parallel_devices[i];
5385 if (devname && strcmp(devname, "none")) {
5386 char label[32];
5387 snprintf(label, sizeof(label), "parallel%d", i);
aurel32ceecf1d2009-01-18 14:08:04 +00005388 parallel_hds[i] = qemu_chr_open(label, devname, NULL);
aliguori2796dae2009-01-16 20:23:27 +00005389 if (!parallel_hds[i]) {
5390 fprintf(stderr, "qemu: could not open parallel device '%s'\n",
5391 devname);
5392 exit(1);
5393 }
5394 }
5395 }
5396
5397 for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) {
5398 const char *devname = virtio_consoles[i];
5399 if (devname && strcmp(devname, "none")) {
5400 char label[32];
5401 snprintf(label, sizeof(label), "virtcon%d", i);
aurel32ceecf1d2009-01-18 14:08:04 +00005402 virtcon_hds[i] = qemu_chr_open(label, devname, NULL);
aliguori2796dae2009-01-16 20:23:27 +00005403 if (!virtcon_hds[i]) {
5404 fprintf(stderr, "qemu: could not open virtio console '%s'\n",
5405 devname);
5406 exit(1);
5407 }
5408 }
5409 }
5410
aliguori3023f332009-01-16 19:04:14 +00005411 machine->init(ram_size, vga_ram_size, boot_devices,
5412 kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
5413
aliguori268a3622009-04-21 22:30:27 +00005414
5415 for (env = first_cpu; env != NULL; env = env->next_cpu) {
5416 for (i = 0; i < nb_numa_nodes; i++) {
5417 if (node_cpumask[i] & (1 << env->cpu_index)) {
5418 env->numa_node = i;
5419 }
5420 }
5421 }
5422
aliguori6f338c32009-02-11 15:21:54 +00005423 current_machine = machine;
5424
aliguori3023f332009-01-16 19:04:14 +00005425 /* Set KVM's vcpu state to qemu's initial CPUState. */
5426 if (kvm_enabled()) {
5427 int ret;
5428
5429 ret = kvm_sync_vcpus();
5430 if (ret < 0) {
5431 fprintf(stderr, "failed to initialize vcpus\n");
5432 exit(1);
5433 }
5434 }
5435
5436 /* init USB devices */
5437 if (usb_enabled) {
5438 for(i = 0; i < usb_devices_index; i++) {
aliguoric0f4ce72009-03-05 23:01:01 +00005439 if (usb_device_add(usb_devices[i], 0) < 0) {
aliguori3023f332009-01-16 19:04:14 +00005440 fprintf(stderr, "Warning: could not add USB device %s\n",
5441 usb_devices[i]);
5442 }
5443 }
5444 }
5445
aliguori8f391ab2009-01-19 16:34:10 +00005446 if (!display_state)
5447 dumb_display_init();
aliguori3023f332009-01-16 19:04:14 +00005448 /* just use the first displaystate for the moment */
5449 ds = display_state;
bellard313aa562003-08-10 21:52:11 +00005450 /* terminal init */
bellarda20dd502003-09-30 21:07:02 +00005451 if (nographic) {
balrog4d3b6f62008-02-10 16:33:14 +00005452 if (curses) {
5453 fprintf(stderr, "fatal: -nographic can't be used with -curses\n");
5454 exit(1);
5455 }
aliguori7d957bd2009-01-15 22:14:11 +00005456 } else {
balrog4d3b6f62008-02-10 16:33:14 +00005457#if defined(CONFIG_CURSES)
aliguori7d957bd2009-01-15 22:14:11 +00005458 if (curses) {
5459 /* At the moment curses cannot be used with other displays */
5460 curses_display_init(ds, full_screen);
5461 } else
balrog4d3b6f62008-02-10 16:33:14 +00005462#endif
aliguori7d957bd2009-01-15 22:14:11 +00005463 {
5464 if (vnc_display != NULL) {
5465 vnc_display_init(ds);
5466 if (vnc_display_open(ds, vnc_display) < 0)
5467 exit(1);
5468 }
bellard5b0753e2005-03-01 21:37:28 +00005469#if defined(CONFIG_SDL)
aliguorid268de02009-01-22 16:18:33 +00005470 if (sdl || !vnc_display)
aliguori7d957bd2009-01-15 22:14:11 +00005471 sdl_display_init(ds, full_screen, no_frame);
bellard5b0753e2005-03-01 21:37:28 +00005472#elif defined(CONFIG_COCOA)
aliguorid268de02009-01-22 16:18:33 +00005473 if (sdl || !vnc_display)
aliguori7d957bd2009-01-15 22:14:11 +00005474 cocoa_display_init(ds, full_screen);
bellard313aa562003-08-10 21:52:11 +00005475#endif
aliguori7d957bd2009-01-15 22:14:11 +00005476 }
bellard313aa562003-08-10 21:52:11 +00005477 }
aliguori7d957bd2009-01-15 22:14:11 +00005478 dpy_resize(ds);
aliguori5b08fc12008-08-21 20:08:03 +00005479
aliguori3023f332009-01-16 19:04:14 +00005480 dcl = ds->listeners;
5481 while (dcl != NULL) {
5482 if (dcl->dpy_refresh != NULL) {
5483 ds->gui_timer = qemu_new_timer(rt_clock, gui_update, ds);
5484 qemu_mod_timer(ds->gui_timer, qemu_get_clock(rt_clock));
ths20d8a3e2007-02-18 17:04:49 +00005485 }
aliguori3023f332009-01-16 19:04:14 +00005486 dcl = dcl->next;
bellard82c643f2004-07-14 17:28:13 +00005487 }
aliguori3023f332009-01-16 19:04:14 +00005488
blueswir19043b622009-01-21 19:28:13 +00005489 if (nographic || (vnc_display && !sdl)) {
5490 nographic_timer = qemu_new_timer(rt_clock, nographic_update, NULL);
5491 qemu_mod_timer(nographic_timer, qemu_get_clock(rt_clock));
5492 }
5493
aliguori2796dae2009-01-16 20:23:27 +00005494 text_consoles_set_display(display_state);
aliguori2970a6c2009-03-05 22:59:58 +00005495 qemu_chr_initial_reset();
aliguori2796dae2009-01-16 20:23:27 +00005496
aliguori4c621802009-01-16 21:48:20 +00005497 if (monitor_device && monitor_hd)
aliguoricde76ee2009-03-05 23:01:51 +00005498 monitor_init(monitor_hd, MONITOR_USE_READLINE | MONITOR_IS_DEFAULT);
bellard82c643f2004-07-14 17:28:13 +00005499
bellard8d11df92004-08-24 21:13:40 +00005500 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
bellardc03b0f02006-09-03 14:10:53 +00005501 const char *devname = serial_devices[i];
pbrookfd5f3932008-03-26 20:55:43 +00005502 if (devname && strcmp(devname, "none")) {
aliguori5ccfae12008-10-31 17:31:29 +00005503 char label[32];
5504 snprintf(label, sizeof(label), "serial%d", i);
thsaf3a9032007-07-11 23:14:59 +00005505 if (strstart(devname, "vc", 0))
bellard7ba12602006-07-14 20:26:42 +00005506 qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
bellard8d11df92004-08-24 21:13:40 +00005507 }
bellard82c643f2004-07-14 17:28:13 +00005508 }
bellard82c643f2004-07-14 17:28:13 +00005509
bellard6508fe52005-01-15 12:02:56 +00005510 for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
bellardc03b0f02006-09-03 14:10:53 +00005511 const char *devname = parallel_devices[i];
pbrookfd5f3932008-03-26 20:55:43 +00005512 if (devname && strcmp(devname, "none")) {
aliguori5ccfae12008-10-31 17:31:29 +00005513 char label[32];
5514 snprintf(label, sizeof(label), "parallel%d", i);
thsaf3a9032007-07-11 23:14:59 +00005515 if (strstart(devname, "vc", 0))
bellard7ba12602006-07-14 20:26:42 +00005516 qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
bellard6508fe52005-01-15 12:02:56 +00005517 }
5518 }
5519
aliguori9ede2fd2009-01-15 20:05:25 +00005520 for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) {
5521 const char *devname = virtio_consoles[i];
aliguori2796dae2009-01-16 20:23:27 +00005522 if (virtcon_hds[i] && devname) {
aliguori9ede2fd2009-01-15 20:05:25 +00005523 char label[32];
5524 snprintf(label, sizeof(label), "virtcon%d", i);
aliguori9ede2fd2009-01-15 20:05:25 +00005525 if (strstart(devname, "vc", 0))
5526 qemu_chr_printf(virtcon_hds[i], "virtio console%d\r\n", i);
5527 }
5528 }
5529
bellard67b915a2004-03-31 23:37:16 +00005530#ifdef CONFIG_GDBSTUB
aliguori59030a82009-04-05 18:43:41 +00005531 if (gdbstub_dev && gdbserver_start(gdbstub_dev) < 0) {
5532 fprintf(stderr, "qemu: could not open gdbserver on device '%s'\n",
5533 gdbstub_dev);
5534 exit(1);
balrog45669e02007-07-02 13:20:17 +00005535 }
bellard67b915a2004-03-31 23:37:16 +00005536#endif
balrog45669e02007-07-02 13:20:17 +00005537
bellardd63d3072004-10-03 13:29:03 +00005538 if (loadvm)
aliguori376253e2009-03-05 23:01:23 +00005539 do_loadvm(cur_mon, loadvm);
bellardd63d3072004-10-03 13:29:03 +00005540
aliguori5bb79102008-10-13 03:12:02 +00005541 if (incoming) {
5542 autostart = 0; /* fixme how to deal with -daemonize */
5543 qemu_start_incoming_migration(incoming);
5544 }
5545
aliguoric0f4ce72009-03-05 23:01:01 +00005546 if (autostart)
5547 vm_start();
thsffd843b2006-12-21 19:46:43 +00005548
blueswir1b9e82a52009-04-05 18:03:31 +00005549#ifndef _WIN32
ths71e3ceb2006-12-22 02:11:31 +00005550 if (daemonize) {
5551 uint8_t status = 0;
5552 ssize_t len;
ths71e3ceb2006-12-22 02:11:31 +00005553
5554 again1:
5555 len = write(fds[1], &status, 1);
5556 if (len == -1 && (errno == EINTR))
5557 goto again1;
5558
5559 if (len != 1)
5560 exit(1);
5561
aliguoribd54b862008-07-23 00:58:33 +00005562 chdir("/");
balrogaeb30be2007-07-02 15:03:13 +00005563 TFR(fd = open("/dev/null", O_RDWR));
ths71e3ceb2006-12-22 02:11:31 +00005564 if (fd == -1)
5565 exit(1);
aliguori08585322009-02-27 22:09:45 +00005566 }
ths71e3ceb2006-12-22 02:11:31 +00005567
aliguori08585322009-02-27 22:09:45 +00005568 if (run_as) {
5569 pwd = getpwnam(run_as);
5570 if (!pwd) {
5571 fprintf(stderr, "User \"%s\" doesn't exist\n", run_as);
5572 exit(1);
5573 }
5574 }
ths71e3ceb2006-12-22 02:11:31 +00005575
aliguori08585322009-02-27 22:09:45 +00005576 if (chroot_dir) {
5577 if (chroot(chroot_dir) < 0) {
5578 fprintf(stderr, "chroot failed\n");
5579 exit(1);
5580 }
5581 chdir("/");
5582 }
5583
5584 if (run_as) {
5585 if (setgid(pwd->pw_gid) < 0) {
5586 fprintf(stderr, "Failed to setgid(%d)\n", pwd->pw_gid);
5587 exit(1);
5588 }
5589 if (setuid(pwd->pw_uid) < 0) {
5590 fprintf(stderr, "Failed to setuid(%d)\n", pwd->pw_uid);
5591 exit(1);
5592 }
5593 if (setuid(0) != -1) {
5594 fprintf(stderr, "Dropping privileges failed\n");
5595 exit(1);
5596 }
5597 }
aliguori08585322009-02-27 22:09:45 +00005598
5599 if (daemonize) {
5600 dup2(fd, 0);
5601 dup2(fd, 1);
5602 dup2(fd, 2);
5603
5604 close(fd);
ths71e3ceb2006-12-22 02:11:31 +00005605 }
blueswir1b9e82a52009-04-05 18:03:31 +00005606#endif
ths71e3ceb2006-12-22 02:11:31 +00005607
bellard8a7ddc32004-03-31 19:00:16 +00005608 main_loop();
bellard40c3bac2004-04-04 12:56:28 +00005609 quit_timers();
aliguori63a01ef2008-10-31 19:10:00 +00005610 net_cleanup();
thsb46a8902007-10-21 23:20:45 +00005611
bellard0824d6f2003-06-24 13:42:40 +00005612 return 0;
5613}