Statistics
| Branch: | Revision:

root / vl.c @ 96560cb3

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