]> git.proxmox.com Git - qemu.git/blame - vl.c
soft floats for SPARC (Blue Swirl)
[qemu.git] / vl.c
CommitLineData
0824d6fc 1/*
80cabfad 2 * QEMU System Emulator
0824d6fc 3 *
d827220b 4 * Copyright (c) 2003-2005 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>
c94c8d64 41#include <netinet/in.h>
9d728e8c 42#include <dirent.h>
7c9d8e07 43#include <netdb.h>
7d3505c5
FB
44#ifdef _BSD
45#include <sys/stat.h>
83fb7adf 46#ifndef __APPLE__
7d3505c5 47#include <libutil.h>
83fb7adf 48#endif
7d3505c5 49#else
ec530c81 50#ifndef __sun__
f1510b2c
FB
51#include <linux/if.h>
52#include <linux/if_tun.h>
7d3505c5
FB
53#include <pty.h>
54#include <malloc.h>
fd872598 55#include <linux/rtc.h>
e57a8c0e 56#include <linux/ppdev.h>
67b915a5 57#endif
7d3505c5 58#endif
ec530c81 59#endif
67b915a5 60
c20709aa
FB
61#if defined(CONFIG_SLIRP)
62#include "libslirp.h"
63#endif
64
67b915a5 65#ifdef _WIN32
7d3505c5 66#include <malloc.h>
67b915a5
FB
67#include <sys/timeb.h>
68#include <windows.h>
69#define getopt_long_only getopt_long
70#define memalign(align, size) malloc(size)
71#endif
72
6ca957f0
FB
73#include "qemu_socket.h"
74
73332e5c 75#ifdef CONFIG_SDL
96bcd4f8 76#ifdef __APPLE__
83fb7adf 77#include <SDL/SDL.h>
96bcd4f8 78#endif
73332e5c 79#endif /* CONFIG_SDL */
0824d6fc 80
5b0753e0
FB
81#ifdef CONFIG_COCOA
82#undef main
83#define main qemu_main
84#endif /* CONFIG_COCOA */
85
0824d6fc 86#include "disas.h"
fc01f7e7 87
8a7ddc38 88#include "exec-all.h"
0824d6fc 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
0d92ed30
PB
109/* Max number of USB devices that can be specified on the commandline. */
110#define MAX_USB_CMDLINE 8
111
7dea1da4
FB
112/* XXX: use a two level table to limit memory usage */
113#define MAX_IOPORTS 65536
0824d6fc 114
80cabfad 115const char *bios_dir = CONFIG_QEMU_SHAREDIR;
0824d6fc 116char phys_ram_file[1024];
c4b1fcc0 117void *ioport_opaque[MAX_IOPORTS];
fc01f7e7
FB
118IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
119IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
c45886db 120BlockDriverState *bs_table[MAX_DISKS], *fd_table[MAX_FD];
313aa567 121int vga_ram_size;
0ced6589 122int bios_size;
313aa567 123static DisplayState display_state;
a20dd508 124int nographic;
3d11d0eb 125const char* keyboard_layout = NULL;
313aa567 126int64_t ticks_per_sec;
36b486bb 127int boot_device = 'c';
0ced6589 128int ram_size;
80cabfad 129int pit_min_timer_count = 0;
c4b1fcc0 130int nb_nics;
7c9d8e07 131NICInfo nd_table[MAX_NICS];
8a7ddc38
FB
132QEMUTimer *gui_timer;
133int vm_running;
ee22c2f7 134int rtc_utc = 1;
1bfe856e 135int cirrus_vga_enabled = 1;
d827220b
FB
136#ifdef TARGET_SPARC
137int graphic_width = 1024;
138int graphic_height = 768;
139#else
1bfe856e
FB
140int graphic_width = 800;
141int graphic_height = 600;
d827220b 142#endif
e9b137c2 143int graphic_depth = 15;
d63d307f 144int full_screen = 0;
8d11df9e 145CharDriverState *serial_hds[MAX_SERIAL_PORTS];
6508fe59 146CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
a09db21f
FB
147#ifdef TARGET_I386
148int win2k_install_hack = 0;
149#endif
bb36d470 150int usb_enabled = 0;
7c9d8e07 151static VLANState *first_vlan;
6a00d601 152int smp_cpus = 1;
24236869 153int vnc_display = -1;
d3e9db93 154#if defined(TARGET_SPARC)
ba3c64fb 155#define MAX_CPUS 16
d3e9db93
FB
156#elif defined(TARGET_I386)
157#define MAX_CPUS 255
ba3c64fb 158#else
d3e9db93 159#define MAX_CPUS 1
ba3c64fb 160#endif
6515b203 161int acpi_enabled = 1;
52ca8d6a 162int fd_bootchk = 1;
0824d6fc
FB
163
164/***********************************************************/
26aa7d72
FB
165/* x86 ISA bus support */
166
167target_phys_addr_t isa_mem_base = 0;
3de388f6 168PicState2 *isa_pic;
0824d6fc 169
c4b1fcc0 170uint32_t default_ioport_readb(void *opaque, uint32_t address)
0824d6fc
FB
171{
172#ifdef DEBUG_UNUSED_IOPORT
173 fprintf(stderr, "inb: port=0x%04x\n", address);
174#endif
fc01f7e7 175 return 0xff;
0824d6fc
FB
176}
177
c4b1fcc0 178void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
0824d6fc
FB
179{
180#ifdef DEBUG_UNUSED_IOPORT
181 fprintf(stderr, "outb: port=0x%04x data=0x%02x\n", address, data);
182#endif
183}
184
185/* default is to make two byte accesses */
c4b1fcc0 186uint32_t default_ioport_readw(void *opaque, uint32_t address)
0824d6fc
FB
187{
188 uint32_t data;
db45c29a
FB
189 data = ioport_read_table[0][address](ioport_opaque[address], address);
190 address = (address + 1) & (MAX_IOPORTS - 1);
191 data |= ioport_read_table[0][address](ioport_opaque[address], address) << 8;
0824d6fc
FB
192 return data;
193}
194
c4b1fcc0 195void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
0824d6fc 196{
db45c29a
FB
197 ioport_write_table[0][address](ioport_opaque[address], address, data & 0xff);
198 address = (address + 1) & (MAX_IOPORTS - 1);
199 ioport_write_table[0][address](ioport_opaque[address], address, (data >> 8) & 0xff);
0824d6fc
FB
200}
201
c4b1fcc0 202uint32_t default_ioport_readl(void *opaque, uint32_t address)
0824d6fc 203{
fc01f7e7
FB
204#ifdef DEBUG_UNUSED_IOPORT
205 fprintf(stderr, "inl: port=0x%04x\n", address);
206#endif
207 return 0xffffffff;
0824d6fc
FB
208}
209
c4b1fcc0 210void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
0824d6fc 211{
fc01f7e7
FB
212#ifdef DEBUG_UNUSED_IOPORT
213 fprintf(stderr, "outl: port=0x%04x data=0x%02x\n", address, data);
214#endif
0824d6fc
FB
215}
216
fc01f7e7 217void init_ioports(void)
0824d6fc
FB
218{
219 int i;
220
fc01f7e7
FB
221 for(i = 0; i < MAX_IOPORTS; i++) {
222 ioport_read_table[0][i] = default_ioport_readb;
223 ioport_write_table[0][i] = default_ioport_writeb;
224 ioport_read_table[1][i] = default_ioport_readw;
225 ioport_write_table[1][i] = default_ioport_writew;
226 ioport_read_table[2][i] = default_ioport_readl;
227 ioport_write_table[2][i] = default_ioport_writel;
228 }
0824d6fc
FB
229}
230
fc01f7e7 231/* size is the word size in byte */
c4b1fcc0
FB
232int register_ioport_read(int start, int length, int size,
233 IOPortReadFunc *func, void *opaque)
f1510b2c 234{
fc01f7e7 235 int i, bsize;
f1510b2c 236
c4b1fcc0 237 if (size == 1) {
fc01f7e7 238 bsize = 0;
c4b1fcc0 239 } else if (size == 2) {
fc01f7e7 240 bsize = 1;
c4b1fcc0 241 } else if (size == 4) {
fc01f7e7 242 bsize = 2;
c4b1fcc0
FB
243 } else {
244 hw_error("register_ioport_read: invalid size");
fc01f7e7 245 return -1;
c4b1fcc0
FB
246 }
247 for(i = start; i < start + length; i += size) {
fc01f7e7 248 ioport_read_table[bsize][i] = func;
c4b1fcc0
FB
249 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
250 hw_error("register_ioport_read: invalid opaque");
251 ioport_opaque[i] = opaque;
252 }
f1510b2c
FB
253 return 0;
254}
255
fc01f7e7 256/* size is the word size in byte */
c4b1fcc0
FB
257int register_ioport_write(int start, int length, int size,
258 IOPortWriteFunc *func, void *opaque)
f1510b2c 259{
fc01f7e7 260 int i, bsize;
f1510b2c 261
c4b1fcc0 262 if (size == 1) {
fc01f7e7 263 bsize = 0;
c4b1fcc0 264 } else if (size == 2) {
fc01f7e7 265 bsize = 1;
c4b1fcc0 266 } else if (size == 4) {
fc01f7e7 267 bsize = 2;
c4b1fcc0
FB
268 } else {
269 hw_error("register_ioport_write: invalid size");
fc01f7e7 270 return -1;
c4b1fcc0
FB
271 }
272 for(i = start; i < start + length; i += size) {
fc01f7e7 273 ioport_write_table[bsize][i] = func;
c4b1fcc0
FB
274 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
275 hw_error("register_ioport_read: invalid opaque");
276 ioport_opaque[i] = opaque;
277 }
f1510b2c
FB
278 return 0;
279}
280
69b91039
FB
281void isa_unassign_ioport(int start, int length)
282{
283 int i;
284
285 for(i = start; i < start + length; i++) {
286 ioport_read_table[0][i] = default_ioport_readb;
287 ioport_read_table[1][i] = default_ioport_readw;
288 ioport_read_table[2][i] = default_ioport_readl;
289
290 ioport_write_table[0][i] = default_ioport_writeb;
291 ioport_write_table[1][i] = default_ioport_writew;
292 ioport_write_table[2][i] = default_ioport_writel;
293 }
294}
295
20f32282
FB
296/***********************************************************/
297
0824d6fc
FB
298void pstrcpy(char *buf, int buf_size, const char *str)
299{
300 int c;
301 char *q = buf;
302
303 if (buf_size <= 0)
304 return;
305
306 for(;;) {
307 c = *str++;
308 if (c == 0 || q >= buf + buf_size - 1)
309 break;
310 *q++ = c;
311 }
312 *q = '\0';
313}
314
315/* strcat and truncate. */
316char *pstrcat(char *buf, int buf_size, const char *s)
317{
318 int len;
319 len = strlen(buf);
320 if (len < buf_size)
321 pstrcpy(buf + len, buf_size - len, s);
322 return buf;
323}
324
82c643ff
FB
325int strstart(const char *str, const char *val, const char **ptr)
326{
327 const char *p, *q;
328 p = str;
329 q = val;
330 while (*q != '\0') {
331 if (*p != *q)
332 return 0;
333 p++;
334 q++;
335 }
336 if (ptr)
337 *ptr = p;
338 return 1;
339}
340
c45886db 341void cpu_outb(CPUState *env, int addr, int val)
0824d6fc 342{
fd872598
FB
343#ifdef DEBUG_IOPORT
344 if (loglevel & CPU_LOG_IOPORT)
345 fprintf(logfile, "outb: %04x %02x\n", addr, val);
346#endif
c4b1fcc0 347 ioport_write_table[0][addr](ioport_opaque[addr], addr, val);
89bfc105
FB
348#ifdef USE_KQEMU
349 if (env)
350 env->last_io_time = cpu_get_time_fast();
351#endif
0824d6fc
FB
352}
353
c45886db 354void cpu_outw(CPUState *env, int addr, int val)
0824d6fc 355{
fd872598
FB
356#ifdef DEBUG_IOPORT
357 if (loglevel & CPU_LOG_IOPORT)
358 fprintf(logfile, "outw: %04x %04x\n", addr, val);
359#endif
c4b1fcc0 360 ioport_write_table[1][addr](ioport_opaque[addr], addr, val);
89bfc105
FB
361#ifdef USE_KQEMU
362 if (env)
363 env->last_io_time = cpu_get_time_fast();
364#endif
0824d6fc
FB
365}
366
c45886db 367void cpu_outl(CPUState *env, int addr, int val)
0824d6fc 368{
fd872598
FB
369#ifdef DEBUG_IOPORT
370 if (loglevel & CPU_LOG_IOPORT)
371 fprintf(logfile, "outl: %04x %08x\n", addr, val);
372#endif
c4b1fcc0 373 ioport_write_table[2][addr](ioport_opaque[addr], addr, val);
89bfc105
FB
374#ifdef USE_KQEMU
375 if (env)
376 env->last_io_time = cpu_get_time_fast();
377#endif
0824d6fc
FB
378}
379
c45886db 380int cpu_inb(CPUState *env, int addr)
0824d6fc 381{
fd872598 382 int val;
fd872598
FB
383 val = ioport_read_table[0][addr](ioport_opaque[addr], addr);
384#ifdef DEBUG_IOPORT
385 if (loglevel & CPU_LOG_IOPORT)
386 fprintf(logfile, "inb : %04x %02x\n", addr, val);
89bfc105
FB
387#endif
388#ifdef USE_KQEMU
389 if (env)
390 env->last_io_time = cpu_get_time_fast();
fd872598
FB
391#endif
392 return val;
0824d6fc
FB
393}
394
c45886db 395int cpu_inw(CPUState *env, int addr)
0824d6fc 396{
fd872598 397 int val;
fd872598
FB
398 val = ioport_read_table[1][addr](ioport_opaque[addr], addr);
399#ifdef DEBUG_IOPORT
400 if (loglevel & CPU_LOG_IOPORT)
401 fprintf(logfile, "inw : %04x %04x\n", addr, val);
89bfc105
FB
402#endif
403#ifdef USE_KQEMU
404 if (env)
405 env->last_io_time = cpu_get_time_fast();
fd872598
FB
406#endif
407 return val;
0824d6fc
FB
408}
409
c45886db 410int cpu_inl(CPUState *env, int addr)
0824d6fc 411{
fd872598 412 int val;
fd872598
FB
413 val = ioport_read_table[2][addr](ioport_opaque[addr], addr);
414#ifdef DEBUG_IOPORT
415 if (loglevel & CPU_LOG_IOPORT)
416 fprintf(logfile, "inl : %04x %08x\n", addr, val);
89bfc105
FB
417#endif
418#ifdef USE_KQEMU
419 if (env)
420 env->last_io_time = cpu_get_time_fast();
fd872598
FB
421#endif
422 return val;
0824d6fc
FB
423}
424
425/***********************************************************/
0824d6fc
FB
426void hw_error(const char *fmt, ...)
427{
428 va_list ap;
6a00d601 429 CPUState *env;
0824d6fc
FB
430
431 va_start(ap, fmt);
432 fprintf(stderr, "qemu: hardware error: ");
433 vfprintf(stderr, fmt, ap);
434 fprintf(stderr, "\n");
6a00d601
FB
435 for(env = first_cpu; env != NULL; env = env->next_cpu) {
436 fprintf(stderr, "CPU #%d:\n", env->cpu_index);
0824d6fc 437#ifdef TARGET_I386
6a00d601 438 cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
c45886db 439#else
6a00d601 440 cpu_dump_state(env, stderr, fprintf, 0);
0824d6fc 441#endif
6a00d601 442 }
0824d6fc
FB
443 va_end(ap);
444 abort();
445}
446
63066f4f
FB
447/***********************************************************/
448/* keyboard/mouse */
449
450static QEMUPutKBDEvent *qemu_put_kbd_event;
451static void *qemu_put_kbd_event_opaque;
452static QEMUPutMouseEvent *qemu_put_mouse_event;
453static void *qemu_put_mouse_event_opaque;
09b26c5e 454static int qemu_put_mouse_event_absolute;
63066f4f
FB
455
456void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
457{
458 qemu_put_kbd_event_opaque = opaque;
459 qemu_put_kbd_event = func;
460}
461
09b26c5e 462void qemu_add_mouse_event_handler(QEMUPutMouseEvent *func, void *opaque, int absolute)
63066f4f
FB
463{
464 qemu_put_mouse_event_opaque = opaque;
465 qemu_put_mouse_event = func;
09b26c5e 466 qemu_put_mouse_event_absolute = absolute;
63066f4f
FB
467}
468
469void kbd_put_keycode(int keycode)
470{
471 if (qemu_put_kbd_event) {
472 qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
473 }
474}
475
476void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
477{
478 if (qemu_put_mouse_event) {
479 qemu_put_mouse_event(qemu_put_mouse_event_opaque,
480 dx, dy, dz, buttons_state);
481 }
482}
483
09b26c5e
FB
484int kbd_mouse_is_absolute(void)
485{
486 return qemu_put_mouse_event_absolute;
487}
488
8a7ddc38
FB
489/***********************************************************/
490/* timers */
491
34865134
FB
492#if defined(__powerpc__)
493
494static inline uint32_t get_tbl(void)
0824d6fc 495{
34865134
FB
496 uint32_t tbl;
497 asm volatile("mftb %0" : "=r" (tbl));
498 return tbl;
0824d6fc
FB
499}
500
34865134
FB
501static inline uint32_t get_tbu(void)
502{
503 uint32_t tbl;
504 asm volatile("mftbu %0" : "=r" (tbl));
505 return tbl;
506}
507
508int64_t cpu_get_real_ticks(void)
509{
510 uint32_t l, h, h1;
511 /* NOTE: we test if wrapping has occurred */
512 do {
513 h = get_tbu();
514 l = get_tbl();
515 h1 = get_tbu();
516 } while (h != h1);
517 return ((int64_t)h << 32) | l;
518}
519
520#elif defined(__i386__)
521
522int64_t cpu_get_real_ticks(void)
0824d6fc 523{
06d9f2f7
FB
524#ifdef _WIN32
525 LARGE_INTEGER ti;
526 QueryPerformanceCounter(&ti);
527 return ti.QuadPart;
528#else
0824d6fc 529 int64_t val;
e463b581 530 asm volatile ("rdtsc" : "=A" (val));
0824d6fc 531 return val;
06d9f2f7 532#endif
0824d6fc
FB
533}
534
1115dde7
FB
535#elif defined(__x86_64__)
536
537int64_t cpu_get_real_ticks(void)
538{
539 uint32_t low,high;
540 int64_t val;
541 asm volatile("rdtsc" : "=a" (low), "=d" (high));
542 val = high;
543 val <<= 32;
544 val |= low;
545 return val;
546}
547
b8076a74
FB
548#elif defined(__ia64)
549
550int64_t cpu_get_real_ticks(void)
551{
552 int64_t val;
553 asm volatile ("mov %0 = ar.itc" : "=r"(val) :: "memory");
554 return val;
555}
556
90cb9493
FB
557#elif defined(__s390__)
558
559int64_t cpu_get_real_ticks(void)
560{
561 int64_t val;
562 asm volatile("stck 0(%1)" : "=m" (val) : "a" (&val) : "cc");
563 return val;
564}
565
fdbb4691
FB
566#elif defined(__sparc__) && defined(HOST_SOLARIS)
567
568uint64_t cpu_get_real_ticks (void)
569{
570#if defined(_LP64)
571 uint64_t rval;
572 asm volatile("rd %%tick,%0" : "=r"(rval));
573 return rval;
574#else
575 union {
576 uint64_t i64;
577 struct {
578 uint32_t high;
579 uint32_t low;
580 } i32;
581 } rval;
582 asm volatile("rd %%tick,%1; srlx %1,32,%0"
583 : "=r"(rval.i32.high), "=r"(rval.i32.low));
584 return rval.i64;
585#endif
586}
587
34865134
FB
588#else
589#error unsupported CPU
590#endif
591
eade0f19 592static int64_t cpu_ticks_prev;
34865134 593static int64_t cpu_ticks_offset;
8a7ddc38 594static int cpu_ticks_enabled;
34865134 595
8a7ddc38 596static inline int64_t cpu_get_ticks(void)
34865134 597{
8a7ddc38
FB
598 if (!cpu_ticks_enabled) {
599 return cpu_ticks_offset;
600 } else {
eade0f19
FB
601 int64_t ticks;
602 ticks = cpu_get_real_ticks();
603 if (cpu_ticks_prev > ticks) {
604 /* Note: non increasing ticks may happen if the host uses
605 software suspend */
606 cpu_ticks_offset += cpu_ticks_prev - ticks;
607 }
608 cpu_ticks_prev = ticks;
609 return ticks + cpu_ticks_offset;
8a7ddc38 610 }
34865134
FB
611}
612
613/* enable cpu_get_ticks() */
614void cpu_enable_ticks(void)
615{
8a7ddc38
FB
616 if (!cpu_ticks_enabled) {
617 cpu_ticks_offset -= cpu_get_real_ticks();
618 cpu_ticks_enabled = 1;
619 }
34865134
FB
620}
621
622/* disable cpu_get_ticks() : the clock is stopped. You must not call
623 cpu_get_ticks() after that. */
624void cpu_disable_ticks(void)
625{
8a7ddc38
FB
626 if (cpu_ticks_enabled) {
627 cpu_ticks_offset = cpu_get_ticks();
628 cpu_ticks_enabled = 0;
629 }
34865134
FB
630}
631
67b915a5 632#ifdef _WIN32
06d9f2f7
FB
633void cpu_calibrate_ticks(void)
634{
635 LARGE_INTEGER freq;
636 int ret;
637
638 ret = QueryPerformanceFrequency(&freq);
639 if (ret == 0) {
640 fprintf(stderr, "Could not calibrate ticks\n");
641 exit(1);
642 }
643 ticks_per_sec = freq.QuadPart;
644}
645
67b915a5 646#else
06d9f2f7
FB
647static int64_t get_clock(void)
648{
34865134
FB
649 struct timeval tv;
650 gettimeofday(&tv, NULL);
651 return tv.tv_sec * 1000000LL + tv.tv_usec;
652}
653
0824d6fc
FB
654void cpu_calibrate_ticks(void)
655{
656 int64_t usec, ticks;
657
658 usec = get_clock();
8a7ddc38 659 ticks = cpu_get_real_ticks();
0824d6fc
FB
660 usleep(50 * 1000);
661 usec = get_clock() - usec;
8a7ddc38 662 ticks = cpu_get_real_ticks() - ticks;
0824d6fc
FB
663 ticks_per_sec = (ticks * 1000000LL + (usec >> 1)) / usec;
664}
06d9f2f7 665#endif /* !_WIN32 */
0824d6fc 666
87858c89 667/* compute with 96 bit intermediate result: (a*b)/c */
80cabfad 668uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
87858c89
FB
669{
670 union {
671 uint64_t ll;
672 struct {
673#ifdef WORDS_BIGENDIAN
674 uint32_t high, low;
675#else
676 uint32_t low, high;
677#endif
678 } l;
679 } u, res;
680 uint64_t rl, rh;
681
682 u.ll = a;
683 rl = (uint64_t)u.l.low * (uint64_t)b;
684 rh = (uint64_t)u.l.high * (uint64_t)b;
685 rh += (rl >> 32);
686 res.l.high = rh / c;
687 res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
688 return res.ll;
689}
690
8a7ddc38
FB
691#define QEMU_TIMER_REALTIME 0
692#define QEMU_TIMER_VIRTUAL 1
693
694struct QEMUClock {
695 int type;
696 /* XXX: add frequency */
697};
698
699struct QEMUTimer {
700 QEMUClock *clock;
701 int64_t expire_time;
702 QEMUTimerCB *cb;
703 void *opaque;
704 struct QEMUTimer *next;
705};
706
707QEMUClock *rt_clock;
708QEMUClock *vm_clock;
709
710static QEMUTimer *active_timers[2];
40c3bac3
FB
711#ifdef _WIN32
712static MMRESULT timerID;
06d9f2f7
FB
713static HANDLE host_alarm = NULL;
714static unsigned int period = 1;
40c3bac3 715#else
8a7ddc38
FB
716/* frequency of the times() clock tick */
717static int timer_freq;
67b915a5 718#endif
8a7ddc38
FB
719
720QEMUClock *qemu_new_clock(int type)
721{
722 QEMUClock *clock;
723 clock = qemu_mallocz(sizeof(QEMUClock));
724 if (!clock)
725 return NULL;
726 clock->type = type;
727 return clock;
728}
729
730QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
731{
732 QEMUTimer *ts;
733
734 ts = qemu_mallocz(sizeof(QEMUTimer));
735 ts->clock = clock;
736 ts->cb = cb;
737 ts->opaque = opaque;
738 return ts;
739}
740
741void qemu_free_timer(QEMUTimer *ts)
742{
743 qemu_free(ts);
744}
745
746/* stop a timer, but do not dealloc it */
747void qemu_del_timer(QEMUTimer *ts)
748{
749 QEMUTimer **pt, *t;
750
751 /* NOTE: this code must be signal safe because
752 qemu_timer_expired() can be called from a signal. */
753 pt = &active_timers[ts->clock->type];
754 for(;;) {
755 t = *pt;
756 if (!t)
757 break;
758 if (t == ts) {
759 *pt = t->next;
760 break;
761 }
762 pt = &t->next;
763 }
764}
765
766/* modify the current timer so that it will be fired when current_time
767 >= expire_time. The corresponding callback will be called. */
768void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
769{
770 QEMUTimer **pt, *t;
771
772 qemu_del_timer(ts);
773
774 /* add the timer in the sorted list */
775 /* NOTE: this code must be signal safe because
776 qemu_timer_expired() can be called from a signal. */
777 pt = &active_timers[ts->clock->type];
778 for(;;) {
779 t = *pt;
780 if (!t)
781 break;
782 if (t->expire_time > expire_time)
783 break;
784 pt = &t->next;
785 }
786 ts->expire_time = expire_time;
787 ts->next = *pt;
788 *pt = ts;
789}
790
791int qemu_timer_pending(QEMUTimer *ts)
792{
793 QEMUTimer *t;
794 for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
795 if (t == ts)
796 return 1;
797 }
798 return 0;
799}
800
801static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
802{
803 if (!timer_head)
804 return 0;
805 return (timer_head->expire_time <= current_time);
806}
807
808static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
809{
810 QEMUTimer *ts;
811
812 for(;;) {
813 ts = *ptimer_head;
e95c8d51 814 if (!ts || ts->expire_time > current_time)
8a7ddc38
FB
815 break;
816 /* remove timer from the list before calling the callback */
817 *ptimer_head = ts->next;
818 ts->next = NULL;
819
820 /* run the callback (the timer list can be modified) */
821 ts->cb(ts->opaque);
822 }
823}
824
825int64_t qemu_get_clock(QEMUClock *clock)
826{
827 switch(clock->type) {
828 case QEMU_TIMER_REALTIME:
67b915a5
FB
829#ifdef _WIN32
830 return GetTickCount();
831#else
7d3505c5
FB
832 {
833 struct tms tp;
834
835 /* Note that using gettimeofday() is not a good solution
836 for timers because its value change when the date is
837 modified. */
838 if (timer_freq == 100) {
839 return times(&tp) * 10;
840 } else {
841 return ((int64_t)times(&tp) * 1000) / timer_freq;
842 }
8a7ddc38 843 }
67b915a5 844#endif
8a7ddc38
FB
845 default:
846 case QEMU_TIMER_VIRTUAL:
847 return cpu_get_ticks();
848 }
849}
850
851/* save a timer */
852void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
853{
854 uint64_t expire_time;
855
856 if (qemu_timer_pending(ts)) {
857 expire_time = ts->expire_time;
858 } else {
859 expire_time = -1;
860 }
861 qemu_put_be64(f, expire_time);
862}
863
864void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
865{
866 uint64_t expire_time;
867
868 expire_time = qemu_get_be64(f);
869 if (expire_time != -1) {
870 qemu_mod_timer(ts, expire_time);
871 } else {
872 qemu_del_timer(ts);
873 }
874}
875
876static void timer_save(QEMUFile *f, void *opaque)
877{
878 if (cpu_ticks_enabled) {
879 hw_error("cannot save state if virtual timers are running");
880 }
881 qemu_put_be64s(f, &cpu_ticks_offset);
882 qemu_put_be64s(f, &ticks_per_sec);
883}
884
885static int timer_load(QEMUFile *f, void *opaque, int version_id)
886{
887 if (version_id != 1)
888 return -EINVAL;
889 if (cpu_ticks_enabled) {
890 return -EINVAL;
891 }
892 qemu_get_be64s(f, &cpu_ticks_offset);
893 qemu_get_be64s(f, &ticks_per_sec);
894 return 0;
895}
896
67b915a5
FB
897#ifdef _WIN32
898void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
899 DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
900#else
8a7ddc38 901static void host_alarm_handler(int host_signum)
67b915a5 902#endif
8a7ddc38 903{
02ba45c5
FB
904#if 0
905#define DISP_FREQ 1000
906 {
907 static int64_t delta_min = INT64_MAX;
908 static int64_t delta_max, delta_cum, last_clock, delta, ti;
909 static int count;
910 ti = qemu_get_clock(vm_clock);
911 if (last_clock != 0) {
912 delta = ti - last_clock;
913 if (delta < delta_min)
914 delta_min = delta;
915 if (delta > delta_max)
916 delta_max = delta;
917 delta_cum += delta;
918 if (++count == DISP_FREQ) {
919 printf("timer: min=%lld us max=%lld us avg=%lld us avg_freq=%0.3f Hz\n",
920 muldiv64(delta_min, 1000000, ticks_per_sec),
921 muldiv64(delta_max, 1000000, ticks_per_sec),
922 muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
923 (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
924 count = 0;
925 delta_min = INT64_MAX;
926 delta_max = 0;
927 delta_cum = 0;
928 }
929 }
930 last_clock = ti;
931 }
932#endif
8a7ddc38
FB
933 if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
934 qemu_get_clock(vm_clock)) ||
935 qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
936 qemu_get_clock(rt_clock))) {
06d9f2f7
FB
937#ifdef _WIN32
938 SetEvent(host_alarm);
939#endif
6a00d601
FB
940 CPUState *env = cpu_single_env;
941 if (env) {
942 /* stop the currently executing cpu because a timer occured */
943 cpu_interrupt(env, CPU_INTERRUPT_EXIT);
a332e112 944#ifdef USE_KQEMU
6a00d601
FB
945 if (env->kqemu_enabled) {
946 kqemu_cpu_interrupt(env);
947 }
a332e112 948#endif
6a00d601 949 }
8a7ddc38
FB
950 }
951}
952
fd872598
FB
953#ifndef _WIN32
954
829309c7
FB
955#if defined(__linux__)
956
fd872598
FB
957#define RTC_FREQ 1024
958
959static int rtc_fd;
829309c7 960
fd872598
FB
961static int start_rtc_timer(void)
962{
963 rtc_fd = open("/dev/rtc", O_RDONLY);
964 if (rtc_fd < 0)
965 return -1;
966 if (ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
967 fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
968 "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
969 "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
970 goto fail;
971 }
972 if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
973 fail:
974 close(rtc_fd);
975 return -1;
976 }
977 pit_min_timer_count = PIT_FREQ / RTC_FREQ;
978 return 0;
979}
980
829309c7
FB
981#else
982
983static int start_rtc_timer(void)
984{
985 return -1;
986}
987
988#endif /* !defined(__linux__) */
989
990#endif /* !defined(_WIN32) */
fd872598 991
8a7ddc38
FB
992static void init_timers(void)
993{
8a7ddc38
FB
994 rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
995 vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
996
67b915a5
FB
997#ifdef _WIN32
998 {
999 int count=0;
06d9f2f7
FB
1000 TIMECAPS tc;
1001
1002 ZeroMemory(&tc, sizeof(TIMECAPS));
1003 timeGetDevCaps(&tc, sizeof(TIMECAPS));
1004 if (period < tc.wPeriodMin)
1005 period = tc.wPeriodMin;
1006 timeBeginPeriod(period);
1d14ffa9 1007 timerID = timeSetEvent(1, // interval (ms)
06d9f2f7 1008 period, // resolution
40c3bac3
FB
1009 host_alarm_handler, // function
1010 (DWORD)&count, // user parameter
1011 TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
67b915a5
FB
1012 if( !timerID ) {
1013 perror("failed timer alarm");
1014 exit(1);
1015 }
06d9f2f7
FB
1016 host_alarm = CreateEvent(NULL, FALSE, FALSE, NULL);
1017 if (!host_alarm) {
1018 perror("failed CreateEvent");
1019 exit(1);
1020 }
1021 ResetEvent(host_alarm);
67b915a5
FB
1022 }
1023 pit_min_timer_count = ((uint64_t)10000 * PIT_FREQ) / 1000000;
1024#else
1025 {
1026 struct sigaction act;
1027 struct itimerval itv;
1028
1029 /* get times() syscall frequency */
1030 timer_freq = sysconf(_SC_CLK_TCK);
1031
1032 /* timer signal */
1033 sigfillset(&act.sa_mask);
a09db21f 1034 act.sa_flags = 0;
8a7ddc38 1035#if defined (TARGET_I386) && defined(USE_CODE_COPY)
67b915a5
FB
1036 act.sa_flags |= SA_ONSTACK;
1037#endif
1038 act.sa_handler = host_alarm_handler;
1039 sigaction(SIGALRM, &act, NULL);
fd872598 1040
67b915a5 1041 itv.it_interval.tv_sec = 0;
d79284e0 1042 itv.it_interval.tv_usec = 999; /* for i386 kernel 2.6 to get 1 ms */
67b915a5
FB
1043 itv.it_value.tv_sec = 0;
1044 itv.it_value.tv_usec = 10 * 1000;
1045 setitimer(ITIMER_REAL, &itv, NULL);
1046 /* we probe the tick duration of the kernel to inform the user if
1047 the emulated kernel requested a too high timer frequency */
1048 getitimer(ITIMER_REAL, &itv);
fd872598 1049
83fb7adf 1050#if defined(__linux__)
29e3055c
FB
1051 /* XXX: force /dev/rtc usage because even 2.6 kernels may not
1052 have timers with 1 ms resolution. The correct solution will
1053 be to use the POSIX real time timers available in recent
1054 2.6 kernels */
1055 if (itv.it_interval.tv_usec > 1000 || 1) {
fd872598
FB
1056 /* try to use /dev/rtc to have a faster timer */
1057 if (start_rtc_timer() < 0)
1058 goto use_itimer;
1059 /* disable itimer */
1060 itv.it_interval.tv_sec = 0;
1061 itv.it_interval.tv_usec = 0;
1062 itv.it_value.tv_sec = 0;
1063 itv.it_value.tv_usec = 0;
1064 setitimer(ITIMER_REAL, &itv, NULL);
1065
1066 /* use the RTC */
a1968d71 1067 sigaction(SIGIO, &act, NULL);
fd872598
FB
1068 fcntl(rtc_fd, F_SETFL, O_ASYNC);
1069 fcntl(rtc_fd, F_SETOWN, getpid());
83fb7adf
FB
1070 } else
1071#endif /* defined(__linux__) */
1072 {
fd872598
FB
1073 use_itimer:
1074 pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec *
1075 PIT_FREQ) / 1000000;
1076 }
67b915a5 1077 }
8a7ddc38 1078#endif
8a7ddc38
FB
1079}
1080
40c3bac3
FB
1081void quit_timers(void)
1082{
1083#ifdef _WIN32
1084 timeKillEvent(timerID);
06d9f2f7
FB
1085 timeEndPeriod(period);
1086 if (host_alarm) {
1087 CloseHandle(host_alarm);
1088 host_alarm = NULL;
1089 }
40c3bac3
FB
1090#endif
1091}
1092
c4b1fcc0 1093/***********************************************************/
82c643ff 1094/* character device */
313aa567 1095
82c643ff
FB
1096int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len)
1097{
1098 return s->chr_write(s, buf, len);
1099}
67b915a5 1100
e57a8c0e 1101int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg)
f8d179e3 1102{
e57a8c0e
FB
1103 if (!s->chr_ioctl)
1104 return -ENOTSUP;
1105 return s->chr_ioctl(s, cmd, arg);
f8d179e3
FB
1106}
1107
82c643ff 1108void qemu_chr_printf(CharDriverState *s, const char *fmt, ...)
67b915a5 1109{
82c643ff
FB
1110 char buf[4096];
1111 va_list ap;
1112 va_start(ap, fmt);
1113 vsnprintf(buf, sizeof(buf), fmt, ap);
1114 qemu_chr_write(s, buf, strlen(buf));
1115 va_end(ap);
67b915a5
FB
1116}
1117
5905b2e5
FB
1118void qemu_chr_send_event(CharDriverState *s, int event)
1119{
1120 if (s->chr_send_event)
1121 s->chr_send_event(s, event);
1122}
1123
82c643ff
FB
1124void qemu_chr_add_read_handler(CharDriverState *s,
1125 IOCanRWHandler *fd_can_read,
1126 IOReadHandler *fd_read, void *opaque)
1127{
1128 s->chr_add_read_handler(s, fd_can_read, fd_read, opaque);
1129}
1130
1131void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event)
1132{
1133 s->chr_event = chr_event;
1134}
67b915a5 1135
82c643ff 1136static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
313aa567 1137{
82c643ff
FB
1138 return len;
1139}
1140
1141static void null_chr_add_read_handler(CharDriverState *chr,
1142 IOCanRWHandler *fd_can_read,
1143 IOReadHandler *fd_read, void *opaque)
1144{
1145}
1146
1147CharDriverState *qemu_chr_open_null(void)
1148{
1149 CharDriverState *chr;
1150
1151 chr = qemu_mallocz(sizeof(CharDriverState));
1152 if (!chr)
1153 return NULL;
1154 chr->chr_write = null_chr_write;
1155 chr->chr_add_read_handler = null_chr_add_read_handler;
1156 return chr;
1157}
1158
fd1dff4b 1159#ifdef _WIN32
82c643ff 1160
fd1dff4b
FB
1161static void socket_cleanup(void)
1162{
1163 WSACleanup();
1164}
82c643ff 1165
fd1dff4b
FB
1166static int socket_init(void)
1167{
1168 WSADATA Data;
1169 int ret, err;
1170
1171 ret = WSAStartup(MAKEWORD(2,2), &Data);
1172 if (ret != 0) {
1173 err = WSAGetLastError();
1174 fprintf(stderr, "WSAStartup: %d\n", err);
1175 return -1;
1176 }
1177 atexit(socket_cleanup);
1178 return 0;
1179}
1180
1181static int send_all(int fd, const uint8_t *buf, int len1)
1182{
1183 int ret, len;
1184
1185 len = len1;
1186 while (len > 0) {
1187 ret = send(fd, buf, len, 0);
1188 if (ret < 0) {
1189 int errno;
1190 errno = WSAGetLastError();
1191 if (errno != WSAEWOULDBLOCK) {
1192 return -1;
1193 }
1194 } else if (ret == 0) {
1195 break;
1196 } else {
1197 buf += ret;
1198 len -= ret;
1199 }
1200 }
1201 return len1 - len;
1202}
1203
1204void socket_set_nonblock(int fd)
1205{
1206 unsigned long opt = 1;
1207 ioctlsocket(fd, FIONBIO, &opt);
1208}
1209
1210#else
1211
1d96905d
FB
1212static int unix_write(int fd, const uint8_t *buf, int len1)
1213{
1214 int ret, len;
1215
1216 len = len1;
1217 while (len > 0) {
1218 ret = write(fd, buf, len);
1219 if (ret < 0) {
1220 if (errno != EINTR && errno != EAGAIN)
1221 return -1;
1222 } else if (ret == 0) {
1223 break;
1224 } else {
1225 buf += ret;
1226 len -= ret;
1227 }
1228 }
1229 return len1 - len;
1230}
1231
fd1dff4b
FB
1232static inline int send_all(int fd, const uint8_t *buf, int len1)
1233{
1234 return unix_write(fd, buf, len1);
1235}
1236
1237void socket_set_nonblock(int fd)
1238{
1239 fcntl(fd, F_SETFL, O_NONBLOCK);
1240}
1241#endif /* !_WIN32 */
1242
1243#ifndef _WIN32
1244
1245typedef struct {
1246 int fd_in, fd_out;
1247 IOCanRWHandler *fd_can_read;
1248 IOReadHandler *fd_read;
1249 void *fd_opaque;
1250 int max_size;
1251} FDCharDriver;
1252
1253#define STDIO_MAX_CLIENTS 2
1254
1255static int stdio_nb_clients;
1256static CharDriverState *stdio_clients[STDIO_MAX_CLIENTS];
1257
82c643ff
FB
1258static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1259{
1260 FDCharDriver *s = chr->opaque;
1d96905d 1261 return unix_write(s->fd_out, buf, len);
82c643ff
FB
1262}
1263
7c9d8e07
FB
1264static int fd_chr_read_poll(void *opaque)
1265{
1266 CharDriverState *chr = opaque;
1267 FDCharDriver *s = chr->opaque;
1268
1269 s->max_size = s->fd_can_read(s->fd_opaque);
1270 return s->max_size;
1271}
1272
1273static void fd_chr_read(void *opaque)
1274{
1275 CharDriverState *chr = opaque;
1276 FDCharDriver *s = chr->opaque;
1277 int size, len;
1278 uint8_t buf[1024];
1279
1280 len = sizeof(buf);
1281 if (len > s->max_size)
1282 len = s->max_size;
1283 if (len == 0)
1284 return;
1285 size = read(s->fd_in, buf, len);
1286 if (size > 0) {
1287 s->fd_read(s->fd_opaque, buf, size);
1288 }
1289}
1290
82c643ff
FB
1291static void fd_chr_add_read_handler(CharDriverState *chr,
1292 IOCanRWHandler *fd_can_read,
1293 IOReadHandler *fd_read, void *opaque)
1294{
1295 FDCharDriver *s = chr->opaque;
1296
f8d179e3 1297 if (s->fd_in >= 0) {
7c9d8e07
FB
1298 s->fd_can_read = fd_can_read;
1299 s->fd_read = fd_read;
1300 s->fd_opaque = opaque;
f8d179e3 1301 if (nographic && s->fd_in == 0) {
f8d179e3 1302 } else {
7c9d8e07
FB
1303 qemu_set_fd_handler2(s->fd_in, fd_chr_read_poll,
1304 fd_chr_read, NULL, chr);
f8d179e3 1305 }
82c643ff
FB
1306 }
1307}
1308
1309/* open a character device to a unix fd */
1310CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
1311{
1312 CharDriverState *chr;
1313 FDCharDriver *s;
1314
1315 chr = qemu_mallocz(sizeof(CharDriverState));
1316 if (!chr)
1317 return NULL;
1318 s = qemu_mallocz(sizeof(FDCharDriver));
1319 if (!s) {
1320 free(chr);
1321 return NULL;
1322 }
1323 s->fd_in = fd_in;
1324 s->fd_out = fd_out;
1325 chr->opaque = s;
1326 chr->chr_write = fd_chr_write;
1327 chr->chr_add_read_handler = fd_chr_add_read_handler;
1328 return chr;
1329}
1330
f8d179e3
FB
1331CharDriverState *qemu_chr_open_file_out(const char *file_out)
1332{
1333 int fd_out;
1334
89ba1a73 1335 fd_out = open(file_out, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0666);
f8d179e3
FB
1336 if (fd_out < 0)
1337 return NULL;
1338 return qemu_chr_open_fd(-1, fd_out);
1339}
1340
1341CharDriverState *qemu_chr_open_pipe(const char *filename)
1342{
1343 int fd;
1344
1345 fd = open(filename, O_RDWR | O_BINARY);
1346 if (fd < 0)
1347 return NULL;
1348 return qemu_chr_open_fd(fd, fd);
1349}
1350
1351
82c643ff
FB
1352/* for STDIO, we handle the case where several clients use it
1353 (nographic mode) */
1354
1355#define TERM_ESCAPE 0x01 /* ctrl-a is used for escape */
1356
aa0bc6b6
FB
1357#define TERM_FIFO_MAX_SIZE 1
1358
82c643ff 1359static int term_got_escape, client_index;
aa0bc6b6
FB
1360static uint8_t term_fifo[TERM_FIFO_MAX_SIZE];
1361int term_fifo_size;
82c643ff
FB
1362
1363void term_print_help(void)
1364{
1365 printf("\n"
1366 "C-a h print this help\n"
1367 "C-a x exit emulator\n"
1368 "C-a s save disk data back to file (if -snapshot)\n"
1369 "C-a b send break (magic sysrq)\n"
1370 "C-a c switch between console and monitor\n"
1371 "C-a C-a send C-a\n"
1372 );
1373}
1374
1375/* called when a char is received */
1376static void stdio_received_byte(int ch)
1377{
1378 if (term_got_escape) {
1379 term_got_escape = 0;
1380 switch(ch) {
1381 case 'h':
1382 term_print_help();
1383 break;
1384 case 'x':
1385 exit(0);
1386 break;
1387 case 's':
1388 {
1389 int i;
1390 for (i = 0; i < MAX_DISKS; i++) {
1391 if (bs_table[i])
1392 bdrv_commit(bs_table[i]);
1393 }
1394 }
1395 break;
1396 case 'b':
1397 if (client_index < stdio_nb_clients) {
1398 CharDriverState *chr;
1399 FDCharDriver *s;
1400
1401 chr = stdio_clients[client_index];
1402 s = chr->opaque;
1403 chr->chr_event(s->fd_opaque, CHR_EVENT_BREAK);
1404 }
1405 break;
1406 case 'c':
1407 client_index++;
1408 if (client_index >= stdio_nb_clients)
1409 client_index = 0;
1410 if (client_index == 0) {
1411 /* send a new line in the monitor to get the prompt */
1412 ch = '\r';
1413 goto send_char;
1414 }
1415 break;
1416 case TERM_ESCAPE:
1417 goto send_char;
1418 }
1419 } else if (ch == TERM_ESCAPE) {
1420 term_got_escape = 1;
1421 } else {
1422 send_char:
1423 if (client_index < stdio_nb_clients) {
1424 uint8_t buf[1];
1425 CharDriverState *chr;
1426 FDCharDriver *s;
1427
1428 chr = stdio_clients[client_index];
1429 s = chr->opaque;
aa0bc6b6
FB
1430 if (s->fd_can_read(s->fd_opaque) > 0) {
1431 buf[0] = ch;
82c643ff 1432 s->fd_read(s->fd_opaque, buf, 1);
aa0bc6b6
FB
1433 } else if (term_fifo_size == 0) {
1434 term_fifo[term_fifo_size++] = ch;
1435 }
c4b1fcc0 1436 }
330d0414 1437 }
330d0414
FB
1438}
1439
7c9d8e07 1440static int stdio_read_poll(void *opaque)
82c643ff 1441{
aa0bc6b6
FB
1442 CharDriverState *chr;
1443 FDCharDriver *s;
1444
1445 if (client_index < stdio_nb_clients) {
1446 chr = stdio_clients[client_index];
1447 s = chr->opaque;
1448 /* try to flush the queue if needed */
1449 if (term_fifo_size != 0 && s->fd_can_read(s->fd_opaque) > 0) {
1450 s->fd_read(s->fd_opaque, term_fifo, 1);
1451 term_fifo_size = 0;
1452 }
1453 /* see if we can absorb more chars */
1454 if (term_fifo_size == 0)
1455 return 1;
1456 else
1457 return 0;
1458 } else {
1459 return 1;
1460 }
82c643ff
FB
1461}
1462
7c9d8e07 1463static void stdio_read(void *opaque)
82c643ff 1464{
7c9d8e07
FB
1465 int size;
1466 uint8_t buf[1];
1467
1468 size = read(0, buf, 1);
1469 if (size > 0)
1470 stdio_received_byte(buf[0]);
82c643ff
FB
1471}
1472
8d11df9e
FB
1473/* init terminal so that we can grab keys */
1474static struct termios oldtty;
1475static int old_fd0_flags;
1476
1477static void term_exit(void)
1478{
1479 tcsetattr (0, TCSANOW, &oldtty);
1480 fcntl(0, F_SETFL, old_fd0_flags);
1481}
1482
1483static void term_init(void)
1484{
1485 struct termios tty;
1486
1487 tcgetattr (0, &tty);
1488 oldtty = tty;
1489 old_fd0_flags = fcntl(0, F_GETFL);
1490
1491 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1492 |INLCR|IGNCR|ICRNL|IXON);
1493 tty.c_oflag |= OPOST;
1494 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1495 /* if graphical mode, we allow Ctrl-C handling */
1496 if (nographic)
1497 tty.c_lflag &= ~ISIG;
1498 tty.c_cflag &= ~(CSIZE|PARENB);
1499 tty.c_cflag |= CS8;
1500 tty.c_cc[VMIN] = 1;
1501 tty.c_cc[VTIME] = 0;
1502
1503 tcsetattr (0, TCSANOW, &tty);
1504
1505 atexit(term_exit);
1506
1507 fcntl(0, F_SETFL, O_NONBLOCK);
1508}
1509
82c643ff
FB
1510CharDriverState *qemu_chr_open_stdio(void)
1511{
1512 CharDriverState *chr;
1513
1514 if (nographic) {
1515 if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
1516 return NULL;
1517 chr = qemu_chr_open_fd(0, 1);
1518 if (stdio_nb_clients == 0)
7c9d8e07 1519 qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, NULL);
82c643ff
FB
1520 client_index = stdio_nb_clients;
1521 } else {
1522 if (stdio_nb_clients != 0)
1523 return NULL;
1524 chr = qemu_chr_open_fd(0, 1);
1525 }
1526 stdio_clients[stdio_nb_clients++] = chr;
8d11df9e
FB
1527 if (stdio_nb_clients == 1) {
1528 /* set the terminal in raw mode */
1529 term_init();
1530 }
82c643ff
FB
1531 return chr;
1532}
1533
1534#if defined(__linux__)
1535CharDriverState *qemu_chr_open_pty(void)
1536{
91fc2119 1537 struct termios tty;
82c643ff
FB
1538 char slave_name[1024];
1539 int master_fd, slave_fd;
1540
1541 /* Not satisfying */
1542 if (openpty(&master_fd, &slave_fd, slave_name, NULL, NULL) < 0) {
1543 return NULL;
1544 }
91fc2119
FB
1545
1546 /* Disabling local echo and line-buffered output */
1547 tcgetattr (master_fd, &tty);
1548 tty.c_lflag &= ~(ECHO|ICANON|ISIG);
1549 tty.c_cc[VMIN] = 1;
1550 tty.c_cc[VTIME] = 0;
1551 tcsetattr (master_fd, TCSAFLUSH, &tty);
1552
82c643ff
FB
1553 fprintf(stderr, "char device redirected to %s\n", slave_name);
1554 return qemu_chr_open_fd(master_fd, master_fd);
1555}
f8d179e3
FB
1556
1557static void tty_serial_init(int fd, int speed,
1558 int parity, int data_bits, int stop_bits)
1559{
1560 struct termios tty;
1561 speed_t spd;
1562
e57a8c0e
FB
1563#if 0
1564 printf("tty_serial_init: speed=%d parity=%c data=%d stop=%d\n",
1565 speed, parity, data_bits, stop_bits);
1566#endif
1567 tcgetattr (fd, &tty);
f8d179e3
FB
1568
1569 switch(speed) {
1570 case 50:
1571 spd = B50;
1572 break;
1573 case 75:
1574 spd = B75;
1575 break;
1576 case 300:
1577 spd = B300;
1578 break;
1579 case 600:
1580 spd = B600;
1581 break;
1582 case 1200:
1583 spd = B1200;
1584 break;
1585 case 2400:
1586 spd = B2400;
1587 break;
1588 case 4800:
1589 spd = B4800;
1590 break;
1591 case 9600:
1592 spd = B9600;
1593 break;
1594 case 19200:
1595 spd = B19200;
1596 break;
1597 case 38400:
1598 spd = B38400;
1599 break;
1600 case 57600:
1601 spd = B57600;
1602 break;
1603 default:
1604 case 115200:
1605 spd = B115200;
1606 break;
1607 }
1608
1609 cfsetispeed(&tty, spd);
1610 cfsetospeed(&tty, spd);
1611
1612 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1613 |INLCR|IGNCR|ICRNL|IXON);
1614 tty.c_oflag |= OPOST;
1615 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG);
1616 tty.c_cflag &= ~(CSIZE|PARENB|PARODD|CRTSCTS);
1617 switch(data_bits) {
1618 default:
1619 case 8:
1620 tty.c_cflag |= CS8;
1621 break;
1622 case 7:
1623 tty.c_cflag |= CS7;
1624 break;
1625 case 6:
1626 tty.c_cflag |= CS6;
1627 break;
1628 case 5:
1629 tty.c_cflag |= CS5;
1630 break;
1631 }
1632 switch(parity) {
1633 default:
1634 case 'N':
1635 break;
1636 case 'E':
1637 tty.c_cflag |= PARENB;
1638 break;
1639 case 'O':
1640 tty.c_cflag |= PARENB | PARODD;
1641 break;
1642 }
1643
1644 tcsetattr (fd, TCSANOW, &tty);
1645}
1646
e57a8c0e 1647static int tty_serial_ioctl(CharDriverState *chr, int cmd, void *arg)
f8d179e3
FB
1648{
1649 FDCharDriver *s = chr->opaque;
e57a8c0e
FB
1650
1651 switch(cmd) {
1652 case CHR_IOCTL_SERIAL_SET_PARAMS:
1653 {
1654 QEMUSerialSetParams *ssp = arg;
1655 tty_serial_init(s->fd_in, ssp->speed, ssp->parity,
1656 ssp->data_bits, ssp->stop_bits);
1657 }
1658 break;
1659 case CHR_IOCTL_SERIAL_SET_BREAK:
1660 {
1661 int enable = *(int *)arg;
1662 if (enable)
1663 tcsendbreak(s->fd_in, 1);
1664 }
1665 break;
1666 default:
1667 return -ENOTSUP;
1668 }
1669 return 0;
f8d179e3
FB
1670}
1671
1672CharDriverState *qemu_chr_open_tty(const char *filename)
1673{
1674 CharDriverState *chr;
1675 int fd;
1676
e57a8c0e 1677 fd = open(filename, O_RDWR | O_NONBLOCK);
f8d179e3
FB
1678 if (fd < 0)
1679 return NULL;
1680 fcntl(fd, F_SETFL, O_NONBLOCK);
1681 tty_serial_init(fd, 115200, 'N', 8, 1);
1682 chr = qemu_chr_open_fd(fd, fd);
1683 if (!chr)
1684 return NULL;
e57a8c0e
FB
1685 chr->chr_ioctl = tty_serial_ioctl;
1686 return chr;
1687}
1688
1689static int pp_ioctl(CharDriverState *chr, int cmd, void *arg)
1690{
1691 int fd = (int)chr->opaque;
1692 uint8_t b;
1693
1694 switch(cmd) {
1695 case CHR_IOCTL_PP_READ_DATA:
1696 if (ioctl(fd, PPRDATA, &b) < 0)
1697 return -ENOTSUP;
1698 *(uint8_t *)arg = b;
1699 break;
1700 case CHR_IOCTL_PP_WRITE_DATA:
1701 b = *(uint8_t *)arg;
1702 if (ioctl(fd, PPWDATA, &b) < 0)
1703 return -ENOTSUP;
1704 break;
1705 case CHR_IOCTL_PP_READ_CONTROL:
1706 if (ioctl(fd, PPRCONTROL, &b) < 0)
1707 return -ENOTSUP;
1708 *(uint8_t *)arg = b;
1709 break;
1710 case CHR_IOCTL_PP_WRITE_CONTROL:
1711 b = *(uint8_t *)arg;
1712 if (ioctl(fd, PPWCONTROL, &b) < 0)
1713 return -ENOTSUP;
1714 break;
1715 case CHR_IOCTL_PP_READ_STATUS:
1716 if (ioctl(fd, PPRSTATUS, &b) < 0)
1717 return -ENOTSUP;
1718 *(uint8_t *)arg = b;
1719 break;
1720 default:
1721 return -ENOTSUP;
1722 }
1723 return 0;
1724}
1725
1726CharDriverState *qemu_chr_open_pp(const char *filename)
1727{
1728 CharDriverState *chr;
1729 int fd;
1730
1731 fd = open(filename, O_RDWR);
1732 if (fd < 0)
1733 return NULL;
1734
1735 if (ioctl(fd, PPCLAIM) < 0) {
1736 close(fd);
1737 return NULL;
1738 }
1739
1740 chr = qemu_mallocz(sizeof(CharDriverState));
1741 if (!chr) {
1742 close(fd);
1743 return NULL;
1744 }
1745 chr->opaque = (void *)fd;
1746 chr->chr_write = null_chr_write;
1747 chr->chr_add_read_handler = null_chr_add_read_handler;
1748 chr->chr_ioctl = pp_ioctl;
f8d179e3
FB
1749 return chr;
1750}
1751
82c643ff
FB
1752#else
1753CharDriverState *qemu_chr_open_pty(void)
1754{
1755 return NULL;
1756}
67b915a5
FB
1757#endif
1758
82c643ff
FB
1759#endif /* !defined(_WIN32) */
1760
f331110f
FB
1761#ifdef _WIN32
1762typedef struct {
1763 IOCanRWHandler *fd_can_read;
1764 IOReadHandler *fd_read;
1765 void *win_opaque;
1766 int max_size;
1767 HANDLE hcom, hrecv, hsend;
1768 OVERLAPPED orecv, osend;
1769 BOOL fpipe;
1770 DWORD len;
1771} WinCharState;
1772
1773#define NSENDBUF 2048
1774#define NRECVBUF 2048
1775#define MAXCONNECT 1
1776#define NTIMEOUT 5000
1777
1778static int win_chr_poll(void *opaque);
1779static int win_chr_pipe_poll(void *opaque);
1780
1781static void win_chr_close2(WinCharState *s)
1782{
1783 if (s->hsend) {
1784 CloseHandle(s->hsend);
1785 s->hsend = NULL;
1786 }
1787 if (s->hrecv) {
1788 CloseHandle(s->hrecv);
1789 s->hrecv = NULL;
1790 }
1791 if (s->hcom) {
1792 CloseHandle(s->hcom);
1793 s->hcom = NULL;
1794 }
1795 if (s->fpipe)
1796 qemu_del_polling_cb(win_chr_pipe_poll, s);
1797 else
1798 qemu_del_polling_cb(win_chr_poll, s);
1799}
1800
1801static void win_chr_close(CharDriverState *chr)
1802{
1803 WinCharState *s = chr->opaque;
1804 win_chr_close2(s);
1805}
1806
1807static int win_chr_init(WinCharState *s, const char *filename)
1808{
1809 COMMCONFIG comcfg;
1810 COMMTIMEOUTS cto = { 0, 0, 0, 0, 0};
1811 COMSTAT comstat;
1812 DWORD size;
1813 DWORD err;
1814
1815 s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
1816 if (!s->hsend) {
1817 fprintf(stderr, "Failed CreateEvent\n");
1818 goto fail;
1819 }
1820 s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
1821 if (!s->hrecv) {
1822 fprintf(stderr, "Failed CreateEvent\n");
1823 goto fail;
1824 }
1825
1826 s->hcom = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL,
1827 OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
1828 if (s->hcom == INVALID_HANDLE_VALUE) {
1829 fprintf(stderr, "Failed CreateFile (%lu)\n", GetLastError());
1830 s->hcom = NULL;
1831 goto fail;
1832 }
1833
1834 if (!SetupComm(s->hcom, NRECVBUF, NSENDBUF)) {
1835 fprintf(stderr, "Failed SetupComm\n");
1836 goto fail;
1837 }
1838
1839 ZeroMemory(&comcfg, sizeof(COMMCONFIG));
1840 size = sizeof(COMMCONFIG);
1841 GetDefaultCommConfig(filename, &comcfg, &size);
1842 comcfg.dcb.DCBlength = sizeof(DCB);
1843 CommConfigDialog(filename, NULL, &comcfg);
1844
1845 if (!SetCommState(s->hcom, &comcfg.dcb)) {
1846 fprintf(stderr, "Failed SetCommState\n");
1847 goto fail;
1848 }
1849
1850 if (!SetCommMask(s->hcom, EV_ERR)) {
1851 fprintf(stderr, "Failed SetCommMask\n");
1852 goto fail;
1853 }
1854
1855 cto.ReadIntervalTimeout = MAXDWORD;
1856 if (!SetCommTimeouts(s->hcom, &cto)) {
1857 fprintf(stderr, "Failed SetCommTimeouts\n");
1858 goto fail;
1859 }
1860
1861 if (!ClearCommError(s->hcom, &err, &comstat)) {
1862 fprintf(stderr, "Failed ClearCommError\n");
1863 goto fail;
1864 }
1865 qemu_add_polling_cb(win_chr_poll, s);
1866 return 0;
1867
1868 fail:
1869 win_chr_close2(s);
1870 return -1;
1871}
1872
1873static int win_chr_write(CharDriverState *chr, const uint8_t *buf, int len1)
1874{
1875 WinCharState *s = chr->opaque;
1876 DWORD len, ret, size, err;
1877
1878 len = len1;
1879 ZeroMemory(&s->osend, sizeof(s->osend));
1880 s->osend.hEvent = s->hsend;
1881 while (len > 0) {
1882 if (s->hsend)
1883 ret = WriteFile(s->hcom, buf, len, &size, &s->osend);
1884 else
1885 ret = WriteFile(s->hcom, buf, len, &size, NULL);
1886 if (!ret) {
1887 err = GetLastError();
1888 if (err == ERROR_IO_PENDING) {
1889 ret = GetOverlappedResult(s->hcom, &s->osend, &size, TRUE);
1890 if (ret) {
1891 buf += size;
1892 len -= size;
1893 } else {
1894 break;
1895 }
1896 } else {
1897 break;
1898 }
1899 } else {
1900 buf += size;
1901 len -= size;
1902 }
1903 }
1904 return len1 - len;
1905}
1906
1907static int win_chr_read_poll(WinCharState *s)
1908{
1909 s->max_size = s->fd_can_read(s->win_opaque);
1910 return s->max_size;
1911}
1912
1913static void win_chr_readfile(WinCharState *s)
1914{
1915 int ret, err;
1916 uint8_t buf[1024];
1917 DWORD size;
1918
1919 ZeroMemory(&s->orecv, sizeof(s->orecv));
1920 s->orecv.hEvent = s->hrecv;
1921 ret = ReadFile(s->hcom, buf, s->len, &size, &s->orecv);
1922 if (!ret) {
1923 err = GetLastError();
1924 if (err == ERROR_IO_PENDING) {
1925 ret = GetOverlappedResult(s->hcom, &s->orecv, &size, TRUE);
1926 }
1927 }
1928
1929 if (size > 0) {
1930 s->fd_read(s->win_opaque, buf, size);
1931 }
1932}
1933
1934static void win_chr_read(WinCharState *s)
1935{
1936 if (s->len > s->max_size)
1937 s->len = s->max_size;
1938 if (s->len == 0)
1939 return;
1940
1941 win_chr_readfile(s);
1942}
1943
1944static int win_chr_poll(void *opaque)
1945{
1946 WinCharState *s = opaque;
1947 COMSTAT status;
1948 DWORD comerr;
1949
1950 ClearCommError(s->hcom, &comerr, &status);
1951 if (status.cbInQue > 0) {
1952 s->len = status.cbInQue;
1953 win_chr_read_poll(s);
1954 win_chr_read(s);
1955 return 1;
1956 }
1957 return 0;
1958}
1959
1960static void win_chr_add_read_handler(CharDriverState *chr,
1961 IOCanRWHandler *fd_can_read,
1962 IOReadHandler *fd_read, void *opaque)
1963{
1964 WinCharState *s = chr->opaque;
1965
1966 s->fd_can_read = fd_can_read;
1967 s->fd_read = fd_read;
1968 s->win_opaque = opaque;
1969}
1970
1971CharDriverState *qemu_chr_open_win(const char *filename)
1972{
1973 CharDriverState *chr;
1974 WinCharState *s;
1975
1976 chr = qemu_mallocz(sizeof(CharDriverState));
1977 if (!chr)
1978 return NULL;
1979 s = qemu_mallocz(sizeof(WinCharState));
1980 if (!s) {
1981 free(chr);
1982 return NULL;
1983 }
1984 chr->opaque = s;
1985 chr->chr_write = win_chr_write;
1986 chr->chr_add_read_handler = win_chr_add_read_handler;
1987 chr->chr_close = win_chr_close;
1988
1989 if (win_chr_init(s, filename) < 0) {
1990 free(s);
1991 free(chr);
1992 return NULL;
1993 }
1994 return chr;
1995}
1996
1997static int win_chr_pipe_poll(void *opaque)
1998{
1999 WinCharState *s = opaque;
2000 DWORD size;
2001
2002 PeekNamedPipe(s->hcom, NULL, 0, NULL, &size, NULL);
2003 if (size > 0) {
2004 s->len = size;
2005 win_chr_read_poll(s);
2006 win_chr_read(s);
2007 return 1;
2008 }
2009 return 0;
2010}
2011
2012static int win_chr_pipe_init(WinCharState *s, const char *filename)
2013{
2014 OVERLAPPED ov;
2015 int ret;
2016 DWORD size;
2017 char openname[256];
2018
2019 s->fpipe = TRUE;
2020
2021 s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
2022 if (!s->hsend) {
2023 fprintf(stderr, "Failed CreateEvent\n");
2024 goto fail;
2025 }
2026 s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
2027 if (!s->hrecv) {
2028 fprintf(stderr, "Failed CreateEvent\n");
2029 goto fail;
2030 }
2031
2032 snprintf(openname, sizeof(openname), "\\\\.\\pipe\\%s", filename);
2033 s->hcom = CreateNamedPipe(openname, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
2034 PIPE_TYPE_BYTE | PIPE_READMODE_BYTE |
2035 PIPE_WAIT,
2036 MAXCONNECT, NSENDBUF, NRECVBUF, NTIMEOUT, NULL);
2037 if (s->hcom == INVALID_HANDLE_VALUE) {
2038 fprintf(stderr, "Failed CreateNamedPipe (%lu)\n", GetLastError());
2039 s->hcom = NULL;
2040 goto fail;
2041 }
2042
2043 ZeroMemory(&ov, sizeof(ov));
2044 ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
2045 ret = ConnectNamedPipe(s->hcom, &ov);
2046 if (ret) {
2047 fprintf(stderr, "Failed ConnectNamedPipe\n");
2048 goto fail;
2049 }
2050
2051 ret = GetOverlappedResult(s->hcom, &ov, &size, TRUE);
2052 if (!ret) {
2053 fprintf(stderr, "Failed GetOverlappedResult\n");
2054 if (ov.hEvent) {
2055 CloseHandle(ov.hEvent);
2056 ov.hEvent = NULL;
2057 }
2058 goto fail;
2059 }
2060
2061 if (ov.hEvent) {
2062 CloseHandle(ov.hEvent);
2063 ov.hEvent = NULL;
2064 }
2065 qemu_add_polling_cb(win_chr_pipe_poll, s);
2066 return 0;
2067
2068 fail:
2069 win_chr_close2(s);
2070 return -1;
2071}
2072
2073
2074CharDriverState *qemu_chr_open_win_pipe(const char *filename)
2075{
2076 CharDriverState *chr;
2077 WinCharState *s;
2078
2079 chr = qemu_mallocz(sizeof(CharDriverState));
2080 if (!chr)
2081 return NULL;
2082 s = qemu_mallocz(sizeof(WinCharState));
2083 if (!s) {
2084 free(chr);
2085 return NULL;
2086 }
2087 chr->opaque = s;
2088 chr->chr_write = win_chr_write;
2089 chr->chr_add_read_handler = win_chr_add_read_handler;
2090 chr->chr_close = win_chr_close;
2091
2092 if (win_chr_pipe_init(s, filename) < 0) {
2093 free(s);
2094 free(chr);
2095 return NULL;
2096 }
2097 return chr;
2098}
2099
2100CharDriverState *qemu_chr_open_win_file(HANDLE fd_out)
2101{
2102 CharDriverState *chr;
2103 WinCharState *s;
2104
2105 chr = qemu_mallocz(sizeof(CharDriverState));
2106 if (!chr)
2107 return NULL;
2108 s = qemu_mallocz(sizeof(WinCharState));
2109 if (!s) {
2110 free(chr);
2111 return NULL;
2112 }
2113 s->hcom = fd_out;
2114 chr->opaque = s;
2115 chr->chr_write = win_chr_write;
2116 chr->chr_add_read_handler = win_chr_add_read_handler;
2117 return chr;
2118}
2119
2120CharDriverState *qemu_chr_open_win_file_out(const char *file_out)
2121{
2122 HANDLE fd_out;
2123
2124 fd_out = CreateFile(file_out, GENERIC_WRITE, FILE_SHARE_READ, NULL,
2125 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2126 if (fd_out == INVALID_HANDLE_VALUE)
2127 return NULL;
2128
2129 return qemu_chr_open_win_file(fd_out);
2130}
2131#endif
2132
82c643ff
FB
2133CharDriverState *qemu_chr_open(const char *filename)
2134{
f8d179e3 2135 const char *p;
fd1dff4b 2136
82c643ff
FB
2137 if (!strcmp(filename, "vc")) {
2138 return text_console_init(&display_state);
2139 } else if (!strcmp(filename, "null")) {
2140 return qemu_chr_open_null();
7664728b
FB
2141 } else
2142#ifndef _WIN32
2143 if (strstart(filename, "file:", &p)) {
f8d179e3
FB
2144 return qemu_chr_open_file_out(p);
2145 } else if (strstart(filename, "pipe:", &p)) {
2146 return qemu_chr_open_pipe(p);
7664728b 2147 } else if (!strcmp(filename, "pty")) {
82c643ff
FB
2148 return qemu_chr_open_pty();
2149 } else if (!strcmp(filename, "stdio")) {
2150 return qemu_chr_open_stdio();
2151 } else
f8d179e3
FB
2152#endif
2153#if defined(__linux__)
e57a8c0e
FB
2154 if (strstart(filename, "/dev/parport", NULL)) {
2155 return qemu_chr_open_pp(filename);
2156 } else
f8d179e3
FB
2157 if (strstart(filename, "/dev/", NULL)) {
2158 return qemu_chr_open_tty(filename);
2159 } else
f331110f
FB
2160#endif
2161#ifdef _WIN32
2162 if (strstart(filename, "COM", NULL)) {
2163 return qemu_chr_open_win(filename);
2164 } else
2165 if (strstart(filename, "pipe:", &p)) {
2166 return qemu_chr_open_win_pipe(p);
2167 } else
2168 if (strstart(filename, "file:", &p)) {
2169 return qemu_chr_open_win_file_out(p);
2170 }
82c643ff
FB
2171#endif
2172 {
2173 return NULL;
2174 }
2175}
2176
f331110f
FB
2177void qemu_chr_close(CharDriverState *chr)
2178{
2179 if (chr->chr_close)
2180 chr->chr_close(chr);
2181}
2182
80cabfad 2183/***********************************************************/
7c9d8e07 2184/* network device redirectors */
330d0414 2185
c20709aa
FB
2186void hex_dump(FILE *f, const uint8_t *buf, int size)
2187{
2188 int len, i, j, c;
2189
2190 for(i=0;i<size;i+=16) {
2191 len = size - i;
2192 if (len > 16)
2193 len = 16;
2194 fprintf(f, "%08x ", i);
2195 for(j=0;j<16;j++) {
2196 if (j < len)
2197 fprintf(f, " %02x", buf[i+j]);
2198 else
2199 fprintf(f, " ");
2200 }
2201 fprintf(f, " ");
2202 for(j=0;j<len;j++) {
2203 c = buf[i+j];
2204 if (c < ' ' || c > '~')
2205 c = '.';
2206 fprintf(f, "%c", c);
2207 }
2208 fprintf(f, "\n");
2209 }
2210}
2211
7c9d8e07 2212static int parse_macaddr(uint8_t *macaddr, const char *p)
c20709aa 2213{
7c9d8e07
FB
2214 int i;
2215 for(i = 0; i < 6; i++) {
2216 macaddr[i] = strtol(p, (char **)&p, 16);
2217 if (i == 5) {
2218 if (*p != '\0')
2219 return -1;
2220 } else {
2221 if (*p != ':')
2222 return -1;
2223 p++;
2224 }
2225 }
2226 return 0;
c20709aa 2227}
67b915a5 2228
7c9d8e07 2229static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
67b915a5 2230{
7c9d8e07
FB
2231 const char *p, *p1;
2232 int len;
2233 p = *pp;
2234 p1 = strchr(p, sep);
2235 if (!p1)
2236 return -1;
2237 len = p1 - p;
2238 p1++;
2239 if (buf_size > 0) {
2240 if (len > buf_size - 1)
2241 len = buf_size - 1;
2242 memcpy(buf, p, len);
2243 buf[len] = '\0';
2244 }
2245 *pp = p1;
2246 return 0;
c20709aa
FB
2247}
2248
7c9d8e07
FB
2249int parse_host_port(struct sockaddr_in *saddr, const char *str)
2250{
2251 char buf[512];
2252 struct hostent *he;
2253 const char *p, *r;
2254 int port;
2255
2256 p = str;
2257 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
2258 return -1;
2259 saddr->sin_family = AF_INET;
2260 if (buf[0] == '\0') {
2261 saddr->sin_addr.s_addr = 0;
2262 } else {
2263 if (isdigit(buf[0])) {
2264 if (!inet_aton(buf, &saddr->sin_addr))
2265 return -1;
2266 } else {
7c9d8e07
FB
2267 if ((he = gethostbyname(buf)) == NULL)
2268 return - 1;
2269 saddr->sin_addr = *(struct in_addr *)he->h_addr;
7c9d8e07
FB
2270 }
2271 }
2272 port = strtol(p, (char **)&r, 0);
2273 if (r == p)
2274 return -1;
2275 saddr->sin_port = htons(port);
2276 return 0;
2277}
c20709aa 2278
7c9d8e07
FB
2279/* find or alloc a new VLAN */
2280VLANState *qemu_find_vlan(int id)
c20709aa 2281{
7c9d8e07
FB
2282 VLANState **pvlan, *vlan;
2283 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2284 if (vlan->id == id)
2285 return vlan;
2286 }
2287 vlan = qemu_mallocz(sizeof(VLANState));
2288 if (!vlan)
2289 return NULL;
2290 vlan->id = id;
2291 vlan->next = NULL;
2292 pvlan = &first_vlan;
2293 while (*pvlan != NULL)
2294 pvlan = &(*pvlan)->next;
2295 *pvlan = vlan;
2296 return vlan;
c20709aa
FB
2297}
2298
7c9d8e07 2299VLANClientState *qemu_new_vlan_client(VLANState *vlan,
d861b05e
PB
2300 IOReadHandler *fd_read,
2301 IOCanRWHandler *fd_can_read,
2302 void *opaque)
c20709aa 2303{
7c9d8e07
FB
2304 VLANClientState *vc, **pvc;
2305 vc = qemu_mallocz(sizeof(VLANClientState));
2306 if (!vc)
2307 return NULL;
2308 vc->fd_read = fd_read;
d861b05e 2309 vc->fd_can_read = fd_can_read;
7c9d8e07
FB
2310 vc->opaque = opaque;
2311 vc->vlan = vlan;
2312
2313 vc->next = NULL;
2314 pvc = &vlan->first_client;
2315 while (*pvc != NULL)
2316 pvc = &(*pvc)->next;
2317 *pvc = vc;
2318 return vc;
c20709aa
FB
2319}
2320
d861b05e
PB
2321int qemu_can_send_packet(VLANClientState *vc1)
2322{
2323 VLANState *vlan = vc1->vlan;
2324 VLANClientState *vc;
2325
2326 for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
2327 if (vc != vc1) {
2328 if (vc->fd_can_read && !vc->fd_can_read(vc->opaque))
2329 return 0;
2330 }
2331 }
2332 return 1;
2333}
2334
7c9d8e07 2335void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size)
c20709aa 2336{
7c9d8e07
FB
2337 VLANState *vlan = vc1->vlan;
2338 VLANClientState *vc;
2339
2340#if 0
2341 printf("vlan %d send:\n", vlan->id);
2342 hex_dump(stdout, buf, size);
2343#endif
2344 for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
2345 if (vc != vc1) {
2346 vc->fd_read(vc->opaque, buf, size);
2347 }
2348 }
67b915a5
FB
2349}
2350
c20709aa
FB
2351#if defined(CONFIG_SLIRP)
2352
2353/* slirp network adapter */
2354
c20709aa 2355static int slirp_inited;
7c9d8e07 2356static VLANClientState *slirp_vc;
c20709aa
FB
2357
2358int slirp_can_output(void)
2359{
3b7f5d47 2360 return !slirp_vc || qemu_can_send_packet(slirp_vc);
c20709aa
FB
2361}
2362
2363void slirp_output(const uint8_t *pkt, int pkt_len)
67b915a5 2364{
c20709aa 2365#if 0
7c9d8e07 2366 printf("slirp output:\n");
c20709aa
FB
2367 hex_dump(stdout, pkt, pkt_len);
2368#endif
3b7f5d47
PB
2369 if (!slirp_vc)
2370 return;
7c9d8e07 2371 qemu_send_packet(slirp_vc, pkt, pkt_len);
67b915a5
FB
2372}
2373
7c9d8e07 2374static void slirp_receive(void *opaque, const uint8_t *buf, int size)
c20709aa
FB
2375{
2376#if 0
7c9d8e07 2377 printf("slirp input:\n");
c20709aa
FB
2378 hex_dump(stdout, buf, size);
2379#endif
2380 slirp_input(buf, size);
2381}
2382
7c9d8e07 2383static int net_slirp_init(VLANState *vlan)
c20709aa
FB
2384{
2385 if (!slirp_inited) {
2386 slirp_inited = 1;
2387 slirp_init();
2388 }
7c9d8e07 2389 slirp_vc = qemu_new_vlan_client(vlan,
d861b05e 2390 slirp_receive, NULL, NULL);
7c9d8e07 2391 snprintf(slirp_vc->info_str, sizeof(slirp_vc->info_str), "user redirector");
9bf05444
FB
2392 return 0;
2393}
2394
2395static void net_slirp_redir(const char *redir_str)
2396{
2397 int is_udp;
2398 char buf[256], *r;
2399 const char *p;
2400 struct in_addr guest_addr;
2401 int host_port, guest_port;
2402
2403 if (!slirp_inited) {
2404 slirp_inited = 1;
2405 slirp_init();
2406 }
2407
2408 p = redir_str;
2409 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
2410 goto fail;
2411 if (!strcmp(buf, "tcp")) {
2412 is_udp = 0;
2413 } else if (!strcmp(buf, "udp")) {
2414 is_udp = 1;
2415 } else {
2416 goto fail;
2417 }
2418
2419 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
2420 goto fail;
2421 host_port = strtol(buf, &r, 0);
2422 if (r == buf)
2423 goto fail;
2424
2425 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
2426 goto fail;
2427 if (buf[0] == '\0') {
2428 pstrcpy(buf, sizeof(buf), "10.0.2.15");
2429 }
2430 if (!inet_aton(buf, &guest_addr))
2431 goto fail;
2432
2433 guest_port = strtol(p, &r, 0);
2434 if (r == p)
2435 goto fail;
2436
2437 if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
2438 fprintf(stderr, "qemu: could not set up redirection\n");
2439 exit(1);
2440 }
2441 return;
2442 fail:
2443 fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n");
2444 exit(1);
2445}
9d728e8c 2446
c94c8d64
FB
2447#ifndef _WIN32
2448
9d728e8c
FB
2449char smb_dir[1024];
2450
2451static void smb_exit(void)
2452{
2453 DIR *d;
2454 struct dirent *de;
2455 char filename[1024];
2456
2457 /* erase all the files in the directory */
2458 d = opendir(smb_dir);
2459 for(;;) {
2460 de = readdir(d);
2461 if (!de)
2462 break;
2463 if (strcmp(de->d_name, ".") != 0 &&
2464 strcmp(de->d_name, "..") != 0) {
2465 snprintf(filename, sizeof(filename), "%s/%s",
2466 smb_dir, de->d_name);
2467 unlink(filename);
2468 }
2469 }
03ffbb69 2470 closedir(d);
9d728e8c
FB
2471 rmdir(smb_dir);
2472}
2473
2474/* automatic user mode samba server configuration */
2475void net_slirp_smb(const char *exported_dir)
2476{
2477 char smb_conf[1024];
2478 char smb_cmdline[1024];
2479 FILE *f;
2480
2481 if (!slirp_inited) {
2482 slirp_inited = 1;
2483 slirp_init();
2484 }
2485
2486 /* XXX: better tmp dir construction */
2487 snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%d", getpid());
2488 if (mkdir(smb_dir, 0700) < 0) {
2489 fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
2490 exit(1);
2491 }
2492 snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
2493
2494 f = fopen(smb_conf, "w");
2495 if (!f) {
2496 fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
2497 exit(1);
2498 }
2499 fprintf(f,
2500 "[global]\n"
157777ef
FB
2501 "private dir=%s\n"
2502 "smb ports=0\n"
2503 "socket address=127.0.0.1\n"
9d728e8c
FB
2504 "pid directory=%s\n"
2505 "lock directory=%s\n"
2506 "log file=%s/log.smbd\n"
2507 "smb passwd file=%s/smbpasswd\n"
03ffbb69 2508 "security = share\n"
9d728e8c
FB
2509 "[qemu]\n"
2510 "path=%s\n"
2511 "read only=no\n"
2512 "guest ok=yes\n",
2513 smb_dir,
157777ef 2514 smb_dir,
9d728e8c
FB
2515 smb_dir,
2516 smb_dir,
2517 smb_dir,
2518 exported_dir
2519 );
2520 fclose(f);
2521 atexit(smb_exit);
2522
2523 snprintf(smb_cmdline, sizeof(smb_cmdline), "/usr/sbin/smbd -s %s",
2524 smb_conf);
2525
2526 slirp_add_exec(0, smb_cmdline, 4, 139);
2527}
9bf05444 2528
c94c8d64
FB
2529#endif /* !defined(_WIN32) */
2530
c20709aa
FB
2531#endif /* CONFIG_SLIRP */
2532
2533#if !defined(_WIN32)
7c9d8e07
FB
2534
2535typedef struct TAPState {
2536 VLANClientState *vc;
2537 int fd;
2538} TAPState;
2539
2540static void tap_receive(void *opaque, const uint8_t *buf, int size)
2541{
2542 TAPState *s = opaque;
2543 int ret;
2544 for(;;) {
2545 ret = write(s->fd, buf, size);
2546 if (ret < 0 && (errno == EINTR || errno == EAGAIN)) {
2547 } else {
2548 break;
2549 }
2550 }
2551}
2552
2553static void tap_send(void *opaque)
2554{
2555 TAPState *s = opaque;
2556 uint8_t buf[4096];
2557 int size;
2558
2559 size = read(s->fd, buf, sizeof(buf));
2560 if (size > 0) {
2561 qemu_send_packet(s->vc, buf, size);
2562 }
2563}
2564
2565/* fd support */
2566
2567static TAPState *net_tap_fd_init(VLANState *vlan, int fd)
2568{
2569 TAPState *s;
2570
2571 s = qemu_mallocz(sizeof(TAPState));
2572 if (!s)
2573 return NULL;
2574 s->fd = fd;
d861b05e 2575 s->vc = qemu_new_vlan_client(vlan, tap_receive, NULL, s);
7c9d8e07
FB
2576 qemu_set_fd_handler(s->fd, tap_send, NULL, s);
2577 snprintf(s->vc->info_str, sizeof(s->vc->info_str), "tap: fd=%d", fd);
2578 return s;
2579}
2580
7d3505c5 2581#ifdef _BSD
7c9d8e07 2582static int tap_open(char *ifname, int ifname_size)
7d3505c5
FB
2583{
2584 int fd;
2585 char *dev;
2586 struct stat s;
67b915a5 2587
7d3505c5
FB
2588 fd = open("/dev/tap", O_RDWR);
2589 if (fd < 0) {
2590 fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
2591 return -1;
2592 }
2593
2594 fstat(fd, &s);
2595 dev = devname(s.st_rdev, S_IFCHR);
2596 pstrcpy(ifname, ifname_size, dev);
2597
2598 fcntl(fd, F_SETFL, O_NONBLOCK);
2599 return fd;
2600}
ec530c81
FB
2601#elif defined(__sun__)
2602static int tap_open(char *ifname, int ifname_size)
2603{
2604 fprintf(stderr, "warning: tap_open not yet implemented\n");
2605 return -1;
2606}
7d3505c5 2607#else
7c9d8e07 2608static int tap_open(char *ifname, int ifname_size)
330d0414 2609{
80cabfad 2610 struct ifreq ifr;
c4b1fcc0 2611 int fd, ret;
80cabfad
FB
2612
2613 fd = open("/dev/net/tun", O_RDWR);
2614 if (fd < 0) {
2615 fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
2616 return -1;
330d0414 2617 }
80cabfad
FB
2618 memset(&ifr, 0, sizeof(ifr));
2619 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
7c9d8e07
FB
2620 if (ifname[0] != '\0')
2621 pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
2622 else
2623 pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
80cabfad
FB
2624 ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
2625 if (ret != 0) {
2626 fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
2627 close(fd);
2628 return -1;
2629 }
c4b1fcc0 2630 pstrcpy(ifname, ifname_size, ifr.ifr_name);
80cabfad 2631 fcntl(fd, F_SETFL, O_NONBLOCK);
c4b1fcc0
FB
2632 return fd;
2633}
7d3505c5 2634#endif
330d0414 2635
7c9d8e07
FB
2636static int net_tap_init(VLANState *vlan, const char *ifname1,
2637 const char *setup_script)
2638{
2639 TAPState *s;
2640 int pid, status, fd;
2641 char *args[3];
2642 char **parg;
2643 char ifname[128];
2644
2645 if (ifname1 != NULL)
2646 pstrcpy(ifname, sizeof(ifname), ifname1);
2647 else
2648 ifname[0] = '\0';
2649 fd = tap_open(ifname, sizeof(ifname));
2650 if (fd < 0)
2651 return -1;
2652
2653 if (!setup_script)
2654 setup_script = "";
2655 if (setup_script[0] != '\0') {
2656 /* try to launch network init script */
2657 pid = fork();
2658 if (pid >= 0) {
2659 if (pid == 0) {
2660 parg = args;
2661 *parg++ = (char *)setup_script;
2662 *parg++ = ifname;
2663 *parg++ = NULL;
2664 execv(setup_script, args);
4a38940d 2665 _exit(1);
7c9d8e07
FB
2666 }
2667 while (waitpid(pid, &status, 0) != pid);
2668 if (!WIFEXITED(status) ||
2669 WEXITSTATUS(status) != 0) {
2670 fprintf(stderr, "%s: could not launch network script\n",
2671 setup_script);
2672 return -1;
2673 }
2674 }
2675 }
2676 s = net_tap_fd_init(vlan, fd);
2677 if (!s)
2678 return -1;
2679 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2680 "tap: ifname=%s setup_script=%s", ifname, setup_script);
2681 return 0;
2682}
2683
fd1dff4b
FB
2684#endif /* !_WIN32 */
2685
7c9d8e07
FB
2686/* network connection */
2687typedef struct NetSocketState {
2688 VLANClientState *vc;
2689 int fd;
2690 int state; /* 0 = getting length, 1 = getting data */
2691 int index;
2692 int packet_len;
2693 uint8_t buf[4096];
3d830459 2694 struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
7c9d8e07
FB
2695} NetSocketState;
2696
2697typedef struct NetSocketListenState {
2698 VLANState *vlan;
2699 int fd;
2700} NetSocketListenState;
2701
2702/* XXX: we consider we can send the whole packet without blocking */
2703static void net_socket_receive(void *opaque, const uint8_t *buf, int size)
c20709aa 2704{
7c9d8e07
FB
2705 NetSocketState *s = opaque;
2706 uint32_t len;
2707 len = htonl(size);
2708
fd1dff4b
FB
2709 send_all(s->fd, (const uint8_t *)&len, sizeof(len));
2710 send_all(s->fd, buf, size);
c20709aa
FB
2711}
2712
3d830459
FB
2713static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, int size)
2714{
2715 NetSocketState *s = opaque;
2716 sendto(s->fd, buf, size, 0,
2717 (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
2718}
2719
7c9d8e07 2720static void net_socket_send(void *opaque)
c4b1fcc0 2721{
7c9d8e07 2722 NetSocketState *s = opaque;
fd1dff4b 2723 int l, size, err;
7c9d8e07
FB
2724 uint8_t buf1[4096];
2725 const uint8_t *buf;
2726
fd1dff4b
FB
2727 size = recv(s->fd, buf1, sizeof(buf1), 0);
2728 if (size < 0) {
2729 err = socket_error();
2730 if (err != EWOULDBLOCK)
2731 goto eoc;
2732 } else if (size == 0) {
7c9d8e07 2733 /* end of connection */
fd1dff4b 2734 eoc:
7c9d8e07 2735 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
fd1dff4b 2736 closesocket(s->fd);
7c9d8e07
FB
2737 return;
2738 }
2739 buf = buf1;
2740 while (size > 0) {
2741 /* reassemble a packet from the network */
2742 switch(s->state) {
2743 case 0:
2744 l = 4 - s->index;
2745 if (l > size)
2746 l = size;
2747 memcpy(s->buf + s->index, buf, l);
2748 buf += l;
2749 size -= l;
2750 s->index += l;
2751 if (s->index == 4) {
2752 /* got length */
2753 s->packet_len = ntohl(*(uint32_t *)s->buf);
2754 s->index = 0;
2755 s->state = 1;
2756 }
2757 break;
2758 case 1:
2759 l = s->packet_len - s->index;
2760 if (l > size)
2761 l = size;
2762 memcpy(s->buf + s->index, buf, l);
2763 s->index += l;
2764 buf += l;
2765 size -= l;
2766 if (s->index >= s->packet_len) {
2767 qemu_send_packet(s->vc, s->buf, s->packet_len);
2768 s->index = 0;
2769 s->state = 0;
2770 }
2771 break;
2772 }
2773 }
c20709aa
FB
2774}
2775
3d830459
FB
2776static void net_socket_send_dgram(void *opaque)
2777{
2778 NetSocketState *s = opaque;
2779 int size;
2780
2781 size = recv(s->fd, s->buf, sizeof(s->buf), 0);
2782 if (size < 0)
2783 return;
2784 if (size == 0) {
2785 /* end of connection */
2786 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2787 return;
2788 }
2789 qemu_send_packet(s->vc, s->buf, size);
2790}
2791
2792static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
2793{
2794 struct ip_mreq imr;
2795 int fd;
2796 int val, ret;
2797 if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
2798 fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
fd1dff4b
FB
2799 inet_ntoa(mcastaddr->sin_addr),
2800 (int)ntohl(mcastaddr->sin_addr.s_addr));
3d830459
FB
2801 return -1;
2802
2803 }
2804 fd = socket(PF_INET, SOCK_DGRAM, 0);
2805 if (fd < 0) {
2806 perror("socket(PF_INET, SOCK_DGRAM)");
2807 return -1;
2808 }
2809
fd1dff4b
FB
2810 val = 1;
2811 ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
2812 (const char *)&val, sizeof(val));
2813 if (ret < 0) {
2814 perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
2815 goto fail;
2816 }
2817
2818 ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
2819 if (ret < 0) {
2820 perror("bind");
2821 goto fail;
2822 }
2823
3d830459
FB
2824 /* Add host to multicast group */
2825 imr.imr_multiaddr = mcastaddr->sin_addr;
2826 imr.imr_interface.s_addr = htonl(INADDR_ANY);
2827
fd1dff4b
FB
2828 ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
2829 (const char *)&imr, sizeof(struct ip_mreq));
3d830459
FB
2830 if (ret < 0) {
2831 perror("setsockopt(IP_ADD_MEMBERSHIP)");
2832 goto fail;
2833 }
2834
2835 /* Force mcast msgs to loopback (eg. several QEMUs in same host */
2836 val = 1;
fd1dff4b
FB
2837 ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
2838 (const char *)&val, sizeof(val));
3d830459
FB
2839 if (ret < 0) {
2840 perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
2841 goto fail;
2842 }
2843
fd1dff4b 2844 socket_set_nonblock(fd);
3d830459
FB
2845 return fd;
2846fail:
2847 if (fd>=0) close(fd);
2848 return -1;
2849}
2850
2851static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan, int fd,
2852 int is_connected)
2853{
2854 struct sockaddr_in saddr;
2855 int newfd;
2856 socklen_t saddr_len;
2857 NetSocketState *s;
2858
2859 /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
2860 * Because this may be "shared" socket from a "master" process, datagrams would be recv()
2861 * by ONLY ONE process: we must "clone" this dgram socket --jjo
2862 */
2863
2864 if (is_connected) {
2865 if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
2866 /* must be bound */
2867 if (saddr.sin_addr.s_addr==0) {
2868 fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
2869 fd);
2870 return NULL;
2871 }
2872 /* clone dgram socket */
2873 newfd = net_socket_mcast_create(&saddr);
2874 if (newfd < 0) {
2875 /* error already reported by net_socket_mcast_create() */
2876 close(fd);
2877 return NULL;
2878 }
2879 /* clone newfd to fd, close newfd */
2880 dup2(newfd, fd);
2881 close(newfd);
2882
2883 } else {
2884 fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
2885 fd, strerror(errno));
2886 return NULL;
2887 }
2888 }
2889
2890 s = qemu_mallocz(sizeof(NetSocketState));
2891 if (!s)
2892 return NULL;
2893 s->fd = fd;
2894
d861b05e 2895 s->vc = qemu_new_vlan_client(vlan, net_socket_receive_dgram, NULL, s);
3d830459
FB
2896 qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
2897
2898 /* mcast: save bound address as dst */
2899 if (is_connected) s->dgram_dst=saddr;
2900
2901 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2902 "socket: fd=%d (%s mcast=%s:%d)",
2903 fd, is_connected? "cloned" : "",
2904 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2905 return s;
2906}
2907
7c9d8e07 2908static void net_socket_connect(void *opaque)
c20709aa 2909{
7c9d8e07
FB
2910 NetSocketState *s = opaque;
2911 qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
2912}
c4b1fcc0 2913
3d830459 2914static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, int fd,
7c9d8e07
FB
2915 int is_connected)
2916{
2917 NetSocketState *s;
2918 s = qemu_mallocz(sizeof(NetSocketState));
2919 if (!s)
2920 return NULL;
2921 s->fd = fd;
2922 s->vc = qemu_new_vlan_client(vlan,
d861b05e 2923 net_socket_receive, NULL, s);
7c9d8e07
FB
2924 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2925 "socket: fd=%d", fd);
2926 if (is_connected) {
2927 net_socket_connect(s);
2928 } else {
2929 qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
2930 }
2931 return s;
2932}
c4b1fcc0 2933
3d830459
FB
2934static NetSocketState *net_socket_fd_init(VLANState *vlan, int fd,
2935 int is_connected)
2936{
2937 int so_type=-1, optlen=sizeof(so_type);
2938
fd1dff4b 2939 if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type, &optlen)< 0) {
3d830459
FB
2940 fprintf(stderr, "qemu: error: setsockopt(SO_TYPE) for fd=%d failed\n", fd);
2941 return NULL;
2942 }
2943 switch(so_type) {
2944 case SOCK_DGRAM:
2945 return net_socket_fd_init_dgram(vlan, fd, is_connected);
2946 case SOCK_STREAM:
2947 return net_socket_fd_init_stream(vlan, fd, is_connected);
2948 default:
2949 /* who knows ... this could be a eg. a pty, do warn and continue as stream */
2950 fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
2951 return net_socket_fd_init_stream(vlan, fd, is_connected);
2952 }
2953 return NULL;
2954}
2955
7c9d8e07
FB
2956static void net_socket_accept(void *opaque)
2957{
2958 NetSocketListenState *s = opaque;
2959 NetSocketState *s1;
2960 struct sockaddr_in saddr;
2961 socklen_t len;
2962 int fd;
2963
2964 for(;;) {
2965 len = sizeof(saddr);
2966 fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
2967 if (fd < 0 && errno != EINTR) {
2968 return;
2969 } else if (fd >= 0) {
2970 break;
80cabfad 2971 }
330d0414 2972 }
7c9d8e07
FB
2973 s1 = net_socket_fd_init(s->vlan, fd, 1);
2974 if (!s1) {
2975 close(fd);
2976 } else {
2977 snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
2978 "socket: connection from %s:%d",
2979 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2980 }
2981}
2982
2983static int net_socket_listen_init(VLANState *vlan, const char *host_str)
2984{
2985 NetSocketListenState *s;
2986 int fd, val, ret;
2987 struct sockaddr_in saddr;
2988
2989 if (parse_host_port(&saddr, host_str) < 0)
2990 return -1;
2991
2992 s = qemu_mallocz(sizeof(NetSocketListenState));
2993 if (!s)
2994 return -1;
2995
2996 fd = socket(PF_INET, SOCK_STREAM, 0);
2997 if (fd < 0) {
2998 perror("socket");
2999 return -1;
3000 }
fd1dff4b 3001 socket_set_nonblock(fd);
7c9d8e07
FB
3002
3003 /* allow fast reuse */
3004 val = 1;
fd1dff4b 3005 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
7c9d8e07
FB
3006
3007 ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
3008 if (ret < 0) {
3009 perror("bind");
3010 return -1;
3011 }
3012 ret = listen(fd, 0);
3013 if (ret < 0) {
3014 perror("listen");
3015 return -1;
3016 }
3017 s->vlan = vlan;
3018 s->fd = fd;
3019 qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
80cabfad 3020 return 0;
330d0414
FB
3021}
3022
7c9d8e07 3023static int net_socket_connect_init(VLANState *vlan, const char *host_str)
330d0414 3024{
7c9d8e07 3025 NetSocketState *s;
fd1dff4b 3026 int fd, connected, ret, err;
7c9d8e07
FB
3027 struct sockaddr_in saddr;
3028
3029 if (parse_host_port(&saddr, host_str) < 0)
3030 return -1;
3031
3032 fd = socket(PF_INET, SOCK_STREAM, 0);
3033 if (fd < 0) {
3034 perror("socket");
3035 return -1;
3036 }
fd1dff4b 3037 socket_set_nonblock(fd);
7c9d8e07
FB
3038
3039 connected = 0;
3040 for(;;) {
3041 ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
3042 if (ret < 0) {
fd1dff4b
FB
3043 err = socket_error();
3044 if (err == EINTR || err == EWOULDBLOCK) {
3045 } else if (err == EINPROGRESS) {
7c9d8e07
FB
3046 break;
3047 } else {
3048 perror("connect");
fd1dff4b 3049 closesocket(fd);
7c9d8e07
FB
3050 return -1;
3051 }
3052 } else {
3053 connected = 1;
3054 break;
3055 }
3056 }
3057 s = net_socket_fd_init(vlan, fd, connected);
3058 if (!s)
3059 return -1;
3060 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
3061 "socket: connect to %s:%d",
3062 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
c20709aa 3063 return 0;
80cabfad 3064}
330d0414 3065
3d830459
FB
3066static int net_socket_mcast_init(VLANState *vlan, const char *host_str)
3067{
3068 NetSocketState *s;
3069 int fd;
3070 struct sockaddr_in saddr;
3071
3072 if (parse_host_port(&saddr, host_str) < 0)
3073 return -1;
3074
3075
3076 fd = net_socket_mcast_create(&saddr);
3077 if (fd < 0)
3078 return -1;
3079
3080 s = net_socket_fd_init(vlan, fd, 0);
3081 if (!s)
3082 return -1;
3083
3084 s->dgram_dst = saddr;
3085
3086 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
3087 "socket: mcast=%s:%d",
3088 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
3089 return 0;
3090
3091}
3092
7c9d8e07
FB
3093static int get_param_value(char *buf, int buf_size,
3094 const char *tag, const char *str)
3095{
3096 const char *p;
3097 char *q;
3098 char option[128];
3099
3100 p = str;
3101 for(;;) {
3102 q = option;
3103 while (*p != '\0' && *p != '=') {
3104 if ((q - option) < sizeof(option) - 1)
3105 *q++ = *p;
3106 p++;
3107 }
3108 *q = '\0';
3109 if (*p != '=')
3110 break;
3111 p++;
3112 if (!strcmp(tag, option)) {
3113 q = buf;
3114 while (*p != '\0' && *p != ',') {
3115 if ((q - buf) < buf_size - 1)
3116 *q++ = *p;
3117 p++;
3118 }
3119 *q = '\0';
3120 return q - buf;
3121 } else {
3122 while (*p != '\0' && *p != ',') {
3123 p++;
3124 }
3125 }
3126 if (*p != ',')
3127 break;
3128 p++;
3129 }
3130 return 0;
3131}
3132
3133int net_client_init(const char *str)
3134{
3135 const char *p;
3136 char *q;
3137 char device[64];
3138 char buf[1024];
3139 int vlan_id, ret;
3140 VLANState *vlan;
3141
3142 p = str;
3143 q = device;
3144 while (*p != '\0' && *p != ',') {
3145 if ((q - device) < sizeof(device) - 1)
3146 *q++ = *p;
3147 p++;
3148 }
3149 *q = '\0';
3150 if (*p == ',')
3151 p++;
3152 vlan_id = 0;
3153 if (get_param_value(buf, sizeof(buf), "vlan", p)) {
3154 vlan_id = strtol(buf, NULL, 0);
3155 }
3156 vlan = qemu_find_vlan(vlan_id);
3157 if (!vlan) {
3158 fprintf(stderr, "Could not create vlan %d\n", vlan_id);
3159 return -1;
3160 }
3161 if (!strcmp(device, "nic")) {
3162 NICInfo *nd;
3163 uint8_t *macaddr;
3164
3165 if (nb_nics >= MAX_NICS) {
3166 fprintf(stderr, "Too Many NICs\n");
3167 return -1;
3168 }
3169 nd = &nd_table[nb_nics];
3170 macaddr = nd->macaddr;
3171 macaddr[0] = 0x52;
3172 macaddr[1] = 0x54;
3173 macaddr[2] = 0x00;
3174 macaddr[3] = 0x12;
3175 macaddr[4] = 0x34;
3176 macaddr[5] = 0x56 + nb_nics;
3177
3178 if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
3179 if (parse_macaddr(macaddr, buf) < 0) {
3180 fprintf(stderr, "invalid syntax for ethernet address\n");
3181 return -1;
3182 }
3183 }
a41b2ff2
PB
3184 if (get_param_value(buf, sizeof(buf), "model", p)) {
3185 nd->model = strdup(buf);
3186 }
7c9d8e07
FB
3187 nd->vlan = vlan;
3188 nb_nics++;
3189 ret = 0;
3190 } else
3191 if (!strcmp(device, "none")) {
3192 /* does nothing. It is needed to signal that no network cards
3193 are wanted */
3194 ret = 0;
3195 } else
3196#ifdef CONFIG_SLIRP
3197 if (!strcmp(device, "user")) {
115defd1 3198 if (get_param_value(buf, sizeof(buf), "hostname", p)) {
3f423c9c 3199 pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf);
115defd1 3200 }
7c9d8e07
FB
3201 ret = net_slirp_init(vlan);
3202 } else
3203#endif
7fb843f8
FB
3204#ifdef _WIN32
3205 if (!strcmp(device, "tap")) {
3206 char ifname[64];
3207 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
3208 fprintf(stderr, "tap: no interface name\n");
3209 return -1;
3210 }
3211 ret = tap_win32_init(vlan, ifname);
3212 } else
3213#else
7c9d8e07
FB
3214 if (!strcmp(device, "tap")) {
3215 char ifname[64];
3216 char setup_script[1024];
3217 int fd;
3218 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
3219 fd = strtol(buf, NULL, 0);
3220 ret = -1;
3221 if (net_tap_fd_init(vlan, fd))
3222 ret = 0;
3223 } else {
3224 get_param_value(ifname, sizeof(ifname), "ifname", p);
3225 if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
3226 pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
3227 }
3228 ret = net_tap_init(vlan, ifname, setup_script);
3229 }
3230 } else
fd1dff4b 3231#endif
7c9d8e07
FB
3232 if (!strcmp(device, "socket")) {
3233 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
3234 int fd;
3235 fd = strtol(buf, NULL, 0);
3236 ret = -1;
3237 if (net_socket_fd_init(vlan, fd, 1))
3238 ret = 0;
3239 } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
3240 ret = net_socket_listen_init(vlan, buf);
3241 } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
3242 ret = net_socket_connect_init(vlan, buf);
3d830459
FB
3243 } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
3244 ret = net_socket_mcast_init(vlan, buf);
7c9d8e07
FB
3245 } else {
3246 fprintf(stderr, "Unknown socket options: %s\n", p);
3247 return -1;
3248 }
3249 } else
7c9d8e07
FB
3250 {
3251 fprintf(stderr, "Unknown network device: %s\n", device);
3252 return -1;
3253 }
3254 if (ret < 0) {
3255 fprintf(stderr, "Could not initialize device '%s'\n", device);
3256 }
3257
3258 return ret;
3259}
3260
3261void do_info_network(void)
3262{
3263 VLANState *vlan;
3264 VLANClientState *vc;
3265
3266 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
3267 term_printf("VLAN %d devices:\n", vlan->id);
3268 for(vc = vlan->first_client; vc != NULL; vc = vc->next)
3269 term_printf(" %s\n", vc->info_str);
3270 }
3271}
3272
a594cfbf
FB
3273/***********************************************************/
3274/* USB devices */
3275
0d92ed30
PB
3276static USBPort *used_usb_ports;
3277static USBPort *free_usb_ports;
3278
3279/* ??? Maybe change this to register a hub to keep track of the topology. */
3280void qemu_register_usb_port(USBPort *port, void *opaque, int index,
3281 usb_attachfn attach)
3282{
3283 port->opaque = opaque;
3284 port->index = index;
3285 port->attach = attach;
3286 port->next = free_usb_ports;
3287 free_usb_ports = port;
3288}
3289
a594cfbf
FB
3290static int usb_device_add(const char *devname)
3291{
3292 const char *p;
3293 USBDevice *dev;
0d92ed30 3294 USBPort *port;
a594cfbf 3295
0d92ed30 3296 if (!free_usb_ports)
a594cfbf
FB
3297 return -1;
3298
3299 if (strstart(devname, "host:", &p)) {
3300 dev = usb_host_device_open(p);
a594cfbf
FB
3301 } else if (!strcmp(devname, "mouse")) {
3302 dev = usb_mouse_init();
09b26c5e
FB
3303 } else if (!strcmp(devname, "tablet")) {
3304 dev = usb_tablet_init();
2e5d83bb
PB
3305 } else if (strstart(devname, "disk:", &p)) {
3306 dev = usb_msd_init(p);
a594cfbf
FB
3307 } else {
3308 return -1;
3309 }
0d92ed30
PB
3310 if (!dev)
3311 return -1;
3312
3313 /* Find a USB port to add the device to. */
3314 port = free_usb_ports;
3315 if (!port->next) {
3316 USBDevice *hub;
3317
3318 /* Create a new hub and chain it on. */
3319 free_usb_ports = NULL;
3320 port->next = used_usb_ports;
3321 used_usb_ports = port;
3322
3323 hub = usb_hub_init(VM_USB_HUB_SIZE);
3324 usb_attach(port, hub);
3325 port = free_usb_ports;
3326 }
3327
3328 free_usb_ports = port->next;
3329 port->next = used_usb_ports;
3330 used_usb_ports = port;
3331 usb_attach(port, dev);
a594cfbf
FB
3332 return 0;
3333}
3334
3335static int usb_device_del(const char *devname)
3336{
0d92ed30
PB
3337 USBPort *port;
3338 USBPort **lastp;
3339 int bus_num, addr;
a594cfbf
FB
3340 const char *p;
3341
0d92ed30 3342 if (!used_usb_ports)
a594cfbf
FB
3343 return -1;
3344
3345 p = strchr(devname, '.');
3346 if (!p)
3347 return -1;
3348 bus_num = strtoul(devname, NULL, 0);
3349 addr = strtoul(p + 1, NULL, 0);
3350 if (bus_num != 0)
3351 return -1;
0d92ed30
PB
3352
3353 lastp = &used_usb_ports;
3354 port = used_usb_ports;
3355 while (port && port->dev->addr != addr) {
3356 lastp = &port->next;
3357 port = port->next;
a594cfbf 3358 }
0d92ed30
PB
3359
3360 if (!port)
a594cfbf 3361 return -1;
0d92ed30
PB
3362
3363 *lastp = port->next;
3364 usb_attach(port, NULL);
3365 port->next = free_usb_ports;
3366 free_usb_ports = port;
a594cfbf
FB
3367 return 0;
3368}
3369
3370void do_usb_add(const char *devname)
3371{
3372 int ret;
3373 ret = usb_device_add(devname);
3374 if (ret < 0)
3375 term_printf("Could not add USB device '%s'\n", devname);
3376}
3377
3378void do_usb_del(const char *devname)
3379{
3380 int ret;
3381 ret = usb_device_del(devname);
3382 if (ret < 0)
3383 term_printf("Could not remove USB device '%s'\n", devname);
3384}
3385
3386void usb_info(void)
3387{
3388 USBDevice *dev;
0d92ed30 3389 USBPort *port;
a594cfbf
FB
3390 const char *speed_str;
3391
0d92ed30 3392 if (!usb_enabled) {
a594cfbf
FB
3393 term_printf("USB support not enabled\n");
3394 return;
3395 }
3396
0d92ed30
PB
3397 for (port = used_usb_ports; port; port = port->next) {
3398 dev = port->dev;
3399 if (!dev)
3400 continue;
3401 switch(dev->speed) {
3402 case USB_SPEED_LOW:
3403 speed_str = "1.5";
3404 break;
3405 case USB_SPEED_FULL:
3406 speed_str = "12";
3407 break;
3408 case USB_SPEED_HIGH:
3409 speed_str = "480";
3410 break;
3411 default:
3412 speed_str = "?";
3413 break;
a594cfbf 3414 }
0d92ed30
PB
3415 term_printf(" Device %d.%d, speed %s Mb/s\n",
3416 0, dev->addr, speed_str);
a594cfbf
FB
3417 }
3418}
3419
f7cce898
FB
3420/***********************************************************/
3421/* pid file */
3422
3423static char *pid_filename;
3424
3425/* Remove PID file. Called on normal exit */
3426
3427static void remove_pidfile(void)
3428{
3429 unlink (pid_filename);
3430}
3431
3432static void create_pidfile(const char *filename)
3433{
3434 struct stat pidstat;
3435 FILE *f;
3436
3437 /* Try to write our PID to the named file */
3438 if (stat(filename, &pidstat) < 0) {
3439 if (errno == ENOENT) {
3440 if ((f = fopen (filename, "w")) == NULL) {
3441 perror("Opening pidfile");
3442 exit(1);
3443 }
3444 fprintf(f, "%d\n", getpid());
3445 fclose(f);
3446 pid_filename = qemu_strdup(filename);
3447 if (!pid_filename) {
3448 fprintf(stderr, "Could not save PID filename");
3449 exit(1);
3450 }
3451 atexit(remove_pidfile);
3452 }
3453 } else {
3454 fprintf(stderr, "%s already exists. Remove it and try again.\n",
3455 filename);
3456 exit(1);
3457 }
3458}
3459
313aa567
FB
3460/***********************************************************/
3461/* dumb display */
3462
313aa567
FB
3463static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
3464{
3465}
3466
3467static void dumb_resize(DisplayState *ds, int w, int h)
3468{
3469}
3470
3471static void dumb_refresh(DisplayState *ds)
3472{
95219897 3473 vga_hw_update();
313aa567
FB
3474}
3475
3476void dumb_display_init(DisplayState *ds)
3477{
3478 ds->data = NULL;
3479 ds->linesize = 0;
3480 ds->depth = 0;
3481 ds->dpy_update = dumb_update;
3482 ds->dpy_resize = dumb_resize;
3483 ds->dpy_refresh = dumb_refresh;
3484}
3485
3a51dee6 3486#if !defined(CONFIG_SOFTMMU)
f1510b2c 3487/***********************************************************/
0824d6fc
FB
3488/* cpu signal handler */
3489static void host_segv_handler(int host_signum, siginfo_t *info,
3490 void *puc)
3491{
3492 if (cpu_signal_handler(host_signum, info, puc))
3493 return;
8d11df9e
FB
3494 if (stdio_nb_clients > 0)
3495 term_exit();
0824d6fc
FB
3496 abort();
3497}
3a51dee6 3498#endif
0824d6fc 3499
8a7ddc38
FB
3500/***********************************************************/
3501/* I/O handling */
0824d6fc 3502
c4b1fcc0
FB
3503#define MAX_IO_HANDLERS 64
3504
3505typedef struct IOHandlerRecord {
3506 int fd;
7c9d8e07
FB
3507 IOCanRWHandler *fd_read_poll;
3508 IOHandler *fd_read;
3509 IOHandler *fd_write;
c4b1fcc0
FB
3510 void *opaque;
3511 /* temporary data */
3512 struct pollfd *ufd;
8a7ddc38 3513 struct IOHandlerRecord *next;
c4b1fcc0
FB
3514} IOHandlerRecord;
3515
8a7ddc38 3516static IOHandlerRecord *first_io_handler;
c4b1fcc0 3517
7c9d8e07
FB
3518/* XXX: fd_read_poll should be suppressed, but an API change is
3519 necessary in the character devices to suppress fd_can_read(). */
3520int qemu_set_fd_handler2(int fd,
3521 IOCanRWHandler *fd_read_poll,
3522 IOHandler *fd_read,
3523 IOHandler *fd_write,
3524 void *opaque)
c4b1fcc0 3525{
7c9d8e07 3526 IOHandlerRecord **pioh, *ioh;
c4b1fcc0 3527
7c9d8e07
FB
3528 if (!fd_read && !fd_write) {
3529 pioh = &first_io_handler;
3530 for(;;) {
3531 ioh = *pioh;
3532 if (ioh == NULL)
3533 break;
3534 if (ioh->fd == fd) {
3535 *pioh = ioh->next;
fd1dff4b 3536 qemu_free(ioh);
7c9d8e07
FB
3537 break;
3538 }
3539 pioh = &ioh->next;
3540 }
3541 } else {
3542 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
3543 if (ioh->fd == fd)
3544 goto found;
3545 }
3546 ioh = qemu_mallocz(sizeof(IOHandlerRecord));
3547 if (!ioh)
3548 return -1;
3549 ioh->next = first_io_handler;
3550 first_io_handler = ioh;
3551 found:
3552 ioh->fd = fd;
3553 ioh->fd_read_poll = fd_read_poll;
3554 ioh->fd_read = fd_read;
3555 ioh->fd_write = fd_write;
3556 ioh->opaque = opaque;
3557 }
c4b1fcc0
FB
3558 return 0;
3559}
3560
7c9d8e07
FB
3561int qemu_set_fd_handler(int fd,
3562 IOHandler *fd_read,
3563 IOHandler *fd_write,
3564 void *opaque)
8a7ddc38 3565{
7c9d8e07 3566 return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
8a7ddc38
FB
3567}
3568
f331110f
FB
3569/***********************************************************/
3570/* Polling handling */
3571
3572typedef struct PollingEntry {
3573 PollingFunc *func;
3574 void *opaque;
3575 struct PollingEntry *next;
3576} PollingEntry;
3577
3578static PollingEntry *first_polling_entry;
3579
3580int qemu_add_polling_cb(PollingFunc *func, void *opaque)
3581{
3582 PollingEntry **ppe, *pe;
3583 pe = qemu_mallocz(sizeof(PollingEntry));
3584 if (!pe)
3585 return -1;
3586 pe->func = func;
3587 pe->opaque = opaque;
3588 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
3589 *ppe = pe;
3590 return 0;
3591}
3592
3593void qemu_del_polling_cb(PollingFunc *func, void *opaque)
3594{
3595 PollingEntry **ppe, *pe;
3596 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
3597 pe = *ppe;
3598 if (pe->func == func && pe->opaque == opaque) {
3599 *ppe = pe->next;
3600 qemu_free(pe);
3601 break;
3602 }
3603 }
3604}
3605
8a7ddc38
FB
3606/***********************************************************/
3607/* savevm/loadvm support */
3608
3609void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
b4608c04 3610{
8a7ddc38 3611 fwrite(buf, 1, size, f);
b4608c04
FB
3612}
3613
8a7ddc38 3614void qemu_put_byte(QEMUFile *f, int v)
b4608c04 3615{
8a7ddc38
FB
3616 fputc(v, f);
3617}
3618
3619void qemu_put_be16(QEMUFile *f, unsigned int v)
3620{
3621 qemu_put_byte(f, v >> 8);
3622 qemu_put_byte(f, v);
3623}
3624
3625void qemu_put_be32(QEMUFile *f, unsigned int v)
3626{
3627 qemu_put_byte(f, v >> 24);
3628 qemu_put_byte(f, v >> 16);
3629 qemu_put_byte(f, v >> 8);
3630 qemu_put_byte(f, v);
3631}
3632
3633void qemu_put_be64(QEMUFile *f, uint64_t v)
3634{
3635 qemu_put_be32(f, v >> 32);
3636 qemu_put_be32(f, v);
3637}
3638
3639int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size)
3640{
3641 return fread(buf, 1, size, f);
3642}
3643
3644int qemu_get_byte(QEMUFile *f)
3645{
3646 int v;
3647 v = fgetc(f);
3648 if (v == EOF)
3649 return 0;
3650 else
3651 return v;
3652}
3653
3654unsigned int qemu_get_be16(QEMUFile *f)
3655{
3656 unsigned int v;
3657 v = qemu_get_byte(f) << 8;
3658 v |= qemu_get_byte(f);
3659 return v;
3660}
3661
3662unsigned int qemu_get_be32(QEMUFile *f)
3663{
3664 unsigned int v;
3665 v = qemu_get_byte(f) << 24;
3666 v |= qemu_get_byte(f) << 16;
3667 v |= qemu_get_byte(f) << 8;
3668 v |= qemu_get_byte(f);
3669 return v;
3670}
3671
3672uint64_t qemu_get_be64(QEMUFile *f)
3673{
3674 uint64_t v;
3675 v = (uint64_t)qemu_get_be32(f) << 32;
3676 v |= qemu_get_be32(f);
3677 return v;
3678}
3679
3680int64_t qemu_ftell(QEMUFile *f)
3681{
3682 return ftell(f);
3683}
3684
3685int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
3686{
3687 if (fseek(f, pos, whence) < 0)
3688 return -1;
3689 return ftell(f);
3690}
3691
3692typedef struct SaveStateEntry {
3693 char idstr[256];
3694 int instance_id;
3695 int version_id;
3696 SaveStateHandler *save_state;
3697 LoadStateHandler *load_state;
3698 void *opaque;
3699 struct SaveStateEntry *next;
3700} SaveStateEntry;
b4608c04 3701
8a7ddc38
FB
3702static SaveStateEntry *first_se;
3703
3704int register_savevm(const char *idstr,
3705 int instance_id,
3706 int version_id,
3707 SaveStateHandler *save_state,
3708 LoadStateHandler *load_state,
3709 void *opaque)
3710{
3711 SaveStateEntry *se, **pse;
3712
3713 se = qemu_malloc(sizeof(SaveStateEntry));
3714 if (!se)
3715 return -1;
3716 pstrcpy(se->idstr, sizeof(se->idstr), idstr);
3717 se->instance_id = instance_id;
3718 se->version_id = version_id;
3719 se->save_state = save_state;
3720 se->load_state = load_state;
3721 se->opaque = opaque;
3722 se->next = NULL;
3723
3724 /* add at the end of list */
3725 pse = &first_se;
3726 while (*pse != NULL)
3727 pse = &(*pse)->next;
3728 *pse = se;
3729 return 0;
3730}
3731
3732#define QEMU_VM_FILE_MAGIC 0x5145564d
3733#define QEMU_VM_FILE_VERSION 0x00000001
3734
3735int qemu_savevm(const char *filename)
3736{
3737 SaveStateEntry *se;
3738 QEMUFile *f;
3739 int len, len_pos, cur_pos, saved_vm_running, ret;
3740
3741 saved_vm_running = vm_running;
3742 vm_stop(0);
3743
3744 f = fopen(filename, "wb");
3745 if (!f) {
3746 ret = -1;
3747 goto the_end;
313aa567
FB
3748 }
3749
8a7ddc38
FB
3750 qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
3751 qemu_put_be32(f, QEMU_VM_FILE_VERSION);
3752
3753 for(se = first_se; se != NULL; se = se->next) {
3754 /* ID string */
3755 len = strlen(se->idstr);
3756 qemu_put_byte(f, len);
3757 qemu_put_buffer(f, se->idstr, len);
3758
3759 qemu_put_be32(f, se->instance_id);
3760 qemu_put_be32(f, se->version_id);
3761
3762 /* record size: filled later */
3763 len_pos = ftell(f);
3764 qemu_put_be32(f, 0);
3765
3766 se->save_state(f, se->opaque);
3767
3768 /* fill record size */
3769 cur_pos = ftell(f);
3770 len = ftell(f) - len_pos - 4;
3771 fseek(f, len_pos, SEEK_SET);
3772 qemu_put_be32(f, len);
3773 fseek(f, cur_pos, SEEK_SET);
3774 }
3775
3776 fclose(f);
3777 ret = 0;
3778 the_end:
3779 if (saved_vm_running)
3780 vm_start();
3781 return ret;
3782}
3783
3784static SaveStateEntry *find_se(const char *idstr, int instance_id)
3785{
3786 SaveStateEntry *se;
3787
3788 for(se = first_se; se != NULL; se = se->next) {
3789 if (!strcmp(se->idstr, idstr) &&
3790 instance_id == se->instance_id)
3791 return se;
3792 }
3793 return NULL;
3794}
3795
3796int qemu_loadvm(const char *filename)
3797{
3798 SaveStateEntry *se;
3799 QEMUFile *f;
3800 int len, cur_pos, ret, instance_id, record_len, version_id;
3801 int saved_vm_running;
3802 unsigned int v;
3803 char idstr[256];
3804
3805 saved_vm_running = vm_running;
3806 vm_stop(0);
3807
3808 f = fopen(filename, "rb");
3809 if (!f) {
3810 ret = -1;
3811 goto the_end;
3812 }
3813
3814 v = qemu_get_be32(f);
3815 if (v != QEMU_VM_FILE_MAGIC)
3816 goto fail;
3817 v = qemu_get_be32(f);
3818 if (v != QEMU_VM_FILE_VERSION) {
3819 fail:
3820 fclose(f);
3821 ret = -1;
3822 goto the_end;
3823 }
b4608c04 3824 for(;;) {
8a7ddc38
FB
3825 len = qemu_get_byte(f);
3826 if (feof(f))
cd4c3e88 3827 break;
8a7ddc38
FB
3828 qemu_get_buffer(f, idstr, len);
3829 idstr[len] = '\0';
3830 instance_id = qemu_get_be32(f);
3831 version_id = qemu_get_be32(f);
3832 record_len = qemu_get_be32(f);
3833#if 0
3834 printf("idstr=%s instance=0x%x version=%d len=%d\n",
3835 idstr, instance_id, version_id, record_len);
3836#endif
3837 cur_pos = ftell(f);
3838 se = find_se(idstr, instance_id);
3839 if (!se) {
3840 fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n",
3841 instance_id, idstr);
3842 } else {
3843 ret = se->load_state(f, se->opaque, version_id);
3844 if (ret < 0) {
3845 fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
3846 instance_id, idstr);
3847 }
34865134 3848 }
8a7ddc38
FB
3849 /* always seek to exact end of record */
3850 qemu_fseek(f, cur_pos + record_len, SEEK_SET);
3851 }
3852 fclose(f);
3853 ret = 0;
3854 the_end:
3855 if (saved_vm_running)
3856 vm_start();
3857 return ret;
3858}
3859
3860/***********************************************************/
3861/* cpu save/restore */
3862
3863#if defined(TARGET_I386)
3864
3865static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
3866{
02ba45c5 3867 qemu_put_be32(f, dt->selector);
20f32282 3868 qemu_put_betl(f, dt->base);
8a7ddc38
FB
3869 qemu_put_be32(f, dt->limit);
3870 qemu_put_be32(f, dt->flags);
3871}
3872
3873static void cpu_get_seg(QEMUFile *f, SegmentCache *dt)
3874{
02ba45c5 3875 dt->selector = qemu_get_be32(f);
20f32282 3876 dt->base = qemu_get_betl(f);
8a7ddc38
FB
3877 dt->limit = qemu_get_be32(f);
3878 dt->flags = qemu_get_be32(f);
3879}
3880
3881void cpu_save(QEMUFile *f, void *opaque)
3882{
3883 CPUState *env = opaque;
664e0f19 3884 uint16_t fptag, fpus, fpuc, fpregs_format;
8a7ddc38
FB
3885 uint32_t hflags;
3886 int i;
664e0f19 3887
20f32282
FB
3888 for(i = 0; i < CPU_NB_REGS; i++)
3889 qemu_put_betls(f, &env->regs[i]);
3890 qemu_put_betls(f, &env->eip);
3891 qemu_put_betls(f, &env->eflags);
8a7ddc38
FB
3892 hflags = env->hflags; /* XXX: suppress most of the redundant hflags */
3893 qemu_put_be32s(f, &hflags);
3894
3895 /* FPU */
3896 fpuc = env->fpuc;
3897 fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
3898 fptag = 0;
664e0f19
FB
3899 for(i = 0; i < 8; i++) {
3900 fptag |= ((!env->fptags[i]) << i);
8a7ddc38
FB
3901 }
3902
3903 qemu_put_be16s(f, &fpuc);
3904 qemu_put_be16s(f, &fpus);
3905 qemu_put_be16s(f, &fptag);
3906
664e0f19
FB
3907#ifdef USE_X86LDOUBLE
3908 fpregs_format = 0;
3909#else
3910 fpregs_format = 1;
3911#endif
3912 qemu_put_be16s(f, &fpregs_format);
3913
8a7ddc38 3914 for(i = 0; i < 8; i++) {
664e0f19 3915#ifdef USE_X86LDOUBLE
8636b5d8
FB
3916 {
3917 uint64_t mant;
3918 uint16_t exp;
3919 /* we save the real CPU data (in case of MMX usage only 'mant'
3920 contains the MMX register */
3921 cpu_get_fp80(&mant, &exp, env->fpregs[i].d);
3922 qemu_put_be64(f, mant);
3923 qemu_put_be16(f, exp);
3924 }
664e0f19
FB
3925#else
3926 /* if we use doubles for float emulation, we save the doubles to
3927 avoid losing information in case of MMX usage. It can give
3928 problems if the image is restored on a CPU where long
3929 doubles are used instead. */
8636b5d8 3930 qemu_put_be64(f, env->fpregs[i].mmx.MMX_Q(0));
664e0f19 3931#endif
8a7ddc38
FB
3932 }
3933
3934 for(i = 0; i < 6; i++)
3935 cpu_put_seg(f, &env->segs[i]);
3936 cpu_put_seg(f, &env->ldt);
3937 cpu_put_seg(f, &env->tr);
3938 cpu_put_seg(f, &env->gdt);
3939 cpu_put_seg(f, &env->idt);
3940
3941 qemu_put_be32s(f, &env->sysenter_cs);
3942 qemu_put_be32s(f, &env->sysenter_esp);
3943 qemu_put_be32s(f, &env->sysenter_eip);
3944
20f32282
FB
3945 qemu_put_betls(f, &env->cr[0]);
3946 qemu_put_betls(f, &env->cr[2]);
3947 qemu_put_betls(f, &env->cr[3]);
3948 qemu_put_betls(f, &env->cr[4]);
8a7ddc38
FB
3949
3950 for(i = 0; i < 8; i++)
20f32282 3951 qemu_put_betls(f, &env->dr[i]);
8a7ddc38
FB
3952
3953 /* MMU */
3954 qemu_put_be32s(f, &env->a20_mask);
02536f8b 3955
664e0f19
FB
3956 /* XMM */
3957 qemu_put_be32s(f, &env->mxcsr);
02536f8b
FB
3958 for(i = 0; i < CPU_NB_REGS; i++) {
3959 qemu_put_be64s(f, &env->xmm_regs[i].XMM_Q(0));
3960 qemu_put_be64s(f, &env->xmm_regs[i].XMM_Q(1));
3961 }
3962
664e0f19 3963#ifdef TARGET_X86_64
02536f8b
FB
3964 qemu_put_be64s(f, &env->efer);
3965 qemu_put_be64s(f, &env->star);
3966 qemu_put_be64s(f, &env->lstar);
3967 qemu_put_be64s(f, &env->cstar);
3968 qemu_put_be64s(f, &env->fmask);
3969 qemu_put_be64s(f, &env->kernelgsbase);
3970#endif
8a7ddc38
FB
3971}
3972
8636b5d8 3973#ifdef USE_X86LDOUBLE
664e0f19
FB
3974/* XXX: add that in a FPU generic layer */
3975union x86_longdouble {
3976 uint64_t mant;
3977 uint16_t exp;
3978};
3979
3980#define MANTD1(fp) (fp & ((1LL << 52) - 1))
3981#define EXPBIAS1 1023
3982#define EXPD1(fp) ((fp >> 52) & 0x7FF)
3983#define SIGND1(fp) ((fp >> 32) & 0x80000000)
3984
3985static void fp64_to_fp80(union x86_longdouble *p, uint64_t temp)
3986{
3987 int e;
3988 /* mantissa */
3989 p->mant = (MANTD1(temp) << 11) | (1LL << 63);
3990 /* exponent + sign */
3991 e = EXPD1(temp) - EXPBIAS1 + 16383;
3992 e |= SIGND1(temp) >> 16;
3993 p->exp = e;
3994}
8636b5d8 3995#endif
664e0f19 3996
8a7ddc38
FB
3997int cpu_load(QEMUFile *f, void *opaque, int version_id)
3998{
3999 CPUState *env = opaque;
664e0f19 4000 int i, guess_mmx;
8a7ddc38 4001 uint32_t hflags;
664e0f19 4002 uint16_t fpus, fpuc, fptag, fpregs_format;
8a7ddc38 4003
664e0f19 4004 if (version_id != 3)
8a7ddc38 4005 return -EINVAL;
20f32282
FB
4006 for(i = 0; i < CPU_NB_REGS; i++)
4007 qemu_get_betls(f, &env->regs[i]);
4008 qemu_get_betls(f, &env->eip);
4009 qemu_get_betls(f, &env->eflags);
8a7ddc38
FB
4010 qemu_get_be32s(f, &hflags);
4011
4012 qemu_get_be16s(f, &fpuc);
4013 qemu_get_be16s(f, &fpus);
4014 qemu_get_be16s(f, &fptag);
664e0f19
FB
4015 qemu_get_be16s(f, &fpregs_format);
4016
4017 /* NOTE: we cannot always restore the FPU state if the image come
4018 from a host with a different 'USE_X86LDOUBLE' define. We guess
4019 if we are in an MMX state to restore correctly in that case. */
4020 guess_mmx = ((fptag == 0xff) && (fpus & 0x3800) == 0);
8a7ddc38
FB
4021 for(i = 0; i < 8; i++) {
4022 uint64_t mant;
4023 uint16_t exp;
664e0f19
FB
4024
4025 switch(fpregs_format) {
4026 case 0:
4027 mant = qemu_get_be64(f);
4028 exp = qemu_get_be16(f);
4029#ifdef USE_X86LDOUBLE
4030 env->fpregs[i].d = cpu_set_fp80(mant, exp);
4031#else
4032 /* difficult case */
4033 if (guess_mmx)
8636b5d8 4034 env->fpregs[i].mmx.MMX_Q(0) = mant;
664e0f19
FB
4035 else
4036 env->fpregs[i].d = cpu_set_fp80(mant, exp);
4037#endif
4038 break;
4039 case 1:
4040 mant = qemu_get_be64(f);
4041#ifdef USE_X86LDOUBLE
8636b5d8
FB
4042 {
4043 union x86_longdouble *p;
4044 /* difficult case */
4045 p = (void *)&env->fpregs[i];
4046 if (guess_mmx) {
4047 p->mant = mant;
4048 p->exp = 0xffff;
4049 } else {
4050 fp64_to_fp80(p, mant);
4051 }
664e0f19
FB
4052 }
4053#else
8636b5d8 4054 env->fpregs[i].mmx.MMX_Q(0) = mant;
664e0f19
FB
4055#endif
4056 break;
4057 default:
4058 return -EINVAL;
4059 }
8a7ddc38
FB
4060 }
4061
4062 env->fpuc = fpuc;
7a0e1f41 4063 /* XXX: restore FPU round state */
8a7ddc38
FB
4064 env->fpstt = (fpus >> 11) & 7;
4065 env->fpus = fpus & ~0x3800;
664e0f19 4066 fptag ^= 0xff;
8a7ddc38 4067 for(i = 0; i < 8; i++) {
664e0f19 4068 env->fptags[i] = (fptag >> i) & 1;
8a7ddc38
FB
4069 }
4070
4071 for(i = 0; i < 6; i++)
4072 cpu_get_seg(f, &env->segs[i]);
4073 cpu_get_seg(f, &env->ldt);
4074 cpu_get_seg(f, &env->tr);
4075 cpu_get_seg(f, &env->gdt);
4076 cpu_get_seg(f, &env->idt);
4077
4078 qemu_get_be32s(f, &env->sysenter_cs);
4079 qemu_get_be32s(f, &env->sysenter_esp);
4080 qemu_get_be32s(f, &env->sysenter_eip);
4081
20f32282
FB
4082 qemu_get_betls(f, &env->cr[0]);
4083 qemu_get_betls(f, &env->cr[2]);
4084 qemu_get_betls(f, &env->cr[3]);
4085 qemu_get_betls(f, &env->cr[4]);
8a7ddc38
FB
4086
4087 for(i = 0; i < 8; i++)
20f32282 4088 qemu_get_betls(f, &env->dr[i]);
8a7ddc38
FB
4089
4090 /* MMU */
4091 qemu_get_be32s(f, &env->a20_mask);
4092
664e0f19 4093 qemu_get_be32s(f, &env->mxcsr);
02536f8b
FB
4094 for(i = 0; i < CPU_NB_REGS; i++) {
4095 qemu_get_be64s(f, &env->xmm_regs[i].XMM_Q(0));
4096 qemu_get_be64s(f, &env->xmm_regs[i].XMM_Q(1));
4097 }
4098
664e0f19 4099#ifdef TARGET_X86_64
02536f8b
FB
4100 qemu_get_be64s(f, &env->efer);
4101 qemu_get_be64s(f, &env->star);
4102 qemu_get_be64s(f, &env->lstar);
4103 qemu_get_be64s(f, &env->cstar);
4104 qemu_get_be64s(f, &env->fmask);
4105 qemu_get_be64s(f, &env->kernelgsbase);
4106#endif
4107
8a7ddc38
FB
4108 /* XXX: compute hflags from scratch, except for CPL and IIF */
4109 env->hflags = hflags;
4110 tlb_flush(env, 1);
4111 return 0;
4112}
4113
a541f297
FB
4114#elif defined(TARGET_PPC)
4115void cpu_save(QEMUFile *f, void *opaque)
4116{
4117}
4118
e95c8d51
FB
4119int cpu_load(QEMUFile *f, void *opaque, int version_id)
4120{
4121 return 0;
4122}
6af0bf9c
FB
4123
4124#elif defined(TARGET_MIPS)
4125void cpu_save(QEMUFile *f, void *opaque)
4126{
4127}
4128
4129int cpu_load(QEMUFile *f, void *opaque, int version_id)
4130{
4131 return 0;
4132}
4133
e95c8d51
FB
4134#elif defined(TARGET_SPARC)
4135void cpu_save(QEMUFile *f, void *opaque)
4136{
e80cfcfc
FB
4137 CPUState *env = opaque;
4138 int i;
4139 uint32_t tmp;
4140
4fa5d772
FB
4141 for(i = 0; i < 8; i++)
4142 qemu_put_betls(f, &env->gregs[i]);
4143 for(i = 0; i < NWINDOWS * 16; i++)
4144 qemu_put_betls(f, &env->regbase[i]);
e80cfcfc
FB
4145
4146 /* FPU */
4fa5d772
FB
4147 for(i = 0; i < TARGET_FPREGS; i++) {
4148 union {
4149 TARGET_FPREG_T f;
4150 target_ulong i;
4151 } u;
4152 u.f = env->fpr[i];
4153 qemu_put_betl(f, u.i);
4154 }
4155
4156 qemu_put_betls(f, &env->pc);
4157 qemu_put_betls(f, &env->npc);
4158 qemu_put_betls(f, &env->y);
e80cfcfc 4159 tmp = GET_PSR(env);
4fa5d772 4160 qemu_put_be32(f, tmp);
3475187d
FB
4161 qemu_put_betls(f, &env->fsr);
4162 qemu_put_betls(f, &env->tbr);
4163#ifndef TARGET_SPARC64
e80cfcfc 4164 qemu_put_be32s(f, &env->wim);
e80cfcfc
FB
4165 /* MMU */
4166 for(i = 0; i < 16; i++)
4167 qemu_put_be32s(f, &env->mmuregs[i]);
3475187d 4168#endif
e95c8d51
FB
4169}
4170
a541f297
FB
4171int cpu_load(QEMUFile *f, void *opaque, int version_id)
4172{
e80cfcfc
FB
4173 CPUState *env = opaque;
4174 int i;
4175 uint32_t tmp;
4176
4fa5d772
FB
4177 for(i = 0; i < 8; i++)
4178 qemu_get_betls(f, &env->gregs[i]);
4179 for(i = 0; i < NWINDOWS * 16; i++)
4180 qemu_get_betls(f, &env->regbase[i]);
e80cfcfc
FB
4181
4182 /* FPU */
4fa5d772
FB
4183 for(i = 0; i < TARGET_FPREGS; i++) {
4184 union {
4185 TARGET_FPREG_T f;
4186 target_ulong i;
4187 } u;
4188 u.i = qemu_get_betl(f);
4189 env->fpr[i] = u.f;
4190 }
4191
4192 qemu_get_betls(f, &env->pc);
4193 qemu_get_betls(f, &env->npc);
4194 qemu_get_betls(f, &env->y);
4195 tmp = qemu_get_be32(f);
4196 env->cwp = 0; /* needed to ensure that the wrapping registers are
4197 correctly updated */
e80cfcfc 4198 PUT_PSR(env, tmp);
3475187d
FB
4199 qemu_get_betls(f, &env->fsr);
4200 qemu_get_betls(f, &env->tbr);
4201#ifndef TARGET_SPARC64
e80cfcfc 4202 qemu_get_be32s(f, &env->wim);
e80cfcfc
FB
4203 /* MMU */
4204 for(i = 0; i < 16; i++)
4205 qemu_get_be32s(f, &env->mmuregs[i]);
3475187d 4206#endif
e80cfcfc 4207 tlb_flush(env, 1);
a541f297
FB
4208 return 0;
4209}
b5ff1b31
FB
4210
4211#elif defined(TARGET_ARM)
4212
4213/* ??? Need to implement these. */
4214void cpu_save(QEMUFile *f, void *opaque)
4215{
4216}
4217
4218int cpu_load(QEMUFile *f, void *opaque, int version_id)
4219{
4220 return 0;
4221}
4222
8a7ddc38
FB
4223#else
4224
4225#warning No CPU save/restore functions
4226
4227#endif
4228
4229/***********************************************************/
4230/* ram save/restore */
4231
4232/* we just avoid storing empty pages */
4233static void ram_put_page(QEMUFile *f, const uint8_t *buf, int len)
4234{
4235 int i, v;
4236
4237 v = buf[0];
4238 for(i = 1; i < len; i++) {
4239 if (buf[i] != v)
4240 goto normal_save;
4241 }
4242 qemu_put_byte(f, 1);
4243 qemu_put_byte(f, v);
4244 return;
4245 normal_save:
4246 qemu_put_byte(f, 0);
4247 qemu_put_buffer(f, buf, len);
4248}
4249
4250static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
4251{
4252 int v;
4253
4254 v = qemu_get_byte(f);
4255 switch(v) {
4256 case 0:
4257 if (qemu_get_buffer(f, buf, len) != len)
4258 return -EIO;
4259 break;
4260 case 1:
4261 v = qemu_get_byte(f);
4262 memset(buf, v, len);
4263 break;
4264 default:
4265 return -EINVAL;
4266 }
4267 return 0;
4268}
4269
4270static void ram_save(QEMUFile *f, void *opaque)
4271{
4272 int i;
4273 qemu_put_be32(f, phys_ram_size);
4274 for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
4275 ram_put_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
4276 }
4277}
4278
4279static int ram_load(QEMUFile *f, void *opaque, int version_id)
4280{
4281 int i, ret;
4282
4283 if (version_id != 1)
4284 return -EINVAL;
4285 if (qemu_get_be32(f) != phys_ram_size)
4286 return -EINVAL;
4287 for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
4288 ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
4289 if (ret)
4290 return ret;
4291 }
4292 return 0;
4293}
4294
cc1daa40
FB
4295/***********************************************************/
4296/* machine registration */
4297
4298QEMUMachine *first_machine = NULL;
4299
4300int qemu_register_machine(QEMUMachine *m)
4301{
4302 QEMUMachine **pm;
4303 pm = &first_machine;
4304 while (*pm != NULL)
4305 pm = &(*pm)->next;
4306 m->next = NULL;
4307 *pm = m;
4308 return 0;
4309}
4310
4311QEMUMachine *find_machine(const char *name)
4312{
4313 QEMUMachine *m;
4314
4315 for(m = first_machine; m != NULL; m = m->next) {
4316 if (!strcmp(m->name, name))
4317 return m;
4318 }
4319 return NULL;
4320}
4321
8a7ddc38
FB
4322/***********************************************************/
4323/* main execution loop */
4324
4325void gui_update(void *opaque)
4326{
4327 display_state.dpy_refresh(&display_state);
4328 qemu_mod_timer(gui_timer, GUI_REFRESH_INTERVAL + qemu_get_clock(rt_clock));
4329}
4330
0bd48850
FB
4331struct vm_change_state_entry {
4332 VMChangeStateHandler *cb;
4333 void *opaque;
4334 LIST_ENTRY (vm_change_state_entry) entries;
4335};
4336
4337static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
4338
4339VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
4340 void *opaque)
4341{
4342 VMChangeStateEntry *e;
4343
4344 e = qemu_mallocz(sizeof (*e));
4345 if (!e)
4346 return NULL;
4347
4348 e->cb = cb;
4349 e->opaque = opaque;
4350 LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
4351 return e;
4352}
4353
4354void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
4355{
4356 LIST_REMOVE (e, entries);
4357 qemu_free (e);
4358}
4359
4360static void vm_state_notify(int running)
4361{
4362 VMChangeStateEntry *e;
4363
4364 for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
4365 e->cb(e->opaque, running);
4366 }
4367}
4368
8a7ddc38 4369/* XXX: support several handlers */
0bd48850
FB
4370static VMStopHandler *vm_stop_cb;
4371static void *vm_stop_opaque;
8a7ddc38
FB
4372
4373int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
4374{
4375 vm_stop_cb = cb;
4376 vm_stop_opaque = opaque;
4377 return 0;
4378}
4379
4380void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
4381{
4382 vm_stop_cb = NULL;
4383}
4384
4385void vm_start(void)
4386{
4387 if (!vm_running) {
4388 cpu_enable_ticks();
4389 vm_running = 1;
0bd48850 4390 vm_state_notify(1);
8a7ddc38
FB
4391 }
4392}
4393
4394void vm_stop(int reason)
4395{
4396 if (vm_running) {
4397 cpu_disable_ticks();
4398 vm_running = 0;
4399 if (reason != 0) {
4400 if (vm_stop_cb) {
4401 vm_stop_cb(vm_stop_opaque, reason);
4402 }
34865134 4403 }
0bd48850 4404 vm_state_notify(0);
8a7ddc38
FB
4405 }
4406}
4407
bb0c6722
FB
4408/* reset/shutdown handler */
4409
4410typedef struct QEMUResetEntry {
4411 QEMUResetHandler *func;
4412 void *opaque;
4413 struct QEMUResetEntry *next;
4414} QEMUResetEntry;
4415
4416static QEMUResetEntry *first_reset_entry;
4417static int reset_requested;
4418static int shutdown_requested;
3475187d 4419static int powerdown_requested;
bb0c6722
FB
4420
4421void qemu_register_reset(QEMUResetHandler *func, void *opaque)
4422{
4423 QEMUResetEntry **pre, *re;
4424
4425 pre = &first_reset_entry;
4426 while (*pre != NULL)
4427 pre = &(*pre)->next;
4428 re = qemu_mallocz(sizeof(QEMUResetEntry));
4429 re->func = func;
4430 re->opaque = opaque;
4431 re->next = NULL;
4432 *pre = re;
4433}
4434
4435void qemu_system_reset(void)
4436{
4437 QEMUResetEntry *re;
4438
4439 /* reset all devices */
4440 for(re = first_reset_entry; re != NULL; re = re->next) {
4441 re->func(re->opaque);
4442 }
4443}
4444
4445void qemu_system_reset_request(void)
4446{
4447 reset_requested = 1;
6a00d601
FB
4448 if (cpu_single_env)
4449 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
bb0c6722
FB
4450}
4451
4452void qemu_system_shutdown_request(void)
4453{
4454 shutdown_requested = 1;
6a00d601
FB
4455 if (cpu_single_env)
4456 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
bb0c6722
FB
4457}
4458
3475187d
FB
4459void qemu_system_powerdown_request(void)
4460{
4461 powerdown_requested = 1;
6a00d601
FB
4462 if (cpu_single_env)
4463 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
bb0c6722
FB
4464}
4465
5905b2e5 4466void main_loop_wait(int timeout)
8a7ddc38 4467{
8a7ddc38 4468 IOHandlerRecord *ioh, *ioh_next;
e035649e 4469 fd_set rfds, wfds, xfds;
fd1dff4b
FB
4470 int ret, nfds;
4471 struct timeval tv;
f331110f
FB
4472 PollingEntry *pe;
4473
c4b1fcc0 4474
f331110f
FB
4475 /* XXX: need to suppress polling by better using win32 events */
4476 ret = 0;
4477 for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
4478 ret |= pe->func(pe->opaque);
4479 }
38e205a2 4480#ifdef _WIN32
f331110f 4481 if (ret == 0 && timeout > 0) {
06d9f2f7
FB
4482 int err;
4483 HANDLE hEvents[1];
4484
4485 hEvents[0] = host_alarm;
4486 ret = WaitForMultipleObjects(1, hEvents, FALSE, timeout);
4487 switch(ret) {
4488 case WAIT_OBJECT_0 + 0:
4489 break;
4490 case WAIT_TIMEOUT:
4491 break;
4492 default:
4493 err = GetLastError();
4494 fprintf(stderr, "Wait error %d %d\n", ret, err);
4495 break;
4496 }
f331110f 4497 }
fd1dff4b
FB
4498#endif
4499 /* poll any events */
4500 /* XXX: separate device handlers from system ones */
4501 nfds = -1;
4502 FD_ZERO(&rfds);
4503 FD_ZERO(&wfds);
e035649e 4504 FD_ZERO(&xfds);
fd1dff4b
FB
4505 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
4506 if (ioh->fd_read &&
4507 (!ioh->fd_read_poll ||
4508 ioh->fd_read_poll(ioh->opaque) != 0)) {
4509 FD_SET(ioh->fd, &rfds);
4510 if (ioh->fd > nfds)
4511 nfds = ioh->fd;
4512 }
4513 if (ioh->fd_write) {
4514 FD_SET(ioh->fd, &wfds);
4515 if (ioh->fd > nfds)
4516 nfds = ioh->fd;
4517 }
4518 }
4519
4520 tv.tv_sec = 0;
4521#ifdef _WIN32
4522 tv.tv_usec = 0;
38e205a2 4523#else
fd1dff4b
FB
4524 tv.tv_usec = timeout * 1000;
4525#endif
e035649e
FB
4526#if defined(CONFIG_SLIRP)
4527 if (slirp_inited) {
4528 slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
4529 }
4530#endif
4531 ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
fd1dff4b
FB
4532 if (ret > 0) {
4533 /* XXX: better handling of removal */
4534 for(ioh = first_io_handler; ioh != NULL; ioh = ioh_next) {
4535 ioh_next = ioh->next;
4536 if (FD_ISSET(ioh->fd, &rfds)) {
4537 ioh->fd_read(ioh->opaque);
7c9d8e07 4538 }
fd1dff4b
FB
4539 if (FD_ISSET(ioh->fd, &wfds)) {
4540 ioh->fd_write(ioh->opaque);
c4b1fcc0 4541 }
b4608c04 4542 }
fd1dff4b 4543 }
c20709aa 4544#if defined(CONFIG_SLIRP)
fd1dff4b 4545 if (slirp_inited) {
e035649e
FB
4546 if (ret < 0) {
4547 FD_ZERO(&rfds);
4548 FD_ZERO(&wfds);
4549 FD_ZERO(&xfds);
c20709aa 4550 }
e035649e 4551 slirp_select_poll(&rfds, &wfds, &xfds);
fd1dff4b 4552 }
67b915a5 4553#endif
e035649e
FB
4554#ifdef _WIN32
4555 tap_win32_poll();
4556#endif
b4608c04 4557
fd1dff4b
FB
4558 if (vm_running) {
4559 qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
4560 qemu_get_clock(vm_clock));
4561 /* run dma transfers, if any */
4562 DMA_run();
4563 }
4564
4565 /* real time timers */
4566 qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
4567 qemu_get_clock(rt_clock));
5905b2e5
FB
4568}
4569
6a00d601
FB
4570static CPUState *cur_cpu;
4571
5905b2e5
FB
4572int main_loop(void)
4573{
4574 int ret, timeout;
89bfc105
FB
4575#ifdef CONFIG_PROFILER
4576 int64_t ti;
4577#endif
6a00d601 4578 CPUState *env;
5905b2e5 4579
6a00d601 4580 cur_cpu = first_cpu;
5905b2e5
FB
4581 for(;;) {
4582 if (vm_running) {
15a76449
FB
4583
4584 env = cur_cpu;
4585 for(;;) {
4586 /* get next cpu */
4587 env = env->next_cpu;
4588 if (!env)
4589 env = first_cpu;
89bfc105
FB
4590#ifdef CONFIG_PROFILER
4591 ti = profile_getclock();
4592#endif
6a00d601 4593 ret = cpu_exec(env);
89bfc105
FB
4594#ifdef CONFIG_PROFILER
4595 qemu_time += profile_getclock() - ti;
4596#endif
15a76449
FB
4597 if (ret != EXCP_HALTED)
4598 break;
4599 /* all CPUs are halted ? */
4600 if (env == cur_cpu) {
4601 ret = EXCP_HLT;
4602 break;
4603 }
4604 }
4605 cur_cpu = env;
4606
5905b2e5 4607 if (shutdown_requested) {
3475187d 4608 ret = EXCP_INTERRUPT;
5905b2e5
FB
4609 break;
4610 }
4611 if (reset_requested) {
4612 reset_requested = 0;
4613 qemu_system_reset();
3475187d
FB
4614 ret = EXCP_INTERRUPT;
4615 }
4616 if (powerdown_requested) {
4617 powerdown_requested = 0;
4618 qemu_system_powerdown();
4619 ret = EXCP_INTERRUPT;
5905b2e5
FB
4620 }
4621 if (ret == EXCP_DEBUG) {
4622 vm_stop(EXCP_DEBUG);
4623 }
4624 /* if hlt instruction, we wait until the next IRQ */
4625 /* XXX: use timeout computed from timers */
3475187d 4626 if (ret == EXCP_HLT)
5905b2e5
FB
4627 timeout = 10;
4628 else
4629 timeout = 0;
4630 } else {
4631 timeout = 10;
4632 }
89bfc105
FB
4633#ifdef CONFIG_PROFILER
4634 ti = profile_getclock();
4635#endif
5905b2e5 4636 main_loop_wait(timeout);
89bfc105
FB
4637#ifdef CONFIG_PROFILER
4638 dev_time += profile_getclock() - ti;
4639#endif
b4608c04 4640 }
34865134
FB
4641 cpu_disable_ticks();
4642 return ret;
b4608c04
FB
4643}
4644
0824d6fc
FB
4645void help(void)
4646{
f5a8510c 4647 printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2005 Fabrice Bellard\n"
0db63474 4648 "usage: %s [options] [disk_image]\n"
0824d6fc 4649 "\n"
a20dd508 4650 "'disk_image' is a raw hard image image for IDE hard disk 0\n"
fc01f7e7 4651 "\n"
a20dd508 4652 "Standard options:\n"
cc1daa40 4653 "-M machine select emulated machine (-M ? for list)\n"
c45886db 4654 "-fda/-fdb file use 'file' as floppy disk 0/1 image\n"
36b486bb
FB
4655 "-hda/-hdb file use 'file' as IDE hard disk 0/1 image\n"
4656 "-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n"
c4b1fcc0 4657 "-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
9e89a4be 4658 "-boot [a|c|d] boot on floppy (a), hard disk (c) or CD-ROM (d)\n"
a20dd508 4659 "-snapshot write to temporary files instead of disk image files\n"
52ca8d6a
FB
4660#ifdef TARGET_I386
4661 "-no-fd-bootchk disable boot signature checking for floppy disks\n"
4662#endif
a00bad7e 4663 "-m megs set virtual RAM size to megs MB [default=%d]\n"
91fc2119 4664 "-smp n set the number of CPUs to 'n' [default=1]\n"
c4b1fcc0 4665 "-nographic disable graphical output and redirect serial I/Os to console\n"
4ca0074c 4666#ifndef _WIN32
3d11d0eb 4667 "-k language use keyboard layout (for example \"fr\" for French)\n"
4ca0074c 4668#endif
1d14ffa9 4669#ifdef HAS_AUDIO
1d14ffa9 4670 "-audio-help print list of audio drivers and their options\n"
c0fe3827
FB
4671 "-soundhw c1,... enable audio support\n"
4672 " and only specified sound cards (comma separated list)\n"
4673 " use -soundhw ? to get the list of supported cards\n"
6a36d84e 4674 " use -soundhw all to enable all of them\n"
1d14ffa9 4675#endif
89980284 4676 "-localtime set the real time clock to local time [default=utc]\n"
d63d307f 4677 "-full-screen start in full screen\n"
a09db21f
FB
4678#ifdef TARGET_I386
4679 "-win2k-hack use it when installing Windows 2000 to avoid a disk full bug\n"
4680#endif
b389dbfb
FB
4681 "-usb enable the USB driver (will be the default soon)\n"
4682 "-usbdevice name add the host or guest USB device 'name'\n"
6f7e9aec
FB
4683#if defined(TARGET_PPC) || defined(TARGET_SPARC)
4684 "-g WxH[xDEPTH] Set the initial graphical resolution and depth\n"
bb0c6722 4685#endif
c4b1fcc0
FB
4686 "\n"
4687 "Network options:\n"
a41b2ff2 4688 "-net nic[,vlan=n][,macaddr=addr][,model=type]\n"
7c9d8e07 4689 " create a new Network Interface Card and connect it to VLAN 'n'\n"
c20709aa 4690#ifdef CONFIG_SLIRP
115defd1
PB
4691 "-net user[,vlan=n][,hostname=host]\n"
4692 " connect the user mode network stack to VLAN 'n' and send\n"
4693 " hostname 'host' to DHCP clients\n"
7c9d8e07 4694#endif
7fb843f8
FB
4695#ifdef _WIN32
4696 "-net tap[,vlan=n],ifname=name\n"
4697 " connect the host TAP network interface to VLAN 'n'\n"
4698#else
7c9d8e07
FB
4699 "-net tap[,vlan=n][,fd=h][,ifname=name][,script=file]\n"
4700 " connect the host TAP network interface to VLAN 'n' and use\n"
4701 " the network script 'file' (default=%s);\n"
4702 " use 'fd=h' to connect to an already opened TAP interface\n"
7fb843f8 4703#endif
6a00d601 4704 "-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]\n"
7c9d8e07 4705 " connect the vlan 'n' to another VLAN using a socket connection\n"
3d830459
FB
4706 "-net socket[,vlan=n][,fd=h][,mcast=maddr:port]\n"
4707 " connect the vlan 'n' to multicast maddr and port\n"
7c9d8e07
FB
4708 "-net none use it alone to have zero network devices; if no -net option\n"
4709 " is provided, the default is '-net nic -net user'\n"
4710 "\n"
4711#ifdef CONFIG_SLIRP
4712 "-tftp prefix allow tftp access to files starting with prefix [-net user]\n"
4713#ifndef _WIN32
4714 "-smb dir allow SMB access to files in 'dir' [-net user]\n"
c94c8d64 4715#endif
9bf05444 4716 "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n"
7c9d8e07 4717 " redirect TCP or UDP connections from host to guest [-net user]\n"
c20709aa 4718#endif
a20dd508 4719 "\n"
c4b1fcc0 4720 "Linux boot specific:\n"
a20dd508
FB
4721 "-kernel bzImage use 'bzImage' as kernel image\n"
4722 "-append cmdline use 'cmdline' as kernel command line\n"
4723 "-initrd file use 'file' as initial ram disk\n"
fc01f7e7 4724 "\n"
330d0414 4725 "Debug/Expert options:\n"
82c643ff
FB
4726 "-monitor dev redirect the monitor to char device 'dev'\n"
4727 "-serial dev redirect the serial port to char device 'dev'\n"
6508fe59 4728 "-parallel dev redirect the parallel port to char device 'dev'\n"
f7cce898 4729 "-pidfile file Write PID to 'file'\n"
cd6f1169 4730 "-S freeze CPU at startup (use 'c' to start execution)\n"
a20dd508
FB
4731 "-s wait gdb connection to port %d\n"
4732 "-p port change gdb connection port\n"
f193c797 4733 "-d item1,... output log to %s (use -d ? for a list of log items)\n"
46d4767d
FB
4734 "-hdachs c,h,s[,t] force hard disk 0 physical geometry and the optional BIOS\n"
4735 " translation (t=none or lba) (usually qemu can guess them)\n"
a20dd508 4736 "-L path set the directory for the BIOS and VGA BIOS\n"
d993e026 4737#ifdef USE_KQEMU
6515b203 4738 "-kernel-kqemu enable KQEMU full virtualization (default is user mode only)\n"
d993e026
FB
4739 "-no-kqemu disable KQEMU kernel module usage\n"
4740#endif
77fef8c1
FB
4741#ifdef USE_CODE_COPY
4742 "-no-code-copy disable code copy acceleration\n"
4743#endif
bb0c6722 4744#ifdef TARGET_I386
1bfe856e
FB
4745 "-std-vga simulate a standard VGA card with VESA Bochs Extensions\n"
4746 " (default is CL-GD5446 PCI VGA)\n"
6515b203 4747 "-no-acpi disable ACPI\n"
bb0c6722 4748#endif
d63d307f 4749 "-loadvm file start right away with a saved state (loadvm in monitor)\n"
24236869 4750 "-vnc display start a VNC server on display\n"
0824d6fc 4751 "\n"
82c643ff 4752 "During emulation, the following keys are useful:\n"
032a8c9e
FB
4753 "ctrl-alt-f toggle full screen\n"
4754 "ctrl-alt-n switch to virtual console 'n'\n"
4755 "ctrl-alt toggle mouse and keyboard grab\n"
82c643ff
FB
4756 "\n"
4757 "When using -nographic, press 'ctrl-a h' to get some help.\n"
4758 ,
0db63474
FB
4759#ifdef CONFIG_SOFTMMU
4760 "qemu",
4761#else
4762 "qemu-fast",
4763#endif
a00bad7e 4764 DEFAULT_RAM_SIZE,
7c9d8e07 4765#ifndef _WIN32
a00bad7e 4766 DEFAULT_NETWORK_SCRIPT,
7c9d8e07 4767#endif
6e44ba7f
FB
4768 DEFAULT_GDBSTUB_PORT,
4769 "/tmp/qemu.log");
0db63474
FB
4770#ifndef CONFIG_SOFTMMU
4771 printf("\n"
4772 "NOTE: this version of QEMU is faster but it needs slightly patched OSes to\n"
4773 "work. Please use the 'qemu' executable to have a more accurate (but slower)\n"
4774 "PC emulation.\n");
4775#endif
0824d6fc
FB
4776 exit(1);
4777}
4778
cd6f1169
FB
4779#define HAS_ARG 0x0001
4780
4781enum {
4782 QEMU_OPTION_h,
4783
cc1daa40 4784 QEMU_OPTION_M,
cd6f1169
FB
4785 QEMU_OPTION_fda,
4786 QEMU_OPTION_fdb,
4787 QEMU_OPTION_hda,
4788 QEMU_OPTION_hdb,
4789 QEMU_OPTION_hdc,
4790 QEMU_OPTION_hdd,
4791 QEMU_OPTION_cdrom,
4792 QEMU_OPTION_boot,
4793 QEMU_OPTION_snapshot,
52ca8d6a
FB
4794#ifdef TARGET_I386
4795 QEMU_OPTION_no_fd_bootchk,
4796#endif
cd6f1169
FB
4797 QEMU_OPTION_m,
4798 QEMU_OPTION_nographic,
1d14ffa9 4799#ifdef HAS_AUDIO
1d14ffa9
FB
4800 QEMU_OPTION_audio_help,
4801 QEMU_OPTION_soundhw,
4802#endif
cd6f1169 4803
7c9d8e07 4804 QEMU_OPTION_net,
c7f74643 4805 QEMU_OPTION_tftp,
9d728e8c 4806 QEMU_OPTION_smb,
9bf05444 4807 QEMU_OPTION_redir,
cd6f1169
FB
4808
4809 QEMU_OPTION_kernel,
4810 QEMU_OPTION_append,
4811 QEMU_OPTION_initrd,
4812
4813 QEMU_OPTION_S,
4814 QEMU_OPTION_s,
4815 QEMU_OPTION_p,
4816 QEMU_OPTION_d,
4817 QEMU_OPTION_hdachs,
4818 QEMU_OPTION_L,
4819 QEMU_OPTION_no_code_copy,
3d11d0eb 4820 QEMU_OPTION_k,
ee22c2f7 4821 QEMU_OPTION_localtime,
1f04275e 4822 QEMU_OPTION_cirrusvga,
e9b137c2 4823 QEMU_OPTION_g,
1bfe856e 4824 QEMU_OPTION_std_vga,
82c643ff
FB
4825 QEMU_OPTION_monitor,
4826 QEMU_OPTION_serial,
6508fe59 4827 QEMU_OPTION_parallel,
d63d307f
FB
4828 QEMU_OPTION_loadvm,
4829 QEMU_OPTION_full_screen,
f7cce898 4830 QEMU_OPTION_pidfile,
d993e026 4831 QEMU_OPTION_no_kqemu,
89bfc105 4832 QEMU_OPTION_kernel_kqemu,
a09db21f 4833 QEMU_OPTION_win2k_hack,
bb36d470 4834 QEMU_OPTION_usb,
a594cfbf 4835 QEMU_OPTION_usbdevice,
6a00d601 4836 QEMU_OPTION_smp,
24236869 4837 QEMU_OPTION_vnc,
6515b203 4838 QEMU_OPTION_no_acpi,
cd6f1169
FB
4839};
4840
4841typedef struct QEMUOption {
4842 const char *name;
4843 int flags;
4844 int index;
4845} QEMUOption;
4846
4847const QEMUOption qemu_options[] = {
4848 { "h", 0, QEMU_OPTION_h },
4849
cc1daa40 4850 { "M", HAS_ARG, QEMU_OPTION_M },
cd6f1169
FB
4851 { "fda", HAS_ARG, QEMU_OPTION_fda },
4852 { "fdb", HAS_ARG, QEMU_OPTION_fdb },
4853 { "hda", HAS_ARG, QEMU_OPTION_hda },
4854 { "hdb", HAS_ARG, QEMU_OPTION_hdb },
4855 { "hdc", HAS_ARG, QEMU_OPTION_hdc },
4856 { "hdd", HAS_ARG, QEMU_OPTION_hdd },
4857 { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
4858 { "boot", HAS_ARG, QEMU_OPTION_boot },
4859 { "snapshot", 0, QEMU_OPTION_snapshot },
52ca8d6a
FB
4860#ifdef TARGET_I386
4861 { "no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk },
4862#endif
cd6f1169
FB
4863 { "m", HAS_ARG, QEMU_OPTION_m },
4864 { "nographic", 0, QEMU_OPTION_nographic },
3d11d0eb 4865 { "k", HAS_ARG, QEMU_OPTION_k },
1d14ffa9 4866#ifdef HAS_AUDIO
1d14ffa9
FB
4867 { "audio-help", 0, QEMU_OPTION_audio_help },
4868 { "soundhw", HAS_ARG, QEMU_OPTION_soundhw },
4869#endif
cd6f1169 4870
7c9d8e07 4871 { "net", HAS_ARG, QEMU_OPTION_net},
158156d1 4872#ifdef CONFIG_SLIRP
c7f74643 4873 { "tftp", HAS_ARG, QEMU_OPTION_tftp },
c94c8d64 4874#ifndef _WIN32
9d728e8c 4875 { "smb", HAS_ARG, QEMU_OPTION_smb },
c94c8d64 4876#endif
9bf05444 4877 { "redir", HAS_ARG, QEMU_OPTION_redir },
158156d1 4878#endif
cd6f1169
FB
4879
4880 { "kernel", HAS_ARG, QEMU_OPTION_kernel },
4881 { "append", HAS_ARG, QEMU_OPTION_append },
4882 { "initrd", HAS_ARG, QEMU_OPTION_initrd },
4883
4884 { "S", 0, QEMU_OPTION_S },
4885 { "s", 0, QEMU_OPTION_s },
4886 { "p", HAS_ARG, QEMU_OPTION_p },
4887 { "d", HAS_ARG, QEMU_OPTION_d },
4888 { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
4889 { "L", HAS_ARG, QEMU_OPTION_L },
4890 { "no-code-copy", 0, QEMU_OPTION_no_code_copy },
d993e026
FB
4891#ifdef USE_KQEMU
4892 { "no-kqemu", 0, QEMU_OPTION_no_kqemu },
89bfc105 4893 { "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu },
d993e026 4894#endif
6f7e9aec 4895#if defined(TARGET_PPC) || defined(TARGET_SPARC)
e9b137c2 4896 { "g", 1, QEMU_OPTION_g },
77d4bc34 4897#endif
ee22c2f7 4898 { "localtime", 0, QEMU_OPTION_localtime },
1bfe856e 4899 { "std-vga", 0, QEMU_OPTION_std_vga },
82c643ff
FB
4900 { "monitor", 1, QEMU_OPTION_monitor },
4901 { "serial", 1, QEMU_OPTION_serial },
6508fe59 4902 { "parallel", 1, QEMU_OPTION_parallel },
d63d307f
FB
4903 { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
4904 { "full-screen", 0, QEMU_OPTION_full_screen },
f7cce898 4905 { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
a09db21f 4906 { "win2k-hack", 0, QEMU_OPTION_win2k_hack },
a594cfbf 4907 { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
6a00d601 4908 { "smp", HAS_ARG, QEMU_OPTION_smp },
24236869 4909 { "vnc", HAS_ARG, QEMU_OPTION_vnc },
a09db21f 4910
1f04275e 4911 /* temporary options */
a594cfbf 4912 { "usb", 0, QEMU_OPTION_usb },
1f04275e 4913 { "cirrusvga", 0, QEMU_OPTION_cirrusvga },
6515b203 4914 { "no-acpi", 0, QEMU_OPTION_no_acpi },
cd6f1169 4915 { NULL },
fc01f7e7
FB
4916};
4917
77fef8c1
FB
4918#if defined (TARGET_I386) && defined(USE_CODE_COPY)
4919
4920/* this stack is only used during signal handling */
4921#define SIGNAL_STACK_SIZE 32768
4922
4923static uint8_t *signal_stack;
4924
4925#endif
4926
5905b2e5
FB
4927/* password input */
4928
4929static BlockDriverState *get_bdrv(int index)
4930{
4931 BlockDriverState *bs;
4932
4933 if (index < 4) {
4934 bs = bs_table[index];
4935 } else if (index < 6) {
4936 bs = fd_table[index - 4];
4937 } else {
4938 bs = NULL;
4939 }
4940 return bs;
4941}
4942
4943static void read_passwords(void)
4944{
4945 BlockDriverState *bs;
4946 int i, j;
4947 char password[256];
4948
4949 for(i = 0; i < 6; i++) {
4950 bs = get_bdrv(i);
4951 if (bs && bdrv_is_encrypted(bs)) {
4952 term_printf("%s is encrypted.\n", bdrv_get_device_name(bs));
4953 for(j = 0; j < 3; j++) {
4954 monitor_readline("Password: ",
4955 1, password, sizeof(password));
4956 if (bdrv_set_key(bs, password) == 0)
4957 break;
4958 term_printf("invalid password\n");
4959 }
4960 }
4961 }
4962}
4963
cc1daa40
FB
4964/* XXX: currently we cannot use simultaneously different CPUs */
4965void register_machines(void)
4966{
4967#if defined(TARGET_I386)
4968 qemu_register_machine(&pc_machine);
3dbbdc25 4969 qemu_register_machine(&isapc_machine);
cc1daa40
FB
4970#elif defined(TARGET_PPC)
4971 qemu_register_machine(&heathrow_machine);
4972 qemu_register_machine(&core99_machine);
4973 qemu_register_machine(&prep_machine);
6af0bf9c
FB
4974#elif defined(TARGET_MIPS)
4975 qemu_register_machine(&mips_machine);
cc1daa40 4976#elif defined(TARGET_SPARC)
3475187d
FB
4977#ifdef TARGET_SPARC64
4978 qemu_register_machine(&sun4u_machine);
4979#else
cc1daa40
FB
4980 qemu_register_machine(&sun4m_machine);
4981#endif
b5ff1b31 4982#elif defined(TARGET_ARM)
40f137e1
PB
4983 qemu_register_machine(&integratorcp926_machine);
4984 qemu_register_machine(&integratorcp1026_machine);
cdbdb648 4985 qemu_register_machine(&versatilepb_machine);
16406950 4986 qemu_register_machine(&versatileab_machine);
27c7ca7e
FB
4987#elif defined(TARGET_SH4)
4988 qemu_register_machine(&shix_machine);
b5ff1b31
FB
4989#else
4990#error unsupported CPU
3475187d 4991#endif
cc1daa40
FB
4992}
4993
1d14ffa9 4994#ifdef HAS_AUDIO
6a36d84e 4995struct soundhw soundhw[] = {
fd06c375
FB
4996#ifdef TARGET_I386
4997 {
4998 "pcspk",
4999 "PC speaker",
5000 0,
5001 1,
5002 { .init_isa = pcspk_audio_init }
5003 },
5004#endif
6a36d84e
FB
5005 {
5006 "sb16",
5007 "Creative Sound Blaster 16",
5008 0,
5009 1,
5010 { .init_isa = SB16_init }
5011 },
5012
1d14ffa9 5013#ifdef CONFIG_ADLIB
6a36d84e
FB
5014 {
5015 "adlib",
1d14ffa9 5016#ifdef HAS_YMF262
6a36d84e 5017 "Yamaha YMF262 (OPL3)",
1d14ffa9 5018#else
6a36d84e 5019 "Yamaha YM3812 (OPL2)",
1d14ffa9 5020#endif
6a36d84e
FB
5021 0,
5022 1,
5023 { .init_isa = Adlib_init }
5024 },
1d14ffa9 5025#endif
6a36d84e 5026
1d14ffa9 5027#ifdef CONFIG_GUS
6a36d84e
FB
5028 {
5029 "gus",
5030 "Gravis Ultrasound GF1",
5031 0,
5032 1,
5033 { .init_isa = GUS_init }
5034 },
1d14ffa9 5035#endif
6a36d84e
FB
5036
5037 {
5038 "es1370",
5039 "ENSONIQ AudioPCI ES1370",
5040 0,
5041 0,
5042 { .init_pci = es1370_init }
5043 },
5044
5045 { NULL, NULL, 0, 0, { NULL } }
5046};
5047
5048static void select_soundhw (const char *optarg)
5049{
5050 struct soundhw *c;
5051
5052 if (*optarg == '?') {
5053 show_valid_cards:
5054
5055 printf ("Valid sound card names (comma separated):\n");
5056 for (c = soundhw; c->name; ++c) {
5057 printf ("%-11s %s\n", c->name, c->descr);
5058 }
5059 printf ("\n-soundhw all will enable all of the above\n");
1d14ffa9
FB
5060 exit (*optarg != '?');
5061 }
5062 else {
6a36d84e 5063 size_t l;
1d14ffa9
FB
5064 const char *p;
5065 char *e;
5066 int bad_card = 0;
5067
6a36d84e
FB
5068 if (!strcmp (optarg, "all")) {
5069 for (c = soundhw; c->name; ++c) {
5070 c->enabled = 1;
5071 }
5072 return;
5073 }
1d14ffa9 5074
6a36d84e 5075 p = optarg;
1d14ffa9
FB
5076 while (*p) {
5077 e = strchr (p, ',');
5078 l = !e ? strlen (p) : (size_t) (e - p);
6a36d84e
FB
5079
5080 for (c = soundhw; c->name; ++c) {
5081 if (!strncmp (c->name, p, l)) {
5082 c->enabled = 1;
1d14ffa9
FB
5083 break;
5084 }
5085 }
6a36d84e
FB
5086
5087 if (!c->name) {
1d14ffa9
FB
5088 if (l > 80) {
5089 fprintf (stderr,
5090 "Unknown sound card name (too big to show)\n");
5091 }
5092 else {
5093 fprintf (stderr, "Unknown sound card name `%.*s'\n",
5094 (int) l, p);
5095 }
5096 bad_card = 1;
5097 }
5098 p += l + (e != NULL);
5099 }
5100
5101 if (bad_card)
5102 goto show_valid_cards;
5103 }
5104}
5105#endif
5106
7c9d8e07 5107#define MAX_NET_CLIENTS 32
c20709aa 5108
0824d6fc
FB
5109int main(int argc, char **argv)
5110{
67b915a5
FB
5111#ifdef CONFIG_GDBSTUB
5112 int use_gdbstub, gdbstub_port;
5113#endif
cc1daa40 5114 int i, cdrom_index;
1ccde1cb 5115 int snapshot, linux_boot;
7f7f9873 5116 const char *initrd_filename;
c45886db 5117 const char *hd_filename[MAX_DISKS], *fd_filename[MAX_FD];
a20dd508 5118 const char *kernel_filename, *kernel_cmdline;
313aa567 5119 DisplayState *ds = &display_state;
46d4767d 5120 int cyls, heads, secs, translation;
a541f297 5121 int start_emulation = 1;
7c9d8e07
FB
5122 char net_clients[MAX_NET_CLIENTS][256];
5123 int nb_net_clients;
cd6f1169
FB
5124 int optind;
5125 const char *r, *optarg;
82c643ff
FB
5126 CharDriverState *monitor_hd;
5127 char monitor_device[128];
8d11df9e
FB
5128 char serial_devices[MAX_SERIAL_PORTS][128];
5129 int serial_device_index;
6508fe59
FB
5130 char parallel_devices[MAX_PARALLEL_PORTS][128];
5131 int parallel_device_index;
d63d307f 5132 const char *loadvm = NULL;
cc1daa40 5133 QEMUMachine *machine;
0d92ed30 5134 char usb_devices[MAX_USB_CMDLINE][128];
a594cfbf 5135 int usb_devices_index;
0bd48850
FB
5136
5137 LIST_INIT (&vm_change_state_head);
67b915a5 5138#if !defined(CONFIG_SOFTMMU)
0824d6fc
FB
5139 /* we never want that malloc() uses mmap() */
5140 mallopt(M_MMAP_THRESHOLD, 4096 * 1024);
67b915a5 5141#endif
cc1daa40
FB
5142 register_machines();
5143 machine = first_machine;
fc01f7e7 5144 initrd_filename = NULL;
c45886db
FB
5145 for(i = 0; i < MAX_FD; i++)
5146 fd_filename[i] = NULL;
fc01f7e7
FB
5147 for(i = 0; i < MAX_DISKS; i++)
5148 hd_filename[i] = NULL;
a00bad7e 5149 ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
313aa567 5150 vga_ram_size = VGA_RAM_SIZE;
0ced6589 5151 bios_size = BIOS_SIZE;
67b915a5 5152#ifdef CONFIG_GDBSTUB
b4608c04
FB
5153 use_gdbstub = 0;
5154 gdbstub_port = DEFAULT_GDBSTUB_PORT;
67b915a5 5155#endif
33e3963e 5156 snapshot = 0;
a20dd508
FB
5157 nographic = 0;
5158 kernel_filename = NULL;
5159 kernel_cmdline = "";
cc1daa40
FB
5160#ifdef TARGET_PPC
5161 cdrom_index = 1;
5162#else
5163 cdrom_index = 2;
5164#endif
c4b1fcc0 5165 cyls = heads = secs = 0;
46d4767d 5166 translation = BIOS_ATA_TRANSLATION_AUTO;
82c643ff 5167 pstrcpy(monitor_device, sizeof(monitor_device), "vc");
c4b1fcc0 5168
8d11df9e
FB
5169 pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "vc");
5170 for(i = 1; i < MAX_SERIAL_PORTS; i++)
5171 serial_devices[i][0] = '\0';
5172 serial_device_index = 0;
5173
6508fe59
FB
5174 pstrcpy(parallel_devices[0], sizeof(parallel_devices[0]), "vc");
5175 for(i = 1; i < MAX_PARALLEL_PORTS; i++)
5176 parallel_devices[i][0] = '\0';
5177 parallel_device_index = 0;
5178
a594cfbf
FB
5179 usb_devices_index = 0;
5180
7c9d8e07
FB
5181 nb_net_clients = 0;
5182
5183 nb_nics = 0;
702c651c 5184 /* default mac address of the first network interface */
82c643ff 5185
cd6f1169 5186 optind = 1;
0824d6fc 5187 for(;;) {
cd6f1169 5188 if (optind >= argc)
0824d6fc 5189 break;
cd6f1169
FB
5190 r = argv[optind];
5191 if (r[0] != '-') {
5192 hd_filename[0] = argv[optind++];
5193 } else {
5194 const QEMUOption *popt;
5195
5196 optind++;
5197 popt = qemu_options;
5198 for(;;) {
5199 if (!popt->name) {
5200 fprintf(stderr, "%s: invalid option -- '%s'\n",
5201 argv[0], r);
5202 exit(1);
5203 }
5204 if (!strcmp(popt->name, r + 1))
5205 break;
5206 popt++;
5207 }
5208 if (popt->flags & HAS_ARG) {
5209 if (optind >= argc) {
5210 fprintf(stderr, "%s: option '%s' requires an argument\n",
5211 argv[0], r);
5212 exit(1);
5213 }
5214 optarg = argv[optind++];
5215 } else {
5216 optarg = NULL;
5217 }
5218
5219 switch(popt->index) {
cc1daa40
FB
5220 case QEMU_OPTION_M:
5221 machine = find_machine(optarg);
5222 if (!machine) {
5223 QEMUMachine *m;
5224 printf("Supported machines are:\n");
5225 for(m = first_machine; m != NULL; m = m->next) {
5226 printf("%-10s %s%s\n",
5227 m->name, m->desc,
5228 m == first_machine ? " (default)" : "");
5229 }
5230 exit(1);
5231 }
5232 break;
cd6f1169 5233 case QEMU_OPTION_initrd:
fc01f7e7
FB
5234 initrd_filename = optarg;
5235 break;
cd6f1169 5236 case QEMU_OPTION_hda:
cd6f1169 5237 case QEMU_OPTION_hdb:
cc1daa40
FB
5238 case QEMU_OPTION_hdc:
5239 case QEMU_OPTION_hdd:
5240 {
5241 int hd_index;
5242 hd_index = popt->index - QEMU_OPTION_hda;
5243 hd_filename[hd_index] = optarg;
5244 if (hd_index == cdrom_index)
5245 cdrom_index = -1;
5246 }
fc01f7e7 5247 break;
cd6f1169 5248 case QEMU_OPTION_snapshot:
33e3963e
FB
5249 snapshot = 1;
5250 break;
cd6f1169 5251 case QEMU_OPTION_hdachs:
330d0414 5252 {
330d0414
FB
5253 const char *p;
5254 p = optarg;
5255 cyls = strtol(p, (char **)&p, 0);
46d4767d
FB
5256 if (cyls < 1 || cyls > 16383)
5257 goto chs_fail;
330d0414
FB
5258 if (*p != ',')
5259 goto chs_fail;
5260 p++;
5261 heads = strtol(p, (char **)&p, 0);
46d4767d
FB
5262 if (heads < 1 || heads > 16)
5263 goto chs_fail;
330d0414
FB
5264 if (*p != ',')
5265 goto chs_fail;
5266 p++;
5267 secs = strtol(p, (char **)&p, 0);
46d4767d
FB
5268 if (secs < 1 || secs > 63)
5269 goto chs_fail;
5270 if (*p == ',') {
5271 p++;
5272 if (!strcmp(p, "none"))
5273 translation = BIOS_ATA_TRANSLATION_NONE;
5274 else if (!strcmp(p, "lba"))
5275 translation = BIOS_ATA_TRANSLATION_LBA;
5276 else if (!strcmp(p, "auto"))
5277 translation = BIOS_ATA_TRANSLATION_AUTO;
5278 else
5279 goto chs_fail;
5280 } else if (*p != '\0') {
c4b1fcc0 5281 chs_fail:
46d4767d
FB
5282 fprintf(stderr, "qemu: invalid physical CHS format\n");
5283 exit(1);
c4b1fcc0 5284 }
330d0414
FB
5285 }
5286 break;
cd6f1169 5287 case QEMU_OPTION_nographic:
82c643ff 5288 pstrcpy(monitor_device, sizeof(monitor_device), "stdio");
8d11df9e 5289 pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "stdio");
a20dd508
FB
5290 nographic = 1;
5291 break;
cd6f1169 5292 case QEMU_OPTION_kernel:
a20dd508
FB
5293 kernel_filename = optarg;
5294 break;
cd6f1169 5295 case QEMU_OPTION_append:
a20dd508 5296 kernel_cmdline = optarg;
313aa567 5297 break;
cd6f1169 5298 case QEMU_OPTION_cdrom:
cc1daa40
FB
5299 if (cdrom_index >= 0) {
5300 hd_filename[cdrom_index] = optarg;
5301 }
36b486bb 5302 break;
cd6f1169 5303 case QEMU_OPTION_boot:
36b486bb 5304 boot_device = optarg[0];
9e89a4be 5305 if (boot_device != 'a' &&
6f7e9aec
FB
5306#ifdef TARGET_SPARC
5307 // Network boot
5308 boot_device != 'n' &&
5309#endif
c45886db 5310 boot_device != 'c' && boot_device != 'd') {
36b486bb
FB
5311 fprintf(stderr, "qemu: invalid boot device '%c'\n", boot_device);
5312 exit(1);
5313 }
5314 break;
cd6f1169 5315 case QEMU_OPTION_fda:
c45886db
FB
5316 fd_filename[0] = optarg;
5317 break;
cd6f1169 5318 case QEMU_OPTION_fdb:
c45886db
FB
5319 fd_filename[1] = optarg;
5320 break;
52ca8d6a
FB
5321#ifdef TARGET_I386
5322 case QEMU_OPTION_no_fd_bootchk:
5323 fd_bootchk = 0;
5324 break;
5325#endif
cd6f1169 5326 case QEMU_OPTION_no_code_copy:
77fef8c1
FB
5327 code_copy_enabled = 0;
5328 break;
7c9d8e07
FB
5329 case QEMU_OPTION_net:
5330 if (nb_net_clients >= MAX_NET_CLIENTS) {
5331 fprintf(stderr, "qemu: too many network clients\n");
c4b1fcc0
FB
5332 exit(1);
5333 }
7c9d8e07
FB
5334 pstrcpy(net_clients[nb_net_clients],
5335 sizeof(net_clients[0]),
5336 optarg);
5337 nb_net_clients++;
702c651c 5338 break;
c7f74643
FB
5339#ifdef CONFIG_SLIRP
5340 case QEMU_OPTION_tftp:
c7f74643 5341 tftp_prefix = optarg;
9bf05444 5342 break;
c94c8d64 5343#ifndef _WIN32
9d728e8c
FB
5344 case QEMU_OPTION_smb:
5345 net_slirp_smb(optarg);
5346 break;
c94c8d64 5347#endif
9bf05444
FB
5348 case QEMU_OPTION_redir:
5349 net_slirp_redir(optarg);
5350 break;
c7f74643 5351#endif
1d14ffa9 5352#ifdef HAS_AUDIO
1d14ffa9
FB
5353 case QEMU_OPTION_audio_help:
5354 AUD_help ();
5355 exit (0);
5356 break;
5357 case QEMU_OPTION_soundhw:
5358 select_soundhw (optarg);
5359 break;
5360#endif
cd6f1169 5361 case QEMU_OPTION_h:
0824d6fc 5362 help();
cd6f1169
FB
5363 break;
5364 case QEMU_OPTION_m:
5365 ram_size = atoi(optarg) * 1024 * 1024;
5366 if (ram_size <= 0)
5367 help();
5368 if (ram_size > PHYS_RAM_MAX_SIZE) {
5369 fprintf(stderr, "qemu: at most %d MB RAM can be simulated\n",
5370 PHYS_RAM_MAX_SIZE / (1024 * 1024));
5371 exit(1);
5372 }
5373 break;
5374 case QEMU_OPTION_d:
5375 {
5376 int mask;
5377 CPULogItem *item;
5378
5379 mask = cpu_str_to_log_mask(optarg);
5380 if (!mask) {
5381 printf("Log items (comma separated):\n");
f193c797
FB
5382 for(item = cpu_log_items; item->mask != 0; item++) {
5383 printf("%-10s %s\n", item->name, item->help);
5384 }
5385 exit(1);
cd6f1169
FB
5386 }
5387 cpu_set_log(mask);
f193c797 5388 }
cd6f1169 5389 break;
67b915a5 5390#ifdef CONFIG_GDBSTUB
cd6f1169
FB
5391 case QEMU_OPTION_s:
5392 use_gdbstub = 1;
5393 break;
5394 case QEMU_OPTION_p:
5395 gdbstub_port = atoi(optarg);
5396 break;
67b915a5 5397#endif
cd6f1169
FB
5398 case QEMU_OPTION_L:
5399 bios_dir = optarg;
5400 break;
5401 case QEMU_OPTION_S:
5402 start_emulation = 0;
5403 break;
3d11d0eb
FB
5404 case QEMU_OPTION_k:
5405 keyboard_layout = optarg;
5406 break;
ee22c2f7
FB
5407 case QEMU_OPTION_localtime:
5408 rtc_utc = 0;
5409 break;
1f04275e
FB
5410 case QEMU_OPTION_cirrusvga:
5411 cirrus_vga_enabled = 1;
5412 break;
1bfe856e
FB
5413 case QEMU_OPTION_std_vga:
5414 cirrus_vga_enabled = 0;
5415 break;
e9b137c2
FB
5416 case QEMU_OPTION_g:
5417 {
5418 const char *p;
5419 int w, h, depth;
5420 p = optarg;
5421 w = strtol(p, (char **)&p, 10);
5422 if (w <= 0) {
5423 graphic_error:
5424 fprintf(stderr, "qemu: invalid resolution or depth\n");
5425 exit(1);
5426 }
5427 if (*p != 'x')
5428 goto graphic_error;
5429 p++;
5430 h = strtol(p, (char **)&p, 10);
5431 if (h <= 0)
5432 goto graphic_error;
5433 if (*p == 'x') {
5434 p++;
5435 depth = strtol(p, (char **)&p, 10);
5436 if (depth != 8 && depth != 15 && depth != 16 &&
5437 depth != 24 && depth != 32)
5438 goto graphic_error;
5439 } else if (*p == '\0') {
5440 depth = graphic_depth;
5441 } else {
5442 goto graphic_error;
5443 }
5444
5445 graphic_width = w;
5446 graphic_height = h;
5447 graphic_depth = depth;
5448 }
5449 break;
82c643ff
FB
5450 case QEMU_OPTION_monitor:
5451 pstrcpy(monitor_device, sizeof(monitor_device), optarg);
5452 break;
5453 case QEMU_OPTION_serial:
8d11df9e
FB
5454 if (serial_device_index >= MAX_SERIAL_PORTS) {
5455 fprintf(stderr, "qemu: too many serial ports\n");
5456 exit(1);
5457 }
5458 pstrcpy(serial_devices[serial_device_index],
5459 sizeof(serial_devices[0]), optarg);
5460 serial_device_index++;
82c643ff 5461 break;
6508fe59
FB
5462 case QEMU_OPTION_parallel:
5463 if (parallel_device_index >= MAX_PARALLEL_PORTS) {
5464 fprintf(stderr, "qemu: too many parallel ports\n");
5465 exit(1);
5466 }
5467 pstrcpy(parallel_devices[parallel_device_index],
5468 sizeof(parallel_devices[0]), optarg);
5469 parallel_device_index++;
5470 break;
d63d307f
FB
5471 case QEMU_OPTION_loadvm:
5472 loadvm = optarg;
5473 break;
5474 case QEMU_OPTION_full_screen:
5475 full_screen = 1;
5476 break;
f7cce898
FB
5477 case QEMU_OPTION_pidfile:
5478 create_pidfile(optarg);
5479 break;
a09db21f
FB
5480#ifdef TARGET_I386
5481 case QEMU_OPTION_win2k_hack:
5482 win2k_install_hack = 1;
5483 break;
5484#endif
d993e026
FB
5485#ifdef USE_KQEMU
5486 case QEMU_OPTION_no_kqemu:
5487 kqemu_allowed = 0;
5488 break;
89bfc105
FB
5489 case QEMU_OPTION_kernel_kqemu:
5490 kqemu_allowed = 2;
5491 break;
d993e026 5492#endif
bb36d470
FB
5493 case QEMU_OPTION_usb:
5494 usb_enabled = 1;
5495 break;
a594cfbf
FB
5496 case QEMU_OPTION_usbdevice:
5497 usb_enabled = 1;
0d92ed30 5498 if (usb_devices_index >= MAX_USB_CMDLINE) {
a594cfbf
FB
5499 fprintf(stderr, "Too many USB devices\n");
5500 exit(1);
5501 }
5502 pstrcpy(usb_devices[usb_devices_index],
5503 sizeof(usb_devices[usb_devices_index]),
5504 optarg);
5505 usb_devices_index++;
5506 break;
6a00d601
FB
5507 case QEMU_OPTION_smp:
5508 smp_cpus = atoi(optarg);
ba3c64fb 5509 if (smp_cpus < 1 || smp_cpus > MAX_CPUS) {
6a00d601
FB
5510 fprintf(stderr, "Invalid number of CPUs\n");
5511 exit(1);
5512 }
5513 break;
24236869
FB
5514 case QEMU_OPTION_vnc:
5515 vnc_display = atoi(optarg);
5516 if (vnc_display < 0) {
5517 fprintf(stderr, "Invalid VNC display\n");
5518 exit(1);
5519 }
5520 break;
6515b203
FB
5521 case QEMU_OPTION_no_acpi:
5522 acpi_enabled = 0;
5523 break;
cd6f1169 5524 }
0824d6fc
FB
5525 }
5526 }
330d0414 5527
ff3fbb30
FB
5528#ifdef USE_KQEMU
5529 if (smp_cpus > 1)
5530 kqemu_allowed = 0;
5531#endif
a20dd508 5532 linux_boot = (kernel_filename != NULL);
330d0414 5533
cc1daa40
FB
5534 if (!linux_boot &&
5535 hd_filename[0] == '\0' &&
5536 (cdrom_index >= 0 && hd_filename[cdrom_index] == '\0') &&
c45886db 5537 fd_filename[0] == '\0')
0824d6fc 5538 help();
8f2b1fb0
FB
5539
5540 /* boot to cd by default if no hard disk */
d0309311
FB
5541 if (hd_filename[0] == '\0' && boot_device == 'c') {
5542 if (fd_filename[0] != '\0')
5543 boot_device = 'a';
5544 else
5545 boot_device = 'd';
5546 }
0824d6fc 5547
dc887a4d
FB
5548#if !defined(CONFIG_SOFTMMU)
5549 /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
5550 {
5551 static uint8_t stdout_buf[4096];
5552 setvbuf(stdout, stdout_buf, _IOLBF, sizeof(stdout_buf));
5553 }
5554#else
b118d61e 5555 setvbuf(stdout, NULL, _IOLBF, 0);
dc887a4d 5556#endif
7c9d8e07 5557
fd1dff4b
FB
5558#ifdef _WIN32
5559 socket_init();
5560#endif
5561
7c9d8e07
FB
5562 /* init network clients */
5563 if (nb_net_clients == 0) {
5564 /* if no clients, we use a default config */
5565 pstrcpy(net_clients[0], sizeof(net_clients[0]),
5566 "nic");
5567 pstrcpy(net_clients[1], sizeof(net_clients[0]),
5568 "user");
5569 nb_net_clients = 2;
c20709aa
FB
5570 }
5571
7c9d8e07
FB
5572 for(i = 0;i < nb_net_clients; i++) {
5573 if (net_client_init(net_clients[i]) < 0)
5574 exit(1);
702c651c 5575 }
f1510b2c 5576
0824d6fc 5577 /* init the memory */
0ced6589 5578 phys_ram_size = ram_size + vga_ram_size + bios_size;
7f7f9873
FB
5579
5580#ifdef CONFIG_SOFTMMU
d993e026 5581 phys_ram_base = qemu_vmalloc(phys_ram_size);
7f7f9873
FB
5582 if (!phys_ram_base) {
5583 fprintf(stderr, "Could not allocate physical memory\n");
0824d6fc
FB
5584 exit(1);
5585 }
7f7f9873
FB
5586#else
5587 /* as we must map the same page at several addresses, we must use
5588 a fd */
5589 {
5590 const char *tmpdir;
5591
5592 tmpdir = getenv("QEMU_TMPDIR");
5593 if (!tmpdir)
5594 tmpdir = "/tmp";
5595 snprintf(phys_ram_file, sizeof(phys_ram_file), "%s/vlXXXXXX", tmpdir);
5596 if (mkstemp(phys_ram_file) < 0) {
5597 fprintf(stderr, "Could not create temporary memory file '%s'\n",
5598 phys_ram_file);
5599 exit(1);
5600 }
5601 phys_ram_fd = open(phys_ram_file, O_CREAT | O_TRUNC | O_RDWR, 0600);
5602 if (phys_ram_fd < 0) {
5603 fprintf(stderr, "Could not open temporary memory file '%s'\n",
5604 phys_ram_file);
5605 exit(1);
5606 }
1ccde1cb 5607 ftruncate(phys_ram_fd, phys_ram_size);
7f7f9873 5608 unlink(phys_ram_file);
1ccde1cb
FB
5609 phys_ram_base = mmap(get_mmap_addr(phys_ram_size),
5610 phys_ram_size,
7f7f9873
FB
5611 PROT_WRITE | PROT_READ, MAP_SHARED | MAP_FIXED,
5612 phys_ram_fd, 0);
5613 if (phys_ram_base == MAP_FAILED) {
5614 fprintf(stderr, "Could not map physical memory\n");
5615 exit(1);
5616 }
5617 }
5618#endif
0824d6fc 5619
c4b1fcc0 5620 /* we always create the cdrom drive, even if no disk is there */
5905b2e5 5621 bdrv_init();
cc1daa40
FB
5622 if (cdrom_index >= 0) {
5623 bs_table[cdrom_index] = bdrv_new("cdrom");
5624 bdrv_set_type_hint(bs_table[cdrom_index], BDRV_TYPE_CDROM);
c4b1fcc0
FB
5625 }
5626
33e3963e
FB
5627 /* open the virtual block devices */
5628 for(i = 0; i < MAX_DISKS; i++) {
5629 if (hd_filename[i]) {
33e3963e 5630 if (!bs_table[i]) {
c4b1fcc0
FB
5631 char buf[64];
5632 snprintf(buf, sizeof(buf), "hd%c", i + 'a');
5633 bs_table[i] = bdrv_new(buf);
5634 }
5635 if (bdrv_open(bs_table[i], hd_filename[i], snapshot) < 0) {
5905b2e5 5636 fprintf(stderr, "qemu: could not open hard disk image '%s'\n",
33e3963e
FB
5637 hd_filename[i]);
5638 exit(1);
5639 }
46d4767d 5640 if (i == 0 && cyls != 0) {
c4b1fcc0 5641 bdrv_set_geometry_hint(bs_table[i], cyls, heads, secs);
46d4767d
FB
5642 bdrv_set_translation_hint(bs_table[i], translation);
5643 }
c4b1fcc0
FB
5644 }
5645 }
5646
5647 /* we always create at least one floppy disk */
5648 fd_table[0] = bdrv_new("fda");
5649 bdrv_set_type_hint(fd_table[0], BDRV_TYPE_FLOPPY);
5650
5651 for(i = 0; i < MAX_FD; i++) {
5652 if (fd_filename[i]) {
5653 if (!fd_table[i]) {
5654 char buf[64];
5655 snprintf(buf, sizeof(buf), "fd%c", i + 'a');
5656 fd_table[i] = bdrv_new(buf);
5657 bdrv_set_type_hint(fd_table[i], BDRV_TYPE_FLOPPY);
5658 }
5659 if (fd_filename[i] != '\0') {
5660 if (bdrv_open(fd_table[i], fd_filename[i], snapshot) < 0) {
c20709aa 5661 fprintf(stderr, "qemu: could not open floppy disk image '%s'\n",
c4b1fcc0
FB
5662 fd_filename[i]);
5663 exit(1);
5664 }
5665 }
33e3963e
FB
5666 }
5667 }
5668
6a00d601 5669 register_savevm("timer", 0, 1, timer_save, timer_load, NULL);
8a7ddc38
FB
5670 register_savevm("ram", 0, 1, ram_save, ram_load, NULL);
5671
330d0414 5672 init_ioports();
80cabfad 5673 cpu_calibrate_ticks();
0824d6fc 5674
313aa567 5675 /* terminal init */
a20dd508 5676 if (nographic) {
313aa567 5677 dumb_display_init(ds);
45a8f3ca 5678 } else if (vnc_display != -1) {
24236869 5679 vnc_display_init(ds, vnc_display);
313aa567 5680 } else {
5b0753e0 5681#if defined(CONFIG_SDL)
d63d307f 5682 sdl_display_init(ds, full_screen);
5b0753e0
FB
5683#elif defined(CONFIG_COCOA)
5684 cocoa_display_init(ds, full_screen);
313aa567
FB
5685#else
5686 dumb_display_init(ds);
5687#endif
5688 }
0824d6fc 5689
82c643ff
FB
5690 monitor_hd = qemu_chr_open(monitor_device);
5691 if (!monitor_hd) {
5692 fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
5693 exit(1);
5694 }
5695 monitor_init(monitor_hd, !nographic);
5696
8d11df9e
FB
5697 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
5698 if (serial_devices[i][0] != '\0') {
5699 serial_hds[i] = qemu_chr_open(serial_devices[i]);
5700 if (!serial_hds[i]) {
5701 fprintf(stderr, "qemu: could not open serial device '%s'\n",
5702 serial_devices[i]);
5703 exit(1);
5704 }
5705 if (!strcmp(serial_devices[i], "vc"))
5706 qemu_chr_printf(serial_hds[i], "serial%d console\n", i);
5707 }
82c643ff 5708 }
82c643ff 5709
6508fe59
FB
5710 for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
5711 if (parallel_devices[i][0] != '\0') {
5712 parallel_hds[i] = qemu_chr_open(parallel_devices[i]);
5713 if (!parallel_hds[i]) {
5714 fprintf(stderr, "qemu: could not open parallel device '%s'\n",
5715 parallel_devices[i]);
5716 exit(1);
5717 }
5718 if (!strcmp(parallel_devices[i], "vc"))
5719 qemu_chr_printf(parallel_hds[i], "parallel%d console\n", i);
5720 }
5721 }
5722
0824d6fc 5723 /* setup cpu signal handlers for MMU / self modifying code handling */
77fef8c1 5724#if !defined(CONFIG_SOFTMMU)
8a7ddc38 5725
77fef8c1
FB
5726#if defined (TARGET_I386) && defined(USE_CODE_COPY)
5727 {
5728 stack_t stk;
73332e5c 5729 signal_stack = memalign(16, SIGNAL_STACK_SIZE);
77fef8c1
FB
5730 stk.ss_sp = signal_stack;
5731 stk.ss_size = SIGNAL_STACK_SIZE;
5732 stk.ss_flags = 0;
5733
5734 if (sigaltstack(&stk, NULL) < 0) {
5735 perror("sigaltstack");
5736 exit(1);
5737 }
5738 }
5739#endif
8a7ddc38
FB
5740 {
5741 struct sigaction act;
77fef8c1 5742
8a7ddc38
FB
5743 sigfillset(&act.sa_mask);
5744 act.sa_flags = SA_SIGINFO;
77fef8c1 5745#if defined (TARGET_I386) && defined(USE_CODE_COPY)
8a7ddc38 5746 act.sa_flags |= SA_ONSTACK;
77fef8c1 5747#endif
8a7ddc38
FB
5748 act.sa_sigaction = host_segv_handler;
5749 sigaction(SIGSEGV, &act, NULL);
5750 sigaction(SIGBUS, &act, NULL);
77fef8c1 5751#if defined (TARGET_I386) && defined(USE_CODE_COPY)
8a7ddc38 5752 sigaction(SIGFPE, &act, NULL);
77fef8c1 5753#endif
8a7ddc38 5754 }
3a51dee6 5755#endif
0824d6fc 5756
67b915a5 5757#ifndef _WIN32
8a7ddc38
FB
5758 {
5759 struct sigaction act;
5760 sigfillset(&act.sa_mask);
5761 act.sa_flags = 0;
5762 act.sa_handler = SIG_IGN;
5763 sigaction(SIGPIPE, &act, NULL);
5764 }
67b915a5 5765#endif
73332e5c
FB
5766 init_timers();
5767
cc1daa40
FB
5768 machine->init(ram_size, vga_ram_size, boot_device,
5769 ds, fd_filename, snapshot,
5770 kernel_filename, kernel_cmdline, initrd_filename);
73332e5c 5771
0d92ed30
PB
5772 /* init USB devices */
5773 if (usb_enabled) {
5774 for(i = 0; i < usb_devices_index; i++) {
5775 if (usb_device_add(usb_devices[i]) < 0) {
5776 fprintf(stderr, "Warning: could not add USB device %s\n",
5777 usb_devices[i]);
5778 }
5779 }
5780 }
5781
8a7ddc38
FB
5782 gui_timer = qemu_new_timer(rt_clock, gui_update, NULL);
5783 qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock));
7f7f9873 5784
67b915a5 5785#ifdef CONFIG_GDBSTUB
b4608c04 5786 if (use_gdbstub) {
8a7ddc38
FB
5787 if (gdbserver_start(gdbstub_port) < 0) {
5788 fprintf(stderr, "Could not open gdbserver socket on port %d\n",
5789 gdbstub_port);
5790 exit(1);
5791 } else {
5792 printf("Waiting gdb connection on port %d\n", gdbstub_port);
5793 }
67b915a5
FB
5794 } else
5795#endif
d63d307f
FB
5796 if (loadvm)
5797 qemu_loadvm(loadvm);
5798
67b915a5 5799 {
5905b2e5
FB
5800 /* XXX: simplify init */
5801 read_passwords();
5802 if (start_emulation) {
5803 vm_start();
5804 }
0824d6fc 5805 }
8a7ddc38 5806 main_loop();
40c3bac3 5807 quit_timers();
0824d6fc
FB
5808 return 0;
5809}