]> git.proxmox.com Git - qemu.git/blame - vl.c
password input support
[qemu.git] / vl.c
CommitLineData
0824d6fc 1/*
80cabfad 2 * QEMU System Emulator
0824d6fc 3 *
80cabfad 4 * Copyright (c) 2003-2004 Fabrice Bellard
0824d6fc 5 *
1df912cf
FB
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
0824d6fc 23 */
67b915a5
FB
24#include "vl.h"
25
0824d6fc 26#include <unistd.h>
0824d6fc
FB
27#include <fcntl.h>
28#include <signal.h>
29#include <time.h>
0824d6fc 30#include <errno.h>
67b915a5
FB
31#include <sys/time.h>
32
33#ifndef _WIN32
34#include <sys/times.h>
f1510b2c 35#include <sys/wait.h>
67b915a5
FB
36#include <termios.h>
37#include <sys/poll.h>
38#include <sys/mman.h>
f1510b2c
FB
39#include <sys/ioctl.h>
40#include <sys/socket.h>
7d3505c5
FB
41#ifdef _BSD
42#include <sys/stat.h>
83fb7adf 43#ifndef __APPLE__
7d3505c5 44#include <libutil.h>
83fb7adf 45#endif
7d3505c5 46#else
f1510b2c
FB
47#include <linux/if.h>
48#include <linux/if_tun.h>
7d3505c5
FB
49#include <pty.h>
50#include <malloc.h>
fd872598 51#include <linux/rtc.h>
67b915a5 52#endif
7d3505c5 53#endif
67b915a5 54
c20709aa
FB
55#if defined(CONFIG_SLIRP)
56#include "libslirp.h"
57#endif
58
67b915a5 59#ifdef _WIN32
7d3505c5 60#include <malloc.h>
67b915a5
FB
61#include <sys/timeb.h>
62#include <windows.h>
63#define getopt_long_only getopt_long
64#define memalign(align, size) malloc(size)
65#endif
66
73332e5c 67#ifdef CONFIG_SDL
96bcd4f8 68#ifdef __APPLE__
83fb7adf 69#include <SDL/SDL.h>
96bcd4f8 70#endif
7d3505c5 71#if defined(__linux__)
73332e5c
FB
72/* SDL use the pthreads and they modify sigaction. We don't
73 want that. */
7d3505c5 74#if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2))
73332e5c
FB
75extern void __libc_sigaction();
76#define sigaction(sig, act, oact) __libc_sigaction(sig, act, oact)
77#else
78extern void __sigaction();
79#define sigaction(sig, act, oact) __sigaction(sig, act, oact)
80#endif
7d3505c5 81#endif /* __linux__ */
73332e5c 82#endif /* CONFIG_SDL */
0824d6fc 83
0824d6fc 84#include "disas.h"
fc01f7e7 85
8a7ddc38 86#include "exec-all.h"
0824d6fc 87
a541f297
FB
88//#define DO_TB_FLUSH
89
5a67135a 90#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
f1510b2c 91
0824d6fc 92//#define DEBUG_UNUSED_IOPORT
fd872598 93//#define DEBUG_IOPORT
330d0414 94
bb551faa 95#if !defined(CONFIG_SOFTMMU)
7916e224 96#define PHYS_RAM_MAX_SIZE (256 * 1024 * 1024)
bb551faa
FB
97#else
98#define PHYS_RAM_MAX_SIZE (2047 * 1024 * 1024)
99#endif
7916e224 100
77d4bc34
FB
101#ifdef TARGET_PPC
102#define DEFAULT_RAM_SIZE 144
103#else
1bfe856e 104#define DEFAULT_RAM_SIZE 128
77d4bc34 105#endif
8a7ddc38
FB
106/* in ms */
107#define GUI_REFRESH_INTERVAL 30
313aa567 108
7dea1da4
FB
109/* XXX: use a two level table to limit memory usage */
110#define MAX_IOPORTS 65536
0824d6fc 111
80cabfad 112const char *bios_dir = CONFIG_QEMU_SHAREDIR;
0824d6fc 113char phys_ram_file[1024];
c45886db
FB
114CPUState *global_env;
115CPUState *cpu_single_env;
c4b1fcc0 116void *ioport_opaque[MAX_IOPORTS];
fc01f7e7
FB
117IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
118IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
c45886db 119BlockDriverState *bs_table[MAX_DISKS], *fd_table[MAX_FD];
313aa567 120int vga_ram_size;
0ced6589 121int bios_size;
313aa567 122static DisplayState display_state;
a20dd508 123int nographic;
313aa567 124int64_t ticks_per_sec;
36b486bb 125int boot_device = 'c';
0ced6589 126int ram_size;
80cabfad
FB
127static char network_script[1024];
128int pit_min_timer_count = 0;
c4b1fcc0
FB
129int nb_nics;
130NetDriverState nd_table[MAX_NICS];
8a7ddc38
FB
131QEMUTimer *gui_timer;
132int vm_running;
aaaa7df6 133int audio_enabled = 0;
bb0c6722 134int pci_enabled = 1;
77d4bc34 135int prep_enabled = 0;
ee22c2f7 136int rtc_utc = 1;
1bfe856e
FB
137int cirrus_vga_enabled = 1;
138int graphic_width = 800;
139int graphic_height = 600;
e9b137c2 140int graphic_depth = 15;
82c643ff 141TextConsole *vga_console;
0824d6fc
FB
142
143/***********************************************************/
26aa7d72
FB
144/* x86 ISA bus support */
145
146target_phys_addr_t isa_mem_base = 0;
0824d6fc 147
c4b1fcc0 148uint32_t default_ioport_readb(void *opaque, uint32_t address)
0824d6fc
FB
149{
150#ifdef DEBUG_UNUSED_IOPORT
151 fprintf(stderr, "inb: port=0x%04x\n", address);
152#endif
fc01f7e7 153 return 0xff;
0824d6fc
FB
154}
155
c4b1fcc0 156void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
0824d6fc
FB
157{
158#ifdef DEBUG_UNUSED_IOPORT
159 fprintf(stderr, "outb: port=0x%04x data=0x%02x\n", address, data);
160#endif
161}
162
163/* default is to make two byte accesses */
c4b1fcc0 164uint32_t default_ioport_readw(void *opaque, uint32_t address)
0824d6fc
FB
165{
166 uint32_t data;
db45c29a
FB
167 data = ioport_read_table[0][address](ioport_opaque[address], address);
168 address = (address + 1) & (MAX_IOPORTS - 1);
169 data |= ioport_read_table[0][address](ioport_opaque[address], address) << 8;
0824d6fc
FB
170 return data;
171}
172
c4b1fcc0 173void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
0824d6fc 174{
db45c29a
FB
175 ioport_write_table[0][address](ioport_opaque[address], address, data & 0xff);
176 address = (address + 1) & (MAX_IOPORTS - 1);
177 ioport_write_table[0][address](ioport_opaque[address], address, (data >> 8) & 0xff);
0824d6fc
FB
178}
179
c4b1fcc0 180uint32_t default_ioport_readl(void *opaque, uint32_t address)
0824d6fc 181{
fc01f7e7
FB
182#ifdef DEBUG_UNUSED_IOPORT
183 fprintf(stderr, "inl: port=0x%04x\n", address);
184#endif
185 return 0xffffffff;
0824d6fc
FB
186}
187
c4b1fcc0 188void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
0824d6fc 189{
fc01f7e7
FB
190#ifdef DEBUG_UNUSED_IOPORT
191 fprintf(stderr, "outl: port=0x%04x data=0x%02x\n", address, data);
192#endif
0824d6fc
FB
193}
194
fc01f7e7 195void init_ioports(void)
0824d6fc
FB
196{
197 int i;
198
fc01f7e7
FB
199 for(i = 0; i < MAX_IOPORTS; i++) {
200 ioport_read_table[0][i] = default_ioport_readb;
201 ioport_write_table[0][i] = default_ioport_writeb;
202 ioport_read_table[1][i] = default_ioport_readw;
203 ioport_write_table[1][i] = default_ioport_writew;
204 ioport_read_table[2][i] = default_ioport_readl;
205 ioport_write_table[2][i] = default_ioport_writel;
206 }
0824d6fc
FB
207}
208
fc01f7e7 209/* size is the word size in byte */
c4b1fcc0
FB
210int register_ioport_read(int start, int length, int size,
211 IOPortReadFunc *func, void *opaque)
f1510b2c 212{
fc01f7e7 213 int i, bsize;
f1510b2c 214
c4b1fcc0 215 if (size == 1) {
fc01f7e7 216 bsize = 0;
c4b1fcc0 217 } else if (size == 2) {
fc01f7e7 218 bsize = 1;
c4b1fcc0 219 } else if (size == 4) {
fc01f7e7 220 bsize = 2;
c4b1fcc0
FB
221 } else {
222 hw_error("register_ioport_read: invalid size");
fc01f7e7 223 return -1;
c4b1fcc0
FB
224 }
225 for(i = start; i < start + length; i += size) {
fc01f7e7 226 ioport_read_table[bsize][i] = func;
c4b1fcc0
FB
227 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
228 hw_error("register_ioport_read: invalid opaque");
229 ioport_opaque[i] = opaque;
230 }
f1510b2c
FB
231 return 0;
232}
233
fc01f7e7 234/* size is the word size in byte */
c4b1fcc0
FB
235int register_ioport_write(int start, int length, int size,
236 IOPortWriteFunc *func, void *opaque)
f1510b2c 237{
fc01f7e7 238 int i, bsize;
f1510b2c 239
c4b1fcc0 240 if (size == 1) {
fc01f7e7 241 bsize = 0;
c4b1fcc0 242 } else if (size == 2) {
fc01f7e7 243 bsize = 1;
c4b1fcc0 244 } else if (size == 4) {
fc01f7e7 245 bsize = 2;
c4b1fcc0
FB
246 } else {
247 hw_error("register_ioport_write: invalid size");
fc01f7e7 248 return -1;
c4b1fcc0
FB
249 }
250 for(i = start; i < start + length; i += size) {
fc01f7e7 251 ioport_write_table[bsize][i] = func;
c4b1fcc0
FB
252 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
253 hw_error("register_ioport_read: invalid opaque");
254 ioport_opaque[i] = opaque;
255 }
f1510b2c
FB
256 return 0;
257}
258
69b91039
FB
259void isa_unassign_ioport(int start, int length)
260{
261 int i;
262
263 for(i = start; i < start + length; i++) {
264 ioport_read_table[0][i] = default_ioport_readb;
265 ioport_read_table[1][i] = default_ioport_readw;
266 ioport_read_table[2][i] = default_ioport_readl;
267
268 ioport_write_table[0][i] = default_ioport_writeb;
269 ioport_write_table[1][i] = default_ioport_writew;
270 ioport_write_table[2][i] = default_ioport_writel;
271 }
272}
273
0824d6fc
FB
274void pstrcpy(char *buf, int buf_size, const char *str)
275{
276 int c;
277 char *q = buf;
278
279 if (buf_size <= 0)
280 return;
281
282 for(;;) {
283 c = *str++;
284 if (c == 0 || q >= buf + buf_size - 1)
285 break;
286 *q++ = c;
287 }
288 *q = '\0';
289}
290
291/* strcat and truncate. */
292char *pstrcat(char *buf, int buf_size, const char *s)
293{
294 int len;
295 len = strlen(buf);
296 if (len < buf_size)
297 pstrcpy(buf + len, buf_size - len, s);
298 return buf;
299}
300
82c643ff
FB
301int strstart(const char *str, const char *val, const char **ptr)
302{
303 const char *p, *q;
304 p = str;
305 q = val;
306 while (*q != '\0') {
307 if (*p != *q)
308 return 0;
309 p++;
310 q++;
311 }
312 if (ptr)
313 *ptr = p;
314 return 1;
315}
316
7587cf44
FB
317/* return the size or -1 if error */
318int get_image_size(const char *filename)
319{
320 int fd, size;
321 fd = open(filename, O_RDONLY | O_BINARY);
322 if (fd < 0)
323 return -1;
324 size = lseek(fd, 0, SEEK_END);
325 close(fd);
326 return size;
327}
328
0824d6fc
FB
329/* return the size or -1 if error */
330int load_image(const char *filename, uint8_t *addr)
331{
332 int fd, size;
40c3bac3 333 fd = open(filename, O_RDONLY | O_BINARY);
0824d6fc
FB
334 if (fd < 0)
335 return -1;
336 size = lseek(fd, 0, SEEK_END);
337 lseek(fd, 0, SEEK_SET);
338 if (read(fd, addr, size) != size) {
339 close(fd);
340 return -1;
341 }
342 close(fd);
343 return size;
344}
345
c45886db 346void cpu_outb(CPUState *env, int addr, int val)
0824d6fc 347{
fd872598
FB
348#ifdef DEBUG_IOPORT
349 if (loglevel & CPU_LOG_IOPORT)
350 fprintf(logfile, "outb: %04x %02x\n", addr, val);
351#endif
c4b1fcc0 352 ioport_write_table[0][addr](ioport_opaque[addr], addr, val);
0824d6fc
FB
353}
354
c45886db 355void cpu_outw(CPUState *env, int addr, int val)
0824d6fc 356{
fd872598
FB
357#ifdef DEBUG_IOPORT
358 if (loglevel & CPU_LOG_IOPORT)
359 fprintf(logfile, "outw: %04x %04x\n", addr, val);
360#endif
c4b1fcc0 361 ioport_write_table[1][addr](ioport_opaque[addr], addr, val);
0824d6fc
FB
362}
363
c45886db 364void cpu_outl(CPUState *env, int addr, int val)
0824d6fc 365{
fd872598
FB
366#ifdef DEBUG_IOPORT
367 if (loglevel & CPU_LOG_IOPORT)
368 fprintf(logfile, "outl: %04x %08x\n", addr, val);
369#endif
c4b1fcc0 370 ioport_write_table[2][addr](ioport_opaque[addr], addr, val);
0824d6fc
FB
371}
372
c45886db 373int cpu_inb(CPUState *env, int addr)
0824d6fc 374{
fd872598 375 int val;
fd872598
FB
376 val = ioport_read_table[0][addr](ioport_opaque[addr], addr);
377#ifdef DEBUG_IOPORT
378 if (loglevel & CPU_LOG_IOPORT)
379 fprintf(logfile, "inb : %04x %02x\n", addr, val);
380#endif
381 return val;
0824d6fc
FB
382}
383
c45886db 384int cpu_inw(CPUState *env, int addr)
0824d6fc 385{
fd872598 386 int val;
fd872598
FB
387 val = ioport_read_table[1][addr](ioport_opaque[addr], addr);
388#ifdef DEBUG_IOPORT
389 if (loglevel & CPU_LOG_IOPORT)
390 fprintf(logfile, "inw : %04x %04x\n", addr, val);
391#endif
392 return val;
0824d6fc
FB
393}
394
c45886db 395int cpu_inl(CPUState *env, int addr)
0824d6fc 396{
fd872598 397 int val;
fd872598
FB
398 val = ioport_read_table[2][addr](ioport_opaque[addr], addr);
399#ifdef DEBUG_IOPORT
400 if (loglevel & CPU_LOG_IOPORT)
401 fprintf(logfile, "inl : %04x %08x\n", addr, val);
402#endif
403 return val;
0824d6fc
FB
404}
405
406/***********************************************************/
0824d6fc
FB
407void hw_error(const char *fmt, ...)
408{
409 va_list ap;
410
411 va_start(ap, fmt);
412 fprintf(stderr, "qemu: hardware error: ");
413 vfprintf(stderr, fmt, ap);
414 fprintf(stderr, "\n");
415#ifdef TARGET_I386
416 cpu_x86_dump_state(global_env, stderr, X86_DUMP_FPU | X86_DUMP_CCOP);
c45886db
FB
417#else
418 cpu_dump_state(global_env, stderr, 0);
0824d6fc
FB
419#endif
420 va_end(ap);
421 abort();
422}
423
63066f4f
FB
424/***********************************************************/
425/* keyboard/mouse */
426
427static QEMUPutKBDEvent *qemu_put_kbd_event;
428static void *qemu_put_kbd_event_opaque;
429static QEMUPutMouseEvent *qemu_put_mouse_event;
430static void *qemu_put_mouse_event_opaque;
431
432void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
433{
434 qemu_put_kbd_event_opaque = opaque;
435 qemu_put_kbd_event = func;
436}
437
438void qemu_add_mouse_event_handler(QEMUPutMouseEvent *func, void *opaque)
439{
440 qemu_put_mouse_event_opaque = opaque;
441 qemu_put_mouse_event = func;
442}
443
444void kbd_put_keycode(int keycode)
445{
446 if (qemu_put_kbd_event) {
447 qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
448 }
449}
450
451void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
452{
453 if (qemu_put_mouse_event) {
454 qemu_put_mouse_event(qemu_put_mouse_event_opaque,
455 dx, dy, dz, buttons_state);
456 }
457}
458
8a7ddc38
FB
459/***********************************************************/
460/* timers */
461
34865134
FB
462#if defined(__powerpc__)
463
464static inline uint32_t get_tbl(void)
0824d6fc 465{
34865134
FB
466 uint32_t tbl;
467 asm volatile("mftb %0" : "=r" (tbl));
468 return tbl;
0824d6fc
FB
469}
470
34865134
FB
471static inline uint32_t get_tbu(void)
472{
473 uint32_t tbl;
474 asm volatile("mftbu %0" : "=r" (tbl));
475 return tbl;
476}
477
478int64_t cpu_get_real_ticks(void)
479{
480 uint32_t l, h, h1;
481 /* NOTE: we test if wrapping has occurred */
482 do {
483 h = get_tbu();
484 l = get_tbl();
485 h1 = get_tbu();
486 } while (h != h1);
487 return ((int64_t)h << 32) | l;
488}
489
490#elif defined(__i386__)
491
492int64_t cpu_get_real_ticks(void)
0824d6fc
FB
493{
494 int64_t val;
e463b581 495 asm volatile ("rdtsc" : "=A" (val));
0824d6fc
FB
496 return val;
497}
498
1115dde7
FB
499#elif defined(__x86_64__)
500
501int64_t cpu_get_real_ticks(void)
502{
503 uint32_t low,high;
504 int64_t val;
505 asm volatile("rdtsc" : "=a" (low), "=d" (high));
506 val = high;
507 val <<= 32;
508 val |= low;
509 return val;
510}
511
34865134
FB
512#else
513#error unsupported CPU
514#endif
515
516static int64_t cpu_ticks_offset;
8a7ddc38 517static int cpu_ticks_enabled;
34865134 518
8a7ddc38 519static inline int64_t cpu_get_ticks(void)
34865134 520{
8a7ddc38
FB
521 if (!cpu_ticks_enabled) {
522 return cpu_ticks_offset;
523 } else {
524 return cpu_get_real_ticks() + cpu_ticks_offset;
525 }
34865134
FB
526}
527
528/* enable cpu_get_ticks() */
529void cpu_enable_ticks(void)
530{
8a7ddc38
FB
531 if (!cpu_ticks_enabled) {
532 cpu_ticks_offset -= cpu_get_real_ticks();
533 cpu_ticks_enabled = 1;
534 }
34865134
FB
535}
536
537/* disable cpu_get_ticks() : the clock is stopped. You must not call
538 cpu_get_ticks() after that. */
539void cpu_disable_ticks(void)
540{
8a7ddc38
FB
541 if (cpu_ticks_enabled) {
542 cpu_ticks_offset = cpu_get_ticks();
543 cpu_ticks_enabled = 0;
544 }
34865134
FB
545}
546
67b915a5 547static int64_t get_clock(void)
34865134 548{
67b915a5
FB
549#ifdef _WIN32
550 struct _timeb tb;
551 _ftime(&tb);
552 return ((int64_t)tb.time * 1000 + (int64_t)tb.millitm) * 1000;
553#else
34865134
FB
554 struct timeval tv;
555 gettimeofday(&tv, NULL);
556 return tv.tv_sec * 1000000LL + tv.tv_usec;
67b915a5 557#endif
34865134
FB
558}
559
0824d6fc
FB
560void cpu_calibrate_ticks(void)
561{
562 int64_t usec, ticks;
563
564 usec = get_clock();
8a7ddc38 565 ticks = cpu_get_real_ticks();
67b915a5
FB
566#ifdef _WIN32
567 Sleep(50);
568#else
0824d6fc 569 usleep(50 * 1000);
67b915a5 570#endif
0824d6fc 571 usec = get_clock() - usec;
8a7ddc38 572 ticks = cpu_get_real_ticks() - ticks;
0824d6fc
FB
573 ticks_per_sec = (ticks * 1000000LL + (usec >> 1)) / usec;
574}
575
87858c89 576/* compute with 96 bit intermediate result: (a*b)/c */
80cabfad 577uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
87858c89
FB
578{
579 union {
580 uint64_t ll;
581 struct {
582#ifdef WORDS_BIGENDIAN
583 uint32_t high, low;
584#else
585 uint32_t low, high;
586#endif
587 } l;
588 } u, res;
589 uint64_t rl, rh;
590
591 u.ll = a;
592 rl = (uint64_t)u.l.low * (uint64_t)b;
593 rh = (uint64_t)u.l.high * (uint64_t)b;
594 rh += (rl >> 32);
595 res.l.high = rh / c;
596 res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
597 return res.ll;
598}
599
8a7ddc38
FB
600#define QEMU_TIMER_REALTIME 0
601#define QEMU_TIMER_VIRTUAL 1
602
603struct QEMUClock {
604 int type;
605 /* XXX: add frequency */
606};
607
608struct QEMUTimer {
609 QEMUClock *clock;
610 int64_t expire_time;
611 QEMUTimerCB *cb;
612 void *opaque;
613 struct QEMUTimer *next;
614};
615
616QEMUClock *rt_clock;
617QEMUClock *vm_clock;
618
619static QEMUTimer *active_timers[2];
40c3bac3
FB
620#ifdef _WIN32
621static MMRESULT timerID;
622#else
8a7ddc38
FB
623/* frequency of the times() clock tick */
624static int timer_freq;
67b915a5 625#endif
8a7ddc38
FB
626
627QEMUClock *qemu_new_clock(int type)
628{
629 QEMUClock *clock;
630 clock = qemu_mallocz(sizeof(QEMUClock));
631 if (!clock)
632 return NULL;
633 clock->type = type;
634 return clock;
635}
636
637QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
638{
639 QEMUTimer *ts;
640
641 ts = qemu_mallocz(sizeof(QEMUTimer));
642 ts->clock = clock;
643 ts->cb = cb;
644 ts->opaque = opaque;
645 return ts;
646}
647
648void qemu_free_timer(QEMUTimer *ts)
649{
650 qemu_free(ts);
651}
652
653/* stop a timer, but do not dealloc it */
654void qemu_del_timer(QEMUTimer *ts)
655{
656 QEMUTimer **pt, *t;
657
658 /* NOTE: this code must be signal safe because
659 qemu_timer_expired() can be called from a signal. */
660 pt = &active_timers[ts->clock->type];
661 for(;;) {
662 t = *pt;
663 if (!t)
664 break;
665 if (t == ts) {
666 *pt = t->next;
667 break;
668 }
669 pt = &t->next;
670 }
671}
672
673/* modify the current timer so that it will be fired when current_time
674 >= expire_time. The corresponding callback will be called. */
675void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
676{
677 QEMUTimer **pt, *t;
678
679 qemu_del_timer(ts);
680
681 /* add the timer in the sorted list */
682 /* NOTE: this code must be signal safe because
683 qemu_timer_expired() can be called from a signal. */
684 pt = &active_timers[ts->clock->type];
685 for(;;) {
686 t = *pt;
687 if (!t)
688 break;
689 if (t->expire_time > expire_time)
690 break;
691 pt = &t->next;
692 }
693 ts->expire_time = expire_time;
694 ts->next = *pt;
695 *pt = ts;
696}
697
698int qemu_timer_pending(QEMUTimer *ts)
699{
700 QEMUTimer *t;
701 for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
702 if (t == ts)
703 return 1;
704 }
705 return 0;
706}
707
708static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
709{
710 if (!timer_head)
711 return 0;
712 return (timer_head->expire_time <= current_time);
713}
714
715static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
716{
717 QEMUTimer *ts;
718
719 for(;;) {
720 ts = *ptimer_head;
721 if (ts->expire_time > current_time)
722 break;
723 /* remove timer from the list before calling the callback */
724 *ptimer_head = ts->next;
725 ts->next = NULL;
726
727 /* run the callback (the timer list can be modified) */
728 ts->cb(ts->opaque);
729 }
730}
731
732int64_t qemu_get_clock(QEMUClock *clock)
733{
734 switch(clock->type) {
735 case QEMU_TIMER_REALTIME:
67b915a5
FB
736#ifdef _WIN32
737 return GetTickCount();
738#else
7d3505c5
FB
739 {
740 struct tms tp;
741
742 /* Note that using gettimeofday() is not a good solution
743 for timers because its value change when the date is
744 modified. */
745 if (timer_freq == 100) {
746 return times(&tp) * 10;
747 } else {
748 return ((int64_t)times(&tp) * 1000) / timer_freq;
749 }
8a7ddc38 750 }
67b915a5 751#endif
8a7ddc38
FB
752 default:
753 case QEMU_TIMER_VIRTUAL:
754 return cpu_get_ticks();
755 }
756}
757
758/* save a timer */
759void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
760{
761 uint64_t expire_time;
762
763 if (qemu_timer_pending(ts)) {
764 expire_time = ts->expire_time;
765 } else {
766 expire_time = -1;
767 }
768 qemu_put_be64(f, expire_time);
769}
770
771void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
772{
773 uint64_t expire_time;
774
775 expire_time = qemu_get_be64(f);
776 if (expire_time != -1) {
777 qemu_mod_timer(ts, expire_time);
778 } else {
779 qemu_del_timer(ts);
780 }
781}
782
783static void timer_save(QEMUFile *f, void *opaque)
784{
785 if (cpu_ticks_enabled) {
786 hw_error("cannot save state if virtual timers are running");
787 }
788 qemu_put_be64s(f, &cpu_ticks_offset);
789 qemu_put_be64s(f, &ticks_per_sec);
790}
791
792static int timer_load(QEMUFile *f, void *opaque, int version_id)
793{
794 if (version_id != 1)
795 return -EINVAL;
796 if (cpu_ticks_enabled) {
797 return -EINVAL;
798 }
799 qemu_get_be64s(f, &cpu_ticks_offset);
800 qemu_get_be64s(f, &ticks_per_sec);
801 return 0;
802}
803
67b915a5
FB
804#ifdef _WIN32
805void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
806 DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
807#else
8a7ddc38 808static void host_alarm_handler(int host_signum)
67b915a5 809#endif
8a7ddc38 810{
02ba45c5
FB
811#if 0
812#define DISP_FREQ 1000
813 {
814 static int64_t delta_min = INT64_MAX;
815 static int64_t delta_max, delta_cum, last_clock, delta, ti;
816 static int count;
817 ti = qemu_get_clock(vm_clock);
818 if (last_clock != 0) {
819 delta = ti - last_clock;
820 if (delta < delta_min)
821 delta_min = delta;
822 if (delta > delta_max)
823 delta_max = delta;
824 delta_cum += delta;
825 if (++count == DISP_FREQ) {
826 printf("timer: min=%lld us max=%lld us avg=%lld us avg_freq=%0.3f Hz\n",
827 muldiv64(delta_min, 1000000, ticks_per_sec),
828 muldiv64(delta_max, 1000000, ticks_per_sec),
829 muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
830 (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
831 count = 0;
832 delta_min = INT64_MAX;
833 delta_max = 0;
834 delta_cum = 0;
835 }
836 }
837 last_clock = ti;
838 }
839#endif
8a7ddc38
FB
840 if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
841 qemu_get_clock(vm_clock)) ||
842 qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
843 qemu_get_clock(rt_clock))) {
844 /* stop the cpu because a timer occured */
845 cpu_interrupt(global_env, CPU_INTERRUPT_EXIT);
846 }
847}
848
fd872598
FB
849#ifndef _WIN32
850
829309c7
FB
851#if defined(__linux__)
852
fd872598
FB
853#define RTC_FREQ 1024
854
855static int rtc_fd;
829309c7 856
fd872598
FB
857static int start_rtc_timer(void)
858{
859 rtc_fd = open("/dev/rtc", O_RDONLY);
860 if (rtc_fd < 0)
861 return -1;
862 if (ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
863 fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
864 "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
865 "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
866 goto fail;
867 }
868 if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
869 fail:
870 close(rtc_fd);
871 return -1;
872 }
873 pit_min_timer_count = PIT_FREQ / RTC_FREQ;
874 return 0;
875}
876
829309c7
FB
877#else
878
879static int start_rtc_timer(void)
880{
881 return -1;
882}
883
884#endif /* !defined(__linux__) */
885
886#endif /* !defined(_WIN32) */
fd872598 887
8a7ddc38
FB
888static void init_timers(void)
889{
8a7ddc38
FB
890 rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
891 vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
892
67b915a5
FB
893#ifdef _WIN32
894 {
895 int count=0;
40c3bac3
FB
896 timerID = timeSetEvent(10, // interval (ms)
897 0, // resolution
898 host_alarm_handler, // function
899 (DWORD)&count, // user parameter
900 TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
67b915a5
FB
901 if( !timerID ) {
902 perror("failed timer alarm");
903 exit(1);
904 }
905 }
906 pit_min_timer_count = ((uint64_t)10000 * PIT_FREQ) / 1000000;
907#else
908 {
909 struct sigaction act;
910 struct itimerval itv;
911
912 /* get times() syscall frequency */
913 timer_freq = sysconf(_SC_CLK_TCK);
914
915 /* timer signal */
916 sigfillset(&act.sa_mask);
917 act.sa_flags = 0;
8a7ddc38 918#if defined (TARGET_I386) && defined(USE_CODE_COPY)
67b915a5
FB
919 act.sa_flags |= SA_ONSTACK;
920#endif
921 act.sa_handler = host_alarm_handler;
922 sigaction(SIGALRM, &act, NULL);
fd872598 923
67b915a5
FB
924 itv.it_interval.tv_sec = 0;
925 itv.it_interval.tv_usec = 1000;
926 itv.it_value.tv_sec = 0;
927 itv.it_value.tv_usec = 10 * 1000;
928 setitimer(ITIMER_REAL, &itv, NULL);
929 /* we probe the tick duration of the kernel to inform the user if
930 the emulated kernel requested a too high timer frequency */
931 getitimer(ITIMER_REAL, &itv);
fd872598 932
83fb7adf 933#if defined(__linux__)
fd872598
FB
934 if (itv.it_interval.tv_usec > 1000) {
935 /* try to use /dev/rtc to have a faster timer */
936 if (start_rtc_timer() < 0)
937 goto use_itimer;
938 /* disable itimer */
939 itv.it_interval.tv_sec = 0;
940 itv.it_interval.tv_usec = 0;
941 itv.it_value.tv_sec = 0;
942 itv.it_value.tv_usec = 0;
943 setitimer(ITIMER_REAL, &itv, NULL);
944
945 /* use the RTC */
a1968d71 946 sigaction(SIGIO, &act, NULL);
fd872598
FB
947 fcntl(rtc_fd, F_SETFL, O_ASYNC);
948 fcntl(rtc_fd, F_SETOWN, getpid());
83fb7adf
FB
949 } else
950#endif /* defined(__linux__) */
951 {
fd872598
FB
952 use_itimer:
953 pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec *
954 PIT_FREQ) / 1000000;
955 }
67b915a5 956 }
8a7ddc38 957#endif
8a7ddc38
FB
958}
959
40c3bac3
FB
960void quit_timers(void)
961{
962#ifdef _WIN32
963 timeKillEvent(timerID);
964#endif
965}
966
c4b1fcc0 967/***********************************************************/
82c643ff 968/* character device */
313aa567 969
82c643ff
FB
970int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len)
971{
972 return s->chr_write(s, buf, len);
973}
67b915a5 974
82c643ff 975void qemu_chr_printf(CharDriverState *s, const char *fmt, ...)
67b915a5 976{
82c643ff
FB
977 char buf[4096];
978 va_list ap;
979 va_start(ap, fmt);
980 vsnprintf(buf, sizeof(buf), fmt, ap);
981 qemu_chr_write(s, buf, strlen(buf));
982 va_end(ap);
67b915a5
FB
983}
984
5905b2e5
FB
985void qemu_chr_send_event(CharDriverState *s, int event)
986{
987 if (s->chr_send_event)
988 s->chr_send_event(s, event);
989}
990
82c643ff
FB
991void qemu_chr_add_read_handler(CharDriverState *s,
992 IOCanRWHandler *fd_can_read,
993 IOReadHandler *fd_read, void *opaque)
994{
995 s->chr_add_read_handler(s, fd_can_read, fd_read, opaque);
996}
997
998void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event)
999{
1000 s->chr_event = chr_event;
1001}
67b915a5 1002
82c643ff 1003static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
313aa567 1004{
82c643ff
FB
1005 return len;
1006}
1007
1008static void null_chr_add_read_handler(CharDriverState *chr,
1009 IOCanRWHandler *fd_can_read,
1010 IOReadHandler *fd_read, void *opaque)
1011{
1012}
1013
1014CharDriverState *qemu_chr_open_null(void)
1015{
1016 CharDriverState *chr;
1017
1018 chr = qemu_mallocz(sizeof(CharDriverState));
1019 if (!chr)
1020 return NULL;
1021 chr->chr_write = null_chr_write;
1022 chr->chr_add_read_handler = null_chr_add_read_handler;
1023 return chr;
1024}
1025
1026#ifndef _WIN32
1027
1028typedef struct {
1029 int fd_in, fd_out;
1030 /* for nographic stdio only */
1031 IOCanRWHandler *fd_can_read;
1032 IOReadHandler *fd_read;
1033 void *fd_opaque;
1034} FDCharDriver;
1035
1036#define STDIO_MAX_CLIENTS 2
1037
1038static int stdio_nb_clients;
1039static CharDriverState *stdio_clients[STDIO_MAX_CLIENTS];
1040
1041static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1042{
1043 FDCharDriver *s = chr->opaque;
1044 return write(s->fd_out, buf, len);
1045}
1046
1047static void fd_chr_add_read_handler(CharDriverState *chr,
1048 IOCanRWHandler *fd_can_read,
1049 IOReadHandler *fd_read, void *opaque)
1050{
1051 FDCharDriver *s = chr->opaque;
1052
1053 if (nographic && s->fd_in == 0) {
1054 s->fd_can_read = fd_can_read;
1055 s->fd_read = fd_read;
1056 s->fd_opaque = opaque;
80cabfad 1057 } else {
82c643ff
FB
1058 qemu_add_fd_read_handler(s->fd_in, fd_can_read, fd_read, opaque);
1059 }
1060}
1061
1062/* open a character device to a unix fd */
1063CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
1064{
1065 CharDriverState *chr;
1066 FDCharDriver *s;
1067
1068 chr = qemu_mallocz(sizeof(CharDriverState));
1069 if (!chr)
1070 return NULL;
1071 s = qemu_mallocz(sizeof(FDCharDriver));
1072 if (!s) {
1073 free(chr);
1074 return NULL;
1075 }
1076 s->fd_in = fd_in;
1077 s->fd_out = fd_out;
1078 chr->opaque = s;
1079 chr->chr_write = fd_chr_write;
1080 chr->chr_add_read_handler = fd_chr_add_read_handler;
1081 return chr;
1082}
1083
1084/* for STDIO, we handle the case where several clients use it
1085 (nographic mode) */
1086
1087#define TERM_ESCAPE 0x01 /* ctrl-a is used for escape */
1088
1089static int term_got_escape, client_index;
1090
1091void term_print_help(void)
1092{
1093 printf("\n"
1094 "C-a h print this help\n"
1095 "C-a x exit emulator\n"
1096 "C-a s save disk data back to file (if -snapshot)\n"
1097 "C-a b send break (magic sysrq)\n"
1098 "C-a c switch between console and monitor\n"
1099 "C-a C-a send C-a\n"
1100 );
1101}
1102
1103/* called when a char is received */
1104static void stdio_received_byte(int ch)
1105{
1106 if (term_got_escape) {
1107 term_got_escape = 0;
1108 switch(ch) {
1109 case 'h':
1110 term_print_help();
1111 break;
1112 case 'x':
1113 exit(0);
1114 break;
1115 case 's':
1116 {
1117 int i;
1118 for (i = 0; i < MAX_DISKS; i++) {
1119 if (bs_table[i])
1120 bdrv_commit(bs_table[i]);
1121 }
1122 }
1123 break;
1124 case 'b':
1125 if (client_index < stdio_nb_clients) {
1126 CharDriverState *chr;
1127 FDCharDriver *s;
1128
1129 chr = stdio_clients[client_index];
1130 s = chr->opaque;
1131 chr->chr_event(s->fd_opaque, CHR_EVENT_BREAK);
1132 }
1133 break;
1134 case 'c':
1135 client_index++;
1136 if (client_index >= stdio_nb_clients)
1137 client_index = 0;
1138 if (client_index == 0) {
1139 /* send a new line in the monitor to get the prompt */
1140 ch = '\r';
1141 goto send_char;
1142 }
1143 break;
1144 case TERM_ESCAPE:
1145 goto send_char;
1146 }
1147 } else if (ch == TERM_ESCAPE) {
1148 term_got_escape = 1;
1149 } else {
1150 send_char:
1151 if (client_index < stdio_nb_clients) {
1152 uint8_t buf[1];
1153 CharDriverState *chr;
1154 FDCharDriver *s;
1155
1156 chr = stdio_clients[client_index];
1157 s = chr->opaque;
1158 buf[0] = ch;
1159 /* XXX: should queue the char if the device is not
1160 ready */
1161 if (s->fd_can_read(s->fd_opaque) > 0)
1162 s->fd_read(s->fd_opaque, buf, 1);
c4b1fcc0 1163 }
330d0414 1164 }
330d0414
FB
1165}
1166
82c643ff
FB
1167static int stdio_can_read(void *opaque)
1168{
1169 /* XXX: not strictly correct */
1170 return 1;
1171}
1172
1173static void stdio_read(void *opaque, const uint8_t *buf, int size)
1174{
1175 int i;
1176 for(i = 0; i < size; i++)
1177 stdio_received_byte(buf[i]);
1178}
1179
1180CharDriverState *qemu_chr_open_stdio(void)
1181{
1182 CharDriverState *chr;
1183
1184 if (nographic) {
1185 if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
1186 return NULL;
1187 chr = qemu_chr_open_fd(0, 1);
1188 if (stdio_nb_clients == 0)
1189 qemu_add_fd_read_handler(0, stdio_can_read, stdio_read, NULL);
1190 client_index = stdio_nb_clients;
1191 } else {
1192 if (stdio_nb_clients != 0)
1193 return NULL;
1194 chr = qemu_chr_open_fd(0, 1);
1195 }
1196 stdio_clients[stdio_nb_clients++] = chr;
1197 return chr;
1198}
1199
1200#if defined(__linux__)
1201CharDriverState *qemu_chr_open_pty(void)
1202{
1203 char slave_name[1024];
1204 int master_fd, slave_fd;
1205
1206 /* Not satisfying */
1207 if (openpty(&master_fd, &slave_fd, slave_name, NULL, NULL) < 0) {
1208 return NULL;
1209 }
1210 fprintf(stderr, "char device redirected to %s\n", slave_name);
1211 return qemu_chr_open_fd(master_fd, master_fd);
1212}
1213#else
1214CharDriverState *qemu_chr_open_pty(void)
1215{
1216 return NULL;
1217}
67b915a5
FB
1218#endif
1219
82c643ff
FB
1220#endif /* !defined(_WIN32) */
1221
1222CharDriverState *qemu_chr_open(const char *filename)
1223{
1224 if (!strcmp(filename, "vc")) {
1225 return text_console_init(&display_state);
1226 } else if (!strcmp(filename, "null")) {
1227 return qemu_chr_open_null();
1228 } else
1229#ifndef _WIN32
1230 if (!strcmp(filename, "pty")) {
1231 return qemu_chr_open_pty();
1232 } else if (!strcmp(filename, "stdio")) {
1233 return qemu_chr_open_stdio();
1234 } else
1235#endif
1236 {
1237 return NULL;
1238 }
1239}
1240
80cabfad 1241/***********************************************************/
c20709aa 1242/* Linux network device redirectors */
330d0414 1243
c20709aa
FB
1244void hex_dump(FILE *f, const uint8_t *buf, int size)
1245{
1246 int len, i, j, c;
1247
1248 for(i=0;i<size;i+=16) {
1249 len = size - i;
1250 if (len > 16)
1251 len = 16;
1252 fprintf(f, "%08x ", i);
1253 for(j=0;j<16;j++) {
1254 if (j < len)
1255 fprintf(f, " %02x", buf[i+j]);
1256 else
1257 fprintf(f, " ");
1258 }
1259 fprintf(f, " ");
1260 for(j=0;j<len;j++) {
1261 c = buf[i+j];
1262 if (c < ' ' || c > '~')
1263 c = '.';
1264 fprintf(f, "%c", c);
1265 }
1266 fprintf(f, "\n");
1267 }
1268}
1269
1270void qemu_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1271{
1272 nd->send_packet(nd, buf, size);
1273}
67b915a5 1274
c20709aa
FB
1275void qemu_add_read_packet(NetDriverState *nd, IOCanRWHandler *fd_can_read,
1276 IOReadHandler *fd_read, void *opaque)
67b915a5 1277{
c20709aa
FB
1278 nd->add_read_packet(nd, fd_can_read, fd_read, opaque);
1279}
1280
1281/* dummy network adapter */
1282
1283static void dummy_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1284{
1285}
1286
1287static void dummy_add_read_packet(NetDriverState *nd,
1288 IOCanRWHandler *fd_can_read,
1289 IOReadHandler *fd_read, void *opaque)
1290{
1291}
1292
1293static int net_dummy_init(NetDriverState *nd)
1294{
1295 nd->send_packet = dummy_send_packet;
1296 nd->add_read_packet = dummy_add_read_packet;
1297 pstrcpy(nd->ifname, sizeof(nd->ifname), "dummy");
67b915a5
FB
1298 return 0;
1299}
1300
c20709aa
FB
1301#if defined(CONFIG_SLIRP)
1302
1303/* slirp network adapter */
1304
1305static void *slirp_fd_opaque;
1306static IOCanRWHandler *slirp_fd_can_read;
1307static IOReadHandler *slirp_fd_read;
1308static int slirp_inited;
1309
1310int slirp_can_output(void)
1311{
1312 return slirp_fd_can_read(slirp_fd_opaque);
1313}
1314
1315void slirp_output(const uint8_t *pkt, int pkt_len)
67b915a5 1316{
c20709aa
FB
1317#if 0
1318 printf("output:\n");
1319 hex_dump(stdout, pkt, pkt_len);
1320#endif
1321 slirp_fd_read(slirp_fd_opaque, pkt, pkt_len);
67b915a5
FB
1322}
1323
c20709aa
FB
1324static void slirp_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1325{
1326#if 0
1327 printf("input:\n");
1328 hex_dump(stdout, buf, size);
1329#endif
1330 slirp_input(buf, size);
1331}
1332
1333static void slirp_add_read_packet(NetDriverState *nd,
1334 IOCanRWHandler *fd_can_read,
1335 IOReadHandler *fd_read, void *opaque)
1336{
1337 slirp_fd_opaque = opaque;
1338 slirp_fd_can_read = fd_can_read;
1339 slirp_fd_read = fd_read;
1340}
1341
1342static int net_slirp_init(NetDriverState *nd)
1343{
1344 if (!slirp_inited) {
1345 slirp_inited = 1;
1346 slirp_init();
1347 }
1348 nd->send_packet = slirp_send_packet;
1349 nd->add_read_packet = slirp_add_read_packet;
1350 pstrcpy(nd->ifname, sizeof(nd->ifname), "slirp");
1351 return 0;
1352}
1353
1354#endif /* CONFIG_SLIRP */
1355
1356#if !defined(_WIN32)
7d3505c5
FB
1357#ifdef _BSD
1358static int tun_open(char *ifname, int ifname_size)
1359{
1360 int fd;
1361 char *dev;
1362 struct stat s;
67b915a5 1363
7d3505c5
FB
1364 fd = open("/dev/tap", O_RDWR);
1365 if (fd < 0) {
1366 fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
1367 return -1;
1368 }
1369
1370 fstat(fd, &s);
1371 dev = devname(s.st_rdev, S_IFCHR);
1372 pstrcpy(ifname, ifname_size, dev);
1373
1374 fcntl(fd, F_SETFL, O_NONBLOCK);
1375 return fd;
1376}
1377#else
c4b1fcc0 1378static int tun_open(char *ifname, int ifname_size)
330d0414 1379{
80cabfad 1380 struct ifreq ifr;
c4b1fcc0 1381 int fd, ret;
80cabfad
FB
1382
1383 fd = open("/dev/net/tun", O_RDWR);
1384 if (fd < 0) {
1385 fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
1386 return -1;
330d0414 1387 }
80cabfad
FB
1388 memset(&ifr, 0, sizeof(ifr));
1389 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
1390 pstrcpy(ifr.ifr_name, IFNAMSIZ, "tun%d");
1391 ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
1392 if (ret != 0) {
1393 fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
1394 close(fd);
1395 return -1;
1396 }
1397 printf("Connected to host network interface: %s\n", ifr.ifr_name);
c4b1fcc0 1398 pstrcpy(ifname, ifname_size, ifr.ifr_name);
80cabfad 1399 fcntl(fd, F_SETFL, O_NONBLOCK);
c4b1fcc0
FB
1400 return fd;
1401}
7d3505c5 1402#endif
330d0414 1403
c20709aa
FB
1404static void tun_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1405{
1406 write(nd->fd, buf, size);
1407}
1408
1409static void tun_add_read_packet(NetDriverState *nd,
1410 IOCanRWHandler *fd_can_read,
1411 IOReadHandler *fd_read, void *opaque)
c4b1fcc0 1412{
c20709aa
FB
1413 qemu_add_fd_read_handler(nd->fd, fd_can_read, fd_read, opaque);
1414}
1415
1416static int net_tun_init(NetDriverState *nd)
1417{
1418 int pid, status;
1419 char *args[3];
c4b1fcc0
FB
1420 char **parg;
1421
c20709aa
FB
1422 nd->fd = tun_open(nd->ifname, sizeof(nd->ifname));
1423 if (nd->fd < 0)
1424 return -1;
c4b1fcc0 1425
c20709aa
FB
1426 /* try to launch network init script */
1427 pid = fork();
1428 if (pid >= 0) {
1429 if (pid == 0) {
1430 parg = args;
1431 *parg++ = network_script;
1432 *parg++ = nd->ifname;
1433 *parg++ = NULL;
1434 execv(network_script, args);
1435 exit(1);
1436 }
1437 while (waitpid(pid, &status, 0) != pid);
1438 if (!WIFEXITED(status) ||
1439 WEXITSTATUS(status) != 0) {
1440 fprintf(stderr, "%s: could not launch network script\n",
1441 network_script);
80cabfad 1442 }
330d0414 1443 }
c20709aa
FB
1444 nd->send_packet = tun_send_packet;
1445 nd->add_read_packet = tun_add_read_packet;
80cabfad 1446 return 0;
330d0414
FB
1447}
1448
c20709aa 1449static int net_fd_init(NetDriverState *nd, int fd)
330d0414 1450{
c20709aa
FB
1451 nd->fd = fd;
1452 nd->send_packet = tun_send_packet;
1453 nd->add_read_packet = tun_add_read_packet;
1454 pstrcpy(nd->ifname, sizeof(nd->ifname), "tunfd");
1455 return 0;
80cabfad 1456}
330d0414 1457
c20709aa 1458#endif /* !_WIN32 */
67b915a5 1459
313aa567
FB
1460/***********************************************************/
1461/* dumb display */
1462
67b915a5
FB
1463#ifdef _WIN32
1464
1465static void term_exit(void)
1466{
1467}
1468
1469static void term_init(void)
1470{
1471}
1472
1473#else
1474
313aa567
FB
1475/* init terminal so that we can grab keys */
1476static struct termios oldtty;
02ba45c5 1477static int old_fd0_flags;
313aa567
FB
1478
1479static void term_exit(void)
1480{
1481 tcsetattr (0, TCSANOW, &oldtty);
02ba45c5 1482 fcntl(0, F_SETFL, old_fd0_flags);
313aa567
FB
1483}
1484
1485static void term_init(void)
1486{
1487 struct termios tty;
1488
1489 tcgetattr (0, &tty);
1490 oldtty = tty;
02ba45c5 1491 old_fd0_flags = fcntl(0, F_GETFL);
313aa567
FB
1492
1493 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1494 |INLCR|IGNCR|ICRNL|IXON);
1495 tty.c_oflag |= OPOST;
a20dd508
FB
1496 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1497 /* if graphical mode, we allow Ctrl-C handling */
1498 if (nographic)
1499 tty.c_lflag &= ~ISIG;
313aa567
FB
1500 tty.c_cflag &= ~(CSIZE|PARENB);
1501 tty.c_cflag |= CS8;
1502 tty.c_cc[VMIN] = 1;
1503 tty.c_cc[VTIME] = 0;
1504
1505 tcsetattr (0, TCSANOW, &tty);
1506
1507 atexit(term_exit);
1508
1509 fcntl(0, F_SETFL, O_NONBLOCK);
1510}
1511
67b915a5
FB
1512#endif
1513
313aa567
FB
1514static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
1515{
1516}
1517
1518static void dumb_resize(DisplayState *ds, int w, int h)
1519{
1520}
1521
1522static void dumb_refresh(DisplayState *ds)
1523{
1524 vga_update_display();
1525}
1526
1527void dumb_display_init(DisplayState *ds)
1528{
1529 ds->data = NULL;
1530 ds->linesize = 0;
1531 ds->depth = 0;
1532 ds->dpy_update = dumb_update;
1533 ds->dpy_resize = dumb_resize;
1534 ds->dpy_refresh = dumb_refresh;
1535}
1536
3a51dee6 1537#if !defined(CONFIG_SOFTMMU)
f1510b2c 1538/***********************************************************/
0824d6fc
FB
1539/* cpu signal handler */
1540static void host_segv_handler(int host_signum, siginfo_t *info,
1541 void *puc)
1542{
1543 if (cpu_signal_handler(host_signum, info, puc))
1544 return;
1545 term_exit();
1546 abort();
1547}
3a51dee6 1548#endif
0824d6fc 1549
8a7ddc38
FB
1550/***********************************************************/
1551/* I/O handling */
0824d6fc 1552
c4b1fcc0
FB
1553#define MAX_IO_HANDLERS 64
1554
1555typedef struct IOHandlerRecord {
1556 int fd;
1557 IOCanRWHandler *fd_can_read;
1558 IOReadHandler *fd_read;
1559 void *opaque;
1560 /* temporary data */
1561 struct pollfd *ufd;
1562 int max_size;
8a7ddc38 1563 struct IOHandlerRecord *next;
c4b1fcc0
FB
1564} IOHandlerRecord;
1565
8a7ddc38 1566static IOHandlerRecord *first_io_handler;
c4b1fcc0 1567
8a7ddc38
FB
1568int qemu_add_fd_read_handler(int fd, IOCanRWHandler *fd_can_read,
1569 IOReadHandler *fd_read, void *opaque)
c4b1fcc0
FB
1570{
1571 IOHandlerRecord *ioh;
1572
8a7ddc38
FB
1573 ioh = qemu_mallocz(sizeof(IOHandlerRecord));
1574 if (!ioh)
c4b1fcc0 1575 return -1;
c4b1fcc0
FB
1576 ioh->fd = fd;
1577 ioh->fd_can_read = fd_can_read;
1578 ioh->fd_read = fd_read;
1579 ioh->opaque = opaque;
8a7ddc38
FB
1580 ioh->next = first_io_handler;
1581 first_io_handler = ioh;
c4b1fcc0
FB
1582 return 0;
1583}
1584
8a7ddc38
FB
1585void qemu_del_fd_read_handler(int fd)
1586{
1587 IOHandlerRecord **pioh, *ioh;
b4608c04 1588
8a7ddc38
FB
1589 pioh = &first_io_handler;
1590 for(;;) {
1591 ioh = *pioh;
1592 if (ioh == NULL)
1593 break;
1594 if (ioh->fd == fd) {
1595 *pioh = ioh->next;
1596 break;
1597 }
1598 pioh = &ioh->next;
1599 }
1600}
1601
1602/***********************************************************/
1603/* savevm/loadvm support */
1604
1605void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
b4608c04 1606{
8a7ddc38 1607 fwrite(buf, 1, size, f);
b4608c04
FB
1608}
1609
8a7ddc38 1610void qemu_put_byte(QEMUFile *f, int v)
b4608c04 1611{
8a7ddc38
FB
1612 fputc(v, f);
1613}
1614
1615void qemu_put_be16(QEMUFile *f, unsigned int v)
1616{
1617 qemu_put_byte(f, v >> 8);
1618 qemu_put_byte(f, v);
1619}
1620
1621void qemu_put_be32(QEMUFile *f, unsigned int v)
1622{
1623 qemu_put_byte(f, v >> 24);
1624 qemu_put_byte(f, v >> 16);
1625 qemu_put_byte(f, v >> 8);
1626 qemu_put_byte(f, v);
1627}
1628
1629void qemu_put_be64(QEMUFile *f, uint64_t v)
1630{
1631 qemu_put_be32(f, v >> 32);
1632 qemu_put_be32(f, v);
1633}
1634
1635int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size)
1636{
1637 return fread(buf, 1, size, f);
1638}
1639
1640int qemu_get_byte(QEMUFile *f)
1641{
1642 int v;
1643 v = fgetc(f);
1644 if (v == EOF)
1645 return 0;
1646 else
1647 return v;
1648}
1649
1650unsigned int qemu_get_be16(QEMUFile *f)
1651{
1652 unsigned int v;
1653 v = qemu_get_byte(f) << 8;
1654 v |= qemu_get_byte(f);
1655 return v;
1656}
1657
1658unsigned int qemu_get_be32(QEMUFile *f)
1659{
1660 unsigned int v;
1661 v = qemu_get_byte(f) << 24;
1662 v |= qemu_get_byte(f) << 16;
1663 v |= qemu_get_byte(f) << 8;
1664 v |= qemu_get_byte(f);
1665 return v;
1666}
1667
1668uint64_t qemu_get_be64(QEMUFile *f)
1669{
1670 uint64_t v;
1671 v = (uint64_t)qemu_get_be32(f) << 32;
1672 v |= qemu_get_be32(f);
1673 return v;
1674}
1675
1676int64_t qemu_ftell(QEMUFile *f)
1677{
1678 return ftell(f);
1679}
1680
1681int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
1682{
1683 if (fseek(f, pos, whence) < 0)
1684 return -1;
1685 return ftell(f);
1686}
1687
1688typedef struct SaveStateEntry {
1689 char idstr[256];
1690 int instance_id;
1691 int version_id;
1692 SaveStateHandler *save_state;
1693 LoadStateHandler *load_state;
1694 void *opaque;
1695 struct SaveStateEntry *next;
1696} SaveStateEntry;
b4608c04 1697
8a7ddc38
FB
1698static SaveStateEntry *first_se;
1699
1700int register_savevm(const char *idstr,
1701 int instance_id,
1702 int version_id,
1703 SaveStateHandler *save_state,
1704 LoadStateHandler *load_state,
1705 void *opaque)
1706{
1707 SaveStateEntry *se, **pse;
1708
1709 se = qemu_malloc(sizeof(SaveStateEntry));
1710 if (!se)
1711 return -1;
1712 pstrcpy(se->idstr, sizeof(se->idstr), idstr);
1713 se->instance_id = instance_id;
1714 se->version_id = version_id;
1715 se->save_state = save_state;
1716 se->load_state = load_state;
1717 se->opaque = opaque;
1718 se->next = NULL;
1719
1720 /* add at the end of list */
1721 pse = &first_se;
1722 while (*pse != NULL)
1723 pse = &(*pse)->next;
1724 *pse = se;
1725 return 0;
1726}
1727
1728#define QEMU_VM_FILE_MAGIC 0x5145564d
1729#define QEMU_VM_FILE_VERSION 0x00000001
1730
1731int qemu_savevm(const char *filename)
1732{
1733 SaveStateEntry *se;
1734 QEMUFile *f;
1735 int len, len_pos, cur_pos, saved_vm_running, ret;
1736
1737 saved_vm_running = vm_running;
1738 vm_stop(0);
1739
1740 f = fopen(filename, "wb");
1741 if (!f) {
1742 ret = -1;
1743 goto the_end;
313aa567
FB
1744 }
1745
8a7ddc38
FB
1746 qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
1747 qemu_put_be32(f, QEMU_VM_FILE_VERSION);
1748
1749 for(se = first_se; se != NULL; se = se->next) {
1750 /* ID string */
1751 len = strlen(se->idstr);
1752 qemu_put_byte(f, len);
1753 qemu_put_buffer(f, se->idstr, len);
1754
1755 qemu_put_be32(f, se->instance_id);
1756 qemu_put_be32(f, se->version_id);
1757
1758 /* record size: filled later */
1759 len_pos = ftell(f);
1760 qemu_put_be32(f, 0);
1761
1762 se->save_state(f, se->opaque);
1763
1764 /* fill record size */
1765 cur_pos = ftell(f);
1766 len = ftell(f) - len_pos - 4;
1767 fseek(f, len_pos, SEEK_SET);
1768 qemu_put_be32(f, len);
1769 fseek(f, cur_pos, SEEK_SET);
1770 }
1771
1772 fclose(f);
1773 ret = 0;
1774 the_end:
1775 if (saved_vm_running)
1776 vm_start();
1777 return ret;
1778}
1779
1780static SaveStateEntry *find_se(const char *idstr, int instance_id)
1781{
1782 SaveStateEntry *se;
1783
1784 for(se = first_se; se != NULL; se = se->next) {
1785 if (!strcmp(se->idstr, idstr) &&
1786 instance_id == se->instance_id)
1787 return se;
1788 }
1789 return NULL;
1790}
1791
1792int qemu_loadvm(const char *filename)
1793{
1794 SaveStateEntry *se;
1795 QEMUFile *f;
1796 int len, cur_pos, ret, instance_id, record_len, version_id;
1797 int saved_vm_running;
1798 unsigned int v;
1799 char idstr[256];
1800
1801 saved_vm_running = vm_running;
1802 vm_stop(0);
1803
1804 f = fopen(filename, "rb");
1805 if (!f) {
1806 ret = -1;
1807 goto the_end;
1808 }
1809
1810 v = qemu_get_be32(f);
1811 if (v != QEMU_VM_FILE_MAGIC)
1812 goto fail;
1813 v = qemu_get_be32(f);
1814 if (v != QEMU_VM_FILE_VERSION) {
1815 fail:
1816 fclose(f);
1817 ret = -1;
1818 goto the_end;
1819 }
b4608c04 1820 for(;;) {
a541f297 1821#if defined (DO_TB_FLUSH)
d927637d 1822 tb_flush(global_env);
a541f297 1823#endif
8a7ddc38
FB
1824 len = qemu_get_byte(f);
1825 if (feof(f))
cd4c3e88 1826 break;
8a7ddc38
FB
1827 qemu_get_buffer(f, idstr, len);
1828 idstr[len] = '\0';
1829 instance_id = qemu_get_be32(f);
1830 version_id = qemu_get_be32(f);
1831 record_len = qemu_get_be32(f);
1832#if 0
1833 printf("idstr=%s instance=0x%x version=%d len=%d\n",
1834 idstr, instance_id, version_id, record_len);
1835#endif
1836 cur_pos = ftell(f);
1837 se = find_se(idstr, instance_id);
1838 if (!se) {
1839 fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n",
1840 instance_id, idstr);
1841 } else {
1842 ret = se->load_state(f, se->opaque, version_id);
1843 if (ret < 0) {
1844 fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
1845 instance_id, idstr);
1846 }
34865134 1847 }
8a7ddc38
FB
1848 /* always seek to exact end of record */
1849 qemu_fseek(f, cur_pos + record_len, SEEK_SET);
1850 }
1851 fclose(f);
1852 ret = 0;
1853 the_end:
1854 if (saved_vm_running)
1855 vm_start();
1856 return ret;
1857}
1858
1859/***********************************************************/
1860/* cpu save/restore */
1861
1862#if defined(TARGET_I386)
1863
1864static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
1865{
02ba45c5 1866 qemu_put_be32(f, dt->selector);
8a7ddc38
FB
1867 qemu_put_be32(f, (uint32_t)dt->base);
1868 qemu_put_be32(f, dt->limit);
1869 qemu_put_be32(f, dt->flags);
1870}
1871
1872static void cpu_get_seg(QEMUFile *f, SegmentCache *dt)
1873{
02ba45c5 1874 dt->selector = qemu_get_be32(f);
8a7ddc38
FB
1875 dt->base = (uint8_t *)qemu_get_be32(f);
1876 dt->limit = qemu_get_be32(f);
1877 dt->flags = qemu_get_be32(f);
1878}
1879
1880void cpu_save(QEMUFile *f, void *opaque)
1881{
1882 CPUState *env = opaque;
1883 uint16_t fptag, fpus, fpuc;
1884 uint32_t hflags;
1885 int i;
1886
1887 for(i = 0; i < 8; i++)
1888 qemu_put_be32s(f, &env->regs[i]);
1889 qemu_put_be32s(f, &env->eip);
1890 qemu_put_be32s(f, &env->eflags);
1891 qemu_put_be32s(f, &env->eflags);
1892 hflags = env->hflags; /* XXX: suppress most of the redundant hflags */
1893 qemu_put_be32s(f, &hflags);
1894
1895 /* FPU */
1896 fpuc = env->fpuc;
1897 fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
1898 fptag = 0;
1899 for (i=7; i>=0; i--) {
1900 fptag <<= 2;
1901 if (env->fptags[i]) {
1902 fptag |= 3;
1903 }
1904 }
1905
1906 qemu_put_be16s(f, &fpuc);
1907 qemu_put_be16s(f, &fpus);
1908 qemu_put_be16s(f, &fptag);
1909
1910 for(i = 0; i < 8; i++) {
1911 uint64_t mant;
1912 uint16_t exp;
1913 cpu_get_fp80(&mant, &exp, env->fpregs[i]);
1914 qemu_put_be64(f, mant);
1915 qemu_put_be16(f, exp);
1916 }
1917
1918 for(i = 0; i < 6; i++)
1919 cpu_put_seg(f, &env->segs[i]);
1920 cpu_put_seg(f, &env->ldt);
1921 cpu_put_seg(f, &env->tr);
1922 cpu_put_seg(f, &env->gdt);
1923 cpu_put_seg(f, &env->idt);
1924
1925 qemu_put_be32s(f, &env->sysenter_cs);
1926 qemu_put_be32s(f, &env->sysenter_esp);
1927 qemu_put_be32s(f, &env->sysenter_eip);
1928
1929 qemu_put_be32s(f, &env->cr[0]);
1930 qemu_put_be32s(f, &env->cr[2]);
1931 qemu_put_be32s(f, &env->cr[3]);
1932 qemu_put_be32s(f, &env->cr[4]);
1933
1934 for(i = 0; i < 8; i++)
1935 qemu_put_be32s(f, &env->dr[i]);
1936
1937 /* MMU */
1938 qemu_put_be32s(f, &env->a20_mask);
1939}
1940
1941int cpu_load(QEMUFile *f, void *opaque, int version_id)
1942{
1943 CPUState *env = opaque;
1944 int i;
1945 uint32_t hflags;
1946 uint16_t fpus, fpuc, fptag;
1947
02ba45c5 1948 if (version_id != 2)
8a7ddc38
FB
1949 return -EINVAL;
1950 for(i = 0; i < 8; i++)
1951 qemu_get_be32s(f, &env->regs[i]);
1952 qemu_get_be32s(f, &env->eip);
1953 qemu_get_be32s(f, &env->eflags);
1954 qemu_get_be32s(f, &env->eflags);
1955 qemu_get_be32s(f, &hflags);
1956
1957 qemu_get_be16s(f, &fpuc);
1958 qemu_get_be16s(f, &fpus);
1959 qemu_get_be16s(f, &fptag);
1960
1961 for(i = 0; i < 8; i++) {
1962 uint64_t mant;
1963 uint16_t exp;
1964 mant = qemu_get_be64(f);
1965 exp = qemu_get_be16(f);
1966 env->fpregs[i] = cpu_set_fp80(mant, exp);
1967 }
1968
1969 env->fpuc = fpuc;
1970 env->fpstt = (fpus >> 11) & 7;
1971 env->fpus = fpus & ~0x3800;
1972 for(i = 0; i < 8; i++) {
1973 env->fptags[i] = ((fptag & 3) == 3);
1974 fptag >>= 2;
1975 }
1976
1977 for(i = 0; i < 6; i++)
1978 cpu_get_seg(f, &env->segs[i]);
1979 cpu_get_seg(f, &env->ldt);
1980 cpu_get_seg(f, &env->tr);
1981 cpu_get_seg(f, &env->gdt);
1982 cpu_get_seg(f, &env->idt);
1983
1984 qemu_get_be32s(f, &env->sysenter_cs);
1985 qemu_get_be32s(f, &env->sysenter_esp);
1986 qemu_get_be32s(f, &env->sysenter_eip);
1987
1988 qemu_get_be32s(f, &env->cr[0]);
1989 qemu_get_be32s(f, &env->cr[2]);
1990 qemu_get_be32s(f, &env->cr[3]);
1991 qemu_get_be32s(f, &env->cr[4]);
1992
1993 for(i = 0; i < 8; i++)
1994 qemu_get_be32s(f, &env->dr[i]);
1995
1996 /* MMU */
1997 qemu_get_be32s(f, &env->a20_mask);
1998
1999 /* XXX: compute hflags from scratch, except for CPL and IIF */
2000 env->hflags = hflags;
2001 tlb_flush(env, 1);
2002 return 0;
2003}
2004
a541f297
FB
2005#elif defined(TARGET_PPC)
2006void cpu_save(QEMUFile *f, void *opaque)
2007{
2008}
2009
2010int cpu_load(QEMUFile *f, void *opaque, int version_id)
2011{
2012 return 0;
2013}
8a7ddc38
FB
2014#else
2015
2016#warning No CPU save/restore functions
2017
2018#endif
2019
2020/***********************************************************/
2021/* ram save/restore */
2022
2023/* we just avoid storing empty pages */
2024static void ram_put_page(QEMUFile *f, const uint8_t *buf, int len)
2025{
2026 int i, v;
2027
2028 v = buf[0];
2029 for(i = 1; i < len; i++) {
2030 if (buf[i] != v)
2031 goto normal_save;
2032 }
2033 qemu_put_byte(f, 1);
2034 qemu_put_byte(f, v);
2035 return;
2036 normal_save:
2037 qemu_put_byte(f, 0);
2038 qemu_put_buffer(f, buf, len);
2039}
2040
2041static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
2042{
2043 int v;
2044
2045 v = qemu_get_byte(f);
2046 switch(v) {
2047 case 0:
2048 if (qemu_get_buffer(f, buf, len) != len)
2049 return -EIO;
2050 break;
2051 case 1:
2052 v = qemu_get_byte(f);
2053 memset(buf, v, len);
2054 break;
2055 default:
2056 return -EINVAL;
2057 }
2058 return 0;
2059}
2060
2061static void ram_save(QEMUFile *f, void *opaque)
2062{
2063 int i;
2064 qemu_put_be32(f, phys_ram_size);
2065 for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
2066 ram_put_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
2067 }
2068}
2069
2070static int ram_load(QEMUFile *f, void *opaque, int version_id)
2071{
2072 int i, ret;
2073
2074 if (version_id != 1)
2075 return -EINVAL;
2076 if (qemu_get_be32(f) != phys_ram_size)
2077 return -EINVAL;
2078 for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
2079 ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
2080 if (ret)
2081 return ret;
2082 }
2083 return 0;
2084}
2085
2086/***********************************************************/
2087/* main execution loop */
2088
2089void gui_update(void *opaque)
2090{
2091 display_state.dpy_refresh(&display_state);
2092 qemu_mod_timer(gui_timer, GUI_REFRESH_INTERVAL + qemu_get_clock(rt_clock));
2093}
2094
2095/* XXX: support several handlers */
2096VMStopHandler *vm_stop_cb;
2097VMStopHandler *vm_stop_opaque;
2098
2099int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
2100{
2101 vm_stop_cb = cb;
2102 vm_stop_opaque = opaque;
2103 return 0;
2104}
2105
2106void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
2107{
2108 vm_stop_cb = NULL;
2109}
2110
2111void vm_start(void)
2112{
2113 if (!vm_running) {
2114 cpu_enable_ticks();
2115 vm_running = 1;
2116 }
2117}
2118
2119void vm_stop(int reason)
2120{
2121 if (vm_running) {
2122 cpu_disable_ticks();
2123 vm_running = 0;
2124 if (reason != 0) {
2125 if (vm_stop_cb) {
2126 vm_stop_cb(vm_stop_opaque, reason);
2127 }
34865134 2128 }
8a7ddc38
FB
2129 }
2130}
2131
bb0c6722
FB
2132/* reset/shutdown handler */
2133
2134typedef struct QEMUResetEntry {
2135 QEMUResetHandler *func;
2136 void *opaque;
2137 struct QEMUResetEntry *next;
2138} QEMUResetEntry;
2139
2140static QEMUResetEntry *first_reset_entry;
2141static int reset_requested;
2142static int shutdown_requested;
2143
2144void qemu_register_reset(QEMUResetHandler *func, void *opaque)
2145{
2146 QEMUResetEntry **pre, *re;
2147
2148 pre = &first_reset_entry;
2149 while (*pre != NULL)
2150 pre = &(*pre)->next;
2151 re = qemu_mallocz(sizeof(QEMUResetEntry));
2152 re->func = func;
2153 re->opaque = opaque;
2154 re->next = NULL;
2155 *pre = re;
2156}
2157
2158void qemu_system_reset(void)
2159{
2160 QEMUResetEntry *re;
2161
2162 /* reset all devices */
2163 for(re = first_reset_entry; re != NULL; re = re->next) {
2164 re->func(re->opaque);
2165 }
2166}
2167
2168void qemu_system_reset_request(void)
2169{
2170 reset_requested = 1;
2171 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
2172}
2173
2174void qemu_system_shutdown_request(void)
2175{
2176 shutdown_requested = 1;
2177 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
2178}
2179
2180static void main_cpu_reset(void *opaque)
2181{
2182#ifdef TARGET_I386
2183 CPUState *env = opaque;
2184 cpu_reset(env);
2185#endif
2186}
2187
5905b2e5 2188void main_loop_wait(int timeout)
8a7ddc38 2189{
67b915a5 2190#ifndef _WIN32
8a7ddc38 2191 struct pollfd ufds[MAX_IO_HANDLERS + 1], *pf;
8a7ddc38 2192 IOHandlerRecord *ioh, *ioh_next;
67b915a5
FB
2193 uint8_t buf[4096];
2194 int n, max_size;
2195#endif
5905b2e5 2196 int ret;
c4b1fcc0 2197
38e205a2
FB
2198#ifdef _WIN32
2199 if (timeout > 0)
2200 Sleep(timeout);
2201#else
b4608c04 2202 /* poll any events */
8a7ddc38 2203 /* XXX: separate device handlers from system ones */
b4608c04 2204 pf = ufds;
8a7ddc38
FB
2205 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
2206 if (!ioh->fd_can_read) {
2207 max_size = 0;
c4b1fcc0
FB
2208 pf->fd = ioh->fd;
2209 pf->events = POLLIN;
2210 ioh->ufd = pf;
2211 pf++;
2212 } else {
8a7ddc38
FB
2213 max_size = ioh->fd_can_read(ioh->opaque);
2214 if (max_size > 0) {
2215 if (max_size > sizeof(buf))
2216 max_size = sizeof(buf);
2217 pf->fd = ioh->fd;
2218 pf->events = POLLIN;
2219 ioh->ufd = pf;
2220 pf++;
2221 } else {
2222 ioh->ufd = NULL;
2223 }
c4b1fcc0
FB
2224 }
2225 ioh->max_size = max_size;
b4608c04 2226 }
73332e5c 2227
b4608c04
FB
2228 ret = poll(ufds, pf - ufds, timeout);
2229 if (ret > 0) {
8a7ddc38
FB
2230 /* XXX: better handling of removal */
2231 for(ioh = first_io_handler; ioh != NULL; ioh = ioh_next) {
2232 ioh_next = ioh->next;
c4b1fcc0
FB
2233 pf = ioh->ufd;
2234 if (pf) {
8a7ddc38
FB
2235 if (pf->revents & POLLIN) {
2236 if (ioh->max_size == 0) {
2237 /* just a read event */
2238 ioh->fd_read(ioh->opaque, NULL, 0);
2239 } else {
2240 n = read(ioh->fd, buf, ioh->max_size);
2241 if (n >= 0) {
2242 ioh->fd_read(ioh->opaque, buf, n);
158156d1 2243 } else if (errno != EAGAIN) {
8a7ddc38
FB
2244 ioh->fd_read(ioh->opaque, NULL, -errno);
2245 }
2246 }
b4608c04 2247 }
b4608c04 2248 }
b4608c04
FB
2249 }
2250 }
5905b2e5 2251#endif /* !defined(_WIN32) */
c20709aa
FB
2252#if defined(CONFIG_SLIRP)
2253 /* XXX: merge with poll() */
2254 if (slirp_inited) {
2255 fd_set rfds, wfds, xfds;
2256 int nfds;
2257 struct timeval tv;
2258
2259 nfds = -1;
2260 FD_ZERO(&rfds);
2261 FD_ZERO(&wfds);
2262 FD_ZERO(&xfds);
2263 slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
2264 tv.tv_sec = 0;
2265 tv.tv_usec = 0;
2266 ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
2267 if (ret >= 0) {
2268 slirp_select_poll(&rfds, &wfds, &xfds);
2269 }
2270 }
67b915a5 2271#endif
b4608c04 2272
8a7ddc38
FB
2273 if (vm_running) {
2274 qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
2275 qemu_get_clock(vm_clock));
2276
aaaa7df6
FB
2277 if (audio_enabled) {
2278 /* XXX: add explicit timer */
2279 SB16_run();
2280 }
8a7ddc38
FB
2281
2282 /* run dma transfers, if any */
2283 DMA_run();
b4608c04 2284 }
313aa567 2285
8a7ddc38
FB
2286 /* real time timers */
2287 qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
2288 qemu_get_clock(rt_clock));
5905b2e5
FB
2289}
2290
2291int main_loop(void)
2292{
2293 int ret, timeout;
2294 CPUState *env = global_env;
2295
2296 for(;;) {
2297 if (vm_running) {
2298 ret = cpu_exec(env);
2299 if (shutdown_requested) {
2300 ret = EXCP_INTERRUPT;
2301 break;
2302 }
2303 if (reset_requested) {
2304 reset_requested = 0;
2305 qemu_system_reset();
2306 ret = EXCP_INTERRUPT;
2307 }
2308 if (ret == EXCP_DEBUG) {
2309 vm_stop(EXCP_DEBUG);
2310 }
2311 /* if hlt instruction, we wait until the next IRQ */
2312 /* XXX: use timeout computed from timers */
2313 if (ret == EXCP_HLT)
2314 timeout = 10;
2315 else
2316 timeout = 0;
2317 } else {
2318 timeout = 10;
2319 }
2320 main_loop_wait(timeout);
b4608c04 2321 }
34865134
FB
2322 cpu_disable_ticks();
2323 return ret;
b4608c04
FB
2324}
2325
0824d6fc
FB
2326void help(void)
2327{
aaaa7df6 2328 printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2004 Fabrice Bellard\n"
0db63474 2329 "usage: %s [options] [disk_image]\n"
0824d6fc 2330 "\n"
a20dd508 2331 "'disk_image' is a raw hard image image for IDE hard disk 0\n"
fc01f7e7 2332 "\n"
a20dd508 2333 "Standard options:\n"
c45886db 2334 "-fda/-fdb file use 'file' as floppy disk 0/1 image\n"
36b486bb
FB
2335 "-hda/-hdb file use 'file' as IDE hard disk 0/1 image\n"
2336 "-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n"
c4b1fcc0 2337 "-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
6e44ba7f 2338 "-boot [a|b|c|d] boot on floppy (a, b), hard disk (c) or CD-ROM (d)\n"
a20dd508 2339 "-snapshot write to temporary files instead of disk image files\n"
a00bad7e 2340 "-m megs set virtual RAM size to megs MB [default=%d]\n"
c4b1fcc0 2341 "-nographic disable graphical output and redirect serial I/Os to console\n"
aaaa7df6 2342 "-enable-audio enable audio support\n"
89980284 2343 "-localtime set the real time clock to local time [default=utc]\n"
bb0c6722
FB
2344#ifdef TARGET_PPC
2345 "-prep Simulate a PREP system (default is PowerMAC)\n"
e9b137c2 2346 "-g WxH[xDEPTH] Set the initial VGA graphic mode\n"
bb0c6722 2347#endif
c4b1fcc0
FB
2348 "\n"
2349 "Network options:\n"
c20709aa 2350 "-nics n simulate 'n' network cards [default=1]\n"
702c651c 2351 "-macaddr addr set the mac address of the first interface\n"
c20709aa
FB
2352 "-n script set tap/tun network init script [default=%s]\n"
2353 "-tun-fd fd use this fd as already opened tap/tun interface\n"
2354#ifdef CONFIG_SLIRP
2355 "-user-net use user mode network stack [default if no tap/tun script]\n"
2356#endif
2357 "-dummy-net use dummy network stack\n"
a20dd508 2358 "\n"
c4b1fcc0 2359 "Linux boot specific:\n"
a20dd508
FB
2360 "-kernel bzImage use 'bzImage' as kernel image\n"
2361 "-append cmdline use 'cmdline' as kernel command line\n"
2362 "-initrd file use 'file' as initial ram disk\n"
fc01f7e7 2363 "\n"
330d0414 2364 "Debug/Expert options:\n"
82c643ff
FB
2365 "-monitor dev redirect the monitor to char device 'dev'\n"
2366 "-serial dev redirect the serial port to char device 'dev'\n"
cd6f1169 2367 "-S freeze CPU at startup (use 'c' to start execution)\n"
a20dd508
FB
2368 "-s wait gdb connection to port %d\n"
2369 "-p port change gdb connection port\n"
f193c797 2370 "-d item1,... output log to %s (use -d ? for a list of log items)\n"
a20dd508
FB
2371 "-hdachs c,h,s force hard disk 0 geometry (usually qemu can guess it)\n"
2372 "-L path set the directory for the BIOS and VGA BIOS\n"
77fef8c1
FB
2373#ifdef USE_CODE_COPY
2374 "-no-code-copy disable code copy acceleration\n"
2375#endif
bb0c6722
FB
2376#ifdef TARGET_I386
2377 "-isa simulate an ISA-only system (default is PCI system)\n"
1bfe856e
FB
2378 "-std-vga simulate a standard VGA card with VESA Bochs Extensions\n"
2379 " (default is CL-GD5446 PCI VGA)\n"
bb0c6722 2380#endif
0824d6fc 2381 "\n"
82c643ff
FB
2382 "During emulation, the following keys are useful:\n"
2383 "ctrl-shift-f toggle full screen\n"
2384 "ctrl-shift-Fn switch to virtual console 'n'\n"
2385 "ctrl-shift toggle mouse and keyboard grab\n"
2386 "\n"
2387 "When using -nographic, press 'ctrl-a h' to get some help.\n"
2388 ,
0db63474
FB
2389#ifdef CONFIG_SOFTMMU
2390 "qemu",
2391#else
2392 "qemu-fast",
2393#endif
a00bad7e
FB
2394 DEFAULT_RAM_SIZE,
2395 DEFAULT_NETWORK_SCRIPT,
6e44ba7f
FB
2396 DEFAULT_GDBSTUB_PORT,
2397 "/tmp/qemu.log");
0db63474
FB
2398#ifndef CONFIG_SOFTMMU
2399 printf("\n"
2400 "NOTE: this version of QEMU is faster but it needs slightly patched OSes to\n"
2401 "work. Please use the 'qemu' executable to have a more accurate (but slower)\n"
2402 "PC emulation.\n");
2403#endif
0824d6fc
FB
2404 exit(1);
2405}
2406
cd6f1169
FB
2407#define HAS_ARG 0x0001
2408
2409enum {
2410 QEMU_OPTION_h,
2411
2412 QEMU_OPTION_fda,
2413 QEMU_OPTION_fdb,
2414 QEMU_OPTION_hda,
2415 QEMU_OPTION_hdb,
2416 QEMU_OPTION_hdc,
2417 QEMU_OPTION_hdd,
2418 QEMU_OPTION_cdrom,
2419 QEMU_OPTION_boot,
2420 QEMU_OPTION_snapshot,
2421 QEMU_OPTION_m,
2422 QEMU_OPTION_nographic,
2423 QEMU_OPTION_enable_audio,
2424
2425 QEMU_OPTION_nics,
2426 QEMU_OPTION_macaddr,
2427 QEMU_OPTION_n,
2428 QEMU_OPTION_tun_fd,
2429 QEMU_OPTION_user_net,
2430 QEMU_OPTION_dummy_net,
2431
2432 QEMU_OPTION_kernel,
2433 QEMU_OPTION_append,
2434 QEMU_OPTION_initrd,
2435
2436 QEMU_OPTION_S,
2437 QEMU_OPTION_s,
2438 QEMU_OPTION_p,
2439 QEMU_OPTION_d,
2440 QEMU_OPTION_hdachs,
2441 QEMU_OPTION_L,
2442 QEMU_OPTION_no_code_copy,
69b91039 2443 QEMU_OPTION_pci,
bb0c6722 2444 QEMU_OPTION_isa,
77d4bc34 2445 QEMU_OPTION_prep,
ee22c2f7 2446 QEMU_OPTION_localtime,
1f04275e 2447 QEMU_OPTION_cirrusvga,
e9b137c2 2448 QEMU_OPTION_g,
1bfe856e 2449 QEMU_OPTION_std_vga,
82c643ff
FB
2450 QEMU_OPTION_monitor,
2451 QEMU_OPTION_serial,
cd6f1169
FB
2452};
2453
2454typedef struct QEMUOption {
2455 const char *name;
2456 int flags;
2457 int index;
2458} QEMUOption;
2459
2460const QEMUOption qemu_options[] = {
2461 { "h", 0, QEMU_OPTION_h },
2462
2463 { "fda", HAS_ARG, QEMU_OPTION_fda },
2464 { "fdb", HAS_ARG, QEMU_OPTION_fdb },
2465 { "hda", HAS_ARG, QEMU_OPTION_hda },
2466 { "hdb", HAS_ARG, QEMU_OPTION_hdb },
2467 { "hdc", HAS_ARG, QEMU_OPTION_hdc },
2468 { "hdd", HAS_ARG, QEMU_OPTION_hdd },
2469 { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
2470 { "boot", HAS_ARG, QEMU_OPTION_boot },
2471 { "snapshot", 0, QEMU_OPTION_snapshot },
2472 { "m", HAS_ARG, QEMU_OPTION_m },
2473 { "nographic", 0, QEMU_OPTION_nographic },
2474 { "enable-audio", 0, QEMU_OPTION_enable_audio },
2475
2476 { "nics", HAS_ARG, QEMU_OPTION_nics},
2477 { "macaddr", HAS_ARG, QEMU_OPTION_macaddr},
69b91039 2478 { "n", HAS_ARG, QEMU_OPTION_n },
cd6f1169 2479 { "tun-fd", HAS_ARG, QEMU_OPTION_tun_fd },
158156d1 2480#ifdef CONFIG_SLIRP
cd6f1169 2481 { "user-net", 0, QEMU_OPTION_user_net },
158156d1 2482#endif
cd6f1169
FB
2483 { "dummy-net", 0, QEMU_OPTION_dummy_net },
2484
2485 { "kernel", HAS_ARG, QEMU_OPTION_kernel },
2486 { "append", HAS_ARG, QEMU_OPTION_append },
2487 { "initrd", HAS_ARG, QEMU_OPTION_initrd },
2488
2489 { "S", 0, QEMU_OPTION_S },
2490 { "s", 0, QEMU_OPTION_s },
2491 { "p", HAS_ARG, QEMU_OPTION_p },
2492 { "d", HAS_ARG, QEMU_OPTION_d },
2493 { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
2494 { "L", HAS_ARG, QEMU_OPTION_L },
2495 { "no-code-copy", 0, QEMU_OPTION_no_code_copy },
77d4bc34
FB
2496#ifdef TARGET_PPC
2497 { "prep", 0, QEMU_OPTION_prep },
e9b137c2 2498 { "g", 1, QEMU_OPTION_g },
77d4bc34 2499#endif
ee22c2f7 2500 { "localtime", 0, QEMU_OPTION_localtime },
bb0c6722 2501 { "isa", 0, QEMU_OPTION_isa },
1bfe856e 2502 { "std-vga", 0, QEMU_OPTION_std_vga },
82c643ff
FB
2503 { "monitor", 1, QEMU_OPTION_monitor },
2504 { "serial", 1, QEMU_OPTION_serial },
2505
1f04275e
FB
2506 /* temporary options */
2507 { "pci", 0, QEMU_OPTION_pci },
2508 { "cirrusvga", 0, QEMU_OPTION_cirrusvga },
cd6f1169 2509 { NULL },
fc01f7e7
FB
2510};
2511
77fef8c1
FB
2512#if defined (TARGET_I386) && defined(USE_CODE_COPY)
2513
2514/* this stack is only used during signal handling */
2515#define SIGNAL_STACK_SIZE 32768
2516
2517static uint8_t *signal_stack;
2518
2519#endif
2520
5905b2e5
FB
2521/* password input */
2522
2523static BlockDriverState *get_bdrv(int index)
2524{
2525 BlockDriverState *bs;
2526
2527 if (index < 4) {
2528 bs = bs_table[index];
2529 } else if (index < 6) {
2530 bs = fd_table[index - 4];
2531 } else {
2532 bs = NULL;
2533 }
2534 return bs;
2535}
2536
2537static void read_passwords(void)
2538{
2539 BlockDriverState *bs;
2540 int i, j;
2541 char password[256];
2542
2543 for(i = 0; i < 6; i++) {
2544 bs = get_bdrv(i);
2545 if (bs && bdrv_is_encrypted(bs)) {
2546 term_printf("%s is encrypted.\n", bdrv_get_device_name(bs));
2547 for(j = 0; j < 3; j++) {
2548 monitor_readline("Password: ",
2549 1, password, sizeof(password));
2550 if (bdrv_set_key(bs, password) == 0)
2551 break;
2552 term_printf("invalid password\n");
2553 }
2554 }
2555 }
2556}
2557
c20709aa
FB
2558#define NET_IF_TUN 0
2559#define NET_IF_USER 1
2560#define NET_IF_DUMMY 2
2561
0824d6fc
FB
2562int main(int argc, char **argv)
2563{
67b915a5
FB
2564#ifdef CONFIG_GDBSTUB
2565 int use_gdbstub, gdbstub_port;
2566#endif
cd6f1169 2567 int i, has_cdrom;
1ccde1cb 2568 int snapshot, linux_boot;
c45886db 2569 CPUState *env;
7f7f9873 2570 const char *initrd_filename;
c45886db 2571 const char *hd_filename[MAX_DISKS], *fd_filename[MAX_FD];
a20dd508 2572 const char *kernel_filename, *kernel_cmdline;
313aa567 2573 DisplayState *ds = &display_state;
c4b1fcc0 2574 int cyls, heads, secs;
a541f297 2575 int start_emulation = 1;
702c651c 2576 uint8_t macaddr[6];
c20709aa 2577 int net_if_type, nb_tun_fds, tun_fds[MAX_NICS];
cd6f1169
FB
2578 int optind;
2579 const char *r, *optarg;
82c643ff
FB
2580 CharDriverState *monitor_hd;
2581 char monitor_device[128];
2582 char serial_device[128];
cd6f1169 2583
67b915a5 2584#if !defined(CONFIG_SOFTMMU)
0824d6fc
FB
2585 /* we never want that malloc() uses mmap() */
2586 mallopt(M_MMAP_THRESHOLD, 4096 * 1024);
67b915a5 2587#endif
fc01f7e7 2588 initrd_filename = NULL;
c45886db
FB
2589 for(i = 0; i < MAX_FD; i++)
2590 fd_filename[i] = NULL;
fc01f7e7
FB
2591 for(i = 0; i < MAX_DISKS; i++)
2592 hd_filename[i] = NULL;
a00bad7e 2593 ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
313aa567 2594 vga_ram_size = VGA_RAM_SIZE;
0ced6589 2595 bios_size = BIOS_SIZE;
f1510b2c 2596 pstrcpy(network_script, sizeof(network_script), DEFAULT_NETWORK_SCRIPT);
67b915a5 2597#ifdef CONFIG_GDBSTUB
b4608c04
FB
2598 use_gdbstub = 0;
2599 gdbstub_port = DEFAULT_GDBSTUB_PORT;
67b915a5 2600#endif
33e3963e 2601 snapshot = 0;
a20dd508
FB
2602 nographic = 0;
2603 kernel_filename = NULL;
2604 kernel_cmdline = "";
c4b1fcc0
FB
2605 has_cdrom = 1;
2606 cyls = heads = secs = 0;
82c643ff
FB
2607 pstrcpy(monitor_device, sizeof(monitor_device), "vc");
2608 pstrcpy(serial_device, sizeof(serial_device), "vc");
c4b1fcc0 2609
c20709aa
FB
2610 nb_tun_fds = 0;
2611 net_if_type = -1;
c4b1fcc0 2612 nb_nics = 1;
702c651c
FB
2613 /* default mac address of the first network interface */
2614 macaddr[0] = 0x52;
2615 macaddr[1] = 0x54;
2616 macaddr[2] = 0x00;
2617 macaddr[3] = 0x12;
2618 macaddr[4] = 0x34;
2619 macaddr[5] = 0x56;
82c643ff 2620
cd6f1169 2621 optind = 1;
0824d6fc 2622 for(;;) {
cd6f1169 2623 if (optind >= argc)
0824d6fc 2624 break;
cd6f1169
FB
2625 r = argv[optind];
2626 if (r[0] != '-') {
2627 hd_filename[0] = argv[optind++];
2628 } else {
2629 const QEMUOption *popt;
2630
2631 optind++;
2632 popt = qemu_options;
2633 for(;;) {
2634 if (!popt->name) {
2635 fprintf(stderr, "%s: invalid option -- '%s'\n",
2636 argv[0], r);
2637 exit(1);
2638 }
2639 if (!strcmp(popt->name, r + 1))
2640 break;
2641 popt++;
2642 }
2643 if (popt->flags & HAS_ARG) {
2644 if (optind >= argc) {
2645 fprintf(stderr, "%s: option '%s' requires an argument\n",
2646 argv[0], r);
2647 exit(1);
2648 }
2649 optarg = argv[optind++];
2650 } else {
2651 optarg = NULL;
2652 }
2653
2654 switch(popt->index) {
2655 case QEMU_OPTION_initrd:
fc01f7e7
FB
2656 initrd_filename = optarg;
2657 break;
cd6f1169 2658 case QEMU_OPTION_hda:
fc01f7e7
FB
2659 hd_filename[0] = optarg;
2660 break;
cd6f1169 2661 case QEMU_OPTION_hdb:
fc01f7e7
FB
2662 hd_filename[1] = optarg;
2663 break;
cd6f1169 2664 case QEMU_OPTION_snapshot:
33e3963e
FB
2665 snapshot = 1;
2666 break;
cd6f1169 2667 case QEMU_OPTION_hdachs:
330d0414 2668 {
330d0414
FB
2669 const char *p;
2670 p = optarg;
2671 cyls = strtol(p, (char **)&p, 0);
2672 if (*p != ',')
2673 goto chs_fail;
2674 p++;
2675 heads = strtol(p, (char **)&p, 0);
2676 if (*p != ',')
2677 goto chs_fail;
2678 p++;
2679 secs = strtol(p, (char **)&p, 0);
c4b1fcc0
FB
2680 if (*p != '\0') {
2681 chs_fail:
2682 cyls = 0;
2683 }
330d0414
FB
2684 }
2685 break;
cd6f1169 2686 case QEMU_OPTION_nographic:
82c643ff
FB
2687 pstrcpy(monitor_device, sizeof(monitor_device), "stdio");
2688 pstrcpy(serial_device, sizeof(serial_device), "stdio");
a20dd508
FB
2689 nographic = 1;
2690 break;
cd6f1169 2691 case QEMU_OPTION_kernel:
a20dd508
FB
2692 kernel_filename = optarg;
2693 break;
cd6f1169 2694 case QEMU_OPTION_append:
a20dd508 2695 kernel_cmdline = optarg;
313aa567 2696 break;
cd6f1169 2697 case QEMU_OPTION_tun_fd:
c4b1fcc0
FB
2698 {
2699 const char *p;
2700 int fd;
d6b86f4d 2701 net_if_type = NET_IF_TUN;
c20709aa
FB
2702 if (nb_tun_fds < MAX_NICS) {
2703 fd = strtol(optarg, (char **)&p, 0);
2704 if (*p != '\0') {
2705 fprintf(stderr, "qemu: invalid fd for network interface %d\n", nb_tun_fds);
c4b1fcc0
FB
2706 exit(1);
2707 }
c20709aa 2708 tun_fds[nb_tun_fds++] = fd;
c4b1fcc0
FB
2709 }
2710 }
42f1e0e4 2711 break;
cd6f1169 2712 case QEMU_OPTION_hdc:
36b486bb 2713 hd_filename[2] = optarg;
c4b1fcc0 2714 has_cdrom = 0;
36b486bb 2715 break;
cd6f1169 2716 case QEMU_OPTION_hdd:
36b486bb
FB
2717 hd_filename[3] = optarg;
2718 break;
cd6f1169 2719 case QEMU_OPTION_cdrom:
36b486bb 2720 hd_filename[2] = optarg;
c4b1fcc0 2721 has_cdrom = 1;
36b486bb 2722 break;
cd6f1169 2723 case QEMU_OPTION_boot:
36b486bb 2724 boot_device = optarg[0];
c45886db
FB
2725 if (boot_device != 'a' && boot_device != 'b' &&
2726 boot_device != 'c' && boot_device != 'd') {
36b486bb
FB
2727 fprintf(stderr, "qemu: invalid boot device '%c'\n", boot_device);
2728 exit(1);
2729 }
2730 break;
cd6f1169 2731 case QEMU_OPTION_fda:
c45886db
FB
2732 fd_filename[0] = optarg;
2733 break;
cd6f1169 2734 case QEMU_OPTION_fdb:
c45886db
FB
2735 fd_filename[1] = optarg;
2736 break;
cd6f1169 2737 case QEMU_OPTION_no_code_copy:
77fef8c1
FB
2738 code_copy_enabled = 0;
2739 break;
cd6f1169 2740 case QEMU_OPTION_nics:
c4b1fcc0 2741 nb_nics = atoi(optarg);
3a1bc175 2742 if (nb_nics < 0 || nb_nics > MAX_NICS) {
c4b1fcc0
FB
2743 fprintf(stderr, "qemu: invalid number of network interfaces\n");
2744 exit(1);
2745 }
2746 break;
cd6f1169 2747 case QEMU_OPTION_macaddr:
702c651c
FB
2748 {
2749 const char *p;
2750 int i;
2751 p = optarg;
2752 for(i = 0; i < 6; i++) {
2753 macaddr[i] = strtol(p, (char **)&p, 16);
2754 if (i == 5) {
2755 if (*p != '\0')
2756 goto macaddr_error;
2757 } else {
2758 if (*p != ':') {
2759 macaddr_error:
2760 fprintf(stderr, "qemu: invalid syntax for ethernet address\n");
2761 exit(1);
2762 }
2763 p++;
2764 }
2765 }
2766 }
2767 break;
cd6f1169 2768 case QEMU_OPTION_user_net:
c20709aa
FB
2769 net_if_type = NET_IF_USER;
2770 break;
cd6f1169 2771 case QEMU_OPTION_dummy_net:
c20709aa
FB
2772 net_if_type = NET_IF_DUMMY;
2773 break;
cd6f1169 2774 case QEMU_OPTION_enable_audio:
aaaa7df6
FB
2775 audio_enabled = 1;
2776 break;
cd6f1169 2777 case QEMU_OPTION_h:
0824d6fc 2778 help();
cd6f1169
FB
2779 break;
2780 case QEMU_OPTION_m:
2781 ram_size = atoi(optarg) * 1024 * 1024;
2782 if (ram_size <= 0)
2783 help();
2784 if (ram_size > PHYS_RAM_MAX_SIZE) {
2785 fprintf(stderr, "qemu: at most %d MB RAM can be simulated\n",
2786 PHYS_RAM_MAX_SIZE / (1024 * 1024));
2787 exit(1);
2788 }
2789 break;
2790 case QEMU_OPTION_d:
2791 {
2792 int mask;
2793 CPULogItem *item;
2794
2795 mask = cpu_str_to_log_mask(optarg);
2796 if (!mask) {
2797 printf("Log items (comma separated):\n");
f193c797
FB
2798 for(item = cpu_log_items; item->mask != 0; item++) {
2799 printf("%-10s %s\n", item->name, item->help);
2800 }
2801 exit(1);
cd6f1169
FB
2802 }
2803 cpu_set_log(mask);
f193c797 2804 }
cd6f1169
FB
2805 break;
2806 case QEMU_OPTION_n:
2807 pstrcpy(network_script, sizeof(network_script), optarg);
2808 break;
67b915a5 2809#ifdef CONFIG_GDBSTUB
cd6f1169
FB
2810 case QEMU_OPTION_s:
2811 use_gdbstub = 1;
2812 break;
2813 case QEMU_OPTION_p:
2814 gdbstub_port = atoi(optarg);
2815 break;
67b915a5 2816#endif
cd6f1169
FB
2817 case QEMU_OPTION_L:
2818 bios_dir = optarg;
2819 break;
2820 case QEMU_OPTION_S:
2821 start_emulation = 0;
2822 break;
69b91039
FB
2823 case QEMU_OPTION_pci:
2824 pci_enabled = 1;
2825 break;
bb0c6722
FB
2826 case QEMU_OPTION_isa:
2827 pci_enabled = 0;
2828 break;
77d4bc34
FB
2829 case QEMU_OPTION_prep:
2830 prep_enabled = 1;
2831 break;
ee22c2f7
FB
2832 case QEMU_OPTION_localtime:
2833 rtc_utc = 0;
2834 break;
1f04275e
FB
2835 case QEMU_OPTION_cirrusvga:
2836 cirrus_vga_enabled = 1;
2837 break;
1bfe856e
FB
2838 case QEMU_OPTION_std_vga:
2839 cirrus_vga_enabled = 0;
2840 break;
e9b137c2
FB
2841 case QEMU_OPTION_g:
2842 {
2843 const char *p;
2844 int w, h, depth;
2845 p = optarg;
2846 w = strtol(p, (char **)&p, 10);
2847 if (w <= 0) {
2848 graphic_error:
2849 fprintf(stderr, "qemu: invalid resolution or depth\n");
2850 exit(1);
2851 }
2852 if (*p != 'x')
2853 goto graphic_error;
2854 p++;
2855 h = strtol(p, (char **)&p, 10);
2856 if (h <= 0)
2857 goto graphic_error;
2858 if (*p == 'x') {
2859 p++;
2860 depth = strtol(p, (char **)&p, 10);
2861 if (depth != 8 && depth != 15 && depth != 16 &&
2862 depth != 24 && depth != 32)
2863 goto graphic_error;
2864 } else if (*p == '\0') {
2865 depth = graphic_depth;
2866 } else {
2867 goto graphic_error;
2868 }
2869
2870 graphic_width = w;
2871 graphic_height = h;
2872 graphic_depth = depth;
2873 }
2874 break;
82c643ff
FB
2875 case QEMU_OPTION_monitor:
2876 pstrcpy(monitor_device, sizeof(monitor_device), optarg);
2877 break;
2878 case QEMU_OPTION_serial:
2879 pstrcpy(serial_device, sizeof(serial_device), optarg);
2880 break;
cd6f1169 2881 }
0824d6fc
FB
2882 }
2883 }
330d0414 2884
a20dd508 2885 linux_boot = (kernel_filename != NULL);
330d0414 2886
c45886db
FB
2887 if (!linux_boot && hd_filename[0] == '\0' && hd_filename[2] == '\0' &&
2888 fd_filename[0] == '\0')
0824d6fc 2889 help();
8f2b1fb0
FB
2890
2891 /* boot to cd by default if no hard disk */
d0309311
FB
2892 if (hd_filename[0] == '\0' && boot_device == 'c') {
2893 if (fd_filename[0] != '\0')
2894 boot_device = 'a';
2895 else
2896 boot_device = 'd';
2897 }
0824d6fc 2898
dc887a4d
FB
2899#if !defined(CONFIG_SOFTMMU)
2900 /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
2901 {
2902 static uint8_t stdout_buf[4096];
2903 setvbuf(stdout, stdout_buf, _IOLBF, sizeof(stdout_buf));
2904 }
2905#else
b118d61e 2906 setvbuf(stdout, NULL, _IOLBF, 0);
dc887a4d 2907#endif
0824d6fc 2908
c4b1fcc0 2909 /* init host network redirectors */
c20709aa
FB
2910 if (net_if_type == -1) {
2911 net_if_type = NET_IF_TUN;
2912#if defined(CONFIG_SLIRP)
2913 if (access(network_script, R_OK) < 0) {
2914 net_if_type = NET_IF_USER;
2915 }
2916#endif
2917 }
2918
2919 for(i = 0; i < nb_nics; i++) {
702c651c 2920 NetDriverState *nd = &nd_table[i];
c20709aa 2921 nd->index = i;
702c651c
FB
2922 /* init virtual mac address */
2923 nd->macaddr[0] = macaddr[0];
2924 nd->macaddr[1] = macaddr[1];
2925 nd->macaddr[2] = macaddr[2];
2926 nd->macaddr[3] = macaddr[3];
2927 nd->macaddr[4] = macaddr[4];
2928 nd->macaddr[5] = macaddr[5] + i;
c20709aa
FB
2929 switch(net_if_type) {
2930#if defined(CONFIG_SLIRP)
2931 case NET_IF_USER:
2932 net_slirp_init(nd);
2933 break;
2934#endif
2935#if !defined(_WIN32)
2936 case NET_IF_TUN:
2937 if (i < nb_tun_fds) {
2938 net_fd_init(nd, tun_fds[i]);
2939 } else {
d927637d
FB
2940 if (net_tun_init(nd) < 0)
2941 net_dummy_init(nd);
c20709aa
FB
2942 }
2943 break;
2944#endif
2945 case NET_IF_DUMMY:
2946 default:
2947 net_dummy_init(nd);
2948 break;
2949 }
702c651c 2950 }
f1510b2c 2951
0824d6fc 2952 /* init the memory */
0ced6589 2953 phys_ram_size = ram_size + vga_ram_size + bios_size;
7f7f9873
FB
2954
2955#ifdef CONFIG_SOFTMMU
7d3505c5 2956#ifdef _BSD
83fb7adf
FB
2957 /* mallocs are always aligned on BSD. valloc is better for correctness */
2958 phys_ram_base = valloc(phys_ram_size);
7d3505c5 2959#else
1ccde1cb 2960 phys_ram_base = memalign(TARGET_PAGE_SIZE, phys_ram_size);
7d3505c5 2961#endif
7f7f9873
FB
2962 if (!phys_ram_base) {
2963 fprintf(stderr, "Could not allocate physical memory\n");
0824d6fc
FB
2964 exit(1);
2965 }
7f7f9873
FB
2966#else
2967 /* as we must map the same page at several addresses, we must use
2968 a fd */
2969 {
2970 const char *tmpdir;
2971
2972 tmpdir = getenv("QEMU_TMPDIR");
2973 if (!tmpdir)
2974 tmpdir = "/tmp";
2975 snprintf(phys_ram_file, sizeof(phys_ram_file), "%s/vlXXXXXX", tmpdir);
2976 if (mkstemp(phys_ram_file) < 0) {
2977 fprintf(stderr, "Could not create temporary memory file '%s'\n",
2978 phys_ram_file);
2979 exit(1);
2980 }
2981 phys_ram_fd = open(phys_ram_file, O_CREAT | O_TRUNC | O_RDWR, 0600);
2982 if (phys_ram_fd < 0) {
2983 fprintf(stderr, "Could not open temporary memory file '%s'\n",
2984 phys_ram_file);
2985 exit(1);
2986 }
1ccde1cb 2987 ftruncate(phys_ram_fd, phys_ram_size);
7f7f9873 2988 unlink(phys_ram_file);
1ccde1cb
FB
2989 phys_ram_base = mmap(get_mmap_addr(phys_ram_size),
2990 phys_ram_size,
7f7f9873
FB
2991 PROT_WRITE | PROT_READ, MAP_SHARED | MAP_FIXED,
2992 phys_ram_fd, 0);
2993 if (phys_ram_base == MAP_FAILED) {
2994 fprintf(stderr, "Could not map physical memory\n");
2995 exit(1);
2996 }
2997 }
2998#endif
0824d6fc 2999
c4b1fcc0 3000 /* we always create the cdrom drive, even if no disk is there */
5905b2e5 3001 bdrv_init();
c4b1fcc0
FB
3002 if (has_cdrom) {
3003 bs_table[2] = bdrv_new("cdrom");
3004 bdrv_set_type_hint(bs_table[2], BDRV_TYPE_CDROM);
3005 }
3006
33e3963e
FB
3007 /* open the virtual block devices */
3008 for(i = 0; i < MAX_DISKS; i++) {
3009 if (hd_filename[i]) {
33e3963e 3010 if (!bs_table[i]) {
c4b1fcc0
FB
3011 char buf[64];
3012 snprintf(buf, sizeof(buf), "hd%c", i + 'a');
3013 bs_table[i] = bdrv_new(buf);
3014 }
3015 if (bdrv_open(bs_table[i], hd_filename[i], snapshot) < 0) {
5905b2e5 3016 fprintf(stderr, "qemu: could not open hard disk image '%s'\n",
33e3963e
FB
3017 hd_filename[i]);
3018 exit(1);
3019 }
c4b1fcc0
FB
3020 if (i == 0 && cyls != 0)
3021 bdrv_set_geometry_hint(bs_table[i], cyls, heads, secs);
3022 }
3023 }
3024
3025 /* we always create at least one floppy disk */
3026 fd_table[0] = bdrv_new("fda");
3027 bdrv_set_type_hint(fd_table[0], BDRV_TYPE_FLOPPY);
3028
3029 for(i = 0; i < MAX_FD; i++) {
3030 if (fd_filename[i]) {
3031 if (!fd_table[i]) {
3032 char buf[64];
3033 snprintf(buf, sizeof(buf), "fd%c", i + 'a');
3034 fd_table[i] = bdrv_new(buf);
3035 bdrv_set_type_hint(fd_table[i], BDRV_TYPE_FLOPPY);
3036 }
3037 if (fd_filename[i] != '\0') {
3038 if (bdrv_open(fd_table[i], fd_filename[i], snapshot) < 0) {
c20709aa 3039 fprintf(stderr, "qemu: could not open floppy disk image '%s'\n",
c4b1fcc0
FB
3040 fd_filename[i]);
3041 exit(1);
3042 }
3043 }
33e3963e
FB
3044 }
3045 }
3046
330d0414
FB
3047 /* init CPU state */
3048 env = cpu_init();
3049 global_env = env;
3050 cpu_single_env = env;
3051
8a7ddc38 3052 register_savevm("timer", 0, 1, timer_save, timer_load, env);
02ba45c5 3053 register_savevm("cpu", 0, 2, cpu_save, cpu_load, env);
8a7ddc38 3054 register_savevm("ram", 0, 1, ram_save, ram_load, NULL);
bb0c6722 3055 qemu_register_reset(main_cpu_reset, global_env);
8a7ddc38 3056
330d0414 3057 init_ioports();
80cabfad 3058 cpu_calibrate_ticks();
0824d6fc 3059
313aa567 3060 /* terminal init */
a20dd508 3061 if (nographic) {
313aa567
FB
3062 dumb_display_init(ds);
3063 } else {
3064#ifdef CONFIG_SDL
3065 sdl_display_init(ds);
313aa567
FB
3066#else
3067 dumb_display_init(ds);
3068#endif
3069 }
0824d6fc 3070
82c643ff
FB
3071 vga_console = graphic_console_init(ds);
3072
3073 monitor_hd = qemu_chr_open(monitor_device);
3074 if (!monitor_hd) {
3075 fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
3076 exit(1);
3077 }
3078 monitor_init(monitor_hd, !nographic);
3079
3080 serial_hd = qemu_chr_open(serial_device);
3081 if (!serial_hd) {
3082 fprintf(stderr, "qemu: could not open serial device '%s'\n", serial_device);
3083 exit(1);
3084 }
3085 if (!strcmp(serial_device, "vc"))
3086 qemu_chr_printf(serial_hd, "serial0 console\n");
3087
3088
0824d6fc 3089 /* setup cpu signal handlers for MMU / self modifying code handling */
77fef8c1 3090#if !defined(CONFIG_SOFTMMU)
8a7ddc38 3091
77fef8c1
FB
3092#if defined (TARGET_I386) && defined(USE_CODE_COPY)
3093 {
3094 stack_t stk;
73332e5c 3095 signal_stack = memalign(16, SIGNAL_STACK_SIZE);
77fef8c1
FB
3096 stk.ss_sp = signal_stack;
3097 stk.ss_size = SIGNAL_STACK_SIZE;
3098 stk.ss_flags = 0;
3099
3100 if (sigaltstack(&stk, NULL) < 0) {
3101 perror("sigaltstack");
3102 exit(1);
3103 }
3104 }
3105#endif
8a7ddc38
FB
3106 {
3107 struct sigaction act;
77fef8c1 3108
8a7ddc38
FB
3109 sigfillset(&act.sa_mask);
3110 act.sa_flags = SA_SIGINFO;
77fef8c1 3111#if defined (TARGET_I386) && defined(USE_CODE_COPY)
8a7ddc38 3112 act.sa_flags |= SA_ONSTACK;
77fef8c1 3113#endif
8a7ddc38
FB
3114 act.sa_sigaction = host_segv_handler;
3115 sigaction(SIGSEGV, &act, NULL);
3116 sigaction(SIGBUS, &act, NULL);
77fef8c1 3117#if defined (TARGET_I386) && defined(USE_CODE_COPY)
8a7ddc38 3118 sigaction(SIGFPE, &act, NULL);
77fef8c1 3119#endif
8a7ddc38 3120 }
3a51dee6 3121#endif
0824d6fc 3122
67b915a5 3123#ifndef _WIN32
8a7ddc38
FB
3124 {
3125 struct sigaction act;
3126 sigfillset(&act.sa_mask);
3127 act.sa_flags = 0;
3128 act.sa_handler = SIG_IGN;
3129 sigaction(SIGPIPE, &act, NULL);
3130 }
67b915a5 3131#endif
73332e5c
FB
3132 init_timers();
3133
3134#if defined(TARGET_I386)
3135 pc_init(ram_size, vga_ram_size, boot_device,
3136 ds, fd_filename, snapshot,
3137 kernel_filename, kernel_cmdline, initrd_filename);
3138#elif defined(TARGET_PPC)
a541f297
FB
3139 ppc_init(ram_size, vga_ram_size, boot_device,
3140 ds, fd_filename, snapshot,
3141 kernel_filename, kernel_cmdline, initrd_filename);
73332e5c
FB
3142#endif
3143
8a7ddc38
FB
3144 gui_timer = qemu_new_timer(rt_clock, gui_update, NULL);
3145 qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock));
7f7f9873 3146
67b915a5 3147#ifdef CONFIG_GDBSTUB
b4608c04 3148 if (use_gdbstub) {
8a7ddc38
FB
3149 if (gdbserver_start(gdbstub_port) < 0) {
3150 fprintf(stderr, "Could not open gdbserver socket on port %d\n",
3151 gdbstub_port);
3152 exit(1);
3153 } else {
3154 printf("Waiting gdb connection on port %d\n", gdbstub_port);
3155 }
5905b2e5 3156 term_init();
67b915a5
FB
3157 } else
3158#endif
3159 {
5905b2e5
FB
3160 term_init();
3161 /* XXX: simplify init */
3162 read_passwords();
3163 if (start_emulation) {
3164 vm_start();
3165 }
0824d6fc 3166 }
8a7ddc38 3167 main_loop();
40c3bac3 3168 quit_timers();
0824d6fc
FB
3169 return 0;
3170}