Statistics
| Branch: | Revision:

root / vl.c @ c5f32c99

History | View | Annotate | Download (154.5 kB)

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