Statistics
| Branch: | Revision:

root / vl.c @ 30c0c76c

History | View | Annotate | Download (153.9 kB)

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