]> git.proxmox.com Git - mirror_qemu.git/blame - vl.c
char device support
[mirror_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
82c643ff
FB
985void qemu_chr_add_read_handler(CharDriverState *s,
986 IOCanRWHandler *fd_can_read,
987 IOReadHandler *fd_read, void *opaque)
988{
989 s->chr_add_read_handler(s, fd_can_read, fd_read, opaque);
990}
991
992void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event)
993{
994 s->chr_event = chr_event;
995}
67b915a5 996
82c643ff 997static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
313aa567 998{
82c643ff
FB
999 return len;
1000}
1001
1002static void null_chr_add_read_handler(CharDriverState *chr,
1003 IOCanRWHandler *fd_can_read,
1004 IOReadHandler *fd_read, void *opaque)
1005{
1006}
1007
1008CharDriverState *qemu_chr_open_null(void)
1009{
1010 CharDriverState *chr;
1011
1012 chr = qemu_mallocz(sizeof(CharDriverState));
1013 if (!chr)
1014 return NULL;
1015 chr->chr_write = null_chr_write;
1016 chr->chr_add_read_handler = null_chr_add_read_handler;
1017 return chr;
1018}
1019
1020#ifndef _WIN32
1021
1022typedef struct {
1023 int fd_in, fd_out;
1024 /* for nographic stdio only */
1025 IOCanRWHandler *fd_can_read;
1026 IOReadHandler *fd_read;
1027 void *fd_opaque;
1028} FDCharDriver;
1029
1030#define STDIO_MAX_CLIENTS 2
1031
1032static int stdio_nb_clients;
1033static CharDriverState *stdio_clients[STDIO_MAX_CLIENTS];
1034
1035static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1036{
1037 FDCharDriver *s = chr->opaque;
1038 return write(s->fd_out, buf, len);
1039}
1040
1041static void fd_chr_add_read_handler(CharDriverState *chr,
1042 IOCanRWHandler *fd_can_read,
1043 IOReadHandler *fd_read, void *opaque)
1044{
1045 FDCharDriver *s = chr->opaque;
1046
1047 if (nographic && s->fd_in == 0) {
1048 s->fd_can_read = fd_can_read;
1049 s->fd_read = fd_read;
1050 s->fd_opaque = opaque;
80cabfad 1051 } else {
82c643ff
FB
1052 qemu_add_fd_read_handler(s->fd_in, fd_can_read, fd_read, opaque);
1053 }
1054}
1055
1056/* open a character device to a unix fd */
1057CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
1058{
1059 CharDriverState *chr;
1060 FDCharDriver *s;
1061
1062 chr = qemu_mallocz(sizeof(CharDriverState));
1063 if (!chr)
1064 return NULL;
1065 s = qemu_mallocz(sizeof(FDCharDriver));
1066 if (!s) {
1067 free(chr);
1068 return NULL;
1069 }
1070 s->fd_in = fd_in;
1071 s->fd_out = fd_out;
1072 chr->opaque = s;
1073 chr->chr_write = fd_chr_write;
1074 chr->chr_add_read_handler = fd_chr_add_read_handler;
1075 return chr;
1076}
1077
1078/* for STDIO, we handle the case where several clients use it
1079 (nographic mode) */
1080
1081#define TERM_ESCAPE 0x01 /* ctrl-a is used for escape */
1082
1083static int term_got_escape, client_index;
1084
1085void term_print_help(void)
1086{
1087 printf("\n"
1088 "C-a h print this help\n"
1089 "C-a x exit emulator\n"
1090 "C-a s save disk data back to file (if -snapshot)\n"
1091 "C-a b send break (magic sysrq)\n"
1092 "C-a c switch between console and monitor\n"
1093 "C-a C-a send C-a\n"
1094 );
1095}
1096
1097/* called when a char is received */
1098static void stdio_received_byte(int ch)
1099{
1100 if (term_got_escape) {
1101 term_got_escape = 0;
1102 switch(ch) {
1103 case 'h':
1104 term_print_help();
1105 break;
1106 case 'x':
1107 exit(0);
1108 break;
1109 case 's':
1110 {
1111 int i;
1112 for (i = 0; i < MAX_DISKS; i++) {
1113 if (bs_table[i])
1114 bdrv_commit(bs_table[i]);
1115 }
1116 }
1117 break;
1118 case 'b':
1119 if (client_index < stdio_nb_clients) {
1120 CharDriverState *chr;
1121 FDCharDriver *s;
1122
1123 chr = stdio_clients[client_index];
1124 s = chr->opaque;
1125 chr->chr_event(s->fd_opaque, CHR_EVENT_BREAK);
1126 }
1127 break;
1128 case 'c':
1129 client_index++;
1130 if (client_index >= stdio_nb_clients)
1131 client_index = 0;
1132 if (client_index == 0) {
1133 /* send a new line in the monitor to get the prompt */
1134 ch = '\r';
1135 goto send_char;
1136 }
1137 break;
1138 case TERM_ESCAPE:
1139 goto send_char;
1140 }
1141 } else if (ch == TERM_ESCAPE) {
1142 term_got_escape = 1;
1143 } else {
1144 send_char:
1145 if (client_index < stdio_nb_clients) {
1146 uint8_t buf[1];
1147 CharDriverState *chr;
1148 FDCharDriver *s;
1149
1150 chr = stdio_clients[client_index];
1151 s = chr->opaque;
1152 buf[0] = ch;
1153 /* XXX: should queue the char if the device is not
1154 ready */
1155 if (s->fd_can_read(s->fd_opaque) > 0)
1156 s->fd_read(s->fd_opaque, buf, 1);
c4b1fcc0 1157 }
330d0414 1158 }
330d0414
FB
1159}
1160
82c643ff
FB
1161static int stdio_can_read(void *opaque)
1162{
1163 /* XXX: not strictly correct */
1164 return 1;
1165}
1166
1167static void stdio_read(void *opaque, const uint8_t *buf, int size)
1168{
1169 int i;
1170 for(i = 0; i < size; i++)
1171 stdio_received_byte(buf[i]);
1172}
1173
1174CharDriverState *qemu_chr_open_stdio(void)
1175{
1176 CharDriverState *chr;
1177
1178 if (nographic) {
1179 if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
1180 return NULL;
1181 chr = qemu_chr_open_fd(0, 1);
1182 if (stdio_nb_clients == 0)
1183 qemu_add_fd_read_handler(0, stdio_can_read, stdio_read, NULL);
1184 client_index = stdio_nb_clients;
1185 } else {
1186 if (stdio_nb_clients != 0)
1187 return NULL;
1188 chr = qemu_chr_open_fd(0, 1);
1189 }
1190 stdio_clients[stdio_nb_clients++] = chr;
1191 return chr;
1192}
1193
1194#if defined(__linux__)
1195CharDriverState *qemu_chr_open_pty(void)
1196{
1197 char slave_name[1024];
1198 int master_fd, slave_fd;
1199
1200 /* Not satisfying */
1201 if (openpty(&master_fd, &slave_fd, slave_name, NULL, NULL) < 0) {
1202 return NULL;
1203 }
1204 fprintf(stderr, "char device redirected to %s\n", slave_name);
1205 return qemu_chr_open_fd(master_fd, master_fd);
1206}
1207#else
1208CharDriverState *qemu_chr_open_pty(void)
1209{
1210 return NULL;
1211}
67b915a5
FB
1212#endif
1213
82c643ff
FB
1214#endif /* !defined(_WIN32) */
1215
1216CharDriverState *qemu_chr_open(const char *filename)
1217{
1218 if (!strcmp(filename, "vc")) {
1219 return text_console_init(&display_state);
1220 } else if (!strcmp(filename, "null")) {
1221 return qemu_chr_open_null();
1222 } else
1223#ifndef _WIN32
1224 if (!strcmp(filename, "pty")) {
1225 return qemu_chr_open_pty();
1226 } else if (!strcmp(filename, "stdio")) {
1227 return qemu_chr_open_stdio();
1228 } else
1229#endif
1230 {
1231 return NULL;
1232 }
1233}
1234
80cabfad 1235/***********************************************************/
c20709aa 1236/* Linux network device redirectors */
330d0414 1237
c20709aa
FB
1238void hex_dump(FILE *f, const uint8_t *buf, int size)
1239{
1240 int len, i, j, c;
1241
1242 for(i=0;i<size;i+=16) {
1243 len = size - i;
1244 if (len > 16)
1245 len = 16;
1246 fprintf(f, "%08x ", i);
1247 for(j=0;j<16;j++) {
1248 if (j < len)
1249 fprintf(f, " %02x", buf[i+j]);
1250 else
1251 fprintf(f, " ");
1252 }
1253 fprintf(f, " ");
1254 for(j=0;j<len;j++) {
1255 c = buf[i+j];
1256 if (c < ' ' || c > '~')
1257 c = '.';
1258 fprintf(f, "%c", c);
1259 }
1260 fprintf(f, "\n");
1261 }
1262}
1263
1264void qemu_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1265{
1266 nd->send_packet(nd, buf, size);
1267}
67b915a5 1268
c20709aa
FB
1269void qemu_add_read_packet(NetDriverState *nd, IOCanRWHandler *fd_can_read,
1270 IOReadHandler *fd_read, void *opaque)
67b915a5 1271{
c20709aa
FB
1272 nd->add_read_packet(nd, fd_can_read, fd_read, opaque);
1273}
1274
1275/* dummy network adapter */
1276
1277static void dummy_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1278{
1279}
1280
1281static void dummy_add_read_packet(NetDriverState *nd,
1282 IOCanRWHandler *fd_can_read,
1283 IOReadHandler *fd_read, void *opaque)
1284{
1285}
1286
1287static int net_dummy_init(NetDriverState *nd)
1288{
1289 nd->send_packet = dummy_send_packet;
1290 nd->add_read_packet = dummy_add_read_packet;
1291 pstrcpy(nd->ifname, sizeof(nd->ifname), "dummy");
67b915a5
FB
1292 return 0;
1293}
1294
c20709aa
FB
1295#if defined(CONFIG_SLIRP)
1296
1297/* slirp network adapter */
1298
1299static void *slirp_fd_opaque;
1300static IOCanRWHandler *slirp_fd_can_read;
1301static IOReadHandler *slirp_fd_read;
1302static int slirp_inited;
1303
1304int slirp_can_output(void)
1305{
1306 return slirp_fd_can_read(slirp_fd_opaque);
1307}
1308
1309void slirp_output(const uint8_t *pkt, int pkt_len)
67b915a5 1310{
c20709aa
FB
1311#if 0
1312 printf("output:\n");
1313 hex_dump(stdout, pkt, pkt_len);
1314#endif
1315 slirp_fd_read(slirp_fd_opaque, pkt, pkt_len);
67b915a5
FB
1316}
1317
c20709aa
FB
1318static void slirp_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1319{
1320#if 0
1321 printf("input:\n");
1322 hex_dump(stdout, buf, size);
1323#endif
1324 slirp_input(buf, size);
1325}
1326
1327static void slirp_add_read_packet(NetDriverState *nd,
1328 IOCanRWHandler *fd_can_read,
1329 IOReadHandler *fd_read, void *opaque)
1330{
1331 slirp_fd_opaque = opaque;
1332 slirp_fd_can_read = fd_can_read;
1333 slirp_fd_read = fd_read;
1334}
1335
1336static int net_slirp_init(NetDriverState *nd)
1337{
1338 if (!slirp_inited) {
1339 slirp_inited = 1;
1340 slirp_init();
1341 }
1342 nd->send_packet = slirp_send_packet;
1343 nd->add_read_packet = slirp_add_read_packet;
1344 pstrcpy(nd->ifname, sizeof(nd->ifname), "slirp");
1345 return 0;
1346}
1347
1348#endif /* CONFIG_SLIRP */
1349
1350#if !defined(_WIN32)
7d3505c5
FB
1351#ifdef _BSD
1352static int tun_open(char *ifname, int ifname_size)
1353{
1354 int fd;
1355 char *dev;
1356 struct stat s;
67b915a5 1357
7d3505c5
FB
1358 fd = open("/dev/tap", O_RDWR);
1359 if (fd < 0) {
1360 fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
1361 return -1;
1362 }
1363
1364 fstat(fd, &s);
1365 dev = devname(s.st_rdev, S_IFCHR);
1366 pstrcpy(ifname, ifname_size, dev);
1367
1368 fcntl(fd, F_SETFL, O_NONBLOCK);
1369 return fd;
1370}
1371#else
c4b1fcc0 1372static int tun_open(char *ifname, int ifname_size)
330d0414 1373{
80cabfad 1374 struct ifreq ifr;
c4b1fcc0 1375 int fd, ret;
80cabfad
FB
1376
1377 fd = open("/dev/net/tun", O_RDWR);
1378 if (fd < 0) {
1379 fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
1380 return -1;
330d0414 1381 }
80cabfad
FB
1382 memset(&ifr, 0, sizeof(ifr));
1383 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
1384 pstrcpy(ifr.ifr_name, IFNAMSIZ, "tun%d");
1385 ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
1386 if (ret != 0) {
1387 fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
1388 close(fd);
1389 return -1;
1390 }
1391 printf("Connected to host network interface: %s\n", ifr.ifr_name);
c4b1fcc0 1392 pstrcpy(ifname, ifname_size, ifr.ifr_name);
80cabfad 1393 fcntl(fd, F_SETFL, O_NONBLOCK);
c4b1fcc0
FB
1394 return fd;
1395}
7d3505c5 1396#endif
330d0414 1397
c20709aa
FB
1398static void tun_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
1399{
1400 write(nd->fd, buf, size);
1401}
1402
1403static void tun_add_read_packet(NetDriverState *nd,
1404 IOCanRWHandler *fd_can_read,
1405 IOReadHandler *fd_read, void *opaque)
c4b1fcc0 1406{
c20709aa
FB
1407 qemu_add_fd_read_handler(nd->fd, fd_can_read, fd_read, opaque);
1408}
1409
1410static int net_tun_init(NetDriverState *nd)
1411{
1412 int pid, status;
1413 char *args[3];
c4b1fcc0
FB
1414 char **parg;
1415
c20709aa
FB
1416 nd->fd = tun_open(nd->ifname, sizeof(nd->ifname));
1417 if (nd->fd < 0)
1418 return -1;
c4b1fcc0 1419
c20709aa
FB
1420 /* try to launch network init script */
1421 pid = fork();
1422 if (pid >= 0) {
1423 if (pid == 0) {
1424 parg = args;
1425 *parg++ = network_script;
1426 *parg++ = nd->ifname;
1427 *parg++ = NULL;
1428 execv(network_script, args);
1429 exit(1);
1430 }
1431 while (waitpid(pid, &status, 0) != pid);
1432 if (!WIFEXITED(status) ||
1433 WEXITSTATUS(status) != 0) {
1434 fprintf(stderr, "%s: could not launch network script\n",
1435 network_script);
80cabfad 1436 }
330d0414 1437 }
c20709aa
FB
1438 nd->send_packet = tun_send_packet;
1439 nd->add_read_packet = tun_add_read_packet;
80cabfad 1440 return 0;
330d0414
FB
1441}
1442
c20709aa 1443static int net_fd_init(NetDriverState *nd, int fd)
330d0414 1444{
c20709aa
FB
1445 nd->fd = fd;
1446 nd->send_packet = tun_send_packet;
1447 nd->add_read_packet = tun_add_read_packet;
1448 pstrcpy(nd->ifname, sizeof(nd->ifname), "tunfd");
1449 return 0;
80cabfad 1450}
330d0414 1451
c20709aa 1452#endif /* !_WIN32 */
67b915a5 1453
313aa567
FB
1454/***********************************************************/
1455/* dumb display */
1456
67b915a5
FB
1457#ifdef _WIN32
1458
1459static void term_exit(void)
1460{
1461}
1462
1463static void term_init(void)
1464{
1465}
1466
1467#else
1468
313aa567
FB
1469/* init terminal so that we can grab keys */
1470static struct termios oldtty;
02ba45c5 1471static int old_fd0_flags;
313aa567
FB
1472
1473static void term_exit(void)
1474{
1475 tcsetattr (0, TCSANOW, &oldtty);
02ba45c5 1476 fcntl(0, F_SETFL, old_fd0_flags);
313aa567
FB
1477}
1478
1479static void term_init(void)
1480{
1481 struct termios tty;
1482
1483 tcgetattr (0, &tty);
1484 oldtty = tty;
02ba45c5 1485 old_fd0_flags = fcntl(0, F_GETFL);
313aa567
FB
1486
1487 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1488 |INLCR|IGNCR|ICRNL|IXON);
1489 tty.c_oflag |= OPOST;
a20dd508
FB
1490 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1491 /* if graphical mode, we allow Ctrl-C handling */
1492 if (nographic)
1493 tty.c_lflag &= ~ISIG;
313aa567
FB
1494 tty.c_cflag &= ~(CSIZE|PARENB);
1495 tty.c_cflag |= CS8;
1496 tty.c_cc[VMIN] = 1;
1497 tty.c_cc[VTIME] = 0;
1498
1499 tcsetattr (0, TCSANOW, &tty);
1500
1501 atexit(term_exit);
1502
1503 fcntl(0, F_SETFL, O_NONBLOCK);
1504}
1505
67b915a5
FB
1506#endif
1507
313aa567
FB
1508static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
1509{
1510}
1511
1512static void dumb_resize(DisplayState *ds, int w, int h)
1513{
1514}
1515
1516static void dumb_refresh(DisplayState *ds)
1517{
1518 vga_update_display();
1519}
1520
1521void dumb_display_init(DisplayState *ds)
1522{
1523 ds->data = NULL;
1524 ds->linesize = 0;
1525 ds->depth = 0;
1526 ds->dpy_update = dumb_update;
1527 ds->dpy_resize = dumb_resize;
1528 ds->dpy_refresh = dumb_refresh;
1529}
1530
3a51dee6 1531#if !defined(CONFIG_SOFTMMU)
f1510b2c 1532/***********************************************************/
0824d6fc
FB
1533/* cpu signal handler */
1534static void host_segv_handler(int host_signum, siginfo_t *info,
1535 void *puc)
1536{
1537 if (cpu_signal_handler(host_signum, info, puc))
1538 return;
1539 term_exit();
1540 abort();
1541}
3a51dee6 1542#endif
0824d6fc 1543
8a7ddc38
FB
1544/***********************************************************/
1545/* I/O handling */
0824d6fc 1546
c4b1fcc0
FB
1547#define MAX_IO_HANDLERS 64
1548
1549typedef struct IOHandlerRecord {
1550 int fd;
1551 IOCanRWHandler *fd_can_read;
1552 IOReadHandler *fd_read;
1553 void *opaque;
1554 /* temporary data */
1555 struct pollfd *ufd;
1556 int max_size;
8a7ddc38 1557 struct IOHandlerRecord *next;
c4b1fcc0
FB
1558} IOHandlerRecord;
1559
8a7ddc38 1560static IOHandlerRecord *first_io_handler;
c4b1fcc0 1561
8a7ddc38
FB
1562int qemu_add_fd_read_handler(int fd, IOCanRWHandler *fd_can_read,
1563 IOReadHandler *fd_read, void *opaque)
c4b1fcc0
FB
1564{
1565 IOHandlerRecord *ioh;
1566
8a7ddc38
FB
1567 ioh = qemu_mallocz(sizeof(IOHandlerRecord));
1568 if (!ioh)
c4b1fcc0 1569 return -1;
c4b1fcc0
FB
1570 ioh->fd = fd;
1571 ioh->fd_can_read = fd_can_read;
1572 ioh->fd_read = fd_read;
1573 ioh->opaque = opaque;
8a7ddc38
FB
1574 ioh->next = first_io_handler;
1575 first_io_handler = ioh;
c4b1fcc0
FB
1576 return 0;
1577}
1578
8a7ddc38
FB
1579void qemu_del_fd_read_handler(int fd)
1580{
1581 IOHandlerRecord **pioh, *ioh;
b4608c04 1582
8a7ddc38
FB
1583 pioh = &first_io_handler;
1584 for(;;) {
1585 ioh = *pioh;
1586 if (ioh == NULL)
1587 break;
1588 if (ioh->fd == fd) {
1589 *pioh = ioh->next;
1590 break;
1591 }
1592 pioh = &ioh->next;
1593 }
1594}
1595
1596/***********************************************************/
1597/* savevm/loadvm support */
1598
1599void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
b4608c04 1600{
8a7ddc38 1601 fwrite(buf, 1, size, f);
b4608c04
FB
1602}
1603
8a7ddc38 1604void qemu_put_byte(QEMUFile *f, int v)
b4608c04 1605{
8a7ddc38
FB
1606 fputc(v, f);
1607}
1608
1609void qemu_put_be16(QEMUFile *f, unsigned int v)
1610{
1611 qemu_put_byte(f, v >> 8);
1612 qemu_put_byte(f, v);
1613}
1614
1615void qemu_put_be32(QEMUFile *f, unsigned int v)
1616{
1617 qemu_put_byte(f, v >> 24);
1618 qemu_put_byte(f, v >> 16);
1619 qemu_put_byte(f, v >> 8);
1620 qemu_put_byte(f, v);
1621}
1622
1623void qemu_put_be64(QEMUFile *f, uint64_t v)
1624{
1625 qemu_put_be32(f, v >> 32);
1626 qemu_put_be32(f, v);
1627}
1628
1629int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size)
1630{
1631 return fread(buf, 1, size, f);
1632}
1633
1634int qemu_get_byte(QEMUFile *f)
1635{
1636 int v;
1637 v = fgetc(f);
1638 if (v == EOF)
1639 return 0;
1640 else
1641 return v;
1642}
1643
1644unsigned int qemu_get_be16(QEMUFile *f)
1645{
1646 unsigned int v;
1647 v = qemu_get_byte(f) << 8;
1648 v |= qemu_get_byte(f);
1649 return v;
1650}
1651
1652unsigned int qemu_get_be32(QEMUFile *f)
1653{
1654 unsigned int v;
1655 v = qemu_get_byte(f) << 24;
1656 v |= qemu_get_byte(f) << 16;
1657 v |= qemu_get_byte(f) << 8;
1658 v |= qemu_get_byte(f);
1659 return v;
1660}
1661
1662uint64_t qemu_get_be64(QEMUFile *f)
1663{
1664 uint64_t v;
1665 v = (uint64_t)qemu_get_be32(f) << 32;
1666 v |= qemu_get_be32(f);
1667 return v;
1668}
1669
1670int64_t qemu_ftell(QEMUFile *f)
1671{
1672 return ftell(f);
1673}
1674
1675int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
1676{
1677 if (fseek(f, pos, whence) < 0)
1678 return -1;
1679 return ftell(f);
1680}
1681
1682typedef struct SaveStateEntry {
1683 char idstr[256];
1684 int instance_id;
1685 int version_id;
1686 SaveStateHandler *save_state;
1687 LoadStateHandler *load_state;
1688 void *opaque;
1689 struct SaveStateEntry *next;
1690} SaveStateEntry;
b4608c04 1691
8a7ddc38
FB
1692static SaveStateEntry *first_se;
1693
1694int register_savevm(const char *idstr,
1695 int instance_id,
1696 int version_id,
1697 SaveStateHandler *save_state,
1698 LoadStateHandler *load_state,
1699 void *opaque)
1700{
1701 SaveStateEntry *se, **pse;
1702
1703 se = qemu_malloc(sizeof(SaveStateEntry));
1704 if (!se)
1705 return -1;
1706 pstrcpy(se->idstr, sizeof(se->idstr), idstr);
1707 se->instance_id = instance_id;
1708 se->version_id = version_id;
1709 se->save_state = save_state;
1710 se->load_state = load_state;
1711 se->opaque = opaque;
1712 se->next = NULL;
1713
1714 /* add at the end of list */
1715 pse = &first_se;
1716 while (*pse != NULL)
1717 pse = &(*pse)->next;
1718 *pse = se;
1719 return 0;
1720}
1721
1722#define QEMU_VM_FILE_MAGIC 0x5145564d
1723#define QEMU_VM_FILE_VERSION 0x00000001
1724
1725int qemu_savevm(const char *filename)
1726{
1727 SaveStateEntry *se;
1728 QEMUFile *f;
1729 int len, len_pos, cur_pos, saved_vm_running, ret;
1730
1731 saved_vm_running = vm_running;
1732 vm_stop(0);
1733
1734 f = fopen(filename, "wb");
1735 if (!f) {
1736 ret = -1;
1737 goto the_end;
313aa567
FB
1738 }
1739
8a7ddc38
FB
1740 qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
1741 qemu_put_be32(f, QEMU_VM_FILE_VERSION);
1742
1743 for(se = first_se; se != NULL; se = se->next) {
1744 /* ID string */
1745 len = strlen(se->idstr);
1746 qemu_put_byte(f, len);
1747 qemu_put_buffer(f, se->idstr, len);
1748
1749 qemu_put_be32(f, se->instance_id);
1750 qemu_put_be32(f, se->version_id);
1751
1752 /* record size: filled later */
1753 len_pos = ftell(f);
1754 qemu_put_be32(f, 0);
1755
1756 se->save_state(f, se->opaque);
1757
1758 /* fill record size */
1759 cur_pos = ftell(f);
1760 len = ftell(f) - len_pos - 4;
1761 fseek(f, len_pos, SEEK_SET);
1762 qemu_put_be32(f, len);
1763 fseek(f, cur_pos, SEEK_SET);
1764 }
1765
1766 fclose(f);
1767 ret = 0;
1768 the_end:
1769 if (saved_vm_running)
1770 vm_start();
1771 return ret;
1772}
1773
1774static SaveStateEntry *find_se(const char *idstr, int instance_id)
1775{
1776 SaveStateEntry *se;
1777
1778 for(se = first_se; se != NULL; se = se->next) {
1779 if (!strcmp(se->idstr, idstr) &&
1780 instance_id == se->instance_id)
1781 return se;
1782 }
1783 return NULL;
1784}
1785
1786int qemu_loadvm(const char *filename)
1787{
1788 SaveStateEntry *se;
1789 QEMUFile *f;
1790 int len, cur_pos, ret, instance_id, record_len, version_id;
1791 int saved_vm_running;
1792 unsigned int v;
1793 char idstr[256];
1794
1795 saved_vm_running = vm_running;
1796 vm_stop(0);
1797
1798 f = fopen(filename, "rb");
1799 if (!f) {
1800 ret = -1;
1801 goto the_end;
1802 }
1803
1804 v = qemu_get_be32(f);
1805 if (v != QEMU_VM_FILE_MAGIC)
1806 goto fail;
1807 v = qemu_get_be32(f);
1808 if (v != QEMU_VM_FILE_VERSION) {
1809 fail:
1810 fclose(f);
1811 ret = -1;
1812 goto the_end;
1813 }
b4608c04 1814 for(;;) {
a541f297 1815#if defined (DO_TB_FLUSH)
d927637d 1816 tb_flush(global_env);
a541f297 1817#endif
8a7ddc38
FB
1818 len = qemu_get_byte(f);
1819 if (feof(f))
cd4c3e88 1820 break;
8a7ddc38
FB
1821 qemu_get_buffer(f, idstr, len);
1822 idstr[len] = '\0';
1823 instance_id = qemu_get_be32(f);
1824 version_id = qemu_get_be32(f);
1825 record_len = qemu_get_be32(f);
1826#if 0
1827 printf("idstr=%s instance=0x%x version=%d len=%d\n",
1828 idstr, instance_id, version_id, record_len);
1829#endif
1830 cur_pos = ftell(f);
1831 se = find_se(idstr, instance_id);
1832 if (!se) {
1833 fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n",
1834 instance_id, idstr);
1835 } else {
1836 ret = se->load_state(f, se->opaque, version_id);
1837 if (ret < 0) {
1838 fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
1839 instance_id, idstr);
1840 }
34865134 1841 }
8a7ddc38
FB
1842 /* always seek to exact end of record */
1843 qemu_fseek(f, cur_pos + record_len, SEEK_SET);
1844 }
1845 fclose(f);
1846 ret = 0;
1847 the_end:
1848 if (saved_vm_running)
1849 vm_start();
1850 return ret;
1851}
1852
1853/***********************************************************/
1854/* cpu save/restore */
1855
1856#if defined(TARGET_I386)
1857
1858static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
1859{
02ba45c5 1860 qemu_put_be32(f, dt->selector);
8a7ddc38
FB
1861 qemu_put_be32(f, (uint32_t)dt->base);
1862 qemu_put_be32(f, dt->limit);
1863 qemu_put_be32(f, dt->flags);
1864}
1865
1866static void cpu_get_seg(QEMUFile *f, SegmentCache *dt)
1867{
02ba45c5 1868 dt->selector = qemu_get_be32(f);
8a7ddc38
FB
1869 dt->base = (uint8_t *)qemu_get_be32(f);
1870 dt->limit = qemu_get_be32(f);
1871 dt->flags = qemu_get_be32(f);
1872}
1873
1874void cpu_save(QEMUFile *f, void *opaque)
1875{
1876 CPUState *env = opaque;
1877 uint16_t fptag, fpus, fpuc;
1878 uint32_t hflags;
1879 int i;
1880
1881 for(i = 0; i < 8; i++)
1882 qemu_put_be32s(f, &env->regs[i]);
1883 qemu_put_be32s(f, &env->eip);
1884 qemu_put_be32s(f, &env->eflags);
1885 qemu_put_be32s(f, &env->eflags);
1886 hflags = env->hflags; /* XXX: suppress most of the redundant hflags */
1887 qemu_put_be32s(f, &hflags);
1888
1889 /* FPU */
1890 fpuc = env->fpuc;
1891 fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
1892 fptag = 0;
1893 for (i=7; i>=0; i--) {
1894 fptag <<= 2;
1895 if (env->fptags[i]) {
1896 fptag |= 3;
1897 }
1898 }
1899
1900 qemu_put_be16s(f, &fpuc);
1901 qemu_put_be16s(f, &fpus);
1902 qemu_put_be16s(f, &fptag);
1903
1904 for(i = 0; i < 8; i++) {
1905 uint64_t mant;
1906 uint16_t exp;
1907 cpu_get_fp80(&mant, &exp, env->fpregs[i]);
1908 qemu_put_be64(f, mant);
1909 qemu_put_be16(f, exp);
1910 }
1911
1912 for(i = 0; i < 6; i++)
1913 cpu_put_seg(f, &env->segs[i]);
1914 cpu_put_seg(f, &env->ldt);
1915 cpu_put_seg(f, &env->tr);
1916 cpu_put_seg(f, &env->gdt);
1917 cpu_put_seg(f, &env->idt);
1918
1919 qemu_put_be32s(f, &env->sysenter_cs);
1920 qemu_put_be32s(f, &env->sysenter_esp);
1921 qemu_put_be32s(f, &env->sysenter_eip);
1922
1923 qemu_put_be32s(f, &env->cr[0]);
1924 qemu_put_be32s(f, &env->cr[2]);
1925 qemu_put_be32s(f, &env->cr[3]);
1926 qemu_put_be32s(f, &env->cr[4]);
1927
1928 for(i = 0; i < 8; i++)
1929 qemu_put_be32s(f, &env->dr[i]);
1930
1931 /* MMU */
1932 qemu_put_be32s(f, &env->a20_mask);
1933}
1934
1935int cpu_load(QEMUFile *f, void *opaque, int version_id)
1936{
1937 CPUState *env = opaque;
1938 int i;
1939 uint32_t hflags;
1940 uint16_t fpus, fpuc, fptag;
1941
02ba45c5 1942 if (version_id != 2)
8a7ddc38
FB
1943 return -EINVAL;
1944 for(i = 0; i < 8; i++)
1945 qemu_get_be32s(f, &env->regs[i]);
1946 qemu_get_be32s(f, &env->eip);
1947 qemu_get_be32s(f, &env->eflags);
1948 qemu_get_be32s(f, &env->eflags);
1949 qemu_get_be32s(f, &hflags);
1950
1951 qemu_get_be16s(f, &fpuc);
1952 qemu_get_be16s(f, &fpus);
1953 qemu_get_be16s(f, &fptag);
1954
1955 for(i = 0; i < 8; i++) {
1956 uint64_t mant;
1957 uint16_t exp;
1958 mant = qemu_get_be64(f);
1959 exp = qemu_get_be16(f);
1960 env->fpregs[i] = cpu_set_fp80(mant, exp);
1961 }
1962
1963 env->fpuc = fpuc;
1964 env->fpstt = (fpus >> 11) & 7;
1965 env->fpus = fpus & ~0x3800;
1966 for(i = 0; i < 8; i++) {
1967 env->fptags[i] = ((fptag & 3) == 3);
1968 fptag >>= 2;
1969 }
1970
1971 for(i = 0; i < 6; i++)
1972 cpu_get_seg(f, &env->segs[i]);
1973 cpu_get_seg(f, &env->ldt);
1974 cpu_get_seg(f, &env->tr);
1975 cpu_get_seg(f, &env->gdt);
1976 cpu_get_seg(f, &env->idt);
1977
1978 qemu_get_be32s(f, &env->sysenter_cs);
1979 qemu_get_be32s(f, &env->sysenter_esp);
1980 qemu_get_be32s(f, &env->sysenter_eip);
1981
1982 qemu_get_be32s(f, &env->cr[0]);
1983 qemu_get_be32s(f, &env->cr[2]);
1984 qemu_get_be32s(f, &env->cr[3]);
1985 qemu_get_be32s(f, &env->cr[4]);
1986
1987 for(i = 0; i < 8; i++)
1988 qemu_get_be32s(f, &env->dr[i]);
1989
1990 /* MMU */
1991 qemu_get_be32s(f, &env->a20_mask);
1992
1993 /* XXX: compute hflags from scratch, except for CPL and IIF */
1994 env->hflags = hflags;
1995 tlb_flush(env, 1);
1996 return 0;
1997}
1998
a541f297
FB
1999#elif defined(TARGET_PPC)
2000void cpu_save(QEMUFile *f, void *opaque)
2001{
2002}
2003
2004int cpu_load(QEMUFile *f, void *opaque, int version_id)
2005{
2006 return 0;
2007}
8a7ddc38
FB
2008#else
2009
2010#warning No CPU save/restore functions
2011
2012#endif
2013
2014/***********************************************************/
2015/* ram save/restore */
2016
2017/* we just avoid storing empty pages */
2018static void ram_put_page(QEMUFile *f, const uint8_t *buf, int len)
2019{
2020 int i, v;
2021
2022 v = buf[0];
2023 for(i = 1; i < len; i++) {
2024 if (buf[i] != v)
2025 goto normal_save;
2026 }
2027 qemu_put_byte(f, 1);
2028 qemu_put_byte(f, v);
2029 return;
2030 normal_save:
2031 qemu_put_byte(f, 0);
2032 qemu_put_buffer(f, buf, len);
2033}
2034
2035static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
2036{
2037 int v;
2038
2039 v = qemu_get_byte(f);
2040 switch(v) {
2041 case 0:
2042 if (qemu_get_buffer(f, buf, len) != len)
2043 return -EIO;
2044 break;
2045 case 1:
2046 v = qemu_get_byte(f);
2047 memset(buf, v, len);
2048 break;
2049 default:
2050 return -EINVAL;
2051 }
2052 return 0;
2053}
2054
2055static void ram_save(QEMUFile *f, void *opaque)
2056{
2057 int i;
2058 qemu_put_be32(f, phys_ram_size);
2059 for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
2060 ram_put_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
2061 }
2062}
2063
2064static int ram_load(QEMUFile *f, void *opaque, int version_id)
2065{
2066 int i, ret;
2067
2068 if (version_id != 1)
2069 return -EINVAL;
2070 if (qemu_get_be32(f) != phys_ram_size)
2071 return -EINVAL;
2072 for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
2073 ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
2074 if (ret)
2075 return ret;
2076 }
2077 return 0;
2078}
2079
2080/***********************************************************/
2081/* main execution loop */
2082
2083void gui_update(void *opaque)
2084{
2085 display_state.dpy_refresh(&display_state);
2086 qemu_mod_timer(gui_timer, GUI_REFRESH_INTERVAL + qemu_get_clock(rt_clock));
2087}
2088
2089/* XXX: support several handlers */
2090VMStopHandler *vm_stop_cb;
2091VMStopHandler *vm_stop_opaque;
2092
2093int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
2094{
2095 vm_stop_cb = cb;
2096 vm_stop_opaque = opaque;
2097 return 0;
2098}
2099
2100void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
2101{
2102 vm_stop_cb = NULL;
2103}
2104
2105void vm_start(void)
2106{
2107 if (!vm_running) {
2108 cpu_enable_ticks();
2109 vm_running = 1;
2110 }
2111}
2112
2113void vm_stop(int reason)
2114{
2115 if (vm_running) {
2116 cpu_disable_ticks();
2117 vm_running = 0;
2118 if (reason != 0) {
2119 if (vm_stop_cb) {
2120 vm_stop_cb(vm_stop_opaque, reason);
2121 }
34865134 2122 }
8a7ddc38
FB
2123 }
2124}
2125
bb0c6722
FB
2126/* reset/shutdown handler */
2127
2128typedef struct QEMUResetEntry {
2129 QEMUResetHandler *func;
2130 void *opaque;
2131 struct QEMUResetEntry *next;
2132} QEMUResetEntry;
2133
2134static QEMUResetEntry *first_reset_entry;
2135static int reset_requested;
2136static int shutdown_requested;
2137
2138void qemu_register_reset(QEMUResetHandler *func, void *opaque)
2139{
2140 QEMUResetEntry **pre, *re;
2141
2142 pre = &first_reset_entry;
2143 while (*pre != NULL)
2144 pre = &(*pre)->next;
2145 re = qemu_mallocz(sizeof(QEMUResetEntry));
2146 re->func = func;
2147 re->opaque = opaque;
2148 re->next = NULL;
2149 *pre = re;
2150}
2151
2152void qemu_system_reset(void)
2153{
2154 QEMUResetEntry *re;
2155
2156 /* reset all devices */
2157 for(re = first_reset_entry; re != NULL; re = re->next) {
2158 re->func(re->opaque);
2159 }
2160}
2161
2162void qemu_system_reset_request(void)
2163{
2164 reset_requested = 1;
2165 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
2166}
2167
2168void qemu_system_shutdown_request(void)
2169{
2170 shutdown_requested = 1;
2171 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
2172}
2173
2174static void main_cpu_reset(void *opaque)
2175{
2176#ifdef TARGET_I386
2177 CPUState *env = opaque;
2178 cpu_reset(env);
2179#endif
2180}
2181
8a7ddc38
FB
2182int main_loop(void)
2183{
67b915a5 2184#ifndef _WIN32
8a7ddc38 2185 struct pollfd ufds[MAX_IO_HANDLERS + 1], *pf;
8a7ddc38 2186 IOHandlerRecord *ioh, *ioh_next;
67b915a5
FB
2187 uint8_t buf[4096];
2188 int n, max_size;
2189#endif
2190 int ret, timeout;
8a7ddc38
FB
2191 CPUState *env = global_env;
2192
2193 for(;;) {
2194 if (vm_running) {
2195 ret = cpu_exec(env);
bb0c6722 2196 if (shutdown_requested) {
8a7ddc38
FB
2197 ret = EXCP_INTERRUPT;
2198 break;
2199 }
bb0c6722
FB
2200 if (reset_requested) {
2201 reset_requested = 0;
2202 qemu_system_reset();
2203 ret = EXCP_INTERRUPT;
2204 }
8a7ddc38
FB
2205 if (ret == EXCP_DEBUG) {
2206 vm_stop(EXCP_DEBUG);
2207 }
2208 /* if hlt instruction, we wait until the next IRQ */
2209 /* XXX: use timeout computed from timers */
2210 if (ret == EXCP_HLT)
2211 timeout = 10;
2212 else
2213 timeout = 0;
2214 } else {
b4608c04 2215 timeout = 10;
8a7ddc38 2216 }
c4b1fcc0 2217
38e205a2
FB
2218#ifdef _WIN32
2219 if (timeout > 0)
2220 Sleep(timeout);
2221#else
2222
b4608c04 2223 /* poll any events */
8a7ddc38 2224 /* XXX: separate device handlers from system ones */
b4608c04 2225 pf = ufds;
8a7ddc38
FB
2226 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
2227 if (!ioh->fd_can_read) {
2228 max_size = 0;
c4b1fcc0
FB
2229 pf->fd = ioh->fd;
2230 pf->events = POLLIN;
2231 ioh->ufd = pf;
2232 pf++;
2233 } else {
8a7ddc38
FB
2234 max_size = ioh->fd_can_read(ioh->opaque);
2235 if (max_size > 0) {
2236 if (max_size > sizeof(buf))
2237 max_size = sizeof(buf);
2238 pf->fd = ioh->fd;
2239 pf->events = POLLIN;
2240 ioh->ufd = pf;
2241 pf++;
2242 } else {
2243 ioh->ufd = NULL;
2244 }
c4b1fcc0
FB
2245 }
2246 ioh->max_size = max_size;
b4608c04 2247 }
73332e5c 2248
b4608c04
FB
2249 ret = poll(ufds, pf - ufds, timeout);
2250 if (ret > 0) {
8a7ddc38
FB
2251 /* XXX: better handling of removal */
2252 for(ioh = first_io_handler; ioh != NULL; ioh = ioh_next) {
2253 ioh_next = ioh->next;
c4b1fcc0
FB
2254 pf = ioh->ufd;
2255 if (pf) {
8a7ddc38
FB
2256 if (pf->revents & POLLIN) {
2257 if (ioh->max_size == 0) {
2258 /* just a read event */
2259 ioh->fd_read(ioh->opaque, NULL, 0);
2260 } else {
2261 n = read(ioh->fd, buf, ioh->max_size);
2262 if (n >= 0) {
2263 ioh->fd_read(ioh->opaque, buf, n);
158156d1 2264 } else if (errno != EAGAIN) {
8a7ddc38
FB
2265 ioh->fd_read(ioh->opaque, NULL, -errno);
2266 }
2267 }
b4608c04 2268 }
b4608c04 2269 }
b4608c04
FB
2270 }
2271 }
c20709aa
FB
2272
2273#if defined(CONFIG_SLIRP)
2274 /* XXX: merge with poll() */
2275 if (slirp_inited) {
2276 fd_set rfds, wfds, xfds;
2277 int nfds;
2278 struct timeval tv;
2279
2280 nfds = -1;
2281 FD_ZERO(&rfds);
2282 FD_ZERO(&wfds);
2283 FD_ZERO(&xfds);
2284 slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
2285 tv.tv_sec = 0;
2286 tv.tv_usec = 0;
2287 ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
2288 if (ret >= 0) {
2289 slirp_select_poll(&rfds, &wfds, &xfds);
2290 }
2291 }
2292#endif
2293
67b915a5 2294#endif
b4608c04 2295
8a7ddc38
FB
2296 if (vm_running) {
2297 qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
2298 qemu_get_clock(vm_clock));
2299
aaaa7df6
FB
2300 if (audio_enabled) {
2301 /* XXX: add explicit timer */
2302 SB16_run();
2303 }
8a7ddc38
FB
2304
2305 /* run dma transfers, if any */
2306 DMA_run();
b4608c04 2307 }
313aa567 2308
8a7ddc38
FB
2309 /* real time timers */
2310 qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
2311 qemu_get_clock(rt_clock));
b4608c04 2312 }
34865134
FB
2313 cpu_disable_ticks();
2314 return ret;
b4608c04
FB
2315}
2316
0824d6fc
FB
2317void help(void)
2318{
aaaa7df6 2319 printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2004 Fabrice Bellard\n"
0db63474 2320 "usage: %s [options] [disk_image]\n"
0824d6fc 2321 "\n"
a20dd508 2322 "'disk_image' is a raw hard image image for IDE hard disk 0\n"
fc01f7e7 2323 "\n"
a20dd508 2324 "Standard options:\n"
c45886db 2325 "-fda/-fdb file use 'file' as floppy disk 0/1 image\n"
36b486bb
FB
2326 "-hda/-hdb file use 'file' as IDE hard disk 0/1 image\n"
2327 "-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n"
c4b1fcc0 2328 "-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
6e44ba7f 2329 "-boot [a|b|c|d] boot on floppy (a, b), hard disk (c) or CD-ROM (d)\n"
a20dd508 2330 "-snapshot write to temporary files instead of disk image files\n"
a00bad7e 2331 "-m megs set virtual RAM size to megs MB [default=%d]\n"
c4b1fcc0 2332 "-nographic disable graphical output and redirect serial I/Os to console\n"
aaaa7df6 2333 "-enable-audio enable audio support\n"
89980284 2334 "-localtime set the real time clock to local time [default=utc]\n"
bb0c6722
FB
2335#ifdef TARGET_PPC
2336 "-prep Simulate a PREP system (default is PowerMAC)\n"
e9b137c2 2337 "-g WxH[xDEPTH] Set the initial VGA graphic mode\n"
bb0c6722 2338#endif
c4b1fcc0
FB
2339 "\n"
2340 "Network options:\n"
c20709aa 2341 "-nics n simulate 'n' network cards [default=1]\n"
702c651c 2342 "-macaddr addr set the mac address of the first interface\n"
c20709aa
FB
2343 "-n script set tap/tun network init script [default=%s]\n"
2344 "-tun-fd fd use this fd as already opened tap/tun interface\n"
2345#ifdef CONFIG_SLIRP
2346 "-user-net use user mode network stack [default if no tap/tun script]\n"
2347#endif
2348 "-dummy-net use dummy network stack\n"
a20dd508 2349 "\n"
c4b1fcc0 2350 "Linux boot specific:\n"
a20dd508
FB
2351 "-kernel bzImage use 'bzImage' as kernel image\n"
2352 "-append cmdline use 'cmdline' as kernel command line\n"
2353 "-initrd file use 'file' as initial ram disk\n"
fc01f7e7 2354 "\n"
330d0414 2355 "Debug/Expert options:\n"
82c643ff
FB
2356 "-monitor dev redirect the monitor to char device 'dev'\n"
2357 "-serial dev redirect the serial port to char device 'dev'\n"
cd6f1169 2358 "-S freeze CPU at startup (use 'c' to start execution)\n"
a20dd508
FB
2359 "-s wait gdb connection to port %d\n"
2360 "-p port change gdb connection port\n"
f193c797 2361 "-d item1,... output log to %s (use -d ? for a list of log items)\n"
a20dd508
FB
2362 "-hdachs c,h,s force hard disk 0 geometry (usually qemu can guess it)\n"
2363 "-L path set the directory for the BIOS and VGA BIOS\n"
77fef8c1
FB
2364#ifdef USE_CODE_COPY
2365 "-no-code-copy disable code copy acceleration\n"
2366#endif
bb0c6722
FB
2367#ifdef TARGET_I386
2368 "-isa simulate an ISA-only system (default is PCI system)\n"
1bfe856e
FB
2369 "-std-vga simulate a standard VGA card with VESA Bochs Extensions\n"
2370 " (default is CL-GD5446 PCI VGA)\n"
bb0c6722 2371#endif
0824d6fc 2372 "\n"
82c643ff
FB
2373 "During emulation, the following keys are useful:\n"
2374 "ctrl-shift-f toggle full screen\n"
2375 "ctrl-shift-Fn switch to virtual console 'n'\n"
2376 "ctrl-shift toggle mouse and keyboard grab\n"
2377 "\n"
2378 "When using -nographic, press 'ctrl-a h' to get some help.\n"
2379 ,
0db63474
FB
2380#ifdef CONFIG_SOFTMMU
2381 "qemu",
2382#else
2383 "qemu-fast",
2384#endif
a00bad7e
FB
2385 DEFAULT_RAM_SIZE,
2386 DEFAULT_NETWORK_SCRIPT,
6e44ba7f
FB
2387 DEFAULT_GDBSTUB_PORT,
2388 "/tmp/qemu.log");
0db63474
FB
2389#ifndef CONFIG_SOFTMMU
2390 printf("\n"
2391 "NOTE: this version of QEMU is faster but it needs slightly patched OSes to\n"
2392 "work. Please use the 'qemu' executable to have a more accurate (but slower)\n"
2393 "PC emulation.\n");
2394#endif
0824d6fc
FB
2395 exit(1);
2396}
2397
cd6f1169
FB
2398#define HAS_ARG 0x0001
2399
2400enum {
2401 QEMU_OPTION_h,
2402
2403 QEMU_OPTION_fda,
2404 QEMU_OPTION_fdb,
2405 QEMU_OPTION_hda,
2406 QEMU_OPTION_hdb,
2407 QEMU_OPTION_hdc,
2408 QEMU_OPTION_hdd,
2409 QEMU_OPTION_cdrom,
2410 QEMU_OPTION_boot,
2411 QEMU_OPTION_snapshot,
2412 QEMU_OPTION_m,
2413 QEMU_OPTION_nographic,
2414 QEMU_OPTION_enable_audio,
2415
2416 QEMU_OPTION_nics,
2417 QEMU_OPTION_macaddr,
2418 QEMU_OPTION_n,
2419 QEMU_OPTION_tun_fd,
2420 QEMU_OPTION_user_net,
2421 QEMU_OPTION_dummy_net,
2422
2423 QEMU_OPTION_kernel,
2424 QEMU_OPTION_append,
2425 QEMU_OPTION_initrd,
2426
2427 QEMU_OPTION_S,
2428 QEMU_OPTION_s,
2429 QEMU_OPTION_p,
2430 QEMU_OPTION_d,
2431 QEMU_OPTION_hdachs,
2432 QEMU_OPTION_L,
2433 QEMU_OPTION_no_code_copy,
69b91039 2434 QEMU_OPTION_pci,
bb0c6722 2435 QEMU_OPTION_isa,
77d4bc34 2436 QEMU_OPTION_prep,
ee22c2f7 2437 QEMU_OPTION_localtime,
1f04275e 2438 QEMU_OPTION_cirrusvga,
e9b137c2 2439 QEMU_OPTION_g,
1bfe856e 2440 QEMU_OPTION_std_vga,
82c643ff
FB
2441 QEMU_OPTION_monitor,
2442 QEMU_OPTION_serial,
cd6f1169
FB
2443};
2444
2445typedef struct QEMUOption {
2446 const char *name;
2447 int flags;
2448 int index;
2449} QEMUOption;
2450
2451const QEMUOption qemu_options[] = {
2452 { "h", 0, QEMU_OPTION_h },
2453
2454 { "fda", HAS_ARG, QEMU_OPTION_fda },
2455 { "fdb", HAS_ARG, QEMU_OPTION_fdb },
2456 { "hda", HAS_ARG, QEMU_OPTION_hda },
2457 { "hdb", HAS_ARG, QEMU_OPTION_hdb },
2458 { "hdc", HAS_ARG, QEMU_OPTION_hdc },
2459 { "hdd", HAS_ARG, QEMU_OPTION_hdd },
2460 { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
2461 { "boot", HAS_ARG, QEMU_OPTION_boot },
2462 { "snapshot", 0, QEMU_OPTION_snapshot },
2463 { "m", HAS_ARG, QEMU_OPTION_m },
2464 { "nographic", 0, QEMU_OPTION_nographic },
2465 { "enable-audio", 0, QEMU_OPTION_enable_audio },
2466
2467 { "nics", HAS_ARG, QEMU_OPTION_nics},
2468 { "macaddr", HAS_ARG, QEMU_OPTION_macaddr},
69b91039 2469 { "n", HAS_ARG, QEMU_OPTION_n },
cd6f1169 2470 { "tun-fd", HAS_ARG, QEMU_OPTION_tun_fd },
158156d1 2471#ifdef CONFIG_SLIRP
cd6f1169 2472 { "user-net", 0, QEMU_OPTION_user_net },
158156d1 2473#endif
cd6f1169
FB
2474 { "dummy-net", 0, QEMU_OPTION_dummy_net },
2475
2476 { "kernel", HAS_ARG, QEMU_OPTION_kernel },
2477 { "append", HAS_ARG, QEMU_OPTION_append },
2478 { "initrd", HAS_ARG, QEMU_OPTION_initrd },
2479
2480 { "S", 0, QEMU_OPTION_S },
2481 { "s", 0, QEMU_OPTION_s },
2482 { "p", HAS_ARG, QEMU_OPTION_p },
2483 { "d", HAS_ARG, QEMU_OPTION_d },
2484 { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
2485 { "L", HAS_ARG, QEMU_OPTION_L },
2486 { "no-code-copy", 0, QEMU_OPTION_no_code_copy },
77d4bc34
FB
2487#ifdef TARGET_PPC
2488 { "prep", 0, QEMU_OPTION_prep },
e9b137c2 2489 { "g", 1, QEMU_OPTION_g },
77d4bc34 2490#endif
ee22c2f7 2491 { "localtime", 0, QEMU_OPTION_localtime },
bb0c6722 2492 { "isa", 0, QEMU_OPTION_isa },
1bfe856e 2493 { "std-vga", 0, QEMU_OPTION_std_vga },
82c643ff
FB
2494 { "monitor", 1, QEMU_OPTION_monitor },
2495 { "serial", 1, QEMU_OPTION_serial },
2496
1f04275e
FB
2497 /* temporary options */
2498 { "pci", 0, QEMU_OPTION_pci },
2499 { "cirrusvga", 0, QEMU_OPTION_cirrusvga },
cd6f1169 2500 { NULL },
fc01f7e7
FB
2501};
2502
77fef8c1
FB
2503#if defined (TARGET_I386) && defined(USE_CODE_COPY)
2504
2505/* this stack is only used during signal handling */
2506#define SIGNAL_STACK_SIZE 32768
2507
2508static uint8_t *signal_stack;
2509
2510#endif
2511
c20709aa
FB
2512#define NET_IF_TUN 0
2513#define NET_IF_USER 1
2514#define NET_IF_DUMMY 2
2515
0824d6fc
FB
2516int main(int argc, char **argv)
2517{
67b915a5
FB
2518#ifdef CONFIG_GDBSTUB
2519 int use_gdbstub, gdbstub_port;
2520#endif
cd6f1169 2521 int i, has_cdrom;
1ccde1cb 2522 int snapshot, linux_boot;
c45886db 2523 CPUState *env;
7f7f9873 2524 const char *initrd_filename;
c45886db 2525 const char *hd_filename[MAX_DISKS], *fd_filename[MAX_FD];
a20dd508 2526 const char *kernel_filename, *kernel_cmdline;
313aa567 2527 DisplayState *ds = &display_state;
c4b1fcc0 2528 int cyls, heads, secs;
a541f297 2529 int start_emulation = 1;
702c651c 2530 uint8_t macaddr[6];
c20709aa 2531 int net_if_type, nb_tun_fds, tun_fds[MAX_NICS];
cd6f1169
FB
2532 int optind;
2533 const char *r, *optarg;
82c643ff
FB
2534 CharDriverState *monitor_hd;
2535 char monitor_device[128];
2536 char serial_device[128];
cd6f1169 2537
67b915a5 2538#if !defined(CONFIG_SOFTMMU)
0824d6fc
FB
2539 /* we never want that malloc() uses mmap() */
2540 mallopt(M_MMAP_THRESHOLD, 4096 * 1024);
67b915a5 2541#endif
fc01f7e7 2542 initrd_filename = NULL;
c45886db
FB
2543 for(i = 0; i < MAX_FD; i++)
2544 fd_filename[i] = NULL;
fc01f7e7
FB
2545 for(i = 0; i < MAX_DISKS; i++)
2546 hd_filename[i] = NULL;
a00bad7e 2547 ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
313aa567 2548 vga_ram_size = VGA_RAM_SIZE;
0ced6589 2549 bios_size = BIOS_SIZE;
f1510b2c 2550 pstrcpy(network_script, sizeof(network_script), DEFAULT_NETWORK_SCRIPT);
67b915a5 2551#ifdef CONFIG_GDBSTUB
b4608c04
FB
2552 use_gdbstub = 0;
2553 gdbstub_port = DEFAULT_GDBSTUB_PORT;
67b915a5 2554#endif
33e3963e 2555 snapshot = 0;
a20dd508
FB
2556 nographic = 0;
2557 kernel_filename = NULL;
2558 kernel_cmdline = "";
c4b1fcc0
FB
2559 has_cdrom = 1;
2560 cyls = heads = secs = 0;
82c643ff
FB
2561 pstrcpy(monitor_device, sizeof(monitor_device), "vc");
2562 pstrcpy(serial_device, sizeof(serial_device), "vc");
c4b1fcc0 2563
c20709aa
FB
2564 nb_tun_fds = 0;
2565 net_if_type = -1;
c4b1fcc0 2566 nb_nics = 1;
702c651c
FB
2567 /* default mac address of the first network interface */
2568 macaddr[0] = 0x52;
2569 macaddr[1] = 0x54;
2570 macaddr[2] = 0x00;
2571 macaddr[3] = 0x12;
2572 macaddr[4] = 0x34;
2573 macaddr[5] = 0x56;
82c643ff 2574
cd6f1169 2575 optind = 1;
0824d6fc 2576 for(;;) {
cd6f1169 2577 if (optind >= argc)
0824d6fc 2578 break;
cd6f1169
FB
2579 r = argv[optind];
2580 if (r[0] != '-') {
2581 hd_filename[0] = argv[optind++];
2582 } else {
2583 const QEMUOption *popt;
2584
2585 optind++;
2586 popt = qemu_options;
2587 for(;;) {
2588 if (!popt->name) {
2589 fprintf(stderr, "%s: invalid option -- '%s'\n",
2590 argv[0], r);
2591 exit(1);
2592 }
2593 if (!strcmp(popt->name, r + 1))
2594 break;
2595 popt++;
2596 }
2597 if (popt->flags & HAS_ARG) {
2598 if (optind >= argc) {
2599 fprintf(stderr, "%s: option '%s' requires an argument\n",
2600 argv[0], r);
2601 exit(1);
2602 }
2603 optarg = argv[optind++];
2604 } else {
2605 optarg = NULL;
2606 }
2607
2608 switch(popt->index) {
2609 case QEMU_OPTION_initrd:
fc01f7e7
FB
2610 initrd_filename = optarg;
2611 break;
cd6f1169 2612 case QEMU_OPTION_hda:
fc01f7e7
FB
2613 hd_filename[0] = optarg;
2614 break;
cd6f1169 2615 case QEMU_OPTION_hdb:
fc01f7e7
FB
2616 hd_filename[1] = optarg;
2617 break;
cd6f1169 2618 case QEMU_OPTION_snapshot:
33e3963e
FB
2619 snapshot = 1;
2620 break;
cd6f1169 2621 case QEMU_OPTION_hdachs:
330d0414 2622 {
330d0414
FB
2623 const char *p;
2624 p = optarg;
2625 cyls = strtol(p, (char **)&p, 0);
2626 if (*p != ',')
2627 goto chs_fail;
2628 p++;
2629 heads = strtol(p, (char **)&p, 0);
2630 if (*p != ',')
2631 goto chs_fail;
2632 p++;
2633 secs = strtol(p, (char **)&p, 0);
c4b1fcc0
FB
2634 if (*p != '\0') {
2635 chs_fail:
2636 cyls = 0;
2637 }
330d0414
FB
2638 }
2639 break;
cd6f1169 2640 case QEMU_OPTION_nographic:
82c643ff
FB
2641 pstrcpy(monitor_device, sizeof(monitor_device), "stdio");
2642 pstrcpy(serial_device, sizeof(serial_device), "stdio");
a20dd508
FB
2643 nographic = 1;
2644 break;
cd6f1169 2645 case QEMU_OPTION_kernel:
a20dd508
FB
2646 kernel_filename = optarg;
2647 break;
cd6f1169 2648 case QEMU_OPTION_append:
a20dd508 2649 kernel_cmdline = optarg;
313aa567 2650 break;
cd6f1169 2651 case QEMU_OPTION_tun_fd:
c4b1fcc0
FB
2652 {
2653 const char *p;
2654 int fd;
d6b86f4d 2655 net_if_type = NET_IF_TUN;
c20709aa
FB
2656 if (nb_tun_fds < MAX_NICS) {
2657 fd = strtol(optarg, (char **)&p, 0);
2658 if (*p != '\0') {
2659 fprintf(stderr, "qemu: invalid fd for network interface %d\n", nb_tun_fds);
c4b1fcc0
FB
2660 exit(1);
2661 }
c20709aa 2662 tun_fds[nb_tun_fds++] = fd;
c4b1fcc0
FB
2663 }
2664 }
42f1e0e4 2665 break;
cd6f1169 2666 case QEMU_OPTION_hdc:
36b486bb 2667 hd_filename[2] = optarg;
c4b1fcc0 2668 has_cdrom = 0;
36b486bb 2669 break;
cd6f1169 2670 case QEMU_OPTION_hdd:
36b486bb
FB
2671 hd_filename[3] = optarg;
2672 break;
cd6f1169 2673 case QEMU_OPTION_cdrom:
36b486bb 2674 hd_filename[2] = optarg;
c4b1fcc0 2675 has_cdrom = 1;
36b486bb 2676 break;
cd6f1169 2677 case QEMU_OPTION_boot:
36b486bb 2678 boot_device = optarg[0];
c45886db
FB
2679 if (boot_device != 'a' && boot_device != 'b' &&
2680 boot_device != 'c' && boot_device != 'd') {
36b486bb
FB
2681 fprintf(stderr, "qemu: invalid boot device '%c'\n", boot_device);
2682 exit(1);
2683 }
2684 break;
cd6f1169 2685 case QEMU_OPTION_fda:
c45886db
FB
2686 fd_filename[0] = optarg;
2687 break;
cd6f1169 2688 case QEMU_OPTION_fdb:
c45886db
FB
2689 fd_filename[1] = optarg;
2690 break;
cd6f1169 2691 case QEMU_OPTION_no_code_copy:
77fef8c1
FB
2692 code_copy_enabled = 0;
2693 break;
cd6f1169 2694 case QEMU_OPTION_nics:
c4b1fcc0 2695 nb_nics = atoi(optarg);
3a1bc175 2696 if (nb_nics < 0 || nb_nics > MAX_NICS) {
c4b1fcc0
FB
2697 fprintf(stderr, "qemu: invalid number of network interfaces\n");
2698 exit(1);
2699 }
2700 break;
cd6f1169 2701 case QEMU_OPTION_macaddr:
702c651c
FB
2702 {
2703 const char *p;
2704 int i;
2705 p = optarg;
2706 for(i = 0; i < 6; i++) {
2707 macaddr[i] = strtol(p, (char **)&p, 16);
2708 if (i == 5) {
2709 if (*p != '\0')
2710 goto macaddr_error;
2711 } else {
2712 if (*p != ':') {
2713 macaddr_error:
2714 fprintf(stderr, "qemu: invalid syntax for ethernet address\n");
2715 exit(1);
2716 }
2717 p++;
2718 }
2719 }
2720 }
2721 break;
cd6f1169 2722 case QEMU_OPTION_user_net:
c20709aa
FB
2723 net_if_type = NET_IF_USER;
2724 break;
cd6f1169 2725 case QEMU_OPTION_dummy_net:
c20709aa
FB
2726 net_if_type = NET_IF_DUMMY;
2727 break;
cd6f1169 2728 case QEMU_OPTION_enable_audio:
aaaa7df6
FB
2729 audio_enabled = 1;
2730 break;
cd6f1169 2731 case QEMU_OPTION_h:
0824d6fc 2732 help();
cd6f1169
FB
2733 break;
2734 case QEMU_OPTION_m:
2735 ram_size = atoi(optarg) * 1024 * 1024;
2736 if (ram_size <= 0)
2737 help();
2738 if (ram_size > PHYS_RAM_MAX_SIZE) {
2739 fprintf(stderr, "qemu: at most %d MB RAM can be simulated\n",
2740 PHYS_RAM_MAX_SIZE / (1024 * 1024));
2741 exit(1);
2742 }
2743 break;
2744 case QEMU_OPTION_d:
2745 {
2746 int mask;
2747 CPULogItem *item;
2748
2749 mask = cpu_str_to_log_mask(optarg);
2750 if (!mask) {
2751 printf("Log items (comma separated):\n");
f193c797
FB
2752 for(item = cpu_log_items; item->mask != 0; item++) {
2753 printf("%-10s %s\n", item->name, item->help);
2754 }
2755 exit(1);
cd6f1169
FB
2756 }
2757 cpu_set_log(mask);
f193c797 2758 }
cd6f1169
FB
2759 break;
2760 case QEMU_OPTION_n:
2761 pstrcpy(network_script, sizeof(network_script), optarg);
2762 break;
67b915a5 2763#ifdef CONFIG_GDBSTUB
cd6f1169
FB
2764 case QEMU_OPTION_s:
2765 use_gdbstub = 1;
2766 break;
2767 case QEMU_OPTION_p:
2768 gdbstub_port = atoi(optarg);
2769 break;
67b915a5 2770#endif
cd6f1169
FB
2771 case QEMU_OPTION_L:
2772 bios_dir = optarg;
2773 break;
2774 case QEMU_OPTION_S:
2775 start_emulation = 0;
2776 break;
69b91039
FB
2777 case QEMU_OPTION_pci:
2778 pci_enabled = 1;
2779 break;
bb0c6722
FB
2780 case QEMU_OPTION_isa:
2781 pci_enabled = 0;
2782 break;
77d4bc34
FB
2783 case QEMU_OPTION_prep:
2784 prep_enabled = 1;
2785 break;
ee22c2f7
FB
2786 case QEMU_OPTION_localtime:
2787 rtc_utc = 0;
2788 break;
1f04275e
FB
2789 case QEMU_OPTION_cirrusvga:
2790 cirrus_vga_enabled = 1;
2791 break;
1bfe856e
FB
2792 case QEMU_OPTION_std_vga:
2793 cirrus_vga_enabled = 0;
2794 break;
e9b137c2
FB
2795 case QEMU_OPTION_g:
2796 {
2797 const char *p;
2798 int w, h, depth;
2799 p = optarg;
2800 w = strtol(p, (char **)&p, 10);
2801 if (w <= 0) {
2802 graphic_error:
2803 fprintf(stderr, "qemu: invalid resolution or depth\n");
2804 exit(1);
2805 }
2806 if (*p != 'x')
2807 goto graphic_error;
2808 p++;
2809 h = strtol(p, (char **)&p, 10);
2810 if (h <= 0)
2811 goto graphic_error;
2812 if (*p == 'x') {
2813 p++;
2814 depth = strtol(p, (char **)&p, 10);
2815 if (depth != 8 && depth != 15 && depth != 16 &&
2816 depth != 24 && depth != 32)
2817 goto graphic_error;
2818 } else if (*p == '\0') {
2819 depth = graphic_depth;
2820 } else {
2821 goto graphic_error;
2822 }
2823
2824 graphic_width = w;
2825 graphic_height = h;
2826 graphic_depth = depth;
2827 }
2828 break;
82c643ff
FB
2829 case QEMU_OPTION_monitor:
2830 pstrcpy(monitor_device, sizeof(monitor_device), optarg);
2831 break;
2832 case QEMU_OPTION_serial:
2833 pstrcpy(serial_device, sizeof(serial_device), optarg);
2834 break;
cd6f1169 2835 }
0824d6fc
FB
2836 }
2837 }
330d0414 2838
a20dd508 2839 linux_boot = (kernel_filename != NULL);
330d0414 2840
c45886db
FB
2841 if (!linux_boot && hd_filename[0] == '\0' && hd_filename[2] == '\0' &&
2842 fd_filename[0] == '\0')
0824d6fc 2843 help();
8f2b1fb0
FB
2844
2845 /* boot to cd by default if no hard disk */
d0309311
FB
2846 if (hd_filename[0] == '\0' && boot_device == 'c') {
2847 if (fd_filename[0] != '\0')
2848 boot_device = 'a';
2849 else
2850 boot_device = 'd';
2851 }
0824d6fc 2852
dc887a4d
FB
2853#if !defined(CONFIG_SOFTMMU)
2854 /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
2855 {
2856 static uint8_t stdout_buf[4096];
2857 setvbuf(stdout, stdout_buf, _IOLBF, sizeof(stdout_buf));
2858 }
2859#else
b118d61e 2860 setvbuf(stdout, NULL, _IOLBF, 0);
dc887a4d 2861#endif
0824d6fc 2862
c4b1fcc0 2863 /* init host network redirectors */
c20709aa
FB
2864 if (net_if_type == -1) {
2865 net_if_type = NET_IF_TUN;
2866#if defined(CONFIG_SLIRP)
2867 if (access(network_script, R_OK) < 0) {
2868 net_if_type = NET_IF_USER;
2869 }
2870#endif
2871 }
2872
2873 for(i = 0; i < nb_nics; i++) {
702c651c 2874 NetDriverState *nd = &nd_table[i];
c20709aa 2875 nd->index = i;
702c651c
FB
2876 /* init virtual mac address */
2877 nd->macaddr[0] = macaddr[0];
2878 nd->macaddr[1] = macaddr[1];
2879 nd->macaddr[2] = macaddr[2];
2880 nd->macaddr[3] = macaddr[3];
2881 nd->macaddr[4] = macaddr[4];
2882 nd->macaddr[5] = macaddr[5] + i;
c20709aa
FB
2883 switch(net_if_type) {
2884#if defined(CONFIG_SLIRP)
2885 case NET_IF_USER:
2886 net_slirp_init(nd);
2887 break;
2888#endif
2889#if !defined(_WIN32)
2890 case NET_IF_TUN:
2891 if (i < nb_tun_fds) {
2892 net_fd_init(nd, tun_fds[i]);
2893 } else {
d927637d
FB
2894 if (net_tun_init(nd) < 0)
2895 net_dummy_init(nd);
c20709aa
FB
2896 }
2897 break;
2898#endif
2899 case NET_IF_DUMMY:
2900 default:
2901 net_dummy_init(nd);
2902 break;
2903 }
702c651c 2904 }
f1510b2c 2905
0824d6fc 2906 /* init the memory */
0ced6589 2907 phys_ram_size = ram_size + vga_ram_size + bios_size;
7f7f9873
FB
2908
2909#ifdef CONFIG_SOFTMMU
7d3505c5 2910#ifdef _BSD
83fb7adf
FB
2911 /* mallocs are always aligned on BSD. valloc is better for correctness */
2912 phys_ram_base = valloc(phys_ram_size);
7d3505c5 2913#else
1ccde1cb 2914 phys_ram_base = memalign(TARGET_PAGE_SIZE, phys_ram_size);
7d3505c5 2915#endif
7f7f9873
FB
2916 if (!phys_ram_base) {
2917 fprintf(stderr, "Could not allocate physical memory\n");
0824d6fc
FB
2918 exit(1);
2919 }
7f7f9873
FB
2920#else
2921 /* as we must map the same page at several addresses, we must use
2922 a fd */
2923 {
2924 const char *tmpdir;
2925
2926 tmpdir = getenv("QEMU_TMPDIR");
2927 if (!tmpdir)
2928 tmpdir = "/tmp";
2929 snprintf(phys_ram_file, sizeof(phys_ram_file), "%s/vlXXXXXX", tmpdir);
2930 if (mkstemp(phys_ram_file) < 0) {
2931 fprintf(stderr, "Could not create temporary memory file '%s'\n",
2932 phys_ram_file);
2933 exit(1);
2934 }
2935 phys_ram_fd = open(phys_ram_file, O_CREAT | O_TRUNC | O_RDWR, 0600);
2936 if (phys_ram_fd < 0) {
2937 fprintf(stderr, "Could not open temporary memory file '%s'\n",
2938 phys_ram_file);
2939 exit(1);
2940 }
1ccde1cb 2941 ftruncate(phys_ram_fd, phys_ram_size);
7f7f9873 2942 unlink(phys_ram_file);
1ccde1cb
FB
2943 phys_ram_base = mmap(get_mmap_addr(phys_ram_size),
2944 phys_ram_size,
7f7f9873
FB
2945 PROT_WRITE | PROT_READ, MAP_SHARED | MAP_FIXED,
2946 phys_ram_fd, 0);
2947 if (phys_ram_base == MAP_FAILED) {
2948 fprintf(stderr, "Could not map physical memory\n");
2949 exit(1);
2950 }
2951 }
2952#endif
0824d6fc 2953
c4b1fcc0
FB
2954 /* we always create the cdrom drive, even if no disk is there */
2955 if (has_cdrom) {
2956 bs_table[2] = bdrv_new("cdrom");
2957 bdrv_set_type_hint(bs_table[2], BDRV_TYPE_CDROM);
2958 }
2959
33e3963e
FB
2960 /* open the virtual block devices */
2961 for(i = 0; i < MAX_DISKS; i++) {
2962 if (hd_filename[i]) {
33e3963e 2963 if (!bs_table[i]) {
c4b1fcc0
FB
2964 char buf[64];
2965 snprintf(buf, sizeof(buf), "hd%c", i + 'a');
2966 bs_table[i] = bdrv_new(buf);
2967 }
2968 if (bdrv_open(bs_table[i], hd_filename[i], snapshot) < 0) {
36b486bb 2969 fprintf(stderr, "qemu: could not open hard disk image '%s\n",
33e3963e
FB
2970 hd_filename[i]);
2971 exit(1);
2972 }
c4b1fcc0
FB
2973 if (i == 0 && cyls != 0)
2974 bdrv_set_geometry_hint(bs_table[i], cyls, heads, secs);
2975 }
2976 }
2977
2978 /* we always create at least one floppy disk */
2979 fd_table[0] = bdrv_new("fda");
2980 bdrv_set_type_hint(fd_table[0], BDRV_TYPE_FLOPPY);
2981
2982 for(i = 0; i < MAX_FD; i++) {
2983 if (fd_filename[i]) {
2984 if (!fd_table[i]) {
2985 char buf[64];
2986 snprintf(buf, sizeof(buf), "fd%c", i + 'a');
2987 fd_table[i] = bdrv_new(buf);
2988 bdrv_set_type_hint(fd_table[i], BDRV_TYPE_FLOPPY);
2989 }
2990 if (fd_filename[i] != '\0') {
2991 if (bdrv_open(fd_table[i], fd_filename[i], snapshot) < 0) {
c20709aa 2992 fprintf(stderr, "qemu: could not open floppy disk image '%s'\n",
c4b1fcc0
FB
2993 fd_filename[i]);
2994 exit(1);
2995 }
2996 }
33e3963e
FB
2997 }
2998 }
2999
330d0414
FB
3000 /* init CPU state */
3001 env = cpu_init();
3002 global_env = env;
3003 cpu_single_env = env;
3004
8a7ddc38 3005 register_savevm("timer", 0, 1, timer_save, timer_load, env);
02ba45c5 3006 register_savevm("cpu", 0, 2, cpu_save, cpu_load, env);
8a7ddc38 3007 register_savevm("ram", 0, 1, ram_save, ram_load, NULL);
bb0c6722 3008 qemu_register_reset(main_cpu_reset, global_env);
8a7ddc38 3009
330d0414 3010 init_ioports();
80cabfad 3011 cpu_calibrate_ticks();
0824d6fc 3012
313aa567 3013 /* terminal init */
a20dd508 3014 if (nographic) {
313aa567
FB
3015 dumb_display_init(ds);
3016 } else {
3017#ifdef CONFIG_SDL
3018 sdl_display_init(ds);
313aa567
FB
3019#else
3020 dumb_display_init(ds);
3021#endif
3022 }
0824d6fc 3023
82c643ff
FB
3024 vga_console = graphic_console_init(ds);
3025
3026 monitor_hd = qemu_chr_open(monitor_device);
3027 if (!monitor_hd) {
3028 fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
3029 exit(1);
3030 }
3031 monitor_init(monitor_hd, !nographic);
3032
3033 serial_hd = qemu_chr_open(serial_device);
3034 if (!serial_hd) {
3035 fprintf(stderr, "qemu: could not open serial device '%s'\n", serial_device);
3036 exit(1);
3037 }
3038 if (!strcmp(serial_device, "vc"))
3039 qemu_chr_printf(serial_hd, "serial0 console\n");
3040
3041
0824d6fc 3042 /* setup cpu signal handlers for MMU / self modifying code handling */
77fef8c1 3043#if !defined(CONFIG_SOFTMMU)
8a7ddc38 3044
77fef8c1
FB
3045#if defined (TARGET_I386) && defined(USE_CODE_COPY)
3046 {
3047 stack_t stk;
73332e5c 3048 signal_stack = memalign(16, SIGNAL_STACK_SIZE);
77fef8c1
FB
3049 stk.ss_sp = signal_stack;
3050 stk.ss_size = SIGNAL_STACK_SIZE;
3051 stk.ss_flags = 0;
3052
3053 if (sigaltstack(&stk, NULL) < 0) {
3054 perror("sigaltstack");
3055 exit(1);
3056 }
3057 }
3058#endif
8a7ddc38
FB
3059 {
3060 struct sigaction act;
77fef8c1 3061
8a7ddc38
FB
3062 sigfillset(&act.sa_mask);
3063 act.sa_flags = SA_SIGINFO;
77fef8c1 3064#if defined (TARGET_I386) && defined(USE_CODE_COPY)
8a7ddc38 3065 act.sa_flags |= SA_ONSTACK;
77fef8c1 3066#endif
8a7ddc38
FB
3067 act.sa_sigaction = host_segv_handler;
3068 sigaction(SIGSEGV, &act, NULL);
3069 sigaction(SIGBUS, &act, NULL);
77fef8c1 3070#if defined (TARGET_I386) && defined(USE_CODE_COPY)
8a7ddc38 3071 sigaction(SIGFPE, &act, NULL);
77fef8c1 3072#endif
8a7ddc38 3073 }
3a51dee6 3074#endif
0824d6fc 3075
67b915a5 3076#ifndef _WIN32
8a7ddc38
FB
3077 {
3078 struct sigaction act;
3079 sigfillset(&act.sa_mask);
3080 act.sa_flags = 0;
3081 act.sa_handler = SIG_IGN;
3082 sigaction(SIGPIPE, &act, NULL);
3083 }
67b915a5 3084#endif
73332e5c
FB
3085 init_timers();
3086
3087#if defined(TARGET_I386)
3088 pc_init(ram_size, vga_ram_size, boot_device,
3089 ds, fd_filename, snapshot,
3090 kernel_filename, kernel_cmdline, initrd_filename);
3091#elif defined(TARGET_PPC)
a541f297
FB
3092 ppc_init(ram_size, vga_ram_size, boot_device,
3093 ds, fd_filename, snapshot,
3094 kernel_filename, kernel_cmdline, initrd_filename);
73332e5c
FB
3095#endif
3096
8a7ddc38
FB
3097 gui_timer = qemu_new_timer(rt_clock, gui_update, NULL);
3098 qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock));
7f7f9873 3099
67b915a5 3100#ifdef CONFIG_GDBSTUB
b4608c04 3101 if (use_gdbstub) {
8a7ddc38
FB
3102 if (gdbserver_start(gdbstub_port) < 0) {
3103 fprintf(stderr, "Could not open gdbserver socket on port %d\n",
3104 gdbstub_port);
3105 exit(1);
3106 } else {
3107 printf("Waiting gdb connection on port %d\n", gdbstub_port);
3108 }
67b915a5
FB
3109 } else
3110#endif
a541f297 3111 if (start_emulation)
67b915a5 3112 {
8a7ddc38 3113 vm_start();
0824d6fc 3114 }
8a7ddc38
FB
3115 term_init();
3116 main_loop();
40c3bac3 3117 quit_timers();
0824d6fc
FB
3118 return 0;
3119}