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