Statistics
| Branch: | Revision:

root / vl.c @ f3dfda61

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