]> git.proxmox.com Git - qemu.git/blame - vl.c
Fix absolute mouse events generated by SDL frontend.
[qemu.git] / vl.c
CommitLineData
0824d6fc 1/*
80cabfad 2 * QEMU System Emulator
5fafdf24 3 *
68d0f70e 4 * Copyright (c) 2003-2008 Fabrice Bellard
5fafdf24 5 *
1df912cf
FB
6 * 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.
0824d6fc 23 */
0824d6fc 24#include <unistd.h>
0824d6fc
FB
25#include <fcntl.h>
26#include <signal.h>
27#include <time.h>
0824d6fc 28#include <errno.h>
67b915a5 29#include <sys/time.h>
c88676f8 30#include <zlib.h>
67b915a5 31
179a2c19 32/* Needed early for HOST_BSD etc. */
d40cdb10
BS
33#include "config-host.h"
34
67b915a5 35#ifndef _WIN32
0858532e 36#include <pwd.h>
67b915a5 37#include <sys/times.h>
f1510b2c 38#include <sys/wait.h>
67b915a5 39#include <termios.h>
67b915a5 40#include <sys/mman.h>
f1510b2c 41#include <sys/ioctl.h>
24646c7e 42#include <sys/resource.h>
f1510b2c 43#include <sys/socket.h>
c94c8d64 44#include <netinet/in.h>
24646c7e
BS
45#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>
9d728e8c 53#include <dirent.h>
7c9d8e07 54#include <netdb.h>
cb4b976b 55#include <sys/select.h>
179a2c19 56#ifdef HOST_BSD
7d3505c5 57#include <sys/stat.h>
c5e97233 58#if defined(__FreeBSD__) || defined(__DragonFly__)
7d3505c5 59#include <libutil.h>
24646c7e
BS
60#else
61#include <util.h>
128ab2ff 62#endif
5c40d2bd
TS
63#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
64#include <freebsd/stdlib.h>
7d3505c5 65#else
223f0d72 66#ifdef __linux__
7d3505c5
FB
67#include <pty.h>
68#include <malloc.h>
fd872598 69#include <linux/rtc.h>
bd494f4c
TS
70
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
e57a8c0e 76#include <linux/ppdev.h>
5867c88a 77#include <linux/parport.h>
223f0d72
BS
78#endif
79#ifdef __sun__
d5d10bc3
TS
80#include <sys/stat.h>
81#include <sys/ethernet.h>
82#include <sys/sockio.h>
d5d10bc3
TS
83#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>
67b915a5 93#endif
7d3505c5 94#endif
ec530c81 95#endif
67b915a5 96
9892fbfb
BS
97#if defined(__OpenBSD__)
98#include <util.h>
99#endif
100
8a16d273
TS
101#if defined(CONFIG_VDE)
102#include <libvdeplug.h>
103#endif
104
67b915a5 105#ifdef _WIN32
49dc768d 106#include <windows.h>
7d3505c5 107#include <malloc.h>
67b915a5 108#include <sys/timeb.h>
4fddf62a 109#include <mmsystem.h>
67b915a5
FB
110#define getopt_long_only getopt_long
111#define memalign(align, size) malloc(size)
112#endif
113
73332e5c 114#ifdef CONFIG_SDL
96bcd4f8 115#ifdef __APPLE__
83fb7adf 116#include <SDL/SDL.h>
880fec5d 117int 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
96bcd4f8 124#endif
73332e5c 125#endif /* CONFIG_SDL */
0824d6fc 126
5b0753e0
FB
127#ifdef CONFIG_COCOA
128#undef main
129#define main qemu_main
130#endif /* CONFIG_COCOA */
131
511d2b14
BS
132#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"
5ef4efa4 141#include "bt-host.h"
511d2b14
BS
142#include "net.h"
143#include "monitor.h"
144#include "console.h"
145#include "sysemu.h"
146#include "gdbstub.h"
147#include "qemu-timer.h"
148#include "qemu-char.h"
149#include "cache-utils.h"
150#include "block.h"
151#include "audio/audio.h"
152#include "migration.h"
153#include "kvm.h"
154#include "balloon.h"
155
0824d6fc 156#include "disas.h"
fc01f7e7 157
8a7ddc38 158#include "exec-all.h"
0824d6fc 159
511d2b14
BS
160#include "qemu_socket.h"
161
162#if defined(CONFIG_SLIRP)
163#include "libslirp.h"
164#endif
165
0824d6fc 166//#define DEBUG_UNUSED_IOPORT
fd872598 167//#define DEBUG_IOPORT
9dc63a1e
BS
168//#define DEBUG_NET
169//#define DEBUG_SLIRP
330d0414 170
d12d51d5
AL
171
172#ifdef DEBUG_IOPORT
93fcfe39 173# define LOG_IOPORT(...) qemu_log_mask(CPU_LOG_IOPORT, ## __VA_ARGS__)
d12d51d5
AL
174#else
175# define LOG_IOPORT(...) do { } while (0)
176#endif
177
1bfe856e 178#define DEFAULT_RAM_SIZE 128
313aa567 179
0d92ed30
PB
180/* Max number of USB devices that can be specified on the commandline. */
181#define MAX_USB_CMDLINE 8
182
dc72ac14
AZ
183/* Max number of bluetooth switches on the commandline. */
184#define MAX_BT_CMDLINE 10
185
7dea1da4
FB
186/* XXX: use a two level table to limit memory usage */
187#define MAX_IOPORTS 65536
0824d6fc 188
80cabfad 189const char *bios_dir = CONFIG_QEMU_SHAREDIR;
1192dad8 190const char *bios_name = NULL;
dbed7e40
BS
191static void *ioport_opaque[MAX_IOPORTS];
192static IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
193static IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
e4bcb14c 194/* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available
faea38e7 195 to store the VM snapshots */
e4bcb14c
TS
196DriveInfo drives_table[MAX_DRIVES+1];
197int nb_drives;
dbed7e40 198static int vga_ram_size;
cb5a7aa8 199enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
3023f332 200static DisplayState *display_state;
a20dd508 201int nographic;
dbed7e40 202static int curses;
7d957bd8 203static int sdl;
3d11d0eb 204const char* keyboard_layout = NULL;
313aa567 205int64_t ticks_per_sec;
00f82b8a 206ram_addr_t ram_size;
c4b1fcc0 207int nb_nics;
7c9d8e07 208NICInfo nd_table[MAX_NICS];
8a7ddc38 209int vm_running;
c0f4ce77 210static int autostart;
f6503059
AZ
211static int rtc_utc = 1;
212static int rtc_date_offset = -1; /* -1 means no change */
1bfe856e 213int cirrus_vga_enabled = 1;
c2b3b41a 214int std_vga_enabled = 0;
d34cab9f 215int vmsvga_enabled = 0;
d827220b
FB
216#ifdef TARGET_SPARC
217int graphic_width = 1024;
218int graphic_height = 768;
eee0b836 219int graphic_depth = 8;
d827220b 220#else
1bfe856e
FB
221int graphic_width = 800;
222int graphic_height = 600;
e9b137c2 223int graphic_depth = 15;
eee0b836 224#endif
dbed7e40 225static int full_screen = 0;
634a21f6 226#ifdef CONFIG_SDL
dbed7e40 227static int no_frame = 0;
634a21f6 228#endif
667accab 229int no_quit = 0;
8d11df9e 230CharDriverState *serial_hds[MAX_SERIAL_PORTS];
6508fe59 231CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
9ede2fde 232CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES];
a09db21f
FB
233#ifdef TARGET_I386
234int win2k_install_hack = 0;
73822ec8 235int rtc_td_hack = 0;
a09db21f 236#endif
bb36d470 237int usb_enabled = 0;
6a00d601 238int smp_cpus = 1;
73fc9742 239const char *vnc_display;
6515b203 240int acpi_enabled = 1;
16b29ae1 241int no_hpet = 0;
52ca8d6a 242int fd_bootchk = 1;
d1beab82 243int no_reboot = 0;
b2f76161 244int no_shutdown = 0;
9467cd46 245int cursor_hide = 1;
a171fe39 246int graphic_rotate = 0;
71e3ceb8 247int daemonize = 0;
9ae02555
TS
248const char *option_rom[MAX_OPTION_ROMS];
249int nb_option_roms;
8e71621f 250int semihosting_enabled = 0;
2b8f2d41
AZ
251#ifdef TARGET_ARM
252int old_param = 0;
253#endif
c35734b2 254const char *qemu_name;
3780e197 255int alt_grab = 0;
95efd11c 256#if defined(TARGET_SPARC) || defined(TARGET_PPC)
66508601
BS
257unsigned int nb_prom_envs = 0;
258const char *prom_envs[MAX_PROM_ENVS];
259#endif
ec691c80
AL
260int nb_drives_opt;
261struct drive_opt drives_opt[MAX_DRIVES];
0824d6fc 262
ee5605e5
AZ
263static CPUState *cur_cpu;
264static CPUState *next_cpu;
76ea08f9 265static int event_pending = 1;
bf20dc07 266/* Conversion factor from emulated instructions to virtual clock ticks. */
2e70f6ef 267static int icount_time_shift;
bf20dc07 268/* Arbitrarily pick 1MIPS as the minimum allowable speed. */
2e70f6ef
PB
269#define MAX_ICOUNT_SHIFT 10
270/* Compensate for varying guest execution speed. */
271static int64_t qemu_icount_bias;
dbed7e40
BS
272static QEMUTimer *icount_rt_timer;
273static QEMUTimer *icount_vm_timer;
9043b62d 274static QEMUTimer *nographic_timer;
ee5605e5 275
8fcb1b90
BS
276uint8_t qemu_uuid[16];
277
0824d6fc 278/***********************************************************/
26aa7d72
FB
279/* x86 ISA bus support */
280
281target_phys_addr_t isa_mem_base = 0;
3de388f6 282PicState2 *isa_pic;
0824d6fc 283
477e3edf
AL
284static IOPortReadFunc default_ioport_readb, default_ioport_readw, default_ioport_readl;
285static IOPortWriteFunc default_ioport_writeb, default_ioport_writew, default_ioport_writel;
286
287static uint32_t ioport_read(int index, uint32_t address)
288{
289 static IOPortReadFunc *default_func[3] = {
290 default_ioport_readb,
291 default_ioport_readw,
292 default_ioport_readl
293 };
294 IOPortReadFunc *func = ioport_read_table[index][address];
295 if (!func)
296 func = default_func[index];
297 return func(ioport_opaque[address], address);
298}
299
300static void ioport_write(int index, uint32_t address, uint32_t data)
301{
302 static IOPortWriteFunc *default_func[3] = {
303 default_ioport_writeb,
304 default_ioport_writew,
305 default_ioport_writel
306 };
307 IOPortWriteFunc *func = ioport_write_table[index][address];
308 if (!func)
309 func = default_func[index];
310 func(ioport_opaque[address], address, data);
311}
312
9596ebb7 313static uint32_t default_ioport_readb(void *opaque, uint32_t address)
0824d6fc
FB
314{
315#ifdef DEBUG_UNUSED_IOPORT
1196be37 316 fprintf(stderr, "unused inb: port=0x%04x\n", address);
0824d6fc 317#endif
fc01f7e7 318 return 0xff;
0824d6fc
FB
319}
320
9596ebb7 321static void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
0824d6fc
FB
322{
323#ifdef DEBUG_UNUSED_IOPORT
1196be37 324 fprintf(stderr, "unused outb: port=0x%04x data=0x%02x\n", address, data);
0824d6fc
FB
325#endif
326}
327
328/* default is to make two byte accesses */
9596ebb7 329static uint32_t default_ioport_readw(void *opaque, uint32_t address)
0824d6fc
FB
330{
331 uint32_t data;
477e3edf 332 data = ioport_read(0, address);
db45c29a 333 address = (address + 1) & (MAX_IOPORTS - 1);
477e3edf 334 data |= ioport_read(0, address) << 8;
0824d6fc
FB
335 return data;
336}
337
9596ebb7 338static void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
0824d6fc 339{
477e3edf 340 ioport_write(0, address, data & 0xff);
db45c29a 341 address = (address + 1) & (MAX_IOPORTS - 1);
477e3edf 342 ioport_write(0, address, (data >> 8) & 0xff);
0824d6fc
FB
343}
344
9596ebb7 345static uint32_t default_ioport_readl(void *opaque, uint32_t address)
0824d6fc 346{
fc01f7e7 347#ifdef DEBUG_UNUSED_IOPORT
1196be37 348 fprintf(stderr, "unused inl: port=0x%04x\n", address);
fc01f7e7
FB
349#endif
350 return 0xffffffff;
0824d6fc
FB
351}
352
9596ebb7 353static void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
0824d6fc 354{
fc01f7e7 355#ifdef DEBUG_UNUSED_IOPORT
1196be37 356 fprintf(stderr, "unused outl: port=0x%04x data=0x%02x\n", address, data);
fc01f7e7 357#endif
0824d6fc
FB
358}
359
fc01f7e7 360/* size is the word size in byte */
5fafdf24 361int register_ioport_read(int start, int length, int size,
c4b1fcc0 362 IOPortReadFunc *func, void *opaque)
f1510b2c 363{
fc01f7e7 364 int i, bsize;
f1510b2c 365
c4b1fcc0 366 if (size == 1) {
fc01f7e7 367 bsize = 0;
c4b1fcc0 368 } else if (size == 2) {
fc01f7e7 369 bsize = 1;
c4b1fcc0 370 } else if (size == 4) {
fc01f7e7 371 bsize = 2;
c4b1fcc0 372 } else {
88fdf56f 373 hw_error("register_ioport_read: invalid size");
fc01f7e7 374 return -1;
c4b1fcc0
FB
375 }
376 for(i = start; i < start + length; i += size) {
fc01f7e7 377 ioport_read_table[bsize][i] = func;
c4b1fcc0 378 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
88fdf56f 379 hw_error("register_ioport_read: invalid opaque");
c4b1fcc0
FB
380 ioport_opaque[i] = opaque;
381 }
f1510b2c
FB
382 return 0;
383}
384
fc01f7e7 385/* size is the word size in byte */
5fafdf24 386int register_ioport_write(int start, int length, int size,
c4b1fcc0 387 IOPortWriteFunc *func, void *opaque)
f1510b2c 388{
fc01f7e7 389 int i, bsize;
f1510b2c 390
c4b1fcc0 391 if (size == 1) {
fc01f7e7 392 bsize = 0;
c4b1fcc0 393 } else if (size == 2) {
fc01f7e7 394 bsize = 1;
c4b1fcc0 395 } else if (size == 4) {
fc01f7e7 396 bsize = 2;
c4b1fcc0 397 } else {
88fdf56f 398 hw_error("register_ioport_write: invalid size");
fc01f7e7 399 return -1;
c4b1fcc0
FB
400 }
401 for(i = start; i < start + length; i += size) {
fc01f7e7 402 ioport_write_table[bsize][i] = func;
88fdf56f
AZ
403 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
404 hw_error("register_ioport_write: invalid opaque");
c4b1fcc0
FB
405 ioport_opaque[i] = opaque;
406 }
f1510b2c
FB
407 return 0;
408}
409
69b91039
FB
410void isa_unassign_ioport(int start, int length)
411{
412 int i;
413
414 for(i = start; i < start + length; i++) {
415 ioport_read_table[0][i] = default_ioport_readb;
416 ioport_read_table[1][i] = default_ioport_readw;
417 ioport_read_table[2][i] = default_ioport_readl;
418
419 ioport_write_table[0][i] = default_ioport_writeb;
420 ioport_write_table[1][i] = default_ioport_writew;
421 ioport_write_table[2][i] = default_ioport_writel;
a7607f7e
AL
422
423 ioport_opaque[i] = NULL;
69b91039
FB
424 }
425}
426
20f32282
FB
427/***********************************************************/
428
c45886db 429void cpu_outb(CPUState *env, int addr, int val)
0824d6fc 430{
d12d51d5 431 LOG_IOPORT("outb: %04x %02x\n", addr, val);
477e3edf 432 ioport_write(0, addr, val);
89bfc105
FB
433#ifdef USE_KQEMU
434 if (env)
435 env->last_io_time = cpu_get_time_fast();
436#endif
0824d6fc
FB
437}
438
c45886db 439void cpu_outw(CPUState *env, int addr, int val)
0824d6fc 440{
d12d51d5 441 LOG_IOPORT("outw: %04x %04x\n", addr, val);
477e3edf 442 ioport_write(1, addr, val);
89bfc105
FB
443#ifdef USE_KQEMU
444 if (env)
445 env->last_io_time = cpu_get_time_fast();
446#endif
0824d6fc
FB
447}
448
c45886db 449void cpu_outl(CPUState *env, int addr, int val)
0824d6fc 450{
d12d51d5 451 LOG_IOPORT("outl: %04x %08x\n", addr, val);
477e3edf 452 ioport_write(2, addr, val);
89bfc105
FB
453#ifdef USE_KQEMU
454 if (env)
455 env->last_io_time = cpu_get_time_fast();
456#endif
0824d6fc
FB
457}
458
c45886db 459int cpu_inb(CPUState *env, int addr)
0824d6fc 460{
fd872598 461 int val;
477e3edf 462 val = ioport_read(0, addr);
d12d51d5 463 LOG_IOPORT("inb : %04x %02x\n", addr, val);
89bfc105
FB
464#ifdef USE_KQEMU
465 if (env)
466 env->last_io_time = cpu_get_time_fast();
fd872598
FB
467#endif
468 return val;
0824d6fc
FB
469}
470
c45886db 471int cpu_inw(CPUState *env, int addr)
0824d6fc 472{
fd872598 473 int val;
477e3edf 474 val = ioport_read(1, addr);
d12d51d5 475 LOG_IOPORT("inw : %04x %04x\n", addr, val);
89bfc105
FB
476#ifdef USE_KQEMU
477 if (env)
478 env->last_io_time = cpu_get_time_fast();
fd872598
FB
479#endif
480 return val;
0824d6fc
FB
481}
482
c45886db 483int cpu_inl(CPUState *env, int addr)
0824d6fc 484{
fd872598 485 int val;
477e3edf 486 val = ioport_read(2, addr);
d12d51d5 487 LOG_IOPORT("inl : %04x %08x\n", addr, val);
89bfc105
FB
488#ifdef USE_KQEMU
489 if (env)
490 env->last_io_time = cpu_get_time_fast();
fd872598
FB
491#endif
492 return val;
0824d6fc
FB
493}
494
495/***********************************************************/
0824d6fc
FB
496void hw_error(const char *fmt, ...)
497{
498 va_list ap;
6a00d601 499 CPUState *env;
0824d6fc
FB
500
501 va_start(ap, fmt);
502 fprintf(stderr, "qemu: hardware error: ");
503 vfprintf(stderr, fmt, ap);
504 fprintf(stderr, "\n");
6a00d601
FB
505 for(env = first_cpu; env != NULL; env = env->next_cpu) {
506 fprintf(stderr, "CPU #%d:\n", env->cpu_index);
0824d6fc 507#ifdef TARGET_I386
6a00d601 508 cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
c45886db 509#else
6a00d601 510 cpu_dump_state(env, stderr, fprintf, 0);
0824d6fc 511#endif
6a00d601 512 }
0824d6fc
FB
513 va_end(ap);
514 abort();
515}
df751fa8
AL
516
517/***************/
518/* ballooning */
519
520static QEMUBalloonEvent *qemu_balloon_event;
521void *qemu_balloon_event_opaque;
522
523void qemu_add_balloon_handler(QEMUBalloonEvent *func, void *opaque)
524{
525 qemu_balloon_event = func;
526 qemu_balloon_event_opaque = opaque;
527}
528
529void qemu_balloon(ram_addr_t target)
530{
531 if (qemu_balloon_event)
532 qemu_balloon_event(qemu_balloon_event_opaque, target);
533}
534
535ram_addr_t qemu_balloon_status(void)
536{
537 if (qemu_balloon_event)
538 return qemu_balloon_event(qemu_balloon_event_opaque, 0);
539 return 0;
540}
0824d6fc 541
63066f4f
FB
542/***********************************************************/
543/* keyboard/mouse */
544
545static QEMUPutKBDEvent *qemu_put_kbd_event;
546static void *qemu_put_kbd_event_opaque;
455204eb
TS
547static QEMUPutMouseEntry *qemu_put_mouse_event_head;
548static QEMUPutMouseEntry *qemu_put_mouse_event_current;
63066f4f
FB
549
550void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
551{
552 qemu_put_kbd_event_opaque = opaque;
553 qemu_put_kbd_event = func;
554}
555
455204eb
TS
556QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
557 void *opaque, int absolute,
558 const char *name)
63066f4f 559{
455204eb
TS
560 QEMUPutMouseEntry *s, *cursor;
561
562 s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
455204eb
TS
563
564 s->qemu_put_mouse_event = func;
565 s->qemu_put_mouse_event_opaque = opaque;
566 s->qemu_put_mouse_event_absolute = absolute;
567 s->qemu_put_mouse_event_name = qemu_strdup(name);
568 s->next = NULL;
569
570 if (!qemu_put_mouse_event_head) {
571 qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
572 return s;
573 }
574
575 cursor = qemu_put_mouse_event_head;
576 while (cursor->next != NULL)
577 cursor = cursor->next;
578
579 cursor->next = s;
580 qemu_put_mouse_event_current = s;
581
582 return s;
583}
584
585void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
586{
587 QEMUPutMouseEntry *prev = NULL, *cursor;
588
589 if (!qemu_put_mouse_event_head || entry == NULL)
590 return;
591
592 cursor = qemu_put_mouse_event_head;
593 while (cursor != NULL && cursor != entry) {
594 prev = cursor;
595 cursor = cursor->next;
596 }
597
598 if (cursor == NULL) // does not exist or list empty
599 return;
600 else if (prev == NULL) { // entry is head
601 qemu_put_mouse_event_head = cursor->next;
602 if (qemu_put_mouse_event_current == entry)
603 qemu_put_mouse_event_current = cursor->next;
604 qemu_free(entry->qemu_put_mouse_event_name);
605 qemu_free(entry);
606 return;
607 }
608
609 prev->next = entry->next;
610
611 if (qemu_put_mouse_event_current == entry)
612 qemu_put_mouse_event_current = prev;
613
614 qemu_free(entry->qemu_put_mouse_event_name);
615 qemu_free(entry);
63066f4f
FB
616}
617
618void kbd_put_keycode(int keycode)
619{
620 if (qemu_put_kbd_event) {
621 qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
622 }
623}
624
625void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
626{
455204eb
TS
627 QEMUPutMouseEvent *mouse_event;
628 void *mouse_event_opaque;
a171fe39 629 int width;
455204eb
TS
630
631 if (!qemu_put_mouse_event_current) {
632 return;
633 }
634
635 mouse_event =
636 qemu_put_mouse_event_current->qemu_put_mouse_event;
637 mouse_event_opaque =
638 qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;
639
640 if (mouse_event) {
a171fe39
AZ
641 if (graphic_rotate) {
642 if (qemu_put_mouse_event_current->qemu_put_mouse_event_absolute)
643 width = 0x7fff;
644 else
b94ed577 645 width = graphic_width - 1;
a171fe39
AZ
646 mouse_event(mouse_event_opaque,
647 width - dy, dx, dz, buttons_state);
648 } else
649 mouse_event(mouse_event_opaque,
650 dx, dy, dz, buttons_state);
63066f4f
FB
651 }
652}
653
09b26c5e
FB
654int kbd_mouse_is_absolute(void)
655{
455204eb
TS
656 if (!qemu_put_mouse_event_current)
657 return 0;
658
659 return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
660}
661
376253ec 662void do_info_mice(Monitor *mon)
455204eb
TS
663{
664 QEMUPutMouseEntry *cursor;
665 int index = 0;
666
667 if (!qemu_put_mouse_event_head) {
376253ec 668 monitor_printf(mon, "No mouse devices connected\n");
455204eb
TS
669 return;
670 }
671
376253ec 672 monitor_printf(mon, "Mouse devices available:\n");
455204eb
TS
673 cursor = qemu_put_mouse_event_head;
674 while (cursor != NULL) {
376253ec
AL
675 monitor_printf(mon, "%c Mouse #%d: %s\n",
676 (cursor == qemu_put_mouse_event_current ? '*' : ' '),
677 index, cursor->qemu_put_mouse_event_name);
455204eb
TS
678 index++;
679 cursor = cursor->next;
680 }
681}
682
376253ec 683void do_mouse_set(Monitor *mon, int index)
455204eb
TS
684{
685 QEMUPutMouseEntry *cursor;
686 int i = 0;
687
688 if (!qemu_put_mouse_event_head) {
376253ec 689 monitor_printf(mon, "No mouse devices connected\n");
455204eb
TS
690 return;
691 }
692
693 cursor = qemu_put_mouse_event_head;
694 while (cursor != NULL && index != i) {
695 i++;
696 cursor = cursor->next;
697 }
698
699 if (cursor != NULL)
700 qemu_put_mouse_event_current = cursor;
701 else
376253ec 702 monitor_printf(mon, "Mouse at given index not found\n");
09b26c5e
FB
703}
704
1dce7c3c
FB
705/* compute with 96 bit intermediate result: (a*b)/c */
706uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
0824d6fc 707{
1dce7c3c
FB
708 union {
709 uint64_t ll;
710 struct {
711#ifdef WORDS_BIGENDIAN
712 uint32_t high, low;
713#else
714 uint32_t low, high;
3b46e624 715#endif
1dce7c3c
FB
716 } l;
717 } u, res;
718 uint64_t rl, rh;
0824d6fc 719
1dce7c3c
FB
720 u.ll = a;
721 rl = (uint64_t)u.l.low * (uint64_t)b;
722 rh = (uint64_t)u.l.high * (uint64_t)b;
723 rh += (rl >> 32);
724 res.l.high = rh / c;
725 res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
726 return res.ll;
34865134
FB
727}
728
1dce7c3c
FB
729/***********************************************************/
730/* real time host monotonic timer */
34865134 731
1dce7c3c 732#define QEMU_TIMER_BASE 1000000000LL
34865134 733
1dce7c3c 734#ifdef WIN32
0824d6fc 735
1dce7c3c 736static int64_t clock_freq;
1115dde7 737
1dce7c3c 738static void init_get_clock(void)
1115dde7 739{
a8e5ac33
FB
740 LARGE_INTEGER freq;
741 int ret;
1dce7c3c
FB
742 ret = QueryPerformanceFrequency(&freq);
743 if (ret == 0) {
744 fprintf(stderr, "Could not calibrate ticks\n");
745 exit(1);
746 }
747 clock_freq = freq.QuadPart;
1115dde7
FB
748}
749
1dce7c3c 750static int64_t get_clock(void)
b8076a74 751{
1dce7c3c
FB
752 LARGE_INTEGER ti;
753 QueryPerformanceCounter(&ti);
754 return muldiv64(ti.QuadPart, QEMU_TIMER_BASE, clock_freq);
b8076a74
FB
755}
756
1dce7c3c 757#else
90cb9493 758
1dce7c3c
FB
759static int use_rt_clock;
760
761static void init_get_clock(void)
90cb9493 762{
1dce7c3c 763 use_rt_clock = 0;
c5e97233
BS
764#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
765 || defined(__DragonFly__)
1dce7c3c
FB
766 {
767 struct timespec ts;
768 if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
769 use_rt_clock = 1;
770 }
771 }
772#endif
90cb9493
FB
773}
774
1dce7c3c 775static int64_t get_clock(void)
fdbb4691 776{
c5e97233
BS
777#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
778 || defined(__DragonFly__)
1dce7c3c
FB
779 if (use_rt_clock) {
780 struct timespec ts;
781 clock_gettime(CLOCK_MONOTONIC, &ts);
782 return ts.tv_sec * 1000000000LL + ts.tv_nsec;
5fafdf24 783 } else
fdbb4691 784#endif
1dce7c3c
FB
785 {
786 /* XXX: using gettimeofday leads to problems if the date
787 changes, so it should be avoided. */
788 struct timeval tv;
789 gettimeofday(&tv, NULL);
790 return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
791 }
fdbb4691 792}
34865134
FB
793#endif
794
2e70f6ef
PB
795/* Return the virtual CPU time, based on the instruction counter. */
796static int64_t cpu_get_icount(void)
797{
798 int64_t icount;
799 CPUState *env = cpu_single_env;;
800 icount = qemu_icount;
801 if (env) {
802 if (!can_do_io(env))
803 fprintf(stderr, "Bad clock read\n");
804 icount -= (env->icount_decr.u16.low + env->icount_extra);
805 }
806 return qemu_icount_bias + (icount << icount_time_shift);
807}
808
1dce7c3c
FB
809/***********************************************************/
810/* guest cycle counter */
811
eade0f19 812static int64_t cpu_ticks_prev;
34865134 813static int64_t cpu_ticks_offset;
1dce7c3c 814static int64_t cpu_clock_offset;
8a7ddc38 815static int cpu_ticks_enabled;
34865134 816
1dce7c3c
FB
817/* return the host CPU cycle counter and handle stop/restart */
818int64_t cpu_get_ticks(void)
34865134 819{
2e70f6ef
PB
820 if (use_icount) {
821 return cpu_get_icount();
822 }
8a7ddc38
FB
823 if (!cpu_ticks_enabled) {
824 return cpu_ticks_offset;
825 } else {
eade0f19
FB
826 int64_t ticks;
827 ticks = cpu_get_real_ticks();
828 if (cpu_ticks_prev > ticks) {
829 /* Note: non increasing ticks may happen if the host uses
830 software suspend */
831 cpu_ticks_offset += cpu_ticks_prev - ticks;
832 }
833 cpu_ticks_prev = ticks;
834 return ticks + cpu_ticks_offset;
8a7ddc38 835 }
34865134
FB
836}
837
1dce7c3c
FB
838/* return the host CPU monotonic timer and handle stop/restart */
839static int64_t cpu_get_clock(void)
840{
841 int64_t ti;
842 if (!cpu_ticks_enabled) {
843 return cpu_clock_offset;
844 } else {
845 ti = get_clock();
846 return ti + cpu_clock_offset;
847 }
848}
849
34865134
FB
850/* enable cpu_get_ticks() */
851void cpu_enable_ticks(void)
852{
8a7ddc38
FB
853 if (!cpu_ticks_enabled) {
854 cpu_ticks_offset -= cpu_get_real_ticks();
1dce7c3c 855 cpu_clock_offset -= get_clock();
8a7ddc38
FB
856 cpu_ticks_enabled = 1;
857 }
34865134
FB
858}
859
860/* disable cpu_get_ticks() : the clock is stopped. You must not call
861 cpu_get_ticks() after that. */
862void cpu_disable_ticks(void)
863{
8a7ddc38
FB
864 if (cpu_ticks_enabled) {
865 cpu_ticks_offset = cpu_get_ticks();
1dce7c3c 866 cpu_clock_offset = cpu_get_clock();
8a7ddc38
FB
867 cpu_ticks_enabled = 0;
868 }
34865134
FB
869}
870
1dce7c3c
FB
871/***********************************************************/
872/* timers */
5fafdf24 873
8a7ddc38
FB
874#define QEMU_TIMER_REALTIME 0
875#define QEMU_TIMER_VIRTUAL 1
876
877struct QEMUClock {
878 int type;
879 /* XXX: add frequency */
880};
881
882struct QEMUTimer {
883 QEMUClock *clock;
884 int64_t expire_time;
885 QEMUTimerCB *cb;
886 void *opaque;
887 struct QEMUTimer *next;
888};
889
c8994013
TS
890struct qemu_alarm_timer {
891 char const *name;
efe75411 892 unsigned int flags;
c8994013
TS
893
894 int (*start)(struct qemu_alarm_timer *t);
895 void (*stop)(struct qemu_alarm_timer *t);
efe75411 896 void (*rearm)(struct qemu_alarm_timer *t);
c8994013
TS
897 void *priv;
898};
899
efe75411 900#define ALARM_FLAG_DYNTICKS 0x1
d5d08334 901#define ALARM_FLAG_EXPIRED 0x2
efe75411
TS
902
903static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
904{
905 return t->flags & ALARM_FLAG_DYNTICKS;
906}
907
908static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
909{
910 if (!alarm_has_dynticks(t))
911 return;
912
913 t->rearm(t);
914}
915
916/* TODO: MIN_TIMER_REARM_US should be optimized */
917#define MIN_TIMER_REARM_US 250
918
c8994013 919static struct qemu_alarm_timer *alarm_timer;
f49e58dc 920#ifndef _WIN32
c96f1a48 921static int alarm_timer_rfd, alarm_timer_wfd;
f49e58dc 922#endif
8a7ddc38 923
40c3bac3 924#ifdef _WIN32
c8994013
TS
925
926struct qemu_alarm_win32 {
927 MMRESULT timerId;
928 HANDLE host_alarm;
929 unsigned int period;
930} alarm_win32_data = {0, NULL, -1};
931
932static int win32_start_timer(struct qemu_alarm_timer *t);
933static void win32_stop_timer(struct qemu_alarm_timer *t);
efe75411 934static void win32_rearm_timer(struct qemu_alarm_timer *t);
c8994013 935
40c3bac3 936#else
c8994013
TS
937
938static int unix_start_timer(struct qemu_alarm_timer *t);
939static void unix_stop_timer(struct qemu_alarm_timer *t);
940
231c6586
TS
941#ifdef __linux__
942
efe75411
TS
943static int dynticks_start_timer(struct qemu_alarm_timer *t);
944static void dynticks_stop_timer(struct qemu_alarm_timer *t);
945static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
946
c40ec5a9
TS
947static int hpet_start_timer(struct qemu_alarm_timer *t);
948static void hpet_stop_timer(struct qemu_alarm_timer *t);
949
c8994013
TS
950static int rtc_start_timer(struct qemu_alarm_timer *t);
951static void rtc_stop_timer(struct qemu_alarm_timer *t);
952
efe75411 953#endif /* __linux__ */
8a7ddc38 954
c8994013
TS
955#endif /* _WIN32 */
956
2e70f6ef 957/* Correlation between real and virtual time is always going to be
bf20dc07 958 fairly approximate, so ignore small variation.
2e70f6ef
PB
959 When the guest is idle real and virtual time will be aligned in
960 the IO wait loop. */
961#define ICOUNT_WOBBLE (QEMU_TIMER_BASE / 10)
962
963static void icount_adjust(void)
964{
965 int64_t cur_time;
966 int64_t cur_icount;
967 int64_t delta;
968 static int64_t last_delta;
969 /* If the VM is not running, then do nothing. */
970 if (!vm_running)
971 return;
972
973 cur_time = cpu_get_clock();
974 cur_icount = qemu_get_clock(vm_clock);
975 delta = cur_icount - cur_time;
976 /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
977 if (delta > 0
978 && last_delta + ICOUNT_WOBBLE < delta * 2
979 && icount_time_shift > 0) {
980 /* The guest is getting too far ahead. Slow time down. */
981 icount_time_shift--;
982 }
983 if (delta < 0
984 && last_delta - ICOUNT_WOBBLE > delta * 2
985 && icount_time_shift < MAX_ICOUNT_SHIFT) {
986 /* The guest is getting too far behind. Speed time up. */
987 icount_time_shift++;
988 }
989 last_delta = delta;
990 qemu_icount_bias = cur_icount - (qemu_icount << icount_time_shift);
991}
992
993static void icount_adjust_rt(void * opaque)
994{
995 qemu_mod_timer(icount_rt_timer,
996 qemu_get_clock(rt_clock) + 1000);
997 icount_adjust();
998}
999
1000static void icount_adjust_vm(void * opaque)
1001{
1002 qemu_mod_timer(icount_vm_timer,
1003 qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
1004 icount_adjust();
1005}
1006
1007static void init_icount_adjust(void)
1008{
1009 /* Have both realtime and virtual time triggers for speed adjustment.
1010 The realtime trigger catches emulated time passing too slowly,
1011 the virtual time trigger catches emulated time passing too fast.
1012 Realtime triggers occur even when idle, so use them less frequently
1013 than VM triggers. */
1014 icount_rt_timer = qemu_new_timer(rt_clock, icount_adjust_rt, NULL);
1015 qemu_mod_timer(icount_rt_timer,
1016 qemu_get_clock(rt_clock) + 1000);
1017 icount_vm_timer = qemu_new_timer(vm_clock, icount_adjust_vm, NULL);
1018 qemu_mod_timer(icount_vm_timer,
1019 qemu_get_clock(vm_clock) + QEMU_TIMER_BASE / 10);
1020}
1021
c8994013 1022static struct qemu_alarm_timer alarm_timers[] = {
efe75411 1023#ifndef _WIN32
231c6586 1024#ifdef __linux__
efe75411
TS
1025 {"dynticks", ALARM_FLAG_DYNTICKS, dynticks_start_timer,
1026 dynticks_stop_timer, dynticks_rearm_timer, NULL},
c40ec5a9 1027 /* HPET - if available - is preferred */
efe75411 1028 {"hpet", 0, hpet_start_timer, hpet_stop_timer, NULL, NULL},
c40ec5a9 1029 /* ...otherwise try RTC */
efe75411 1030 {"rtc", 0, rtc_start_timer, rtc_stop_timer, NULL, NULL},
c8994013 1031#endif
efe75411 1032 {"unix", 0, unix_start_timer, unix_stop_timer, NULL, NULL},
c8994013 1033#else
efe75411
TS
1034 {"dynticks", ALARM_FLAG_DYNTICKS, win32_start_timer,
1035 win32_stop_timer, win32_rearm_timer, &alarm_win32_data},
1036 {"win32", 0, win32_start_timer,
1037 win32_stop_timer, NULL, &alarm_win32_data},
c8994013
TS
1038#endif
1039 {NULL, }
1040};
1041
3f47aa8c 1042static void show_available_alarms(void)
f3dcfada
TS
1043{
1044 int i;
1045
1046 printf("Available alarm timers, in order of precedence:\n");
1047 for (i = 0; alarm_timers[i].name; i++)
1048 printf("%s\n", alarm_timers[i].name);
1049}
1050
1051static void configure_alarms(char const *opt)
1052{
1053 int i;
1054 int cur = 0;
b1503cda 1055 int count = ARRAY_SIZE(alarm_timers) - 1;
f3dcfada
TS
1056 char *arg;
1057 char *name;
2e70f6ef 1058 struct qemu_alarm_timer tmp;
f3dcfada 1059
3adda04c 1060 if (!strcmp(opt, "?")) {
f3dcfada
TS
1061 show_available_alarms();
1062 exit(0);
1063 }
1064
1065 arg = strdup(opt);
1066
1067 /* Reorder the array */
1068 name = strtok(arg, ",");
1069 while (name) {
e2b577e5 1070 for (i = 0; i < count && alarm_timers[i].name; i++) {
f3dcfada
TS
1071 if (!strcmp(alarm_timers[i].name, name))
1072 break;
1073 }
1074
1075 if (i == count) {
1076 fprintf(stderr, "Unknown clock %s\n", name);
1077 goto next;
1078 }
1079
1080 if (i < cur)
1081 /* Ignore */
1082 goto next;
1083
1084 /* Swap */
1085 tmp = alarm_timers[i];
1086 alarm_timers[i] = alarm_timers[cur];
1087 alarm_timers[cur] = tmp;
1088
1089 cur++;
1090next:
1091 name = strtok(NULL, ",");
1092 }
1093
1094 free(arg);
1095
1096 if (cur) {
2e70f6ef 1097 /* Disable remaining timers */
f3dcfada
TS
1098 for (i = cur; i < count; i++)
1099 alarm_timers[i].name = NULL;
3adda04c
AJ
1100 } else {
1101 show_available_alarms();
1102 exit(1);
f3dcfada 1103 }
f3dcfada
TS
1104}
1105
c8994013
TS
1106QEMUClock *rt_clock;
1107QEMUClock *vm_clock;
1108
1109static QEMUTimer *active_timers[2];
1110
9596ebb7 1111static QEMUClock *qemu_new_clock(int type)
8a7ddc38
FB
1112{
1113 QEMUClock *clock;
1114 clock = qemu_mallocz(sizeof(QEMUClock));
8a7ddc38
FB
1115 clock->type = type;
1116 return clock;
1117}
1118
1119QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
1120{
1121 QEMUTimer *ts;
1122
1123 ts = qemu_mallocz(sizeof(QEMUTimer));
1124 ts->clock = clock;
1125 ts->cb = cb;
1126 ts->opaque = opaque;
1127 return ts;
1128}
1129
1130void qemu_free_timer(QEMUTimer *ts)
1131{
1132 qemu_free(ts);
1133}
1134
1135/* stop a timer, but do not dealloc it */
1136void qemu_del_timer(QEMUTimer *ts)
1137{
1138 QEMUTimer **pt, *t;
1139
1140 /* NOTE: this code must be signal safe because
1141 qemu_timer_expired() can be called from a signal. */
1142 pt = &active_timers[ts->clock->type];
1143 for(;;) {
1144 t = *pt;
1145 if (!t)
1146 break;
1147 if (t == ts) {
1148 *pt = t->next;
1149 break;
1150 }
1151 pt = &t->next;
1152 }
1153}
1154
1155/* modify the current timer so that it will be fired when current_time
1156 >= expire_time. The corresponding callback will be called. */
1157void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
1158{
1159 QEMUTimer **pt, *t;
1160
1161 qemu_del_timer(ts);
1162
1163 /* add the timer in the sorted list */
1164 /* NOTE: this code must be signal safe because
1165 qemu_timer_expired() can be called from a signal. */
1166 pt = &active_timers[ts->clock->type];
1167 for(;;) {
1168 t = *pt;
1169 if (!t)
1170 break;
5fafdf24 1171 if (t->expire_time > expire_time)
8a7ddc38
FB
1172 break;
1173 pt = &t->next;
1174 }
1175 ts->expire_time = expire_time;
1176 ts->next = *pt;
1177 *pt = ts;
d5d08334
AZ
1178
1179 /* Rearm if necessary */
2e70f6ef
PB
1180 if (pt == &active_timers[ts->clock->type]) {
1181 if ((alarm_timer->flags & ALARM_FLAG_EXPIRED) == 0) {
1182 qemu_rearm_alarm_timer(alarm_timer);
1183 }
1184 /* Interrupt execution to force deadline recalculation. */
1185 if (use_icount && cpu_single_env) {
3098dba0 1186 cpu_exit(cpu_single_env);
2e70f6ef
PB
1187 }
1188 }
8a7ddc38
FB
1189}
1190
1191int qemu_timer_pending(QEMUTimer *ts)
1192{
1193 QEMUTimer *t;
1194 for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
1195 if (t == ts)
1196 return 1;
1197 }
1198 return 0;
1199}
1200
1201static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
1202{
1203 if (!timer_head)
1204 return 0;
1205 return (timer_head->expire_time <= current_time);
1206}
1207
1208static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
1209{
1210 QEMUTimer *ts;
3b46e624 1211
8a7ddc38
FB
1212 for(;;) {
1213 ts = *ptimer_head;
e95c8d51 1214 if (!ts || ts->expire_time > current_time)
8a7ddc38
FB
1215 break;
1216 /* remove timer from the list before calling the callback */
1217 *ptimer_head = ts->next;
1218 ts->next = NULL;
3b46e624 1219
8a7ddc38
FB
1220 /* run the callback (the timer list can be modified) */
1221 ts->cb(ts->opaque);
1222 }
1223}
1224
1225int64_t qemu_get_clock(QEMUClock *clock)
1226{
1227 switch(clock->type) {
1228 case QEMU_TIMER_REALTIME:
1dce7c3c 1229 return get_clock() / 1000000;
8a7ddc38
FB
1230 default:
1231 case QEMU_TIMER_VIRTUAL:
2e70f6ef
PB
1232 if (use_icount) {
1233 return cpu_get_icount();
1234 } else {
1235 return cpu_get_clock();
1236 }
8a7ddc38
FB
1237 }
1238}
1239
1dce7c3c
FB
1240static void init_timers(void)
1241{
1242 init_get_clock();
1243 ticks_per_sec = QEMU_TIMER_BASE;
1244 rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
1245 vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
1246}
1247
8a7ddc38
FB
1248/* save a timer */
1249void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
1250{
1251 uint64_t expire_time;
1252
1253 if (qemu_timer_pending(ts)) {
1254 expire_time = ts->expire_time;
1255 } else {
1256 expire_time = -1;
1257 }
1258 qemu_put_be64(f, expire_time);
1259}
1260
1261void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
1262{
1263 uint64_t expire_time;
1264
1265 expire_time = qemu_get_be64(f);
1266 if (expire_time != -1) {
1267 qemu_mod_timer(ts, expire_time);
1268 } else {
1269 qemu_del_timer(ts);
1270 }
1271}
1272
1273static void timer_save(QEMUFile *f, void *opaque)
1274{
1275 if (cpu_ticks_enabled) {
1276 hw_error("cannot save state if virtual timers are running");
1277 }
bee8d684
TS
1278 qemu_put_be64(f, cpu_ticks_offset);
1279 qemu_put_be64(f, ticks_per_sec);
1280 qemu_put_be64(f, cpu_clock_offset);
8a7ddc38
FB
1281}
1282
1283static int timer_load(QEMUFile *f, void *opaque, int version_id)
1284{
c88676f8 1285 if (version_id != 1 && version_id != 2)
8a7ddc38
FB
1286 return -EINVAL;
1287 if (cpu_ticks_enabled) {
1288 return -EINVAL;
1289 }
bee8d684
TS
1290 cpu_ticks_offset=qemu_get_be64(f);
1291 ticks_per_sec=qemu_get_be64(f);
c88676f8 1292 if (version_id == 2) {
bee8d684 1293 cpu_clock_offset=qemu_get_be64(f);
c88676f8 1294 }
8a7ddc38
FB
1295 return 0;
1296}
1297
67b915a5 1298#ifdef _WIN32
5fafdf24 1299void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
67b915a5
FB
1300 DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
1301#else
8a7ddc38 1302static void host_alarm_handler(int host_signum)
67b915a5 1303#endif
8a7ddc38 1304{
02ba45c5
FB
1305#if 0
1306#define DISP_FREQ 1000
1307 {
1308 static int64_t delta_min = INT64_MAX;
1309 static int64_t delta_max, delta_cum, last_clock, delta, ti;
1310 static int count;
1311 ti = qemu_get_clock(vm_clock);
1312 if (last_clock != 0) {
1313 delta = ti - last_clock;
1314 if (delta < delta_min)
1315 delta_min = delta;
1316 if (delta > delta_max)
1317 delta_max = delta;
1318 delta_cum += delta;
1319 if (++count == DISP_FREQ) {
26a76461 1320 printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
02ba45c5
FB
1321 muldiv64(delta_min, 1000000, ticks_per_sec),
1322 muldiv64(delta_max, 1000000, ticks_per_sec),
1323 muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
1324 (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
1325 count = 0;
1326 delta_min = INT64_MAX;
1327 delta_max = 0;
1328 delta_cum = 0;
1329 }
1330 }
1331 last_clock = ti;
1332 }
1333#endif
efe75411 1334 if (alarm_has_dynticks(alarm_timer) ||
2e70f6ef
PB
1335 (!use_icount &&
1336 qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
1337 qemu_get_clock(vm_clock))) ||
8a7ddc38
FB
1338 qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
1339 qemu_get_clock(rt_clock))) {
c96f1a48 1340 CPUState *env = next_cpu;
c96f1a48 1341
06d9f2f7 1342#ifdef _WIN32
c8994013
TS
1343 struct qemu_alarm_win32 *data = ((struct qemu_alarm_timer*)dwUser)->priv;
1344 SetEvent(data->host_alarm);
f49e58dc
AL
1345#else
1346 static const char byte = 0;
c96f1a48 1347 write(alarm_timer_wfd, &byte, sizeof(byte));
f49e58dc 1348#endif
d5d08334
AZ
1349 alarm_timer->flags |= ALARM_FLAG_EXPIRED;
1350
4f8eb8da
AZ
1351 if (env) {
1352 /* stop the currently executing cpu because a timer occured */
3098dba0 1353 cpu_exit(env);
a332e112 1354#ifdef USE_KQEMU
4f8eb8da
AZ
1355 if (env->kqemu_enabled) {
1356 kqemu_cpu_interrupt(env);
1357 }
ee5605e5 1358#endif
4f8eb8da 1359 }
ee5605e5 1360 event_pending = 1;
8a7ddc38
FB
1361 }
1362}
1363
2e70f6ef 1364static int64_t qemu_next_deadline(void)
efe75411 1365{
2e70f6ef 1366 int64_t delta;
efe75411
TS
1367
1368 if (active_timers[QEMU_TIMER_VIRTUAL]) {
2e70f6ef
PB
1369 delta = active_timers[QEMU_TIMER_VIRTUAL]->expire_time -
1370 qemu_get_clock(vm_clock);
1371 } else {
1372 /* To avoid problems with overflow limit this to 2^32. */
1373 delta = INT32_MAX;
efe75411
TS
1374 }
1375
2e70f6ef
PB
1376 if (delta < 0)
1377 delta = 0;
efe75411 1378
2e70f6ef
PB
1379 return delta;
1380}
1381
8632fb9a 1382#if defined(__linux__) || defined(_WIN32)
2e70f6ef
PB
1383static uint64_t qemu_next_deadline_dyntick(void)
1384{
1385 int64_t delta;
1386 int64_t rtdelta;
1387
1388 if (use_icount)
1389 delta = INT32_MAX;
1390 else
1391 delta = (qemu_next_deadline() + 999) / 1000;
1392
1393 if (active_timers[QEMU_TIMER_REALTIME]) {
1394 rtdelta = (active_timers[QEMU_TIMER_REALTIME]->expire_time -
1395 qemu_get_clock(rt_clock))*1000;
1396 if (rtdelta < delta)
1397 delta = rtdelta;
1398 }
1399
1400 if (delta < MIN_TIMER_REARM_US)
1401 delta = MIN_TIMER_REARM_US;
1402
1403 return delta;
efe75411 1404}
8632fb9a 1405#endif
efe75411 1406
fd872598
FB
1407#ifndef _WIN32
1408
7183b4b4
AL
1409/* Sets a specific flag */
1410static int fcntl_setfl(int fd, int flag)
1411{
1412 int flags;
1413
1414 flags = fcntl(fd, F_GETFL);
1415 if (flags == -1)
1416 return -errno;
1417
1418 if (fcntl(fd, F_SETFL, flags | flag) == -1)
1419 return -errno;
1420
1421 return 0;
1422}
1423
829309c7
FB
1424#if defined(__linux__)
1425
fd872598
FB
1426#define RTC_FREQ 1024
1427
de9a95f0 1428static void enable_sigio_timer(int fd)
c8994013
TS
1429{
1430 struct sigaction act;
1431
1432 /* timer signal */
1433 sigfillset(&act.sa_mask);
1434 act.sa_flags = 0;
c8994013
TS
1435 act.sa_handler = host_alarm_handler;
1436
1437 sigaction(SIGIO, &act, NULL);
7183b4b4 1438 fcntl_setfl(fd, O_ASYNC);
c8994013
TS
1439 fcntl(fd, F_SETOWN, getpid());
1440}
829309c7 1441
c40ec5a9
TS
1442static int hpet_start_timer(struct qemu_alarm_timer *t)
1443{
1444 struct hpet_info info;
1445 int r, fd;
1446
1447 fd = open("/dev/hpet", O_RDONLY);
1448 if (fd < 0)
1449 return -1;
1450
1451 /* Set frequency */
1452 r = ioctl(fd, HPET_IRQFREQ, RTC_FREQ);
1453 if (r < 0) {
1454 fprintf(stderr, "Could not configure '/dev/hpet' to have a 1024Hz timer. This is not a fatal\n"
1455 "error, but for better emulation accuracy type:\n"
1456 "'echo 1024 > /proc/sys/dev/hpet/max-user-freq' as root.\n");
1457 goto fail;
1458 }
1459
1460 /* Check capabilities */
1461 r = ioctl(fd, HPET_INFO, &info);
1462 if (r < 0)
1463 goto fail;
1464
1465 /* Enable periodic mode */
1466 r = ioctl(fd, HPET_EPI, 0);
1467 if (info.hi_flags && (r < 0))
1468 goto fail;
1469
1470 /* Enable interrupt */
1471 r = ioctl(fd, HPET_IE_ON, 0);
1472 if (r < 0)
1473 goto fail;
1474
1475 enable_sigio_timer(fd);
fcdc2129 1476 t->priv = (void *)(long)fd;
c40ec5a9
TS
1477
1478 return 0;
1479fail:
1480 close(fd);
1481 return -1;
1482}
1483
1484static void hpet_stop_timer(struct qemu_alarm_timer *t)
1485{
fcdc2129 1486 int fd = (long)t->priv;
c40ec5a9
TS
1487
1488 close(fd);
1489}
1490
c8994013 1491static int rtc_start_timer(struct qemu_alarm_timer *t)
fd872598 1492{
c8994013 1493 int rtc_fd;
b5a23ad4 1494 unsigned long current_rtc_freq = 0;
c8994013 1495
aeb30be6 1496 TFR(rtc_fd = open("/dev/rtc", O_RDONLY));
fd872598
FB
1497 if (rtc_fd < 0)
1498 return -1;
b5a23ad4
AZ
1499 ioctl(rtc_fd, RTC_IRQP_READ, &current_rtc_freq);
1500 if (current_rtc_freq != RTC_FREQ &&
1501 ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
fd872598
FB
1502 fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
1503 "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
1504 "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
1505 goto fail;
1506 }
1507 if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
1508 fail:
1509 close(rtc_fd);
1510 return -1;
1511 }
c8994013
TS
1512
1513 enable_sigio_timer(rtc_fd);
1514
fcdc2129 1515 t->priv = (void *)(long)rtc_fd;
c8994013 1516
fd872598
FB
1517 return 0;
1518}
1519
c8994013 1520static void rtc_stop_timer(struct qemu_alarm_timer *t)
829309c7 1521{
fcdc2129 1522 int rtc_fd = (long)t->priv;
c8994013
TS
1523
1524 close(rtc_fd);
829309c7
FB
1525}
1526
efe75411
TS
1527static int dynticks_start_timer(struct qemu_alarm_timer *t)
1528{
1529 struct sigevent ev;
1530 timer_t host_timer;
1531 struct sigaction act;
1532
1533 sigfillset(&act.sa_mask);
1534 act.sa_flags = 0;
efe75411
TS
1535 act.sa_handler = host_alarm_handler;
1536
1537 sigaction(SIGALRM, &act, NULL);
1538
1539 ev.sigev_value.sival_int = 0;
1540 ev.sigev_notify = SIGEV_SIGNAL;
1541 ev.sigev_signo = SIGALRM;
1542
1543 if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
1544 perror("timer_create");
1545
1546 /* disable dynticks */
1547 fprintf(stderr, "Dynamic Ticks disabled\n");
1548
1549 return -1;
1550 }
1551
0399bfe0 1552 t->priv = (void *)(long)host_timer;
efe75411
TS
1553
1554 return 0;
1555}
1556
1557static void dynticks_stop_timer(struct qemu_alarm_timer *t)
1558{
0399bfe0 1559 timer_t host_timer = (timer_t)(long)t->priv;
efe75411
TS
1560
1561 timer_delete(host_timer);
1562}
1563
1564static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
1565{
0399bfe0 1566 timer_t host_timer = (timer_t)(long)t->priv;
efe75411
TS
1567 struct itimerspec timeout;
1568 int64_t nearest_delta_us = INT64_MAX;
1569 int64_t current_us;
1570
1571 if (!active_timers[QEMU_TIMER_REALTIME] &&
1572 !active_timers[QEMU_TIMER_VIRTUAL])
d5d08334 1573 return;
efe75411 1574
2e70f6ef 1575 nearest_delta_us = qemu_next_deadline_dyntick();
efe75411
TS
1576
1577 /* check whether a timer is already running */
1578 if (timer_gettime(host_timer, &timeout)) {
1579 perror("gettime");
1580 fprintf(stderr, "Internal timer error: aborting\n");
1581 exit(1);
1582 }
1583 current_us = timeout.it_value.tv_sec * 1000000 + timeout.it_value.tv_nsec/1000;
1584 if (current_us && current_us <= nearest_delta_us)
1585 return;
1586
1587 timeout.it_interval.tv_sec = 0;
1588 timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
1589 timeout.it_value.tv_sec = nearest_delta_us / 1000000;
1590 timeout.it_value.tv_nsec = (nearest_delta_us % 1000000) * 1000;
1591 if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
1592 perror("settime");
1593 fprintf(stderr, "Internal timer error: aborting\n");
1594 exit(1);
1595 }
1596}
1597
70744b3a 1598#endif /* defined(__linux__) */
231c6586 1599
c8994013
TS
1600static int unix_start_timer(struct qemu_alarm_timer *t)
1601{
1602 struct sigaction act;
1603 struct itimerval itv;
1604 int err;
1605
1606 /* timer signal */
1607 sigfillset(&act.sa_mask);
1608 act.sa_flags = 0;
c8994013
TS
1609 act.sa_handler = host_alarm_handler;
1610
1611 sigaction(SIGALRM, &act, NULL);
1612
1613 itv.it_interval.tv_sec = 0;
1614 /* for i386 kernel 2.6 to get 1 ms */
1615 itv.it_interval.tv_usec = 999;
1616 itv.it_value.tv_sec = 0;
1617 itv.it_value.tv_usec = 10 * 1000;
1618
1619 err = setitimer(ITIMER_REAL, &itv, NULL);
1620 if (err)
1621 return -1;
1622
1623 return 0;
1624}
1625
1626static void unix_stop_timer(struct qemu_alarm_timer *t)
1627{
1628 struct itimerval itv;
1629
1630 memset(&itv, 0, sizeof(itv));
1631 setitimer(ITIMER_REAL, &itv, NULL);
1632}
1633
829309c7 1634#endif /* !defined(_WIN32) */
fd872598 1635
f49e58dc
AL
1636static void try_to_rearm_timer(void *opaque)
1637{
1638 struct qemu_alarm_timer *t = opaque;
1639#ifndef _WIN32
1640 ssize_t len;
1641
1642 /* Drain the notify pipe */
1643 do {
1644 char buffer[512];
1645 len = read(alarm_timer_rfd, buffer, sizeof(buffer));
1646 } while ((len == -1 && errno == EINTR) || len > 0);
1647#endif
1648
f49e58dc
AL
1649 if (t->flags & ALARM_FLAG_EXPIRED) {
1650 alarm_timer->flags &= ~ALARM_FLAG_EXPIRED;
1651 qemu_rearm_alarm_timer(alarm_timer);
1652 }
1653}
1654
c8994013
TS
1655#ifdef _WIN32
1656
1657static int win32_start_timer(struct qemu_alarm_timer *t)
1658{
1659 TIMECAPS tc;
1660 struct qemu_alarm_win32 *data = t->priv;
efe75411 1661 UINT flags;
c8994013
TS
1662
1663 data->host_alarm = CreateEvent(NULL, FALSE, FALSE, NULL);
1664 if (!data->host_alarm) {
1665 perror("Failed CreateEvent");
c396a7f0 1666 return -1;
c8994013
TS
1667 }
1668
1669 memset(&tc, 0, sizeof(tc));
1670 timeGetDevCaps(&tc, sizeof(tc));
1671
1672 if (data->period < tc.wPeriodMin)
1673 data->period = tc.wPeriodMin;
1674
1675 timeBeginPeriod(data->period);
1676
efe75411
TS
1677 flags = TIME_CALLBACK_FUNCTION;
1678 if (alarm_has_dynticks(t))
1679 flags |= TIME_ONESHOT;
1680 else
1681 flags |= TIME_PERIODIC;
1682
c8994013
TS
1683 data->timerId = timeSetEvent(1, // interval (ms)
1684 data->period, // resolution
1685 host_alarm_handler, // function
1686 (DWORD)t, // parameter
efe75411 1687 flags);
c8994013
TS
1688
1689 if (!data->timerId) {
1690 perror("Failed to initialize win32 alarm timer");
1691
1692 timeEndPeriod(data->period);
1693 CloseHandle(data->host_alarm);
1694 return -1;
1695 }
1696
f49e58dc 1697 qemu_add_wait_object(data->host_alarm, try_to_rearm_timer, t);
c8994013
TS
1698
1699 return 0;
1700}
1701
1702static void win32_stop_timer(struct qemu_alarm_timer *t)
1703{
1704 struct qemu_alarm_win32 *data = t->priv;
1705
1706 timeKillEvent(data->timerId);
1707 timeEndPeriod(data->period);
1708
1709 CloseHandle(data->host_alarm);
1710}
1711
efe75411
TS
1712static void win32_rearm_timer(struct qemu_alarm_timer *t)
1713{
1714 struct qemu_alarm_win32 *data = t->priv;
1715 uint64_t nearest_delta_us;
1716
1717 if (!active_timers[QEMU_TIMER_REALTIME] &&
1718 !active_timers[QEMU_TIMER_VIRTUAL])
d5d08334 1719 return;
efe75411 1720
2e70f6ef 1721 nearest_delta_us = qemu_next_deadline_dyntick();
efe75411
TS
1722 nearest_delta_us /= 1000;
1723
1724 timeKillEvent(data->timerId);
1725
1726 data->timerId = timeSetEvent(1,
1727 data->period,
1728 host_alarm_handler,
1729 (DWORD)t,
1730 TIME_ONESHOT | TIME_PERIODIC);
1731
1732 if (!data->timerId) {
1733 perror("Failed to re-arm win32 alarm timer");
1734
1735 timeEndPeriod(data->period);
1736 CloseHandle(data->host_alarm);
1737 exit(1);
1738 }
1739}
1740
c8994013
TS
1741#endif /* _WIN32 */
1742
7183b4b4 1743static int init_timer_alarm(void)
8a7ddc38 1744{
223f0d72 1745 struct qemu_alarm_timer *t = NULL;
c8994013 1746 int i, err = -1;
f49e58dc
AL
1747
1748#ifndef _WIN32
c96f1a48
AL
1749 int fds[2];
1750
7183b4b4
AL
1751 err = pipe(fds);
1752 if (err == -1)
1753 return -errno;
1754
1755 err = fcntl_setfl(fds[0], O_NONBLOCK);
1756 if (err < 0)
1757 goto fail;
1758
1759 err = fcntl_setfl(fds[1], O_NONBLOCK);
1760 if (err < 0)
1761 goto fail;
1762
c96f1a48
AL
1763 alarm_timer_rfd = fds[0];
1764 alarm_timer_wfd = fds[1];
f49e58dc 1765#endif
c8994013
TS
1766
1767 for (i = 0; alarm_timers[i].name; i++) {
1768 t = &alarm_timers[i];
1769
c8994013
TS
1770 err = t->start(t);
1771 if (!err)
1772 break;
67b915a5 1773 }
fd872598 1774
c8994013 1775 if (err) {
7183b4b4
AL
1776 err = -ENOENT;
1777 goto fail;
67b915a5 1778 }
c8994013 1779
f49e58dc 1780#ifndef _WIN32
6abfbd79
AL
1781 qemu_set_fd_handler2(alarm_timer_rfd, NULL,
1782 try_to_rearm_timer, NULL, t);
f49e58dc 1783#endif
6abfbd79 1784
c8994013 1785 alarm_timer = t;
7183b4b4 1786
6abfbd79 1787 return 0;
7183b4b4
AL
1788
1789fail:
f49e58dc 1790#ifndef _WIN32
7183b4b4
AL
1791 close(fds[0]);
1792 close(fds[1]);
f49e58dc 1793#endif
7183b4b4 1794 return err;
8a7ddc38
FB
1795}
1796
9596ebb7 1797static void quit_timers(void)
40c3bac3 1798{
c8994013
TS
1799 alarm_timer->stop(alarm_timer);
1800 alarm_timer = NULL;
40c3bac3
FB
1801}
1802
f6503059
AZ
1803/***********************************************************/
1804/* host time/date access */
1805void qemu_get_timedate(struct tm *tm, int offset)
1806{
1807 time_t ti;
1808 struct tm *ret;
1809
1810 time(&ti);
1811 ti += offset;
1812 if (rtc_date_offset == -1) {
1813 if (rtc_utc)
1814 ret = gmtime(&ti);
1815 else
1816 ret = localtime(&ti);
1817 } else {
1818 ti -= rtc_date_offset;
1819 ret = gmtime(&ti);
1820 }
1821
1822 memcpy(tm, ret, sizeof(struct tm));
1823}
1824
1825int qemu_timedate_diff(struct tm *tm)
1826{
1827 time_t seconds;
1828
1829 if (rtc_date_offset == -1)
1830 if (rtc_utc)
1831 seconds = mktimegm(tm);
1832 else
1833 seconds = mktime(tm);
1834 else
1835 seconds = mktimegm(tm) + rtc_date_offset;
1836
1837 return seconds - time(NULL);
1838}
1839
fd1dff4b 1840#ifdef _WIN32
fd1dff4b
FB
1841static void socket_cleanup(void)
1842{
1843 WSACleanup();
1844}
82c643ff 1845
fd1dff4b
FB
1846static int socket_init(void)
1847{
1848 WSADATA Data;
1849 int ret, err;
1850
1851 ret = WSAStartup(MAKEWORD(2,2), &Data);
1852 if (ret != 0) {
1853 err = WSAGetLastError();
1854 fprintf(stderr, "WSAStartup: %d\n", err);
1855 return -1;
1856 }
1857 atexit(socket_cleanup);
1858 return 0;
1859}
64b7b733
AJ
1860#endif
1861
63a01ef8 1862const char *get_opt_name(char *buf, int buf_size, const char *p)
609497ab
AZ
1863{
1864 char *q;
1865
1866 q = buf;
1867 while (*p != '\0' && *p != '=') {
1868 if (q && (q - buf) < buf_size - 1)
1869 *q++ = *p;
1870 p++;
1871 }
1872 if (q)
1873 *q = '\0';
1874
1875 return p;
1876}
1877
63a01ef8 1878const char *get_opt_value(char *buf, int buf_size, const char *p)
e4bcb14c
TS
1879{
1880 char *q;
e4bcb14c 1881
e4bcb14c
TS
1882 q = buf;
1883 while (*p != '\0') {
609497ab
AZ
1884 if (*p == ',') {
1885 if (*(p + 1) != ',')
e4bcb14c 1886 break;
e4bcb14c 1887 p++;
609497ab 1888 }
e4bcb14c
TS
1889 if (q && (q - buf) < buf_size - 1)
1890 *q++ = *p;
1891 p++;
1892 }
1893 if (q)
1894 *q = '\0';
1895
1896 return p;
1897}
1898
63a01ef8
AL
1899int get_param_value(char *buf, int buf_size,
1900 const char *tag, const char *str)
7c9d8e07
FB
1901{
1902 const char *p;
7c9d8e07
FB
1903 char option[128];
1904
1905 p = str;
1906 for(;;) {
609497ab 1907 p = get_opt_name(option, sizeof(option), p);
7c9d8e07
FB
1908 if (*p != '=')
1909 break;
1910 p++;
1911 if (!strcmp(tag, option)) {
609497ab 1912 (void)get_opt_value(buf, buf_size, p);
e4bcb14c 1913 return strlen(buf);
7c9d8e07 1914 } else {
609497ab 1915 p = get_opt_value(NULL, 0, p);
7c9d8e07
FB
1916 }
1917 if (*p != ',')
1918 break;
1919 p++;
1920 }
1921 return 0;
1922}
1923
63a01ef8
AL
1924int check_params(char *buf, int buf_size,
1925 const char * const *params, const char *str)
e4bcb14c
TS
1926{
1927 const char *p;
1928 int i;
1929
1930 p = str;
1931 for(;;) {
609497ab 1932 p = get_opt_name(buf, buf_size, p);
e4bcb14c
TS
1933 if (*p != '=')
1934 return -1;
1935 p++;
1936 for(i = 0; params[i] != NULL; i++)
1937 if (!strcmp(params[i], buf))
1938 break;
1939 if (params[i] == NULL)
1940 return -1;
609497ab 1941 p = get_opt_value(NULL, 0, p);
e4bcb14c
TS
1942 if (*p != ',')
1943 break;
1944 p++;
1945 }
1946 return 0;
1947}
1948
1ae26a18
AZ
1949/***********************************************************/
1950/* Bluetooth support */
1951static int nb_hcis;
1952static int cur_hci;
1953static struct HCIInfo *hci_table[MAX_NICS];
dc72ac14 1954
1ae26a18
AZ
1955static struct bt_vlan_s {
1956 struct bt_scatternet_s net;
1957 int id;
1958 struct bt_vlan_s *next;
1959} *first_bt_vlan;
1960
1961/* find or alloc a new bluetooth "VLAN" */
674bb261 1962static struct bt_scatternet_s *qemu_find_bt_vlan(int id)
1ae26a18
AZ
1963{
1964 struct bt_vlan_s **pvlan, *vlan;
1965 for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
1966 if (vlan->id == id)
1967 return &vlan->net;
1968 }
1969 vlan = qemu_mallocz(sizeof(struct bt_vlan_s));
1970 vlan->id = id;
1971 pvlan = &first_bt_vlan;
1972 while (*pvlan != NULL)
1973 pvlan = &(*pvlan)->next;
1974 *pvlan = vlan;
1975 return &vlan->net;
1976}
1977
1978static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
1979{
1980}
1981
1982static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
1983{
1984 return -ENOTSUP;
1985}
1986
1987static struct HCIInfo null_hci = {
1988 .cmd_send = null_hci_send,
1989 .sco_send = null_hci_send,
1990 .acl_send = null_hci_send,
1991 .bdaddr_set = null_hci_addr_set,
1992};
1993
1994struct HCIInfo *qemu_next_hci(void)
1995{
1996 if (cur_hci == nb_hcis)
1997 return &null_hci;
1998
1999 return hci_table[cur_hci++];
2000}
2001
dc72ac14
AZ
2002static struct HCIInfo *hci_init(const char *str)
2003{
2004 char *endp;
2005 struct bt_scatternet_s *vlan = 0;
2006
2007 if (!strcmp(str, "null"))
2008 /* null */
2009 return &null_hci;
2010 else if (!strncmp(str, "host", 4) && (str[4] == '\0' || str[4] == ':'))
2011 /* host[:hciN] */
2012 return bt_host_hci(str[4] ? str + 5 : "hci0");
2013 else if (!strncmp(str, "hci", 3)) {
2014 /* hci[,vlan=n] */
2015 if (str[3]) {
2016 if (!strncmp(str + 3, ",vlan=", 6)) {
2017 vlan = qemu_find_bt_vlan(strtol(str + 9, &endp, 0));
2018 if (*endp)
2019 vlan = 0;
2020 }
2021 } else
2022 vlan = qemu_find_bt_vlan(0);
2023 if (vlan)
2024 return bt_new_hci(vlan);
2025 }
2026
2027 fprintf(stderr, "qemu: Unknown bluetooth HCI `%s'.\n", str);
2028
2029 return 0;
2030}
2031
2032static int bt_hci_parse(const char *str)
2033{
2034 struct HCIInfo *hci;
2035 bdaddr_t bdaddr;
2036
2037 if (nb_hcis >= MAX_NICS) {
2038 fprintf(stderr, "qemu: Too many bluetooth HCIs (max %i).\n", MAX_NICS);
2039 return -1;
2040 }
2041
2042 hci = hci_init(str);
2043 if (!hci)
2044 return -1;
2045
2046 bdaddr.b[0] = 0x52;
2047 bdaddr.b[1] = 0x54;
2048 bdaddr.b[2] = 0x00;
2049 bdaddr.b[3] = 0x12;
2050 bdaddr.b[4] = 0x34;
2051 bdaddr.b[5] = 0x56 + nb_hcis;
2052 hci->bdaddr_set(hci, bdaddr.b);
2053
2054 hci_table[nb_hcis++] = hci;
2055
2056 return 0;
2057}
2058
2059static void bt_vhci_add(int vlan_id)
2060{
2061 struct bt_scatternet_s *vlan = qemu_find_bt_vlan(vlan_id);
2062
2063 if (!vlan->slave)
2064 fprintf(stderr, "qemu: warning: adding a VHCI to "
2065 "an empty scatternet %i\n", vlan_id);
2066
2067 bt_vhci_init(bt_new_hci(vlan));
2068}
2069
2070static struct bt_device_s *bt_device_add(const char *opt)
2071{
2072 struct bt_scatternet_s *vlan;
2073 int vlan_id = 0;
2074 char *endp = strstr(opt, ",vlan=");
2075 int len = (endp ? endp - opt : strlen(opt)) + 1;
2076 char devname[10];
2077
2078 pstrcpy(devname, MIN(sizeof(devname), len), opt);
2079
2080 if (endp) {
2081 vlan_id = strtol(endp + 6, &endp, 0);
2082 if (*endp) {
2083 fprintf(stderr, "qemu: unrecognised bluetooth vlan Id\n");
2084 return 0;
2085 }
2086 }
2087
2088 vlan = qemu_find_bt_vlan(vlan_id);
2089
2090 if (!vlan->slave)
2091 fprintf(stderr, "qemu: warning: adding a slave device to "
2092 "an empty scatternet %i\n", vlan_id);
2093
2094 if (!strcmp(devname, "keyboard"))
2095 return bt_keyboard_init(vlan);
2096
2097 fprintf(stderr, "qemu: unsupported bluetooth device `%s'\n", devname);
2098 return 0;
2099}
2100
2101static int bt_parse(const char *opt)
2102{
2103 const char *endp, *p;
2104 int vlan;
2105
2106 if (strstart(opt, "hci", &endp)) {
2107 if (!*endp || *endp == ',') {
2108 if (*endp)
2109 if (!strstart(endp, ",vlan=", 0))
2110 opt = endp + 1;
2111
2112 return bt_hci_parse(opt);
2113 }
2114 } else if (strstart(opt, "vhci", &endp)) {
2115 if (!*endp || *endp == ',') {
2116 if (*endp) {
2117 if (strstart(endp, ",vlan=", &p)) {
2118 vlan = strtol(p, (char **) &endp, 0);
2119 if (*endp) {
2120 fprintf(stderr, "qemu: bad scatternet '%s'\n", p);
2121 return 1;
2122 }
2123 } else {
2124 fprintf(stderr, "qemu: bad parameter '%s'\n", endp + 1);
2125 return 1;
2126 }
2127 } else
2128 vlan = 0;
2129
2130 bt_vhci_add(vlan);
2131 return 0;
2132 }
2133 } else if (strstart(opt, "device:", &endp))
2134 return !bt_device_add(endp);
2135
2136 fprintf(stderr, "qemu: bad bluetooth parameter '%s'\n", opt);
2137 return 1;
2138}
2139
1ae26a18
AZ
2140/***********************************************************/
2141/* QEMU Block devices */
2142
609497ab 2143#define HD_ALIAS "index=%d,media=disk"
e4bcb14c 2144#define CDROM_ALIAS "index=2,media=cdrom"
e4bcb14c 2145#define FD_ALIAS "index=%d,if=floppy"
609497ab
AZ
2146#define PFLASH_ALIAS "if=pflash"
2147#define MTD_ALIAS "if=mtd"
9d413d1d 2148#define SD_ALIAS "index=0,if=sd"
e4bcb14c 2149
7d5aca9e
AL
2150static int drive_opt_get_free_idx(void)
2151{
2152 int index;
2153
2154 for (index = 0; index < MAX_DRIVES; index++)
2155 if (!drives_opt[index].used) {
2156 drives_opt[index].used = 1;
2157 return index;
2158 }
2159
2160 return -1;
2161}
2162
2163static int drive_get_free_idx(void)
2164{
2165 int index;
2166
2167 for (index = 0; index < MAX_DRIVES; index++)
2168 if (!drives_table[index].used) {
2169 drives_table[index].used = 1;
2170 return index;
2171 }
2172
2173 return -1;
2174}
2175
4d73cd3b 2176int drive_add(const char *file, const char *fmt, ...)
e4bcb14c
TS
2177{
2178 va_list ap;
7d5aca9e 2179 int index = drive_opt_get_free_idx();
e4bcb14c 2180
7d5aca9e 2181 if (nb_drives_opt >= MAX_DRIVES || index == -1) {
e4bcb14c 2182 fprintf(stderr, "qemu: too many drives\n");
4d73cd3b 2183 return -1;
e4bcb14c
TS
2184 }
2185
7d5aca9e 2186 drives_opt[index].file = file;
e4bcb14c 2187 va_start(ap, fmt);
7d5aca9e 2188 vsnprintf(drives_opt[index].opt,
609497ab 2189 sizeof(drives_opt[0].opt), fmt, ap);
e4bcb14c
TS
2190 va_end(ap);
2191
7d5aca9e
AL
2192 nb_drives_opt++;
2193 return index;
e4bcb14c
TS
2194}
2195
b01b1111
AL
2196void drive_remove(int index)
2197{
2198 drives_opt[index].used = 0;
2199 nb_drives_opt--;
2200}
2201
f60d39bc 2202int drive_get_index(BlockInterfaceType type, int bus, int unit)
e4bcb14c
TS
2203{
2204 int index;
2205
2206 /* seek interface, bus and unit */
2207
7d5aca9e 2208 for (index = 0; index < MAX_DRIVES; index++)
f60d39bc 2209 if (drives_table[index].type == type &&
e4bcb14c 2210 drives_table[index].bus == bus &&
7d5aca9e
AL
2211 drives_table[index].unit == unit &&
2212 drives_table[index].used)
e4bcb14c
TS
2213 return index;
2214
2215 return -1;
2216}
2217
f60d39bc 2218int drive_get_max_bus(BlockInterfaceType type)
e4bcb14c
TS
2219{
2220 int max_bus;
2221 int index;
2222
2223 max_bus = -1;
2224 for (index = 0; index < nb_drives; index++) {
f60d39bc 2225 if(drives_table[index].type == type &&
e4bcb14c
TS
2226 drives_table[index].bus > max_bus)
2227 max_bus = drives_table[index].bus;
2228 }
2229 return max_bus;
2230}
2231
fa879c64
AL
2232const char *drive_get_serial(BlockDriverState *bdrv)
2233{
2234 int index;
2235
2236 for (index = 0; index < nb_drives; index++)
2237 if (drives_table[index].bdrv == bdrv)
2238 return drives_table[index].serial;
2239
2240 return "\0";
2241}
2242
428c5705
AL
2243BlockInterfaceErrorAction drive_get_onerror(BlockDriverState *bdrv)
2244{
2245 int index;
2246
2247 for (index = 0; index < nb_drives; index++)
2248 if (drives_table[index].bdrv == bdrv)
2249 return drives_table[index].onerror;
2250
cdad4bd8 2251 return BLOCK_ERR_STOP_ENOSPC;
428c5705
AL
2252}
2253
a1620fac
AJ
2254static void bdrv_format_print(void *opaque, const char *name)
2255{
2256 fprintf(stderr, " %s", name);
2257}
2258
b01b1111
AL
2259void drive_uninit(BlockDriverState *bdrv)
2260{
2261 int i;
2262
2263 for (i = 0; i < MAX_DRIVES; i++)
2264 if (drives_table[i].bdrv == bdrv) {
2265 drives_table[i].bdrv = NULL;
2266 drives_table[i].used = 0;
2267 drive_remove(drives_table[i].drive_opt_idx);
2268 nb_drives--;
2269 break;
2270 }
2271}
2272
4d73cd3b 2273int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
e4bcb14c
TS
2274{
2275 char buf[128];
2276 char file[1024];
c8522bdf 2277 char devname[128];
fa879c64 2278 char serial[21];
c8522bdf 2279 const char *mediastr = "";
f60d39bc 2280 BlockInterfaceType type;
e4bcb14c
TS
2281 enum { MEDIA_DISK, MEDIA_CDROM } media;
2282 int bus_id, unit_id;
2283 int cyls, heads, secs, translation;
2284 BlockDriverState *bdrv;
1e72d3b7 2285 BlockDriver *drv = NULL;
4d73cd3b 2286 QEMUMachine *machine = opaque;
e4bcb14c
TS
2287 int max_devs;
2288 int index;
33f00271 2289 int cache;
428c5705 2290 int bdrv_flags, onerror;
7d5aca9e 2291 int drives_table_idx;
609497ab 2292 char *str = arg->opt;
7ccfb2eb
BS
2293 static const char * const params[] = { "bus", "unit", "if", "index",
2294 "cyls", "heads", "secs", "trans",
2295 "media", "snapshot", "file",
428c5705
AL
2296 "cache", "format", "serial", "werror",
2297 NULL };
e4bcb14c
TS
2298
2299 if (check_params(buf, sizeof(buf), params, str) < 0) {
ff993638 2300 fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n",
e4bcb14c
TS
2301 buf, str);
2302 return -1;
2303 }
2304
2305 file[0] = 0;
2306 cyls = heads = secs = 0;
2307 bus_id = 0;
2308 unit_id = -1;
2309 translation = BIOS_ATA_TRANSLATION_AUTO;
2310 index = -1;
4dc822d7 2311 cache = 3;
e4bcb14c 2312
c9b1ae2c 2313 if (machine->use_scsi) {
f60d39bc 2314 type = IF_SCSI;
e4bcb14c 2315 max_devs = MAX_SCSI_DEVS;
363a37d5 2316 pstrcpy(devname, sizeof(devname), "scsi");
e4bcb14c 2317 } else {
f60d39bc 2318 type = IF_IDE;
e4bcb14c 2319 max_devs = MAX_IDE_DEVS;
363a37d5 2320 pstrcpy(devname, sizeof(devname), "ide");
e4bcb14c
TS
2321 }
2322 media = MEDIA_DISK;
2323
2324 /* extract parameters */
2325
2326 if (get_param_value(buf, sizeof(buf), "bus", str)) {
2327 bus_id = strtol(buf, NULL, 0);
2328 if (bus_id < 0) {
2329 fprintf(stderr, "qemu: '%s' invalid bus id\n", str);
2330 return -1;
2331 }
2332 }
2333
2334 if (get_param_value(buf, sizeof(buf), "unit", str)) {
2335 unit_id = strtol(buf, NULL, 0);
2336 if (unit_id < 0) {
2337 fprintf(stderr, "qemu: '%s' invalid unit id\n", str);
2338 return -1;
2339 }
2340 }
2341
2342 if (get_param_value(buf, sizeof(buf), "if", str)) {
ae45d369 2343 pstrcpy(devname, sizeof(devname), buf);
e4bcb14c 2344 if (!strcmp(buf, "ide")) {
f60d39bc 2345 type = IF_IDE;
e4bcb14c
TS
2346 max_devs = MAX_IDE_DEVS;
2347 } else if (!strcmp(buf, "scsi")) {
f60d39bc 2348 type = IF_SCSI;
e4bcb14c
TS
2349 max_devs = MAX_SCSI_DEVS;
2350 } else if (!strcmp(buf, "floppy")) {
f60d39bc 2351 type = IF_FLOPPY;
e4bcb14c
TS
2352 max_devs = 0;
2353 } else if (!strcmp(buf, "pflash")) {
f60d39bc 2354 type = IF_PFLASH;
e4bcb14c
TS
2355 max_devs = 0;
2356 } else if (!strcmp(buf, "mtd")) {
f60d39bc 2357 type = IF_MTD;
e4bcb14c
TS
2358 max_devs = 0;
2359 } else if (!strcmp(buf, "sd")) {
f60d39bc 2360 type = IF_SD;
e4bcb14c 2361 max_devs = 0;
6e02c38d
AL
2362 } else if (!strcmp(buf, "virtio")) {
2363 type = IF_VIRTIO;
2364 max_devs = 0;
2365 } else {
e4bcb14c
TS
2366 fprintf(stderr, "qemu: '%s' unsupported bus type '%s'\n", str, buf);
2367 return -1;
2368 }
2369 }
2370
2371 if (get_param_value(buf, sizeof(buf), "index", str)) {
2372 index = strtol(buf, NULL, 0);
2373 if (index < 0) {
2374 fprintf(stderr, "qemu: '%s' invalid index\n", str);
2375 return -1;
2376 }
2377 }
2378
2379 if (get_param_value(buf, sizeof(buf), "cyls", str)) {
2380 cyls = strtol(buf, NULL, 0);
2381 }
2382
2383 if (get_param_value(buf, sizeof(buf), "heads", str)) {
2384 heads = strtol(buf, NULL, 0);
2385 }
2386
2387 if (get_param_value(buf, sizeof(buf), "secs", str)) {
2388 secs = strtol(buf, NULL, 0);
2389 }
2390
2391 if (cyls || heads || secs) {
2392 if (cyls < 1 || cyls > 16383) {
2393 fprintf(stderr, "qemu: '%s' invalid physical cyls number\n", str);
2394 return -1;
2395 }
2396 if (heads < 1 || heads > 16) {
2397 fprintf(stderr, "qemu: '%s' invalid physical heads number\n", str);
2398 return -1;
2399 }
2400 if (secs < 1 || secs > 63) {
2401 fprintf(stderr, "qemu: '%s' invalid physical secs number\n", str);
2402 return -1;
2403 }
2404 }
2405
2406 if (get_param_value(buf, sizeof(buf), "trans", str)) {
2407 if (!cyls) {
2408 fprintf(stderr,
2409 "qemu: '%s' trans must be used with cyls,heads and secs\n",
2410 str);
2411 return -1;
2412 }
2413 if (!strcmp(buf, "none"))
2414 translation = BIOS_ATA_TRANSLATION_NONE;
2415 else if (!strcmp(buf, "lba"))
2416 translation = BIOS_ATA_TRANSLATION_LBA;
2417 else if (!strcmp(buf, "auto"))
2418 translation = BIOS_ATA_TRANSLATION_AUTO;
2419 else {
2420 fprintf(stderr, "qemu: '%s' invalid translation type\n", str);
2421 return -1;
2422 }
2423 }
2424
2425 if (get_param_value(buf, sizeof(buf), "media", str)) {
2426 if (!strcmp(buf, "disk")) {
2427 media = MEDIA_DISK;
2428 } else if (!strcmp(buf, "cdrom")) {
2429 if (cyls || secs || heads) {
2430 fprintf(stderr,
2431 "qemu: '%s' invalid physical CHS format\n", str);
2432 return -1;
2433 }
2434 media = MEDIA_CDROM;
2435 } else {
2436 fprintf(stderr, "qemu: '%s' invalid media\n", str);
2437 return -1;
2438 }
2439 }
2440
2441 if (get_param_value(buf, sizeof(buf), "snapshot", str)) {
2442 if (!strcmp(buf, "on"))
2443 snapshot = 1;
2444 else if (!strcmp(buf, "off"))
2445 snapshot = 0;
2446 else {
2447 fprintf(stderr, "qemu: '%s' invalid snapshot option\n", str);
2448 return -1;
2449 }
2450 }
2451
33f00271 2452 if (get_param_value(buf, sizeof(buf), "cache", str)) {
9f7965c7 2453 if (!strcmp(buf, "off") || !strcmp(buf, "none"))
33f00271 2454 cache = 0;
9f7965c7 2455 else if (!strcmp(buf, "writethrough"))
33f00271 2456 cache = 1;
9f7965c7
AL
2457 else if (!strcmp(buf, "writeback"))
2458 cache = 2;
33f00271
AZ
2459 else {
2460 fprintf(stderr, "qemu: invalid cache option\n");
2461 return -1;
2462 }
2463 }
2464
1e72d3b7 2465 if (get_param_value(buf, sizeof(buf), "format", str)) {
a1620fac
AJ
2466 if (strcmp(buf, "?") == 0) {
2467 fprintf(stderr, "qemu: Supported formats:");
2468 bdrv_iterate_format(bdrv_format_print, NULL);
2469 fprintf(stderr, "\n");
2470 return -1;
2471 }
1e72d3b7
AJ
2472 drv = bdrv_find_format(buf);
2473 if (!drv) {
2474 fprintf(stderr, "qemu: '%s' invalid format\n", buf);
2475 return -1;
2476 }
2477 }
2478
609497ab
AZ
2479 if (arg->file == NULL)
2480 get_param_value(file, sizeof(file), "file", str);
2481 else
2482 pstrcpy(file, sizeof(file), arg->file);
e4bcb14c 2483
fa879c64
AL
2484 if (!get_param_value(serial, sizeof(serial), "serial", str))
2485 memset(serial, 0, sizeof(serial));
2486
cdad4bd8 2487 onerror = BLOCK_ERR_STOP_ENOSPC;
428c5705 2488 if (get_param_value(buf, sizeof(serial), "werror", str)) {
869a5c6d 2489 if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO) {
ea8a5d7f 2490 fprintf(stderr, "werror is no supported by this format\n");
428c5705
AL
2491 return -1;
2492 }
2493 if (!strcmp(buf, "ignore"))
2494 onerror = BLOCK_ERR_IGNORE;
2495 else if (!strcmp(buf, "enospc"))
2496 onerror = BLOCK_ERR_STOP_ENOSPC;
2497 else if (!strcmp(buf, "stop"))
2498 onerror = BLOCK_ERR_STOP_ANY;
2499 else if (!strcmp(buf, "report"))
2500 onerror = BLOCK_ERR_REPORT;
2501 else {
2502 fprintf(stderr, "qemu: '%s' invalid write error action\n", buf);
2503 return -1;
2504 }
2505 }
2506
e4bcb14c
TS
2507 /* compute bus and unit according index */
2508
2509 if (index != -1) {
2510 if (bus_id != 0 || unit_id != -1) {
2511 fprintf(stderr,
2512 "qemu: '%s' index cannot be used with bus and unit\n", str);
2513 return -1;
2514 }
2515 if (max_devs == 0)
2516 {
2517 unit_id = index;
2518 bus_id = 0;
2519 } else {
2520 unit_id = index % max_devs;
2521 bus_id = index / max_devs;
2522 }
2523 }
2524
2525 /* if user doesn't specify a unit_id,
2526 * try to find the first free
2527 */
2528
2529 if (unit_id == -1) {
2530 unit_id = 0;
f60d39bc 2531 while (drive_get_index(type, bus_id, unit_id) != -1) {
e4bcb14c
TS
2532 unit_id++;
2533 if (max_devs && unit_id >= max_devs) {
2534 unit_id -= max_devs;
2535 bus_id++;
2536 }
2537 }
2538 }
2539
2540 /* check unit id */
2541
2542 if (max_devs && unit_id >= max_devs) {
2543 fprintf(stderr, "qemu: '%s' unit %d too big (max is %d)\n",
2544 str, unit_id, max_devs - 1);
2545 return -1;
2546 }
2547
2548 /*
2549 * ignore multiple definitions
2550 */
2551
f60d39bc 2552 if (drive_get_index(type, bus_id, unit_id) != -1)
4d73cd3b 2553 return -2;
e4bcb14c
TS
2554
2555 /* init */
2556
f60d39bc 2557 if (type == IF_IDE || type == IF_SCSI)
c8522bdf 2558 mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd";
e6198a70
AZ
2559 if (max_devs)
2560 snprintf(buf, sizeof(buf), "%s%i%s%i",
2561 devname, bus_id, mediastr, unit_id);
2562 else
2563 snprintf(buf, sizeof(buf), "%s%s%i",
2564 devname, mediastr, unit_id);
e4bcb14c 2565 bdrv = bdrv_new(buf);
7d5aca9e
AL
2566 drives_table_idx = drive_get_free_idx();
2567 drives_table[drives_table_idx].bdrv = bdrv;
2568 drives_table[drives_table_idx].type = type;
2569 drives_table[drives_table_idx].bus = bus_id;
2570 drives_table[drives_table_idx].unit = unit_id;
2571 drives_table[drives_table_idx].onerror = onerror;
b01b1111 2572 drives_table[drives_table_idx].drive_opt_idx = arg - drives_opt;
fa879c64 2573 strncpy(drives_table[nb_drives].serial, serial, sizeof(serial));
e4bcb14c
TS
2574 nb_drives++;
2575
f60d39bc 2576 switch(type) {
e4bcb14c
TS
2577 case IF_IDE:
2578 case IF_SCSI:
2579 switch(media) {
2580 case MEDIA_DISK:
2581 if (cyls != 0) {
2582 bdrv_set_geometry_hint(bdrv, cyls, heads, secs);
2583 bdrv_set_translation_hint(bdrv, translation);
2584 }
2585 break;
2586 case MEDIA_CDROM:
2587 bdrv_set_type_hint(bdrv, BDRV_TYPE_CDROM);
2588 break;
2589 }
2590 break;
2591 case IF_SD:
2592 /* FIXME: This isn't really a floppy, but it's a reasonable
2593 approximation. */
2594 case IF_FLOPPY:
2595 bdrv_set_type_hint(bdrv, BDRV_TYPE_FLOPPY);
2596 break;
2597 case IF_PFLASH:
2598 case IF_MTD:
6e02c38d 2599 case IF_VIRTIO:
e4bcb14c
TS
2600 break;
2601 }
2602 if (!file[0])
4d73cd3b 2603 return -2;
33f00271 2604 bdrv_flags = 0;
9f7965c7 2605 if (snapshot) {
33f00271 2606 bdrv_flags |= BDRV_O_SNAPSHOT;
9f7965c7
AL
2607 cache = 2; /* always use write-back with snapshot */
2608 }
2609 if (cache == 0) /* no caching */
2610 bdrv_flags |= BDRV_O_NOCACHE;
2611 else if (cache == 2) /* write-back */
2612 bdrv_flags |= BDRV_O_CACHE_WB;
4dc822d7
AL
2613 else if (cache == 3) /* not specified */
2614 bdrv_flags |= BDRV_O_CACHE_DEF;
c0f4ce77 2615 if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0) {
e4bcb14c
TS
2616 fprintf(stderr, "qemu: could not open disk image %s\n",
2617 file);
2618 return -1;
2619 }
c0f4ce77
AL
2620 if (bdrv_key_required(bdrv))
2621 autostart = 0;
4d73cd3b 2622 return drives_table_idx;
e4bcb14c
TS
2623}
2624
a594cfbf
FB
2625/***********************************************************/
2626/* USB devices */
2627
0d92ed30
PB
2628static USBPort *used_usb_ports;
2629static USBPort *free_usb_ports;
2630
2631/* ??? Maybe change this to register a hub to keep track of the topology. */
2632void qemu_register_usb_port(USBPort *port, void *opaque, int index,
2633 usb_attachfn attach)
2634{
2635 port->opaque = opaque;
2636 port->index = index;
2637 port->attach = attach;
2638 port->next = free_usb_ports;
2639 free_usb_ports = port;
2640}
2641
4b096fc9
AL
2642int usb_device_add_dev(USBDevice *dev)
2643{
2644 USBPort *port;
2645
2646 /* Find a USB port to add the device to. */
2647 port = free_usb_ports;
2648 if (!port->next) {
2649 USBDevice *hub;
2650
2651 /* Create a new hub and chain it on. */
2652 free_usb_ports = NULL;
2653 port->next = used_usb_ports;
2654 used_usb_ports = port;
2655
2656 hub = usb_hub_init(VM_USB_HUB_SIZE);
2657 usb_attach(port, hub);
2658 port = free_usb_ports;
2659 }
2660
2661 free_usb_ports = port->next;
2662 port->next = used_usb_ports;
2663 used_usb_ports = port;
2664 usb_attach(port, dev);
2665 return 0;
2666}
2667
bb5fc20f
AL
2668static void usb_msd_password_cb(void *opaque, int err)
2669{
2670 USBDevice *dev = opaque;
2671
2672 if (!err)
2673 usb_device_add_dev(dev);
2674 else
2675 dev->handle_destroy(dev);
2676}
2677
c0f4ce77 2678static int usb_device_add(const char *devname, int is_hotplug)
a594cfbf
FB
2679{
2680 const char *p;
2681 USBDevice *dev;
a594cfbf 2682
0d92ed30 2683 if (!free_usb_ports)
a594cfbf
FB
2684 return -1;
2685
2686 if (strstart(devname, "host:", &p)) {
2687 dev = usb_host_device_open(p);
a594cfbf
FB
2688 } else if (!strcmp(devname, "mouse")) {
2689 dev = usb_mouse_init();
09b26c5e 2690 } else if (!strcmp(devname, "tablet")) {
47b2d338
AZ
2691 dev = usb_tablet_init();
2692 } else if (!strcmp(devname, "keyboard")) {
2693 dev = usb_keyboard_init();
2e5d83bb 2694 } else if (strstart(devname, "disk:", &p)) {
c0f4ce77
AL
2695 BlockDriverState *bs;
2696
bb5fc20f 2697 dev = usb_msd_init(p);
c0f4ce77
AL
2698 if (!dev)
2699 return -1;
bb5fc20f 2700 bs = usb_msd_get_bdrv(dev);
c0f4ce77
AL
2701 if (bdrv_key_required(bs)) {
2702 autostart = 0;
bb5fc20f 2703 if (is_hotplug) {
376253ec
AL
2704 monitor_read_bdrv_key_start(cur_mon, bs, usb_msd_password_cb,
2705 dev);
bb5fc20f 2706 return 0;
c0f4ce77
AL
2707 }
2708 }
f6d2a316
AZ
2709 } else if (!strcmp(devname, "wacom-tablet")) {
2710 dev = usb_wacom_init();
a7954218
AZ
2711 } else if (strstart(devname, "serial:", &p)) {
2712 dev = usb_serial_init(p);
2e4d9fb1
AJ
2713#ifdef CONFIG_BRLAPI
2714 } else if (!strcmp(devname, "braille")) {
2715 dev = usb_baum_init();
2716#endif
6c9f886c 2717 } else if (strstart(devname, "net:", &p)) {
9ad97e65 2718 int nic = nb_nics;
6c9f886c 2719
9ad97e65 2720 if (net_client_init("nic", p) < 0)
6c9f886c 2721 return -1;
9ad97e65
AZ
2722 nd_table[nic].model = "usb";
2723 dev = usb_net_init(&nd_table[nic]);
dc72ac14
AZ
2724 } else if (!strcmp(devname, "bt") || strstart(devname, "bt:", &p)) {
2725 dev = usb_bt_init(devname[2] ? hci_init(p) :
2726 bt_new_hci(qemu_find_bt_vlan(0)));
a594cfbf
FB
2727 } else {
2728 return -1;
2729 }
0d92ed30
PB
2730 if (!dev)
2731 return -1;
2732
4b096fc9 2733 return usb_device_add_dev(dev);
a594cfbf
FB
2734}
2735
1f3870ab 2736int usb_device_del_addr(int bus_num, int addr)
a594cfbf 2737{
0d92ed30
PB
2738 USBPort *port;
2739 USBPort **lastp;
059809e4 2740 USBDevice *dev;
a594cfbf 2741
0d92ed30 2742 if (!used_usb_ports)
a594cfbf
FB
2743 return -1;
2744
a594cfbf
FB
2745 if (bus_num != 0)
2746 return -1;
0d92ed30
PB
2747
2748 lastp = &used_usb_ports;
2749 port = used_usb_ports;
2750 while (port && port->dev->addr != addr) {
2751 lastp = &port->next;
2752 port = port->next;
a594cfbf 2753 }
0d92ed30
PB
2754
2755 if (!port)
a594cfbf 2756 return -1;
0d92ed30 2757
059809e4 2758 dev = port->dev;
0d92ed30
PB
2759 *lastp = port->next;
2760 usb_attach(port, NULL);
059809e4 2761 dev->handle_destroy(dev);
0d92ed30
PB
2762 port->next = free_usb_ports;
2763 free_usb_ports = port;
a594cfbf
FB
2764 return 0;
2765}
2766
1f3870ab
AL
2767static int usb_device_del(const char *devname)
2768{
2769 int bus_num, addr;
2770 const char *p;
2771
5d0c5750
AL
2772 if (strstart(devname, "host:", &p))
2773 return usb_host_device_close(p);
2774
1f3870ab
AL
2775 if (!used_usb_ports)
2776 return -1;
2777
2778 p = strchr(devname, '.');
2779 if (!p)
2780 return -1;
2781 bus_num = strtoul(devname, NULL, 0);
2782 addr = strtoul(p + 1, NULL, 0);
2783
2784 return usb_device_del_addr(bus_num, addr);
2785}
2786
376253ec 2787void do_usb_add(Monitor *mon, const char *devname)
a594cfbf 2788{
c0f4ce77 2789 usb_device_add(devname, 1);
a594cfbf
FB
2790}
2791
376253ec 2792void do_usb_del(Monitor *mon, const char *devname)
a594cfbf 2793{
4b096fc9 2794 usb_device_del(devname);
a594cfbf
FB
2795}
2796
376253ec 2797void usb_info(Monitor *mon)
a594cfbf
FB
2798{
2799 USBDevice *dev;
0d92ed30 2800 USBPort *port;
a594cfbf
FB
2801 const char *speed_str;
2802
0d92ed30 2803 if (!usb_enabled) {
376253ec 2804 monitor_printf(mon, "USB support not enabled\n");
a594cfbf
FB
2805 return;
2806 }
2807
0d92ed30
PB
2808 for (port = used_usb_ports; port; port = port->next) {
2809 dev = port->dev;
2810 if (!dev)
2811 continue;
2812 switch(dev->speed) {
5fafdf24
TS
2813 case USB_SPEED_LOW:
2814 speed_str = "1.5";
0d92ed30 2815 break;
5fafdf24
TS
2816 case USB_SPEED_FULL:
2817 speed_str = "12";
0d92ed30 2818 break;
5fafdf24
TS
2819 case USB_SPEED_HIGH:
2820 speed_str = "480";
0d92ed30
PB
2821 break;
2822 default:
5fafdf24 2823 speed_str = "?";
0d92ed30 2824 break;
a594cfbf 2825 }
376253ec
AL
2826 monitor_printf(mon, " Device %d.%d, Speed %s Mb/s, Product %s\n",
2827 0, dev->addr, speed_str, dev->devname);
a594cfbf
FB
2828 }
2829}
2830
201a51fc
AZ
2831/***********************************************************/
2832/* PCMCIA/Cardbus */
2833
2834static struct pcmcia_socket_entry_s {
2835 struct pcmcia_socket_s *socket;
2836 struct pcmcia_socket_entry_s *next;
2837} *pcmcia_sockets = 0;
2838
2839void pcmcia_socket_register(struct pcmcia_socket_s *socket)
2840{
2841 struct pcmcia_socket_entry_s *entry;
2842
2843 entry = qemu_malloc(sizeof(struct pcmcia_socket_entry_s));
2844 entry->socket = socket;
2845 entry->next = pcmcia_sockets;
2846 pcmcia_sockets = entry;
2847}
2848
2849void pcmcia_socket_unregister(struct pcmcia_socket_s *socket)
2850{
2851 struct pcmcia_socket_entry_s *entry, **ptr;
2852
2853 ptr = &pcmcia_sockets;
2854 for (entry = *ptr; entry; ptr = &entry->next, entry = *ptr)
2855 if (entry->socket == socket) {
2856 *ptr = entry->next;
2857 qemu_free(entry);
2858 }
2859}
2860
376253ec 2861void pcmcia_info(Monitor *mon)
201a51fc
AZ
2862{
2863 struct pcmcia_socket_entry_s *iter;
376253ec 2864
201a51fc 2865 if (!pcmcia_sockets)
376253ec 2866 monitor_printf(mon, "No PCMCIA sockets\n");
201a51fc
AZ
2867
2868 for (iter = pcmcia_sockets; iter; iter = iter->next)
376253ec
AL
2869 monitor_printf(mon, "%s: %s\n", iter->socket->slot_string,
2870 iter->socket->attached ? iter->socket->card_string :
2871 "Empty");
201a51fc
AZ
2872}
2873
2ff89790 2874/***********************************************************/
3023f332
AL
2875/* register display */
2876
7b5d76da
AL
2877struct DisplayAllocator default_allocator = {
2878 defaultallocator_create_displaysurface,
2879 defaultallocator_resize_displaysurface,
2880 defaultallocator_free_displaysurface
2881};
2882
3023f332
AL
2883void register_displaystate(DisplayState *ds)
2884{
2885 DisplayState **s;
2886 s = &display_state;
2887 while (*s != NULL)
2888 s = &(*s)->next;
2889 ds->next = NULL;
2890 *s = ds;
2891}
2892
2893DisplayState *get_displaystate(void)
2894{
2895 return display_state;
2896}
2897
7b5d76da
AL
2898DisplayAllocator *register_displayallocator(DisplayState *ds, DisplayAllocator *da)
2899{
2900 if(ds->allocator == &default_allocator) ds->allocator = da;
2901 return ds->allocator;
2902}
2903
2ff89790
TS
2904/* dumb display */
2905
8f391ab4 2906static void dumb_display_init(void)
2ff89790 2907{
8f391ab4 2908 DisplayState *ds = qemu_mallocz(sizeof(DisplayState));
7b5d76da
AL
2909 ds->allocator = &default_allocator;
2910 ds->surface = qemu_create_displaysurface(ds, 640, 480);
8f391ab4 2911 register_displaystate(ds);
2ff89790
TS
2912}
2913
8a7ddc38
FB
2914/***********************************************************/
2915/* I/O handling */
0824d6fc 2916
c4b1fcc0
FB
2917typedef struct IOHandlerRecord {
2918 int fd;
7c9d8e07
FB
2919 IOCanRWHandler *fd_read_poll;
2920 IOHandler *fd_read;
2921 IOHandler *fd_write;
cafffd40 2922 int deleted;
c4b1fcc0
FB
2923 void *opaque;
2924 /* temporary data */
2925 struct pollfd *ufd;
8a7ddc38 2926 struct IOHandlerRecord *next;
c4b1fcc0
FB
2927} IOHandlerRecord;
2928
8a7ddc38 2929static IOHandlerRecord *first_io_handler;
c4b1fcc0 2930
7c9d8e07
FB
2931/* XXX: fd_read_poll should be suppressed, but an API change is
2932 necessary in the character devices to suppress fd_can_read(). */
5fafdf24
TS
2933int qemu_set_fd_handler2(int fd,
2934 IOCanRWHandler *fd_read_poll,
2935 IOHandler *fd_read,
2936 IOHandler *fd_write,
7c9d8e07 2937 void *opaque)
c4b1fcc0 2938{
7c9d8e07 2939 IOHandlerRecord **pioh, *ioh;
c4b1fcc0 2940
7c9d8e07
FB
2941 if (!fd_read && !fd_write) {
2942 pioh = &first_io_handler;
2943 for(;;) {
2944 ioh = *pioh;
2945 if (ioh == NULL)
2946 break;
2947 if (ioh->fd == fd) {
cafffd40 2948 ioh->deleted = 1;
7c9d8e07
FB
2949 break;
2950 }
2951 pioh = &ioh->next;
2952 }
2953 } else {
2954 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
2955 if (ioh->fd == fd)
2956 goto found;
2957 }
2958 ioh = qemu_mallocz(sizeof(IOHandlerRecord));
7c9d8e07
FB
2959 ioh->next = first_io_handler;
2960 first_io_handler = ioh;
2961 found:
2962 ioh->fd = fd;
2963 ioh->fd_read_poll = fd_read_poll;
2964 ioh->fd_read = fd_read;
2965 ioh->fd_write = fd_write;
2966 ioh->opaque = opaque;
cafffd40 2967 ioh->deleted = 0;
7c9d8e07 2968 }
c4b1fcc0
FB
2969 return 0;
2970}
2971
5fafdf24
TS
2972int qemu_set_fd_handler(int fd,
2973 IOHandler *fd_read,
2974 IOHandler *fd_write,
7c9d8e07 2975 void *opaque)
8a7ddc38 2976{
7c9d8e07 2977 return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
8a7ddc38
FB
2978}
2979
56f3a5d0 2980#ifdef _WIN32
f331110f
FB
2981/***********************************************************/
2982/* Polling handling */
2983
2984typedef struct PollingEntry {
2985 PollingFunc *func;
2986 void *opaque;
2987 struct PollingEntry *next;
2988} PollingEntry;
2989
2990static PollingEntry *first_polling_entry;
2991
2992int qemu_add_polling_cb(PollingFunc *func, void *opaque)
2993{
2994 PollingEntry **ppe, *pe;
2995 pe = qemu_mallocz(sizeof(PollingEntry));
f331110f
FB
2996 pe->func = func;
2997 pe->opaque = opaque;
2998 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
2999 *ppe = pe;
3000 return 0;
3001}
3002
3003void qemu_del_polling_cb(PollingFunc *func, void *opaque)
3004{
3005 PollingEntry **ppe, *pe;
3006 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
3007 pe = *ppe;
3008 if (pe->func == func && pe->opaque == opaque) {
3009 *ppe = pe->next;
3010 qemu_free(pe);
3011 break;
3012 }
3013 }
3014}
3015
a18e524a
FB
3016/***********************************************************/
3017/* Wait objects support */
3018typedef struct WaitObjects {
3019 int num;
3020 HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
3021 WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
3022 void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
3023} WaitObjects;
3024
3025static WaitObjects wait_objects = {0};
3b46e624 3026
a18e524a
FB
3027int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
3028{
3029 WaitObjects *w = &wait_objects;
3030
3031 if (w->num >= MAXIMUM_WAIT_OBJECTS)
3032 return -1;
3033 w->events[w->num] = handle;
3034 w->func[w->num] = func;
3035 w->opaque[w->num] = opaque;
3036 w->num++;
3037 return 0;
3038}
3039
3040void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
3041{
3042 int i, found;
3043 WaitObjects *w = &wait_objects;
3044
3045 found = 0;
3046 for (i = 0; i < w->num; i++) {
3047 if (w->events[i] == handle)
3048 found = 1;
3049 if (found) {
3050 w->events[i] = w->events[i + 1];
3051 w->func[i] = w->func[i + 1];
3052 w->opaque[i] = w->opaque[i + 1];
3b46e624 3053 }
a18e524a
FB
3054 }
3055 if (found)
3056 w->num--;
3057}
3058#endif
3059
8a7ddc38
FB
3060/***********************************************************/
3061/* ram save/restore */
3062
8a7ddc38
FB
3063static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
3064{
3065 int v;
3066
3067 v = qemu_get_byte(f);
3068 switch(v) {
3069 case 0:
3070 if (qemu_get_buffer(f, buf, len) != len)
3071 return -EIO;
3072 break;
3073 case 1:
3074 v = qemu_get_byte(f);
3075 memset(buf, v, len);
3076 break;
3077 default:
3078 return -EINVAL;
3079 }
871d2f07
AL
3080
3081 if (qemu_file_has_error(f))
3082 return -EIO;
3083
8a7ddc38
FB
3084 return 0;
3085}
3086
c88676f8
FB
3087static int ram_load_v1(QEMUFile *f, void *opaque)
3088{
00f82b8a
AJ
3089 int ret;
3090 ram_addr_t i;
c88676f8
FB
3091
3092 if (qemu_get_be32(f) != phys_ram_size)
3093 return -EINVAL;
3094 for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
3095 ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
3096 if (ret)
3097 return ret;
3098 }
3099 return 0;
3100}
3101
3102#define BDRV_HASH_BLOCK_SIZE 1024
3103#define IOBUF_SIZE 4096
3104#define RAM_CBLOCK_MAGIC 0xfabe
3105
c88676f8
FB
3106typedef struct RamDecompressState {
3107 z_stream zstream;
3108 QEMUFile *f;
3109 uint8_t buf[IOBUF_SIZE];
3110} RamDecompressState;
3111
3112static int ram_decompress_open(RamDecompressState *s, QEMUFile *f)
3113{
3114 int ret;
3115 memset(s, 0, sizeof(*s));
3116 s->f = f;
3117 ret = inflateInit(&s->zstream);
3118 if (ret != Z_OK)
3119 return -1;
3120 return 0;
3121}
3122
3123static int ram_decompress_buf(RamDecompressState *s, uint8_t *buf, int len)
3124{
3125 int ret, clen;
3126
3127 s->zstream.avail_out = len;
3128 s->zstream.next_out = buf;
3129 while (s->zstream.avail_out > 0) {
3130 if (s->zstream.avail_in == 0) {
3131 if (qemu_get_be16(s->f) != RAM_CBLOCK_MAGIC)
3132 return -1;
3133 clen = qemu_get_be16(s->f);
3134 if (clen > IOBUF_SIZE)
3135 return -1;
3136 qemu_get_buffer(s->f, s->buf, clen);
3137 s->zstream.avail_in = clen;
3138 s->zstream.next_in = s->buf;
3139 }
3140 ret = inflate(&s->zstream, Z_PARTIAL_FLUSH);
3141 if (ret != Z_OK && ret != Z_STREAM_END) {
3142 return -1;
3143 }
3144 }
3145 return 0;
3146}
3147
3148static void ram_decompress_close(RamDecompressState *s)
3149{
3150 inflateEnd(&s->zstream);
3151}
3152
475e4277
AL
3153#define RAM_SAVE_FLAG_FULL 0x01
3154#define RAM_SAVE_FLAG_COMPRESS 0x02
3155#define RAM_SAVE_FLAG_MEM_SIZE 0x04
3156#define RAM_SAVE_FLAG_PAGE 0x08
3157#define RAM_SAVE_FLAG_EOS 0x10
3158
3159static int is_dup_page(uint8_t *page, uint8_t ch)
8a7ddc38 3160{
475e4277
AL
3161 uint32_t val = ch << 24 | ch << 16 | ch << 8 | ch;
3162 uint32_t *array = (uint32_t *)page;
3163 int i;
3b46e624 3164
475e4277
AL
3165 for (i = 0; i < (TARGET_PAGE_SIZE / 4); i++) {
3166 if (array[i] != val)
3167 return 0;
3168 }
3169
3170 return 1;
3171}
3172
3173static int ram_save_block(QEMUFile *f)
3174{
3175 static ram_addr_t current_addr = 0;
3176 ram_addr_t saved_addr = current_addr;
3177 ram_addr_t addr = 0;
3178 int found = 0;
3179
3180 while (addr < phys_ram_size) {
3181 if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) {
3182 uint8_t ch;
3183
3184 cpu_physical_memory_reset_dirty(current_addr,
3185 current_addr + TARGET_PAGE_SIZE,
3186 MIGRATION_DIRTY_FLAG);
3187
3188 ch = *(phys_ram_base + current_addr);
3189
3190 if (is_dup_page(phys_ram_base + current_addr, ch)) {
3191 qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_COMPRESS);
3192 qemu_put_byte(f, ch);
3193 } else {
3194 qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_PAGE);
3195 qemu_put_buffer(f, phys_ram_base + current_addr, TARGET_PAGE_SIZE);
c88676f8 3196 }
475e4277
AL
3197
3198 found = 1;
3199 break;
c88676f8 3200 }
475e4277
AL
3201 addr += TARGET_PAGE_SIZE;
3202 current_addr = (saved_addr + addr) % phys_ram_size;
8a7ddc38 3203 }
475e4277
AL
3204
3205 return found;
8a7ddc38
FB
3206}
3207
475e4277
AL
3208static ram_addr_t ram_save_threshold = 10;
3209
3210static ram_addr_t ram_save_remaining(void)
3211{
3212 ram_addr_t addr;
3213 ram_addr_t count = 0;
3214
3215 for (addr = 0; addr < phys_ram_size; addr += TARGET_PAGE_SIZE) {
3216 if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
3217 count++;
3218 }
3219
3220 return count;
3221}
3222
3223static int ram_save_live(QEMUFile *f, int stage, void *opaque)
3224{
3225 ram_addr_t addr;
3226
3227 if (stage == 1) {
3228 /* Make sure all dirty bits are set */
3229 for (addr = 0; addr < phys_ram_size; addr += TARGET_PAGE_SIZE) {
3230 if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
3231 cpu_physical_memory_set_dirty(addr);
3232 }
3233
3234 /* Enable dirty memory tracking */
3235 cpu_physical_memory_set_dirty_tracking(1);
3236
3237 qemu_put_be64(f, phys_ram_size | RAM_SAVE_FLAG_MEM_SIZE);
3238 }
3239
3240 while (!qemu_file_rate_limit(f)) {
3241 int ret;
3242
3243 ret = ram_save_block(f);
3244 if (ret == 0) /* no more blocks */
3245 break;
3246 }
3247
3248 /* try transferring iterative blocks of memory */
3249
3250 if (stage == 3) {
3251 cpu_physical_memory_set_dirty_tracking(0);
3252
3253 /* flush all remaining blocks regardless of rate limiting */
3254 while (ram_save_block(f) != 0);
3255 }
3256
3257 qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
3258
3259 return (stage == 2) && (ram_save_remaining() < ram_save_threshold);
3260}
3261
3262static int ram_load_dead(QEMUFile *f, void *opaque)
8a7ddc38 3263{
c88676f8
FB
3264 RamDecompressState s1, *s = &s1;
3265 uint8_t buf[10];
00f82b8a 3266 ram_addr_t i;
8a7ddc38 3267
c88676f8
FB
3268 if (ram_decompress_open(s, f) < 0)
3269 return -EINVAL;
3270 for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
3271 if (ram_decompress_buf(s, buf, 1) < 0) {
3272 fprintf(stderr, "Error while reading ram block header\n");
3273 goto error;
3274 }
3275 if (buf[0] == 0) {
3276 if (ram_decompress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE) < 0) {
00f82b8a 3277 fprintf(stderr, "Error while reading ram block address=0x%08" PRIx64, (uint64_t)i);
c88676f8
FB
3278 goto error;
3279 }
475e4277 3280 } else {
c88676f8
FB
3281 error:
3282 printf("Error block header\n");
3283 return -EINVAL;
3284 }
8a7ddc38 3285 }
c88676f8 3286 ram_decompress_close(s);
475e4277
AL
3287
3288 return 0;
3289}
3290
3291static int ram_load(QEMUFile *f, void *opaque, int version_id)
3292{
3293 ram_addr_t addr;
3294 int flags;
3295
3296 if (version_id == 1)
3297 return ram_load_v1(f, opaque);
3298
3299 if (version_id == 2) {
3300 if (qemu_get_be32(f) != phys_ram_size)
3301 return -EINVAL;
3302 return ram_load_dead(f, opaque);
3303 }
3304
3305 if (version_id != 3)
3306 return -EINVAL;
3307
3308 do {
3309 addr = qemu_get_be64(f);
3310
3311 flags = addr & ~TARGET_PAGE_MASK;
3312 addr &= TARGET_PAGE_MASK;
3313
3314 if (flags & RAM_SAVE_FLAG_MEM_SIZE) {
3315 if (addr != phys_ram_size)
3316 return -EINVAL;
3317 }
3318
3319 if (flags & RAM_SAVE_FLAG_FULL) {
3320 if (ram_load_dead(f, opaque) < 0)
3321 return -EINVAL;
3322 }
3323
3324 if (flags & RAM_SAVE_FLAG_COMPRESS) {
3325 uint8_t ch = qemu_get_byte(f);
3326 memset(phys_ram_base + addr, ch, TARGET_PAGE_SIZE);
3327 } else if (flags & RAM_SAVE_FLAG_PAGE)
3328 qemu_get_buffer(f, phys_ram_base + addr, TARGET_PAGE_SIZE);
3329 } while (!(flags & RAM_SAVE_FLAG_EOS));
3330
8a7ddc38
FB
3331 return 0;
3332}
3333
9e472e10
AL
3334void qemu_service_io(void)
3335{
3336 CPUState *env = cpu_single_env;
3337 if (env) {
3098dba0 3338 cpu_exit(env);
9e472e10
AL
3339#ifdef USE_KQEMU
3340 if (env->kqemu_enabled) {
3341 kqemu_cpu_interrupt(env);
3342 }
3343#endif
3344 }
3345}
3346
83f64091
FB
3347/***********************************************************/
3348/* bottom halves (can be seen as timers which expire ASAP) */
3349
3350struct QEMUBH {
3351 QEMUBHFunc *cb;
3352 void *opaque;
3353 int scheduled;
1b435b10
AL
3354 int idle;
3355 int deleted;
83f64091
FB
3356 QEMUBH *next;
3357};
3358
3359static QEMUBH *first_bh = NULL;
3360
3361QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
3362{
3363 QEMUBH *bh;
3364 bh = qemu_mallocz(sizeof(QEMUBH));
83f64091
FB
3365 bh->cb = cb;
3366 bh->opaque = opaque;
1b435b10
AL
3367 bh->next = first_bh;
3368 first_bh = bh;
83f64091
FB
3369 return bh;
3370}
3371
6eb5733a 3372int qemu_bh_poll(void)
83f64091 3373{
1b435b10 3374 QEMUBH *bh, **bhp;
6eb5733a 3375 int ret;
83f64091 3376
6eb5733a 3377 ret = 0;
1b435b10
AL
3378 for (bh = first_bh; bh; bh = bh->next) {
3379 if (!bh->deleted && bh->scheduled) {
3380 bh->scheduled = 0;
3381 if (!bh->idle)
3382 ret = 1;
3383 bh->idle = 0;
3384 bh->cb(bh->opaque);
3385 }
83f64091 3386 }
1b435b10
AL
3387
3388 /* remove deleted bhs */
3389 bhp = &first_bh;
3390 while (*bhp) {
3391 bh = *bhp;
3392 if (bh->deleted) {
3393 *bhp = bh->next;
3394 qemu_free(bh);
3395 } else
3396 bhp = &bh->next;
3397 }
3398
6eb5733a 3399 return ret;
83f64091
FB
3400}
3401
1b435b10
AL
3402void qemu_bh_schedule_idle(QEMUBH *bh)
3403{
3404 if (bh->scheduled)
3405 return;
3406 bh->scheduled = 1;
3407 bh->idle = 1;
3408}
3409
83f64091
FB
3410void qemu_bh_schedule(QEMUBH *bh)
3411{
3412 CPUState *env = cpu_single_env;
3413 if (bh->scheduled)
3414 return;
3415 bh->scheduled = 1;
1b435b10 3416 bh->idle = 0;
83f64091
FB
3417 /* stop the currently executing CPU to execute the BH ASAP */
3418 if (env) {
3098dba0 3419 cpu_exit(env);
83f64091
FB
3420 }
3421}
3422
3423void qemu_bh_cancel(QEMUBH *bh)
3424{
1b435b10 3425 bh->scheduled = 0;
83f64091
FB
3426}
3427
3428void qemu_bh_delete(QEMUBH *bh)
3429{
1b435b10
AL
3430 bh->scheduled = 0;
3431 bh->deleted = 1;
83f64091
FB
3432}
3433
56f3a5d0
AL
3434static void qemu_bh_update_timeout(int *timeout)
3435{
3436 QEMUBH *bh;
3437
3438 for (bh = first_bh; bh; bh = bh->next) {
3439 if (!bh->deleted && bh->scheduled) {
3440 if (bh->idle) {
3441 /* idle bottom halves will be polled at least
3442 * every 10ms */
3443 *timeout = MIN(10, *timeout);
3444 } else {
3445 /* non-idle bottom halves will be executed
3446 * immediately */
3447 *timeout = 0;
3448 break;
3449 }
3450 }
3451 }
3452}
3453
cc1daa40
FB
3454/***********************************************************/
3455/* machine registration */
3456
bdaf78e0 3457static QEMUMachine *first_machine = NULL;
6f338c34 3458QEMUMachine *current_machine = NULL;
cc1daa40
FB
3459
3460int qemu_register_machine(QEMUMachine *m)
3461{
3462 QEMUMachine **pm;
3463 pm = &first_machine;
3464 while (*pm != NULL)
3465 pm = &(*pm)->next;
3466 m->next = NULL;
3467 *pm = m;
3468 return 0;
3469}
3470
9596ebb7 3471static QEMUMachine *find_machine(const char *name)
cc1daa40
FB
3472{
3473 QEMUMachine *m;
3474
3475 for(m = first_machine; m != NULL; m = m->next) {
3476 if (!strcmp(m->name, name))
3477 return m;
3478 }
3479 return NULL;
3480}
3481
8a7ddc38
FB
3482/***********************************************************/
3483/* main execution loop */
3484
9596ebb7 3485static void gui_update(void *opaque)
8a7ddc38 3486{
7d957bd8 3487 uint64_t interval = GUI_REFRESH_INTERVAL;
740733bb 3488 DisplayState *ds = opaque;
7d957bd8
AL
3489 DisplayChangeListener *dcl = ds->listeners;
3490
3491 dpy_refresh(ds);
3492
3493 while (dcl != NULL) {
3494 if (dcl->gui_timer_interval &&
3495 dcl->gui_timer_interval < interval)
3496 interval = dcl->gui_timer_interval;
3497 dcl = dcl->next;
3498 }
3499 qemu_mod_timer(ds->gui_timer, interval + qemu_get_clock(rt_clock));
8a7ddc38
FB
3500}
3501
9043b62d
BS
3502static void nographic_update(void *opaque)
3503{
3504 uint64_t interval = GUI_REFRESH_INTERVAL;
3505
3506 qemu_mod_timer(nographic_timer, interval + qemu_get_clock(rt_clock));
3507}
3508
0bd48850
FB
3509struct vm_change_state_entry {
3510 VMChangeStateHandler *cb;
3511 void *opaque;
3512 LIST_ENTRY (vm_change_state_entry) entries;
3513};
3514
3515static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
3516
3517VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
3518 void *opaque)
3519{
3520 VMChangeStateEntry *e;
3521
3522 e = qemu_mallocz(sizeof (*e));
0bd48850
FB
3523
3524 e->cb = cb;
3525 e->opaque = opaque;
3526 LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
3527 return e;
3528}
3529
3530void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
3531{
3532 LIST_REMOVE (e, entries);
3533 qemu_free (e);
3534}
3535
9781e040 3536static void vm_state_notify(int running, int reason)
0bd48850
FB
3537{
3538 VMChangeStateEntry *e;
3539
3540 for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
9781e040 3541 e->cb(e->opaque, running, reason);
0bd48850
FB
3542 }
3543}
3544
8a7ddc38
FB
3545void vm_start(void)
3546{
3547 if (!vm_running) {
3548 cpu_enable_ticks();
3549 vm_running = 1;
9781e040 3550 vm_state_notify(1, 0);
efe75411 3551 qemu_rearm_alarm_timer(alarm_timer);
8a7ddc38
FB
3552 }
3553}
3554
5fafdf24 3555void vm_stop(int reason)
8a7ddc38
FB
3556{
3557 if (vm_running) {
3558 cpu_disable_ticks();
3559 vm_running = 0;
9781e040 3560 vm_state_notify(0, reason);
8a7ddc38
FB
3561 }
3562}
3563
bb0c6722
FB
3564/* reset/shutdown handler */
3565
3566typedef struct QEMUResetEntry {
3567 QEMUResetHandler *func;
3568 void *opaque;
3569 struct QEMUResetEntry *next;
3570} QEMUResetEntry;
3571
3572static QEMUResetEntry *first_reset_entry;
3573static int reset_requested;
3574static int shutdown_requested;
3475187d 3575static int powerdown_requested;
bb0c6722 3576
cf7a2fe2
AJ
3577int qemu_shutdown_requested(void)
3578{
3579 int r = shutdown_requested;
3580 shutdown_requested = 0;
3581 return r;
3582}
3583
3584int qemu_reset_requested(void)
3585{
3586 int r = reset_requested;
3587 reset_requested = 0;
3588 return r;
3589}
3590
3591int qemu_powerdown_requested(void)
3592{
3593 int r = powerdown_requested;
3594 powerdown_requested = 0;
3595 return r;
3596}
3597
bb0c6722
FB
3598void qemu_register_reset(QEMUResetHandler *func, void *opaque)
3599{
3600 QEMUResetEntry **pre, *re;
3601
3602 pre = &first_reset_entry;
3603 while (*pre != NULL)
3604 pre = &(*pre)->next;
3605 re = qemu_mallocz(sizeof(QEMUResetEntry));
3606 re->func = func;
3607 re->opaque = opaque;
3608 re->next = NULL;
3609 *pre = re;
3610}
3611
cf7a2fe2 3612void qemu_system_reset(void)
bb0c6722
FB
3613{
3614 QEMUResetEntry *re;
3615
3616 /* reset all devices */
3617 for(re = first_reset_entry; re != NULL; re = re->next) {
3618 re->func(re->opaque);
3619 }
3620}
3621
3622void qemu_system_reset_request(void)
3623{
d1beab82
FB
3624 if (no_reboot) {
3625 shutdown_requested = 1;
3626 } else {
3627 reset_requested = 1;
3628 }
6a00d601 3629 if (cpu_single_env)
3098dba0 3630 cpu_exit(cpu_single_env);
bb0c6722
FB
3631}
3632
3633void qemu_system_shutdown_request(void)
3634{
3635 shutdown_requested = 1;
6a00d601 3636 if (cpu_single_env)
3098dba0 3637 cpu_exit(cpu_single_env);
bb0c6722
FB
3638}
3639
3475187d
FB
3640void qemu_system_powerdown_request(void)
3641{
3642 powerdown_requested = 1;
6a00d601 3643 if (cpu_single_env)
3098dba0 3644 cpu_exit(cpu_single_env);
bb0c6722
FB
3645}
3646
877cf882 3647#ifdef _WIN32
69d6451c 3648static void host_main_loop_wait(int *timeout)
56f3a5d0
AL
3649{
3650 int ret, ret2, i;
f331110f
FB
3651 PollingEntry *pe;
3652
c4b1fcc0 3653
f331110f
FB
3654 /* XXX: need to suppress polling by better using win32 events */
3655 ret = 0;
3656 for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
3657 ret |= pe->func(pe->opaque);
3658 }
e6b1e558 3659 if (ret == 0) {
a18e524a
FB
3660 int err;
3661 WaitObjects *w = &wait_objects;
3b46e624 3662
56f3a5d0 3663 ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout);
a18e524a
FB
3664 if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
3665 if (w->func[ret - WAIT_OBJECT_0])
3666 w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
3b46e624 3667
5fafdf24 3668 /* Check for additional signaled events */
e6b1e558 3669 for(i = (ret - WAIT_OBJECT_0 + 1); i < w->num; i++) {
3b46e624 3670
e6b1e558
TS
3671 /* Check if event is signaled */
3672 ret2 = WaitForSingleObject(w->events[i], 0);
3673 if(ret2 == WAIT_OBJECT_0) {
3674 if (w->func[i])
3675 w->func[i](w->opaque[i]);
3676 } else if (ret2 == WAIT_TIMEOUT) {
3677 } else {
3678 err = GetLastError();
3679 fprintf(stderr, "WaitForSingleObject error %d %d\n", i, err);
3b46e624
TS
3680 }
3681 }
a18e524a
FB
3682 } else if (ret == WAIT_TIMEOUT) {
3683 } else {
3684 err = GetLastError();
e6b1e558 3685 fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
a18e524a 3686 }
f331110f 3687 }
56f3a5d0
AL
3688
3689 *timeout = 0;
3690}
3691#else
69d6451c 3692static void host_main_loop_wait(int *timeout)
56f3a5d0
AL
3693{
3694}
fd1dff4b 3695#endif
56f3a5d0
AL
3696
3697void main_loop_wait(int timeout)
3698{
3699 IOHandlerRecord *ioh;
3700 fd_set rfds, wfds, xfds;
3701 int ret, nfds;
3702 struct timeval tv;
3703
3704 qemu_bh_update_timeout(&timeout);
3705
3706 host_main_loop_wait(&timeout);
3707
fd1dff4b
FB
3708 /* poll any events */
3709 /* XXX: separate device handlers from system ones */
6abfbd79 3710 nfds = -1;
fd1dff4b
FB
3711 FD_ZERO(&rfds);
3712 FD_ZERO(&wfds);
e035649e 3713 FD_ZERO(&xfds);
fd1dff4b 3714 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
cafffd40
TS
3715 if (ioh->deleted)
3716 continue;
fd1dff4b
FB
3717 if (ioh->fd_read &&
3718 (!ioh->fd_read_poll ||
3719 ioh->fd_read_poll(ioh->opaque) != 0)) {
3720 FD_SET(ioh->fd, &rfds);
3721 if (ioh->fd > nfds)
3722 nfds = ioh->fd;
3723 }
3724 if (ioh->fd_write) {
3725 FD_SET(ioh->fd, &wfds);
3726 if (ioh->fd > nfds)
3727 nfds = ioh->fd;
3728 }
3729 }
3b46e624 3730
56f3a5d0
AL
3731 tv.tv_sec = timeout / 1000;
3732 tv.tv_usec = (timeout % 1000) * 1000;
3733
e035649e 3734#if defined(CONFIG_SLIRP)
63a01ef8 3735 if (slirp_is_inited()) {
e035649e
FB
3736 slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
3737 }
3738#endif
3739 ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
fd1dff4b 3740 if (ret > 0) {
cafffd40
TS
3741 IOHandlerRecord **pioh;
3742
3743 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
6ab43fdc 3744 if (!ioh->deleted && ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) {
fd1dff4b 3745 ioh->fd_read(ioh->opaque);
7c9d8e07 3746 }
6ab43fdc 3747 if (!ioh->deleted && ioh->fd_write && FD_ISSET(ioh->fd, &wfds)) {
fd1dff4b 3748 ioh->fd_write(ioh->opaque);
c4b1fcc0 3749 }
b4608c04 3750 }
cafffd40
TS
3751
3752 /* remove deleted IO handlers */
3753 pioh = &first_io_handler;
3754 while (*pioh) {
3755 ioh = *pioh;
3756 if (ioh->deleted) {
3757 *pioh = ioh->next;
3758 qemu_free(ioh);
5fafdf24 3759 } else
cafffd40
TS
3760 pioh = &ioh->next;
3761 }
fd1dff4b 3762 }
c20709aa 3763#if defined(CONFIG_SLIRP)
63a01ef8 3764 if (slirp_is_inited()) {
e035649e
FB
3765 if (ret < 0) {
3766 FD_ZERO(&rfds);
3767 FD_ZERO(&wfds);
3768 FD_ZERO(&xfds);
c20709aa 3769 }
e035649e 3770 slirp_select_poll(&rfds, &wfds, &xfds);
fd1dff4b 3771 }
e035649e 3772#endif
b4608c04 3773
357c692c
AL
3774 /* vm time timers */
3775 if (vm_running && likely(!(cur_cpu->singlestep_enabled & SSTEP_NOTIMER)))
3776 qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
3777 qemu_get_clock(vm_clock));
3778
3779 /* real time timers */
3780 qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
3781 qemu_get_clock(rt_clock));
3782
423f0742
PB
3783 /* Check bottom-halves last in case any of the earlier events triggered
3784 them. */
3785 qemu_bh_poll();
3b46e624 3786
5905b2e5
FB
3787}
3788
9596ebb7 3789static int main_loop(void)
5905b2e5
FB
3790{
3791 int ret, timeout;
89bfc105
FB
3792#ifdef CONFIG_PROFILER
3793 int64_t ti;
3794#endif
6a00d601 3795 CPUState *env;
5905b2e5 3796
6a00d601 3797 cur_cpu = first_cpu;
ee5605e5 3798 next_cpu = cur_cpu->next_cpu ?: first_cpu;
5905b2e5
FB
3799 for(;;) {
3800 if (vm_running) {
15a76449 3801
15a76449
FB
3802 for(;;) {
3803 /* get next cpu */
ee5605e5 3804 env = next_cpu;
89bfc105
FB
3805#ifdef CONFIG_PROFILER
3806 ti = profile_getclock();
3807#endif
2e70f6ef
PB
3808 if (use_icount) {
3809 int64_t count;
3810 int decr;
3811 qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
3812 env->icount_decr.u16.low = 0;
3813 env->icount_extra = 0;
3814 count = qemu_next_deadline();
3815 count = (count + (1 << icount_time_shift) - 1)
3816 >> icount_time_shift;
3817 qemu_icount += count;
3818 decr = (count > 0xffff) ? 0xffff : count;
3819 count -= decr;
3820 env->icount_decr.u16.low = decr;
3821 env->icount_extra = count;
3822 }
6a00d601 3823 ret = cpu_exec(env);
89bfc105
FB
3824#ifdef CONFIG_PROFILER
3825 qemu_time += profile_getclock() - ti;
3826#endif
2e70f6ef
PB
3827 if (use_icount) {
3828 /* Fold pending instructions back into the
3829 instruction counter, and clear the interrupt flag. */
3830 qemu_icount -= (env->icount_decr.u16.low
3831 + env->icount_extra);
3832 env->icount_decr.u32 = 0;
3833 env->icount_extra = 0;
3834 }
ee5605e5 3835 next_cpu = env->next_cpu ?: first_cpu;
95b01009 3836 if (event_pending && likely(ret != EXCP_DEBUG)) {
ee5605e5
AZ
3837 ret = EXCP_INTERRUPT;
3838 event_pending = 0;
3839 break;
3840 }
bd967e05
PB
3841 if (ret == EXCP_HLT) {
3842 /* Give the next CPU a chance to run. */
3843 cur_cpu = env;
3844 continue;
3845 }
15a76449
FB
3846 if (ret != EXCP_HALTED)
3847 break;
3848 /* all CPUs are halted ? */
bd967e05 3849 if (env == cur_cpu)
15a76449 3850 break;
15a76449
FB
3851 }
3852 cur_cpu = env;
3853
5905b2e5 3854 if (shutdown_requested) {
3475187d 3855 ret = EXCP_INTERRUPT;
b2f76161
AJ
3856 if (no_shutdown) {
3857 vm_stop(0);
3858 no_shutdown = 0;
3859 }
3860 else
3861 break;
5905b2e5
FB
3862 }
3863 if (reset_requested) {
3864 reset_requested = 0;
3865 qemu_system_reset();
3475187d
FB
3866 ret = EXCP_INTERRUPT;
3867 }
3868 if (powerdown_requested) {
3869 powerdown_requested = 0;
3870 qemu_system_powerdown();
3871 ret = EXCP_INTERRUPT;
5905b2e5 3872 }
95b01009 3873 if (unlikely(ret == EXCP_DEBUG)) {
880a7578 3874 gdb_set_stop_cpu(cur_cpu);
5905b2e5
FB
3875 vm_stop(EXCP_DEBUG);
3876 }
bd967e05 3877 /* If all cpus are halted then wait until the next IRQ */
5905b2e5 3878 /* XXX: use timeout computed from timers */
2e70f6ef
PB
3879 if (ret == EXCP_HALTED) {
3880 if (use_icount) {
3881 int64_t add;
3882 int64_t delta;
3883 /* Advance virtual time to the next event. */
3884 if (use_icount == 1) {
3885 /* When not using an adaptive execution frequency
3886 we tend to get badly out of sync with real time,
bf20dc07 3887 so just delay for a reasonable amount of time. */
2e70f6ef
PB
3888 delta = 0;
3889 } else {
3890 delta = cpu_get_icount() - cpu_get_clock();
3891 }
3892 if (delta > 0) {
3893 /* If virtual time is ahead of real time then just
3894 wait for IO. */
3895 timeout = (delta / 1000000) + 1;
3896 } else {
3897 /* Wait for either IO to occur or the next
3898 timer event. */
3899 add = qemu_next_deadline();
3900 /* We advance the timer before checking for IO.
3901 Limit the amount we advance so that early IO
3902 activity won't get the guest too far ahead. */
3903 if (add > 10000000)
3904 add = 10000000;
3905 delta += add;
3906 add = (add + (1 << icount_time_shift) - 1)
3907 >> icount_time_shift;
3908 qemu_icount += add;
3909 timeout = delta / 1000000;
3910 if (timeout < 0)
3911 timeout = 0;
3912 }
3913 } else {
0a1af395 3914 timeout = 5000;
2e70f6ef
PB
3915 }
3916 } else {
5905b2e5 3917 timeout = 0;
2e70f6ef 3918 }
5905b2e5 3919 } else {
98448f58
BS
3920 if (shutdown_requested) {
3921 ret = EXCP_INTERRUPT;
5b08fc10 3922 break;
98448f58 3923 }
0a1af395 3924 timeout = 5000;
5905b2e5 3925 }
89bfc105
FB
3926#ifdef CONFIG_PROFILER
3927 ti = profile_getclock();
3928#endif
5905b2e5 3929 main_loop_wait(timeout);
89bfc105
FB
3930#ifdef CONFIG_PROFILER
3931 dev_time += profile_getclock() - ti;
3932#endif
b4608c04 3933 }
34865134
FB
3934 cpu_disable_ticks();
3935 return ret;
b4608c04
FB
3936}
3937
15f82208 3938static void help(int exitcode)
0824d6fc 3939{
d2c639d6
BS
3940 /* Please keep in synch with QEMU_OPTION_ enums, qemu_options[]
3941 and qemu-doc.texi */
68d0f70e 3942 printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n"
0db63474 3943 "usage: %s [options] [disk_image]\n"
0824d6fc 3944 "\n"
a20dd508 3945 "'disk_image' is a raw hard image image for IDE hard disk 0\n"
fc01f7e7 3946 "\n"
a20dd508 3947 "Standard options:\n"
d2c639d6 3948 "-h or -help display this help and exit\n"
cc1daa40 3949 "-M machine select emulated machine (-M ? for list)\n"
5adb4839 3950 "-cpu cpu select CPU (-cpu ? for list)\n"
d2c639d6 3951 "-smp n set the number of CPUs to 'n' [default=1]\n"
c45886db 3952 "-fda/-fdb file use 'file' as floppy disk 0/1 image\n"
36b486bb
FB
3953 "-hda/-hdb file use 'file' as IDE hard disk 0/1 image\n"
3954 "-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n"
c4b1fcc0 3955 "-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
a1620fac
AJ
3956 "-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n"
3957 " [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
fa879c64 3958 " [,cache=writethrough|writeback|none][,format=f][,serial=s]\n"
e4bcb14c 3959 " use 'file' as a drive image\n"
3e3d5815 3960 "-mtdblock file use 'file' as on-board Flash memory image\n"
a1bb27b1 3961 "-sd file use 'file' as SecureDigital card image\n"
86f55663 3962 "-pflash file use 'file' as a parallel flash image\n"
eec85c2a 3963 "-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n)\n"
667accab 3964 "-snapshot write to temporary files instead of disk image files\n"
a00bad7e 3965 "-m megs set virtual RAM size to megs MB [default=%d]\n"
4ca0074c 3966#ifndef _WIN32
667accab 3967 "-k language use keyboard layout (for example \"fr\" for French)\n"
4ca0074c 3968#endif
1d14ffa9 3969#ifdef HAS_AUDIO
1d14ffa9 3970 "-audio-help print list of audio drivers and their options\n"
c0fe3827
FB
3971 "-soundhw c1,... enable audio support\n"
3972 " and only specified sound cards (comma separated list)\n"
3973 " use -soundhw ? to get the list of supported cards\n"
6a36d84e 3974 " use -soundhw all to enable all of them\n"
1d14ffa9 3975#endif
d2c639d6
BS
3976 "-usb enable the USB driver (will be the default soon)\n"
3977 "-usbdevice name add the host or guest USB device 'name'\n"
3978 "-name string set the name of the guest\n"
3979 "-uuid %%08x-%%04x-%%04x-%%04x-%%012x\n"
3980 " specify machine UUID\n"
3981 "\n"
3982 "Display options:\n"
3983 "-nographic disable graphical output and redirect serial I/Os to console\n"
3984#ifdef CONFIG_CURSES
3985 "-curses use a curses/ncurses interface instead of SDL\n"
3986#endif
3987#ifdef CONFIG_SDL
3988 "-no-frame open SDL window without a frame and window decorations\n"
3989 "-alt-grab use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)\n"
3990 "-no-quit disable SDL window close capability\n"
3991 "-sdl enable SDL\n"
3992#endif
3993 "-portrait rotate graphical output 90 deg left (only PXA LCD)\n"
c2b3b41a 3994 "-vga [std|cirrus|vmware|none]\n"
3893c124 3995 " select video card type\n"
d63d307f 3996 "-full-screen start in full screen\n"
6f7e9aec
FB
3997#if defined(TARGET_PPC) || defined(TARGET_SPARC)
3998 "-g WxH[xDEPTH] Set the initial graphical resolution and depth\n"
bb0c6722 3999#endif
d2c639d6 4000 "-vnc display start a VNC server on display\n"
c4b1fcc0
FB
4001 "\n"
4002 "Network options:\n"
7a9f6e4a 4003 "-net nic[,vlan=n][,macaddr=addr][,model=type][,name=str]\n"
7c9d8e07 4004 " create a new Network Interface Card and connect it to VLAN 'n'\n"
c20709aa 4005#ifdef CONFIG_SLIRP
7a9f6e4a 4006 "-net user[,vlan=n][,name=str][,hostname=host]\n"
115defd1
PB
4007 " connect the user mode network stack to VLAN 'n' and send\n"
4008 " hostname 'host' to DHCP clients\n"
7c9d8e07 4009#endif
7fb843f8 4010#ifdef _WIN32
7a9f6e4a 4011 "-net tap[,vlan=n][,name=str],ifname=name\n"
7fb843f8
FB
4012 " connect the host TAP network interface to VLAN 'n'\n"
4013#else
7a9f6e4a 4014 "-net tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile]\n"
b46a8906
TS
4015 " connect the host TAP network interface to VLAN 'n' and use the\n"
4016 " network scripts 'file' (default=%s)\n"
4017 " and 'dfile' (default=%s);\n"
4018 " use '[down]script=no' to disable script execution;\n"
7c9d8e07 4019 " use 'fd=h' to connect to an already opened TAP interface\n"
7fb843f8 4020#endif
7a9f6e4a 4021 "-net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port]\n"
7c9d8e07 4022 " connect the vlan 'n' to another VLAN using a socket connection\n"
7a9f6e4a 4023 "-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port]\n"
3d830459 4024 " connect the vlan 'n' to multicast maddr and port\n"
8a16d273 4025#ifdef CONFIG_VDE
7a9f6e4a 4026 "-net vde[,vlan=n][,name=str][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode]\n"
8a16d273
TS
4027 " connect the vlan 'n' to port 'n' of a vde switch running\n"
4028 " on host and listening for incoming connections on 'socketpath'.\n"
4029 " Use group 'groupname' and mode 'octalmode' to change default\n"
4030 " ownership and permissions for communication port.\n"
4031#endif
7c9d8e07
FB
4032 "-net none use it alone to have zero network devices; if no -net option\n"
4033 " is provided, the default is '-net nic -net user'\n"
7c9d8e07 4034#ifdef CONFIG_SLIRP
0db1137d 4035 "-tftp dir allow tftp access to files in dir [-net user]\n"
47d5d01a 4036 "-bootp file advertise file in BOOTP replies\n"
7c9d8e07
FB
4037#ifndef _WIN32
4038 "-smb dir allow SMB access to files in 'dir' [-net user]\n"
c94c8d64 4039#endif
9bf05444 4040 "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n"
7c9d8e07 4041 " redirect TCP or UDP connections from host to guest [-net user]\n"
c20709aa 4042#endif
a20dd508 4043 "\n"
d2c639d6
BS
4044 "-bt hci,null dumb bluetooth HCI - doesn't respond to commands\n"
4045 "-bt hci,host[:id]\n"
4046 " use host's HCI with the given name\n"
4047 "-bt hci[,vlan=n]\n"
4048 " emulate a standard HCI in virtual scatternet 'n'\n"
4049 "-bt vhci[,vlan=n]\n"
4050 " add host computer to virtual scatternet 'n' using VHCI\n"
4051 "-bt device:dev[,vlan=n]\n"
4052 " emulate a bluetooth device 'dev' in scatternet 'n'\n"
4053 "\n"
4054#ifdef TARGET_I386
4055 "\n"
4056 "i386 target only:\n"
4057 "-win2k-hack use it when installing Windows 2000 to avoid a disk full bug\n"
4058 "-rtc-td-hack use it to fix time drift in Windows ACPI HAL\n"
4059 "-no-fd-bootchk disable boot signature checking for floppy disks\n"
4060 "-no-acpi disable ACPI\n"
4061 "-no-hpet disable HPET\n"
8a92ea2f
AL
4062 "-acpitable [sig=str][,rev=n][,oem_id=str][,oem_table_id=str][,oem_rev=n][,asl_compiler_id=str][,asl_compiler_rev=n][,data=file1[:file2]...]\n"
4063 " ACPI table description\n"
d2c639d6 4064#endif
c4b1fcc0 4065 "Linux boot specific:\n"
a20dd508
FB
4066 "-kernel bzImage use 'bzImage' as kernel image\n"
4067 "-append cmdline use 'cmdline' as kernel command line\n"
4068 "-initrd file use 'file' as initial ram disk\n"
fc01f7e7 4069 "\n"
330d0414 4070 "Debug/Expert options:\n"
82c643ff 4071 "-serial dev redirect the serial port to char device 'dev'\n"
6508fe59 4072 "-parallel dev redirect the parallel port to char device 'dev'\n"
d2c639d6
BS
4073 "-monitor dev redirect the monitor to char device 'dev'\n"
4074 "-pidfile file write PID to 'file'\n"
cd6f1169 4075 "-S freeze CPU at startup (use 'c' to start execution)\n"
cfc3475a
PB
4076 "-s wait gdb connection to port\n"
4077 "-p port set gdb connection port [default=%s]\n"
f193c797 4078 "-d item1,... output log to %s (use -d ? for a list of log items)\n"
d2c639d6
BS
4079 "-hdachs c,h,s[,t]\n"
4080 " force hard disk 0 physical geometry and the optional BIOS\n"
46d4767d 4081 " translation (t=none or lba) (usually qemu can guess them)\n"
87b47350 4082 "-L path set the directory for the BIOS, VGA BIOS and keymaps\n"
d2c639d6 4083 "-bios file set the filename for the BIOS\n"
d993e026 4084#ifdef USE_KQEMU
6515b203 4085 "-kernel-kqemu enable KQEMU full virtualization (default is user mode only)\n"
d993e026
FB
4086 "-no-kqemu disable KQEMU kernel module usage\n"
4087#endif
7ba1e619
AL
4088#ifdef CONFIG_KVM
4089 "-enable-kvm enable KVM full virtualization support\n"
bb0c6722 4090#endif
d1beab82 4091 "-no-reboot exit instead of rebooting\n"
b2f76161 4092 "-no-shutdown stop before shutdown\n"
d2c639d6
BS
4093 "-loadvm [tag|id]\n"
4094 " start right away with a saved state (loadvm in monitor)\n"
71e3ceb8
TS
4095#ifndef _WIN32
4096 "-daemonize daemonize QEMU after initializing\n"
4097#endif
9ae02555 4098 "-option-rom rom load a file, rom, into the option ROM space\n"
d2c639d6
BS
4099#if defined(TARGET_SPARC) || defined(TARGET_PPC)
4100 "-prom-env variable=value\n"
4101 " set OpenBIOS nvram variables\n"
66508601 4102#endif
f3dcfada 4103 "-clock force the use of the given methods for timer alarm.\n"
3adda04c 4104 " To see what timers are available use -clock ?\n"
d2c639d6 4105 "-localtime set the real time clock to local time [default=utc]\n"
bce61846 4106 "-startdate select initial date of the clock\n"
2e70f6ef 4107 "-icount [N|auto]\n"
d2c639d6
BS
4108 " enable virtual instruction counter with 2^N clock ticks per instruction\n"
4109 "-echr chr set terminal escape character instead of ctrl-a\n"
4110 "-virtioconsole c\n"
4111 " set virtio console\n"
4112 "-show-cursor show cursor\n"
4113#if defined(TARGET_ARM) || defined(TARGET_M68K)
4114 "-semihosting semihosting mode\n"
4115#endif
4116#if defined(TARGET_ARM)
4117 "-old-param old param mode\n"
4118#endif
4119 "-tb-size n set TB size\n"
4120 "-incoming p prepare for incoming migration, listen on port p\n"
0858532e
AL
4121#ifndef _WIN32
4122 "-chroot dir Chroot to dir just before starting the VM.\n"
4123 "-runas user Change to user id user just before starting the VM.\n"
4124#endif
0824d6fc 4125 "\n"
82c643ff 4126 "During emulation, the following keys are useful:\n"
032a8c9e
FB
4127 "ctrl-alt-f toggle full screen\n"
4128 "ctrl-alt-n switch to virtual console 'n'\n"
4129 "ctrl-alt toggle mouse and keyboard grab\n"
82c643ff
FB
4130 "\n"
4131 "When using -nographic, press 'ctrl-a h' to get some help.\n"
4132 ,
0db63474 4133 "qemu",
a00bad7e 4134 DEFAULT_RAM_SIZE,
7c9d8e07 4135#ifndef _WIN32
a00bad7e 4136 DEFAULT_NETWORK_SCRIPT,
b46a8906 4137 DEFAULT_NETWORK_DOWN_SCRIPT,
7c9d8e07 4138#endif
6e44ba7f 4139 DEFAULT_GDBSTUB_PORT,
bce61846 4140 "/tmp/qemu.log");
15f82208 4141 exit(exitcode);
0824d6fc
FB
4142}
4143
cd6f1169
FB
4144#define HAS_ARG 0x0001
4145
4146enum {
d2c639d6
BS
4147 /* Please keep in synch with help, qemu_options[] and
4148 qemu-doc.texi */
4149 /* Standard options: */
cd6f1169 4150 QEMU_OPTION_h,
cc1daa40 4151 QEMU_OPTION_M,
94fc95cd 4152 QEMU_OPTION_cpu,
d2c639d6 4153 QEMU_OPTION_smp,
cd6f1169
FB
4154 QEMU_OPTION_fda,
4155 QEMU_OPTION_fdb,
4156 QEMU_OPTION_hda,
4157 QEMU_OPTION_hdb,
4158 QEMU_OPTION_hdc,
4159 QEMU_OPTION_hdd,
4160 QEMU_OPTION_cdrom,
d2c639d6 4161 QEMU_OPTION_drive,
3e3d5815 4162 QEMU_OPTION_mtdblock,
a1bb27b1 4163 QEMU_OPTION_sd,
86f55663 4164 QEMU_OPTION_pflash,
cd6f1169
FB
4165 QEMU_OPTION_boot,
4166 QEMU_OPTION_snapshot,
4167 QEMU_OPTION_m,
d2c639d6 4168 QEMU_OPTION_k,
1d14ffa9
FB
4169 QEMU_OPTION_audio_help,
4170 QEMU_OPTION_soundhw,
d2c639d6
BS
4171 QEMU_OPTION_usb,
4172 QEMU_OPTION_usbdevice,
4173 QEMU_OPTION_name,
4174 QEMU_OPTION_uuid,
cd6f1169 4175
d2c639d6
BS
4176 /* Display options: */
4177 QEMU_OPTION_nographic,
4178 QEMU_OPTION_curses,
4179 QEMU_OPTION_no_frame,
4180 QEMU_OPTION_alt_grab,
4181 QEMU_OPTION_no_quit,
4182 QEMU_OPTION_sdl,
4183 QEMU_OPTION_portrait,
4184 QEMU_OPTION_vga,
4185 QEMU_OPTION_full_screen,
4186 QEMU_OPTION_g,
4187 QEMU_OPTION_vnc,
4188
4189 /* Network options: */
7c9d8e07 4190 QEMU_OPTION_net,
c7f74643 4191 QEMU_OPTION_tftp,
47d5d01a 4192 QEMU_OPTION_bootp,
9d728e8c 4193 QEMU_OPTION_smb,
9bf05444 4194 QEMU_OPTION_redir,
dc72ac14 4195 QEMU_OPTION_bt,
cd6f1169 4196
d2c639d6
BS
4197 /* i386 target only: */
4198 QEMU_OPTION_win2k_hack,
4199 QEMU_OPTION_rtc_td_hack,
4200 QEMU_OPTION_no_fd_bootchk,
4201 QEMU_OPTION_no_acpi,
4202 QEMU_OPTION_no_hpet,
8a92ea2f 4203 QEMU_OPTION_acpitable,
d2c639d6
BS
4204
4205 /* Linux boot specific: */
cd6f1169
FB
4206 QEMU_OPTION_kernel,
4207 QEMU_OPTION_append,
4208 QEMU_OPTION_initrd,
4209
d2c639d6
BS
4210 /* Debug/Expert options: */
4211 QEMU_OPTION_serial,
4212 QEMU_OPTION_parallel,
4213 QEMU_OPTION_monitor,
4214 QEMU_OPTION_pidfile,
cd6f1169
FB
4215 QEMU_OPTION_S,
4216 QEMU_OPTION_s,
4217 QEMU_OPTION_p,
4218 QEMU_OPTION_d,
4219 QEMU_OPTION_hdachs,
4220 QEMU_OPTION_L,
1192dad8 4221 QEMU_OPTION_bios,
89bfc105 4222 QEMU_OPTION_kernel_kqemu,
d2c639d6 4223 QEMU_OPTION_no_kqemu,
7ba1e619 4224 QEMU_OPTION_enable_kvm,
d1beab82 4225 QEMU_OPTION_no_reboot,
b2f76161 4226 QEMU_OPTION_no_shutdown,
d2c639d6 4227 QEMU_OPTION_loadvm,
71e3ceb8 4228 QEMU_OPTION_daemonize,
9ae02555 4229 QEMU_OPTION_option_rom,
66508601 4230 QEMU_OPTION_prom_env,
f3dcfada 4231 QEMU_OPTION_clock,
d2c639d6 4232 QEMU_OPTION_localtime,
7e0af5d0 4233 QEMU_OPTION_startdate,
2e70f6ef 4234 QEMU_OPTION_icount,
d2c639d6
BS
4235 QEMU_OPTION_echr,
4236 QEMU_OPTION_virtiocon,
4237 QEMU_OPTION_show_cursor,
4238 QEMU_OPTION_semihosting,
4239 QEMU_OPTION_old_param,
4240 QEMU_OPTION_tb_size,
5bb7910a 4241 QEMU_OPTION_incoming,
0858532e
AL
4242 QEMU_OPTION_chroot,
4243 QEMU_OPTION_runas,
cd6f1169
FB
4244};
4245
4246typedef struct QEMUOption {
4247 const char *name;
4248 int flags;
4249 int index;
4250} QEMUOption;
4251
dbed7e40 4252static const QEMUOption qemu_options[] = {
d2c639d6
BS
4253 /* Please keep in synch with help, QEMU_OPTION_ enums, and
4254 qemu-doc.texi */
4255 /* Standard options: */
cd6f1169 4256 { "h", 0, QEMU_OPTION_h },
64423fb2 4257 { "help", 0, QEMU_OPTION_h },
cc1daa40 4258 { "M", HAS_ARG, QEMU_OPTION_M },
94fc95cd 4259 { "cpu", HAS_ARG, QEMU_OPTION_cpu },
d2c639d6 4260 { "smp", HAS_ARG, QEMU_OPTION_smp },
cd6f1169
FB
4261 { "fda", HAS_ARG, QEMU_OPTION_fda },
4262 { "fdb", HAS_ARG, QEMU_OPTION_fdb },
4263 { "hda", HAS_ARG, QEMU_OPTION_hda },
4264 { "hdb", HAS_ARG, QEMU_OPTION_hdb },
4265 { "hdc", HAS_ARG, QEMU_OPTION_hdc },
4266 { "hdd", HAS_ARG, QEMU_OPTION_hdd },
4267 { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
d2c639d6 4268 { "drive", HAS_ARG, QEMU_OPTION_drive },
3e3d5815 4269 { "mtdblock", HAS_ARG, QEMU_OPTION_mtdblock },
a1bb27b1 4270 { "sd", HAS_ARG, QEMU_OPTION_sd },
86f55663 4271 { "pflash", HAS_ARG, QEMU_OPTION_pflash },
cd6f1169
FB
4272 { "boot", HAS_ARG, QEMU_OPTION_boot },
4273 { "snapshot", 0, QEMU_OPTION_snapshot },
4274 { "m", HAS_ARG, QEMU_OPTION_m },
d2c639d6 4275#ifndef _WIN32
3d11d0eb 4276 { "k", HAS_ARG, QEMU_OPTION_k },
d2c639d6 4277#endif
1d14ffa9 4278#ifdef HAS_AUDIO
1d14ffa9
FB
4279 { "audio-help", 0, QEMU_OPTION_audio_help },
4280 { "soundhw", HAS_ARG, QEMU_OPTION_soundhw },
4281#endif
d2c639d6
BS
4282 { "usb", 0, QEMU_OPTION_usb },
4283 { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
4284 { "name", HAS_ARG, QEMU_OPTION_name },
4285 { "uuid", HAS_ARG, QEMU_OPTION_uuid },
4286
4287 /* Display options: */
4288 { "nographic", 0, QEMU_OPTION_nographic },
4289#ifdef CONFIG_CURSES
4290 { "curses", 0, QEMU_OPTION_curses },
4291#endif
4292#ifdef CONFIG_SDL
4293 { "no-frame", 0, QEMU_OPTION_no_frame },
4294 { "alt-grab", 0, QEMU_OPTION_alt_grab },
4295 { "no-quit", 0, QEMU_OPTION_no_quit },
4296 { "sdl", 0, QEMU_OPTION_sdl },
4297#endif
4298 { "portrait", 0, QEMU_OPTION_portrait },
4299 { "vga", HAS_ARG, QEMU_OPTION_vga },
4300 { "full-screen", 0, QEMU_OPTION_full_screen },
4301#if defined(TARGET_PPC) || defined(TARGET_SPARC)
4302 { "g", 1, QEMU_OPTION_g },
4303#endif
4304 { "vnc", HAS_ARG, QEMU_OPTION_vnc },
cd6f1169 4305
d2c639d6 4306 /* Network options: */
7c9d8e07 4307 { "net", HAS_ARG, QEMU_OPTION_net},
158156d1 4308#ifdef CONFIG_SLIRP
c7f74643 4309 { "tftp", HAS_ARG, QEMU_OPTION_tftp },
47d5d01a 4310 { "bootp", HAS_ARG, QEMU_OPTION_bootp },
c94c8d64 4311#ifndef _WIN32
9d728e8c 4312 { "smb", HAS_ARG, QEMU_OPTION_smb },
c94c8d64 4313#endif
9bf05444 4314 { "redir", HAS_ARG, QEMU_OPTION_redir },
158156d1 4315#endif
dc72ac14 4316 { "bt", HAS_ARG, QEMU_OPTION_bt },
d2c639d6
BS
4317#ifdef TARGET_I386
4318 /* i386 target only: */
4319 { "win2k-hack", 0, QEMU_OPTION_win2k_hack },
4320 { "rtc-td-hack", 0, QEMU_OPTION_rtc_td_hack },
4321 { "no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk },
4322 { "no-acpi", 0, QEMU_OPTION_no_acpi },
4323 { "no-hpet", 0, QEMU_OPTION_no_hpet },
8a92ea2f 4324 { "acpitable", HAS_ARG, QEMU_OPTION_acpitable },
d2c639d6 4325#endif
cd6f1169 4326
d2c639d6 4327 /* Linux boot specific: */
cd6f1169
FB
4328 { "kernel", HAS_ARG, QEMU_OPTION_kernel },
4329 { "append", HAS_ARG, QEMU_OPTION_append },
4330 { "initrd", HAS_ARG, QEMU_OPTION_initrd },
4331
d2c639d6
BS
4332 /* Debug/Expert options: */
4333 { "serial", HAS_ARG, QEMU_OPTION_serial },
4334 { "parallel", HAS_ARG, QEMU_OPTION_parallel },
4335 { "monitor", HAS_ARG, QEMU_OPTION_monitor },
4336 { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
cd6f1169
FB
4337 { "S", 0, QEMU_OPTION_S },
4338 { "s", 0, QEMU_OPTION_s },
4339 { "p", HAS_ARG, QEMU_OPTION_p },
4340 { "d", HAS_ARG, QEMU_OPTION_d },
4341 { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
4342 { "L", HAS_ARG, QEMU_OPTION_L },
1192dad8 4343 { "bios", HAS_ARG, QEMU_OPTION_bios },
d993e026 4344#ifdef USE_KQEMU
89bfc105 4345 { "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu },
d2c639d6 4346 { "no-kqemu", 0, QEMU_OPTION_no_kqemu },
d993e026 4347#endif
7ba1e619
AL
4348#ifdef CONFIG_KVM
4349 { "enable-kvm", 0, QEMU_OPTION_enable_kvm },
4350#endif
d2c639d6
BS
4351 { "no-reboot", 0, QEMU_OPTION_no_reboot },
4352 { "no-shutdown", 0, QEMU_OPTION_no_shutdown },
4353 { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
4354 { "daemonize", 0, QEMU_OPTION_daemonize },
4355 { "option-rom", HAS_ARG, QEMU_OPTION_option_rom },
4356#if defined(TARGET_SPARC) || defined(TARGET_PPC)
4357 { "prom-env", HAS_ARG, QEMU_OPTION_prom_env },
77d4bc34 4358#endif
d2c639d6 4359 { "clock", HAS_ARG, QEMU_OPTION_clock },
ee22c2f7 4360 { "localtime", 0, QEMU_OPTION_localtime },
d2c639d6
BS
4361 { "startdate", HAS_ARG, QEMU_OPTION_startdate },
4362 { "icount", HAS_ARG, QEMU_OPTION_icount },
8b6e0729 4363 { "echr", HAS_ARG, QEMU_OPTION_echr },
51ecf136 4364 { "virtioconsole", HAS_ARG, QEMU_OPTION_virtiocon },
9467cd46 4365 { "show-cursor", 0, QEMU_OPTION_show_cursor },
a87295e8 4366#if defined(TARGET_ARM) || defined(TARGET_M68K)
8e71621f 4367 { "semihosting", 0, QEMU_OPTION_semihosting },
2b8f2d41
AZ
4368#endif
4369#if defined(TARGET_ARM)
4370 { "old-param", 0, QEMU_OPTION_old_param },
66508601 4371#endif
26a5f13b 4372 { "tb-size", HAS_ARG, QEMU_OPTION_tb_size },
5bb7910a 4373 { "incoming", HAS_ARG, QEMU_OPTION_incoming },
0858532e
AL
4374 { "chroot", HAS_ARG, QEMU_OPTION_chroot },
4375 { "runas", HAS_ARG, QEMU_OPTION_runas },
cd6f1169 4376 { NULL },
fc01f7e7
FB
4377};
4378
1d14ffa9 4379#ifdef HAS_AUDIO
6a36d84e 4380struct soundhw soundhw[] = {
b00052e4 4381#ifdef HAS_AUDIO_CHOICE
4ce7ff6e 4382#if defined(TARGET_I386) || defined(TARGET_MIPS)
fd06c375
FB
4383 {
4384 "pcspk",
4385 "PC speaker",
4386 0,
4387 1,
4388 { .init_isa = pcspk_audio_init }
4389 },
4390#endif
4c9b53e3 4391
4392#ifdef CONFIG_SB16
6a36d84e
FB
4393 {
4394 "sb16",
4395 "Creative Sound Blaster 16",
4396 0,
4397 1,
4398 { .init_isa = SB16_init }
4399 },
4c9b53e3 4400#endif
6a36d84e 4401
cc53d26d 4402#ifdef CONFIG_CS4231A
4403 {
4404 "cs4231a",
4405 "CS4231A",
4406 0,
4407 1,
4408 { .init_isa = cs4231a_init }
4409 },
4410#endif
4411
1d14ffa9 4412#ifdef CONFIG_ADLIB
6a36d84e
FB
4413 {
4414 "adlib",
1d14ffa9 4415#ifdef HAS_YMF262
6a36d84e 4416 "Yamaha YMF262 (OPL3)",
1d14ffa9 4417#else
6a36d84e 4418 "Yamaha YM3812 (OPL2)",
1d14ffa9 4419#endif
6a36d84e
FB
4420 0,
4421 1,
4422 { .init_isa = Adlib_init }
4423 },
1d14ffa9 4424#endif
6a36d84e 4425
1d14ffa9 4426#ifdef CONFIG_GUS
6a36d84e
FB
4427 {
4428 "gus",
4429 "Gravis Ultrasound GF1",
4430 0,
4431 1,
4432 { .init_isa = GUS_init }
4433 },
1d14ffa9 4434#endif
6a36d84e 4435
4c9b53e3 4436#ifdef CONFIG_AC97
e5c9a13e
AZ
4437 {
4438 "ac97",
4439 "Intel 82801AA AC97 Audio",
4440 0,
4441 0,
4442 { .init_pci = ac97_init }
4443 },
4c9b53e3 4444#endif
e5c9a13e 4445
4c9b53e3 4446#ifdef CONFIG_ES1370
6a36d84e
FB
4447 {
4448 "es1370",
4449 "ENSONIQ AudioPCI ES1370",
4450 0,
4451 0,
4452 { .init_pci = es1370_init }
4453 },
b00052e4 4454#endif
6a36d84e 4455
4c9b53e3 4456#endif /* HAS_AUDIO_CHOICE */
4457
6a36d84e
FB
4458 { NULL, NULL, 0, 0, { NULL } }
4459};
4460
4461static void select_soundhw (const char *optarg)
4462{
4463 struct soundhw *c;
4464
4465 if (*optarg == '?') {
4466 show_valid_cards:
4467
4468 printf ("Valid sound card names (comma separated):\n");
4469 for (c = soundhw; c->name; ++c) {
4470 printf ("%-11s %s\n", c->name, c->descr);
4471 }
4472 printf ("\n-soundhw all will enable all of the above\n");
1d14ffa9
FB
4473 exit (*optarg != '?');
4474 }
4475 else {
6a36d84e 4476 size_t l;
1d14ffa9
FB
4477 const char *p;
4478 char *e;
4479 int bad_card = 0;
4480
6a36d84e
FB
4481 if (!strcmp (optarg, "all")) {
4482 for (c = soundhw; c->name; ++c) {
4483 c->enabled = 1;
4484 }
4485 return;
4486 }
1d14ffa9 4487
6a36d84e 4488 p = optarg;
1d14ffa9
FB
4489 while (*p) {
4490 e = strchr (p, ',');
4491 l = !e ? strlen (p) : (size_t) (e - p);
6a36d84e
FB
4492
4493 for (c = soundhw; c->name; ++c) {
4494 if (!strncmp (c->name, p, l)) {
4495 c->enabled = 1;
1d14ffa9
FB
4496 break;
4497 }
4498 }
6a36d84e
FB
4499
4500 if (!c->name) {
1d14ffa9
FB
4501 if (l > 80) {
4502 fprintf (stderr,
4503 "Unknown sound card name (too big to show)\n");
4504 }
4505 else {
4506 fprintf (stderr, "Unknown sound card name `%.*s'\n",
4507 (int) l, p);
4508 }
4509 bad_card = 1;
4510 }
4511 p += l + (e != NULL);
4512 }
4513
4514 if (bad_card)
4515 goto show_valid_cards;
4516 }
4517}
4518#endif
4519
3893c124 4520static void select_vgahw (const char *p)
4521{
4522 const char *opts;
4523
4524 if (strstart(p, "std", &opts)) {
c2b3b41a 4525 std_vga_enabled = 1;
3893c124 4526 cirrus_vga_enabled = 0;
4527 vmsvga_enabled = 0;
4528 } else if (strstart(p, "cirrus", &opts)) {
4529 cirrus_vga_enabled = 1;
c2b3b41a 4530 std_vga_enabled = 0;
3893c124 4531 vmsvga_enabled = 0;
4532 } else if (strstart(p, "vmware", &opts)) {
4533 cirrus_vga_enabled = 0;
c2b3b41a 4534 std_vga_enabled = 0;
3893c124 4535 vmsvga_enabled = 1;
c2b3b41a
AL
4536 } else if (strstart(p, "none", &opts)) {
4537 cirrus_vga_enabled = 0;
4538 std_vga_enabled = 0;
4539 vmsvga_enabled = 0;
3893c124 4540 } else {
4541 invalid_vga:
4542 fprintf(stderr, "Unknown vga type: %s\n", p);
4543 exit(1);
4544 }
cb5a7aa8 4545 while (*opts) {
4546 const char *nextopt;
4547
4548 if (strstart(opts, ",retrace=", &nextopt)) {
4549 opts = nextopt;
4550 if (strstart(opts, "dumb", &nextopt))
4551 vga_retrace_method = VGA_RETRACE_DUMB;
4552 else if (strstart(opts, "precise", &nextopt))
4553 vga_retrace_method = VGA_RETRACE_PRECISE;
4554 else goto invalid_vga;
4555 } else goto invalid_vga;
4556 opts = nextopt;
4557 }
3893c124 4558}
4559
3587d7e6
FB
4560#ifdef _WIN32
4561static BOOL WINAPI qemu_ctrl_handler(DWORD type)
4562{
4563 exit(STATUS_CONTROL_C_EXIT);
4564 return TRUE;
4565}
4566#endif
4567
8fcb1b90
BS
4568static int qemu_uuid_parse(const char *str, uint8_t *uuid)
4569{
4570 int ret;
4571
4572 if(strlen(str) != 36)
4573 return -1;
4574
4575 ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
4576 &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
4577 &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]);
4578
4579 if(ret != 16)
4580 return -1;
4581
4582 return 0;
4583}
4584
7c9d8e07 4585#define MAX_NET_CLIENTS 32
c20709aa 4586
5b08fc10
AL
4587#ifndef _WIN32
4588
4589static void termsig_handler(int signal)
4590{
4591 qemu_system_shutdown_request();
4592}
4593
6f9e3801 4594static void termsig_setup(void)
5b08fc10
AL
4595{
4596 struct sigaction act;
4597
4598 memset(&act, 0, sizeof(act));
4599 act.sa_handler = termsig_handler;
4600 sigaction(SIGINT, &act, NULL);
4601 sigaction(SIGHUP, &act, NULL);
4602 sigaction(SIGTERM, &act, NULL);
4603}
4604
4605#endif
4606
902b3d5c 4607int main(int argc, char **argv, char **envp)
0824d6fc 4608{
67b915a5 4609#ifdef CONFIG_GDBSTUB
cfc3475a
PB
4610 int use_gdbstub;
4611 const char *gdbstub_port;
67b915a5 4612#endif
28c5af54 4613 uint32_t boot_devices_bitmap = 0;
e4bcb14c 4614 int i;
28c5af54 4615 int snapshot, linux_boot, net_boot;
7f7f9873 4616 const char *initrd_filename;
a20dd508 4617 const char *kernel_filename, *kernel_cmdline;
28c5af54 4618 const char *boot_devices = "";
3023f332 4619 DisplayState *ds;
7d957bd8 4620 DisplayChangeListener *dcl;
46d4767d 4621 int cyls, heads, secs, translation;
fd5f393a 4622 const char *net_clients[MAX_NET_CLIENTS];
7c9d8e07 4623 int nb_net_clients;
dc72ac14
AZ
4624 const char *bt_opts[MAX_BT_CMDLINE];
4625 int nb_bt_opts;
e4bcb14c 4626 int hda_index;
cd6f1169
FB
4627 int optind;
4628 const char *r, *optarg;
4c621805 4629 CharDriverState *monitor_hd = NULL;
fd5f393a
PB
4630 const char *monitor_device;
4631 const char *serial_devices[MAX_SERIAL_PORTS];
8d11df9e 4632 int serial_device_index;
fd5f393a 4633 const char *parallel_devices[MAX_PARALLEL_PORTS];
6508fe59 4634 int parallel_device_index;
9ede2fde
AL
4635 const char *virtio_consoles[MAX_VIRTIO_CONSOLES];
4636 int virtio_console_index;
d63d307f 4637 const char *loadvm = NULL;
cc1daa40 4638 QEMUMachine *machine;
94fc95cd 4639 const char *cpu_model;
fd5f393a 4640 const char *usb_devices[MAX_USB_CMDLINE];
a594cfbf 4641 int usb_devices_index;
71e3ceb8 4642 int fds[2];
26a5f13b 4643 int tb_size;
93815bc2 4644 const char *pid_file = NULL;
5bb7910a 4645 const char *incoming = NULL;
54042bcf
AL
4646 int fd = 0;
4647 struct passwd *pwd = NULL;
0858532e
AL
4648 const char *chroot_dir = NULL;
4649 const char *run_as = NULL;
0bd48850 4650
902b3d5c 4651 qemu_cache_utils_init(envp);
4652
0bd48850 4653 LIST_INIT (&vm_change_state_head);
be995c27
FB
4654#ifndef _WIN32
4655 {
4656 struct sigaction act;
4657 sigfillset(&act.sa_mask);
4658 act.sa_flags = 0;
4659 act.sa_handler = SIG_IGN;
4660 sigaction(SIGPIPE, &act, NULL);
4661 }
3587d7e6
FB
4662#else
4663 SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
a8e5ac33
FB
4664 /* Note: cpu_interrupt() is currently not SMP safe, so we force
4665 QEMU to run on a single CPU */
4666 {
4667 HANDLE h;
4668 DWORD mask, smask;
4669 int i;
4670 h = GetCurrentProcess();
4671 if (GetProcessAffinityMask(h, &mask, &smask)) {
4672 for(i = 0; i < 32; i++) {
4673 if (mask & (1 << i))
4674 break;
4675 }
4676 if (i != 32) {
4677 mask = 1 << i;
4678 SetProcessAffinityMask(h, mask);
4679 }
4680 }
4681 }
67b915a5 4682#endif
be995c27 4683
cc1daa40
FB
4684 register_machines();
4685 machine = first_machine;
94fc95cd 4686 cpu_model = NULL;
fc01f7e7 4687 initrd_filename = NULL;
4fc5d071 4688 ram_size = 0;
313aa567 4689 vga_ram_size = VGA_RAM_SIZE;
67b915a5 4690#ifdef CONFIG_GDBSTUB
b4608c04 4691 use_gdbstub = 0;
c636bb66 4692 gdbstub_port = DEFAULT_GDBSTUB_PORT;
67b915a5 4693#endif
33e3963e 4694 snapshot = 0;
a20dd508 4695 nographic = 0;
4d3b6f6e 4696 curses = 0;
a20dd508
FB
4697 kernel_filename = NULL;
4698 kernel_cmdline = "";
c4b1fcc0 4699 cyls = heads = secs = 0;
46d4767d 4700 translation = BIOS_ATA_TRANSLATION_AUTO;
d47d13b9 4701 monitor_device = "vc:80Cx24C";
c4b1fcc0 4702
c75a823c 4703 serial_devices[0] = "vc:80Cx24C";
8d11df9e 4704 for(i = 1; i < MAX_SERIAL_PORTS; i++)
fd5f393a 4705 serial_devices[i] = NULL;
8d11df9e 4706 serial_device_index = 0;
3b46e624 4707
8290edda 4708 parallel_devices[0] = "vc:80Cx24C";
6508fe59 4709 for(i = 1; i < MAX_PARALLEL_PORTS; i++)
fd5f393a 4710 parallel_devices[i] = NULL;
6508fe59 4711 parallel_device_index = 0;
3b46e624 4712
1b8fc811 4713 for(i = 0; i < MAX_VIRTIO_CONSOLES; i++)
9ede2fde
AL
4714 virtio_consoles[i] = NULL;
4715 virtio_console_index = 0;
4716
a594cfbf 4717 usb_devices_index = 0;
3b46e624 4718
7c9d8e07 4719 nb_net_clients = 0;
dc72ac14 4720 nb_bt_opts = 0;
e4bcb14c
TS
4721 nb_drives = 0;
4722 nb_drives_opt = 0;
4723 hda_index = -1;
7c9d8e07
FB
4724
4725 nb_nics = 0;
3b46e624 4726
26a5f13b 4727 tb_size = 0;
41bd639b
BS
4728 autostart= 1;
4729
cd6f1169 4730 optind = 1;
0824d6fc 4731 for(;;) {
cd6f1169 4732 if (optind >= argc)
0824d6fc 4733 break;
cd6f1169
FB
4734 r = argv[optind];
4735 if (r[0] != '-') {
609497ab 4736 hda_index = drive_add(argv[optind++], HD_ALIAS, 0);
cd6f1169
FB
4737 } else {
4738 const QEMUOption *popt;
4739
4740 optind++;
dff5efc8
PB
4741 /* Treat --foo the same as -foo. */
4742 if (r[1] == '-')
4743 r++;
cd6f1169
FB
4744 popt = qemu_options;
4745 for(;;) {
4746 if (!popt->name) {
5fafdf24 4747 fprintf(stderr, "%s: invalid option -- '%s'\n",
cd6f1169
FB
4748 argv[0], r);
4749 exit(1);
4750 }
4751 if (!strcmp(popt->name, r + 1))
4752 break;
4753 popt++;
4754 }
4755 if (popt->flags & HAS_ARG) {
4756 if (optind >= argc) {
4757 fprintf(stderr, "%s: option '%s' requires an argument\n",
4758 argv[0], r);
4759 exit(1);
4760 }
4761 optarg = argv[optind++];
4762 } else {
4763 optarg = NULL;
4764 }
4765
4766 switch(popt->index) {
cc1daa40
FB
4767 case QEMU_OPTION_M:
4768 machine = find_machine(optarg);
4769 if (!machine) {
4770 QEMUMachine *m;
4771 printf("Supported machines are:\n");
4772 for(m = first_machine; m != NULL; m = m->next) {
4773 printf("%-10s %s%s\n",
5fafdf24 4774 m->name, m->desc,
cc1daa40
FB
4775 m == first_machine ? " (default)" : "");
4776 }
15f82208 4777 exit(*optarg != '?');
cc1daa40
FB
4778 }
4779 break;
94fc95cd
JM
4780 case QEMU_OPTION_cpu:
4781 /* hw initialization will check this */
15f82208 4782 if (*optarg == '?') {
c732abe2
JM
4783/* XXX: implement xxx_cpu_list for targets that still miss it */
4784#if defined(cpu_list)
4785 cpu_list(stdout, &fprintf);
94fc95cd 4786#endif
15f82208 4787 exit(0);
94fc95cd
JM
4788 } else {
4789 cpu_model = optarg;
4790 }
4791 break;
cd6f1169 4792 case QEMU_OPTION_initrd:
fc01f7e7
FB
4793 initrd_filename = optarg;
4794 break;
cd6f1169 4795 case QEMU_OPTION_hda:
e4bcb14c 4796 if (cyls == 0)
609497ab 4797 hda_index = drive_add(optarg, HD_ALIAS, 0);
e4bcb14c 4798 else
609497ab 4799 hda_index = drive_add(optarg, HD_ALIAS
e4bcb14c 4800 ",cyls=%d,heads=%d,secs=%d%s",
609497ab 4801 0, cyls, heads, secs,
e4bcb14c
TS
4802 translation == BIOS_ATA_TRANSLATION_LBA ?
4803 ",trans=lba" :
4804 translation == BIOS_ATA_TRANSLATION_NONE ?
4805 ",trans=none" : "");
4806 break;
cd6f1169 4807 case QEMU_OPTION_hdb:
cc1daa40
FB
4808 case QEMU_OPTION_hdc:
4809 case QEMU_OPTION_hdd:
609497ab 4810 drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda);
fc01f7e7 4811 break;
e4bcb14c 4812 case QEMU_OPTION_drive:
609497ab 4813 drive_add(NULL, "%s", optarg);
e4bcb14c 4814 break;
3e3d5815 4815 case QEMU_OPTION_mtdblock:
609497ab 4816 drive_add(optarg, MTD_ALIAS);
3e3d5815 4817 break;
a1bb27b1 4818 case QEMU_OPTION_sd:
609497ab 4819 drive_add(optarg, SD_ALIAS);
a1bb27b1 4820 break;
86f55663 4821 case QEMU_OPTION_pflash:
609497ab 4822 drive_add(optarg, PFLASH_ALIAS);
86f55663 4823 break;
cd6f1169 4824 case QEMU_OPTION_snapshot:
33e3963e
FB
4825 snapshot = 1;
4826 break;
cd6f1169 4827 case QEMU_OPTION_hdachs:
330d0414 4828 {
330d0414
FB
4829 const char *p;
4830 p = optarg;
4831 cyls = strtol(p, (char **)&p, 0);
46d4767d
FB
4832 if (cyls < 1 || cyls > 16383)
4833 goto chs_fail;
330d0414
FB
4834 if (*p != ',')
4835 goto chs_fail;
4836 p++;
4837 heads = strtol(p, (char **)&p, 0);
46d4767d
FB
4838 if (heads < 1 || heads > 16)
4839 goto chs_fail;
330d0414
FB
4840 if (*p != ',')
4841 goto chs_fail;
4842 p++;
4843 secs = strtol(p, (char **)&p, 0);
46d4767d
FB
4844 if (secs < 1 || secs > 63)
4845 goto chs_fail;
4846 if (*p == ',') {
4847 p++;
4848 if (!strcmp(p, "none"))
4849 translation = BIOS_ATA_TRANSLATION_NONE;
4850 else if (!strcmp(p, "lba"))
4851 translation = BIOS_ATA_TRANSLATION_LBA;
4852 else if (!strcmp(p, "auto"))
4853 translation = BIOS_ATA_TRANSLATION_AUTO;
4854 else
4855 goto chs_fail;
4856 } else if (*p != '\0') {
c4b1fcc0 4857 chs_fail:
46d4767d
FB
4858 fprintf(stderr, "qemu: invalid physical CHS format\n");
4859 exit(1);
c4b1fcc0 4860 }
e4bcb14c 4861 if (hda_index != -1)
609497ab
AZ
4862 snprintf(drives_opt[hda_index].opt,
4863 sizeof(drives_opt[hda_index].opt),
4864 HD_ALIAS ",cyls=%d,heads=%d,secs=%d%s",
4865 0, cyls, heads, secs,
e4bcb14c
TS
4866 translation == BIOS_ATA_TRANSLATION_LBA ?
4867 ",trans=lba" :
4868 translation == BIOS_ATA_TRANSLATION_NONE ?
4869 ",trans=none" : "");
330d0414
FB
4870 }
4871 break;
cd6f1169 4872 case QEMU_OPTION_nographic:
a20dd508
FB
4873 nographic = 1;
4874 break;
4d3b6f6e
AZ
4875#ifdef CONFIG_CURSES
4876 case QEMU_OPTION_curses:
4877 curses = 1;
4878 break;
4879#endif
a171fe39
AZ
4880 case QEMU_OPTION_portrait:
4881 graphic_rotate = 1;
4882 break;
cd6f1169 4883 case QEMU_OPTION_kernel:
a20dd508
FB
4884 kernel_filename = optarg;
4885 break;
cd6f1169 4886 case QEMU_OPTION_append:
a20dd508 4887 kernel_cmdline = optarg;
313aa567 4888 break;
cd6f1169 4889 case QEMU_OPTION_cdrom:
609497ab 4890 drive_add(optarg, CDROM_ALIAS);
36b486bb 4891 break;
cd6f1169 4892 case QEMU_OPTION_boot:
28c5af54
JM
4893 boot_devices = optarg;
4894 /* We just do some generic consistency checks */
4895 {
4896 /* Could easily be extended to 64 devices if needed */
60fe76f3 4897 const char *p;
28c5af54
JM
4898
4899 boot_devices_bitmap = 0;
4900 for (p = boot_devices; *p != '\0'; p++) {
4901 /* Allowed boot devices are:
4902 * a b : floppy disk drives
4903 * c ... f : IDE disk drives
4904 * g ... m : machine implementation dependant drives
4905 * n ... p : network devices
4906 * It's up to each machine implementation to check
4907 * if the given boot devices match the actual hardware
4908 * implementation and firmware features.
4909 */
4910 if (*p < 'a' || *p > 'q') {
4911 fprintf(stderr, "Invalid boot device '%c'\n", *p);
4912 exit(1);
4913 }
4914 if (boot_devices_bitmap & (1 << (*p - 'a'))) {
4915 fprintf(stderr,
4916 "Boot device '%c' was given twice\n",*p);
4917 exit(1);
4918 }
4919 boot_devices_bitmap |= 1 << (*p - 'a');
4920 }
36b486bb
FB
4921 }
4922 break;
cd6f1169 4923 case QEMU_OPTION_fda:
cd6f1169 4924 case QEMU_OPTION_fdb:
609497ab 4925 drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda);
c45886db 4926 break;
52ca8d6a
FB
4927#ifdef TARGET_I386
4928 case QEMU_OPTION_no_fd_bootchk:
4929 fd_bootchk = 0;
4930 break;
4931#endif
7c9d8e07
FB
4932 case QEMU_OPTION_net:
4933 if (nb_net_clients >= MAX_NET_CLIENTS) {
4934 fprintf(stderr, "qemu: too many network clients\n");
c4b1fcc0
FB
4935 exit(1);
4936 }
fd5f393a 4937 net_clients[nb_net_clients] = optarg;
7c9d8e07 4938 nb_net_clients++;
702c651c 4939 break;
c7f74643
FB
4940#ifdef CONFIG_SLIRP
4941 case QEMU_OPTION_tftp:
c7f74643 4942 tftp_prefix = optarg;
9bf05444 4943 break;
47d5d01a
TS
4944 case QEMU_OPTION_bootp:
4945 bootp_filename = optarg;
4946 break;
c94c8d64 4947#ifndef _WIN32
9d728e8c
FB
4948 case QEMU_OPTION_smb:
4949 net_slirp_smb(optarg);
4950 break;
c94c8d64 4951#endif
9bf05444 4952 case QEMU_OPTION_redir:
3b46e624 4953 net_slirp_redir(optarg);
9bf05444 4954 break;
c7f74643 4955#endif
dc72ac14
AZ
4956 case QEMU_OPTION_bt:
4957 if (nb_bt_opts >= MAX_BT_CMDLINE) {
4958 fprintf(stderr, "qemu: too many bluetooth options\n");
4959 exit(1);
4960 }
4961 bt_opts[nb_bt_opts++] = optarg;
4962 break;
1d14ffa9 4963#ifdef HAS_AUDIO
1d14ffa9
FB
4964 case QEMU_OPTION_audio_help:
4965 AUD_help ();
4966 exit (0);
4967 break;
4968 case QEMU_OPTION_soundhw:
4969 select_soundhw (optarg);
4970 break;
4971#endif
cd6f1169 4972 case QEMU_OPTION_h:
15f82208 4973 help(0);
cd6f1169 4974 break;
00f82b8a
AJ
4975 case QEMU_OPTION_m: {
4976 uint64_t value;
4977 char *ptr;
4978
4979 value = strtoul(optarg, &ptr, 10);
4980 switch (*ptr) {
4981 case 0: case 'M': case 'm':
4982 value <<= 20;
4983 break;
4984 case 'G': case 'g':
4985 value <<= 30;
4986 break;
4987 default:
4988 fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
cd6f1169
FB
4989 exit(1);
4990 }
00f82b8a
AJ
4991
4992 /* On 32-bit hosts, QEMU is limited by virtual address space */
4993 if (value > (2047 << 20)
4994#ifndef USE_KQEMU
4995 && HOST_LONG_BITS == 32
4996#endif
4997 ) {
4998 fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n");
4999 exit(1);
5000 }
5001 if (value != (uint64_t)(ram_addr_t)value) {
5002 fprintf(stderr, "qemu: ram size too large\n");
5003 exit(1);
5004 }
5005 ram_size = value;
cd6f1169 5006 break;
00f82b8a 5007 }
cd6f1169
FB
5008 case QEMU_OPTION_d:
5009 {
5010 int mask;
c7cd6a37 5011 const CPULogItem *item;
3b46e624 5012
cd6f1169
FB
5013 mask = cpu_str_to_log_mask(optarg);
5014 if (!mask) {
5015 printf("Log items (comma separated):\n");
f193c797
FB
5016 for(item = cpu_log_items; item->mask != 0; item++) {
5017 printf("%-10s %s\n", item->name, item->help);
5018 }
5019 exit(1);
cd6f1169
FB
5020 }
5021 cpu_set_log(mask);
f193c797 5022 }
cd6f1169 5023 break;
67b915a5 5024#ifdef CONFIG_GDBSTUB
cd6f1169
FB
5025 case QEMU_OPTION_s:
5026 use_gdbstub = 1;
5027 break;
5028 case QEMU_OPTION_p:
cfc3475a 5029 gdbstub_port = optarg;
cd6f1169 5030 break;
67b915a5 5031#endif
cd6f1169
FB
5032 case QEMU_OPTION_L:
5033 bios_dir = optarg;
5034 break;
1192dad8
JM
5035 case QEMU_OPTION_bios:
5036 bios_name = optarg;
5037 break;
cd6f1169 5038 case QEMU_OPTION_S:
3c07f8e8 5039 autostart = 0;
cd6f1169 5040 break;
3d11d0eb
FB
5041 case QEMU_OPTION_k:
5042 keyboard_layout = optarg;
5043 break;
ee22c2f7
FB
5044 case QEMU_OPTION_localtime:
5045 rtc_utc = 0;
5046 break;
3893c124 5047 case QEMU_OPTION_vga:
5048 select_vgahw (optarg);
1bfe856e 5049 break;
e9b137c2
FB
5050 case QEMU_OPTION_g:
5051 {
5052 const char *p;
5053 int w, h, depth;
5054 p = optarg;
5055 w = strtol(p, (char **)&p, 10);
5056 if (w <= 0) {
5057 graphic_error:
5058 fprintf(stderr, "qemu: invalid resolution or depth\n");
5059 exit(1);
5060 }
5061 if (*p != 'x')
5062 goto graphic_error;
5063 p++;
5064 h = strtol(p, (char **)&p, 10);
5065 if (h <= 0)
5066 goto graphic_error;
5067 if (*p == 'x') {
5068 p++;
5069 depth = strtol(p, (char **)&p, 10);
5fafdf24 5070 if (depth != 8 && depth != 15 && depth != 16 &&
e9b137c2
FB
5071 depth != 24 && depth != 32)
5072 goto graphic_error;
5073 } else if (*p == '\0') {
5074 depth = graphic_depth;
5075 } else {
5076 goto graphic_error;
5077 }
3b46e624 5078
e9b137c2
FB
5079 graphic_width = w;
5080 graphic_height = h;
5081 graphic_depth = depth;
5082 }
5083 break;
20d8a3ed
TS
5084 case QEMU_OPTION_echr:
5085 {
5086 char *r;
5087 term_escape_char = strtol(optarg, &r, 0);
5088 if (r == optarg)
5089 printf("Bad argument to echr\n");
5090 break;
5091 }
82c643ff 5092 case QEMU_OPTION_monitor:
fd5f393a 5093 monitor_device = optarg;
82c643ff
FB
5094 break;
5095 case QEMU_OPTION_serial:
8d11df9e
FB
5096 if (serial_device_index >= MAX_SERIAL_PORTS) {
5097 fprintf(stderr, "qemu: too many serial ports\n");
5098 exit(1);
5099 }
fd5f393a 5100 serial_devices[serial_device_index] = optarg;
8d11df9e 5101 serial_device_index++;
82c643ff 5102 break;
51ecf136
AL
5103 case QEMU_OPTION_virtiocon:
5104 if (virtio_console_index >= MAX_VIRTIO_CONSOLES) {
5105 fprintf(stderr, "qemu: too many virtio consoles\n");
5106 exit(1);
5107 }
5108 virtio_consoles[virtio_console_index] = optarg;
5109 virtio_console_index++;
5110 break;
6508fe59
FB
5111 case QEMU_OPTION_parallel:
5112 if (parallel_device_index >= MAX_PARALLEL_PORTS) {
5113 fprintf(stderr, "qemu: too many parallel ports\n");
5114 exit(1);
5115 }
fd5f393a 5116 parallel_devices[parallel_device_index] = optarg;
6508fe59
FB
5117 parallel_device_index++;
5118 break;
d63d307f
FB
5119 case QEMU_OPTION_loadvm:
5120 loadvm = optarg;
5121 break;
5122 case QEMU_OPTION_full_screen:
5123 full_screen = 1;
5124 break;
667accab 5125#ifdef CONFIG_SDL
43523e93
TS
5126 case QEMU_OPTION_no_frame:
5127 no_frame = 1;
5128 break;
3780e197
TS
5129 case QEMU_OPTION_alt_grab:
5130 alt_grab = 1;
5131 break;
667accab
TS
5132 case QEMU_OPTION_no_quit:
5133 no_quit = 1;
5134 break;
7d957bd8
AL
5135 case QEMU_OPTION_sdl:
5136 sdl = 1;
5137 break;
667accab 5138#endif
f7cce898 5139 case QEMU_OPTION_pidfile:
93815bc2 5140 pid_file = optarg;
f7cce898 5141 break;
a09db21f
FB
5142#ifdef TARGET_I386
5143 case QEMU_OPTION_win2k_hack:
5144 win2k_install_hack = 1;
5145 break;
73822ec8
AL
5146 case QEMU_OPTION_rtc_td_hack:
5147 rtc_td_hack = 1;
5148 break;
8a92ea2f
AL
5149 case QEMU_OPTION_acpitable:
5150 if(acpi_table_add(optarg) < 0) {
5151 fprintf(stderr, "Wrong acpi table provided\n");
5152 exit(1);
5153 }
5154 break;
a09db21f 5155#endif
d993e026
FB
5156#ifdef USE_KQEMU
5157 case QEMU_OPTION_no_kqemu:
5158 kqemu_allowed = 0;
5159 break;
89bfc105
FB
5160 case QEMU_OPTION_kernel_kqemu:
5161 kqemu_allowed = 2;
5162 break;
7ba1e619
AL
5163#endif
5164#ifdef CONFIG_KVM
5165 case QEMU_OPTION_enable_kvm:
5166 kvm_allowed = 1;
5167#ifdef USE_KQEMU
5168 kqemu_allowed = 0;
5169#endif
5170 break;
d993e026 5171#endif
bb36d470
FB
5172 case QEMU_OPTION_usb:
5173 usb_enabled = 1;
5174 break;
a594cfbf
FB
5175 case QEMU_OPTION_usbdevice:
5176 usb_enabled = 1;
0d92ed30 5177 if (usb_devices_index >= MAX_USB_CMDLINE) {
a594cfbf
FB
5178 fprintf(stderr, "Too many USB devices\n");
5179 exit(1);
5180 }
fd5f393a 5181 usb_devices[usb_devices_index] = optarg;
a594cfbf
FB
5182 usb_devices_index++;
5183 break;
6a00d601
FB
5184 case QEMU_OPTION_smp:
5185 smp_cpus = atoi(optarg);
b2097003 5186 if (smp_cpus < 1) {
6a00d601
FB
5187 fprintf(stderr, "Invalid number of CPUs\n");
5188 exit(1);
5189 }
5190 break;
24236869 5191 case QEMU_OPTION_vnc:
73fc9742 5192 vnc_display = optarg;
24236869 5193 break;
6515b203
FB
5194 case QEMU_OPTION_no_acpi:
5195 acpi_enabled = 0;
5196 break;
16b29ae1
AL
5197 case QEMU_OPTION_no_hpet:
5198 no_hpet = 1;
5199 break;
d1beab82
FB
5200 case QEMU_OPTION_no_reboot:
5201 no_reboot = 1;
5202 break;
b2f76161
AJ
5203 case QEMU_OPTION_no_shutdown:
5204 no_shutdown = 1;
5205 break;
9467cd46
AZ
5206 case QEMU_OPTION_show_cursor:
5207 cursor_hide = 0;
5208 break;
8fcb1b90
BS
5209 case QEMU_OPTION_uuid:
5210 if(qemu_uuid_parse(optarg, qemu_uuid) < 0) {
5211 fprintf(stderr, "Fail to parse UUID string."
5212 " Wrong format.\n");
5213 exit(1);
5214 }
5215 break;
71e3ceb8
TS
5216 case QEMU_OPTION_daemonize:
5217 daemonize = 1;
5218 break;
9ae02555
TS
5219 case QEMU_OPTION_option_rom:
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] = optarg;
5225 nb_option_roms++;
5226 break;
8e71621f
PB
5227 case QEMU_OPTION_semihosting:
5228 semihosting_enabled = 1;
5229 break;
c35734b2
TS
5230 case QEMU_OPTION_name:
5231 qemu_name = optarg;
5232 break;
95efd11c 5233#if defined(TARGET_SPARC) || defined(TARGET_PPC)
66508601
BS
5234 case QEMU_OPTION_prom_env:
5235 if (nb_prom_envs >= MAX_PROM_ENVS) {
5236 fprintf(stderr, "Too many prom variables\n");
5237 exit(1);
5238 }
5239 prom_envs[nb_prom_envs] = optarg;
5240 nb_prom_envs++;
5241 break;
2b8f2d41
AZ
5242#endif
5243#ifdef TARGET_ARM
5244 case QEMU_OPTION_old_param:
5245 old_param = 1;
05ebd537 5246 break;
66508601 5247#endif
f3dcfada
TS
5248 case QEMU_OPTION_clock:
5249 configure_alarms(optarg);
5250 break;
7e0af5d0
FB
5251 case QEMU_OPTION_startdate:
5252 {
5253 struct tm tm;
f6503059 5254 time_t rtc_start_date;
7e0af5d0 5255 if (!strcmp(optarg, "now")) {
f6503059 5256 rtc_date_offset = -1;
7e0af5d0
FB
5257 } else {
5258 if (sscanf(optarg, "%d-%d-%dT%d:%d:%d",
5259 &tm.tm_year,
5260 &tm.tm_mon,
5261 &tm.tm_mday,
5262 &tm.tm_hour,
5263 &tm.tm_min,
5264 &tm.tm_sec) == 6) {
5265 /* OK */
5266 } else if (sscanf(optarg, "%d-%d-%d",
5267 &tm.tm_year,
5268 &tm.tm_mon,
5269 &tm.tm_mday) == 3) {
5270 tm.tm_hour = 0;
5271 tm.tm_min = 0;
5272 tm.tm_sec = 0;
5273 } else {
5274 goto date_fail;
5275 }
5276 tm.tm_year -= 1900;
5277 tm.tm_mon--;
3c6b2088 5278 rtc_start_date = mktimegm(&tm);
7e0af5d0
FB
5279 if (rtc_start_date == -1) {
5280 date_fail:
5281 fprintf(stderr, "Invalid date format. Valid format are:\n"
5282 "'now' or '2006-06-17T16:01:21' or '2006-06-17'\n");
5283 exit(1);
5284 }
f6503059 5285 rtc_date_offset = time(NULL) - rtc_start_date;
7e0af5d0
FB
5286 }
5287 }
5288 break;
26a5f13b
FB
5289 case QEMU_OPTION_tb_size:
5290 tb_size = strtol(optarg, NULL, 0);
5291 if (tb_size < 0)
5292 tb_size = 0;
5293 break;
2e70f6ef
PB
5294 case QEMU_OPTION_icount:
5295 use_icount = 1;
5296 if (strcmp(optarg, "auto") == 0) {
5297 icount_time_shift = -1;
5298 } else {
5299 icount_time_shift = strtol(optarg, NULL, 0);
5300 }
5301 break;
5bb7910a
AL
5302 case QEMU_OPTION_incoming:
5303 incoming = optarg;
5304 break;
0858532e
AL
5305 case QEMU_OPTION_chroot:
5306 chroot_dir = optarg;
5307 break;
5308 case QEMU_OPTION_runas:
5309 run_as = optarg;
5310 break;
cd6f1169 5311 }
0824d6fc
FB
5312 }
5313 }
330d0414 5314
7ba1e619
AL
5315#if defined(CONFIG_KVM) && defined(USE_KQEMU)
5316 if (kvm_allowed && kqemu_allowed) {
5317 fprintf(stderr,
5318 "You can not enable both KVM and kqemu at the same time\n");
5319 exit(1);
5320 }
5321#endif
5322
3d878caa 5323 machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
b2097003
AL
5324 if (smp_cpus > machine->max_cpus) {
5325 fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus "
5326 "supported by machine `%s' (%d)\n", smp_cpus, machine->name,
5327 machine->max_cpus);
5328 exit(1);
5329 }
5330
bc0129d9
AL
5331 if (nographic) {
5332 if (serial_device_index == 0)
5333 serial_devices[0] = "stdio";
5334 if (parallel_device_index == 0)
5335 parallel_devices[0] = "null";
5336 if (strncmp(monitor_device, "vc", 2) == 0)
5337 monitor_device = "stdio";
5338 }
5339
71e3ceb8 5340#ifndef _WIN32
71e3ceb8
TS
5341 if (daemonize) {
5342 pid_t pid;
5343
5344 if (pipe(fds) == -1)
5345 exit(1);
5346
5347 pid = fork();
5348 if (pid > 0) {
5349 uint8_t status;
5350 ssize_t len;
5351
5352 close(fds[1]);
5353
5354 again:
93815bc2
TS
5355 len = read(fds[0], &status, 1);
5356 if (len == -1 && (errno == EINTR))
5357 goto again;
5358
5359 if (len != 1)
5360 exit(1);
5361 else if (status == 1) {
5362 fprintf(stderr, "Could not acquire pidfile\n");
5363 exit(1);
5364 } else
5365 exit(0);
71e3ceb8 5366 } else if (pid < 0)
93815bc2 5367 exit(1);
71e3ceb8
TS
5368
5369 setsid();
5370
5371 pid = fork();
5372 if (pid > 0)
5373 exit(0);
5374 else if (pid < 0)
5375 exit(1);
5376
5377 umask(027);
71e3ceb8
TS
5378
5379 signal(SIGTSTP, SIG_IGN);
5380 signal(SIGTTOU, SIG_IGN);
5381 signal(SIGTTIN, SIG_IGN);
5382 }
5383#endif
5384
aa26bb2d 5385 if (pid_file && qemu_create_pidfile(pid_file) != 0) {
93815bc2
TS
5386 if (daemonize) {
5387 uint8_t status = 1;
5388 write(fds[1], &status, 1);
5389 } else
5390 fprintf(stderr, "Could not acquire pid file\n");
5391 exit(1);
5392 }
5393
ff3fbb30
FB
5394#ifdef USE_KQEMU
5395 if (smp_cpus > 1)
5396 kqemu_allowed = 0;
5397#endif
a20dd508 5398 linux_boot = (kernel_filename != NULL);
7317b8ca 5399 net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
6c41b272 5400
28c5af54 5401 if (!linux_boot && net_boot == 0 &&
f88e4b91 5402 !machine->nodisk_ok && nb_drives_opt == 0)
15f82208 5403 help(1);
0824d6fc 5404
f8d39c01
TS
5405 if (!linux_boot && *kernel_cmdline != '\0') {
5406 fprintf(stderr, "-append only allowed with -kernel option\n");
5407 exit(1);
5408 }
5409
5410 if (!linux_boot && initrd_filename != NULL) {
5411 fprintf(stderr, "-initrd only allowed with -kernel option\n");
5412 exit(1);
5413 }
5414
96d30e48 5415 /* boot to floppy or the default cd if no hard disk defined yet */
28c5af54 5416 if (!boot_devices[0]) {
e4bcb14c 5417 boot_devices = "cad";
96d30e48 5418 }
b118d61e 5419 setvbuf(stdout, NULL, _IOLBF, 0);
3b46e624 5420
634fce96 5421 init_timers();
7183b4b4
AL
5422 if (init_timer_alarm() < 0) {
5423 fprintf(stderr, "could not initialize alarm timer\n");
5424 exit(1);
5425 }
2e70f6ef
PB
5426 if (use_icount && icount_time_shift < 0) {
5427 use_icount = 2;
5428 /* 125MIPS seems a reasonable initial guess at the guest speed.
5429 It will be corrected fairly quickly anyway. */
5430 icount_time_shift = 3;
5431 init_icount_adjust();
5432 }
634fce96 5433
fd1dff4b
FB
5434#ifdef _WIN32
5435 socket_init();
5436#endif
5437
7c9d8e07
FB
5438 /* init network clients */
5439 if (nb_net_clients == 0) {
5440 /* if no clients, we use a default config */
f441b28b
AL
5441 net_clients[nb_net_clients++] = "nic";
5442#ifdef CONFIG_SLIRP
5443 net_clients[nb_net_clients++] = "user";
5444#endif
c20709aa
FB
5445 }
5446
7c9d8e07 5447 for(i = 0;i < nb_net_clients; i++) {
9ad97e65 5448 if (net_client_parse(net_clients[i]) < 0)
7c9d8e07 5449 exit(1);
702c651c 5450 }
63a01ef8 5451 net_client_check();
f1510b2c 5452
eec85c2a 5453#ifdef TARGET_I386
ed494d87 5454 /* XXX: this should be moved in the PC machine instantiation code */
28c5af54
JM
5455 if (net_boot != 0) {
5456 int netroms = 0;
5457 for (i = 0; i < nb_nics && i < 4; i++) {
eec85c2a
TS
5458 const char *model = nd_table[i].model;
5459 char buf[1024];
28c5af54
JM
5460 if (net_boot & (1 << i)) {
5461 if (model == NULL)
5462 model = "ne2k_pci";
5463 snprintf(buf, sizeof(buf), "%s/pxe-%s.bin", bios_dir, model);
5464 if (get_image_size(buf) > 0) {
5465 if (nb_option_roms >= MAX_OPTION_ROMS) {
5466 fprintf(stderr, "Too many option ROMs\n");
5467 exit(1);
5468 }
5469 option_rom[nb_option_roms] = strdup(buf);
5470 nb_option_roms++;
5471 netroms++;
5472 }
5473 }
eec85c2a 5474 }
28c5af54 5475 if (netroms == 0) {
eec85c2a
TS
5476 fprintf(stderr, "No valid PXE rom found for network device\n");
5477 exit(1);
5478 }
eec85c2a
TS
5479 }
5480#endif
5481
dc72ac14
AZ
5482 /* init the bluetooth world */
5483 for (i = 0; i < nb_bt_opts; i++)
5484 if (bt_parse(bt_opts[i]))
5485 exit(1);
5486
0824d6fc 5487 /* init the memory */
7fb4fdcf
AZ
5488 phys_ram_size = machine->ram_require & ~RAMSIZE_FIXED;
5489
5490 if (machine->ram_require & RAMSIZE_FIXED) {
5491 if (ram_size > 0) {
5492 if (ram_size < phys_ram_size) {
cd940061
AJ
5493 fprintf(stderr, "Machine `%s' requires %llu bytes of memory\n",
5494 machine->name, (unsigned long long) phys_ram_size);
7fb4fdcf
AZ
5495 exit(-1);
5496 }
5497
5498 phys_ram_size = ram_size;
5499 } else
5500 ram_size = phys_ram_size;
5501 } else {
4fc5d071 5502 if (ram_size == 0)
7fb4fdcf
AZ
5503 ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
5504
5505 phys_ram_size += ram_size;
5506 }
9ae02555 5507
d993e026 5508 phys_ram_base = qemu_vmalloc(phys_ram_size);
7f7f9873
FB
5509 if (!phys_ram_base) {
5510 fprintf(stderr, "Could not allocate physical memory\n");
0824d6fc
FB
5511 exit(1);
5512 }
5513
26a5f13b
FB
5514 /* init the dynamic translator */
5515 cpu_exec_init_all(tb_size * 1024 * 1024);
5516
5905b2e5 5517 bdrv_init();
6512a2a7 5518 dma_helper_init();
c4b1fcc0 5519
e4bcb14c 5520 /* we always create the cdrom drive, even if no disk is there */
c4b1fcc0 5521
e4bcb14c 5522 if (nb_drives_opt < MAX_DRIVES)
609497ab 5523 drive_add(NULL, CDROM_ALIAS);
c4b1fcc0 5524
9d413d1d 5525 /* we always create at least one floppy */
33e3963e 5526
e4bcb14c 5527 if (nb_drives_opt < MAX_DRIVES)
609497ab 5528 drive_add(NULL, FD_ALIAS, 0);
86f55663 5529
9d413d1d
AZ
5530 /* we always create one sd slot, even if no card is in it */
5531
5532 if (nb_drives_opt < MAX_DRIVES)
609497ab 5533 drive_add(NULL, SD_ALIAS);
9d413d1d 5534
e4bcb14c
TS
5535 /* open the virtual block devices */
5536
5537 for(i = 0; i < nb_drives_opt; i++)
609497ab 5538 if (drive_init(&drives_opt[i], snapshot, machine) == -1)
e4bcb14c 5539 exit(1);
3e3d5815 5540
c88676f8 5541 register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
475e4277 5542 register_savevm_live("ram", 0, 3, ram_save_live, NULL, ram_load, NULL);
8a7ddc38 5543
3023f332
AL
5544#ifndef _WIN32
5545 /* must be after terminal init, SDL library changes signal handlers */
5546 termsig_setup();
5547#endif
5548
5549 /* Maintain compatibility with multiple stdio monitors */
5550 if (!strcmp(monitor_device,"stdio")) {
5551 for (i = 0; i < MAX_SERIAL_PORTS; i++) {
5552 const char *devname = serial_devices[i];
5553 if (devname && !strcmp(devname,"mon:stdio")) {
5554 monitor_device = NULL;
5555 break;
5556 } else if (devname && !strcmp(devname,"stdio")) {
5557 monitor_device = NULL;
5558 serial_devices[i] = "mon:stdio";
5559 break;
5560 }
5561 }
5562 }
5563
5564 if (kvm_enabled()) {
5565 int ret;
5566
5567 ret = kvm_init(smp_cpus);
5568 if (ret < 0) {
5569 fprintf(stderr, "failed to initialize KVM\n");
5570 exit(1);
5571 }
5572 }
5573
4c621805 5574 if (monitor_device) {
ceecf1d1 5575 monitor_hd = qemu_chr_open("monitor", monitor_device, NULL);
4c621805
AL
5576 if (!monitor_hd) {
5577 fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
5578 exit(1);
5579 }
5580 }
5581
2796dae0
AL
5582 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
5583 const char *devname = serial_devices[i];
5584 if (devname && strcmp(devname, "none")) {
5585 char label[32];
5586 snprintf(label, sizeof(label), "serial%d", i);
ceecf1d1 5587 serial_hds[i] = qemu_chr_open(label, devname, NULL);
2796dae0
AL
5588 if (!serial_hds[i]) {
5589 fprintf(stderr, "qemu: could not open serial device '%s'\n",
5590 devname);
5591 exit(1);
5592 }
5593 }
5594 }
5595
5596 for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
5597 const char *devname = parallel_devices[i];
5598 if (devname && strcmp(devname, "none")) {
5599 char label[32];
5600 snprintf(label, sizeof(label), "parallel%d", i);
ceecf1d1 5601 parallel_hds[i] = qemu_chr_open(label, devname, NULL);
2796dae0
AL
5602 if (!parallel_hds[i]) {
5603 fprintf(stderr, "qemu: could not open parallel device '%s'\n",
5604 devname);
5605 exit(1);
5606 }
5607 }
5608 }
5609
5610 for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) {
5611 const char *devname = virtio_consoles[i];
5612 if (devname && strcmp(devname, "none")) {
5613 char label[32];
5614 snprintf(label, sizeof(label), "virtcon%d", i);
ceecf1d1 5615 virtcon_hds[i] = qemu_chr_open(label, devname, NULL);
2796dae0
AL
5616 if (!virtcon_hds[i]) {
5617 fprintf(stderr, "qemu: could not open virtio console '%s'\n",
5618 devname);
5619 exit(1);
5620 }
5621 }
5622 }
5623
3023f332
AL
5624 machine->init(ram_size, vga_ram_size, boot_devices,
5625 kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
5626
6f338c34
AL
5627 current_machine = machine;
5628
3023f332
AL
5629 /* Set KVM's vcpu state to qemu's initial CPUState. */
5630 if (kvm_enabled()) {
5631 int ret;
5632
5633 ret = kvm_sync_vcpus();
5634 if (ret < 0) {
5635 fprintf(stderr, "failed to initialize vcpus\n");
5636 exit(1);
5637 }
5638 }
5639
5640 /* init USB devices */
5641 if (usb_enabled) {
5642 for(i = 0; i < usb_devices_index; i++) {
c0f4ce77 5643 if (usb_device_add(usb_devices[i], 0) < 0) {
3023f332
AL
5644 fprintf(stderr, "Warning: could not add USB device %s\n",
5645 usb_devices[i]);
5646 }
5647 }
5648 }
5649
8f391ab4
AL
5650 if (!display_state)
5651 dumb_display_init();
3023f332
AL
5652 /* just use the first displaystate for the moment */
5653 ds = display_state;
313aa567 5654 /* terminal init */
a20dd508 5655 if (nographic) {
4d3b6f6e
AZ
5656 if (curses) {
5657 fprintf(stderr, "fatal: -nographic can't be used with -curses\n");
5658 exit(1);
5659 }
7d957bd8 5660 } else {
4d3b6f6e 5661#if defined(CONFIG_CURSES)
7d957bd8
AL
5662 if (curses) {
5663 /* At the moment curses cannot be used with other displays */
5664 curses_display_init(ds, full_screen);
5665 } else
4d3b6f6e 5666#endif
7d957bd8
AL
5667 {
5668 if (vnc_display != NULL) {
5669 vnc_display_init(ds);
5670 if (vnc_display_open(ds, vnc_display) < 0)
5671 exit(1);
5672 }
5b0753e0 5673#if defined(CONFIG_SDL)
d268de04 5674 if (sdl || !vnc_display)
7d957bd8 5675 sdl_display_init(ds, full_screen, no_frame);
5b0753e0 5676#elif defined(CONFIG_COCOA)
d268de04 5677 if (sdl || !vnc_display)
7d957bd8 5678 cocoa_display_init(ds, full_screen);
313aa567 5679#endif
7d957bd8 5680 }
313aa567 5681 }
7d957bd8 5682 dpy_resize(ds);
5b08fc10 5683
3023f332
AL
5684 dcl = ds->listeners;
5685 while (dcl != NULL) {
5686 if (dcl->dpy_refresh != NULL) {
5687 ds->gui_timer = qemu_new_timer(rt_clock, gui_update, ds);
5688 qemu_mod_timer(ds->gui_timer, qemu_get_clock(rt_clock));
20d8a3ed 5689 }
3023f332 5690 dcl = dcl->next;
20d8a3ed 5691 }
3023f332 5692
9043b62d
BS
5693 if (nographic || (vnc_display && !sdl)) {
5694 nographic_timer = qemu_new_timer(rt_clock, nographic_update, NULL);
5695 qemu_mod_timer(nographic_timer, qemu_get_clock(rt_clock));
5696 }
5697
2796dae0 5698 text_consoles_set_display(display_state);
2970a6c9 5699 qemu_chr_initial_reset();
2796dae0 5700
4c621805 5701 if (monitor_device && monitor_hd)
cde76ee1 5702 monitor_init(monitor_hd, MONITOR_USE_READLINE | MONITOR_IS_DEFAULT);
82c643ff 5703
8d11df9e 5704 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
c03b0f0f 5705 const char *devname = serial_devices[i];
fd5f393a 5706 if (devname && strcmp(devname, "none")) {
5ccfae10
AL
5707 char label[32];
5708 snprintf(label, sizeof(label), "serial%d", i);
af3a9031 5709 if (strstart(devname, "vc", 0))
7ba1260a 5710 qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
8d11df9e 5711 }
82c643ff 5712 }
82c643ff 5713
6508fe59 5714 for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
c03b0f0f 5715 const char *devname = parallel_devices[i];
fd5f393a 5716 if (devname && strcmp(devname, "none")) {
5ccfae10
AL
5717 char label[32];
5718 snprintf(label, sizeof(label), "parallel%d", i);
af3a9031 5719 if (strstart(devname, "vc", 0))
7ba1260a 5720 qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
6508fe59
FB
5721 }
5722 }
5723
9ede2fde
AL
5724 for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) {
5725 const char *devname = virtio_consoles[i];
2796dae0 5726 if (virtcon_hds[i] && devname) {
9ede2fde
AL
5727 char label[32];
5728 snprintf(label, sizeof(label), "virtcon%d", i);
9ede2fde
AL
5729 if (strstart(devname, "vc", 0))
5730 qemu_chr_printf(virtcon_hds[i], "virtio console%d\r\n", i);
5731 }
5732 }
5733
67b915a5 5734#ifdef CONFIG_GDBSTUB
b4608c04 5735 if (use_gdbstub) {
c636bb66
FB
5736 /* XXX: use standard host:port notation and modify options
5737 accordingly. */
cfc3475a
PB
5738 if (gdbserver_start(gdbstub_port) < 0) {
5739 fprintf(stderr, "qemu: could not open gdbstub device on port '%s'\n",
c636bb66 5740 gdbstub_port);
8a7ddc38 5741 exit(1);
8a7ddc38 5742 }
45669e00 5743 }
67b915a5 5744#endif
45669e00 5745
d63d307f 5746 if (loadvm)
376253ec 5747 do_loadvm(cur_mon, loadvm);
d63d307f 5748
5bb7910a
AL
5749 if (incoming) {
5750 autostart = 0; /* fixme how to deal with -daemonize */
5751 qemu_start_incoming_migration(incoming);
5752 }
5753
c0f4ce77
AL
5754 if (autostart)
5755 vm_start();
ffd843bc 5756
71e3ceb8
TS
5757 if (daemonize) {
5758 uint8_t status = 0;
5759 ssize_t len;
71e3ceb8
TS
5760
5761 again1:
5762 len = write(fds[1], &status, 1);
5763 if (len == -1 && (errno == EINTR))
5764 goto again1;
5765
5766 if (len != 1)
5767 exit(1);
5768
bd54b863 5769 chdir("/");
aeb30be6 5770 TFR(fd = open("/dev/null", O_RDWR));
71e3ceb8
TS
5771 if (fd == -1)
5772 exit(1);
0858532e 5773 }
71e3ceb8 5774
0858532e
AL
5775#ifndef _WIN32
5776 if (run_as) {
5777 pwd = getpwnam(run_as);
5778 if (!pwd) {
5779 fprintf(stderr, "User \"%s\" doesn't exist\n", run_as);
5780 exit(1);
5781 }
5782 }
5783
5784 if (chroot_dir) {
5785 if (chroot(chroot_dir) < 0) {
5786 fprintf(stderr, "chroot failed\n");
5787 exit(1);
5788 }
5789 chdir("/");
5790 }
5791
5792 if (run_as) {
5793 if (setgid(pwd->pw_gid) < 0) {
5794 fprintf(stderr, "Failed to setgid(%d)\n", pwd->pw_gid);
5795 exit(1);
5796 }
5797 if (setuid(pwd->pw_uid) < 0) {
5798 fprintf(stderr, "Failed to setuid(%d)\n", pwd->pw_uid);
5799 exit(1);
5800 }
5801 if (setuid(0) != -1) {
5802 fprintf(stderr, "Dropping privileges failed\n");
5803 exit(1);
5804 }
5805 }
5806#endif
5807
5808 if (daemonize) {
5809 dup2(fd, 0);
5810 dup2(fd, 1);
5811 dup2(fd, 2);
71e3ceb8 5812
0858532e 5813 close(fd);
71e3ceb8
TS
5814 }
5815
8a7ddc38 5816 main_loop();
40c3bac3 5817 quit_timers();
63a01ef8 5818 net_cleanup();
b46a8906 5819
0824d6fc
FB
5820 return 0;
5821}