Statistics
| Branch: | Revision:

root / vl.c @ e8105ebb

History | View | Annotate | Download (154.3 kB)

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