Statistics
| Branch: | Revision:

root / vl.c @ b6741956

History | View | Annotate | Download (222.5 kB)

1 0824d6fc bellard
/*
2 80cabfad bellard
 * QEMU System Emulator
3 5fafdf24 ths
 *
4 84f2e8ef bellard
 * Copyright (c) 2003-2007 Fabrice Bellard
5 5fafdf24 ths
 *
6 1df912cf bellard
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 1df912cf bellard
 * of this software and associated documentation files (the "Software"), to deal
8 1df912cf bellard
 * in the Software without restriction, including without limitation the rights
9 1df912cf bellard
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 1df912cf bellard
 * copies of the Software, and to permit persons to whom the Software is
11 1df912cf bellard
 * furnished to do so, subject to the following conditions:
12 1df912cf bellard
 *
13 1df912cf bellard
 * The above copyright notice and this permission notice shall be included in
14 1df912cf bellard
 * all copies or substantial portions of the Software.
15 1df912cf bellard
 *
16 1df912cf bellard
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 1df912cf bellard
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 1df912cf bellard
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 1df912cf bellard
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 1df912cf bellard
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 1df912cf bellard
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 1df912cf bellard
 * THE SOFTWARE.
23 0824d6fc bellard
 */
24 67b915a5 bellard
#include "vl.h"
25 67b915a5 bellard
26 0824d6fc bellard
#include <unistd.h>
27 0824d6fc bellard
#include <fcntl.h>
28 0824d6fc bellard
#include <signal.h>
29 0824d6fc bellard
#include <time.h>
30 0824d6fc bellard
#include <errno.h>
31 67b915a5 bellard
#include <sys/time.h>
32 c88676f8 bellard
#include <zlib.h>
33 67b915a5 bellard
34 67b915a5 bellard
#ifndef _WIN32
35 67b915a5 bellard
#include <sys/times.h>
36 f1510b2c bellard
#include <sys/wait.h>
37 67b915a5 bellard
#include <termios.h>
38 67b915a5 bellard
#include <sys/poll.h>
39 67b915a5 bellard
#include <sys/mman.h>
40 f1510b2c bellard
#include <sys/ioctl.h>
41 f1510b2c bellard
#include <sys/socket.h>
42 c94c8d64 bellard
#include <netinet/in.h>
43 9d728e8c bellard
#include <dirent.h>
44 7c9d8e07 bellard
#include <netdb.h>
45 cb4b976b ths
#include <sys/select.h>
46 cb4b976b ths
#include <arpa/inet.h>
47 7d3505c5 bellard
#ifdef _BSD
48 7d3505c5 bellard
#include <sys/stat.h>
49 83fb7adf bellard
#ifndef __APPLE__
50 7d3505c5 bellard
#include <libutil.h>
51 83fb7adf bellard
#endif
52 5c40d2bd ths
#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
53 5c40d2bd ths
#include <freebsd/stdlib.h>
54 7d3505c5 bellard
#else
55 ec530c81 bellard
#ifndef __sun__
56 f1510b2c bellard
#include <linux/if.h>
57 f1510b2c bellard
#include <linux/if_tun.h>
58 7d3505c5 bellard
#include <pty.h>
59 7d3505c5 bellard
#include <malloc.h>
60 fd872598 bellard
#include <linux/rtc.h>
61 bd494f4c ths
62 bd494f4c ths
/* For the benefit of older linux systems which don't supply it,
63 bd494f4c ths
   we use a local copy of hpet.h. */
64 bd494f4c ths
/* #include <linux/hpet.h> */
65 bd494f4c ths
#include "hpet.h"
66 bd494f4c ths
67 e57a8c0e bellard
#include <linux/ppdev.h>
68 5867c88a ths
#include <linux/parport.h>
69 d5d10bc3 ths
#else
70 d5d10bc3 ths
#include <sys/stat.h>
71 d5d10bc3 ths
#include <sys/ethernet.h>
72 d5d10bc3 ths
#include <sys/sockio.h>
73 d5d10bc3 ths
#include <netinet/arp.h>
74 d5d10bc3 ths
#include <netinet/in.h>
75 d5d10bc3 ths
#include <netinet/in_systm.h>
76 d5d10bc3 ths
#include <netinet/ip.h>
77 d5d10bc3 ths
#include <netinet/ip_icmp.h> // must come after ip.h
78 d5d10bc3 ths
#include <netinet/udp.h>
79 d5d10bc3 ths
#include <netinet/tcp.h>
80 d5d10bc3 ths
#include <net/if.h>
81 d5d10bc3 ths
#include <syslog.h>
82 d5d10bc3 ths
#include <stropts.h>
83 67b915a5 bellard
#endif
84 7d3505c5 bellard
#endif
85 cb4b976b ths
#else
86 cb4b976b ths
#include <winsock2.h>
87 cb4b976b ths
int inet_aton(const char *cp, struct in_addr *ia);
88 ec530c81 bellard
#endif
89 67b915a5 bellard
90 c20709aa bellard
#if defined(CONFIG_SLIRP)
91 c20709aa bellard
#include "libslirp.h"
92 c20709aa bellard
#endif
93 c20709aa bellard
94 67b915a5 bellard
#ifdef _WIN32
95 7d3505c5 bellard
#include <malloc.h>
96 67b915a5 bellard
#include <sys/timeb.h>
97 67b915a5 bellard
#include <windows.h>
98 67b915a5 bellard
#define getopt_long_only getopt_long
99 67b915a5 bellard
#define memalign(align, size) malloc(size)
100 67b915a5 bellard
#endif
101 67b915a5 bellard
102 6ca957f0 bellard
#include "qemu_socket.h"
103 6ca957f0 bellard
104 73332e5c bellard
#ifdef CONFIG_SDL
105 96bcd4f8 bellard
#ifdef __APPLE__
106 83fb7adf bellard
#include <SDL/SDL.h>
107 96bcd4f8 bellard
#endif
108 73332e5c bellard
#endif /* CONFIG_SDL */
109 0824d6fc bellard
110 5b0753e0 bellard
#ifdef CONFIG_COCOA
111 5b0753e0 bellard
#undef main
112 5b0753e0 bellard
#define main qemu_main
113 5b0753e0 bellard
#endif /* CONFIG_COCOA */
114 5b0753e0 bellard
115 0824d6fc bellard
#include "disas.h"
116 fc01f7e7 bellard
117 8a7ddc38 bellard
#include "exec-all.h"
118 0824d6fc bellard
119 5a67135a bellard
#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
120 b46a8906 ths
#define DEFAULT_NETWORK_DOWN_SCRIPT "/etc/qemu-ifdown"
121 a14d6c8c pbrook
#ifdef __sun__
122 a14d6c8c pbrook
#define SMBD_COMMAND "/usr/sfw/sbin/smbd"
123 a14d6c8c pbrook
#else
124 a14d6c8c pbrook
#define SMBD_COMMAND "/usr/sbin/smbd"
125 a14d6c8c pbrook
#endif
126 f1510b2c bellard
127 0824d6fc bellard
//#define DEBUG_UNUSED_IOPORT
128 fd872598 bellard
//#define DEBUG_IOPORT
129 330d0414 bellard
130 bb551faa bellard
#define PHYS_RAM_MAX_SIZE (2047 * 1024 * 1024)
131 7916e224 bellard
132 77d4bc34 bellard
#ifdef TARGET_PPC
133 77d4bc34 bellard
#define DEFAULT_RAM_SIZE 144
134 77d4bc34 bellard
#else
135 1bfe856e bellard
#define DEFAULT_RAM_SIZE 128
136 77d4bc34 bellard
#endif
137 8a7ddc38 bellard
/* in ms */
138 8a7ddc38 bellard
#define GUI_REFRESH_INTERVAL 30
139 313aa567 bellard
140 0d92ed30 pbrook
/* Max number of USB devices that can be specified on the commandline.  */
141 0d92ed30 pbrook
#define MAX_USB_CMDLINE 8
142 0d92ed30 pbrook
143 7dea1da4 bellard
/* XXX: use a two level table to limit memory usage */
144 7dea1da4 bellard
#define MAX_IOPORTS 65536
145 0824d6fc bellard
146 80cabfad bellard
const char *bios_dir = CONFIG_QEMU_SHAREDIR;
147 1192dad8 j_mayer
const char *bios_name = NULL;
148 0824d6fc bellard
char phys_ram_file[1024];
149 c4b1fcc0 bellard
void *ioport_opaque[MAX_IOPORTS];
150 fc01f7e7 bellard
IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
151 fc01f7e7 bellard
IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
152 faea38e7 bellard
/* Note: bs_table[MAX_DISKS] is a dummy block driver if none available
153 faea38e7 bellard
   to store the VM snapshots */
154 faea38e7 bellard
BlockDriverState *bs_table[MAX_DISKS + 1], *fd_table[MAX_FD];
155 86f55663 j_mayer
BlockDriverState *pflash_table[MAX_PFLASH];
156 a1bb27b1 pbrook
BlockDriverState *sd_bdrv;
157 3e3d5815 balrog
BlockDriverState *mtd_bdrv;
158 faea38e7 bellard
/* point to the block driver where the snapshots are managed */
159 faea38e7 bellard
BlockDriverState *bs_snapshots;
160 313aa567 bellard
int vga_ram_size;
161 313aa567 bellard
static DisplayState display_state;
162 a20dd508 bellard
int nographic;
163 3d11d0eb bellard
const char* keyboard_layout = NULL;
164 313aa567 bellard
int64_t ticks_per_sec;
165 0ced6589 bellard
int ram_size;
166 80cabfad bellard
int pit_min_timer_count = 0;
167 c4b1fcc0 bellard
int nb_nics;
168 7c9d8e07 bellard
NICInfo nd_table[MAX_NICS];
169 8a7ddc38 bellard
int vm_running;
170 ee22c2f7 bellard
int rtc_utc = 1;
171 7e0af5d0 bellard
int rtc_start_date = -1; /* -1 means now */
172 1bfe856e bellard
int cirrus_vga_enabled = 1;
173 d34cab9f ths
int vmsvga_enabled = 0;
174 d827220b bellard
#ifdef TARGET_SPARC
175 d827220b bellard
int graphic_width = 1024;
176 d827220b bellard
int graphic_height = 768;
177 eee0b836 blueswir1
int graphic_depth = 8;
178 d827220b bellard
#else
179 1bfe856e bellard
int graphic_width = 800;
180 1bfe856e bellard
int graphic_height = 600;
181 e9b137c2 bellard
int graphic_depth = 15;
182 eee0b836 blueswir1
#endif
183 d63d307f bellard
int full_screen = 0;
184 43523e93 ths
int no_frame = 0;
185 667accab ths
int no_quit = 0;
186 8d11df9e bellard
CharDriverState *serial_hds[MAX_SERIAL_PORTS];
187 6508fe59 bellard
CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
188 a09db21f bellard
#ifdef TARGET_I386
189 a09db21f bellard
int win2k_install_hack = 0;
190 a09db21f bellard
#endif
191 bb36d470 bellard
int usb_enabled = 0;
192 7c9d8e07 bellard
static VLANState *first_vlan;
193 6a00d601 bellard
int smp_cpus = 1;
194 73fc9742 ths
const char *vnc_display;
195 d3e9db93 bellard
#if defined(TARGET_SPARC)
196 ba3c64fb bellard
#define MAX_CPUS 16
197 d3e9db93 bellard
#elif defined(TARGET_I386)
198 d3e9db93 bellard
#define MAX_CPUS 255
199 ba3c64fb bellard
#else
200 d3e9db93 bellard
#define MAX_CPUS 1
201 ba3c64fb bellard
#endif
202 6515b203 bellard
int acpi_enabled = 1;
203 52ca8d6a bellard
int fd_bootchk = 1;
204 d1beab82 bellard
int no_reboot = 0;
205 9467cd46 balrog
int cursor_hide = 1;
206 a171fe39 balrog
int graphic_rotate = 0;
207 71e3ceb8 ths
int daemonize = 0;
208 9ae02555 ths
const char *option_rom[MAX_OPTION_ROMS];
209 9ae02555 ths
int nb_option_roms;
210 8e71621f pbrook
int semihosting_enabled = 0;
211 3c07f8e8 pbrook
int autostart = 1;
212 2b8f2d41 balrog
#ifdef TARGET_ARM
213 2b8f2d41 balrog
int old_param = 0;
214 2b8f2d41 balrog
#endif
215 c35734b2 ths
const char *qemu_name;
216 3780e197 ths
int alt_grab = 0;
217 66508601 blueswir1
#ifdef TARGET_SPARC
218 66508601 blueswir1
unsigned int nb_prom_envs = 0;
219 66508601 blueswir1
const char *prom_envs[MAX_PROM_ENVS];
220 66508601 blueswir1
#endif
221 0824d6fc bellard
222 aeb30be6 balrog
#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
223 aeb30be6 balrog
224 0824d6fc bellard
/***********************************************************/
225 26aa7d72 bellard
/* x86 ISA bus support */
226 26aa7d72 bellard
227 26aa7d72 bellard
target_phys_addr_t isa_mem_base = 0;
228 3de388f6 bellard
PicState2 *isa_pic;
229 0824d6fc bellard
230 c4b1fcc0 bellard
uint32_t default_ioport_readb(void *opaque, uint32_t address)
231 0824d6fc bellard
{
232 0824d6fc bellard
#ifdef DEBUG_UNUSED_IOPORT
233 1196be37 ths
    fprintf(stderr, "unused inb: port=0x%04x\n", address);
234 0824d6fc bellard
#endif
235 fc01f7e7 bellard
    return 0xff;
236 0824d6fc bellard
}
237 0824d6fc bellard
238 c4b1fcc0 bellard
void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
239 0824d6fc bellard
{
240 0824d6fc bellard
#ifdef DEBUG_UNUSED_IOPORT
241 1196be37 ths
    fprintf(stderr, "unused outb: port=0x%04x data=0x%02x\n", address, data);
242 0824d6fc bellard
#endif
243 0824d6fc bellard
}
244 0824d6fc bellard
245 0824d6fc bellard
/* default is to make two byte accesses */
246 c4b1fcc0 bellard
uint32_t default_ioport_readw(void *opaque, uint32_t address)
247 0824d6fc bellard
{
248 0824d6fc bellard
    uint32_t data;
249 db45c29a bellard
    data = ioport_read_table[0][address](ioport_opaque[address], address);
250 db45c29a bellard
    address = (address + 1) & (MAX_IOPORTS - 1);
251 db45c29a bellard
    data |= ioport_read_table[0][address](ioport_opaque[address], address) << 8;
252 0824d6fc bellard
    return data;
253 0824d6fc bellard
}
254 0824d6fc bellard
255 c4b1fcc0 bellard
void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
256 0824d6fc bellard
{
257 db45c29a bellard
    ioport_write_table[0][address](ioport_opaque[address], address, data & 0xff);
258 db45c29a bellard
    address = (address + 1) & (MAX_IOPORTS - 1);
259 db45c29a bellard
    ioport_write_table[0][address](ioport_opaque[address], address, (data >> 8) & 0xff);
260 0824d6fc bellard
}
261 0824d6fc bellard
262 c4b1fcc0 bellard
uint32_t default_ioport_readl(void *opaque, uint32_t address)
263 0824d6fc bellard
{
264 fc01f7e7 bellard
#ifdef DEBUG_UNUSED_IOPORT
265 1196be37 ths
    fprintf(stderr, "unused inl: port=0x%04x\n", address);
266 fc01f7e7 bellard
#endif
267 fc01f7e7 bellard
    return 0xffffffff;
268 0824d6fc bellard
}
269 0824d6fc bellard
270 c4b1fcc0 bellard
void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
271 0824d6fc bellard
{
272 fc01f7e7 bellard
#ifdef DEBUG_UNUSED_IOPORT
273 1196be37 ths
    fprintf(stderr, "unused outl: port=0x%04x data=0x%02x\n", address, data);
274 fc01f7e7 bellard
#endif
275 0824d6fc bellard
}
276 0824d6fc bellard
277 fc01f7e7 bellard
void init_ioports(void)
278 0824d6fc bellard
{
279 0824d6fc bellard
    int i;
280 0824d6fc bellard
281 fc01f7e7 bellard
    for(i = 0; i < MAX_IOPORTS; i++) {
282 fc01f7e7 bellard
        ioport_read_table[0][i] = default_ioport_readb;
283 fc01f7e7 bellard
        ioport_write_table[0][i] = default_ioport_writeb;
284 fc01f7e7 bellard
        ioport_read_table[1][i] = default_ioport_readw;
285 fc01f7e7 bellard
        ioport_write_table[1][i] = default_ioport_writew;
286 fc01f7e7 bellard
        ioport_read_table[2][i] = default_ioport_readl;
287 fc01f7e7 bellard
        ioport_write_table[2][i] = default_ioport_writel;
288 fc01f7e7 bellard
    }
289 0824d6fc bellard
}
290 0824d6fc bellard
291 fc01f7e7 bellard
/* size is the word size in byte */
292 5fafdf24 ths
int register_ioport_read(int start, int length, int size,
293 c4b1fcc0 bellard
                         IOPortReadFunc *func, void *opaque)
294 f1510b2c bellard
{
295 fc01f7e7 bellard
    int i, bsize;
296 f1510b2c bellard
297 c4b1fcc0 bellard
    if (size == 1) {
298 fc01f7e7 bellard
        bsize = 0;
299 c4b1fcc0 bellard
    } else if (size == 2) {
300 fc01f7e7 bellard
        bsize = 1;
301 c4b1fcc0 bellard
    } else if (size == 4) {
302 fc01f7e7 bellard
        bsize = 2;
303 c4b1fcc0 bellard
    } else {
304 c4b1fcc0 bellard
        hw_error("register_ioport_read: invalid size");
305 fc01f7e7 bellard
        return -1;
306 c4b1fcc0 bellard
    }
307 c4b1fcc0 bellard
    for(i = start; i < start + length; i += size) {
308 fc01f7e7 bellard
        ioport_read_table[bsize][i] = func;
309 c4b1fcc0 bellard
        if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
310 c4b1fcc0 bellard
            hw_error("register_ioport_read: invalid opaque");
311 c4b1fcc0 bellard
        ioport_opaque[i] = opaque;
312 c4b1fcc0 bellard
    }
313 f1510b2c bellard
    return 0;
314 f1510b2c bellard
}
315 f1510b2c bellard
316 fc01f7e7 bellard
/* size is the word size in byte */
317 5fafdf24 ths
int register_ioport_write(int start, int length, int size,
318 c4b1fcc0 bellard
                          IOPortWriteFunc *func, void *opaque)
319 f1510b2c bellard
{
320 fc01f7e7 bellard
    int i, bsize;
321 f1510b2c bellard
322 c4b1fcc0 bellard
    if (size == 1) {
323 fc01f7e7 bellard
        bsize = 0;
324 c4b1fcc0 bellard
    } else if (size == 2) {
325 fc01f7e7 bellard
        bsize = 1;
326 c4b1fcc0 bellard
    } else if (size == 4) {
327 fc01f7e7 bellard
        bsize = 2;
328 c4b1fcc0 bellard
    } else {
329 c4b1fcc0 bellard
        hw_error("register_ioport_write: invalid size");
330 fc01f7e7 bellard
        return -1;
331 c4b1fcc0 bellard
    }
332 c4b1fcc0 bellard
    for(i = start; i < start + length; i += size) {
333 fc01f7e7 bellard
        ioport_write_table[bsize][i] = func;
334 c4b1fcc0 bellard
        if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
335 52f61fde ths
            hw_error("register_ioport_write: invalid opaque");
336 c4b1fcc0 bellard
        ioport_opaque[i] = opaque;
337 c4b1fcc0 bellard
    }
338 f1510b2c bellard
    return 0;
339 f1510b2c bellard
}
340 f1510b2c bellard
341 69b91039 bellard
void isa_unassign_ioport(int start, int length)
342 69b91039 bellard
{
343 69b91039 bellard
    int i;
344 69b91039 bellard
345 69b91039 bellard
    for(i = start; i < start + length; i++) {
346 69b91039 bellard
        ioport_read_table[0][i] = default_ioport_readb;
347 69b91039 bellard
        ioport_read_table[1][i] = default_ioport_readw;
348 69b91039 bellard
        ioport_read_table[2][i] = default_ioport_readl;
349 69b91039 bellard
350 69b91039 bellard
        ioport_write_table[0][i] = default_ioport_writeb;
351 69b91039 bellard
        ioport_write_table[1][i] = default_ioport_writew;
352 69b91039 bellard
        ioport_write_table[2][i] = default_ioport_writel;
353 69b91039 bellard
    }
354 69b91039 bellard
}
355 69b91039 bellard
356 20f32282 bellard
/***********************************************************/
357 20f32282 bellard
358 c45886db bellard
void cpu_outb(CPUState *env, int addr, int val)
359 0824d6fc bellard
{
360 fd872598 bellard
#ifdef DEBUG_IOPORT
361 fd872598 bellard
    if (loglevel & CPU_LOG_IOPORT)
362 fd872598 bellard
        fprintf(logfile, "outb: %04x %02x\n", addr, val);
363 3b46e624 ths
#endif
364 c4b1fcc0 bellard
    ioport_write_table[0][addr](ioport_opaque[addr], addr, val);
365 89bfc105 bellard
#ifdef USE_KQEMU
366 89bfc105 bellard
    if (env)
367 89bfc105 bellard
        env->last_io_time = cpu_get_time_fast();
368 89bfc105 bellard
#endif
369 0824d6fc bellard
}
370 0824d6fc bellard
371 c45886db bellard
void cpu_outw(CPUState *env, int addr, int val)
372 0824d6fc bellard
{
373 fd872598 bellard
#ifdef DEBUG_IOPORT
374 fd872598 bellard
    if (loglevel & CPU_LOG_IOPORT)
375 fd872598 bellard
        fprintf(logfile, "outw: %04x %04x\n", addr, val);
376 3b46e624 ths
#endif
377 c4b1fcc0 bellard
    ioport_write_table[1][addr](ioport_opaque[addr], addr, val);
378 89bfc105 bellard
#ifdef USE_KQEMU
379 89bfc105 bellard
    if (env)
380 89bfc105 bellard
        env->last_io_time = cpu_get_time_fast();
381 89bfc105 bellard
#endif
382 0824d6fc bellard
}
383 0824d6fc bellard
384 c45886db bellard
void cpu_outl(CPUState *env, int addr, int val)
385 0824d6fc bellard
{
386 fd872598 bellard
#ifdef DEBUG_IOPORT
387 fd872598 bellard
    if (loglevel & CPU_LOG_IOPORT)
388 fd872598 bellard
        fprintf(logfile, "outl: %04x %08x\n", addr, val);
389 fd872598 bellard
#endif
390 c4b1fcc0 bellard
    ioport_write_table[2][addr](ioport_opaque[addr], addr, val);
391 89bfc105 bellard
#ifdef USE_KQEMU
392 89bfc105 bellard
    if (env)
393 89bfc105 bellard
        env->last_io_time = cpu_get_time_fast();
394 89bfc105 bellard
#endif
395 0824d6fc bellard
}
396 0824d6fc bellard
397 c45886db bellard
int cpu_inb(CPUState *env, int addr)
398 0824d6fc bellard
{
399 fd872598 bellard
    int val;
400 fd872598 bellard
    val = ioport_read_table[0][addr](ioport_opaque[addr], addr);
401 fd872598 bellard
#ifdef DEBUG_IOPORT
402 fd872598 bellard
    if (loglevel & CPU_LOG_IOPORT)
403 fd872598 bellard
        fprintf(logfile, "inb : %04x %02x\n", addr, val);
404 fd872598 bellard
#endif
405 89bfc105 bellard
#ifdef USE_KQEMU
406 89bfc105 bellard
    if (env)
407 89bfc105 bellard
        env->last_io_time = cpu_get_time_fast();
408 89bfc105 bellard
#endif
409 fd872598 bellard
    return val;
410 0824d6fc bellard
}
411 0824d6fc bellard
412 c45886db bellard
int cpu_inw(CPUState *env, int addr)
413 0824d6fc bellard
{
414 fd872598 bellard
    int val;
415 fd872598 bellard
    val = ioport_read_table[1][addr](ioport_opaque[addr], addr);
416 fd872598 bellard
#ifdef DEBUG_IOPORT
417 fd872598 bellard
    if (loglevel & CPU_LOG_IOPORT)
418 fd872598 bellard
        fprintf(logfile, "inw : %04x %04x\n", addr, val);
419 fd872598 bellard
#endif
420 89bfc105 bellard
#ifdef USE_KQEMU
421 89bfc105 bellard
    if (env)
422 89bfc105 bellard
        env->last_io_time = cpu_get_time_fast();
423 89bfc105 bellard
#endif
424 fd872598 bellard
    return val;
425 0824d6fc bellard
}
426 0824d6fc bellard
427 c45886db bellard
int cpu_inl(CPUState *env, int addr)
428 0824d6fc bellard
{
429 fd872598 bellard
    int val;
430 fd872598 bellard
    val = ioport_read_table[2][addr](ioport_opaque[addr], addr);
431 fd872598 bellard
#ifdef DEBUG_IOPORT
432 fd872598 bellard
    if (loglevel & CPU_LOG_IOPORT)
433 fd872598 bellard
        fprintf(logfile, "inl : %04x %08x\n", addr, val);
434 fd872598 bellard
#endif
435 89bfc105 bellard
#ifdef USE_KQEMU
436 89bfc105 bellard
    if (env)
437 89bfc105 bellard
        env->last_io_time = cpu_get_time_fast();
438 89bfc105 bellard
#endif
439 fd872598 bellard
    return val;
440 0824d6fc bellard
}
441 0824d6fc bellard
442 0824d6fc bellard
/***********************************************************/
443 0824d6fc bellard
void hw_error(const char *fmt, ...)
444 0824d6fc bellard
{
445 0824d6fc bellard
    va_list ap;
446 6a00d601 bellard
    CPUState *env;
447 0824d6fc bellard
448 0824d6fc bellard
    va_start(ap, fmt);
449 0824d6fc bellard
    fprintf(stderr, "qemu: hardware error: ");
450 0824d6fc bellard
    vfprintf(stderr, fmt, ap);
451 0824d6fc bellard
    fprintf(stderr, "\n");
452 6a00d601 bellard
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
453 6a00d601 bellard
        fprintf(stderr, "CPU #%d:\n", env->cpu_index);
454 0824d6fc bellard
#ifdef TARGET_I386
455 6a00d601 bellard
        cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
456 c45886db bellard
#else
457 6a00d601 bellard
        cpu_dump_state(env, stderr, fprintf, 0);
458 0824d6fc bellard
#endif
459 6a00d601 bellard
    }
460 0824d6fc bellard
    va_end(ap);
461 0824d6fc bellard
    abort();
462 0824d6fc bellard
}
463 0824d6fc bellard
464 8a7ddc38 bellard
/***********************************************************/
465 63066f4f bellard
/* keyboard/mouse */
466 63066f4f bellard
467 63066f4f bellard
static QEMUPutKBDEvent *qemu_put_kbd_event;
468 63066f4f bellard
static void *qemu_put_kbd_event_opaque;
469 455204eb ths
static QEMUPutMouseEntry *qemu_put_mouse_event_head;
470 455204eb ths
static QEMUPutMouseEntry *qemu_put_mouse_event_current;
471 63066f4f bellard
472 63066f4f bellard
void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
473 63066f4f bellard
{
474 63066f4f bellard
    qemu_put_kbd_event_opaque = opaque;
475 63066f4f bellard
    qemu_put_kbd_event = func;
476 63066f4f bellard
}
477 63066f4f bellard
478 455204eb ths
QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
479 455204eb ths
                                                void *opaque, int absolute,
480 455204eb ths
                                                const char *name)
481 63066f4f bellard
{
482 455204eb ths
    QEMUPutMouseEntry *s, *cursor;
483 455204eb ths
484 455204eb ths
    s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
485 455204eb ths
    if (!s)
486 455204eb ths
        return NULL;
487 455204eb ths
488 455204eb ths
    s->qemu_put_mouse_event = func;
489 455204eb ths
    s->qemu_put_mouse_event_opaque = opaque;
490 455204eb ths
    s->qemu_put_mouse_event_absolute = absolute;
491 455204eb ths
    s->qemu_put_mouse_event_name = qemu_strdup(name);
492 455204eb ths
    s->next = NULL;
493 455204eb ths
494 455204eb ths
    if (!qemu_put_mouse_event_head) {
495 455204eb ths
        qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
496 455204eb ths
        return s;
497 455204eb ths
    }
498 455204eb ths
499 455204eb ths
    cursor = qemu_put_mouse_event_head;
500 455204eb ths
    while (cursor->next != NULL)
501 455204eb ths
        cursor = cursor->next;
502 455204eb ths
503 455204eb ths
    cursor->next = s;
504 455204eb ths
    qemu_put_mouse_event_current = s;
505 455204eb ths
506 455204eb ths
    return s;
507 455204eb ths
}
508 455204eb ths
509 455204eb ths
void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
510 455204eb ths
{
511 455204eb ths
    QEMUPutMouseEntry *prev = NULL, *cursor;
512 455204eb ths
513 455204eb ths
    if (!qemu_put_mouse_event_head || entry == NULL)
514 455204eb ths
        return;
515 455204eb ths
516 455204eb ths
    cursor = qemu_put_mouse_event_head;
517 455204eb ths
    while (cursor != NULL && cursor != entry) {
518 455204eb ths
        prev = cursor;
519 455204eb ths
        cursor = cursor->next;
520 455204eb ths
    }
521 455204eb ths
522 455204eb ths
    if (cursor == NULL) // does not exist or list empty
523 455204eb ths
        return;
524 455204eb ths
    else if (prev == NULL) { // entry is head
525 455204eb ths
        qemu_put_mouse_event_head = cursor->next;
526 455204eb ths
        if (qemu_put_mouse_event_current == entry)
527 455204eb ths
            qemu_put_mouse_event_current = cursor->next;
528 455204eb ths
        qemu_free(entry->qemu_put_mouse_event_name);
529 455204eb ths
        qemu_free(entry);
530 455204eb ths
        return;
531 455204eb ths
    }
532 455204eb ths
533 455204eb ths
    prev->next = entry->next;
534 455204eb ths
535 455204eb ths
    if (qemu_put_mouse_event_current == entry)
536 455204eb ths
        qemu_put_mouse_event_current = prev;
537 455204eb ths
538 455204eb ths
    qemu_free(entry->qemu_put_mouse_event_name);
539 455204eb ths
    qemu_free(entry);
540 63066f4f bellard
}
541 63066f4f bellard
542 63066f4f bellard
void kbd_put_keycode(int keycode)
543 63066f4f bellard
{
544 63066f4f bellard
    if (qemu_put_kbd_event) {
545 63066f4f bellard
        qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
546 63066f4f bellard
    }
547 63066f4f bellard
}
548 63066f4f bellard
549 63066f4f bellard
void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
550 63066f4f bellard
{
551 455204eb ths
    QEMUPutMouseEvent *mouse_event;
552 455204eb ths
    void *mouse_event_opaque;
553 a171fe39 balrog
    int width;
554 455204eb ths
555 455204eb ths
    if (!qemu_put_mouse_event_current) {
556 455204eb ths
        return;
557 455204eb ths
    }
558 455204eb ths
559 455204eb ths
    mouse_event =
560 455204eb ths
        qemu_put_mouse_event_current->qemu_put_mouse_event;
561 455204eb ths
    mouse_event_opaque =
562 455204eb ths
        qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;
563 455204eb ths
564 455204eb ths
    if (mouse_event) {
565 a171fe39 balrog
        if (graphic_rotate) {
566 a171fe39 balrog
            if (qemu_put_mouse_event_current->qemu_put_mouse_event_absolute)
567 a171fe39 balrog
                width = 0x7fff;
568 a171fe39 balrog
            else
569 a171fe39 balrog
                width = graphic_width;
570 a171fe39 balrog
            mouse_event(mouse_event_opaque,
571 a171fe39 balrog
                                 width - dy, dx, dz, buttons_state);
572 a171fe39 balrog
        } else
573 a171fe39 balrog
            mouse_event(mouse_event_opaque,
574 a171fe39 balrog
                                 dx, dy, dz, buttons_state);
575 63066f4f bellard
    }
576 63066f4f bellard
}
577 63066f4f bellard
578 09b26c5e bellard
int kbd_mouse_is_absolute(void)
579 09b26c5e bellard
{
580 455204eb ths
    if (!qemu_put_mouse_event_current)
581 455204eb ths
        return 0;
582 455204eb ths
583 455204eb ths
    return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
584 455204eb ths
}
585 455204eb ths
586 455204eb ths
void do_info_mice(void)
587 455204eb ths
{
588 455204eb ths
    QEMUPutMouseEntry *cursor;
589 455204eb ths
    int index = 0;
590 455204eb ths
591 455204eb ths
    if (!qemu_put_mouse_event_head) {
592 455204eb ths
        term_printf("No mouse devices connected\n");
593 455204eb ths
        return;
594 455204eb ths
    }
595 455204eb ths
596 455204eb ths
    term_printf("Mouse devices available:\n");
597 455204eb ths
    cursor = qemu_put_mouse_event_head;
598 455204eb ths
    while (cursor != NULL) {
599 455204eb ths
        term_printf("%c Mouse #%d: %s\n",
600 455204eb ths
                    (cursor == qemu_put_mouse_event_current ? '*' : ' '),
601 455204eb ths
                    index, cursor->qemu_put_mouse_event_name);
602 455204eb ths
        index++;
603 455204eb ths
        cursor = cursor->next;
604 455204eb ths
    }
605 455204eb ths
}
606 455204eb ths
607 455204eb ths
void do_mouse_set(int index)
608 455204eb ths
{
609 455204eb ths
    QEMUPutMouseEntry *cursor;
610 455204eb ths
    int i = 0;
611 455204eb ths
612 455204eb ths
    if (!qemu_put_mouse_event_head) {
613 455204eb ths
        term_printf("No mouse devices connected\n");
614 455204eb ths
        return;
615 455204eb ths
    }
616 455204eb ths
617 455204eb ths
    cursor = qemu_put_mouse_event_head;
618 455204eb ths
    while (cursor != NULL && index != i) {
619 455204eb ths
        i++;
620 455204eb ths
        cursor = cursor->next;
621 455204eb ths
    }
622 455204eb ths
623 455204eb ths
    if (cursor != NULL)
624 455204eb ths
        qemu_put_mouse_event_current = cursor;
625 455204eb ths
    else
626 455204eb ths
        term_printf("Mouse at given index not found\n");
627 09b26c5e bellard
}
628 09b26c5e bellard
629 1dce7c3c bellard
/* compute with 96 bit intermediate result: (a*b)/c */
630 1dce7c3c bellard
uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
631 0824d6fc bellard
{
632 1dce7c3c bellard
    union {
633 1dce7c3c bellard
        uint64_t ll;
634 1dce7c3c bellard
        struct {
635 1dce7c3c bellard
#ifdef WORDS_BIGENDIAN
636 1dce7c3c bellard
            uint32_t high, low;
637 1dce7c3c bellard
#else
638 1dce7c3c bellard
            uint32_t low, high;
639 3b46e624 ths
#endif
640 1dce7c3c bellard
        } l;
641 1dce7c3c bellard
    } u, res;
642 1dce7c3c bellard
    uint64_t rl, rh;
643 0824d6fc bellard
644 1dce7c3c bellard
    u.ll = a;
645 1dce7c3c bellard
    rl = (uint64_t)u.l.low * (uint64_t)b;
646 1dce7c3c bellard
    rh = (uint64_t)u.l.high * (uint64_t)b;
647 1dce7c3c bellard
    rh += (rl >> 32);
648 1dce7c3c bellard
    res.l.high = rh / c;
649 1dce7c3c bellard
    res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
650 1dce7c3c bellard
    return res.ll;
651 34865134 bellard
}
652 34865134 bellard
653 1dce7c3c bellard
/***********************************************************/
654 1dce7c3c bellard
/* real time host monotonic timer */
655 34865134 bellard
656 1dce7c3c bellard
#define QEMU_TIMER_BASE 1000000000LL
657 34865134 bellard
658 1dce7c3c bellard
#ifdef WIN32
659 0824d6fc bellard
660 1dce7c3c bellard
static int64_t clock_freq;
661 1115dde7 bellard
662 1dce7c3c bellard
static void init_get_clock(void)
663 1115dde7 bellard
{
664 a8e5ac33 bellard
    LARGE_INTEGER freq;
665 a8e5ac33 bellard
    int ret;
666 1dce7c3c bellard
    ret = QueryPerformanceFrequency(&freq);
667 1dce7c3c bellard
    if (ret == 0) {
668 1dce7c3c bellard
        fprintf(stderr, "Could not calibrate ticks\n");
669 1dce7c3c bellard
        exit(1);
670 1dce7c3c bellard
    }
671 1dce7c3c bellard
    clock_freq = freq.QuadPart;
672 1115dde7 bellard
}
673 1115dde7 bellard
674 1dce7c3c bellard
static int64_t get_clock(void)
675 b8076a74 bellard
{
676 1dce7c3c bellard
    LARGE_INTEGER ti;
677 1dce7c3c bellard
    QueryPerformanceCounter(&ti);
678 1dce7c3c bellard
    return muldiv64(ti.QuadPart, QEMU_TIMER_BASE, clock_freq);
679 b8076a74 bellard
}
680 b8076a74 bellard
681 1dce7c3c bellard
#else
682 90cb9493 bellard
683 1dce7c3c bellard
static int use_rt_clock;
684 1dce7c3c bellard
685 1dce7c3c bellard
static void init_get_clock(void)
686 90cb9493 bellard
{
687 1dce7c3c bellard
    use_rt_clock = 0;
688 1dce7c3c bellard
#if defined(__linux__)
689 1dce7c3c bellard
    {
690 1dce7c3c bellard
        struct timespec ts;
691 1dce7c3c bellard
        if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
692 1dce7c3c bellard
            use_rt_clock = 1;
693 1dce7c3c bellard
        }
694 1dce7c3c bellard
    }
695 1dce7c3c bellard
#endif
696 90cb9493 bellard
}
697 90cb9493 bellard
698 1dce7c3c bellard
static int64_t get_clock(void)
699 fdbb4691 bellard
{
700 1dce7c3c bellard
#if defined(__linux__)
701 1dce7c3c bellard
    if (use_rt_clock) {
702 1dce7c3c bellard
        struct timespec ts;
703 1dce7c3c bellard
        clock_gettime(CLOCK_MONOTONIC, &ts);
704 1dce7c3c bellard
        return ts.tv_sec * 1000000000LL + ts.tv_nsec;
705 5fafdf24 ths
    } else
706 fdbb4691 bellard
#endif
707 1dce7c3c bellard
    {
708 1dce7c3c bellard
        /* XXX: using gettimeofday leads to problems if the date
709 1dce7c3c bellard
           changes, so it should be avoided. */
710 1dce7c3c bellard
        struct timeval tv;
711 1dce7c3c bellard
        gettimeofday(&tv, NULL);
712 1dce7c3c bellard
        return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
713 1dce7c3c bellard
    }
714 fdbb4691 bellard
}
715 fdbb4691 bellard
716 34865134 bellard
#endif
717 34865134 bellard
718 1dce7c3c bellard
/***********************************************************/
719 1dce7c3c bellard
/* guest cycle counter */
720 1dce7c3c bellard
721 eade0f19 bellard
static int64_t cpu_ticks_prev;
722 34865134 bellard
static int64_t cpu_ticks_offset;
723 1dce7c3c bellard
static int64_t cpu_clock_offset;
724 8a7ddc38 bellard
static int cpu_ticks_enabled;
725 34865134 bellard
726 1dce7c3c bellard
/* return the host CPU cycle counter and handle stop/restart */
727 1dce7c3c bellard
int64_t cpu_get_ticks(void)
728 34865134 bellard
{
729 8a7ddc38 bellard
    if (!cpu_ticks_enabled) {
730 8a7ddc38 bellard
        return cpu_ticks_offset;
731 8a7ddc38 bellard
    } else {
732 eade0f19 bellard
        int64_t ticks;
733 eade0f19 bellard
        ticks = cpu_get_real_ticks();
734 eade0f19 bellard
        if (cpu_ticks_prev > ticks) {
735 eade0f19 bellard
            /* Note: non increasing ticks may happen if the host uses
736 eade0f19 bellard
               software suspend */
737 eade0f19 bellard
            cpu_ticks_offset += cpu_ticks_prev - ticks;
738 eade0f19 bellard
        }
739 eade0f19 bellard
        cpu_ticks_prev = ticks;
740 eade0f19 bellard
        return ticks + cpu_ticks_offset;
741 8a7ddc38 bellard
    }
742 34865134 bellard
}
743 34865134 bellard
744 1dce7c3c bellard
/* return the host CPU monotonic timer and handle stop/restart */
745 1dce7c3c bellard
static int64_t cpu_get_clock(void)
746 1dce7c3c bellard
{
747 1dce7c3c bellard
    int64_t ti;
748 1dce7c3c bellard
    if (!cpu_ticks_enabled) {
749 1dce7c3c bellard
        return cpu_clock_offset;
750 1dce7c3c bellard
    } else {
751 1dce7c3c bellard
        ti = get_clock();
752 1dce7c3c bellard
        return ti + cpu_clock_offset;
753 1dce7c3c bellard
    }
754 1dce7c3c bellard
}
755 1dce7c3c bellard
756 34865134 bellard
/* enable cpu_get_ticks() */
757 34865134 bellard
void cpu_enable_ticks(void)
758 34865134 bellard
{
759 8a7ddc38 bellard
    if (!cpu_ticks_enabled) {
760 8a7ddc38 bellard
        cpu_ticks_offset -= cpu_get_real_ticks();
761 1dce7c3c bellard
        cpu_clock_offset -= get_clock();
762 8a7ddc38 bellard
        cpu_ticks_enabled = 1;
763 8a7ddc38 bellard
    }
764 34865134 bellard
}
765 34865134 bellard
766 34865134 bellard
/* disable cpu_get_ticks() : the clock is stopped. You must not call
767 34865134 bellard
   cpu_get_ticks() after that.  */
768 34865134 bellard
void cpu_disable_ticks(void)
769 34865134 bellard
{
770 8a7ddc38 bellard
    if (cpu_ticks_enabled) {
771 8a7ddc38 bellard
        cpu_ticks_offset = cpu_get_ticks();
772 1dce7c3c bellard
        cpu_clock_offset = cpu_get_clock();
773 8a7ddc38 bellard
        cpu_ticks_enabled = 0;
774 8a7ddc38 bellard
    }
775 34865134 bellard
}
776 34865134 bellard
777 1dce7c3c bellard
/***********************************************************/
778 1dce7c3c bellard
/* timers */
779 5fafdf24 ths
780 8a7ddc38 bellard
#define QEMU_TIMER_REALTIME 0
781 8a7ddc38 bellard
#define QEMU_TIMER_VIRTUAL  1
782 8a7ddc38 bellard
783 8a7ddc38 bellard
struct QEMUClock {
784 8a7ddc38 bellard
    int type;
785 8a7ddc38 bellard
    /* XXX: add frequency */
786 8a7ddc38 bellard
};
787 8a7ddc38 bellard
788 8a7ddc38 bellard
struct QEMUTimer {
789 8a7ddc38 bellard
    QEMUClock *clock;
790 8a7ddc38 bellard
    int64_t expire_time;
791 8a7ddc38 bellard
    QEMUTimerCB *cb;
792 8a7ddc38 bellard
    void *opaque;
793 8a7ddc38 bellard
    struct QEMUTimer *next;
794 8a7ddc38 bellard
};
795 8a7ddc38 bellard
796 c8994013 ths
struct qemu_alarm_timer {
797 c8994013 ths
    char const *name;
798 efe75411 ths
    unsigned int flags;
799 c8994013 ths
800 c8994013 ths
    int (*start)(struct qemu_alarm_timer *t);
801 c8994013 ths
    void (*stop)(struct qemu_alarm_timer *t);
802 efe75411 ths
    void (*rearm)(struct qemu_alarm_timer *t);
803 c8994013 ths
    void *priv;
804 c8994013 ths
};
805 c8994013 ths
806 efe75411 ths
#define ALARM_FLAG_DYNTICKS  0x1
807 efe75411 ths
808 efe75411 ths
static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
809 efe75411 ths
{
810 efe75411 ths
    return t->flags & ALARM_FLAG_DYNTICKS;
811 efe75411 ths
}
812 efe75411 ths
813 efe75411 ths
static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
814 efe75411 ths
{
815 efe75411 ths
    if (!alarm_has_dynticks(t))
816 efe75411 ths
        return;
817 efe75411 ths
818 efe75411 ths
    t->rearm(t);
819 efe75411 ths
}
820 efe75411 ths
821 efe75411 ths
/* TODO: MIN_TIMER_REARM_US should be optimized */
822 efe75411 ths
#define MIN_TIMER_REARM_US 250
823 efe75411 ths
824 c8994013 ths
static struct qemu_alarm_timer *alarm_timer;
825 8a7ddc38 bellard
826 40c3bac3 bellard
#ifdef _WIN32
827 c8994013 ths
828 c8994013 ths
struct qemu_alarm_win32 {
829 c8994013 ths
    MMRESULT timerId;
830 c8994013 ths
    HANDLE host_alarm;
831 c8994013 ths
    unsigned int period;
832 c8994013 ths
} alarm_win32_data = {0, NULL, -1};
833 c8994013 ths
834 c8994013 ths
static int win32_start_timer(struct qemu_alarm_timer *t);
835 c8994013 ths
static void win32_stop_timer(struct qemu_alarm_timer *t);
836 efe75411 ths
static void win32_rearm_timer(struct qemu_alarm_timer *t);
837 c8994013 ths
838 40c3bac3 bellard
#else
839 c8994013 ths
840 c8994013 ths
static int unix_start_timer(struct qemu_alarm_timer *t);
841 c8994013 ths
static void unix_stop_timer(struct qemu_alarm_timer *t);
842 c8994013 ths
843 231c6586 ths
#ifdef __linux__
844 231c6586 ths
845 efe75411 ths
static int dynticks_start_timer(struct qemu_alarm_timer *t);
846 efe75411 ths
static void dynticks_stop_timer(struct qemu_alarm_timer *t);
847 efe75411 ths
static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
848 efe75411 ths
849 c40ec5a9 ths
static int hpet_start_timer(struct qemu_alarm_timer *t);
850 c40ec5a9 ths
static void hpet_stop_timer(struct qemu_alarm_timer *t);
851 c40ec5a9 ths
852 c8994013 ths
static int rtc_start_timer(struct qemu_alarm_timer *t);
853 c8994013 ths
static void rtc_stop_timer(struct qemu_alarm_timer *t);
854 c8994013 ths
855 efe75411 ths
#endif /* __linux__ */
856 8a7ddc38 bellard
857 c8994013 ths
#endif /* _WIN32 */
858 c8994013 ths
859 c8994013 ths
static struct qemu_alarm_timer alarm_timers[] = {
860 efe75411 ths
#ifndef _WIN32
861 231c6586 ths
#ifdef __linux__
862 efe75411 ths
    {"dynticks", ALARM_FLAG_DYNTICKS, dynticks_start_timer,
863 efe75411 ths
     dynticks_stop_timer, dynticks_rearm_timer, NULL},
864 c40ec5a9 ths
    /* HPET - if available - is preferred */
865 efe75411 ths
    {"hpet", 0, hpet_start_timer, hpet_stop_timer, NULL, NULL},
866 c40ec5a9 ths
    /* ...otherwise try RTC */
867 efe75411 ths
    {"rtc", 0, rtc_start_timer, rtc_stop_timer, NULL, NULL},
868 c8994013 ths
#endif
869 efe75411 ths
    {"unix", 0, unix_start_timer, unix_stop_timer, NULL, NULL},
870 c8994013 ths
#else
871 efe75411 ths
    {"dynticks", ALARM_FLAG_DYNTICKS, win32_start_timer,
872 efe75411 ths
     win32_stop_timer, win32_rearm_timer, &alarm_win32_data},
873 efe75411 ths
    {"win32", 0, win32_start_timer,
874 efe75411 ths
     win32_stop_timer, NULL, &alarm_win32_data},
875 c8994013 ths
#endif
876 c8994013 ths
    {NULL, }
877 c8994013 ths
};
878 c8994013 ths
879 f3dcfada ths
static void show_available_alarms()
880 f3dcfada ths
{
881 f3dcfada ths
    int i;
882 f3dcfada ths
883 f3dcfada ths
    printf("Available alarm timers, in order of precedence:\n");
884 f3dcfada ths
    for (i = 0; alarm_timers[i].name; i++)
885 f3dcfada ths
        printf("%s\n", alarm_timers[i].name);
886 f3dcfada ths
}
887 f3dcfada ths
888 f3dcfada ths
static void configure_alarms(char const *opt)
889 f3dcfada ths
{
890 f3dcfada ths
    int i;
891 f3dcfada ths
    int cur = 0;
892 f3dcfada ths
    int count = (sizeof(alarm_timers) / sizeof(*alarm_timers)) - 1;
893 f3dcfada ths
    char *arg;
894 f3dcfada ths
    char *name;
895 f3dcfada ths
896 f3dcfada ths
    if (!strcmp(opt, "help")) {
897 f3dcfada ths
        show_available_alarms();
898 f3dcfada ths
        exit(0);
899 f3dcfada ths
    }
900 f3dcfada ths
901 f3dcfada ths
    arg = strdup(opt);
902 f3dcfada ths
903 f3dcfada ths
    /* Reorder the array */
904 f3dcfada ths
    name = strtok(arg, ",");
905 f3dcfada ths
    while (name) {
906 f3dcfada ths
        struct qemu_alarm_timer tmp;
907 f3dcfada ths
908 e2b577e5 balrog
        for (i = 0; i < count && alarm_timers[i].name; i++) {
909 f3dcfada ths
            if (!strcmp(alarm_timers[i].name, name))
910 f3dcfada ths
                break;
911 f3dcfada ths
        }
912 f3dcfada ths
913 f3dcfada ths
        if (i == count) {
914 f3dcfada ths
            fprintf(stderr, "Unknown clock %s\n", name);
915 f3dcfada ths
            goto next;
916 f3dcfada ths
        }
917 f3dcfada ths
918 f3dcfada ths
        if (i < cur)
919 f3dcfada ths
            /* Ignore */
920 f3dcfada ths
            goto next;
921 f3dcfada ths
922 f3dcfada ths
        /* Swap */
923 f3dcfada ths
        tmp = alarm_timers[i];
924 f3dcfada ths
        alarm_timers[i] = alarm_timers[cur];
925 f3dcfada ths
        alarm_timers[cur] = tmp;
926 f3dcfada ths
927 f3dcfada ths
        cur++;
928 f3dcfada ths
next:
929 f3dcfada ths
        name = strtok(NULL, ",");
930 f3dcfada ths
    }
931 f3dcfada ths
932 f3dcfada ths
    free(arg);
933 f3dcfada ths
934 f3dcfada ths
    if (cur) {
935 f3dcfada ths
        /* Disable remaining timers */
936 f3dcfada ths
        for (i = cur; i < count; i++)
937 f3dcfada ths
            alarm_timers[i].name = NULL;
938 f3dcfada ths
    }
939 f3dcfada ths
940 f3dcfada ths
    /* debug */
941 f3dcfada ths
    show_available_alarms();
942 f3dcfada ths
}
943 f3dcfada ths
944 c8994013 ths
QEMUClock *rt_clock;
945 c8994013 ths
QEMUClock *vm_clock;
946 c8994013 ths
947 c8994013 ths
static QEMUTimer *active_timers[2];
948 c8994013 ths
949 8a7ddc38 bellard
QEMUClock *qemu_new_clock(int type)
950 8a7ddc38 bellard
{
951 8a7ddc38 bellard
    QEMUClock *clock;
952 8a7ddc38 bellard
    clock = qemu_mallocz(sizeof(QEMUClock));
953 8a7ddc38 bellard
    if (!clock)
954 8a7ddc38 bellard
        return NULL;
955 8a7ddc38 bellard
    clock->type = type;
956 8a7ddc38 bellard
    return clock;
957 8a7ddc38 bellard
}
958 8a7ddc38 bellard
959 8a7ddc38 bellard
QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
960 8a7ddc38 bellard
{
961 8a7ddc38 bellard
    QEMUTimer *ts;
962 8a7ddc38 bellard
963 8a7ddc38 bellard
    ts = qemu_mallocz(sizeof(QEMUTimer));
964 8a7ddc38 bellard
    ts->clock = clock;
965 8a7ddc38 bellard
    ts->cb = cb;
966 8a7ddc38 bellard
    ts->opaque = opaque;
967 8a7ddc38 bellard
    return ts;
968 8a7ddc38 bellard
}
969 8a7ddc38 bellard
970 8a7ddc38 bellard
void qemu_free_timer(QEMUTimer *ts)
971 8a7ddc38 bellard
{
972 8a7ddc38 bellard
    qemu_free(ts);
973 8a7ddc38 bellard
}
974 8a7ddc38 bellard
975 8a7ddc38 bellard
/* stop a timer, but do not dealloc it */
976 8a7ddc38 bellard
void qemu_del_timer(QEMUTimer *ts)
977 8a7ddc38 bellard
{
978 8a7ddc38 bellard
    QEMUTimer **pt, *t;
979 8a7ddc38 bellard
980 8a7ddc38 bellard
    /* NOTE: this code must be signal safe because
981 8a7ddc38 bellard
       qemu_timer_expired() can be called from a signal. */
982 8a7ddc38 bellard
    pt = &active_timers[ts->clock->type];
983 8a7ddc38 bellard
    for(;;) {
984 8a7ddc38 bellard
        t = *pt;
985 8a7ddc38 bellard
        if (!t)
986 8a7ddc38 bellard
            break;
987 8a7ddc38 bellard
        if (t == ts) {
988 8a7ddc38 bellard
            *pt = t->next;
989 8a7ddc38 bellard
            break;
990 8a7ddc38 bellard
        }
991 8a7ddc38 bellard
        pt = &t->next;
992 8a7ddc38 bellard
    }
993 8a7ddc38 bellard
}
994 8a7ddc38 bellard
995 8a7ddc38 bellard
/* modify the current timer so that it will be fired when current_time
996 8a7ddc38 bellard
   >= expire_time. The corresponding callback will be called. */
997 8a7ddc38 bellard
void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
998 8a7ddc38 bellard
{
999 8a7ddc38 bellard
    QEMUTimer **pt, *t;
1000 8a7ddc38 bellard
1001 8a7ddc38 bellard
    qemu_del_timer(ts);
1002 8a7ddc38 bellard
1003 8a7ddc38 bellard
    /* add the timer in the sorted list */
1004 8a7ddc38 bellard
    /* NOTE: this code must be signal safe because
1005 8a7ddc38 bellard
       qemu_timer_expired() can be called from a signal. */
1006 8a7ddc38 bellard
    pt = &active_timers[ts->clock->type];
1007 8a7ddc38 bellard
    for(;;) {
1008 8a7ddc38 bellard
        t = *pt;
1009 8a7ddc38 bellard
        if (!t)
1010 8a7ddc38 bellard
            break;
1011 5fafdf24 ths
        if (t->expire_time > expire_time)
1012 8a7ddc38 bellard
            break;
1013 8a7ddc38 bellard
        pt = &t->next;
1014 8a7ddc38 bellard
    }
1015 8a7ddc38 bellard
    ts->expire_time = expire_time;
1016 8a7ddc38 bellard
    ts->next = *pt;
1017 8a7ddc38 bellard
    *pt = ts;
1018 8a7ddc38 bellard
}
1019 8a7ddc38 bellard
1020 8a7ddc38 bellard
int qemu_timer_pending(QEMUTimer *ts)
1021 8a7ddc38 bellard
{
1022 8a7ddc38 bellard
    QEMUTimer *t;
1023 8a7ddc38 bellard
    for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
1024 8a7ddc38 bellard
        if (t == ts)
1025 8a7ddc38 bellard
            return 1;
1026 8a7ddc38 bellard
    }
1027 8a7ddc38 bellard
    return 0;
1028 8a7ddc38 bellard
}
1029 8a7ddc38 bellard
1030 8a7ddc38 bellard
static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
1031 8a7ddc38 bellard
{
1032 8a7ddc38 bellard
    if (!timer_head)
1033 8a7ddc38 bellard
        return 0;
1034 8a7ddc38 bellard
    return (timer_head->expire_time <= current_time);
1035 8a7ddc38 bellard
}
1036 8a7ddc38 bellard
1037 8a7ddc38 bellard
static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
1038 8a7ddc38 bellard
{
1039 8a7ddc38 bellard
    QEMUTimer *ts;
1040 3b46e624 ths
1041 8a7ddc38 bellard
    for(;;) {
1042 8a7ddc38 bellard
        ts = *ptimer_head;
1043 e95c8d51 bellard
        if (!ts || ts->expire_time > current_time)
1044 8a7ddc38 bellard
            break;
1045 8a7ddc38 bellard
        /* remove timer from the list before calling the callback */
1046 8a7ddc38 bellard
        *ptimer_head = ts->next;
1047 8a7ddc38 bellard
        ts->next = NULL;
1048 3b46e624 ths
1049 8a7ddc38 bellard
        /* run the callback (the timer list can be modified) */
1050 8a7ddc38 bellard
        ts->cb(ts->opaque);
1051 8a7ddc38 bellard
    }
1052 efe75411 ths
    qemu_rearm_alarm_timer(alarm_timer);
1053 8a7ddc38 bellard
}
1054 8a7ddc38 bellard
1055 8a7ddc38 bellard
int64_t qemu_get_clock(QEMUClock *clock)
1056 8a7ddc38 bellard
{
1057 8a7ddc38 bellard
    switch(clock->type) {
1058 8a7ddc38 bellard
    case QEMU_TIMER_REALTIME:
1059 1dce7c3c bellard
        return get_clock() / 1000000;
1060 8a7ddc38 bellard
    default:
1061 8a7ddc38 bellard
    case QEMU_TIMER_VIRTUAL:
1062 1dce7c3c bellard
        return cpu_get_clock();
1063 8a7ddc38 bellard
    }
1064 8a7ddc38 bellard
}
1065 8a7ddc38 bellard
1066 1dce7c3c bellard
static void init_timers(void)
1067 1dce7c3c bellard
{
1068 1dce7c3c bellard
    init_get_clock();
1069 1dce7c3c bellard
    ticks_per_sec = QEMU_TIMER_BASE;
1070 1dce7c3c bellard
    rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
1071 1dce7c3c bellard
    vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
1072 1dce7c3c bellard
}
1073 1dce7c3c bellard
1074 8a7ddc38 bellard
/* save a timer */
1075 8a7ddc38 bellard
void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
1076 8a7ddc38 bellard
{
1077 8a7ddc38 bellard
    uint64_t expire_time;
1078 8a7ddc38 bellard
1079 8a7ddc38 bellard
    if (qemu_timer_pending(ts)) {
1080 8a7ddc38 bellard
        expire_time = ts->expire_time;
1081 8a7ddc38 bellard
    } else {
1082 8a7ddc38 bellard
        expire_time = -1;
1083 8a7ddc38 bellard
    }
1084 8a7ddc38 bellard
    qemu_put_be64(f, expire_time);
1085 8a7ddc38 bellard
}
1086 8a7ddc38 bellard
1087 8a7ddc38 bellard
void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
1088 8a7ddc38 bellard
{
1089 8a7ddc38 bellard
    uint64_t expire_time;
1090 8a7ddc38 bellard
1091 8a7ddc38 bellard
    expire_time = qemu_get_be64(f);
1092 8a7ddc38 bellard
    if (expire_time != -1) {
1093 8a7ddc38 bellard
        qemu_mod_timer(ts, expire_time);
1094 8a7ddc38 bellard
    } else {
1095 8a7ddc38 bellard
        qemu_del_timer(ts);
1096 8a7ddc38 bellard
    }
1097 8a7ddc38 bellard
}
1098 8a7ddc38 bellard
1099 8a7ddc38 bellard
static void timer_save(QEMUFile *f, void *opaque)
1100 8a7ddc38 bellard
{
1101 8a7ddc38 bellard
    if (cpu_ticks_enabled) {
1102 8a7ddc38 bellard
        hw_error("cannot save state if virtual timers are running");
1103 8a7ddc38 bellard
    }
1104 8a7ddc38 bellard
    qemu_put_be64s(f, &cpu_ticks_offset);
1105 8a7ddc38 bellard
    qemu_put_be64s(f, &ticks_per_sec);
1106 c88676f8 bellard
    qemu_put_be64s(f, &cpu_clock_offset);
1107 8a7ddc38 bellard
}
1108 8a7ddc38 bellard
1109 8a7ddc38 bellard
static int timer_load(QEMUFile *f, void *opaque, int version_id)
1110 8a7ddc38 bellard
{
1111 c88676f8 bellard
    if (version_id != 1 && version_id != 2)
1112 8a7ddc38 bellard
        return -EINVAL;
1113 8a7ddc38 bellard
    if (cpu_ticks_enabled) {
1114 8a7ddc38 bellard
        return -EINVAL;
1115 8a7ddc38 bellard
    }
1116 8a7ddc38 bellard
    qemu_get_be64s(f, &cpu_ticks_offset);
1117 8a7ddc38 bellard
    qemu_get_be64s(f, &ticks_per_sec);
1118 c88676f8 bellard
    if (version_id == 2) {
1119 c88676f8 bellard
        qemu_get_be64s(f, &cpu_clock_offset);
1120 c88676f8 bellard
    }
1121 8a7ddc38 bellard
    return 0;
1122 8a7ddc38 bellard
}
1123 8a7ddc38 bellard
1124 67b915a5 bellard
#ifdef _WIN32
1125 5fafdf24 ths
void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
1126 67b915a5 bellard
                                 DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
1127 67b915a5 bellard
#else
1128 8a7ddc38 bellard
static void host_alarm_handler(int host_signum)
1129 67b915a5 bellard
#endif
1130 8a7ddc38 bellard
{
1131 02ba45c5 bellard
#if 0
1132 02ba45c5 bellard
#define DISP_FREQ 1000
1133 02ba45c5 bellard
    {
1134 02ba45c5 bellard
        static int64_t delta_min = INT64_MAX;
1135 02ba45c5 bellard
        static int64_t delta_max, delta_cum, last_clock, delta, ti;
1136 02ba45c5 bellard
        static int count;
1137 02ba45c5 bellard
        ti = qemu_get_clock(vm_clock);
1138 02ba45c5 bellard
        if (last_clock != 0) {
1139 02ba45c5 bellard
            delta = ti - last_clock;
1140 02ba45c5 bellard
            if (delta < delta_min)
1141 02ba45c5 bellard
                delta_min = delta;
1142 02ba45c5 bellard
            if (delta > delta_max)
1143 02ba45c5 bellard
                delta_max = delta;
1144 02ba45c5 bellard
            delta_cum += delta;
1145 02ba45c5 bellard
            if (++count == DISP_FREQ) {
1146 26a76461 bellard
                printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
1147 02ba45c5 bellard
                       muldiv64(delta_min, 1000000, ticks_per_sec),
1148 02ba45c5 bellard
                       muldiv64(delta_max, 1000000, ticks_per_sec),
1149 02ba45c5 bellard
                       muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
1150 02ba45c5 bellard
                       (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
1151 02ba45c5 bellard
                count = 0;
1152 02ba45c5 bellard
                delta_min = INT64_MAX;
1153 02ba45c5 bellard
                delta_max = 0;
1154 02ba45c5 bellard
                delta_cum = 0;
1155 02ba45c5 bellard
            }
1156 02ba45c5 bellard
        }
1157 02ba45c5 bellard
        last_clock = ti;
1158 02ba45c5 bellard
    }
1159 02ba45c5 bellard
#endif
1160 efe75411 ths
    if (alarm_has_dynticks(alarm_timer) ||
1161 efe75411 ths
        qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
1162 8a7ddc38 bellard
                           qemu_get_clock(vm_clock)) ||
1163 8a7ddc38 bellard
        qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
1164 8a7ddc38 bellard
                           qemu_get_clock(rt_clock))) {
1165 06d9f2f7 bellard
#ifdef _WIN32
1166 c8994013 ths
        struct qemu_alarm_win32 *data = ((struct qemu_alarm_timer*)dwUser)->priv;
1167 c8994013 ths
        SetEvent(data->host_alarm);
1168 06d9f2f7 bellard
#endif
1169 6a00d601 bellard
        CPUState *env = cpu_single_env;
1170 6a00d601 bellard
        if (env) {
1171 6a00d601 bellard
            /* stop the currently executing cpu because a timer occured */
1172 6a00d601 bellard
            cpu_interrupt(env, CPU_INTERRUPT_EXIT);
1173 a332e112 bellard
#ifdef USE_KQEMU
1174 6a00d601 bellard
            if (env->kqemu_enabled) {
1175 6a00d601 bellard
                kqemu_cpu_interrupt(env);
1176 6a00d601 bellard
            }
1177 a332e112 bellard
#endif
1178 6a00d601 bellard
        }
1179 8a7ddc38 bellard
    }
1180 8a7ddc38 bellard
}
1181 8a7ddc38 bellard
1182 efe75411 ths
static uint64_t qemu_next_deadline(void)
1183 efe75411 ths
{
1184 49a9b725 balrog
    int64_t nearest_delta_us = INT64_MAX;
1185 efe75411 ths
    int64_t vmdelta_us;
1186 efe75411 ths
1187 efe75411 ths
    if (active_timers[QEMU_TIMER_REALTIME])
1188 efe75411 ths
        nearest_delta_us = (active_timers[QEMU_TIMER_REALTIME]->expire_time -
1189 efe75411 ths
                            qemu_get_clock(rt_clock))*1000;
1190 efe75411 ths
1191 efe75411 ths
    if (active_timers[QEMU_TIMER_VIRTUAL]) {
1192 efe75411 ths
        /* round up */
1193 efe75411 ths
        vmdelta_us = (active_timers[QEMU_TIMER_VIRTUAL]->expire_time -
1194 efe75411 ths
                      qemu_get_clock(vm_clock)+999)/1000;
1195 efe75411 ths
        if (vmdelta_us < nearest_delta_us)
1196 efe75411 ths
            nearest_delta_us = vmdelta_us;
1197 efe75411 ths
    }
1198 efe75411 ths
1199 efe75411 ths
    /* Avoid arming the timer to negative, zero, or too low values */
1200 efe75411 ths
    if (nearest_delta_us <= MIN_TIMER_REARM_US)
1201 efe75411 ths
        nearest_delta_us = MIN_TIMER_REARM_US;
1202 efe75411 ths
1203 efe75411 ths
    return nearest_delta_us;
1204 efe75411 ths
}
1205 efe75411 ths
1206 fd872598 bellard
#ifndef _WIN32
1207 fd872598 bellard
1208 829309c7 bellard
#if defined(__linux__)
1209 829309c7 bellard
1210 fd872598 bellard
#define RTC_FREQ 1024
1211 fd872598 bellard
1212 c8994013 ths
static void enable_sigio_timer(int fd)
1213 c8994013 ths
{
1214 c8994013 ths
    struct sigaction act;
1215 c8994013 ths
1216 c8994013 ths
    /* timer signal */
1217 c8994013 ths
    sigfillset(&act.sa_mask);
1218 c8994013 ths
    act.sa_flags = 0;
1219 c8994013 ths
    act.sa_handler = host_alarm_handler;
1220 c8994013 ths
1221 c8994013 ths
    sigaction(SIGIO, &act, NULL);
1222 c8994013 ths
    fcntl(fd, F_SETFL, O_ASYNC);
1223 c8994013 ths
    fcntl(fd, F_SETOWN, getpid());
1224 c8994013 ths
}
1225 829309c7 bellard
1226 c40ec5a9 ths
static int hpet_start_timer(struct qemu_alarm_timer *t)
1227 c40ec5a9 ths
{
1228 c40ec5a9 ths
    struct hpet_info info;
1229 c40ec5a9 ths
    int r, fd;
1230 c40ec5a9 ths
1231 c40ec5a9 ths
    fd = open("/dev/hpet", O_RDONLY);
1232 c40ec5a9 ths
    if (fd < 0)
1233 c40ec5a9 ths
        return -1;
1234 c40ec5a9 ths
1235 c40ec5a9 ths
    /* Set frequency */
1236 c40ec5a9 ths
    r = ioctl(fd, HPET_IRQFREQ, RTC_FREQ);
1237 c40ec5a9 ths
    if (r < 0) {
1238 c40ec5a9 ths
        fprintf(stderr, "Could not configure '/dev/hpet' to have a 1024Hz timer. This is not a fatal\n"
1239 c40ec5a9 ths
                "error, but for better emulation accuracy type:\n"
1240 c40ec5a9 ths
                "'echo 1024 > /proc/sys/dev/hpet/max-user-freq' as root.\n");
1241 c40ec5a9 ths
        goto fail;
1242 c40ec5a9 ths
    }
1243 c40ec5a9 ths
1244 c40ec5a9 ths
    /* Check capabilities */
1245 c40ec5a9 ths
    r = ioctl(fd, HPET_INFO, &info);
1246 c40ec5a9 ths
    if (r < 0)
1247 c40ec5a9 ths
        goto fail;
1248 c40ec5a9 ths
1249 c40ec5a9 ths
    /* Enable periodic mode */
1250 c40ec5a9 ths
    r = ioctl(fd, HPET_EPI, 0);
1251 c40ec5a9 ths
    if (info.hi_flags && (r < 0))
1252 c40ec5a9 ths
        goto fail;
1253 c40ec5a9 ths
1254 c40ec5a9 ths
    /* Enable interrupt */
1255 c40ec5a9 ths
    r = ioctl(fd, HPET_IE_ON, 0);
1256 c40ec5a9 ths
    if (r < 0)
1257 c40ec5a9 ths
        goto fail;
1258 c40ec5a9 ths
1259 c40ec5a9 ths
    enable_sigio_timer(fd);
1260 fcdc2129 pbrook
    t->priv = (void *)(long)fd;
1261 c40ec5a9 ths
1262 c40ec5a9 ths
    return 0;
1263 c40ec5a9 ths
fail:
1264 c40ec5a9 ths
    close(fd);
1265 c40ec5a9 ths
    return -1;
1266 c40ec5a9 ths
}
1267 c40ec5a9 ths
1268 c40ec5a9 ths
static void hpet_stop_timer(struct qemu_alarm_timer *t)
1269 c40ec5a9 ths
{
1270 fcdc2129 pbrook
    int fd = (long)t->priv;
1271 c40ec5a9 ths
1272 c40ec5a9 ths
    close(fd);
1273 c40ec5a9 ths
}
1274 c40ec5a9 ths
1275 c8994013 ths
static int rtc_start_timer(struct qemu_alarm_timer *t)
1276 fd872598 bellard
{
1277 c8994013 ths
    int rtc_fd;
1278 c8994013 ths
1279 aeb30be6 balrog
    TFR(rtc_fd = open("/dev/rtc", O_RDONLY));
1280 fd872598 bellard
    if (rtc_fd < 0)
1281 fd872598 bellard
        return -1;
1282 fd872598 bellard
    if (ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
1283 fd872598 bellard
        fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
1284 fd872598 bellard
                "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
1285 fd872598 bellard
                "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
1286 fd872598 bellard
        goto fail;
1287 fd872598 bellard
    }
1288 fd872598 bellard
    if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
1289 fd872598 bellard
    fail:
1290 fd872598 bellard
        close(rtc_fd);
1291 fd872598 bellard
        return -1;
1292 fd872598 bellard
    }
1293 c8994013 ths
1294 c8994013 ths
    enable_sigio_timer(rtc_fd);
1295 c8994013 ths
1296 fcdc2129 pbrook
    t->priv = (void *)(long)rtc_fd;
1297 c8994013 ths
1298 fd872598 bellard
    return 0;
1299 fd872598 bellard
}
1300 fd872598 bellard
1301 c8994013 ths
static void rtc_stop_timer(struct qemu_alarm_timer *t)
1302 829309c7 bellard
{
1303 fcdc2129 pbrook
    int rtc_fd = (long)t->priv;
1304 c8994013 ths
1305 c8994013 ths
    close(rtc_fd);
1306 829309c7 bellard
}
1307 829309c7 bellard
1308 efe75411 ths
static int dynticks_start_timer(struct qemu_alarm_timer *t)
1309 efe75411 ths
{
1310 efe75411 ths
    struct sigevent ev;
1311 efe75411 ths
    timer_t host_timer;
1312 efe75411 ths
    struct sigaction act;
1313 efe75411 ths
1314 efe75411 ths
    sigfillset(&act.sa_mask);
1315 efe75411 ths
    act.sa_flags = 0;
1316 efe75411 ths
    act.sa_handler = host_alarm_handler;
1317 efe75411 ths
1318 efe75411 ths
    sigaction(SIGALRM, &act, NULL);
1319 efe75411 ths
1320 efe75411 ths
    ev.sigev_value.sival_int = 0;
1321 efe75411 ths
    ev.sigev_notify = SIGEV_SIGNAL;
1322 efe75411 ths
    ev.sigev_signo = SIGALRM;
1323 efe75411 ths
1324 efe75411 ths
    if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
1325 efe75411 ths
        perror("timer_create");
1326 efe75411 ths
1327 efe75411 ths
        /* disable dynticks */
1328 efe75411 ths
        fprintf(stderr, "Dynamic Ticks disabled\n");
1329 efe75411 ths
1330 efe75411 ths
        return -1;
1331 efe75411 ths
    }
1332 efe75411 ths
1333 efe75411 ths
    t->priv = (void *)host_timer;
1334 efe75411 ths
1335 efe75411 ths
    return 0;
1336 efe75411 ths
}
1337 efe75411 ths
1338 efe75411 ths
static void dynticks_stop_timer(struct qemu_alarm_timer *t)
1339 efe75411 ths
{
1340 efe75411 ths
    timer_t host_timer = (timer_t)t->priv;
1341 efe75411 ths
1342 efe75411 ths
    timer_delete(host_timer);
1343 efe75411 ths
}
1344 efe75411 ths
1345 efe75411 ths
static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
1346 efe75411 ths
{
1347 efe75411 ths
    timer_t host_timer = (timer_t)t->priv;
1348 efe75411 ths
    struct itimerspec timeout;
1349 efe75411 ths
    int64_t nearest_delta_us = INT64_MAX;
1350 efe75411 ths
    int64_t current_us;
1351 efe75411 ths
1352 efe75411 ths
    if (!active_timers[QEMU_TIMER_REALTIME] &&
1353 efe75411 ths
                !active_timers[QEMU_TIMER_VIRTUAL])
1354 efe75411 ths
            return;
1355 efe75411 ths
1356 efe75411 ths
    nearest_delta_us = qemu_next_deadline();
1357 efe75411 ths
1358 efe75411 ths
    /* check whether a timer is already running */
1359 efe75411 ths
    if (timer_gettime(host_timer, &timeout)) {
1360 efe75411 ths
        perror("gettime");
1361 efe75411 ths
        fprintf(stderr, "Internal timer error: aborting\n");
1362 efe75411 ths
        exit(1);
1363 efe75411 ths
    }
1364 efe75411 ths
    current_us = timeout.it_value.tv_sec * 1000000 + timeout.it_value.tv_nsec/1000;
1365 efe75411 ths
    if (current_us && current_us <= nearest_delta_us)
1366 efe75411 ths
        return;
1367 efe75411 ths
1368 efe75411 ths
    timeout.it_interval.tv_sec = 0;
1369 efe75411 ths
    timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
1370 efe75411 ths
    timeout.it_value.tv_sec =  nearest_delta_us / 1000000;
1371 efe75411 ths
    timeout.it_value.tv_nsec = (nearest_delta_us % 1000000) * 1000;
1372 efe75411 ths
    if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
1373 efe75411 ths
        perror("settime");
1374 efe75411 ths
        fprintf(stderr, "Internal timer error: aborting\n");
1375 efe75411 ths
        exit(1);
1376 efe75411 ths
    }
1377 efe75411 ths
}
1378 efe75411 ths
1379 70744b3a ths
#endif /* defined(__linux__) */
1380 231c6586 ths
1381 c8994013 ths
static int unix_start_timer(struct qemu_alarm_timer *t)
1382 c8994013 ths
{
1383 c8994013 ths
    struct sigaction act;
1384 c8994013 ths
    struct itimerval itv;
1385 c8994013 ths
    int err;
1386 c8994013 ths
1387 c8994013 ths
    /* timer signal */
1388 c8994013 ths
    sigfillset(&act.sa_mask);
1389 c8994013 ths
    act.sa_flags = 0;
1390 c8994013 ths
    act.sa_handler = host_alarm_handler;
1391 c8994013 ths
1392 c8994013 ths
    sigaction(SIGALRM, &act, NULL);
1393 c8994013 ths
1394 c8994013 ths
    itv.it_interval.tv_sec = 0;
1395 c8994013 ths
    /* for i386 kernel 2.6 to get 1 ms */
1396 c8994013 ths
    itv.it_interval.tv_usec = 999;
1397 c8994013 ths
    itv.it_value.tv_sec = 0;
1398 c8994013 ths
    itv.it_value.tv_usec = 10 * 1000;
1399 c8994013 ths
1400 c8994013 ths
    err = setitimer(ITIMER_REAL, &itv, NULL);
1401 c8994013 ths
    if (err)
1402 c8994013 ths
        return -1;
1403 c8994013 ths
1404 c8994013 ths
    return 0;
1405 c8994013 ths
}
1406 c8994013 ths
1407 c8994013 ths
static void unix_stop_timer(struct qemu_alarm_timer *t)
1408 c8994013 ths
{
1409 c8994013 ths
    struct itimerval itv;
1410 c8994013 ths
1411 c8994013 ths
    memset(&itv, 0, sizeof(itv));
1412 c8994013 ths
    setitimer(ITIMER_REAL, &itv, NULL);
1413 c8994013 ths
}
1414 c8994013 ths
1415 829309c7 bellard
#endif /* !defined(_WIN32) */
1416 fd872598 bellard
1417 c8994013 ths
#ifdef _WIN32
1418 c8994013 ths
1419 c8994013 ths
static int win32_start_timer(struct qemu_alarm_timer *t)
1420 c8994013 ths
{
1421 c8994013 ths
    TIMECAPS tc;
1422 c8994013 ths
    struct qemu_alarm_win32 *data = t->priv;
1423 efe75411 ths
    UINT flags;
1424 c8994013 ths
1425 c8994013 ths
    data->host_alarm = CreateEvent(NULL, FALSE, FALSE, NULL);
1426 c8994013 ths
    if (!data->host_alarm) {
1427 c8994013 ths
        perror("Failed CreateEvent");
1428 c396a7f0 ths
        return -1;
1429 c8994013 ths
    }
1430 c8994013 ths
1431 c8994013 ths
    memset(&tc, 0, sizeof(tc));
1432 c8994013 ths
    timeGetDevCaps(&tc, sizeof(tc));
1433 c8994013 ths
1434 c8994013 ths
    if (data->period < tc.wPeriodMin)
1435 c8994013 ths
        data->period = tc.wPeriodMin;
1436 c8994013 ths
1437 c8994013 ths
    timeBeginPeriod(data->period);
1438 c8994013 ths
1439 efe75411 ths
    flags = TIME_CALLBACK_FUNCTION;
1440 efe75411 ths
    if (alarm_has_dynticks(t))
1441 efe75411 ths
        flags |= TIME_ONESHOT;
1442 efe75411 ths
    else
1443 efe75411 ths
        flags |= TIME_PERIODIC;
1444 efe75411 ths
1445 c8994013 ths
    data->timerId = timeSetEvent(1,         // interval (ms)
1446 c8994013 ths
                        data->period,       // resolution
1447 c8994013 ths
                        host_alarm_handler, // function
1448 c8994013 ths
                        (DWORD)t,           // parameter
1449 efe75411 ths
                        flags);
1450 c8994013 ths
1451 c8994013 ths
    if (!data->timerId) {
1452 c8994013 ths
        perror("Failed to initialize win32 alarm timer");
1453 c8994013 ths
1454 c8994013 ths
        timeEndPeriod(data->period);
1455 c8994013 ths
        CloseHandle(data->host_alarm);
1456 c8994013 ths
        return -1;
1457 c8994013 ths
    }
1458 c8994013 ths
1459 c8994013 ths
    qemu_add_wait_object(data->host_alarm, NULL, NULL);
1460 c8994013 ths
1461 c8994013 ths
    return 0;
1462 c8994013 ths
}
1463 c8994013 ths
1464 c8994013 ths
static void win32_stop_timer(struct qemu_alarm_timer *t)
1465 c8994013 ths
{
1466 c8994013 ths
    struct qemu_alarm_win32 *data = t->priv;
1467 c8994013 ths
1468 c8994013 ths
    timeKillEvent(data->timerId);
1469 c8994013 ths
    timeEndPeriod(data->period);
1470 c8994013 ths
1471 c8994013 ths
    CloseHandle(data->host_alarm);
1472 c8994013 ths
}
1473 c8994013 ths
1474 efe75411 ths
static void win32_rearm_timer(struct qemu_alarm_timer *t)
1475 efe75411 ths
{
1476 efe75411 ths
    struct qemu_alarm_win32 *data = t->priv;
1477 efe75411 ths
    uint64_t nearest_delta_us;
1478 efe75411 ths
1479 efe75411 ths
    if (!active_timers[QEMU_TIMER_REALTIME] &&
1480 efe75411 ths
                !active_timers[QEMU_TIMER_VIRTUAL])
1481 efe75411 ths
            return;
1482 efe75411 ths
1483 efe75411 ths
    nearest_delta_us = qemu_next_deadline();
1484 efe75411 ths
    nearest_delta_us /= 1000;
1485 efe75411 ths
1486 efe75411 ths
    timeKillEvent(data->timerId);
1487 efe75411 ths
1488 efe75411 ths
    data->timerId = timeSetEvent(1,
1489 efe75411 ths
                        data->period,
1490 efe75411 ths
                        host_alarm_handler,
1491 efe75411 ths
                        (DWORD)t,
1492 efe75411 ths
                        TIME_ONESHOT | TIME_PERIODIC);
1493 efe75411 ths
1494 efe75411 ths
    if (!data->timerId) {
1495 efe75411 ths
        perror("Failed to re-arm win32 alarm timer");
1496 efe75411 ths
1497 efe75411 ths
        timeEndPeriod(data->period);
1498 efe75411 ths
        CloseHandle(data->host_alarm);
1499 efe75411 ths
        exit(1);
1500 efe75411 ths
    }
1501 efe75411 ths
}
1502 efe75411 ths
1503 c8994013 ths
#endif /* _WIN32 */
1504 c8994013 ths
1505 1dce7c3c bellard
static void init_timer_alarm(void)
1506 8a7ddc38 bellard
{
1507 c8994013 ths
    struct qemu_alarm_timer *t;
1508 c8994013 ths
    int i, err = -1;
1509 c8994013 ths
1510 c8994013 ths
    for (i = 0; alarm_timers[i].name; i++) {
1511 c8994013 ths
        t = &alarm_timers[i];
1512 c8994013 ths
1513 c8994013 ths
        err = t->start(t);
1514 c8994013 ths
        if (!err)
1515 c8994013 ths
            break;
1516 67b915a5 bellard
    }
1517 fd872598 bellard
1518 c8994013 ths
    if (err) {
1519 c8994013 ths
        fprintf(stderr, "Unable to find any suitable alarm timer.\n");
1520 c8994013 ths
        fprintf(stderr, "Terminating\n");
1521 c8994013 ths
        exit(1);
1522 67b915a5 bellard
    }
1523 c8994013 ths
1524 c8994013 ths
    alarm_timer = t;
1525 8a7ddc38 bellard
}
1526 8a7ddc38 bellard
1527 40c3bac3 bellard
void quit_timers(void)
1528 40c3bac3 bellard
{
1529 c8994013 ths
    alarm_timer->stop(alarm_timer);
1530 c8994013 ths
    alarm_timer = NULL;
1531 40c3bac3 bellard
}
1532 40c3bac3 bellard
1533 c4b1fcc0 bellard
/***********************************************************/
1534 82c643ff bellard
/* character device */
1535 313aa567 bellard
1536 e5b0bc44 pbrook
static void qemu_chr_event(CharDriverState *s, int event)
1537 e5b0bc44 pbrook
{
1538 e5b0bc44 pbrook
    if (!s->chr_event)
1539 e5b0bc44 pbrook
        return;
1540 e5b0bc44 pbrook
    s->chr_event(s->handler_opaque, event);
1541 e5b0bc44 pbrook
}
1542 e5b0bc44 pbrook
1543 86e94dea ths
static void qemu_chr_reset_bh(void *opaque)
1544 86e94dea ths
{
1545 86e94dea ths
    CharDriverState *s = opaque;
1546 e5b0bc44 pbrook
    qemu_chr_event(s, CHR_EVENT_RESET);
1547 86e94dea ths
    qemu_bh_delete(s->bh);
1548 86e94dea ths
    s->bh = NULL;
1549 86e94dea ths
}
1550 86e94dea ths
1551 86e94dea ths
void qemu_chr_reset(CharDriverState *s)
1552 86e94dea ths
{
1553 86e94dea ths
    if (s->bh == NULL) {
1554 86e94dea ths
        s->bh = qemu_bh_new(qemu_chr_reset_bh, s);
1555 86e94dea ths
        qemu_bh_schedule(s->bh);
1556 86e94dea ths
    }
1557 86e94dea ths
}
1558 86e94dea ths
1559 82c643ff bellard
int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len)
1560 82c643ff bellard
{
1561 82c643ff bellard
    return s->chr_write(s, buf, len);
1562 82c643ff bellard
}
1563 67b915a5 bellard
1564 e57a8c0e bellard
int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg)
1565 f8d179e3 bellard
{
1566 e57a8c0e bellard
    if (!s->chr_ioctl)
1567 e57a8c0e bellard
        return -ENOTSUP;
1568 e57a8c0e bellard
    return s->chr_ioctl(s, cmd, arg);
1569 f8d179e3 bellard
}
1570 f8d179e3 bellard
1571 e5b0bc44 pbrook
int qemu_chr_can_read(CharDriverState *s)
1572 e5b0bc44 pbrook
{
1573 e5b0bc44 pbrook
    if (!s->chr_can_read)
1574 e5b0bc44 pbrook
        return 0;
1575 e5b0bc44 pbrook
    return s->chr_can_read(s->handler_opaque);
1576 e5b0bc44 pbrook
}
1577 e5b0bc44 pbrook
1578 e5b0bc44 pbrook
void qemu_chr_read(CharDriverState *s, uint8_t *buf, int len)
1579 e5b0bc44 pbrook
{
1580 e5b0bc44 pbrook
    s->chr_read(s->handler_opaque, buf, len);
1581 e5b0bc44 pbrook
}
1582 e5b0bc44 pbrook
1583 e5b0bc44 pbrook
1584 82c643ff bellard
void qemu_chr_printf(CharDriverState *s, const char *fmt, ...)
1585 67b915a5 bellard
{
1586 82c643ff bellard
    char buf[4096];
1587 82c643ff bellard
    va_list ap;
1588 82c643ff bellard
    va_start(ap, fmt);
1589 82c643ff bellard
    vsnprintf(buf, sizeof(buf), fmt, ap);
1590 82c643ff bellard
    qemu_chr_write(s, buf, strlen(buf));
1591 82c643ff bellard
    va_end(ap);
1592 67b915a5 bellard
}
1593 67b915a5 bellard
1594 5905b2e5 bellard
void qemu_chr_send_event(CharDriverState *s, int event)
1595 5905b2e5 bellard
{
1596 5905b2e5 bellard
    if (s->chr_send_event)
1597 5905b2e5 bellard
        s->chr_send_event(s, event);
1598 5905b2e5 bellard
}
1599 5905b2e5 bellard
1600 5fafdf24 ths
void qemu_chr_add_handlers(CharDriverState *s,
1601 5fafdf24 ths
                           IOCanRWHandler *fd_can_read,
1602 e5b0bc44 pbrook
                           IOReadHandler *fd_read,
1603 e5b0bc44 pbrook
                           IOEventHandler *fd_event,
1604 e5b0bc44 pbrook
                           void *opaque)
1605 82c643ff bellard
{
1606 e5b0bc44 pbrook
    s->chr_can_read = fd_can_read;
1607 e5b0bc44 pbrook
    s->chr_read = fd_read;
1608 e5b0bc44 pbrook
    s->chr_event = fd_event;
1609 e5b0bc44 pbrook
    s->handler_opaque = opaque;
1610 e5b0bc44 pbrook
    if (s->chr_update_read_handler)
1611 e5b0bc44 pbrook
        s->chr_update_read_handler(s);
1612 82c643ff bellard
}
1613 3b46e624 ths
1614 82c643ff bellard
static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1615 313aa567 bellard
{
1616 82c643ff bellard
    return len;
1617 82c643ff bellard
}
1618 82c643ff bellard
1619 52f61fde ths
static CharDriverState *qemu_chr_open_null(void)
1620 82c643ff bellard
{
1621 82c643ff bellard
    CharDriverState *chr;
1622 82c643ff bellard
1623 82c643ff bellard
    chr = qemu_mallocz(sizeof(CharDriverState));
1624 82c643ff bellard
    if (!chr)
1625 82c643ff bellard
        return NULL;
1626 82c643ff bellard
    chr->chr_write = null_chr_write;
1627 82c643ff bellard
    return chr;
1628 82c643ff bellard
}
1629 82c643ff bellard
1630 20d8a3ed ths
/* MUX driver for serial I/O splitting */
1631 20d8a3ed ths
static int term_timestamps;
1632 20d8a3ed ths
static int64_t term_timestamps_start;
1633 9c1de612 ths
#define MAX_MUX 4
1634 20d8a3ed ths
typedef struct {
1635 20d8a3ed ths
    IOCanRWHandler *chr_can_read[MAX_MUX];
1636 20d8a3ed ths
    IOReadHandler *chr_read[MAX_MUX];
1637 20d8a3ed ths
    IOEventHandler *chr_event[MAX_MUX];
1638 20d8a3ed ths
    void *ext_opaque[MAX_MUX];
1639 20d8a3ed ths
    CharDriverState *drv;
1640 20d8a3ed ths
    int mux_cnt;
1641 20d8a3ed ths
    int term_got_escape;
1642 20d8a3ed ths
    int max_size;
1643 20d8a3ed ths
} MuxDriver;
1644 20d8a3ed ths
1645 20d8a3ed ths
1646 20d8a3ed ths
static int mux_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1647 20d8a3ed ths
{
1648 20d8a3ed ths
    MuxDriver *d = chr->opaque;
1649 20d8a3ed ths
    int ret;
1650 20d8a3ed ths
    if (!term_timestamps) {
1651 20d8a3ed ths
        ret = d->drv->chr_write(d->drv, buf, len);
1652 20d8a3ed ths
    } else {
1653 20d8a3ed ths
        int i;
1654 20d8a3ed ths
1655 20d8a3ed ths
        ret = 0;
1656 20d8a3ed ths
        for(i = 0; i < len; i++) {
1657 20d8a3ed ths
            ret += d->drv->chr_write(d->drv, buf+i, 1);
1658 20d8a3ed ths
            if (buf[i] == '\n') {
1659 20d8a3ed ths
                char buf1[64];
1660 20d8a3ed ths
                int64_t ti;
1661 20d8a3ed ths
                int secs;
1662 20d8a3ed ths
1663 20d8a3ed ths
                ti = get_clock();
1664 20d8a3ed ths
                if (term_timestamps_start == -1)
1665 20d8a3ed ths
                    term_timestamps_start = ti;
1666 20d8a3ed ths
                ti -= term_timestamps_start;
1667 20d8a3ed ths
                secs = ti / 1000000000;
1668 20d8a3ed ths
                snprintf(buf1, sizeof(buf1),
1669 20d8a3ed ths
                         "[%02d:%02d:%02d.%03d] ",
1670 20d8a3ed ths
                         secs / 3600,
1671 20d8a3ed ths
                         (secs / 60) % 60,
1672 20d8a3ed ths
                         secs % 60,
1673 20d8a3ed ths
                         (int)((ti / 1000000) % 1000));
1674 20d8a3ed ths
                d->drv->chr_write(d->drv, buf1, strlen(buf1));
1675 20d8a3ed ths
            }
1676 20d8a3ed ths
        }
1677 20d8a3ed ths
    }
1678 20d8a3ed ths
    return ret;
1679 20d8a3ed ths
}
1680 20d8a3ed ths
1681 20d8a3ed ths
static char *mux_help[] = {
1682 20d8a3ed ths
    "% h    print this help\n\r",
1683 20d8a3ed ths
    "% x    exit emulator\n\r",
1684 20d8a3ed ths
    "% s    save disk data back to file (if -snapshot)\n\r",
1685 20d8a3ed ths
    "% t    toggle console timestamps\n\r"
1686 20d8a3ed ths
    "% b    send break (magic sysrq)\n\r",
1687 20d8a3ed ths
    "% c    switch between console and monitor\n\r",
1688 20d8a3ed ths
    "% %  sends %\n\r",
1689 20d8a3ed ths
    NULL
1690 20d8a3ed ths
};
1691 20d8a3ed ths
1692 20d8a3ed ths
static int term_escape_char = 0x01; /* ctrl-a is used for escape */
1693 20d8a3ed ths
static void mux_print_help(CharDriverState *chr)
1694 20d8a3ed ths
{
1695 20d8a3ed ths
    int i, j;
1696 20d8a3ed ths
    char ebuf[15] = "Escape-Char";
1697 20d8a3ed ths
    char cbuf[50] = "\n\r";
1698 20d8a3ed ths
1699 20d8a3ed ths
    if (term_escape_char > 0 && term_escape_char < 26) {
1700 20d8a3ed ths
        sprintf(cbuf,"\n\r");
1701 20d8a3ed ths
        sprintf(ebuf,"C-%c", term_escape_char - 1 + 'a');
1702 20d8a3ed ths
    } else {
1703 20d8a3ed ths
        sprintf(cbuf,"\n\rEscape-Char set to Ascii: 0x%02x\n\r\n\r", term_escape_char);
1704 20d8a3ed ths
    }
1705 20d8a3ed ths
    chr->chr_write(chr, cbuf, strlen(cbuf));
1706 20d8a3ed ths
    for (i = 0; mux_help[i] != NULL; i++) {
1707 20d8a3ed ths
        for (j=0; mux_help[i][j] != '\0'; j++) {
1708 20d8a3ed ths
            if (mux_help[i][j] == '%')
1709 20d8a3ed ths
                chr->chr_write(chr, ebuf, strlen(ebuf));
1710 20d8a3ed ths
            else
1711 20d8a3ed ths
                chr->chr_write(chr, &mux_help[i][j], 1);
1712 20d8a3ed ths
        }
1713 20d8a3ed ths
    }
1714 20d8a3ed ths
}
1715 20d8a3ed ths
1716 20d8a3ed ths
static int mux_proc_byte(CharDriverState *chr, MuxDriver *d, int ch)
1717 20d8a3ed ths
{
1718 20d8a3ed ths
    if (d->term_got_escape) {
1719 20d8a3ed ths
        d->term_got_escape = 0;
1720 20d8a3ed ths
        if (ch == term_escape_char)
1721 20d8a3ed ths
            goto send_char;
1722 20d8a3ed ths
        switch(ch) {
1723 20d8a3ed ths
        case '?':
1724 20d8a3ed ths
        case 'h':
1725 20d8a3ed ths
            mux_print_help(chr);
1726 20d8a3ed ths
            break;
1727 20d8a3ed ths
        case 'x':
1728 20d8a3ed ths
            {
1729 20d8a3ed ths
                 char *term =  "QEMU: Terminated\n\r";
1730 20d8a3ed ths
                 chr->chr_write(chr,term,strlen(term));
1731 20d8a3ed ths
                 exit(0);
1732 20d8a3ed ths
                 break;
1733 20d8a3ed ths
            }
1734 20d8a3ed ths
        case 's':
1735 20d8a3ed ths
            {
1736 20d8a3ed ths
                int i;
1737 20d8a3ed ths
                for (i = 0; i < MAX_DISKS; i++) {
1738 20d8a3ed ths
                    if (bs_table[i])
1739 20d8a3ed ths
                        bdrv_commit(bs_table[i]);
1740 20d8a3ed ths
                }
1741 2dc7b602 balrog
                if (mtd_bdrv)
1742 2dc7b602 balrog
                    bdrv_commit(mtd_bdrv);
1743 20d8a3ed ths
            }
1744 20d8a3ed ths
            break;
1745 20d8a3ed ths
        case 'b':
1746 36ddb83b balrog
            qemu_chr_event(chr, CHR_EVENT_BREAK);
1747 20d8a3ed ths
            break;
1748 20d8a3ed ths
        case 'c':
1749 20d8a3ed ths
            /* Switch to the next registered device */
1750 20d8a3ed ths
            chr->focus++;
1751 20d8a3ed ths
            if (chr->focus >= d->mux_cnt)
1752 20d8a3ed ths
                chr->focus = 0;
1753 20d8a3ed ths
            break;
1754 20d8a3ed ths
       case 't':
1755 20d8a3ed ths
           term_timestamps = !term_timestamps;
1756 20d8a3ed ths
           term_timestamps_start = -1;
1757 20d8a3ed ths
           break;
1758 20d8a3ed ths
        }
1759 20d8a3ed ths
    } else if (ch == term_escape_char) {
1760 20d8a3ed ths
        d->term_got_escape = 1;
1761 20d8a3ed ths
    } else {
1762 20d8a3ed ths
    send_char:
1763 20d8a3ed ths
        return 1;
1764 20d8a3ed ths
    }
1765 20d8a3ed ths
    return 0;
1766 20d8a3ed ths
}
1767 20d8a3ed ths
1768 20d8a3ed ths
static int mux_chr_can_read(void *opaque)
1769 20d8a3ed ths
{
1770 20d8a3ed ths
    CharDriverState *chr = opaque;
1771 20d8a3ed ths
    MuxDriver *d = chr->opaque;
1772 20d8a3ed ths
    if (d->chr_can_read[chr->focus])
1773 20d8a3ed ths
       return d->chr_can_read[chr->focus](d->ext_opaque[chr->focus]);
1774 20d8a3ed ths
    return 0;
1775 20d8a3ed ths
}
1776 20d8a3ed ths
1777 20d8a3ed ths
static void mux_chr_read(void *opaque, const uint8_t *buf, int size)
1778 20d8a3ed ths
{
1779 20d8a3ed ths
    CharDriverState *chr = opaque;
1780 20d8a3ed ths
    MuxDriver *d = chr->opaque;
1781 20d8a3ed ths
    int i;
1782 20d8a3ed ths
    for(i = 0; i < size; i++)
1783 20d8a3ed ths
        if (mux_proc_byte(chr, d, buf[i]))
1784 20d8a3ed ths
            d->chr_read[chr->focus](d->ext_opaque[chr->focus], &buf[i], 1);
1785 20d8a3ed ths
}
1786 20d8a3ed ths
1787 20d8a3ed ths
static void mux_chr_event(void *opaque, int event)
1788 20d8a3ed ths
{
1789 20d8a3ed ths
    CharDriverState *chr = opaque;
1790 20d8a3ed ths
    MuxDriver *d = chr->opaque;
1791 20d8a3ed ths
    int i;
1792 20d8a3ed ths
1793 20d8a3ed ths
    /* Send the event to all registered listeners */
1794 20d8a3ed ths
    for (i = 0; i < d->mux_cnt; i++)
1795 20d8a3ed ths
        if (d->chr_event[i])
1796 20d8a3ed ths
            d->chr_event[i](d->ext_opaque[i], event);
1797 20d8a3ed ths
}
1798 20d8a3ed ths
1799 20d8a3ed ths
static void mux_chr_update_read_handler(CharDriverState *chr)
1800 20d8a3ed ths
{
1801 20d8a3ed ths
    MuxDriver *d = chr->opaque;
1802 20d8a3ed ths
1803 20d8a3ed ths
    if (d->mux_cnt >= MAX_MUX) {
1804 20d8a3ed ths
        fprintf(stderr, "Cannot add I/O handlers, MUX array is full\n");
1805 20d8a3ed ths
        return;
1806 20d8a3ed ths
    }
1807 20d8a3ed ths
    d->ext_opaque[d->mux_cnt] = chr->handler_opaque;
1808 20d8a3ed ths
    d->chr_can_read[d->mux_cnt] = chr->chr_can_read;
1809 20d8a3ed ths
    d->chr_read[d->mux_cnt] = chr->chr_read;
1810 20d8a3ed ths
    d->chr_event[d->mux_cnt] = chr->chr_event;
1811 20d8a3ed ths
    /* Fix up the real driver with mux routines */
1812 20d8a3ed ths
    if (d->mux_cnt == 0) {
1813 20d8a3ed ths
        qemu_chr_add_handlers(d->drv, mux_chr_can_read, mux_chr_read,
1814 20d8a3ed ths
                              mux_chr_event, chr);
1815 20d8a3ed ths
    }
1816 20d8a3ed ths
    chr->focus = d->mux_cnt;
1817 20d8a3ed ths
    d->mux_cnt++;
1818 20d8a3ed ths
}
1819 20d8a3ed ths
1820 20d8a3ed ths
CharDriverState *qemu_chr_open_mux(CharDriverState *drv)
1821 20d8a3ed ths
{
1822 20d8a3ed ths
    CharDriverState *chr;
1823 20d8a3ed ths
    MuxDriver *d;
1824 20d8a3ed ths
1825 20d8a3ed ths
    chr = qemu_mallocz(sizeof(CharDriverState));
1826 20d8a3ed ths
    if (!chr)
1827 20d8a3ed ths
        return NULL;
1828 20d8a3ed ths
    d = qemu_mallocz(sizeof(MuxDriver));
1829 20d8a3ed ths
    if (!d) {
1830 20d8a3ed ths
        free(chr);
1831 20d8a3ed ths
        return NULL;
1832 20d8a3ed ths
    }
1833 20d8a3ed ths
1834 20d8a3ed ths
    chr->opaque = d;
1835 20d8a3ed ths
    d->drv = drv;
1836 20d8a3ed ths
    chr->focus = -1;
1837 20d8a3ed ths
    chr->chr_write = mux_chr_write;
1838 20d8a3ed ths
    chr->chr_update_read_handler = mux_chr_update_read_handler;
1839 20d8a3ed ths
    return chr;
1840 20d8a3ed ths
}
1841 20d8a3ed ths
1842 20d8a3ed ths
1843 fd1dff4b bellard
#ifdef _WIN32
1844 82c643ff bellard
1845 fd1dff4b bellard
static void socket_cleanup(void)
1846 fd1dff4b bellard
{
1847 fd1dff4b bellard
    WSACleanup();
1848 fd1dff4b bellard
}
1849 82c643ff bellard
1850 fd1dff4b bellard
static int socket_init(void)
1851 fd1dff4b bellard
{
1852 fd1dff4b bellard
    WSADATA Data;
1853 fd1dff4b bellard
    int ret, err;
1854 fd1dff4b bellard
1855 fd1dff4b bellard
    ret = WSAStartup(MAKEWORD(2,2), &Data);
1856 fd1dff4b bellard
    if (ret != 0) {
1857 fd1dff4b bellard
        err = WSAGetLastError();
1858 fd1dff4b bellard
        fprintf(stderr, "WSAStartup: %d\n", err);
1859 fd1dff4b bellard
        return -1;
1860 fd1dff4b bellard
    }
1861 fd1dff4b bellard
    atexit(socket_cleanup);
1862 fd1dff4b bellard
    return 0;
1863 fd1dff4b bellard
}
1864 fd1dff4b bellard
1865 fd1dff4b bellard
static int send_all(int fd, const uint8_t *buf, int len1)
1866 fd1dff4b bellard
{
1867 fd1dff4b bellard
    int ret, len;
1868 3b46e624 ths
1869 fd1dff4b bellard
    len = len1;
1870 fd1dff4b bellard
    while (len > 0) {
1871 fd1dff4b bellard
        ret = send(fd, buf, len, 0);
1872 fd1dff4b bellard
        if (ret < 0) {
1873 fd1dff4b bellard
            int errno;
1874 fd1dff4b bellard
            errno = WSAGetLastError();
1875 fd1dff4b bellard
            if (errno != WSAEWOULDBLOCK) {
1876 fd1dff4b bellard
                return -1;
1877 fd1dff4b bellard
            }
1878 fd1dff4b bellard
        } else if (ret == 0) {
1879 fd1dff4b bellard
            break;
1880 fd1dff4b bellard
        } else {
1881 fd1dff4b bellard
            buf += ret;
1882 fd1dff4b bellard
            len -= ret;
1883 fd1dff4b bellard
        }
1884 fd1dff4b bellard
    }
1885 fd1dff4b bellard
    return len1 - len;
1886 fd1dff4b bellard
}
1887 fd1dff4b bellard
1888 fd1dff4b bellard
void socket_set_nonblock(int fd)
1889 fd1dff4b bellard
{
1890 fd1dff4b bellard
    unsigned long opt = 1;
1891 fd1dff4b bellard
    ioctlsocket(fd, FIONBIO, &opt);
1892 fd1dff4b bellard
}
1893 fd1dff4b bellard
1894 fd1dff4b bellard
#else
1895 fd1dff4b bellard
1896 1d96905d bellard
static int unix_write(int fd, const uint8_t *buf, int len1)
1897 1d96905d bellard
{
1898 1d96905d bellard
    int ret, len;
1899 1d96905d bellard
1900 1d96905d bellard
    len = len1;
1901 1d96905d bellard
    while (len > 0) {
1902 1d96905d bellard
        ret = write(fd, buf, len);
1903 1d96905d bellard
        if (ret < 0) {
1904 1d96905d bellard
            if (errno != EINTR && errno != EAGAIN)
1905 1d96905d bellard
                return -1;
1906 1d96905d bellard
        } else if (ret == 0) {
1907 1d96905d bellard
            break;
1908 1d96905d bellard
        } else {
1909 1d96905d bellard
            buf += ret;
1910 1d96905d bellard
            len -= ret;
1911 1d96905d bellard
        }
1912 1d96905d bellard
    }
1913 1d96905d bellard
    return len1 - len;
1914 1d96905d bellard
}
1915 1d96905d bellard
1916 fd1dff4b bellard
static inline int send_all(int fd, const uint8_t *buf, int len1)
1917 fd1dff4b bellard
{
1918 fd1dff4b bellard
    return unix_write(fd, buf, len1);
1919 fd1dff4b bellard
}
1920 fd1dff4b bellard
1921 fd1dff4b bellard
void socket_set_nonblock(int fd)
1922 fd1dff4b bellard
{
1923 fd1dff4b bellard
    fcntl(fd, F_SETFL, O_NONBLOCK);
1924 fd1dff4b bellard
}
1925 fd1dff4b bellard
#endif /* !_WIN32 */
1926 fd1dff4b bellard
1927 fd1dff4b bellard
#ifndef _WIN32
1928 fd1dff4b bellard
1929 fd1dff4b bellard
typedef struct {
1930 fd1dff4b bellard
    int fd_in, fd_out;
1931 fd1dff4b bellard
    int max_size;
1932 fd1dff4b bellard
} FDCharDriver;
1933 fd1dff4b bellard
1934 20d8a3ed ths
#define STDIO_MAX_CLIENTS 1
1935 20d8a3ed ths
static int stdio_nb_clients = 0;
1936 fd1dff4b bellard
1937 82c643ff bellard
static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1938 82c643ff bellard
{
1939 82c643ff bellard
    FDCharDriver *s = chr->opaque;
1940 1d96905d bellard
    return unix_write(s->fd_out, buf, len);
1941 82c643ff bellard
}
1942 82c643ff bellard
1943 7c9d8e07 bellard
static int fd_chr_read_poll(void *opaque)
1944 7c9d8e07 bellard
{
1945 7c9d8e07 bellard
    CharDriverState *chr = opaque;
1946 7c9d8e07 bellard
    FDCharDriver *s = chr->opaque;
1947 7c9d8e07 bellard
1948 e5b0bc44 pbrook
    s->max_size = qemu_chr_can_read(chr);
1949 7c9d8e07 bellard
    return s->max_size;
1950 7c9d8e07 bellard
}
1951 7c9d8e07 bellard
1952 7c9d8e07 bellard
static void fd_chr_read(void *opaque)
1953 7c9d8e07 bellard
{
1954 7c9d8e07 bellard
    CharDriverState *chr = opaque;
1955 7c9d8e07 bellard
    FDCharDriver *s = chr->opaque;
1956 7c9d8e07 bellard
    int size, len;
1957 7c9d8e07 bellard
    uint8_t buf[1024];
1958 3b46e624 ths
1959 7c9d8e07 bellard
    len = sizeof(buf);
1960 7c9d8e07 bellard
    if (len > s->max_size)
1961 7c9d8e07 bellard
        len = s->max_size;
1962 7c9d8e07 bellard
    if (len == 0)
1963 7c9d8e07 bellard
        return;
1964 7c9d8e07 bellard
    size = read(s->fd_in, buf, len);
1965 188157fe pbrook
    if (size == 0) {
1966 188157fe pbrook
        /* FD has been closed. Remove it from the active list.  */
1967 188157fe pbrook
        qemu_set_fd_handler2(s->fd_in, NULL, NULL, NULL, NULL);
1968 188157fe pbrook
        return;
1969 188157fe pbrook
    }
1970 7c9d8e07 bellard
    if (size > 0) {
1971 e5b0bc44 pbrook
        qemu_chr_read(chr, buf, size);
1972 7c9d8e07 bellard
    }
1973 7c9d8e07 bellard
}
1974 7c9d8e07 bellard
1975 e5b0bc44 pbrook
static void fd_chr_update_read_handler(CharDriverState *chr)
1976 82c643ff bellard
{
1977 82c643ff bellard
    FDCharDriver *s = chr->opaque;
1978 82c643ff bellard
1979 f8d179e3 bellard
    if (s->fd_in >= 0) {
1980 f8d179e3 bellard
        if (nographic && s->fd_in == 0) {
1981 f8d179e3 bellard
        } else {
1982 5fafdf24 ths
            qemu_set_fd_handler2(s->fd_in, fd_chr_read_poll,
1983 7c9d8e07 bellard
                                 fd_chr_read, NULL, chr);
1984 f8d179e3 bellard
        }
1985 82c643ff bellard
    }
1986 82c643ff bellard
}
1987 82c643ff bellard
1988 82c643ff bellard
/* open a character device to a unix fd */
1989 52f61fde ths
static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
1990 82c643ff bellard
{
1991 82c643ff bellard
    CharDriverState *chr;
1992 82c643ff bellard
    FDCharDriver *s;
1993 82c643ff bellard
1994 82c643ff bellard
    chr = qemu_mallocz(sizeof(CharDriverState));
1995 82c643ff bellard
    if (!chr)
1996 82c643ff bellard
        return NULL;
1997 82c643ff bellard
    s = qemu_mallocz(sizeof(FDCharDriver));
1998 82c643ff bellard
    if (!s) {
1999 82c643ff bellard
        free(chr);
2000 82c643ff bellard
        return NULL;
2001 82c643ff bellard
    }
2002 82c643ff bellard
    s->fd_in = fd_in;
2003 82c643ff bellard
    s->fd_out = fd_out;
2004 82c643ff bellard
    chr->opaque = s;
2005 82c643ff bellard
    chr->chr_write = fd_chr_write;
2006 e5b0bc44 pbrook
    chr->chr_update_read_handler = fd_chr_update_read_handler;
2007 86e94dea ths
2008 86e94dea ths
    qemu_chr_reset(chr);
2009 86e94dea ths
2010 82c643ff bellard
    return chr;
2011 82c643ff bellard
}
2012 82c643ff bellard
2013 52f61fde ths
static CharDriverState *qemu_chr_open_file_out(const char *file_out)
2014 f8d179e3 bellard
{
2015 f8d179e3 bellard
    int fd_out;
2016 f8d179e3 bellard
2017 aeb30be6 balrog
    TFR(fd_out = open(file_out, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0666));
2018 f8d179e3 bellard
    if (fd_out < 0)
2019 f8d179e3 bellard
        return NULL;
2020 f8d179e3 bellard
    return qemu_chr_open_fd(-1, fd_out);
2021 f8d179e3 bellard
}
2022 f8d179e3 bellard
2023 52f61fde ths
static CharDriverState *qemu_chr_open_pipe(const char *filename)
2024 f8d179e3 bellard
{
2025 c26c1c4b ths
    int fd_in, fd_out;
2026 c26c1c4b ths
    char filename_in[256], filename_out[256];
2027 c26c1c4b ths
2028 c26c1c4b ths
    snprintf(filename_in, 256, "%s.in", filename);
2029 c26c1c4b ths
    snprintf(filename_out, 256, "%s.out", filename);
2030 aeb30be6 balrog
    TFR(fd_in = open(filename_in, O_RDWR | O_BINARY));
2031 aeb30be6 balrog
    TFR(fd_out = open(filename_out, O_RDWR | O_BINARY));
2032 c26c1c4b ths
    if (fd_in < 0 || fd_out < 0) {
2033 c26c1c4b ths
        if (fd_in >= 0)
2034 c26c1c4b ths
            close(fd_in);
2035 c26c1c4b ths
        if (fd_out >= 0)
2036 c26c1c4b ths
            close(fd_out);
2037 aeb30be6 balrog
        TFR(fd_in = fd_out = open(filename, O_RDWR | O_BINARY));
2038 c26c1c4b ths
        if (fd_in < 0)
2039 c26c1c4b ths
            return NULL;
2040 c26c1c4b ths
    }
2041 c26c1c4b ths
    return qemu_chr_open_fd(fd_in, fd_out);
2042 f8d179e3 bellard
}
2043 f8d179e3 bellard
2044 f8d179e3 bellard
2045 82c643ff bellard
/* for STDIO, we handle the case where several clients use it
2046 82c643ff bellard
   (nographic mode) */
2047 82c643ff bellard
2048 aa0bc6b6 bellard
#define TERM_FIFO_MAX_SIZE 1
2049 aa0bc6b6 bellard
2050 aa0bc6b6 bellard
static uint8_t term_fifo[TERM_FIFO_MAX_SIZE];
2051 1dce7c3c bellard
static int term_fifo_size;
2052 330d0414 bellard
2053 7c9d8e07 bellard
static int stdio_read_poll(void *opaque)
2054 82c643ff bellard
{
2055 20d8a3ed ths
    CharDriverState *chr = opaque;
2056 aa0bc6b6 bellard
2057 20d8a3ed ths
    /* try to flush the queue if needed */
2058 20d8a3ed ths
    if (term_fifo_size != 0 && qemu_chr_can_read(chr) > 0) {
2059 20d8a3ed ths
        qemu_chr_read(chr, term_fifo, 1);
2060 20d8a3ed ths
        term_fifo_size = 0;
2061 aa0bc6b6 bellard
    }
2062 20d8a3ed ths
    /* see if we can absorb more chars */
2063 20d8a3ed ths
    if (term_fifo_size == 0)
2064 20d8a3ed ths
        return 1;
2065 20d8a3ed ths
    else
2066 20d8a3ed ths
        return 0;
2067 82c643ff bellard
}
2068 82c643ff bellard
2069 7c9d8e07 bellard
static void stdio_read(void *opaque)
2070 82c643ff bellard
{
2071 7c9d8e07 bellard
    int size;
2072 7c9d8e07 bellard
    uint8_t buf[1];
2073 20d8a3ed ths
    CharDriverState *chr = opaque;
2074 20d8a3ed ths
2075 7c9d8e07 bellard
    size = read(0, buf, 1);
2076 519945df pbrook
    if (size == 0) {
2077 519945df pbrook
        /* stdin has been closed. Remove it from the active list.  */
2078 519945df pbrook
        qemu_set_fd_handler2(0, NULL, NULL, NULL, NULL);
2079 519945df pbrook
        return;
2080 519945df pbrook
    }
2081 20d8a3ed ths
    if (size > 0) {
2082 20d8a3ed ths
        if (qemu_chr_can_read(chr) > 0) {
2083 20d8a3ed ths
            qemu_chr_read(chr, buf, 1);
2084 20d8a3ed ths
        } else if (term_fifo_size == 0) {
2085 20d8a3ed ths
            term_fifo[term_fifo_size++] = buf[0];
2086 1dce7c3c bellard
        }
2087 1dce7c3c bellard
    }
2088 1dce7c3c bellard
}
2089 1dce7c3c bellard
2090 8d11df9e bellard
/* init terminal so that we can grab keys */
2091 8d11df9e bellard
static struct termios oldtty;
2092 8d11df9e bellard
static int old_fd0_flags;
2093 8d11df9e bellard
2094 8d11df9e bellard
static void term_exit(void)
2095 8d11df9e bellard
{
2096 8d11df9e bellard
    tcsetattr (0, TCSANOW, &oldtty);
2097 8d11df9e bellard
    fcntl(0, F_SETFL, old_fd0_flags);
2098 8d11df9e bellard
}
2099 8d11df9e bellard
2100 8d11df9e bellard
static void term_init(void)
2101 8d11df9e bellard
{
2102 8d11df9e bellard
    struct termios tty;
2103 8d11df9e bellard
2104 8d11df9e bellard
    tcgetattr (0, &tty);
2105 8d11df9e bellard
    oldtty = tty;
2106 8d11df9e bellard
    old_fd0_flags = fcntl(0, F_GETFL);
2107 8d11df9e bellard
2108 8d11df9e bellard
    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
2109 8d11df9e bellard
                          |INLCR|IGNCR|ICRNL|IXON);
2110 8d11df9e bellard
    tty.c_oflag |= OPOST;
2111 8d11df9e bellard
    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
2112 8d11df9e bellard
    /* if graphical mode, we allow Ctrl-C handling */
2113 8d11df9e bellard
    if (nographic)
2114 8d11df9e bellard
        tty.c_lflag &= ~ISIG;
2115 8d11df9e bellard
    tty.c_cflag &= ~(CSIZE|PARENB);
2116 8d11df9e bellard
    tty.c_cflag |= CS8;
2117 8d11df9e bellard
    tty.c_cc[VMIN] = 1;
2118 8d11df9e bellard
    tty.c_cc[VTIME] = 0;
2119 3b46e624 ths
2120 8d11df9e bellard
    tcsetattr (0, TCSANOW, &tty);
2121 8d11df9e bellard
2122 8d11df9e bellard
    atexit(term_exit);
2123 8d11df9e bellard
2124 8d11df9e bellard
    fcntl(0, F_SETFL, O_NONBLOCK);
2125 8d11df9e bellard
}
2126 8d11df9e bellard
2127 52f61fde ths
static CharDriverState *qemu_chr_open_stdio(void)
2128 82c643ff bellard
{
2129 82c643ff bellard
    CharDriverState *chr;
2130 82c643ff bellard
2131 20d8a3ed ths
    if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
2132 20d8a3ed ths
        return NULL;
2133 20d8a3ed ths
    chr = qemu_chr_open_fd(0, 1);
2134 20d8a3ed ths
    qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, chr);
2135 20d8a3ed ths
    stdio_nb_clients++;
2136 20d8a3ed ths
    term_init();
2137 20d8a3ed ths
2138 82c643ff bellard
    return chr;
2139 82c643ff bellard
}
2140 82c643ff bellard
2141 aec62507 ths
#if defined(__linux__) || defined(__sun__)
2142 52f61fde ths
static CharDriverState *qemu_chr_open_pty(void)
2143 82c643ff bellard
{
2144 91fc2119 bellard
    struct termios tty;
2145 82c643ff bellard
    char slave_name[1024];
2146 82c643ff bellard
    int master_fd, slave_fd;
2147 3b46e624 ths
2148 aec62507 ths
#if defined(__linux__)
2149 82c643ff bellard
    /* Not satisfying */
2150 82c643ff bellard
    if (openpty(&master_fd, &slave_fd, slave_name, NULL, NULL) < 0) {
2151 82c643ff bellard
        return NULL;
2152 82c643ff bellard
    }
2153 aec62507 ths
#endif
2154 3b46e624 ths
2155 91fc2119 bellard
    /* Disabling local echo and line-buffered output */
2156 91fc2119 bellard
    tcgetattr (master_fd, &tty);
2157 91fc2119 bellard
    tty.c_lflag &= ~(ECHO|ICANON|ISIG);
2158 91fc2119 bellard
    tty.c_cc[VMIN] = 1;
2159 91fc2119 bellard
    tty.c_cc[VTIME] = 0;
2160 91fc2119 bellard
    tcsetattr (master_fd, TCSAFLUSH, &tty);
2161 91fc2119 bellard
2162 82c643ff bellard
    fprintf(stderr, "char device redirected to %s\n", slave_name);
2163 82c643ff bellard
    return qemu_chr_open_fd(master_fd, master_fd);
2164 82c643ff bellard
}
2165 f8d179e3 bellard
2166 5fafdf24 ths
static void tty_serial_init(int fd, int speed,
2167 f8d179e3 bellard
                            int parity, int data_bits, int stop_bits)
2168 f8d179e3 bellard
{
2169 f8d179e3 bellard
    struct termios tty;
2170 f8d179e3 bellard
    speed_t spd;
2171 f8d179e3 bellard
2172 e57a8c0e bellard
#if 0
2173 5fafdf24 ths
    printf("tty_serial_init: speed=%d parity=%c data=%d stop=%d\n",
2174 e57a8c0e bellard
           speed, parity, data_bits, stop_bits);
2175 e57a8c0e bellard
#endif
2176 e57a8c0e bellard
    tcgetattr (fd, &tty);
2177 f8d179e3 bellard
2178 f8d179e3 bellard
    switch(speed) {
2179 f8d179e3 bellard
    case 50:
2180 f8d179e3 bellard
        spd = B50;
2181 f8d179e3 bellard
        break;
2182 f8d179e3 bellard
    case 75:
2183 f8d179e3 bellard
        spd = B75;
2184 f8d179e3 bellard
        break;
2185 f8d179e3 bellard
    case 300:
2186 f8d179e3 bellard
        spd = B300;
2187 f8d179e3 bellard
        break;
2188 f8d179e3 bellard
    case 600:
2189 f8d179e3 bellard
        spd = B600;
2190 f8d179e3 bellard
        break;
2191 f8d179e3 bellard
    case 1200:
2192 f8d179e3 bellard
        spd = B1200;
2193 f8d179e3 bellard
        break;
2194 f8d179e3 bellard
    case 2400:
2195 f8d179e3 bellard
        spd = B2400;
2196 f8d179e3 bellard
        break;
2197 f8d179e3 bellard
    case 4800:
2198 f8d179e3 bellard
        spd = B4800;
2199 f8d179e3 bellard
        break;
2200 f8d179e3 bellard
    case 9600:
2201 f8d179e3 bellard
        spd = B9600;
2202 f8d179e3 bellard
        break;
2203 f8d179e3 bellard
    case 19200:
2204 f8d179e3 bellard
        spd = B19200;
2205 f8d179e3 bellard
        break;
2206 f8d179e3 bellard
    case 38400:
2207 f8d179e3 bellard
        spd = B38400;
2208 f8d179e3 bellard
        break;
2209 f8d179e3 bellard
    case 57600:
2210 f8d179e3 bellard
        spd = B57600;
2211 f8d179e3 bellard
        break;
2212 f8d179e3 bellard
    default:
2213 f8d179e3 bellard
    case 115200:
2214 f8d179e3 bellard
        spd = B115200;
2215 f8d179e3 bellard
        break;
2216 f8d179e3 bellard
    }
2217 f8d179e3 bellard
2218 f8d179e3 bellard
    cfsetispeed(&tty, spd);
2219 f8d179e3 bellard
    cfsetospeed(&tty, spd);
2220 f8d179e3 bellard
2221 f8d179e3 bellard
    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
2222 f8d179e3 bellard
                          |INLCR|IGNCR|ICRNL|IXON);
2223 f8d179e3 bellard
    tty.c_oflag |= OPOST;
2224 f8d179e3 bellard
    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG);
2225 094eed6c bellard
    tty.c_cflag &= ~(CSIZE|PARENB|PARODD|CRTSCTS|CSTOPB);
2226 f8d179e3 bellard
    switch(data_bits) {
2227 f8d179e3 bellard
    default:
2228 f8d179e3 bellard
    case 8:
2229 f8d179e3 bellard
        tty.c_cflag |= CS8;
2230 f8d179e3 bellard
        break;
2231 f8d179e3 bellard
    case 7:
2232 f8d179e3 bellard
        tty.c_cflag |= CS7;
2233 f8d179e3 bellard
        break;
2234 f8d179e3 bellard
    case 6:
2235 f8d179e3 bellard
        tty.c_cflag |= CS6;
2236 f8d179e3 bellard
        break;
2237 f8d179e3 bellard
    case 5:
2238 f8d179e3 bellard
        tty.c_cflag |= CS5;
2239 f8d179e3 bellard
        break;
2240 f8d179e3 bellard
    }
2241 f8d179e3 bellard
    switch(parity) {
2242 f8d179e3 bellard
    default:
2243 f8d179e3 bellard
    case 'N':
2244 f8d179e3 bellard
        break;
2245 f8d179e3 bellard
    case 'E':
2246 f8d179e3 bellard
        tty.c_cflag |= PARENB;
2247 f8d179e3 bellard
        break;
2248 f8d179e3 bellard
    case 'O':
2249 f8d179e3 bellard
        tty.c_cflag |= PARENB | PARODD;
2250 f8d179e3 bellard
        break;
2251 f8d179e3 bellard
    }
2252 094eed6c bellard
    if (stop_bits == 2)
2253 094eed6c bellard
        tty.c_cflag |= CSTOPB;
2254 3b46e624 ths
2255 f8d179e3 bellard
    tcsetattr (fd, TCSANOW, &tty);
2256 f8d179e3 bellard
}
2257 f8d179e3 bellard
2258 e57a8c0e bellard
static int tty_serial_ioctl(CharDriverState *chr, int cmd, void *arg)
2259 f8d179e3 bellard
{
2260 f8d179e3 bellard
    FDCharDriver *s = chr->opaque;
2261 3b46e624 ths
2262 e57a8c0e bellard
    switch(cmd) {
2263 e57a8c0e bellard
    case CHR_IOCTL_SERIAL_SET_PARAMS:
2264 e57a8c0e bellard
        {
2265 e57a8c0e bellard
            QEMUSerialSetParams *ssp = arg;
2266 5fafdf24 ths
            tty_serial_init(s->fd_in, ssp->speed, ssp->parity,
2267 e57a8c0e bellard
                            ssp->data_bits, ssp->stop_bits);
2268 e57a8c0e bellard
        }
2269 e57a8c0e bellard
        break;
2270 e57a8c0e bellard
    case CHR_IOCTL_SERIAL_SET_BREAK:
2271 e57a8c0e bellard
        {
2272 e57a8c0e bellard
            int enable = *(int *)arg;
2273 e57a8c0e bellard
            if (enable)
2274 e57a8c0e bellard
                tcsendbreak(s->fd_in, 1);
2275 e57a8c0e bellard
        }
2276 e57a8c0e bellard
        break;
2277 e57a8c0e bellard
    default:
2278 e57a8c0e bellard
        return -ENOTSUP;
2279 e57a8c0e bellard
    }
2280 e57a8c0e bellard
    return 0;
2281 f8d179e3 bellard
}
2282 f8d179e3 bellard
2283 52f61fde ths
static CharDriverState *qemu_chr_open_tty(const char *filename)
2284 f8d179e3 bellard
{
2285 f8d179e3 bellard
    CharDriverState *chr;
2286 f8d179e3 bellard
    int fd;
2287 f8d179e3 bellard
2288 aeb30be6 balrog
    TFR(fd = open(filename, O_RDWR | O_NONBLOCK));
2289 f8d179e3 bellard
    fcntl(fd, F_SETFL, O_NONBLOCK);
2290 f8d179e3 bellard
    tty_serial_init(fd, 115200, 'N', 8, 1);
2291 f8d179e3 bellard
    chr = qemu_chr_open_fd(fd, fd);
2292 aeb30be6 balrog
    if (!chr) {
2293 aeb30be6 balrog
        close(fd);
2294 f8d179e3 bellard
        return NULL;
2295 aeb30be6 balrog
    }
2296 e57a8c0e bellard
    chr->chr_ioctl = tty_serial_ioctl;
2297 86e94dea ths
    qemu_chr_reset(chr);
2298 e57a8c0e bellard
    return chr;
2299 e57a8c0e bellard
}
2300 aec62507 ths
#else  /* ! __linux__ && ! __sun__ */
2301 aec62507 ths
static CharDriverState *qemu_chr_open_pty(void)
2302 aec62507 ths
{
2303 aec62507 ths
    return NULL;
2304 aec62507 ths
}
2305 aec62507 ths
#endif /* __linux__ || __sun__ */
2306 e57a8c0e bellard
2307 aec62507 ths
#if defined(__linux__)
2308 5867c88a ths
typedef struct {
2309 5867c88a ths
    int fd;
2310 5867c88a ths
    int mode;
2311 5867c88a ths
} ParallelCharDriver;
2312 5867c88a ths
2313 5867c88a ths
static int pp_hw_mode(ParallelCharDriver *s, uint16_t mode)
2314 5867c88a ths
{
2315 5867c88a ths
    if (s->mode != mode) {
2316 5867c88a ths
        int m = mode;
2317 5867c88a ths
        if (ioctl(s->fd, PPSETMODE, &m) < 0)
2318 5867c88a ths
            return 0;
2319 5867c88a ths
        s->mode = mode;
2320 5867c88a ths
    }
2321 5867c88a ths
    return 1;
2322 5867c88a ths
}
2323 5867c88a ths
2324 e57a8c0e bellard
static int pp_ioctl(CharDriverState *chr, int cmd, void *arg)
2325 e57a8c0e bellard
{
2326 5867c88a ths
    ParallelCharDriver *drv = chr->opaque;
2327 5867c88a ths
    int fd = drv->fd;
2328 e57a8c0e bellard
    uint8_t b;
2329 e57a8c0e bellard
2330 e57a8c0e bellard
    switch(cmd) {
2331 e57a8c0e bellard
    case CHR_IOCTL_PP_READ_DATA:
2332 e57a8c0e bellard
        if (ioctl(fd, PPRDATA, &b) < 0)
2333 e57a8c0e bellard
            return -ENOTSUP;
2334 e57a8c0e bellard
        *(uint8_t *)arg = b;
2335 e57a8c0e bellard
        break;
2336 e57a8c0e bellard
    case CHR_IOCTL_PP_WRITE_DATA:
2337 e57a8c0e bellard
        b = *(uint8_t *)arg;
2338 e57a8c0e bellard
        if (ioctl(fd, PPWDATA, &b) < 0)
2339 e57a8c0e bellard
            return -ENOTSUP;
2340 e57a8c0e bellard
        break;
2341 e57a8c0e bellard
    case CHR_IOCTL_PP_READ_CONTROL:
2342 e57a8c0e bellard
        if (ioctl(fd, PPRCONTROL, &b) < 0)
2343 e57a8c0e bellard
            return -ENOTSUP;
2344 5867c88a ths
        /* Linux gives only the lowest bits, and no way to know data
2345 5867c88a ths
           direction! For better compatibility set the fixed upper
2346 5867c88a ths
           bits. */
2347 5867c88a ths
        *(uint8_t *)arg = b | 0xc0;
2348 e57a8c0e bellard
        break;
2349 e57a8c0e bellard
    case CHR_IOCTL_PP_WRITE_CONTROL:
2350 e57a8c0e bellard
        b = *(uint8_t *)arg;
2351 e57a8c0e bellard
        if (ioctl(fd, PPWCONTROL, &b) < 0)
2352 e57a8c0e bellard
            return -ENOTSUP;
2353 e57a8c0e bellard
        break;
2354 e57a8c0e bellard
    case CHR_IOCTL_PP_READ_STATUS:
2355 e57a8c0e bellard
        if (ioctl(fd, PPRSTATUS, &b) < 0)
2356 e57a8c0e bellard
            return -ENOTSUP;
2357 e57a8c0e bellard
        *(uint8_t *)arg = b;
2358 e57a8c0e bellard
        break;
2359 5867c88a ths
    case CHR_IOCTL_PP_EPP_READ_ADDR:
2360 5867c88a ths
        if (pp_hw_mode(drv, IEEE1284_MODE_EPP|IEEE1284_ADDR)) {
2361 5867c88a ths
            struct ParallelIOArg *parg = arg;
2362 5867c88a ths
            int n = read(fd, parg->buffer, parg->count);
2363 5867c88a ths
            if (n != parg->count) {
2364 5867c88a ths
                return -EIO;
2365 5867c88a ths
            }
2366 5867c88a ths
        }
2367 5867c88a ths
        break;
2368 5867c88a ths
    case CHR_IOCTL_PP_EPP_READ:
2369 5867c88a ths
        if (pp_hw_mode(drv, IEEE1284_MODE_EPP)) {
2370 5867c88a ths
            struct ParallelIOArg *parg = arg;
2371 5867c88a ths
            int n = read(fd, parg->buffer, parg->count);
2372 5867c88a ths
            if (n != parg->count) {
2373 5867c88a ths
                return -EIO;
2374 5867c88a ths
            }
2375 5867c88a ths
        }
2376 5867c88a ths
        break;
2377 5867c88a ths
    case CHR_IOCTL_PP_EPP_WRITE_ADDR:
2378 5867c88a ths
        if (pp_hw_mode(drv, IEEE1284_MODE_EPP|IEEE1284_ADDR)) {
2379 5867c88a ths
            struct ParallelIOArg *parg = arg;
2380 5867c88a ths
            int n = write(fd, parg->buffer, parg->count);
2381 5867c88a ths
            if (n != parg->count) {
2382 5867c88a ths
                return -EIO;
2383 5867c88a ths
            }
2384 5867c88a ths
        }
2385 5867c88a ths
        break;
2386 5867c88a ths
    case CHR_IOCTL_PP_EPP_WRITE:
2387 5867c88a ths
        if (pp_hw_mode(drv, IEEE1284_MODE_EPP)) {
2388 5867c88a ths
            struct ParallelIOArg *parg = arg;
2389 5867c88a ths
            int n = write(fd, parg->buffer, parg->count);
2390 5867c88a ths
            if (n != parg->count) {
2391 5867c88a ths
                return -EIO;
2392 5867c88a ths
            }
2393 5867c88a ths
        }
2394 5867c88a ths
        break;
2395 e57a8c0e bellard
    default:
2396 e57a8c0e bellard
        return -ENOTSUP;
2397 e57a8c0e bellard
    }
2398 e57a8c0e bellard
    return 0;
2399 e57a8c0e bellard
}
2400 e57a8c0e bellard
2401 5867c88a ths
static void pp_close(CharDriverState *chr)
2402 5867c88a ths
{
2403 5867c88a ths
    ParallelCharDriver *drv = chr->opaque;
2404 5867c88a ths
    int fd = drv->fd;
2405 5867c88a ths
2406 5867c88a ths
    pp_hw_mode(drv, IEEE1284_MODE_COMPAT);
2407 5867c88a ths
    ioctl(fd, PPRELEASE);
2408 5867c88a ths
    close(fd);
2409 5867c88a ths
    qemu_free(drv);
2410 5867c88a ths
}
2411 5867c88a ths
2412 52f61fde ths
static CharDriverState *qemu_chr_open_pp(const char *filename)
2413 e57a8c0e bellard
{
2414 e57a8c0e bellard
    CharDriverState *chr;
2415 5867c88a ths
    ParallelCharDriver *drv;
2416 e57a8c0e bellard
    int fd;
2417 e57a8c0e bellard
2418 aeb30be6 balrog
    TFR(fd = open(filename, O_RDWR));
2419 e57a8c0e bellard
    if (fd < 0)
2420 e57a8c0e bellard
        return NULL;
2421 e57a8c0e bellard
2422 e57a8c0e bellard
    if (ioctl(fd, PPCLAIM) < 0) {
2423 e57a8c0e bellard
        close(fd);
2424 e57a8c0e bellard
        return NULL;
2425 e57a8c0e bellard
    }
2426 e57a8c0e bellard
2427 5867c88a ths
    drv = qemu_mallocz(sizeof(ParallelCharDriver));
2428 5867c88a ths
    if (!drv) {
2429 5867c88a ths
        close(fd);
2430 5867c88a ths
        return NULL;
2431 5867c88a ths
    }
2432 5867c88a ths
    drv->fd = fd;
2433 5867c88a ths
    drv->mode = IEEE1284_MODE_COMPAT;
2434 5867c88a ths
2435 e57a8c0e bellard
    chr = qemu_mallocz(sizeof(CharDriverState));
2436 e57a8c0e bellard
    if (!chr) {
2437 5867c88a ths
        qemu_free(drv);
2438 e57a8c0e bellard
        close(fd);
2439 e57a8c0e bellard
        return NULL;
2440 e57a8c0e bellard
    }
2441 e57a8c0e bellard
    chr->chr_write = null_chr_write;
2442 e57a8c0e bellard
    chr->chr_ioctl = pp_ioctl;
2443 5867c88a ths
    chr->chr_close = pp_close;
2444 5867c88a ths
    chr->opaque = drv;
2445 86e94dea ths
2446 86e94dea ths
    qemu_chr_reset(chr);
2447 86e94dea ths
2448 f8d179e3 bellard
    return chr;
2449 f8d179e3 bellard
}
2450 aec62507 ths
#endif /* __linux__ */
2451 f8d179e3 bellard
2452 aec62507 ths
#else /* _WIN32 */
2453 82c643ff bellard
2454 f331110f bellard
typedef struct {
2455 f331110f bellard
    int max_size;
2456 f331110f bellard
    HANDLE hcom, hrecv, hsend;
2457 f331110f bellard
    OVERLAPPED orecv, osend;
2458 f331110f bellard
    BOOL fpipe;
2459 f331110f bellard
    DWORD len;
2460 f331110f bellard
} WinCharState;
2461 f331110f bellard
2462 f331110f bellard
#define NSENDBUF 2048
2463 f331110f bellard
#define NRECVBUF 2048
2464 f331110f bellard
#define MAXCONNECT 1
2465 f331110f bellard
#define NTIMEOUT 5000
2466 f331110f bellard
2467 f331110f bellard
static int win_chr_poll(void *opaque);
2468 f331110f bellard
static int win_chr_pipe_poll(void *opaque);
2469 f331110f bellard
2470 087f4ae0 ths
static void win_chr_close(CharDriverState *chr)
2471 f331110f bellard
{
2472 087f4ae0 ths
    WinCharState *s = chr->opaque;
2473 087f4ae0 ths
2474 f331110f bellard
    if (s->hsend) {
2475 f331110f bellard
        CloseHandle(s->hsend);
2476 f331110f bellard
        s->hsend = NULL;
2477 f331110f bellard
    }
2478 f331110f bellard
    if (s->hrecv) {
2479 f331110f bellard
        CloseHandle(s->hrecv);
2480 f331110f bellard
        s->hrecv = NULL;
2481 f331110f bellard
    }
2482 f331110f bellard
    if (s->hcom) {
2483 f331110f bellard
        CloseHandle(s->hcom);
2484 f331110f bellard
        s->hcom = NULL;
2485 f331110f bellard
    }
2486 f331110f bellard
    if (s->fpipe)
2487 087f4ae0 ths
        qemu_del_polling_cb(win_chr_pipe_poll, chr);
2488 f331110f bellard
    else
2489 087f4ae0 ths
        qemu_del_polling_cb(win_chr_poll, chr);
2490 f331110f bellard
}
2491 f331110f bellard
2492 087f4ae0 ths
static int win_chr_init(CharDriverState *chr, const char *filename)
2493 f331110f bellard
{
2494 f331110f bellard
    WinCharState *s = chr->opaque;
2495 f331110f bellard
    COMMCONFIG comcfg;
2496 f331110f bellard
    COMMTIMEOUTS cto = { 0, 0, 0, 0, 0};
2497 f331110f bellard
    COMSTAT comstat;
2498 f331110f bellard
    DWORD size;
2499 f331110f bellard
    DWORD err;
2500 3b46e624 ths
2501 f331110f bellard
    s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
2502 f331110f bellard
    if (!s->hsend) {
2503 f331110f bellard
        fprintf(stderr, "Failed CreateEvent\n");
2504 f331110f bellard
        goto fail;
2505 f331110f bellard
    }
2506 f331110f bellard
    s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
2507 f331110f bellard
    if (!s->hrecv) {
2508 f331110f bellard
        fprintf(stderr, "Failed CreateEvent\n");
2509 f331110f bellard
        goto fail;
2510 f331110f bellard
    }
2511 f331110f bellard
2512 f331110f bellard
    s->hcom = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL,
2513 f331110f bellard
                      OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
2514 f331110f bellard
    if (s->hcom == INVALID_HANDLE_VALUE) {
2515 f331110f bellard
        fprintf(stderr, "Failed CreateFile (%lu)\n", GetLastError());
2516 f331110f bellard
        s->hcom = NULL;
2517 f331110f bellard
        goto fail;
2518 f331110f bellard
    }
2519 3b46e624 ths
2520 f331110f bellard
    if (!SetupComm(s->hcom, NRECVBUF, NSENDBUF)) {
2521 f331110f bellard
        fprintf(stderr, "Failed SetupComm\n");
2522 f331110f bellard
        goto fail;
2523 f331110f bellard
    }
2524 3b46e624 ths
2525 f331110f bellard
    ZeroMemory(&comcfg, sizeof(COMMCONFIG));
2526 f331110f bellard
    size = sizeof(COMMCONFIG);
2527 f331110f bellard
    GetDefaultCommConfig(filename, &comcfg, &size);
2528 f331110f bellard
    comcfg.dcb.DCBlength = sizeof(DCB);
2529 f331110f bellard
    CommConfigDialog(filename, NULL, &comcfg);
2530 f331110f bellard
2531 f331110f bellard
    if (!SetCommState(s->hcom, &comcfg.dcb)) {
2532 f331110f bellard
        fprintf(stderr, "Failed SetCommState\n");
2533 f331110f bellard
        goto fail;
2534 f331110f bellard
    }
2535 f331110f bellard
2536 f331110f bellard
    if (!SetCommMask(s->hcom, EV_ERR)) {
2537 f331110f bellard
        fprintf(stderr, "Failed SetCommMask\n");
2538 f331110f bellard
        goto fail;
2539 f331110f bellard
    }
2540 f331110f bellard
2541 f331110f bellard
    cto.ReadIntervalTimeout = MAXDWORD;
2542 f331110f bellard
    if (!SetCommTimeouts(s->hcom, &cto)) {
2543 f331110f bellard
        fprintf(stderr, "Failed SetCommTimeouts\n");
2544 f331110f bellard
        goto fail;
2545 f331110f bellard
    }
2546 3b46e624 ths
2547 f331110f bellard
    if (!ClearCommError(s->hcom, &err, &comstat)) {
2548 f331110f bellard
        fprintf(stderr, "Failed ClearCommError\n");
2549 f331110f bellard
        goto fail;
2550 f331110f bellard
    }
2551 087f4ae0 ths
    qemu_add_polling_cb(win_chr_poll, chr);
2552 f331110f bellard
    return 0;
2553 f331110f bellard
2554 f331110f bellard
 fail:
2555 087f4ae0 ths
    win_chr_close(chr);
2556 f331110f bellard
    return -1;
2557 f331110f bellard
}
2558 f331110f bellard
2559 f331110f bellard
static int win_chr_write(CharDriverState *chr, const uint8_t *buf, int len1)
2560 f331110f bellard
{
2561 f331110f bellard
    WinCharState *s = chr->opaque;
2562 f331110f bellard
    DWORD len, ret, size, err;
2563 f331110f bellard
2564 f331110f bellard
    len = len1;
2565 f331110f bellard
    ZeroMemory(&s->osend, sizeof(s->osend));
2566 f331110f bellard
    s->osend.hEvent = s->hsend;
2567 f331110f bellard
    while (len > 0) {
2568 f331110f bellard
        if (s->hsend)
2569 f331110f bellard
            ret = WriteFile(s->hcom, buf, len, &size, &s->osend);
2570 f331110f bellard
        else
2571 f331110f bellard
            ret = WriteFile(s->hcom, buf, len, &size, NULL);
2572 f331110f bellard
        if (!ret) {
2573 f331110f bellard
            err = GetLastError();
2574 f331110f bellard
            if (err == ERROR_IO_PENDING) {
2575 f331110f bellard
                ret = GetOverlappedResult(s->hcom, &s->osend, &size, TRUE);
2576 f331110f bellard
                if (ret) {
2577 f331110f bellard
                    buf += size;
2578 f331110f bellard
                    len -= size;
2579 f331110f bellard
                } else {
2580 f331110f bellard
                    break;
2581 f331110f bellard
                }
2582 f331110f bellard
            } else {
2583 f331110f bellard
                break;
2584 f331110f bellard
            }
2585 f331110f bellard
        } else {
2586 f331110f bellard
            buf += size;
2587 f331110f bellard
            len -= size;
2588 f331110f bellard
        }
2589 f331110f bellard
    }
2590 f331110f bellard
    return len1 - len;
2591 f331110f bellard
}
2592 f331110f bellard
2593 087f4ae0 ths
static int win_chr_read_poll(CharDriverState *chr)
2594 f331110f bellard
{
2595 087f4ae0 ths
    WinCharState *s = chr->opaque;
2596 087f4ae0 ths
2597 087f4ae0 ths
    s->max_size = qemu_chr_can_read(chr);
2598 f331110f bellard
    return s->max_size;
2599 f331110f bellard
}
2600 e5b0bc44 pbrook
2601 087f4ae0 ths
static void win_chr_readfile(CharDriverState *chr)
2602 f331110f bellard
{
2603 087f4ae0 ths
    WinCharState *s = chr->opaque;
2604 f331110f bellard
    int ret, err;
2605 f331110f bellard
    uint8_t buf[1024];
2606 f331110f bellard
    DWORD size;
2607 3b46e624 ths
2608 f331110f bellard
    ZeroMemory(&s->orecv, sizeof(s->orecv));
2609 f331110f bellard
    s->orecv.hEvent = s->hrecv;
2610 f331110f bellard
    ret = ReadFile(s->hcom, buf, s->len, &size, &s->orecv);
2611 f331110f bellard
    if (!ret) {
2612 f331110f bellard
        err = GetLastError();
2613 f331110f bellard
        if (err == ERROR_IO_PENDING) {
2614 f331110f bellard
            ret = GetOverlappedResult(s->hcom, &s->orecv, &size, TRUE);
2615 f331110f bellard
        }
2616 f331110f bellard
    }
2617 f331110f bellard
2618 f331110f bellard
    if (size > 0) {
2619 087f4ae0 ths
        qemu_chr_read(chr, buf, size);
2620 f331110f bellard
    }
2621 f331110f bellard
}
2622 f331110f bellard
2623 087f4ae0 ths
static void win_chr_read(CharDriverState *chr)
2624 f331110f bellard
{
2625 087f4ae0 ths
    WinCharState *s = chr->opaque;
2626 087f4ae0 ths
2627 f331110f bellard
    if (s->len > s->max_size)
2628 f331110f bellard
        s->len = s->max_size;
2629 f331110f bellard
    if (s->len == 0)
2630 f331110f bellard
        return;
2631 3b46e624 ths
2632 087f4ae0 ths
    win_chr_readfile(chr);
2633 f331110f bellard
}
2634 f331110f bellard
2635 f331110f bellard
static int win_chr_poll(void *opaque)
2636 f331110f bellard
{
2637 087f4ae0 ths
    CharDriverState *chr = opaque;
2638 087f4ae0 ths
    WinCharState *s = chr->opaque;
2639 f331110f bellard
    COMSTAT status;
2640 f331110f bellard
    DWORD comerr;
2641 3b46e624 ths
2642 f331110f bellard
    ClearCommError(s->hcom, &comerr, &status);
2643 f331110f bellard
    if (status.cbInQue > 0) {
2644 f331110f bellard
        s->len = status.cbInQue;
2645 087f4ae0 ths
        win_chr_read_poll(chr);
2646 087f4ae0 ths
        win_chr_read(chr);
2647 f331110f bellard
        return 1;
2648 f331110f bellard
    }
2649 f331110f bellard
    return 0;
2650 f331110f bellard
}
2651 f331110f bellard
2652 52f61fde ths
static CharDriverState *qemu_chr_open_win(const char *filename)
2653 f331110f bellard
{
2654 f331110f bellard
    CharDriverState *chr;
2655 f331110f bellard
    WinCharState *s;
2656 3b46e624 ths
2657 f331110f bellard
    chr = qemu_mallocz(sizeof(CharDriverState));
2658 f331110f bellard
    if (!chr)
2659 f331110f bellard
        return NULL;
2660 f331110f bellard
    s = qemu_mallocz(sizeof(WinCharState));
2661 f331110f bellard
    if (!s) {
2662 f331110f bellard
        free(chr);
2663 f331110f bellard
        return NULL;
2664 f331110f bellard
    }
2665 f331110f bellard
    chr->opaque = s;
2666 f331110f bellard
    chr->chr_write = win_chr_write;
2667 f331110f bellard
    chr->chr_close = win_chr_close;
2668 f331110f bellard
2669 087f4ae0 ths
    if (win_chr_init(chr, filename) < 0) {
2670 f331110f bellard
        free(s);
2671 f331110f bellard
        free(chr);
2672 f331110f bellard
        return NULL;
2673 f331110f bellard
    }
2674 86e94dea ths
    qemu_chr_reset(chr);
2675 f331110f bellard
    return chr;
2676 f331110f bellard
}
2677 f331110f bellard
2678 f331110f bellard
static int win_chr_pipe_poll(void *opaque)
2679 f331110f bellard
{
2680 087f4ae0 ths
    CharDriverState *chr = opaque;
2681 087f4ae0 ths
    WinCharState *s = chr->opaque;
2682 f331110f bellard
    DWORD size;
2683 f331110f bellard
2684 f331110f bellard
    PeekNamedPipe(s->hcom, NULL, 0, NULL, &size, NULL);
2685 f331110f bellard
    if (size > 0) {
2686 f331110f bellard
        s->len = size;
2687 087f4ae0 ths
        win_chr_read_poll(chr);
2688 087f4ae0 ths
        win_chr_read(chr);
2689 f331110f bellard
        return 1;
2690 f331110f bellard
    }
2691 f331110f bellard
    return 0;
2692 f331110f bellard
}
2693 f331110f bellard
2694 087f4ae0 ths
static int win_chr_pipe_init(CharDriverState *chr, const char *filename)
2695 f331110f bellard
{
2696 087f4ae0 ths
    WinCharState *s = chr->opaque;
2697 f331110f bellard
    OVERLAPPED ov;
2698 f331110f bellard
    int ret;
2699 f331110f bellard
    DWORD size;
2700 f331110f bellard
    char openname[256];
2701 3b46e624 ths
2702 f331110f bellard
    s->fpipe = TRUE;
2703 f331110f bellard
2704 f331110f bellard
    s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
2705 f331110f bellard
    if (!s->hsend) {
2706 f331110f bellard
        fprintf(stderr, "Failed CreateEvent\n");
2707 f331110f bellard
        goto fail;
2708 f331110f bellard
    }
2709 f331110f bellard
    s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
2710 f331110f bellard
    if (!s->hrecv) {
2711 f331110f bellard
        fprintf(stderr, "Failed CreateEvent\n");
2712 f331110f bellard
        goto fail;
2713 f331110f bellard
    }
2714 3b46e624 ths
2715 f331110f bellard
    snprintf(openname, sizeof(openname), "\\\\.\\pipe\\%s", filename);
2716 f331110f bellard
    s->hcom = CreateNamedPipe(openname, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
2717 f331110f bellard
                              PIPE_TYPE_BYTE | PIPE_READMODE_BYTE |
2718 f331110f bellard
                              PIPE_WAIT,
2719 f331110f bellard
                              MAXCONNECT, NSENDBUF, NRECVBUF, NTIMEOUT, NULL);
2720 f331110f bellard
    if (s->hcom == INVALID_HANDLE_VALUE) {
2721 f331110f bellard
        fprintf(stderr, "Failed CreateNamedPipe (%lu)\n", GetLastError());
2722 f331110f bellard
        s->hcom = NULL;
2723 f331110f bellard
        goto fail;
2724 f331110f bellard
    }
2725 f331110f bellard
2726 f331110f bellard
    ZeroMemory(&ov, sizeof(ov));
2727 f331110f bellard
    ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
2728 f331110f bellard
    ret = ConnectNamedPipe(s->hcom, &ov);
2729 f331110f bellard
    if (ret) {
2730 f331110f bellard
        fprintf(stderr, "Failed ConnectNamedPipe\n");
2731 f331110f bellard
        goto fail;
2732 f331110f bellard
    }
2733 f331110f bellard
2734 f331110f bellard
    ret = GetOverlappedResult(s->hcom, &ov, &size, TRUE);
2735 f331110f bellard
    if (!ret) {
2736 f331110f bellard
        fprintf(stderr, "Failed GetOverlappedResult\n");
2737 f331110f bellard
        if (ov.hEvent) {
2738 f331110f bellard
            CloseHandle(ov.hEvent);
2739 f331110f bellard
            ov.hEvent = NULL;
2740 f331110f bellard
        }
2741 f331110f bellard
        goto fail;
2742 f331110f bellard
    }
2743 f331110f bellard
2744 f331110f bellard
    if (ov.hEvent) {
2745 f331110f bellard
        CloseHandle(ov.hEvent);
2746 f331110f bellard
        ov.hEvent = NULL;
2747 f331110f bellard
    }
2748 087f4ae0 ths
    qemu_add_polling_cb(win_chr_pipe_poll, chr);
2749 f331110f bellard
    return 0;
2750 f331110f bellard
2751 f331110f bellard
 fail:
2752 087f4ae0 ths
    win_chr_close(chr);
2753 f331110f bellard
    return -1;
2754 f331110f bellard
}
2755 f331110f bellard
2756 f331110f bellard
2757 52f61fde ths
static CharDriverState *qemu_chr_open_win_pipe(const char *filename)
2758 f331110f bellard
{
2759 f331110f bellard
    CharDriverState *chr;
2760 f331110f bellard
    WinCharState *s;
2761 f331110f bellard
2762 f331110f bellard
    chr = qemu_mallocz(sizeof(CharDriverState));
2763 f331110f bellard
    if (!chr)
2764 f331110f bellard
        return NULL;
2765 f331110f bellard
    s = qemu_mallocz(sizeof(WinCharState));
2766 f331110f bellard
    if (!s) {
2767 f331110f bellard
        free(chr);
2768 f331110f bellard
        return NULL;
2769 f331110f bellard
    }
2770 f331110f bellard
    chr->opaque = s;
2771 f331110f bellard
    chr->chr_write = win_chr_write;
2772 f331110f bellard
    chr->chr_close = win_chr_close;
2773 3b46e624 ths
2774 087f4ae0 ths
    if (win_chr_pipe_init(chr, filename) < 0) {
2775 f331110f bellard
        free(s);
2776 f331110f bellard
        free(chr);
2777 f331110f bellard
        return NULL;
2778 f331110f bellard
    }
2779 86e94dea ths
    qemu_chr_reset(chr);
2780 f331110f bellard
    return chr;
2781 f331110f bellard
}
2782 f331110f bellard
2783 52f61fde ths
static CharDriverState *qemu_chr_open_win_file(HANDLE fd_out)
2784 f331110f bellard
{
2785 f331110f bellard
    CharDriverState *chr;
2786 f331110f bellard
    WinCharState *s;
2787 f331110f bellard
2788 f331110f bellard
    chr = qemu_mallocz(sizeof(CharDriverState));
2789 f331110f bellard
    if (!chr)
2790 f331110f bellard
        return NULL;
2791 f331110f bellard
    s = qemu_mallocz(sizeof(WinCharState));
2792 f331110f bellard
    if (!s) {
2793 f331110f bellard
        free(chr);
2794 f331110f bellard
        return NULL;
2795 f331110f bellard
    }
2796 f331110f bellard
    s->hcom = fd_out;
2797 f331110f bellard
    chr->opaque = s;
2798 f331110f bellard
    chr->chr_write = win_chr_write;
2799 86e94dea ths
    qemu_chr_reset(chr);
2800 f331110f bellard
    return chr;
2801 f331110f bellard
}
2802 72d46479 ths
2803 72d46479 ths
static CharDriverState *qemu_chr_open_win_con(const char *filename)
2804 72d46479 ths
{
2805 72d46479 ths
    return qemu_chr_open_win_file(GetStdHandle(STD_OUTPUT_HANDLE));
2806 72d46479 ths
}
2807 72d46479 ths
2808 52f61fde ths
static CharDriverState *qemu_chr_open_win_file_out(const char *file_out)
2809 f331110f bellard
{
2810 f331110f bellard
    HANDLE fd_out;
2811 3b46e624 ths
2812 f331110f bellard
    fd_out = CreateFile(file_out, GENERIC_WRITE, FILE_SHARE_READ, NULL,
2813 f331110f bellard
                        OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2814 f331110f bellard
    if (fd_out == INVALID_HANDLE_VALUE)
2815 f331110f bellard
        return NULL;
2816 f331110f bellard
2817 f331110f bellard
    return qemu_chr_open_win_file(fd_out);
2818 f331110f bellard
}
2819 aec62507 ths
#endif /* !_WIN32 */
2820 f331110f bellard
2821 0bab00f3 bellard
/***********************************************************/
2822 0bab00f3 bellard
/* UDP Net console */
2823 0bab00f3 bellard
2824 0bab00f3 bellard
typedef struct {
2825 0bab00f3 bellard
    int fd;
2826 0bab00f3 bellard
    struct sockaddr_in daddr;
2827 0bab00f3 bellard
    char buf[1024];
2828 0bab00f3 bellard
    int bufcnt;
2829 0bab00f3 bellard
    int bufptr;
2830 0bab00f3 bellard
    int max_size;
2831 0bab00f3 bellard
} NetCharDriver;
2832 0bab00f3 bellard
2833 0bab00f3 bellard
static int udp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
2834 0bab00f3 bellard
{
2835 0bab00f3 bellard
    NetCharDriver *s = chr->opaque;
2836 0bab00f3 bellard
2837 0bab00f3 bellard
    return sendto(s->fd, buf, len, 0,
2838 0bab00f3 bellard
                  (struct sockaddr *)&s->daddr, sizeof(struct sockaddr_in));
2839 0bab00f3 bellard
}
2840 0bab00f3 bellard
2841 0bab00f3 bellard
static int udp_chr_read_poll(void *opaque)
2842 0bab00f3 bellard
{
2843 0bab00f3 bellard
    CharDriverState *chr = opaque;
2844 0bab00f3 bellard
    NetCharDriver *s = chr->opaque;
2845 0bab00f3 bellard
2846 e5b0bc44 pbrook
    s->max_size = qemu_chr_can_read(chr);
2847 0bab00f3 bellard
2848 0bab00f3 bellard
    /* If there were any stray characters in the queue process them
2849 0bab00f3 bellard
     * first
2850 0bab00f3 bellard
     */
2851 0bab00f3 bellard
    while (s->max_size > 0 && s->bufptr < s->bufcnt) {
2852 e5b0bc44 pbrook
        qemu_chr_read(chr, &s->buf[s->bufptr], 1);
2853 0bab00f3 bellard
        s->bufptr++;
2854 e5b0bc44 pbrook
        s->max_size = qemu_chr_can_read(chr);
2855 0bab00f3 bellard
    }
2856 0bab00f3 bellard
    return s->max_size;
2857 0bab00f3 bellard
}
2858 0bab00f3 bellard
2859 0bab00f3 bellard
static void udp_chr_read(void *opaque)
2860 0bab00f3 bellard
{
2861 0bab00f3 bellard
    CharDriverState *chr = opaque;
2862 0bab00f3 bellard
    NetCharDriver *s = chr->opaque;
2863 0bab00f3 bellard
2864 0bab00f3 bellard
    if (s->max_size == 0)
2865 0bab00f3 bellard
        return;
2866 0bab00f3 bellard
    s->bufcnt = recv(s->fd, s->buf, sizeof(s->buf), 0);
2867 0bab00f3 bellard
    s->bufptr = s->bufcnt;
2868 0bab00f3 bellard
    if (s->bufcnt <= 0)
2869 0bab00f3 bellard
        return;
2870 0bab00f3 bellard
2871 0bab00f3 bellard
    s->bufptr = 0;
2872 0bab00f3 bellard
    while (s->max_size > 0 && s->bufptr < s->bufcnt) {
2873 e5b0bc44 pbrook
        qemu_chr_read(chr, &s->buf[s->bufptr], 1);
2874 0bab00f3 bellard
        s->bufptr++;
2875 e5b0bc44 pbrook
        s->max_size = qemu_chr_can_read(chr);
2876 0bab00f3 bellard
    }
2877 0bab00f3 bellard
}
2878 0bab00f3 bellard
2879 e5b0bc44 pbrook
static void udp_chr_update_read_handler(CharDriverState *chr)
2880 0bab00f3 bellard
{
2881 0bab00f3 bellard
    NetCharDriver *s = chr->opaque;
2882 0bab00f3 bellard
2883 0bab00f3 bellard
    if (s->fd >= 0) {
2884 0bab00f3 bellard
        qemu_set_fd_handler2(s->fd, udp_chr_read_poll,
2885 0bab00f3 bellard
                             udp_chr_read, NULL, chr);
2886 0bab00f3 bellard
    }
2887 0bab00f3 bellard
}
2888 0bab00f3 bellard
2889 0bab00f3 bellard
int parse_host_port(struct sockaddr_in *saddr, const char *str);
2890 52f61fde ths
#ifndef _WIN32
2891 52f61fde ths
static int parse_unix_path(struct sockaddr_un *uaddr, const char *str);
2892 52f61fde ths
#endif
2893 951f1351 bellard
int parse_host_src_port(struct sockaddr_in *haddr,
2894 951f1351 bellard
                        struct sockaddr_in *saddr,
2895 951f1351 bellard
                        const char *str);
2896 0bab00f3 bellard
2897 52f61fde ths
static CharDriverState *qemu_chr_open_udp(const char *def)
2898 0bab00f3 bellard
{
2899 0bab00f3 bellard
    CharDriverState *chr = NULL;
2900 0bab00f3 bellard
    NetCharDriver *s = NULL;
2901 0bab00f3 bellard
    int fd = -1;
2902 951f1351 bellard
    struct sockaddr_in saddr;
2903 0bab00f3 bellard
2904 0bab00f3 bellard
    chr = qemu_mallocz(sizeof(CharDriverState));
2905 0bab00f3 bellard
    if (!chr)
2906 0bab00f3 bellard
        goto return_err;
2907 0bab00f3 bellard
    s = qemu_mallocz(sizeof(NetCharDriver));
2908 0bab00f3 bellard
    if (!s)
2909 0bab00f3 bellard
        goto return_err;
2910 0bab00f3 bellard
2911 0bab00f3 bellard
    fd = socket(PF_INET, SOCK_DGRAM, 0);
2912 0bab00f3 bellard
    if (fd < 0) {
2913 0bab00f3 bellard
        perror("socket(PF_INET, SOCK_DGRAM)");
2914 0bab00f3 bellard
        goto return_err;
2915 0bab00f3 bellard
    }
2916 0bab00f3 bellard
2917 951f1351 bellard
    if (parse_host_src_port(&s->daddr, &saddr, def) < 0) {
2918 951f1351 bellard
        printf("Could not parse: %s\n", def);
2919 951f1351 bellard
        goto return_err;
2920 0bab00f3 bellard
    }
2921 0bab00f3 bellard
2922 951f1351 bellard
    if (bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0)
2923 0bab00f3 bellard
    {
2924 0bab00f3 bellard
        perror("bind");
2925 0bab00f3 bellard
        goto return_err;
2926 0bab00f3 bellard
    }
2927 0bab00f3 bellard
2928 0bab00f3 bellard
    s->fd = fd;
2929 0bab00f3 bellard
    s->bufcnt = 0;
2930 0bab00f3 bellard
    s->bufptr = 0;
2931 0bab00f3 bellard
    chr->opaque = s;
2932 0bab00f3 bellard
    chr->chr_write = udp_chr_write;
2933 e5b0bc44 pbrook
    chr->chr_update_read_handler = udp_chr_update_read_handler;
2934 0bab00f3 bellard
    return chr;
2935 0bab00f3 bellard
2936 0bab00f3 bellard
return_err:
2937 0bab00f3 bellard
    if (chr)
2938 0bab00f3 bellard
        free(chr);
2939 0bab00f3 bellard
    if (s)
2940 0bab00f3 bellard
        free(s);
2941 0bab00f3 bellard
    if (fd >= 0)
2942 0bab00f3 bellard
        closesocket(fd);
2943 0bab00f3 bellard
    return NULL;
2944 0bab00f3 bellard
}
2945 0bab00f3 bellard
2946 0bab00f3 bellard
/***********************************************************/
2947 0bab00f3 bellard
/* TCP Net console */
2948 0bab00f3 bellard
2949 0bab00f3 bellard
typedef struct {
2950 0bab00f3 bellard
    int fd, listen_fd;
2951 0bab00f3 bellard
    int connected;
2952 0bab00f3 bellard
    int max_size;
2953 951f1351 bellard
    int do_telnetopt;
2954 e5b0bc44 pbrook
    int do_nodelay;
2955 ffd843bc ths
    int is_unix;
2956 0bab00f3 bellard
} TCPCharDriver;
2957 0bab00f3 bellard
2958 0bab00f3 bellard
static void tcp_chr_accept(void *opaque);
2959 0bab00f3 bellard
2960 0bab00f3 bellard
static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
2961 0bab00f3 bellard
{
2962 0bab00f3 bellard
    TCPCharDriver *s = chr->opaque;
2963 0bab00f3 bellard
    if (s->connected) {
2964 0bab00f3 bellard
        return send_all(s->fd, buf, len);
2965 0bab00f3 bellard
    } else {
2966 0bab00f3 bellard
        /* XXX: indicate an error ? */
2967 0bab00f3 bellard
        return len;
2968 0bab00f3 bellard
    }
2969 0bab00f3 bellard
}
2970 0bab00f3 bellard
2971 0bab00f3 bellard
static int tcp_chr_read_poll(void *opaque)
2972 0bab00f3 bellard
{
2973 0bab00f3 bellard
    CharDriverState *chr = opaque;
2974 0bab00f3 bellard
    TCPCharDriver *s = chr->opaque;
2975 0bab00f3 bellard
    if (!s->connected)
2976 0bab00f3 bellard
        return 0;
2977 e5b0bc44 pbrook
    s->max_size = qemu_chr_can_read(chr);
2978 0bab00f3 bellard
    return s->max_size;
2979 0bab00f3 bellard
}
2980 0bab00f3 bellard
2981 951f1351 bellard
#define IAC 255
2982 951f1351 bellard
#define IAC_BREAK 243
2983 951f1351 bellard
static void tcp_chr_process_IAC_bytes(CharDriverState *chr,
2984 951f1351 bellard
                                      TCPCharDriver *s,
2985 951f1351 bellard
                                      char *buf, int *size)
2986 951f1351 bellard
{
2987 951f1351 bellard
    /* Handle any telnet client's basic IAC options to satisfy char by
2988 951f1351 bellard
     * char mode with no echo.  All IAC options will be removed from
2989 951f1351 bellard
     * the buf and the do_telnetopt variable will be used to track the
2990 951f1351 bellard
     * state of the width of the IAC information.
2991 951f1351 bellard
     *
2992 951f1351 bellard
     * IAC commands come in sets of 3 bytes with the exception of the
2993 951f1351 bellard
     * "IAC BREAK" command and the double IAC.
2994 951f1351 bellard
     */
2995 951f1351 bellard
2996 951f1351 bellard
    int i;
2997 951f1351 bellard
    int j = 0;
2998 951f1351 bellard
2999 951f1351 bellard
    for (i = 0; i < *size; i++) {
3000 951f1351 bellard
        if (s->do_telnetopt > 1) {
3001 951f1351 bellard
            if ((unsigned char)buf[i] == IAC && s->do_telnetopt == 2) {
3002 951f1351 bellard
                /* Double IAC means send an IAC */
3003 951f1351 bellard
                if (j != i)
3004 951f1351 bellard
                    buf[j] = buf[i];
3005 951f1351 bellard
                j++;
3006 951f1351 bellard
                s->do_telnetopt = 1;
3007 951f1351 bellard
            } else {
3008 951f1351 bellard
                if ((unsigned char)buf[i] == IAC_BREAK && s->do_telnetopt == 2) {
3009 951f1351 bellard
                    /* Handle IAC break commands by sending a serial break */
3010 e5b0bc44 pbrook
                    qemu_chr_event(chr, CHR_EVENT_BREAK);
3011 951f1351 bellard
                    s->do_telnetopt++;
3012 951f1351 bellard
                }
3013 951f1351 bellard
                s->do_telnetopt++;
3014 951f1351 bellard
            }
3015 951f1351 bellard
            if (s->do_telnetopt >= 4) {
3016 951f1351 bellard
                s->do_telnetopt = 1;
3017 951f1351 bellard
            }
3018 951f1351 bellard
        } else {
3019 951f1351 bellard
            if ((unsigned char)buf[i] == IAC) {
3020 951f1351 bellard
                s->do_telnetopt = 2;
3021 951f1351 bellard
            } else {
3022 951f1351 bellard
                if (j != i)
3023 951f1351 bellard
                    buf[j] = buf[i];
3024 951f1351 bellard
                j++;
3025 951f1351 bellard
            }
3026 951f1351 bellard
        }
3027 951f1351 bellard
    }
3028 951f1351 bellard
    *size = j;
3029 951f1351 bellard
}
3030 951f1351 bellard
3031 0bab00f3 bellard
static void tcp_chr_read(void *opaque)
3032 0bab00f3 bellard
{
3033 0bab00f3 bellard
    CharDriverState *chr = opaque;
3034 0bab00f3 bellard
    TCPCharDriver *s = chr->opaque;
3035 0bab00f3 bellard
    uint8_t buf[1024];
3036 0bab00f3 bellard
    int len, size;
3037 0bab00f3 bellard
3038 0bab00f3 bellard
    if (!s->connected || s->max_size <= 0)
3039 0bab00f3 bellard
        return;
3040 0bab00f3 bellard
    len = sizeof(buf);
3041 0bab00f3 bellard
    if (len > s->max_size)
3042 0bab00f3 bellard
        len = s->max_size;
3043 0bab00f3 bellard
    size = recv(s->fd, buf, len, 0);
3044 0bab00f3 bellard
    if (size == 0) {
3045 0bab00f3 bellard
        /* connection closed */
3046 0bab00f3 bellard
        s->connected = 0;
3047 0bab00f3 bellard
        if (s->listen_fd >= 0) {
3048 0bab00f3 bellard
            qemu_set_fd_handler(s->listen_fd, tcp_chr_accept, NULL, chr);
3049 0bab00f3 bellard
        }
3050 0bab00f3 bellard
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
3051 0bab00f3 bellard
        closesocket(s->fd);
3052 0bab00f3 bellard
        s->fd = -1;
3053 0bab00f3 bellard
    } else if (size > 0) {
3054 951f1351 bellard
        if (s->do_telnetopt)
3055 951f1351 bellard
            tcp_chr_process_IAC_bytes(chr, s, buf, &size);
3056 951f1351 bellard
        if (size > 0)
3057 e5b0bc44 pbrook
            qemu_chr_read(chr, buf, size);
3058 0bab00f3 bellard
    }
3059 0bab00f3 bellard
}
3060 0bab00f3 bellard
3061 0bab00f3 bellard
static void tcp_chr_connect(void *opaque)
3062 0bab00f3 bellard
{
3063 0bab00f3 bellard
    CharDriverState *chr = opaque;
3064 0bab00f3 bellard
    TCPCharDriver *s = chr->opaque;
3065 0bab00f3 bellard
3066 0bab00f3 bellard
    s->connected = 1;
3067 0bab00f3 bellard
    qemu_set_fd_handler2(s->fd, tcp_chr_read_poll,
3068 0bab00f3 bellard
                         tcp_chr_read, NULL, chr);
3069 86e94dea ths
    qemu_chr_reset(chr);
3070 0bab00f3 bellard
}
3071 0bab00f3 bellard
3072 951f1351 bellard
#define IACSET(x,a,b,c) x[0] = a; x[1] = b; x[2] = c;
3073 951f1351 bellard
static void tcp_chr_telnet_init(int fd)
3074 951f1351 bellard
{
3075 951f1351 bellard
    char buf[3];
3076 951f1351 bellard
    /* Send the telnet negotion to put telnet in binary, no echo, single char mode */
3077 951f1351 bellard
    IACSET(buf, 0xff, 0xfb, 0x01);  /* IAC WILL ECHO */
3078 951f1351 bellard
    send(fd, (char *)buf, 3, 0);
3079 951f1351 bellard
    IACSET(buf, 0xff, 0xfb, 0x03);  /* IAC WILL Suppress go ahead */
3080 951f1351 bellard
    send(fd, (char *)buf, 3, 0);
3081 951f1351 bellard
    IACSET(buf, 0xff, 0xfb, 0x00);  /* IAC WILL Binary */
3082 951f1351 bellard
    send(fd, (char *)buf, 3, 0);
3083 951f1351 bellard
    IACSET(buf, 0xff, 0xfd, 0x00);  /* IAC DO Binary */
3084 951f1351 bellard
    send(fd, (char *)buf, 3, 0);
3085 951f1351 bellard
}
3086 951f1351 bellard
3087 f7499989 pbrook
static void socket_set_nodelay(int fd)
3088 f7499989 pbrook
{
3089 f7499989 pbrook
    int val = 1;
3090 f7499989 pbrook
    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
3091 f7499989 pbrook
}
3092 f7499989 pbrook
3093 0bab00f3 bellard
static void tcp_chr_accept(void *opaque)
3094 0bab00f3 bellard
{
3095 0bab00f3 bellard
    CharDriverState *chr = opaque;
3096 0bab00f3 bellard
    TCPCharDriver *s = chr->opaque;
3097 0bab00f3 bellard
    struct sockaddr_in saddr;
3098 ffd843bc ths
#ifndef _WIN32
3099 ffd843bc ths
    struct sockaddr_un uaddr;
3100 ffd843bc ths
#endif
3101 ffd843bc ths
    struct sockaddr *addr;
3102 0bab00f3 bellard
    socklen_t len;
3103 0bab00f3 bellard
    int fd;
3104 0bab00f3 bellard
3105 0bab00f3 bellard
    for(;;) {
3106 ffd843bc ths
#ifndef _WIN32
3107 ffd843bc ths
        if (s->is_unix) {
3108 ffd843bc ths
            len = sizeof(uaddr);
3109 ffd843bc ths
            addr = (struct sockaddr *)&uaddr;
3110 ffd843bc ths
        } else
3111 ffd843bc ths
#endif
3112 ffd843bc ths
        {
3113 ffd843bc ths
            len = sizeof(saddr);
3114 ffd843bc ths
            addr = (struct sockaddr *)&saddr;
3115 ffd843bc ths
        }
3116 ffd843bc ths
        fd = accept(s->listen_fd, addr, &len);
3117 0bab00f3 bellard
        if (fd < 0 && errno != EINTR) {
3118 0bab00f3 bellard
            return;
3119 0bab00f3 bellard
        } else if (fd >= 0) {
3120 951f1351 bellard
            if (s->do_telnetopt)
3121 951f1351 bellard
                tcp_chr_telnet_init(fd);
3122 0bab00f3 bellard
            break;
3123 0bab00f3 bellard
        }
3124 0bab00f3 bellard
    }
3125 0bab00f3 bellard
    socket_set_nonblock(fd);
3126 f7499989 pbrook
    if (s->do_nodelay)
3127 f7499989 pbrook
        socket_set_nodelay(fd);
3128 0bab00f3 bellard
    s->fd = fd;
3129 0bab00f3 bellard
    qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
3130 0bab00f3 bellard
    tcp_chr_connect(chr);
3131 0bab00f3 bellard
}
3132 0bab00f3 bellard
3133 0bab00f3 bellard
static void tcp_chr_close(CharDriverState *chr)
3134 0bab00f3 bellard
{
3135 0bab00f3 bellard
    TCPCharDriver *s = chr->opaque;
3136 0bab00f3 bellard
    if (s->fd >= 0)
3137 0bab00f3 bellard
        closesocket(s->fd);
3138 0bab00f3 bellard
    if (s->listen_fd >= 0)
3139 0bab00f3 bellard
        closesocket(s->listen_fd);
3140 0bab00f3 bellard
    qemu_free(s);
3141 0bab00f3 bellard
}
3142 0bab00f3 bellard
3143 5fafdf24 ths
static CharDriverState *qemu_chr_open_tcp(const char *host_str,
3144 ffd843bc ths
                                          int is_telnet,
3145 ffd843bc ths
                                          int is_unix)
3146 0bab00f3 bellard
{
3147 0bab00f3 bellard
    CharDriverState *chr = NULL;
3148 0bab00f3 bellard
    TCPCharDriver *s = NULL;
3149 0bab00f3 bellard
    int fd = -1, ret, err, val;
3150 951f1351 bellard
    int is_listen = 0;
3151 951f1351 bellard
    int is_waitconnect = 1;
3152 f7499989 pbrook
    int do_nodelay = 0;
3153 951f1351 bellard
    const char *ptr;
3154 0bab00f3 bellard
    struct sockaddr_in saddr;
3155 ffd843bc ths
#ifndef _WIN32
3156 ffd843bc ths
    struct sockaddr_un uaddr;
3157 ffd843bc ths
#endif
3158 ffd843bc ths
    struct sockaddr *addr;
3159 ffd843bc ths
    socklen_t addrlen;
3160 0bab00f3 bellard
3161 ffd843bc ths
#ifndef _WIN32
3162 ffd843bc ths
    if (is_unix) {
3163 ffd843bc ths
        addr = (struct sockaddr *)&uaddr;
3164 ffd843bc ths
        addrlen = sizeof(uaddr);
3165 ffd843bc ths
        if (parse_unix_path(&uaddr, host_str) < 0)
3166 ffd843bc ths
            goto fail;
3167 ffd843bc ths
    } else
3168 ffd843bc ths
#endif
3169 ffd843bc ths
    {
3170 ffd843bc ths
        addr = (struct sockaddr *)&saddr;
3171 ffd843bc ths
        addrlen = sizeof(saddr);
3172 ffd843bc ths
        if (parse_host_port(&saddr, host_str) < 0)
3173 ffd843bc ths
            goto fail;
3174 ffd843bc ths
    }
3175 0bab00f3 bellard
3176 951f1351 bellard
    ptr = host_str;
3177 951f1351 bellard
    while((ptr = strchr(ptr,','))) {
3178 951f1351 bellard
        ptr++;
3179 951f1351 bellard
        if (!strncmp(ptr,"server",6)) {
3180 951f1351 bellard
            is_listen = 1;
3181 951f1351 bellard
        } else if (!strncmp(ptr,"nowait",6)) {
3182 951f1351 bellard
            is_waitconnect = 0;
3183 f7499989 pbrook
        } else if (!strncmp(ptr,"nodelay",6)) {
3184 f7499989 pbrook
            do_nodelay = 1;
3185 951f1351 bellard
        } else {
3186 951f1351 bellard
            printf("Unknown option: %s\n", ptr);
3187 951f1351 bellard
            goto fail;
3188 951f1351 bellard
        }
3189 951f1351 bellard
    }
3190 951f1351 bellard
    if (!is_listen)
3191 951f1351 bellard
        is_waitconnect = 0;
3192 951f1351 bellard
3193 0bab00f3 bellard
    chr = qemu_mallocz(sizeof(CharDriverState));
3194 0bab00f3 bellard
    if (!chr)
3195 0bab00f3 bellard
        goto fail;
3196 0bab00f3 bellard
    s = qemu_mallocz(sizeof(TCPCharDriver));
3197 0bab00f3 bellard
    if (!s)
3198 0bab00f3 bellard
        goto fail;
3199 ffd843bc ths
3200 ffd843bc ths
#ifndef _WIN32
3201 ffd843bc ths
    if (is_unix)
3202 ffd843bc ths
        fd = socket(PF_UNIX, SOCK_STREAM, 0);
3203 ffd843bc ths
    else
3204 ffd843bc ths
#endif
3205 ffd843bc ths
        fd = socket(PF_INET, SOCK_STREAM, 0);
3206 5fafdf24 ths
3207 5fafdf24 ths
    if (fd < 0)
3208 0bab00f3 bellard
        goto fail;
3209 951f1351 bellard
3210 951f1351 bellard
    if (!is_waitconnect)
3211 951f1351 bellard
        socket_set_nonblock(fd);
3212 0bab00f3 bellard
3213 0bab00f3 bellard
    s->connected = 0;
3214 0bab00f3 bellard
    s->fd = -1;
3215 0bab00f3 bellard
    s->listen_fd = -1;
3216 ffd843bc ths
    s->is_unix = is_unix;
3217 f7499989 pbrook
    s->do_nodelay = do_nodelay && !is_unix;
3218 ffd843bc ths
3219 ffd843bc ths
    chr->opaque = s;
3220 ffd843bc ths
    chr->chr_write = tcp_chr_write;
3221 ffd843bc ths
    chr->chr_close = tcp_chr_close;
3222 ffd843bc ths
3223 0bab00f3 bellard
    if (is_listen) {
3224 0bab00f3 bellard
        /* allow fast reuse */
3225 ffd843bc ths
#ifndef _WIN32
3226 ffd843bc ths
        if (is_unix) {
3227 ffd843bc ths
            char path[109];
3228 ffd843bc ths
            strncpy(path, uaddr.sun_path, 108);
3229 ffd843bc ths
            path[108] = 0;
3230 ffd843bc ths
            unlink(path);
3231 ffd843bc ths
        } else
3232 ffd843bc ths
#endif
3233 ffd843bc ths
        {
3234 ffd843bc ths
            val = 1;
3235 ffd843bc ths
            setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
3236 ffd843bc ths
        }
3237 3b46e624 ths
3238 ffd843bc ths
        ret = bind(fd, addr, addrlen);
3239 ffd843bc ths
        if (ret < 0)
3240 0bab00f3 bellard
            goto fail;
3241 ffd843bc ths
3242 0bab00f3 bellard
        ret = listen(fd, 0);
3243 0bab00f3 bellard
        if (ret < 0)
3244 0bab00f3 bellard
            goto fail;
3245 ffd843bc ths
3246 0bab00f3 bellard
        s->listen_fd = fd;
3247 0bab00f3 bellard
        qemu_set_fd_handler(s->listen_fd, tcp_chr_accept, NULL, chr);
3248 951f1351 bellard
        if (is_telnet)
3249 951f1351 bellard
            s->do_telnetopt = 1;
3250 0bab00f3 bellard
    } else {
3251 0bab00f3 bellard
        for(;;) {
3252 ffd843bc ths
            ret = connect(fd, addr, addrlen);
3253 0bab00f3 bellard
            if (ret < 0) {
3254 0bab00f3 bellard
                err = socket_error();
3255 0bab00f3 bellard
                if (err == EINTR || err == EWOULDBLOCK) {
3256 0bab00f3 bellard
                } else if (err == EINPROGRESS) {
3257 0bab00f3 bellard
                    break;
3258 f5b12268 ths
#ifdef _WIN32
3259 f5b12268 ths
                } else if (err == WSAEALREADY) {
3260 f5b12268 ths
                    break;
3261 f5b12268 ths
#endif
3262 0bab00f3 bellard
                } else {
3263 0bab00f3 bellard
                    goto fail;
3264 0bab00f3 bellard
                }
3265 0bab00f3 bellard
            } else {
3266 0bab00f3 bellard
                s->connected = 1;
3267 0bab00f3 bellard
                break;
3268 0bab00f3 bellard
            }
3269 0bab00f3 bellard
        }
3270 0bab00f3 bellard
        s->fd = fd;
3271 f7499989 pbrook
        socket_set_nodelay(fd);
3272 0bab00f3 bellard
        if (s->connected)
3273 0bab00f3 bellard
            tcp_chr_connect(chr);
3274 0bab00f3 bellard
        else
3275 0bab00f3 bellard
            qemu_set_fd_handler(s->fd, NULL, tcp_chr_connect, chr);
3276 0bab00f3 bellard
    }
3277 3b46e624 ths
3278 951f1351 bellard
    if (is_listen && is_waitconnect) {
3279 951f1351 bellard
        printf("QEMU waiting for connection on: %s\n", host_str);
3280 951f1351 bellard
        tcp_chr_accept(chr);
3281 951f1351 bellard
        socket_set_nonblock(s->listen_fd);
3282 951f1351 bellard
    }
3283 951f1351 bellard
3284 0bab00f3 bellard
    return chr;
3285 0bab00f3 bellard
 fail:
3286 0bab00f3 bellard
    if (fd >= 0)
3287 0bab00f3 bellard
        closesocket(fd);
3288 0bab00f3 bellard
    qemu_free(s);
3289 0bab00f3 bellard
    qemu_free(chr);
3290 0bab00f3 bellard
    return NULL;
3291 0bab00f3 bellard
}
3292 0bab00f3 bellard
3293 82c643ff bellard
CharDriverState *qemu_chr_open(const char *filename)
3294 82c643ff bellard
{
3295 f8d179e3 bellard
    const char *p;
3296 fd1dff4b bellard
3297 82c643ff bellard
    if (!strcmp(filename, "vc")) {
3298 af3a9031 ths
        return text_console_init(&display_state, 0);
3299 af3a9031 ths
    } else if (strstart(filename, "vc:", &p)) {
3300 af3a9031 ths
        return text_console_init(&display_state, p);
3301 82c643ff bellard
    } else if (!strcmp(filename, "null")) {
3302 82c643ff bellard
        return qemu_chr_open_null();
3303 5fafdf24 ths
    } else
3304 0bab00f3 bellard
    if (strstart(filename, "tcp:", &p)) {
3305 ffd843bc ths
        return qemu_chr_open_tcp(p, 0, 0);
3306 0bab00f3 bellard
    } else
3307 951f1351 bellard
    if (strstart(filename, "telnet:", &p)) {
3308 ffd843bc ths
        return qemu_chr_open_tcp(p, 1, 0);
3309 0bab00f3 bellard
    } else
3310 0bab00f3 bellard
    if (strstart(filename, "udp:", &p)) {
3311 0bab00f3 bellard
        return qemu_chr_open_udp(p);
3312 0bab00f3 bellard
    } else
3313 20d8a3ed ths
    if (strstart(filename, "mon:", &p)) {
3314 20d8a3ed ths
        CharDriverState *drv = qemu_chr_open(p);
3315 20d8a3ed ths
        if (drv) {
3316 20d8a3ed ths
            drv = qemu_chr_open_mux(drv);
3317 20d8a3ed ths
            monitor_init(drv, !nographic);
3318 20d8a3ed ths
            return drv;
3319 20d8a3ed ths
        }
3320 20d8a3ed ths
        printf("Unable to open driver: %s\n", p);
3321 20d8a3ed ths
        return 0;
3322 20d8a3ed ths
    } else
3323 7664728b bellard
#ifndef _WIN32
3324 ffd843bc ths
    if (strstart(filename, "unix:", &p)) {
3325 ffd843bc ths
        return qemu_chr_open_tcp(p, 0, 1);
3326 ffd843bc ths
    } else if (strstart(filename, "file:", &p)) {
3327 f8d179e3 bellard
        return qemu_chr_open_file_out(p);
3328 f8d179e3 bellard
    } else if (strstart(filename, "pipe:", &p)) {
3329 f8d179e3 bellard
        return qemu_chr_open_pipe(p);
3330 7664728b bellard
    } else if (!strcmp(filename, "pty")) {
3331 82c643ff bellard
        return qemu_chr_open_pty();
3332 82c643ff bellard
    } else if (!strcmp(filename, "stdio")) {
3333 82c643ff bellard
        return qemu_chr_open_stdio();
3334 5fafdf24 ths
    } else
3335 f8d179e3 bellard
#if defined(__linux__)
3336 e57a8c0e bellard
    if (strstart(filename, "/dev/parport", NULL)) {
3337 e57a8c0e bellard
        return qemu_chr_open_pp(filename);
3338 5fafdf24 ths
    } else
3339 aec62507 ths
#endif
3340 3fda388a ths
#if defined(__linux__) || defined(__sun__)
3341 f8d179e3 bellard
    if (strstart(filename, "/dev/", NULL)) {
3342 f8d179e3 bellard
        return qemu_chr_open_tty(filename);
3343 3fda388a ths
    } else
3344 3fda388a ths
#endif
3345 aec62507 ths
#else /* !_WIN32 */
3346 f331110f bellard
    if (strstart(filename, "COM", NULL)) {
3347 f331110f bellard
        return qemu_chr_open_win(filename);
3348 f331110f bellard
    } else
3349 f331110f bellard
    if (strstart(filename, "pipe:", &p)) {
3350 f331110f bellard
        return qemu_chr_open_win_pipe(p);
3351 f331110f bellard
    } else
3352 72d46479 ths
    if (strstart(filename, "con:", NULL)) {
3353 72d46479 ths
        return qemu_chr_open_win_con(filename);
3354 72d46479 ths
    } else
3355 f331110f bellard
    if (strstart(filename, "file:", &p)) {
3356 f331110f bellard
        return qemu_chr_open_win_file_out(p);
3357 f331110f bellard
    }
3358 f331110f bellard
#endif
3359 82c643ff bellard
    {
3360 82c643ff bellard
        return NULL;
3361 82c643ff bellard
    }
3362 82c643ff bellard
}
3363 82c643ff bellard
3364 f331110f bellard
void qemu_chr_close(CharDriverState *chr)
3365 f331110f bellard
{
3366 f331110f bellard
    if (chr->chr_close)
3367 f331110f bellard
        chr->chr_close(chr);
3368 f331110f bellard
}
3369 f331110f bellard
3370 80cabfad bellard
/***********************************************************/
3371 7c9d8e07 bellard
/* network device redirectors */
3372 330d0414 bellard
3373 c20709aa bellard
void hex_dump(FILE *f, const uint8_t *buf, int size)
3374 c20709aa bellard
{
3375 c20709aa bellard
    int len, i, j, c;
3376 c20709aa bellard
3377 c20709aa bellard
    for(i=0;i<size;i+=16) {
3378 c20709aa bellard
        len = size - i;
3379 c20709aa bellard
        if (len > 16)
3380 c20709aa bellard
            len = 16;
3381 c20709aa bellard
        fprintf(f, "%08x ", i);
3382 c20709aa bellard
        for(j=0;j<16;j++) {
3383 c20709aa bellard
            if (j < len)
3384 c20709aa bellard
                fprintf(f, " %02x", buf[i+j]);
3385 c20709aa bellard
            else
3386 c20709aa bellard
                fprintf(f, "   ");
3387 c20709aa bellard
        }
3388 c20709aa bellard
        fprintf(f, " ");
3389 c20709aa bellard
        for(j=0;j<len;j++) {
3390 c20709aa bellard
            c = buf[i+j];
3391 c20709aa bellard
            if (c < ' ' || c > '~')
3392 c20709aa bellard
                c = '.';
3393 c20709aa bellard
            fprintf(f, "%c", c);
3394 c20709aa bellard
        }
3395 c20709aa bellard
        fprintf(f, "\n");
3396 c20709aa bellard
    }
3397 c20709aa bellard
}
3398 c20709aa bellard
3399 7c9d8e07 bellard
static int parse_macaddr(uint8_t *macaddr, const char *p)
3400 c20709aa bellard
{
3401 7c9d8e07 bellard
    int i;
3402 7c9d8e07 bellard
    for(i = 0; i < 6; i++) {
3403 7c9d8e07 bellard
        macaddr[i] = strtol(p, (char **)&p, 16);
3404 7c9d8e07 bellard
        if (i == 5) {
3405 5fafdf24 ths
            if (*p != '\0')
3406 7c9d8e07 bellard
                return -1;
3407 7c9d8e07 bellard
        } else {
3408 5fafdf24 ths
            if (*p != ':')
3409 7c9d8e07 bellard
                return -1;
3410 7c9d8e07 bellard
            p++;
3411 7c9d8e07 bellard
        }
3412 7c9d8e07 bellard
    }
3413 7c9d8e07 bellard
    return 0;
3414 c20709aa bellard
}
3415 67b915a5 bellard
3416 7c9d8e07 bellard
static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
3417 67b915a5 bellard
{
3418 7c9d8e07 bellard
    const char *p, *p1;
3419 7c9d8e07 bellard
    int len;
3420 7c9d8e07 bellard
    p = *pp;
3421 7c9d8e07 bellard
    p1 = strchr(p, sep);
3422 7c9d8e07 bellard
    if (!p1)
3423 7c9d8e07 bellard
        return -1;
3424 7c9d8e07 bellard
    len = p1 - p;
3425 7c9d8e07 bellard
    p1++;
3426 7c9d8e07 bellard
    if (buf_size > 0) {
3427 7c9d8e07 bellard
        if (len > buf_size - 1)
3428 7c9d8e07 bellard
            len = buf_size - 1;
3429 7c9d8e07 bellard
        memcpy(buf, p, len);
3430 7c9d8e07 bellard
        buf[len] = '\0';
3431 7c9d8e07 bellard
    }
3432 7c9d8e07 bellard
    *pp = p1;
3433 7c9d8e07 bellard
    return 0;
3434 c20709aa bellard
}
3435 c20709aa bellard
3436 951f1351 bellard
int parse_host_src_port(struct sockaddr_in *haddr,
3437 951f1351 bellard
                        struct sockaddr_in *saddr,
3438 951f1351 bellard
                        const char *input_str)
3439 951f1351 bellard
{
3440 951f1351 bellard
    char *str = strdup(input_str);
3441 951f1351 bellard
    char *host_str = str;
3442 951f1351 bellard
    char *src_str;
3443 951f1351 bellard
    char *ptr;
3444 951f1351 bellard
3445 951f1351 bellard
    /*
3446 951f1351 bellard
     * Chop off any extra arguments at the end of the string which
3447 951f1351 bellard
     * would start with a comma, then fill in the src port information
3448 951f1351 bellard
     * if it was provided else use the "any address" and "any port".
3449 951f1351 bellard
     */
3450 951f1351 bellard
    if ((ptr = strchr(str,',')))
3451 951f1351 bellard
        *ptr = '\0';
3452 951f1351 bellard
3453 951f1351 bellard
    if ((src_str = strchr(input_str,'@'))) {
3454 951f1351 bellard
        *src_str = '\0';
3455 951f1351 bellard
        src_str++;
3456 951f1351 bellard
    }
3457 951f1351 bellard
3458 951f1351 bellard
    if (parse_host_port(haddr, host_str) < 0)
3459 951f1351 bellard
        goto fail;
3460 951f1351 bellard
3461 951f1351 bellard
    if (!src_str || *src_str == '\0')
3462 951f1351 bellard
        src_str = ":0";
3463 951f1351 bellard
3464 951f1351 bellard
    if (parse_host_port(saddr, src_str) < 0)
3465 951f1351 bellard
        goto fail;
3466 951f1351 bellard
3467 951f1351 bellard
    free(str);
3468 951f1351 bellard
    return(0);
3469 951f1351 bellard
3470 951f1351 bellard
fail:
3471 951f1351 bellard
    free(str);
3472 951f1351 bellard
    return -1;
3473 951f1351 bellard
}
3474 951f1351 bellard
3475 7c9d8e07 bellard
int parse_host_port(struct sockaddr_in *saddr, const char *str)
3476 7c9d8e07 bellard
{
3477 7c9d8e07 bellard
    char buf[512];
3478 7c9d8e07 bellard
    struct hostent *he;
3479 7c9d8e07 bellard
    const char *p, *r;
3480 7c9d8e07 bellard
    int port;
3481 7c9d8e07 bellard
3482 7c9d8e07 bellard
    p = str;
3483 7c9d8e07 bellard
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3484 7c9d8e07 bellard
        return -1;
3485 7c9d8e07 bellard
    saddr->sin_family = AF_INET;
3486 7c9d8e07 bellard
    if (buf[0] == '\0') {
3487 7c9d8e07 bellard
        saddr->sin_addr.s_addr = 0;
3488 7c9d8e07 bellard
    } else {
3489 7c9d8e07 bellard
        if (isdigit(buf[0])) {
3490 7c9d8e07 bellard
            if (!inet_aton(buf, &saddr->sin_addr))
3491 7c9d8e07 bellard
                return -1;
3492 7c9d8e07 bellard
        } else {
3493 7c9d8e07 bellard
            if ((he = gethostbyname(buf)) == NULL)
3494 7c9d8e07 bellard
                return - 1;
3495 7c9d8e07 bellard
            saddr->sin_addr = *(struct in_addr *)he->h_addr;
3496 7c9d8e07 bellard
        }
3497 7c9d8e07 bellard
    }
3498 7c9d8e07 bellard
    port = strtol(p, (char **)&r, 0);
3499 7c9d8e07 bellard
    if (r == p)
3500 7c9d8e07 bellard
        return -1;
3501 7c9d8e07 bellard
    saddr->sin_port = htons(port);
3502 7c9d8e07 bellard
    return 0;
3503 7c9d8e07 bellard
}
3504 c20709aa bellard
3505 52f61fde ths
#ifndef _WIN32
3506 52f61fde ths
static int parse_unix_path(struct sockaddr_un *uaddr, const char *str)
3507 ffd843bc ths
{
3508 ffd843bc ths
    const char *p;
3509 ffd843bc ths
    int len;
3510 ffd843bc ths
3511 ffd843bc ths
    len = MIN(108, strlen(str));
3512 ffd843bc ths
    p = strchr(str, ',');
3513 ffd843bc ths
    if (p)
3514 ffd843bc ths
        len = MIN(len, p - str);
3515 ffd843bc ths
3516 ffd843bc ths
    memset(uaddr, 0, sizeof(*uaddr));
3517 ffd843bc ths
3518 ffd843bc ths
    uaddr->sun_family = AF_UNIX;
3519 ffd843bc ths
    memcpy(uaddr->sun_path, str, len);
3520 ffd843bc ths
3521 ffd843bc ths
    return 0;
3522 ffd843bc ths
}
3523 52f61fde ths
#endif
3524 ffd843bc ths
3525 7c9d8e07 bellard
/* find or alloc a new VLAN */
3526 7c9d8e07 bellard
VLANState *qemu_find_vlan(int id)
3527 c20709aa bellard
{
3528 7c9d8e07 bellard
    VLANState **pvlan, *vlan;
3529 7c9d8e07 bellard
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
3530 7c9d8e07 bellard
        if (vlan->id == id)
3531 7c9d8e07 bellard
            return vlan;
3532 7c9d8e07 bellard
    }
3533 7c9d8e07 bellard
    vlan = qemu_mallocz(sizeof(VLANState));
3534 7c9d8e07 bellard
    if (!vlan)
3535 7c9d8e07 bellard
        return NULL;
3536 7c9d8e07 bellard
    vlan->id = id;
3537 7c9d8e07 bellard
    vlan->next = NULL;
3538 7c9d8e07 bellard
    pvlan = &first_vlan;
3539 7c9d8e07 bellard
    while (*pvlan != NULL)
3540 7c9d8e07 bellard
        pvlan = &(*pvlan)->next;
3541 7c9d8e07 bellard
    *pvlan = vlan;
3542 7c9d8e07 bellard
    return vlan;
3543 c20709aa bellard
}
3544 c20709aa bellard
3545 7c9d8e07 bellard
VLANClientState *qemu_new_vlan_client(VLANState *vlan,
3546 d861b05e pbrook
                                      IOReadHandler *fd_read,
3547 d861b05e pbrook
                                      IOCanRWHandler *fd_can_read,
3548 d861b05e pbrook
                                      void *opaque)
3549 c20709aa bellard
{
3550 7c9d8e07 bellard
    VLANClientState *vc, **pvc;
3551 7c9d8e07 bellard
    vc = qemu_mallocz(sizeof(VLANClientState));
3552 7c9d8e07 bellard
    if (!vc)
3553 7c9d8e07 bellard
        return NULL;
3554 7c9d8e07 bellard
    vc->fd_read = fd_read;
3555 d861b05e pbrook
    vc->fd_can_read = fd_can_read;
3556 7c9d8e07 bellard
    vc->opaque = opaque;
3557 7c9d8e07 bellard
    vc->vlan = vlan;
3558 7c9d8e07 bellard
3559 7c9d8e07 bellard
    vc->next = NULL;
3560 7c9d8e07 bellard
    pvc = &vlan->first_client;
3561 7c9d8e07 bellard
    while (*pvc != NULL)
3562 7c9d8e07 bellard
        pvc = &(*pvc)->next;
3563 7c9d8e07 bellard
    *pvc = vc;
3564 7c9d8e07 bellard
    return vc;
3565 c20709aa bellard
}
3566 c20709aa bellard
3567 d861b05e pbrook
int qemu_can_send_packet(VLANClientState *vc1)
3568 d861b05e pbrook
{
3569 d861b05e pbrook
    VLANState *vlan = vc1->vlan;
3570 d861b05e pbrook
    VLANClientState *vc;
3571 d861b05e pbrook
3572 d861b05e pbrook
    for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
3573 d861b05e pbrook
        if (vc != vc1) {
3574 fbd1711d balrog
            if (vc->fd_can_read && vc->fd_can_read(vc->opaque))
3575 fbd1711d balrog
                return 1;
3576 d861b05e pbrook
        }
3577 d861b05e pbrook
    }
3578 fbd1711d balrog
    return 0;
3579 d861b05e pbrook
}
3580 d861b05e pbrook
3581 7c9d8e07 bellard
void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size)
3582 c20709aa bellard
{
3583 7c9d8e07 bellard
    VLANState *vlan = vc1->vlan;
3584 7c9d8e07 bellard
    VLANClientState *vc;
3585 7c9d8e07 bellard
3586 7c9d8e07 bellard
#if 0
3587 7c9d8e07 bellard
    printf("vlan %d send:\n", vlan->id);
3588 7c9d8e07 bellard
    hex_dump(stdout, buf, size);
3589 7c9d8e07 bellard
#endif
3590 7c9d8e07 bellard
    for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
3591 7c9d8e07 bellard
        if (vc != vc1) {
3592 7c9d8e07 bellard
            vc->fd_read(vc->opaque, buf, size);
3593 7c9d8e07 bellard
        }
3594 7c9d8e07 bellard
    }
3595 67b915a5 bellard
}
3596 67b915a5 bellard
3597 c20709aa bellard
#if defined(CONFIG_SLIRP)
3598 c20709aa bellard
3599 c20709aa bellard
/* slirp network adapter */
3600 c20709aa bellard
3601 c20709aa bellard
static int slirp_inited;
3602 7c9d8e07 bellard
static VLANClientState *slirp_vc;
3603 c20709aa bellard
3604 c20709aa bellard
int slirp_can_output(void)
3605 c20709aa bellard
{
3606 3b7f5d47 pbrook
    return !slirp_vc || qemu_can_send_packet(slirp_vc);
3607 c20709aa bellard
}
3608 c20709aa bellard
3609 c20709aa bellard
void slirp_output(const uint8_t *pkt, int pkt_len)
3610 67b915a5 bellard
{
3611 c20709aa bellard
#if 0
3612 7c9d8e07 bellard
    printf("slirp output:\n");
3613 c20709aa bellard
    hex_dump(stdout, pkt, pkt_len);
3614 c20709aa bellard
#endif
3615 3b7f5d47 pbrook
    if (!slirp_vc)
3616 3b7f5d47 pbrook
        return;
3617 7c9d8e07 bellard
    qemu_send_packet(slirp_vc, pkt, pkt_len);
3618 67b915a5 bellard
}
3619 67b915a5 bellard
3620 7c9d8e07 bellard
static void slirp_receive(void *opaque, const uint8_t *buf, int size)
3621 c20709aa bellard
{
3622 c20709aa bellard
#if 0
3623 7c9d8e07 bellard
    printf("slirp input:\n");
3624 c20709aa bellard
    hex_dump(stdout, buf, size);
3625 c20709aa bellard
#endif
3626 c20709aa bellard
    slirp_input(buf, size);
3627 c20709aa bellard
}
3628 c20709aa bellard
3629 7c9d8e07 bellard
static int net_slirp_init(VLANState *vlan)
3630 c20709aa bellard
{
3631 c20709aa bellard
    if (!slirp_inited) {
3632 c20709aa bellard
        slirp_inited = 1;
3633 c20709aa bellard
        slirp_init();
3634 c20709aa bellard
    }
3635 5fafdf24 ths
    slirp_vc = qemu_new_vlan_client(vlan,
3636 d861b05e pbrook
                                    slirp_receive, NULL, NULL);
3637 7c9d8e07 bellard
    snprintf(slirp_vc->info_str, sizeof(slirp_vc->info_str), "user redirector");
3638 9bf05444 bellard
    return 0;
3639 9bf05444 bellard
}
3640 9bf05444 bellard
3641 9bf05444 bellard
static void net_slirp_redir(const char *redir_str)
3642 9bf05444 bellard
{
3643 9bf05444 bellard
    int is_udp;
3644 9bf05444 bellard
    char buf[256], *r;
3645 9bf05444 bellard
    const char *p;
3646 9bf05444 bellard
    struct in_addr guest_addr;
3647 9bf05444 bellard
    int host_port, guest_port;
3648 3b46e624 ths
3649 9bf05444 bellard
    if (!slirp_inited) {
3650 9bf05444 bellard
        slirp_inited = 1;
3651 9bf05444 bellard
        slirp_init();
3652 9bf05444 bellard
    }
3653 9bf05444 bellard
3654 9bf05444 bellard
    p = redir_str;
3655 9bf05444 bellard
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3656 9bf05444 bellard
        goto fail;
3657 9bf05444 bellard
    if (!strcmp(buf, "tcp")) {
3658 9bf05444 bellard
        is_udp = 0;
3659 9bf05444 bellard
    } else if (!strcmp(buf, "udp")) {
3660 9bf05444 bellard
        is_udp = 1;
3661 9bf05444 bellard
    } else {
3662 9bf05444 bellard
        goto fail;
3663 9bf05444 bellard
    }
3664 9bf05444 bellard
3665 9bf05444 bellard
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3666 9bf05444 bellard
        goto fail;
3667 9bf05444 bellard
    host_port = strtol(buf, &r, 0);
3668 9bf05444 bellard
    if (r == buf)
3669 9bf05444 bellard
        goto fail;
3670 9bf05444 bellard
3671 9bf05444 bellard
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3672 9bf05444 bellard
        goto fail;
3673 9bf05444 bellard
    if (buf[0] == '\0') {
3674 9bf05444 bellard
        pstrcpy(buf, sizeof(buf), "10.0.2.15");
3675 9bf05444 bellard
    }
3676 9bf05444 bellard
    if (!inet_aton(buf, &guest_addr))
3677 9bf05444 bellard
        goto fail;
3678 3b46e624 ths
3679 9bf05444 bellard
    guest_port = strtol(p, &r, 0);
3680 9bf05444 bellard
    if (r == p)
3681 9bf05444 bellard
        goto fail;
3682 3b46e624 ths
3683 9bf05444 bellard
    if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
3684 9bf05444 bellard
        fprintf(stderr, "qemu: could not set up redirection\n");
3685 9bf05444 bellard
        exit(1);
3686 9bf05444 bellard
    }
3687 9bf05444 bellard
    return;
3688 9bf05444 bellard
 fail:
3689 9bf05444 bellard
    fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n");
3690 9bf05444 bellard
    exit(1);
3691 9bf05444 bellard
}
3692 3b46e624 ths
3693 c94c8d64 bellard
#ifndef _WIN32
3694 c94c8d64 bellard
3695 9d728e8c bellard
char smb_dir[1024];
3696 9d728e8c bellard
3697 9d728e8c bellard
static void smb_exit(void)
3698 9d728e8c bellard
{
3699 9d728e8c bellard
    DIR *d;
3700 9d728e8c bellard
    struct dirent *de;
3701 9d728e8c bellard
    char filename[1024];
3702 9d728e8c bellard
3703 9d728e8c bellard
    /* erase all the files in the directory */
3704 9d728e8c bellard
    d = opendir(smb_dir);
3705 9d728e8c bellard
    for(;;) {
3706 9d728e8c bellard
        de = readdir(d);
3707 9d728e8c bellard
        if (!de)
3708 9d728e8c bellard
            break;
3709 9d728e8c bellard
        if (strcmp(de->d_name, ".") != 0 &&
3710 9d728e8c bellard
            strcmp(de->d_name, "..") != 0) {
3711 5fafdf24 ths
            snprintf(filename, sizeof(filename), "%s/%s",
3712 9d728e8c bellard
                     smb_dir, de->d_name);
3713 9d728e8c bellard
            unlink(filename);
3714 9d728e8c bellard
        }
3715 9d728e8c bellard
    }
3716 03ffbb69 bellard
    closedir(d);
3717 9d728e8c bellard
    rmdir(smb_dir);
3718 9d728e8c bellard
}
3719 9d728e8c bellard
3720 9d728e8c bellard
/* automatic user mode samba server configuration */
3721 9d728e8c bellard
void net_slirp_smb(const char *exported_dir)
3722 9d728e8c bellard
{
3723 9d728e8c bellard
    char smb_conf[1024];
3724 9d728e8c bellard
    char smb_cmdline[1024];
3725 9d728e8c bellard
    FILE *f;
3726 9d728e8c bellard
3727 9d728e8c bellard
    if (!slirp_inited) {
3728 9d728e8c bellard
        slirp_inited = 1;
3729 9d728e8c bellard
        slirp_init();
3730 9d728e8c bellard
    }
3731 9d728e8c bellard
3732 9d728e8c bellard
    /* XXX: better tmp dir construction */
3733 9d728e8c bellard
    snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%d", getpid());
3734 9d728e8c bellard
    if (mkdir(smb_dir, 0700) < 0) {
3735 9d728e8c bellard
        fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
3736 9d728e8c bellard
        exit(1);
3737 9d728e8c bellard
    }
3738 9d728e8c bellard
    snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
3739 3b46e624 ths
3740 9d728e8c bellard
    f = fopen(smb_conf, "w");
3741 9d728e8c bellard
    if (!f) {
3742 9d728e8c bellard
        fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
3743 9d728e8c bellard
        exit(1);
3744 9d728e8c bellard
    }
3745 5fafdf24 ths
    fprintf(f,
3746 9d728e8c bellard
            "[global]\n"
3747 157777ef bellard
            "private dir=%s\n"
3748 157777ef bellard
            "smb ports=0\n"
3749 157777ef bellard
            "socket address=127.0.0.1\n"
3750 9d728e8c bellard
            "pid directory=%s\n"
3751 9d728e8c bellard
            "lock directory=%s\n"
3752 9d728e8c bellard
            "log file=%s/log.smbd\n"
3753 9d728e8c bellard
            "smb passwd file=%s/smbpasswd\n"
3754 03ffbb69 bellard
            "security = share\n"
3755 9d728e8c bellard
            "[qemu]\n"
3756 9d728e8c bellard
            "path=%s\n"
3757 9d728e8c bellard
            "read only=no\n"
3758 9d728e8c bellard
            "guest ok=yes\n",
3759 9d728e8c bellard
            smb_dir,
3760 157777ef bellard
            smb_dir,
3761 9d728e8c bellard
            smb_dir,
3762 9d728e8c bellard
            smb_dir,
3763 9d728e8c bellard
            smb_dir,
3764 9d728e8c bellard
            exported_dir
3765 9d728e8c bellard
            );
3766 9d728e8c bellard
    fclose(f);
3767 9d728e8c bellard
    atexit(smb_exit);
3768 9d728e8c bellard
3769 a14d6c8c pbrook
    snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
3770 a14d6c8c pbrook
             SMBD_COMMAND, smb_conf);
3771 3b46e624 ths
3772 9d728e8c bellard
    slirp_add_exec(0, smb_cmdline, 4, 139);
3773 9d728e8c bellard
}
3774 9bf05444 bellard
3775 c94c8d64 bellard
#endif /* !defined(_WIN32) */
3776 31a60e22 blueswir1
void do_info_slirp(void)
3777 31a60e22 blueswir1
{
3778 31a60e22 blueswir1
    slirp_stats();
3779 31a60e22 blueswir1
}
3780 c94c8d64 bellard
3781 c20709aa bellard
#endif /* CONFIG_SLIRP */
3782 c20709aa bellard
3783 c20709aa bellard
#if !defined(_WIN32)
3784 7c9d8e07 bellard
3785 7c9d8e07 bellard
typedef struct TAPState {
3786 7c9d8e07 bellard
    VLANClientState *vc;
3787 7c9d8e07 bellard
    int fd;
3788 b46a8906 ths
    char down_script[1024];
3789 7c9d8e07 bellard
} TAPState;
3790 7c9d8e07 bellard
3791 7c9d8e07 bellard
static void tap_receive(void *opaque, const uint8_t *buf, int size)
3792 7c9d8e07 bellard
{
3793 7c9d8e07 bellard
    TAPState *s = opaque;
3794 7c9d8e07 bellard
    int ret;
3795 7c9d8e07 bellard
    for(;;) {
3796 7c9d8e07 bellard
        ret = write(s->fd, buf, size);
3797 7c9d8e07 bellard
        if (ret < 0 && (errno == EINTR || errno == EAGAIN)) {
3798 7c9d8e07 bellard
        } else {
3799 7c9d8e07 bellard
            break;
3800 7c9d8e07 bellard
        }
3801 7c9d8e07 bellard
    }
3802 7c9d8e07 bellard
}
3803 7c9d8e07 bellard
3804 7c9d8e07 bellard
static void tap_send(void *opaque)
3805 7c9d8e07 bellard
{
3806 7c9d8e07 bellard
    TAPState *s = opaque;
3807 7c9d8e07 bellard
    uint8_t buf[4096];
3808 7c9d8e07 bellard
    int size;
3809 7c9d8e07 bellard
3810 d5d10bc3 ths
#ifdef __sun__
3811 d5d10bc3 ths
    struct strbuf sbuf;
3812 d5d10bc3 ths
    int f = 0;
3813 d5d10bc3 ths
    sbuf.maxlen = sizeof(buf);
3814 d5d10bc3 ths
    sbuf.buf = buf;
3815 d5d10bc3 ths
    size = getmsg(s->fd, NULL, &sbuf, &f) >=0 ? sbuf.len : -1;
3816 d5d10bc3 ths
#else
3817 7c9d8e07 bellard
    size = read(s->fd, buf, sizeof(buf));
3818 d5d10bc3 ths
#endif
3819 7c9d8e07 bellard
    if (size > 0) {
3820 7c9d8e07 bellard
        qemu_send_packet(s->vc, buf, size);
3821 7c9d8e07 bellard
    }
3822 7c9d8e07 bellard
}
3823 7c9d8e07 bellard
3824 7c9d8e07 bellard
/* fd support */
3825 7c9d8e07 bellard
3826 7c9d8e07 bellard
static TAPState *net_tap_fd_init(VLANState *vlan, int fd)
3827 7c9d8e07 bellard
{
3828 7c9d8e07 bellard
    TAPState *s;
3829 7c9d8e07 bellard
3830 7c9d8e07 bellard
    s = qemu_mallocz(sizeof(TAPState));
3831 7c9d8e07 bellard
    if (!s)
3832 7c9d8e07 bellard
        return NULL;
3833 7c9d8e07 bellard
    s->fd = fd;
3834 d861b05e pbrook
    s->vc = qemu_new_vlan_client(vlan, tap_receive, NULL, s);
3835 7c9d8e07 bellard
    qemu_set_fd_handler(s->fd, tap_send, NULL, s);
3836 7c9d8e07 bellard
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "tap: fd=%d", fd);
3837 7c9d8e07 bellard
    return s;
3838 7c9d8e07 bellard
}
3839 7c9d8e07 bellard
3840 5c40d2bd ths
#if defined (_BSD) || defined (__FreeBSD_kernel__)
3841 7c9d8e07 bellard
static int tap_open(char *ifname, int ifname_size)
3842 7d3505c5 bellard
{
3843 7d3505c5 bellard
    int fd;
3844 7d3505c5 bellard
    char *dev;
3845 7d3505c5 bellard
    struct stat s;
3846 67b915a5 bellard
3847 aeb30be6 balrog
    TFR(fd = open("/dev/tap", O_RDWR));
3848 7d3505c5 bellard
    if (fd < 0) {
3849 7d3505c5 bellard
        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
3850 7d3505c5 bellard
        return -1;
3851 7d3505c5 bellard
    }
3852 7d3505c5 bellard
3853 7d3505c5 bellard
    fstat(fd, &s);
3854 7d3505c5 bellard
    dev = devname(s.st_rdev, S_IFCHR);
3855 7d3505c5 bellard
    pstrcpy(ifname, ifname_size, dev);
3856 7d3505c5 bellard
3857 7d3505c5 bellard
    fcntl(fd, F_SETFL, O_NONBLOCK);
3858 7d3505c5 bellard
    return fd;
3859 7d3505c5 bellard
}
3860 ec530c81 bellard
#elif defined(__sun__)
3861 d5d10bc3 ths
#define TUNNEWPPA       (('T'<<16) | 0x0001)
3862 5fafdf24 ths
/*
3863 5fafdf24 ths
 * Allocate TAP device, returns opened fd.
3864 d5d10bc3 ths
 * Stores dev name in the first arg(must be large enough).
3865 3b46e624 ths
 */
3866 d5d10bc3 ths
int tap_alloc(char *dev)
3867 d5d10bc3 ths
{
3868 d5d10bc3 ths
    int tap_fd, if_fd, ppa = -1;
3869 d5d10bc3 ths
    static int ip_fd = 0;
3870 d5d10bc3 ths
    char *ptr;
3871 d5d10bc3 ths
3872 d5d10bc3 ths
    static int arp_fd = 0;
3873 d5d10bc3 ths
    int ip_muxid, arp_muxid;
3874 d5d10bc3 ths
    struct strioctl  strioc_if, strioc_ppa;
3875 d5d10bc3 ths
    int link_type = I_PLINK;;
3876 d5d10bc3 ths
    struct lifreq ifr;
3877 d5d10bc3 ths
    char actual_name[32] = "";
3878 d5d10bc3 ths
3879 d5d10bc3 ths
    memset(&ifr, 0x0, sizeof(ifr));
3880 d5d10bc3 ths
3881 d5d10bc3 ths
    if( *dev ){
3882 5fafdf24 ths
       ptr = dev;
3883 5fafdf24 ths
       while( *ptr && !isdigit((int)*ptr) ) ptr++;
3884 d5d10bc3 ths
       ppa = atoi(ptr);
3885 d5d10bc3 ths
    }
3886 d5d10bc3 ths
3887 d5d10bc3 ths
    /* Check if IP device was opened */
3888 d5d10bc3 ths
    if( ip_fd )
3889 d5d10bc3 ths
       close(ip_fd);
3890 d5d10bc3 ths
3891 aeb30be6 balrog
    TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
3892 aeb30be6 balrog
    if (ip_fd < 0) {
3893 d5d10bc3 ths
       syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
3894 d5d10bc3 ths
       return -1;
3895 d5d10bc3 ths
    }
3896 d5d10bc3 ths
3897 aeb30be6 balrog
    TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
3898 aeb30be6 balrog
    if (tap_fd < 0) {
3899 d5d10bc3 ths
       syslog(LOG_ERR, "Can't open /dev/tap");
3900 d5d10bc3 ths
       return -1;
3901 d5d10bc3 ths
    }
3902 d5d10bc3 ths
3903 d5d10bc3 ths
    /* Assign a new PPA and get its unit number. */
3904 d5d10bc3 ths
    strioc_ppa.ic_cmd = TUNNEWPPA;
3905 d5d10bc3 ths
    strioc_ppa.ic_timout = 0;
3906 d5d10bc3 ths
    strioc_ppa.ic_len = sizeof(ppa);
3907 d5d10bc3 ths
    strioc_ppa.ic_dp = (char *)&ppa;
3908 d5d10bc3 ths
    if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
3909 d5d10bc3 ths
       syslog (LOG_ERR, "Can't assign new interface");
3910 d5d10bc3 ths
3911 aeb30be6 balrog
    TFR(if_fd = open("/dev/tap", O_RDWR, 0));
3912 aeb30be6 balrog
    if (if_fd < 0) {
3913 d5d10bc3 ths
       syslog(LOG_ERR, "Can't open /dev/tap (2)");
3914 d5d10bc3 ths
       return -1;
3915 d5d10bc3 ths
    }
3916 d5d10bc3 ths
    if(ioctl(if_fd, I_PUSH, "ip") < 0){
3917 d5d10bc3 ths
       syslog(LOG_ERR, "Can't push IP module");
3918 d5d10bc3 ths
       return -1;
3919 d5d10bc3 ths
    }
3920 d5d10bc3 ths
3921 d5d10bc3 ths
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
3922 d5d10bc3 ths
        syslog(LOG_ERR, "Can't get flags\n");
3923 d5d10bc3 ths
3924 d5d10bc3 ths
    snprintf (actual_name, 32, "tap%d", ppa);
3925 d5d10bc3 ths
    strncpy (ifr.lifr_name, actual_name, sizeof (ifr.lifr_name));
3926 d5d10bc3 ths
3927 d5d10bc3 ths
    ifr.lifr_ppa = ppa;
3928 d5d10bc3 ths
    /* Assign ppa according to the unit number returned by tun device */
3929 d5d10bc3 ths
3930 d5d10bc3 ths
    if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
3931 d5d10bc3 ths
        syslog (LOG_ERR, "Can't set PPA %d", ppa);
3932 d5d10bc3 ths
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
3933 d5d10bc3 ths
        syslog (LOG_ERR, "Can't get flags\n");
3934 d5d10bc3 ths
    /* Push arp module to if_fd */
3935 d5d10bc3 ths
    if (ioctl (if_fd, I_PUSH, "arp") < 0)
3936 d5d10bc3 ths
        syslog (LOG_ERR, "Can't push ARP module (2)");
3937 d5d10bc3 ths
3938 d5d10bc3 ths
    /* Push arp module to ip_fd */
3939 d5d10bc3 ths
    if (ioctl (ip_fd, I_POP, NULL) < 0)
3940 d5d10bc3 ths
        syslog (LOG_ERR, "I_POP failed\n");
3941 d5d10bc3 ths
    if (ioctl (ip_fd, I_PUSH, "arp") < 0)
3942 d5d10bc3 ths
        syslog (LOG_ERR, "Can't push ARP module (3)\n");
3943 d5d10bc3 ths
    /* Open arp_fd */
3944 aeb30be6 balrog
    TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
3945 aeb30be6 balrog
    if (arp_fd < 0)
3946 d5d10bc3 ths
       syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
3947 d5d10bc3 ths
3948 d5d10bc3 ths
    /* Set ifname to arp */
3949 d5d10bc3 ths
    strioc_if.ic_cmd = SIOCSLIFNAME;
3950 d5d10bc3 ths
    strioc_if.ic_timout = 0;
3951 d5d10bc3 ths
    strioc_if.ic_len = sizeof(ifr);
3952 d5d10bc3 ths
    strioc_if.ic_dp = (char *)&ifr;
3953 d5d10bc3 ths
    if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
3954 d5d10bc3 ths
        syslog (LOG_ERR, "Can't set ifname to arp\n");
3955 d5d10bc3 ths
    }
3956 d5d10bc3 ths
3957 d5d10bc3 ths
    if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
3958 d5d10bc3 ths
       syslog(LOG_ERR, "Can't link TAP device to IP");
3959 d5d10bc3 ths
       return -1;
3960 d5d10bc3 ths
    }
3961 d5d10bc3 ths
3962 d5d10bc3 ths
    if ((arp_muxid = ioctl (ip_fd, link_type, arp_fd)) < 0)
3963 d5d10bc3 ths
        syslog (LOG_ERR, "Can't link TAP device to ARP");
3964 d5d10bc3 ths
3965 d5d10bc3 ths
    close (if_fd);
3966 d5d10bc3 ths
3967 d5d10bc3 ths
    memset(&ifr, 0x0, sizeof(ifr));
3968 d5d10bc3 ths
    strncpy (ifr.lifr_name, actual_name, sizeof (ifr.lifr_name));
3969 d5d10bc3 ths
    ifr.lifr_ip_muxid  = ip_muxid;
3970 d5d10bc3 ths
    ifr.lifr_arp_muxid = arp_muxid;
3971 d5d10bc3 ths
3972 d5d10bc3 ths
    if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
3973 d5d10bc3 ths
    {
3974 d5d10bc3 ths
      ioctl (ip_fd, I_PUNLINK , arp_muxid);
3975 d5d10bc3 ths
      ioctl (ip_fd, I_PUNLINK, ip_muxid);
3976 d5d10bc3 ths
      syslog (LOG_ERR, "Can't set multiplexor id");
3977 d5d10bc3 ths
    }
3978 d5d10bc3 ths
3979 d5d10bc3 ths
    sprintf(dev, "tap%d", ppa);
3980 d5d10bc3 ths
    return tap_fd;
3981 d5d10bc3 ths
}
3982 d5d10bc3 ths
3983 ec530c81 bellard
static int tap_open(char *ifname, int ifname_size)
3984 ec530c81 bellard
{
3985 d5d10bc3 ths
    char  dev[10]="";
3986 d5d10bc3 ths
    int fd;
3987 d5d10bc3 ths
    if( (fd = tap_alloc(dev)) < 0 ){
3988 d5d10bc3 ths
       fprintf(stderr, "Cannot allocate TAP device\n");
3989 d5d10bc3 ths
       return -1;
3990 d5d10bc3 ths
    }
3991 d5d10bc3 ths
    pstrcpy(ifname, ifname_size, dev);
3992 d5d10bc3 ths
    fcntl(fd, F_SETFL, O_NONBLOCK);
3993 d5d10bc3 ths
    return fd;
3994 ec530c81 bellard
}
3995 7d3505c5 bellard
#else
3996 7c9d8e07 bellard
static int tap_open(char *ifname, int ifname_size)
3997 330d0414 bellard
{
3998 80cabfad bellard
    struct ifreq ifr;
3999 c4b1fcc0 bellard
    int fd, ret;
4000 3b46e624 ths
4001 aeb30be6 balrog
    TFR(fd = open("/dev/net/tun", O_RDWR));
4002 80cabfad bellard
    if (fd < 0) {
4003 80cabfad bellard
        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
4004 80cabfad bellard
        return -1;
4005 330d0414 bellard
    }
4006 80cabfad bellard
    memset(&ifr, 0, sizeof(ifr));
4007 80cabfad bellard
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
4008 7c9d8e07 bellard
    if (ifname[0] != '\0')
4009 7c9d8e07 bellard
        pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
4010 7c9d8e07 bellard
    else
4011 7c9d8e07 bellard
        pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
4012 80cabfad bellard
    ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
4013 80cabfad bellard
    if (ret != 0) {
4014 80cabfad bellard
        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
4015 80cabfad bellard
        close(fd);
4016 80cabfad bellard
        return -1;
4017 80cabfad bellard
    }
4018 c4b1fcc0 bellard
    pstrcpy(ifname, ifname_size, ifr.ifr_name);
4019 80cabfad bellard
    fcntl(fd, F_SETFL, O_NONBLOCK);
4020 c4b1fcc0 bellard
    return fd;
4021 c4b1fcc0 bellard
}
4022 7d3505c5 bellard
#endif
4023 330d0414 bellard
4024 b46a8906 ths
static int launch_script(const char *setup_script, const char *ifname, int fd)
4025 7c9d8e07 bellard
{
4026 b46a8906 ths
    int pid, status;
4027 7c9d8e07 bellard
    char *args[3];
4028 7c9d8e07 bellard
    char **parg;
4029 7c9d8e07 bellard
4030 b46a8906 ths
        /* try to launch network script */
4031 7c9d8e07 bellard
        pid = fork();
4032 7c9d8e07 bellard
        if (pid >= 0) {
4033 7c9d8e07 bellard
            if (pid == 0) {
4034 50d3eeae ths
                int open_max = sysconf (_SC_OPEN_MAX), i;
4035 50d3eeae ths
                for (i = 0; i < open_max; i++)
4036 50d3eeae ths
                    if (i != STDIN_FILENO &&
4037 50d3eeae ths
                        i != STDOUT_FILENO &&
4038 50d3eeae ths
                        i != STDERR_FILENO &&
4039 50d3eeae ths
                        i != fd)
4040 50d3eeae ths
                        close(i);
4041 50d3eeae ths
4042 7c9d8e07 bellard
                parg = args;
4043 7c9d8e07 bellard
                *parg++ = (char *)setup_script;
4044 b46a8906 ths
                *parg++ = (char *)ifname;
4045 7c9d8e07 bellard
                *parg++ = NULL;
4046 7c9d8e07 bellard
                execv(setup_script, args);
4047 4a38940d bellard
                _exit(1);
4048 7c9d8e07 bellard
            }
4049 7c9d8e07 bellard
            while (waitpid(pid, &status, 0) != pid);
4050 7c9d8e07 bellard
            if (!WIFEXITED(status) ||
4051 7c9d8e07 bellard
                WEXITSTATUS(status) != 0) {
4052 7c9d8e07 bellard
                fprintf(stderr, "%s: could not launch network script\n",
4053 7c9d8e07 bellard
                        setup_script);
4054 7c9d8e07 bellard
                return -1;
4055 7c9d8e07 bellard
            }
4056 7c9d8e07 bellard
        }
4057 b46a8906 ths
    return 0;
4058 b46a8906 ths
}
4059 b46a8906 ths
4060 b46a8906 ths
static int net_tap_init(VLANState *vlan, const char *ifname1,
4061 b46a8906 ths
                        const char *setup_script, const char *down_script)
4062 b46a8906 ths
{
4063 b46a8906 ths
    TAPState *s;
4064 b46a8906 ths
    int fd;
4065 b46a8906 ths
    char ifname[128];
4066 b46a8906 ths
4067 b46a8906 ths
    if (ifname1 != NULL)
4068 b46a8906 ths
        pstrcpy(ifname, sizeof(ifname), ifname1);
4069 b46a8906 ths
    else
4070 b46a8906 ths
        ifname[0] = '\0';
4071 b46a8906 ths
    TFR(fd = tap_open(ifname, sizeof(ifname)));
4072 b46a8906 ths
    if (fd < 0)
4073 b46a8906 ths
        return -1;
4074 b46a8906 ths
4075 b46a8906 ths
    if (!setup_script || !strcmp(setup_script, "no"))
4076 b46a8906 ths
        setup_script = "";
4077 b46a8906 ths
    if (setup_script[0] != '\0') {
4078 b46a8906 ths
        if (launch_script(setup_script, ifname, fd))
4079 b46a8906 ths
            return -1;
4080 7c9d8e07 bellard
    }
4081 7c9d8e07 bellard
    s = net_tap_fd_init(vlan, fd);
4082 7c9d8e07 bellard
    if (!s)
4083 7c9d8e07 bellard
        return -1;
4084 5fafdf24 ths
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4085 7c9d8e07 bellard
             "tap: ifname=%s setup_script=%s", ifname, setup_script);
4086 b46a8906 ths
    if (down_script && strcmp(down_script, "no"))
4087 b46a8906 ths
        snprintf(s->down_script, sizeof(s->down_script), "%s", down_script);
4088 7c9d8e07 bellard
    return 0;
4089 7c9d8e07 bellard
}
4090 7c9d8e07 bellard
4091 fd1dff4b bellard
#endif /* !_WIN32 */
4092 fd1dff4b bellard
4093 7c9d8e07 bellard
/* network connection */
4094 7c9d8e07 bellard
typedef struct NetSocketState {
4095 7c9d8e07 bellard
    VLANClientState *vc;
4096 7c9d8e07 bellard
    int fd;
4097 7c9d8e07 bellard
    int state; /* 0 = getting length, 1 = getting data */
4098 7c9d8e07 bellard
    int index;
4099 7c9d8e07 bellard
    int packet_len;
4100 7c9d8e07 bellard
    uint8_t buf[4096];
4101 3d830459 bellard
    struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
4102 7c9d8e07 bellard
} NetSocketState;
4103 7c9d8e07 bellard
4104 7c9d8e07 bellard
typedef struct NetSocketListenState {
4105 7c9d8e07 bellard
    VLANState *vlan;
4106 7c9d8e07 bellard
    int fd;
4107 7c9d8e07 bellard
} NetSocketListenState;
4108 7c9d8e07 bellard
4109 7c9d8e07 bellard
/* XXX: we consider we can send the whole packet without blocking */
4110 7c9d8e07 bellard
static void net_socket_receive(void *opaque, const uint8_t *buf, int size)
4111 c20709aa bellard
{
4112 7c9d8e07 bellard
    NetSocketState *s = opaque;
4113 7c9d8e07 bellard
    uint32_t len;
4114 7c9d8e07 bellard
    len = htonl(size);
4115 7c9d8e07 bellard
4116 fd1dff4b bellard
    send_all(s->fd, (const uint8_t *)&len, sizeof(len));
4117 fd1dff4b bellard
    send_all(s->fd, buf, size);
4118 c20709aa bellard
}
4119 c20709aa bellard
4120 3d830459 bellard
static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, int size)
4121 3d830459 bellard
{
4122 3d830459 bellard
    NetSocketState *s = opaque;
4123 5fafdf24 ths
    sendto(s->fd, buf, size, 0,
4124 3d830459 bellard
           (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
4125 3d830459 bellard
}
4126 3d830459 bellard
4127 7c9d8e07 bellard
static void net_socket_send(void *opaque)
4128 c4b1fcc0 bellard
{
4129 7c9d8e07 bellard
    NetSocketState *s = opaque;
4130 fd1dff4b bellard
    int l, size, err;
4131 7c9d8e07 bellard
    uint8_t buf1[4096];
4132 7c9d8e07 bellard
    const uint8_t *buf;
4133 7c9d8e07 bellard
4134 fd1dff4b bellard
    size = recv(s->fd, buf1, sizeof(buf1), 0);
4135 fd1dff4b bellard
    if (size < 0) {
4136 fd1dff4b bellard
        err = socket_error();
4137 5fafdf24 ths
        if (err != EWOULDBLOCK)
4138 fd1dff4b bellard
            goto eoc;
4139 fd1dff4b bellard
    } else if (size == 0) {
4140 7c9d8e07 bellard
        /* end of connection */
4141 fd1dff4b bellard
    eoc:
4142 7c9d8e07 bellard
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
4143 fd1dff4b bellard
        closesocket(s->fd);
4144 7c9d8e07 bellard
        return;
4145 7c9d8e07 bellard
    }
4146 7c9d8e07 bellard
    buf = buf1;
4147 7c9d8e07 bellard
    while (size > 0) {
4148 7c9d8e07 bellard
        /* reassemble a packet from the network */
4149 7c9d8e07 bellard
        switch(s->state) {
4150 7c9d8e07 bellard
        case 0:
4151 7c9d8e07 bellard
            l = 4 - s->index;
4152 7c9d8e07 bellard
            if (l > size)
4153 7c9d8e07 bellard
                l = size;
4154 7c9d8e07 bellard
            memcpy(s->buf + s->index, buf, l);
4155 7c9d8e07 bellard
            buf += l;
4156 7c9d8e07 bellard
            size -= l;
4157 7c9d8e07 bellard
            s->index += l;
4158 7c9d8e07 bellard
            if (s->index == 4) {
4159 7c9d8e07 bellard
                /* got length */
4160 7c9d8e07 bellard
                s->packet_len = ntohl(*(uint32_t *)s->buf);
4161 7c9d8e07 bellard
                s->index = 0;
4162 7c9d8e07 bellard
                s->state = 1;
4163 7c9d8e07 bellard
            }
4164 7c9d8e07 bellard
            break;
4165 7c9d8e07 bellard
        case 1:
4166 7c9d8e07 bellard
            l = s->packet_len - s->index;
4167 7c9d8e07 bellard
            if (l > size)
4168 7c9d8e07 bellard
                l = size;
4169 7c9d8e07 bellard
            memcpy(s->buf + s->index, buf, l);
4170 7c9d8e07 bellard
            s->index += l;
4171 7c9d8e07 bellard
            buf += l;
4172 7c9d8e07 bellard
            size -= l;
4173 7c9d8e07 bellard
            if (s->index >= s->packet_len) {
4174 7c9d8e07 bellard
                qemu_send_packet(s->vc, s->buf, s->packet_len);
4175 7c9d8e07 bellard
                s->index = 0;
4176 7c9d8e07 bellard
                s->state = 0;
4177 7c9d8e07 bellard
            }
4178 7c9d8e07 bellard
            break;
4179 7c9d8e07 bellard
        }
4180 7c9d8e07 bellard
    }
4181 c20709aa bellard
}
4182 c20709aa bellard
4183 3d830459 bellard
static void net_socket_send_dgram(void *opaque)
4184 3d830459 bellard
{
4185 3d830459 bellard
    NetSocketState *s = opaque;
4186 3d830459 bellard
    int size;
4187 3d830459 bellard
4188 3d830459 bellard
    size = recv(s->fd, s->buf, sizeof(s->buf), 0);
4189 5fafdf24 ths
    if (size < 0)
4190 3d830459 bellard
        return;
4191 3d830459 bellard
    if (size == 0) {
4192 3d830459 bellard
        /* end of connection */
4193 3d830459 bellard
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
4194 3d830459 bellard
        return;
4195 3d830459 bellard
    }
4196 3d830459 bellard
    qemu_send_packet(s->vc, s->buf, size);
4197 3d830459 bellard
}
4198 3d830459 bellard
4199 3d830459 bellard
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
4200 3d830459 bellard
{
4201 3d830459 bellard
    struct ip_mreq imr;
4202 3d830459 bellard
    int fd;
4203 3d830459 bellard
    int val, ret;
4204 3d830459 bellard
    if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
4205 3d830459 bellard
        fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
4206 5fafdf24 ths
                inet_ntoa(mcastaddr->sin_addr),
4207 fd1dff4b bellard
                (int)ntohl(mcastaddr->sin_addr.s_addr));
4208 3d830459 bellard
        return -1;
4209 3d830459 bellard
4210 3d830459 bellard
    }
4211 3d830459 bellard
    fd = socket(PF_INET, SOCK_DGRAM, 0);
4212 3d830459 bellard
    if (fd < 0) {
4213 3d830459 bellard
        perror("socket(PF_INET, SOCK_DGRAM)");
4214 3d830459 bellard
        return -1;
4215 3d830459 bellard
    }
4216 3d830459 bellard
4217 fd1dff4b bellard
    val = 1;
4218 5fafdf24 ths
    ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
4219 fd1dff4b bellard
                   (const char *)&val, sizeof(val));
4220 fd1dff4b bellard
    if (ret < 0) {
4221 fd1dff4b bellard
        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
4222 fd1dff4b bellard
        goto fail;
4223 fd1dff4b bellard
    }
4224 fd1dff4b bellard
4225 fd1dff4b bellard
    ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
4226 fd1dff4b bellard
    if (ret < 0) {
4227 fd1dff4b bellard
        perror("bind");
4228 fd1dff4b bellard
        goto fail;
4229 fd1dff4b bellard
    }
4230 3b46e624 ths
4231 3d830459 bellard
    /* Add host to multicast group */
4232 3d830459 bellard
    imr.imr_multiaddr = mcastaddr->sin_addr;
4233 3d830459 bellard
    imr.imr_interface.s_addr = htonl(INADDR_ANY);
4234 3d830459 bellard
4235 5fafdf24 ths
    ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
4236 fd1dff4b bellard
                     (const char *)&imr, sizeof(struct ip_mreq));
4237 3d830459 bellard
    if (ret < 0) {
4238 3d830459 bellard
        perror("setsockopt(IP_ADD_MEMBERSHIP)");
4239 3d830459 bellard
        goto fail;
4240 3d830459 bellard
    }
4241 3d830459 bellard
4242 3d830459 bellard
    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
4243 3d830459 bellard
    val = 1;
4244 5fafdf24 ths
    ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
4245 fd1dff4b bellard
                   (const char *)&val, sizeof(val));
4246 3d830459 bellard
    if (ret < 0) {
4247 3d830459 bellard
        perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
4248 3d830459 bellard
        goto fail;
4249 3d830459 bellard
    }
4250 3d830459 bellard
4251 fd1dff4b bellard
    socket_set_nonblock(fd);
4252 3d830459 bellard
    return fd;
4253 3d830459 bellard
fail:
4254 5fafdf24 ths
    if (fd >= 0)
4255 0bab00f3 bellard
        closesocket(fd);
4256 3d830459 bellard
    return -1;
4257 3d830459 bellard
}
4258 3d830459 bellard
4259 5fafdf24 ths
static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan, int fd,
4260 3d830459 bellard
                                          int is_connected)
4261 3d830459 bellard
{
4262 3d830459 bellard
    struct sockaddr_in saddr;
4263 3d830459 bellard
    int newfd;
4264 3d830459 bellard
    socklen_t saddr_len;
4265 3d830459 bellard
    NetSocketState *s;
4266 3d830459 bellard
4267 3d830459 bellard
    /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
4268 5fafdf24 ths
     * Because this may be "shared" socket from a "master" process, datagrams would be recv()
4269 3d830459 bellard
     * by ONLY ONE process: we must "clone" this dgram socket --jjo
4270 3d830459 bellard
     */
4271 3d830459 bellard
4272 3d830459 bellard
    if (is_connected) {
4273 3d830459 bellard
        if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
4274 3d830459 bellard
            /* must be bound */
4275 3d830459 bellard
            if (saddr.sin_addr.s_addr==0) {
4276 3d830459 bellard
                fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
4277 3d830459 bellard
                        fd);
4278 3d830459 bellard
                return NULL;
4279 3d830459 bellard
            }
4280 3d830459 bellard
            /* clone dgram socket */
4281 3d830459 bellard
            newfd = net_socket_mcast_create(&saddr);
4282 3d830459 bellard
            if (newfd < 0) {
4283 3d830459 bellard
                /* error already reported by net_socket_mcast_create() */
4284 3d830459 bellard
                close(fd);
4285 3d830459 bellard
                return NULL;
4286 3d830459 bellard
            }
4287 3d830459 bellard
            /* clone newfd to fd, close newfd */
4288 3d830459 bellard
            dup2(newfd, fd);
4289 3d830459 bellard
            close(newfd);
4290 5fafdf24 ths
4291 3d830459 bellard
        } else {
4292 3d830459 bellard
            fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
4293 3d830459 bellard
                    fd, strerror(errno));
4294 3d830459 bellard
            return NULL;
4295 3d830459 bellard
        }
4296 3d830459 bellard
    }
4297 3d830459 bellard
4298 3d830459 bellard
    s = qemu_mallocz(sizeof(NetSocketState));
4299 3d830459 bellard
    if (!s)
4300 3d830459 bellard
        return NULL;
4301 3d830459 bellard
    s->fd = fd;
4302 3d830459 bellard
4303 d861b05e pbrook
    s->vc = qemu_new_vlan_client(vlan, net_socket_receive_dgram, NULL, s);
4304 3d830459 bellard
    qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
4305 3d830459 bellard
4306 3d830459 bellard
    /* mcast: save bound address as dst */
4307 3d830459 bellard
    if (is_connected) s->dgram_dst=saddr;
4308 3d830459 bellard
4309 3d830459 bellard
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4310 5fafdf24 ths
            "socket: fd=%d (%s mcast=%s:%d)",
4311 3d830459 bellard
            fd, is_connected? "cloned" : "",
4312 3d830459 bellard
            inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4313 3d830459 bellard
    return s;
4314 3d830459 bellard
}
4315 3d830459 bellard
4316 7c9d8e07 bellard
static void net_socket_connect(void *opaque)
4317 c20709aa bellard
{
4318 7c9d8e07 bellard
    NetSocketState *s = opaque;
4319 7c9d8e07 bellard
    qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
4320 7c9d8e07 bellard
}
4321 c4b1fcc0 bellard
4322 5fafdf24 ths
static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, int fd,
4323 7c9d8e07 bellard
                                          int is_connected)
4324 7c9d8e07 bellard
{
4325 7c9d8e07 bellard
    NetSocketState *s;
4326 7c9d8e07 bellard
    s = qemu_mallocz(sizeof(NetSocketState));
4327 7c9d8e07 bellard
    if (!s)
4328 7c9d8e07 bellard
        return NULL;
4329 7c9d8e07 bellard
    s->fd = fd;
4330 5fafdf24 ths
    s->vc = qemu_new_vlan_client(vlan,
4331 d861b05e pbrook
                                 net_socket_receive, NULL, s);
4332 7c9d8e07 bellard
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4333 7c9d8e07 bellard
             "socket: fd=%d", fd);
4334 7c9d8e07 bellard
    if (is_connected) {
4335 7c9d8e07 bellard
        net_socket_connect(s);
4336 7c9d8e07 bellard
    } else {
4337 7c9d8e07 bellard
        qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
4338 7c9d8e07 bellard
    }
4339 7c9d8e07 bellard
    return s;
4340 7c9d8e07 bellard
}
4341 c4b1fcc0 bellard
4342 5fafdf24 ths
static NetSocketState *net_socket_fd_init(VLANState *vlan, int fd,
4343 3d830459 bellard
                                          int is_connected)
4344 3d830459 bellard
{
4345 3d830459 bellard
    int so_type=-1, optlen=sizeof(so_type);
4346 3d830459 bellard
4347 fd1dff4b bellard
    if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type, &optlen)< 0) {
4348 931f03ee ths
        fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
4349 3d830459 bellard
        return NULL;
4350 3d830459 bellard
    }
4351 3d830459 bellard
    switch(so_type) {
4352 3d830459 bellard
    case SOCK_DGRAM:
4353 3d830459 bellard
        return net_socket_fd_init_dgram(vlan, fd, is_connected);
4354 3d830459 bellard
    case SOCK_STREAM:
4355 3d830459 bellard
        return net_socket_fd_init_stream(vlan, fd, is_connected);
4356 3d830459 bellard
    default:
4357 3d830459 bellard
        /* who knows ... this could be a eg. a pty, do warn and continue as stream */
4358 3d830459 bellard
        fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
4359 3d830459 bellard
        return net_socket_fd_init_stream(vlan, fd, is_connected);
4360 3d830459 bellard
    }
4361 3d830459 bellard
    return NULL;
4362 3d830459 bellard
}
4363 3d830459 bellard
4364 7c9d8e07 bellard
static void net_socket_accept(void *opaque)
4365 7c9d8e07 bellard
{
4366 3b46e624 ths
    NetSocketListenState *s = opaque;
4367 7c9d8e07 bellard
    NetSocketState *s1;
4368 7c9d8e07 bellard
    struct sockaddr_in saddr;
4369 7c9d8e07 bellard
    socklen_t len;
4370 7c9d8e07 bellard
    int fd;
4371 7c9d8e07 bellard
4372 7c9d8e07 bellard
    for(;;) {
4373 7c9d8e07 bellard
        len = sizeof(saddr);
4374 7c9d8e07 bellard
        fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
4375 7c9d8e07 bellard
        if (fd < 0 && errno != EINTR) {
4376 7c9d8e07 bellard
            return;
4377 7c9d8e07 bellard
        } else if (fd >= 0) {
4378 7c9d8e07 bellard
            break;
4379 80cabfad bellard
        }
4380 330d0414 bellard
    }
4381 5fafdf24 ths
    s1 = net_socket_fd_init(s->vlan, fd, 1);
4382 7c9d8e07 bellard
    if (!s1) {
4383 0bab00f3 bellard
        closesocket(fd);
4384 7c9d8e07 bellard
    } else {
4385 7c9d8e07 bellard
        snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
4386 5fafdf24 ths
                 "socket: connection from %s:%d",
4387 7c9d8e07 bellard
                 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4388 7c9d8e07 bellard
    }
4389 7c9d8e07 bellard
}
4390 7c9d8e07 bellard
4391 7c9d8e07 bellard
static int net_socket_listen_init(VLANState *vlan, const char *host_str)
4392 7c9d8e07 bellard
{
4393 7c9d8e07 bellard
    NetSocketListenState *s;
4394 7c9d8e07 bellard
    int fd, val, ret;
4395 7c9d8e07 bellard
    struct sockaddr_in saddr;
4396 7c9d8e07 bellard
4397 7c9d8e07 bellard
    if (parse_host_port(&saddr, host_str) < 0)
4398 7c9d8e07 bellard
        return -1;
4399 3b46e624 ths
4400 7c9d8e07 bellard
    s = qemu_mallocz(sizeof(NetSocketListenState));
4401 7c9d8e07 bellard
    if (!s)
4402 7c9d8e07 bellard
        return -1;
4403 7c9d8e07 bellard
4404 7c9d8e07 bellard
    fd = socket(PF_INET, SOCK_STREAM, 0);
4405 7c9d8e07 bellard
    if (fd < 0) {
4406 7c9d8e07 bellard
        perror("socket");
4407 7c9d8e07 bellard
        return -1;
4408 7c9d8e07 bellard
    }
4409 fd1dff4b bellard
    socket_set_nonblock(fd);
4410 7c9d8e07 bellard
4411 7c9d8e07 bellard
    /* allow fast reuse */
4412 7c9d8e07 bellard
    val = 1;
4413 fd1dff4b bellard
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
4414 3b46e624 ths
4415 7c9d8e07 bellard
    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
4416 7c9d8e07 bellard
    if (ret < 0) {
4417 7c9d8e07 bellard
        perror("bind");
4418 7c9d8e07 bellard
        return -1;
4419 7c9d8e07 bellard
    }
4420 7c9d8e07 bellard
    ret = listen(fd, 0);
4421 7c9d8e07 bellard
    if (ret < 0) {
4422 7c9d8e07 bellard
        perror("listen");
4423 7c9d8e07 bellard
        return -1;
4424 7c9d8e07 bellard
    }
4425 7c9d8e07 bellard
    s->vlan = vlan;
4426 7c9d8e07 bellard
    s->fd = fd;
4427 7c9d8e07 bellard
    qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
4428 80cabfad bellard
    return 0;
4429 330d0414 bellard
}
4430 330d0414 bellard
4431 7c9d8e07 bellard
static int net_socket_connect_init(VLANState *vlan, const char *host_str)
4432 330d0414 bellard
{
4433 7c9d8e07 bellard
    NetSocketState *s;
4434 fd1dff4b bellard
    int fd, connected, ret, err;
4435 7c9d8e07 bellard
    struct sockaddr_in saddr;
4436 7c9d8e07 bellard
4437 7c9d8e07 bellard
    if (parse_host_port(&saddr, host_str) < 0)
4438 7c9d8e07 bellard
        return -1;
4439 7c9d8e07 bellard
4440 7c9d8e07 bellard
    fd = socket(PF_INET, SOCK_STREAM, 0);
4441 7c9d8e07 bellard
    if (fd < 0) {
4442 7c9d8e07 bellard
        perror("socket");
4443 7c9d8e07 bellard
        return -1;
4444 7c9d8e07 bellard
    }
4445 fd1dff4b bellard
    socket_set_nonblock(fd);
4446 7c9d8e07 bellard
4447 7c9d8e07 bellard
    connected = 0;
4448 7c9d8e07 bellard
    for(;;) {
4449 7c9d8e07 bellard
        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
4450 7c9d8e07 bellard
        if (ret < 0) {
4451 fd1dff4b bellard
            err = socket_error();
4452 fd1dff4b bellard
            if (err == EINTR || err == EWOULDBLOCK) {
4453 fd1dff4b bellard
            } else if (err == EINPROGRESS) {
4454 7c9d8e07 bellard
                break;
4455 f5b12268 ths
#ifdef _WIN32
4456 f5b12268 ths
            } else if (err == WSAEALREADY) {
4457 f5b12268 ths
                break;
4458 f5b12268 ths
#endif
4459 7c9d8e07 bellard
            } else {
4460 7c9d8e07 bellard
                perror("connect");
4461 fd1dff4b bellard
                closesocket(fd);
4462 7c9d8e07 bellard
                return -1;
4463 7c9d8e07 bellard
            }
4464 7c9d8e07 bellard
        } else {
4465 7c9d8e07 bellard
            connected = 1;
4466 7c9d8e07 bellard
            break;
4467 7c9d8e07 bellard
        }
4468 7c9d8e07 bellard
    }
4469 7c9d8e07 bellard
    s = net_socket_fd_init(vlan, fd, connected);
4470 7c9d8e07 bellard
    if (!s)
4471 7c9d8e07 bellard
        return -1;
4472 7c9d8e07 bellard
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4473 5fafdf24 ths
             "socket: connect to %s:%d",
4474 7c9d8e07 bellard
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4475 c20709aa bellard
    return 0;
4476 80cabfad bellard
}
4477 330d0414 bellard
4478 3d830459 bellard
static int net_socket_mcast_init(VLANState *vlan, const char *host_str)
4479 3d830459 bellard
{
4480 3d830459 bellard
    NetSocketState *s;
4481 3d830459 bellard
    int fd;
4482 3d830459 bellard
    struct sockaddr_in saddr;
4483 3d830459 bellard
4484 3d830459 bellard
    if (parse_host_port(&saddr, host_str) < 0)
4485 3d830459 bellard
        return -1;
4486 3d830459 bellard
4487 3d830459 bellard
4488 3d830459 bellard
    fd = net_socket_mcast_create(&saddr);
4489 3d830459 bellard
    if (fd < 0)
4490 3d830459 bellard
        return -1;
4491 3d830459 bellard
4492 3d830459 bellard
    s = net_socket_fd_init(vlan, fd, 0);
4493 3d830459 bellard
    if (!s)
4494 3d830459 bellard
        return -1;
4495 3d830459 bellard
4496 3d830459 bellard
    s->dgram_dst = saddr;
4497 3b46e624 ths
4498 3d830459 bellard
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4499 5fafdf24 ths
             "socket: mcast=%s:%d",
4500 3d830459 bellard
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4501 3d830459 bellard
    return 0;
4502 3d830459 bellard
4503 3d830459 bellard
}
4504 3d830459 bellard
4505 7c9d8e07 bellard
static int get_param_value(char *buf, int buf_size,
4506 7c9d8e07 bellard
                           const char *tag, const char *str)
4507 7c9d8e07 bellard
{
4508 7c9d8e07 bellard
    const char *p;
4509 7c9d8e07 bellard
    char *q;
4510 7c9d8e07 bellard
    char option[128];
4511 7c9d8e07 bellard
4512 7c9d8e07 bellard
    p = str;
4513 7c9d8e07 bellard
    for(;;) {
4514 7c9d8e07 bellard
        q = option;
4515 7c9d8e07 bellard
        while (*p != '\0' && *p != '=') {
4516 7c9d8e07 bellard
            if ((q - option) < sizeof(option) - 1)
4517 7c9d8e07 bellard
                *q++ = *p;
4518 7c9d8e07 bellard
            p++;
4519 7c9d8e07 bellard
        }
4520 7c9d8e07 bellard
        *q = '\0';
4521 7c9d8e07 bellard
        if (*p != '=')
4522 7c9d8e07 bellard
            break;
4523 7c9d8e07 bellard
        p++;
4524 7c9d8e07 bellard
        if (!strcmp(tag, option)) {
4525 7c9d8e07 bellard
            q = buf;
4526 7c9d8e07 bellard
            while (*p != '\0' && *p != ',') {
4527 7c9d8e07 bellard
                if ((q - buf) < buf_size - 1)
4528 7c9d8e07 bellard
                    *q++ = *p;
4529 7c9d8e07 bellard
                p++;
4530 7c9d8e07 bellard
            }
4531 7c9d8e07 bellard
            *q = '\0';
4532 7c9d8e07 bellard
            return q - buf;
4533 7c9d8e07 bellard
        } else {
4534 7c9d8e07 bellard
            while (*p != '\0' && *p != ',') {
4535 7c9d8e07 bellard
                p++;
4536 7c9d8e07 bellard
            }
4537 7c9d8e07 bellard
        }
4538 7c9d8e07 bellard
        if (*p != ',')
4539 7c9d8e07 bellard
            break;
4540 7c9d8e07 bellard
        p++;
4541 7c9d8e07 bellard
    }
4542 7c9d8e07 bellard
    return 0;
4543 7c9d8e07 bellard
}
4544 7c9d8e07 bellard
4545 52f61fde ths
static int net_client_init(const char *str)
4546 7c9d8e07 bellard
{
4547 7c9d8e07 bellard
    const char *p;
4548 7c9d8e07 bellard
    char *q;
4549 7c9d8e07 bellard
    char device[64];
4550 7c9d8e07 bellard
    char buf[1024];
4551 7c9d8e07 bellard
    int vlan_id, ret;
4552 7c9d8e07 bellard
    VLANState *vlan;
4553 7c9d8e07 bellard
4554 7c9d8e07 bellard
    p = str;
4555 7c9d8e07 bellard
    q = device;
4556 7c9d8e07 bellard
    while (*p != '\0' && *p != ',') {
4557 7c9d8e07 bellard
        if ((q - device) < sizeof(device) - 1)
4558 7c9d8e07 bellard
            *q++ = *p;
4559 7c9d8e07 bellard
        p++;
4560 7c9d8e07 bellard
    }
4561 7c9d8e07 bellard
    *q = '\0';
4562 7c9d8e07 bellard
    if (*p == ',')
4563 7c9d8e07 bellard
        p++;
4564 7c9d8e07 bellard
    vlan_id = 0;
4565 7c9d8e07 bellard
    if (get_param_value(buf, sizeof(buf), "vlan", p)) {
4566 7c9d8e07 bellard
        vlan_id = strtol(buf, NULL, 0);
4567 7c9d8e07 bellard
    }
4568 7c9d8e07 bellard
    vlan = qemu_find_vlan(vlan_id);
4569 7c9d8e07 bellard
    if (!vlan) {
4570 7c9d8e07 bellard
        fprintf(stderr, "Could not create vlan %d\n", vlan_id);
4571 7c9d8e07 bellard
        return -1;
4572 7c9d8e07 bellard
    }
4573 7c9d8e07 bellard
    if (!strcmp(device, "nic")) {
4574 7c9d8e07 bellard
        NICInfo *nd;
4575 7c9d8e07 bellard
        uint8_t *macaddr;
4576 7c9d8e07 bellard
4577 7c9d8e07 bellard
        if (nb_nics >= MAX_NICS) {
4578 7c9d8e07 bellard
            fprintf(stderr, "Too Many NICs\n");
4579 7c9d8e07 bellard
            return -1;
4580 7c9d8e07 bellard
        }
4581 7c9d8e07 bellard
        nd = &nd_table[nb_nics];
4582 7c9d8e07 bellard
        macaddr = nd->macaddr;
4583 7c9d8e07 bellard
        macaddr[0] = 0x52;
4584 7c9d8e07 bellard
        macaddr[1] = 0x54;
4585 7c9d8e07 bellard
        macaddr[2] = 0x00;
4586 7c9d8e07 bellard
        macaddr[3] = 0x12;
4587 7c9d8e07 bellard
        macaddr[4] = 0x34;
4588 7c9d8e07 bellard
        macaddr[5] = 0x56 + nb_nics;
4589 7c9d8e07 bellard
4590 7c9d8e07 bellard
        if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
4591 7c9d8e07 bellard
            if (parse_macaddr(macaddr, buf) < 0) {
4592 7c9d8e07 bellard
                fprintf(stderr, "invalid syntax for ethernet address\n");
4593 7c9d8e07 bellard
                return -1;
4594 7c9d8e07 bellard
            }
4595 7c9d8e07 bellard
        }
4596 a41b2ff2 pbrook
        if (get_param_value(buf, sizeof(buf), "model", p)) {
4597 a41b2ff2 pbrook
            nd->model = strdup(buf);
4598 a41b2ff2 pbrook
        }
4599 7c9d8e07 bellard
        nd->vlan = vlan;
4600 7c9d8e07 bellard
        nb_nics++;
4601 833c7174 blueswir1
        vlan->nb_guest_devs++;
4602 7c9d8e07 bellard
        ret = 0;
4603 7c9d8e07 bellard
    } else
4604 7c9d8e07 bellard
    if (!strcmp(device, "none")) {
4605 7c9d8e07 bellard
        /* does nothing. It is needed to signal that no network cards
4606 7c9d8e07 bellard
           are wanted */
4607 7c9d8e07 bellard
        ret = 0;
4608 7c9d8e07 bellard
    } else
4609 7c9d8e07 bellard
#ifdef CONFIG_SLIRP
4610 7c9d8e07 bellard
    if (!strcmp(device, "user")) {
4611 115defd1 pbrook
        if (get_param_value(buf, sizeof(buf), "hostname", p)) {
4612 3f423c9c bellard
            pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf);
4613 115defd1 pbrook
        }
4614 833c7174 blueswir1
        vlan->nb_host_devs++;
4615 7c9d8e07 bellard
        ret = net_slirp_init(vlan);
4616 7c9d8e07 bellard
    } else
4617 7c9d8e07 bellard
#endif
4618 7fb843f8 bellard
#ifdef _WIN32
4619 7fb843f8 bellard
    if (!strcmp(device, "tap")) {
4620 7fb843f8 bellard
        char ifname[64];
4621 7fb843f8 bellard
        if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
4622 7fb843f8 bellard
            fprintf(stderr, "tap: no interface name\n");
4623 7fb843f8 bellard
            return -1;
4624 7fb843f8 bellard
        }
4625 833c7174 blueswir1
        vlan->nb_host_devs++;
4626 7fb843f8 bellard
        ret = tap_win32_init(vlan, ifname);
4627 7fb843f8 bellard
    } else
4628 7fb843f8 bellard
#else
4629 7c9d8e07 bellard
    if (!strcmp(device, "tap")) {
4630 7c9d8e07 bellard
        char ifname[64];
4631 b46a8906 ths
        char setup_script[1024], down_script[1024];
4632 7c9d8e07 bellard
        int fd;
4633 4f01035f pbrook
        vlan->nb_host_devs++;
4634 7c9d8e07 bellard
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
4635 7c9d8e07 bellard
            fd = strtol(buf, NULL, 0);
4636 7c9d8e07 bellard
            ret = -1;
4637 7c9d8e07 bellard
            if (net_tap_fd_init(vlan, fd))
4638 7c9d8e07 bellard
                ret = 0;
4639 7c9d8e07 bellard
        } else {
4640 bf8c5342 bellard
            if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
4641 bf8c5342 bellard
                ifname[0] = '\0';
4642 bf8c5342 bellard
            }
4643 7c9d8e07 bellard
            if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
4644 7c9d8e07 bellard
                pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
4645 7c9d8e07 bellard
            }
4646 b46a8906 ths
            if (get_param_value(down_script, sizeof(down_script), "downscript", p) == 0) {
4647 b46a8906 ths
                pstrcpy(down_script, sizeof(down_script), DEFAULT_NETWORK_DOWN_SCRIPT);
4648 b46a8906 ths
            }
4649 b46a8906 ths
            ret = net_tap_init(vlan, ifname, setup_script, down_script);
4650 7c9d8e07 bellard
        }
4651 7c9d8e07 bellard
    } else
4652 fd1dff4b bellard
#endif
4653 7c9d8e07 bellard
    if (!strcmp(device, "socket")) {
4654 7c9d8e07 bellard
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
4655 7c9d8e07 bellard
            int fd;
4656 7c9d8e07 bellard
            fd = strtol(buf, NULL, 0);
4657 7c9d8e07 bellard
            ret = -1;
4658 7c9d8e07 bellard
            if (net_socket_fd_init(vlan, fd, 1))
4659 7c9d8e07 bellard
                ret = 0;
4660 7c9d8e07 bellard
        } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
4661 7c9d8e07 bellard
            ret = net_socket_listen_init(vlan, buf);
4662 7c9d8e07 bellard
        } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
4663 7c9d8e07 bellard
            ret = net_socket_connect_init(vlan, buf);
4664 3d830459 bellard
        } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
4665 3d830459 bellard
            ret = net_socket_mcast_init(vlan, buf);
4666 7c9d8e07 bellard
        } else {
4667 7c9d8e07 bellard
            fprintf(stderr, "Unknown socket options: %s\n", p);
4668 7c9d8e07 bellard
            return -1;
4669 7c9d8e07 bellard
        }
4670 833c7174 blueswir1
        vlan->nb_host_devs++;
4671 7c9d8e07 bellard
    } else
4672 7c9d8e07 bellard
    {
4673 7c9d8e07 bellard
        fprintf(stderr, "Unknown network device: %s\n", device);
4674 7c9d8e07 bellard
        return -1;
4675 7c9d8e07 bellard
    }
4676 7c9d8e07 bellard
    if (ret < 0) {
4677 7c9d8e07 bellard
        fprintf(stderr, "Could not initialize device '%s'\n", device);
4678 7c9d8e07 bellard
    }
4679 3b46e624 ths
4680 7c9d8e07 bellard
    return ret;
4681 7c9d8e07 bellard
}
4682 7c9d8e07 bellard
4683 7c9d8e07 bellard
void do_info_network(void)
4684 7c9d8e07 bellard
{
4685 7c9d8e07 bellard
    VLANState *vlan;
4686 7c9d8e07 bellard
    VLANClientState *vc;
4687 7c9d8e07 bellard
4688 7c9d8e07 bellard
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
4689 7c9d8e07 bellard
        term_printf("VLAN %d devices:\n", vlan->id);
4690 7c9d8e07 bellard
        for(vc = vlan->first_client; vc != NULL; vc = vc->next)
4691 7c9d8e07 bellard
            term_printf("  %s\n", vc->info_str);
4692 7c9d8e07 bellard
    }
4693 7c9d8e07 bellard
}
4694 42550fde ths
4695 330d0414 bellard
/***********************************************************/
4696 a594cfbf bellard
/* USB devices */
4697 a594cfbf bellard
4698 0d92ed30 pbrook
static USBPort *used_usb_ports;
4699 0d92ed30 pbrook
static USBPort *free_usb_ports;
4700 0d92ed30 pbrook
4701 0d92ed30 pbrook
/* ??? Maybe change this to register a hub to keep track of the topology.  */
4702 0d92ed30 pbrook
void qemu_register_usb_port(USBPort *port, void *opaque, int index,
4703 0d92ed30 pbrook
                            usb_attachfn attach)
4704 0d92ed30 pbrook
{
4705 0d92ed30 pbrook
    port->opaque = opaque;
4706 0d92ed30 pbrook
    port->index = index;
4707 0d92ed30 pbrook
    port->attach = attach;
4708 0d92ed30 pbrook
    port->next = free_usb_ports;
4709 0d92ed30 pbrook
    free_usb_ports = port;
4710 0d92ed30 pbrook
}
4711 0d92ed30 pbrook
4712 a594cfbf bellard
static int usb_device_add(const char *devname)
4713 a594cfbf bellard
{
4714 a594cfbf bellard
    const char *p;
4715 a594cfbf bellard
    USBDevice *dev;
4716 0d92ed30 pbrook
    USBPort *port;
4717 a594cfbf bellard
4718 0d92ed30 pbrook
    if (!free_usb_ports)
4719 a594cfbf bellard
        return -1;
4720 a594cfbf bellard
4721 a594cfbf bellard
    if (strstart(devname, "host:", &p)) {
4722 a594cfbf bellard
        dev = usb_host_device_open(p);
4723 a594cfbf bellard
    } else if (!strcmp(devname, "mouse")) {
4724 a594cfbf bellard
        dev = usb_mouse_init();
4725 09b26c5e bellard
    } else if (!strcmp(devname, "tablet")) {
4726 47b2d338 balrog
        dev = usb_tablet_init();
4727 47b2d338 balrog
    } else if (!strcmp(devname, "keyboard")) {
4728 47b2d338 balrog
        dev = usb_keyboard_init();
4729 2e5d83bb pbrook
    } else if (strstart(devname, "disk:", &p)) {
4730 2e5d83bb pbrook
        dev = usb_msd_init(p);
4731 f6d2a316 balrog
    } else if (!strcmp(devname, "wacom-tablet")) {
4732 f6d2a316 balrog
        dev = usb_wacom_init();
4733 a594cfbf bellard
    } else {
4734 a594cfbf bellard
        return -1;
4735 a594cfbf bellard
    }
4736 0d92ed30 pbrook
    if (!dev)
4737 0d92ed30 pbrook
        return -1;
4738 0d92ed30 pbrook
4739 0d92ed30 pbrook
    /* Find a USB port to add the device to.  */
4740 0d92ed30 pbrook
    port = free_usb_ports;
4741 0d92ed30 pbrook
    if (!port->next) {
4742 0d92ed30 pbrook
        USBDevice *hub;
4743 0d92ed30 pbrook
4744 0d92ed30 pbrook
        /* Create a new hub and chain it on.  */
4745 0d92ed30 pbrook
        free_usb_ports = NULL;
4746 0d92ed30 pbrook
        port->next = used_usb_ports;
4747 0d92ed30 pbrook
        used_usb_ports = port;
4748 0d92ed30 pbrook
4749 0d92ed30 pbrook
        hub = usb_hub_init(VM_USB_HUB_SIZE);
4750 0d92ed30 pbrook
        usb_attach(port, hub);
4751 0d92ed30 pbrook
        port = free_usb_ports;
4752 0d92ed30 pbrook
    }
4753 0d92ed30 pbrook
4754 0d92ed30 pbrook
    free_usb_ports = port->next;
4755 0d92ed30 pbrook
    port->next = used_usb_ports;
4756 0d92ed30 pbrook
    used_usb_ports = port;
4757 0d92ed30 pbrook
    usb_attach(port, dev);
4758 a594cfbf bellard
    return 0;
4759 a594cfbf bellard
}
4760 a594cfbf bellard
4761 a594cfbf bellard
static int usb_device_del(const char *devname)
4762 a594cfbf bellard
{
4763 0d92ed30 pbrook
    USBPort *port;
4764 0d92ed30 pbrook
    USBPort **lastp;
4765 059809e4 bellard
    USBDevice *dev;
4766 0d92ed30 pbrook
    int bus_num, addr;
4767 a594cfbf bellard
    const char *p;
4768 a594cfbf bellard
4769 0d92ed30 pbrook
    if (!used_usb_ports)
4770 a594cfbf bellard
        return -1;
4771 a594cfbf bellard
4772 a594cfbf bellard
    p = strchr(devname, '.');
4773 5fafdf24 ths
    if (!p)
4774 a594cfbf bellard
        return -1;
4775 a594cfbf bellard
    bus_num = strtoul(devname, NULL, 0);
4776 a594cfbf bellard
    addr = strtoul(p + 1, NULL, 0);
4777 a594cfbf bellard
    if (bus_num != 0)
4778 a594cfbf bellard
        return -1;
4779 0d92ed30 pbrook
4780 0d92ed30 pbrook
    lastp = &used_usb_ports;
4781 0d92ed30 pbrook
    port = used_usb_ports;
4782 0d92ed30 pbrook
    while (port && port->dev->addr != addr) {
4783 0d92ed30 pbrook
        lastp = &port->next;
4784 0d92ed30 pbrook
        port = port->next;
4785 a594cfbf bellard
    }
4786 0d92ed30 pbrook
4787 0d92ed30 pbrook
    if (!port)
4788 a594cfbf bellard
        return -1;
4789 0d92ed30 pbrook
4790 059809e4 bellard
    dev = port->dev;
4791 0d92ed30 pbrook
    *lastp = port->next;
4792 0d92ed30 pbrook
    usb_attach(port, NULL);
4793 059809e4 bellard
    dev->handle_destroy(dev);
4794 0d92ed30 pbrook
    port->next = free_usb_ports;
4795 0d92ed30 pbrook
    free_usb_ports = port;
4796 a594cfbf bellard
    return 0;
4797 a594cfbf bellard
}
4798 a594cfbf bellard
4799 a594cfbf bellard
void do_usb_add(const char *devname)
4800 a594cfbf bellard
{
4801 a594cfbf bellard
    int ret;
4802 a594cfbf bellard
    ret = usb_device_add(devname);
4803 5fafdf24 ths
    if (ret < 0)
4804 a594cfbf bellard
        term_printf("Could not add USB device '%s'\n", devname);
4805 a594cfbf bellard
}
4806 a594cfbf bellard
4807 a594cfbf bellard
void do_usb_del(const char *devname)
4808 a594cfbf bellard
{
4809 a594cfbf bellard
    int ret;
4810 a594cfbf bellard
    ret = usb_device_del(devname);
4811 5fafdf24 ths
    if (ret < 0)
4812 a594cfbf bellard
        term_printf("Could not remove USB device '%s'\n", devname);
4813 a594cfbf bellard
}
4814 a594cfbf bellard
4815 a594cfbf bellard
void usb_info(void)
4816 a594cfbf bellard
{
4817 a594cfbf bellard
    USBDevice *dev;
4818 0d92ed30 pbrook
    USBPort *port;
4819 a594cfbf bellard
    const char *speed_str;
4820 a594cfbf bellard
4821 0d92ed30 pbrook
    if (!usb_enabled) {
4822 a594cfbf bellard
        term_printf("USB support not enabled\n");
4823 a594cfbf bellard
        return;
4824 a594cfbf bellard
    }
4825 a594cfbf bellard
4826 0d92ed30 pbrook
    for (port = used_usb_ports; port; port = port->next) {
4827 0d92ed30 pbrook
        dev = port->dev;
4828 0d92ed30 pbrook
        if (!dev)
4829 0d92ed30 pbrook
            continue;
4830 0d92ed30 pbrook
        switch(dev->speed) {
4831 5fafdf24 ths
        case USB_SPEED_LOW:
4832 5fafdf24 ths
            speed_str = "1.5";
4833 0d92ed30 pbrook
            break;
4834 5fafdf24 ths
        case USB_SPEED_FULL:
4835 5fafdf24 ths
            speed_str = "12";
4836 0d92ed30 pbrook
            break;
4837 5fafdf24 ths
        case USB_SPEED_HIGH:
4838 5fafdf24 ths
            speed_str = "480";
4839 0d92ed30 pbrook
            break;
4840 0d92ed30 pbrook
        default:
4841 5fafdf24 ths
            speed_str = "?";
4842 0d92ed30 pbrook
            break;
4843 a594cfbf bellard
        }
4844 5fafdf24 ths
        term_printf("  Device %d.%d, Speed %s Mb/s, Product %s\n",
4845 1f6e24e7 bellard
                    0, dev->addr, speed_str, dev->devname);
4846 a594cfbf bellard
    }
4847 a594cfbf bellard
}
4848 a594cfbf bellard
4849 f7cce898 bellard
/***********************************************************/
4850 201a51fc balrog
/* PCMCIA/Cardbus */
4851 201a51fc balrog
4852 201a51fc balrog
static struct pcmcia_socket_entry_s {
4853 201a51fc balrog
    struct pcmcia_socket_s *socket;
4854 201a51fc balrog
    struct pcmcia_socket_entry_s *next;
4855 201a51fc balrog
} *pcmcia_sockets = 0;
4856 201a51fc balrog
4857 201a51fc balrog
void pcmcia_socket_register(struct pcmcia_socket_s *socket)
4858 201a51fc balrog
{
4859 201a51fc balrog
    struct pcmcia_socket_entry_s *entry;
4860 201a51fc balrog
4861 201a51fc balrog
    entry = qemu_malloc(sizeof(struct pcmcia_socket_entry_s));
4862 201a51fc balrog
    entry->socket = socket;
4863 201a51fc balrog
    entry->next = pcmcia_sockets;
4864 201a51fc balrog
    pcmcia_sockets = entry;
4865 201a51fc balrog
}
4866 201a51fc balrog
4867 201a51fc balrog
void pcmcia_socket_unregister(struct pcmcia_socket_s *socket)
4868 201a51fc balrog
{
4869 201a51fc balrog
    struct pcmcia_socket_entry_s *entry, **ptr;
4870 201a51fc balrog
4871 201a51fc balrog
    ptr = &pcmcia_sockets;
4872 201a51fc balrog
    for (entry = *ptr; entry; ptr = &entry->next, entry = *ptr)
4873 201a51fc balrog
        if (entry->socket == socket) {
4874 201a51fc balrog
            *ptr = entry->next;
4875 201a51fc balrog
            qemu_free(entry);
4876 201a51fc balrog
        }
4877 201a51fc balrog
}
4878 201a51fc balrog
4879 201a51fc balrog
void pcmcia_info(void)
4880 201a51fc balrog
{
4881 201a51fc balrog
    struct pcmcia_socket_entry_s *iter;
4882 201a51fc balrog
    if (!pcmcia_sockets)
4883 201a51fc balrog
        term_printf("No PCMCIA sockets\n");
4884 201a51fc balrog
4885 201a51fc balrog
    for (iter = pcmcia_sockets; iter; iter = iter->next)
4886 201a51fc balrog
        term_printf("%s: %s\n", iter->socket->slot_string,
4887 201a51fc balrog
                    iter->socket->attached ? iter->socket->card_string :
4888 201a51fc balrog
                    "Empty");
4889 201a51fc balrog
}
4890 201a51fc balrog
4891 201a51fc balrog
/***********************************************************/
4892 2ff89790 ths
/* dumb display */
4893 2ff89790 ths
4894 2ff89790 ths
static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
4895 2ff89790 ths
{
4896 2ff89790 ths
}
4897 2ff89790 ths
4898 2ff89790 ths
static void dumb_resize(DisplayState *ds, int w, int h)
4899 2ff89790 ths
{
4900 2ff89790 ths
}
4901 2ff89790 ths
4902 2ff89790 ths
static void dumb_refresh(DisplayState *ds)
4903 2ff89790 ths
{
4904 2ff89790 ths
#if defined(CONFIG_SDL)
4905 2ff89790 ths
    vga_hw_update();
4906 2ff89790 ths
#endif
4907 2ff89790 ths
}
4908 2ff89790 ths
4909 2ff89790 ths
static void dumb_display_init(DisplayState *ds)
4910 2ff89790 ths
{
4911 2ff89790 ths
    ds->data = NULL;
4912 2ff89790 ths
    ds->linesize = 0;
4913 2ff89790 ths
    ds->depth = 0;
4914 2ff89790 ths
    ds->dpy_update = dumb_update;
4915 2ff89790 ths
    ds->dpy_resize = dumb_resize;
4916 2ff89790 ths
    ds->dpy_refresh = dumb_refresh;
4917 2ff89790 ths
}
4918 2ff89790 ths
4919 2ff89790 ths
/***********************************************************/
4920 8a7ddc38 bellard
/* I/O handling */
4921 0824d6fc bellard
4922 c4b1fcc0 bellard
#define MAX_IO_HANDLERS 64
4923 c4b1fcc0 bellard
4924 c4b1fcc0 bellard
typedef struct IOHandlerRecord {
4925 c4b1fcc0 bellard
    int fd;
4926 7c9d8e07 bellard
    IOCanRWHandler *fd_read_poll;
4927 7c9d8e07 bellard
    IOHandler *fd_read;
4928 7c9d8e07 bellard
    IOHandler *fd_write;
4929 cafffd40 ths
    int deleted;
4930 c4b1fcc0 bellard
    void *opaque;
4931 c4b1fcc0 bellard
    /* temporary data */
4932 c4b1fcc0 bellard
    struct pollfd *ufd;
4933 8a7ddc38 bellard
    struct IOHandlerRecord *next;
4934 c4b1fcc0 bellard
} IOHandlerRecord;
4935 c4b1fcc0 bellard
4936 8a7ddc38 bellard
static IOHandlerRecord *first_io_handler;
4937 c4b1fcc0 bellard
4938 7c9d8e07 bellard
/* XXX: fd_read_poll should be suppressed, but an API change is
4939 7c9d8e07 bellard
   necessary in the character devices to suppress fd_can_read(). */
4940 5fafdf24 ths
int qemu_set_fd_handler2(int fd,
4941 5fafdf24 ths
                         IOCanRWHandler *fd_read_poll,
4942 5fafdf24 ths
                         IOHandler *fd_read,
4943 5fafdf24 ths
                         IOHandler *fd_write,
4944 7c9d8e07 bellard
                         void *opaque)
4945 c4b1fcc0 bellard
{
4946 7c9d8e07 bellard
    IOHandlerRecord **pioh, *ioh;
4947 c4b1fcc0 bellard
4948 7c9d8e07 bellard
    if (!fd_read && !fd_write) {
4949 7c9d8e07 bellard
        pioh = &first_io_handler;
4950 7c9d8e07 bellard
        for(;;) {
4951 7c9d8e07 bellard
            ioh = *pioh;
4952 7c9d8e07 bellard
            if (ioh == NULL)
4953 7c9d8e07 bellard
                break;
4954 7c9d8e07 bellard
            if (ioh->fd == fd) {
4955 cafffd40 ths
                ioh->deleted = 1;
4956 7c9d8e07 bellard
                break;
4957 7c9d8e07 bellard
            }
4958 7c9d8e07 bellard
            pioh = &ioh->next;
4959 7c9d8e07 bellard
        }
4960 7c9d8e07 bellard
    } else {
4961 7c9d8e07 bellard
        for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
4962 7c9d8e07 bellard
            if (ioh->fd == fd)
4963 7c9d8e07 bellard
                goto found;
4964 7c9d8e07 bellard
        }
4965 7c9d8e07 bellard
        ioh = qemu_mallocz(sizeof(IOHandlerRecord));
4966 7c9d8e07 bellard
        if (!ioh)
4967 7c9d8e07 bellard
            return -1;
4968 7c9d8e07 bellard
        ioh->next = first_io_handler;
4969 7c9d8e07 bellard
        first_io_handler = ioh;
4970 7c9d8e07 bellard
    found:
4971 7c9d8e07 bellard
        ioh->fd = fd;
4972 7c9d8e07 bellard
        ioh->fd_read_poll = fd_read_poll;
4973 7c9d8e07 bellard
        ioh->fd_read = fd_read;
4974 7c9d8e07 bellard
        ioh->fd_write = fd_write;
4975 7c9d8e07 bellard
        ioh->opaque = opaque;
4976 cafffd40 ths
        ioh->deleted = 0;
4977 7c9d8e07 bellard
    }
4978 c4b1fcc0 bellard
    return 0;
4979 c4b1fcc0 bellard
}
4980 c4b1fcc0 bellard
4981 5fafdf24 ths
int qemu_set_fd_handler(int fd,
4982 5fafdf24 ths
                        IOHandler *fd_read,
4983 5fafdf24 ths
                        IOHandler *fd_write,
4984 7c9d8e07 bellard
                        void *opaque)
4985 8a7ddc38 bellard
{
4986 7c9d8e07 bellard
    return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
4987 8a7ddc38 bellard
}
4988 8a7ddc38 bellard
4989 8a7ddc38 bellard
/***********************************************************/
4990 f331110f bellard
/* Polling handling */
4991 f331110f bellard
4992 f331110f bellard
typedef struct PollingEntry {
4993 f331110f bellard
    PollingFunc *func;
4994 f331110f bellard
    void *opaque;
4995 f331110f bellard
    struct PollingEntry *next;
4996 f331110f bellard
} PollingEntry;
4997 f331110f bellard
4998 f331110f bellard
static PollingEntry *first_polling_entry;
4999 f331110f bellard
5000 f331110f bellard
int qemu_add_polling_cb(PollingFunc *func, void *opaque)
5001 f331110f bellard
{
5002 f331110f bellard
    PollingEntry **ppe, *pe;
5003 f331110f bellard
    pe = qemu_mallocz(sizeof(PollingEntry));
5004 f331110f bellard
    if (!pe)
5005 f331110f bellard
        return -1;
5006 f331110f bellard
    pe->func = func;
5007 f331110f bellard
    pe->opaque = opaque;
5008 f331110f bellard
    for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
5009 f331110f bellard
    *ppe = pe;
5010 f331110f bellard
    return 0;
5011 f331110f bellard
}
5012 f331110f bellard
5013 f331110f bellard
void qemu_del_polling_cb(PollingFunc *func, void *opaque)
5014 f331110f bellard
{
5015 f331110f bellard
    PollingEntry **ppe, *pe;
5016 f331110f bellard
    for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
5017 f331110f bellard
        pe = *ppe;
5018 f331110f bellard
        if (pe->func == func && pe->opaque == opaque) {
5019 f331110f bellard
            *ppe = pe->next;
5020 f331110f bellard
            qemu_free(pe);
5021 f331110f bellard
            break;
5022 f331110f bellard
        }
5023 f331110f bellard
    }
5024 f331110f bellard
}
5025 f331110f bellard
5026 a18e524a bellard
#ifdef _WIN32
5027 a18e524a bellard
/***********************************************************/
5028 a18e524a bellard
/* Wait objects support */
5029 a18e524a bellard
typedef struct WaitObjects {
5030 a18e524a bellard
    int num;
5031 a18e524a bellard
    HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
5032 a18e524a bellard
    WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
5033 a18e524a bellard
    void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
5034 a18e524a bellard
} WaitObjects;
5035 a18e524a bellard
5036 a18e524a bellard
static WaitObjects wait_objects = {0};
5037 3b46e624 ths
5038 a18e524a bellard
int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
5039 a18e524a bellard
{
5040 a18e524a bellard
    WaitObjects *w = &wait_objects;
5041 a18e524a bellard
5042 a18e524a bellard
    if (w->num >= MAXIMUM_WAIT_OBJECTS)
5043 a18e524a bellard
        return -1;
5044 a18e524a bellard
    w->events[w->num] = handle;
5045 a18e524a bellard
    w->func[w->num] = func;
5046 a18e524a bellard
    w->opaque[w->num] = opaque;
5047 a18e524a bellard
    w->num++;
5048 a18e524a bellard
    return 0;
5049 a18e524a bellard
}
5050 a18e524a bellard
5051 a18e524a bellard
void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
5052 a18e524a bellard
{
5053 a18e524a bellard
    int i, found;
5054 a18e524a bellard
    WaitObjects *w = &wait_objects;
5055 a18e524a bellard
5056 a18e524a bellard
    found = 0;
5057 a18e524a bellard
    for (i = 0; i < w->num; i++) {
5058 a18e524a bellard
        if (w->events[i] == handle)
5059 a18e524a bellard
            found = 1;
5060 a18e524a bellard
        if (found) {
5061 a18e524a bellard
            w->events[i] = w->events[i + 1];
5062 a18e524a bellard
            w->func[i] = w->func[i + 1];
5063 a18e524a bellard
            w->opaque[i] = w->opaque[i + 1];
5064 3b46e624 ths
        }
5065 a18e524a bellard
    }
5066 a18e524a bellard
    if (found)
5067 a18e524a bellard
        w->num--;
5068 a18e524a bellard
}
5069 a18e524a bellard
#endif
5070 a18e524a bellard
5071 f331110f bellard
/***********************************************************/
5072 8a7ddc38 bellard
/* savevm/loadvm support */
5073 8a7ddc38 bellard
5074 faea38e7 bellard
#define IO_BUF_SIZE 32768
5075 faea38e7 bellard
5076 faea38e7 bellard
struct QEMUFile {
5077 faea38e7 bellard
    FILE *outfile;
5078 faea38e7 bellard
    BlockDriverState *bs;
5079 faea38e7 bellard
    int is_file;
5080 faea38e7 bellard
    int is_writable;
5081 faea38e7 bellard
    int64_t base_offset;
5082 faea38e7 bellard
    int64_t buf_offset; /* start of buffer when writing, end of buffer
5083 faea38e7 bellard
                           when reading */
5084 faea38e7 bellard
    int buf_index;
5085 faea38e7 bellard
    int buf_size; /* 0 when writing */
5086 faea38e7 bellard
    uint8_t buf[IO_BUF_SIZE];
5087 faea38e7 bellard
};
5088 faea38e7 bellard
5089 faea38e7 bellard
QEMUFile *qemu_fopen(const char *filename, const char *mode)
5090 faea38e7 bellard
{
5091 faea38e7 bellard
    QEMUFile *f;
5092 faea38e7 bellard
5093 faea38e7 bellard
    f = qemu_mallocz(sizeof(QEMUFile));
5094 faea38e7 bellard
    if (!f)
5095 faea38e7 bellard
        return NULL;
5096 faea38e7 bellard
    if (!strcmp(mode, "wb")) {
5097 faea38e7 bellard
        f->is_writable = 1;
5098 faea38e7 bellard
    } else if (!strcmp(mode, "rb")) {
5099 faea38e7 bellard
        f->is_writable = 0;
5100 faea38e7 bellard
    } else {
5101 faea38e7 bellard
        goto fail;
5102 faea38e7 bellard
    }
5103 faea38e7 bellard
    f->outfile = fopen(filename, mode);
5104 faea38e7 bellard
    if (!f->outfile)
5105 faea38e7 bellard
        goto fail;
5106 faea38e7 bellard
    f->is_file = 1;
5107 faea38e7 bellard
    return f;
5108 faea38e7 bellard
 fail:
5109 faea38e7 bellard
    if (f->outfile)
5110 faea38e7 bellard
        fclose(f->outfile);
5111 faea38e7 bellard
    qemu_free(f);
5112 faea38e7 bellard
    return NULL;
5113 faea38e7 bellard
}
5114 faea38e7 bellard
5115 faea38e7 bellard
QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int64_t offset, int is_writable)
5116 faea38e7 bellard
{
5117 faea38e7 bellard
    QEMUFile *f;
5118 faea38e7 bellard
5119 faea38e7 bellard
    f = qemu_mallocz(sizeof(QEMUFile));
5120 faea38e7 bellard
    if (!f)
5121 faea38e7 bellard
        return NULL;
5122 faea38e7 bellard
    f->is_file = 0;
5123 faea38e7 bellard
    f->bs = bs;
5124 faea38e7 bellard
    f->is_writable = is_writable;
5125 faea38e7 bellard
    f->base_offset = offset;
5126 faea38e7 bellard
    return f;
5127 faea38e7 bellard
}
5128 faea38e7 bellard
5129 faea38e7 bellard
void qemu_fflush(QEMUFile *f)
5130 faea38e7 bellard
{
5131 faea38e7 bellard
    if (!f->is_writable)
5132 faea38e7 bellard
        return;
5133 faea38e7 bellard
    if (f->buf_index > 0) {
5134 faea38e7 bellard
        if (f->is_file) {
5135 faea38e7 bellard
            fseek(f->outfile, f->buf_offset, SEEK_SET);
5136 faea38e7 bellard
            fwrite(f->buf, 1, f->buf_index, f->outfile);
5137 faea38e7 bellard
        } else {
5138 5fafdf24 ths
            bdrv_pwrite(f->bs, f->base_offset + f->buf_offset,
5139 faea38e7 bellard
                        f->buf, f->buf_index);
5140 faea38e7 bellard
        }
5141 faea38e7 bellard
        f->buf_offset += f->buf_index;
5142 faea38e7 bellard
        f->buf_index = 0;
5143 faea38e7 bellard
    }
5144 faea38e7 bellard
}
5145 faea38e7 bellard
5146 faea38e7 bellard
static void qemu_fill_buffer(QEMUFile *f)
5147 faea38e7 bellard
{
5148 faea38e7 bellard
    int len;
5149 faea38e7 bellard
5150 faea38e7 bellard
    if (f->is_writable)
5151 faea38e7 bellard
        return;
5152 faea38e7 bellard
    if (f->is_file) {
5153 faea38e7 bellard
        fseek(f->outfile, f->buf_offset, SEEK_SET);
5154 faea38e7 bellard
        len = fread(f->buf, 1, IO_BUF_SIZE, f->outfile);
5155 faea38e7 bellard
        if (len < 0)
5156 faea38e7 bellard
            len = 0;
5157 faea38e7 bellard
    } else {
5158 5fafdf24 ths
        len = bdrv_pread(f->bs, f->base_offset + f->buf_offset,
5159 faea38e7 bellard
                         f->buf, IO_BUF_SIZE);
5160 faea38e7 bellard
        if (len < 0)
5161 faea38e7 bellard
            len = 0;
5162 faea38e7 bellard
    }
5163 faea38e7 bellard
    f->buf_index = 0;
5164 faea38e7 bellard
    f->buf_size = len;
5165 faea38e7 bellard
    f->buf_offset += len;
5166 faea38e7 bellard
}
5167 faea38e7 bellard
5168 faea38e7 bellard
void qemu_fclose(QEMUFile *f)
5169 faea38e7 bellard
{
5170 faea38e7 bellard
    if (f->is_writable)
5171 faea38e7 bellard
        qemu_fflush(f);
5172 faea38e7 bellard
    if (f->is_file) {
5173 faea38e7 bellard
        fclose(f->outfile);
5174 faea38e7 bellard
    }
5175 faea38e7 bellard
    qemu_free(f);
5176 faea38e7 bellard
}
5177 faea38e7 bellard
5178 8a7ddc38 bellard
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
5179 b4608c04 bellard
{
5180 faea38e7 bellard
    int l;
5181 faea38e7 bellard
    while (size > 0) {
5182 faea38e7 bellard
        l = IO_BUF_SIZE - f->buf_index;
5183 faea38e7 bellard
        if (l > size)
5184 faea38e7 bellard
            l = size;
5185 faea38e7 bellard
        memcpy(f->buf + f->buf_index, buf, l);
5186 faea38e7 bellard
        f->buf_index += l;
5187 faea38e7 bellard
        buf += l;
5188 faea38e7 bellard
        size -= l;
5189 faea38e7 bellard
        if (f->buf_index >= IO_BUF_SIZE)
5190 faea38e7 bellard
            qemu_fflush(f);
5191 faea38e7 bellard
    }
5192 b4608c04 bellard
}
5193 b4608c04 bellard
5194 8a7ddc38 bellard
void qemu_put_byte(QEMUFile *f, int v)
5195 b4608c04 bellard
{
5196 faea38e7 bellard
    f->buf[f->buf_index++] = v;
5197 faea38e7 bellard
    if (f->buf_index >= IO_BUF_SIZE)
5198 faea38e7 bellard
        qemu_fflush(f);
5199 faea38e7 bellard
}
5200 faea38e7 bellard
5201 faea38e7 bellard
int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size1)
5202 faea38e7 bellard
{
5203 faea38e7 bellard
    int size, l;
5204 faea38e7 bellard
5205 faea38e7 bellard
    size = size1;
5206 faea38e7 bellard
    while (size > 0) {
5207 faea38e7 bellard
        l = f->buf_size - f->buf_index;
5208 faea38e7 bellard
        if (l == 0) {
5209 faea38e7 bellard
            qemu_fill_buffer(f);
5210 faea38e7 bellard
            l = f->buf_size - f->buf_index;
5211 faea38e7 bellard
            if (l == 0)
5212 faea38e7 bellard
                break;
5213 faea38e7 bellard
        }
5214 faea38e7 bellard
        if (l > size)
5215 faea38e7 bellard
            l = size;
5216 faea38e7 bellard
        memcpy(buf, f->buf + f->buf_index, l);
5217 faea38e7 bellard
        f->buf_index += l;
5218 faea38e7 bellard
        buf += l;
5219 faea38e7 bellard
        size -= l;
5220 faea38e7 bellard
    }
5221 faea38e7 bellard
    return size1 - size;
5222 faea38e7 bellard
}
5223 faea38e7 bellard
5224 faea38e7 bellard
int qemu_get_byte(QEMUFile *f)
5225 faea38e7 bellard
{
5226 faea38e7 bellard
    if (f->buf_index >= f->buf_size) {
5227 faea38e7 bellard
        qemu_fill_buffer(f);
5228 faea38e7 bellard
        if (f->buf_index >= f->buf_size)
5229 faea38e7 bellard
            return 0;
5230 faea38e7 bellard
    }
5231 faea38e7 bellard
    return f->buf[f->buf_index++];
5232 faea38e7 bellard
}
5233 faea38e7 bellard
5234 faea38e7 bellard
int64_t qemu_ftell(QEMUFile *f)
5235 faea38e7 bellard
{
5236 faea38e7 bellard
    return f->buf_offset - f->buf_size + f->buf_index;
5237 faea38e7 bellard
}
5238 faea38e7 bellard
5239 faea38e7 bellard
int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
5240 faea38e7 bellard
{
5241 faea38e7 bellard
    if (whence == SEEK_SET) {
5242 faea38e7 bellard
        /* nothing to do */
5243 faea38e7 bellard
    } else if (whence == SEEK_CUR) {
5244 faea38e7 bellard
        pos += qemu_ftell(f);
5245 faea38e7 bellard
    } else {
5246 faea38e7 bellard
        /* SEEK_END not supported */
5247 faea38e7 bellard
        return -1;
5248 faea38e7 bellard
    }
5249 faea38e7 bellard
    if (f->is_writable) {
5250 faea38e7 bellard
        qemu_fflush(f);
5251 faea38e7 bellard
        f->buf_offset = pos;
5252 faea38e7 bellard
    } else {
5253 faea38e7 bellard
        f->buf_offset = pos;
5254 faea38e7 bellard
        f->buf_index = 0;
5255 faea38e7 bellard
        f->buf_size = 0;
5256 faea38e7 bellard
    }
5257 faea38e7 bellard
    return pos;
5258 8a7ddc38 bellard
}
5259 8a7ddc38 bellard
5260 8a7ddc38 bellard
void qemu_put_be16(QEMUFile *f, unsigned int v)
5261 8a7ddc38 bellard
{
5262 8a7ddc38 bellard
    qemu_put_byte(f, v >> 8);
5263 8a7ddc38 bellard
    qemu_put_byte(f, v);
5264 8a7ddc38 bellard
}
5265 8a7ddc38 bellard
5266 8a7ddc38 bellard
void qemu_put_be32(QEMUFile *f, unsigned int v)
5267 8a7ddc38 bellard
{
5268 8a7ddc38 bellard
    qemu_put_byte(f, v >> 24);
5269 8a7ddc38 bellard
    qemu_put_byte(f, v >> 16);
5270 8a7ddc38 bellard
    qemu_put_byte(f, v >> 8);
5271 8a7ddc38 bellard
    qemu_put_byte(f, v);
5272 8a7ddc38 bellard
}
5273 8a7ddc38 bellard
5274 8a7ddc38 bellard
void qemu_put_be64(QEMUFile *f, uint64_t v)
5275 8a7ddc38 bellard
{
5276 8a7ddc38 bellard
    qemu_put_be32(f, v >> 32);
5277 8a7ddc38 bellard
    qemu_put_be32(f, v);
5278 8a7ddc38 bellard
}
5279 8a7ddc38 bellard
5280 8a7ddc38 bellard
unsigned int qemu_get_be16(QEMUFile *f)
5281 8a7ddc38 bellard
{
5282 8a7ddc38 bellard
    unsigned int v;
5283 8a7ddc38 bellard
    v = qemu_get_byte(f) << 8;
5284 8a7ddc38 bellard
    v |= qemu_get_byte(f);
5285 8a7ddc38 bellard
    return v;
5286 8a7ddc38 bellard
}
5287 8a7ddc38 bellard
5288 8a7ddc38 bellard
unsigned int qemu_get_be32(QEMUFile *f)
5289 8a7ddc38 bellard
{
5290 8a7ddc38 bellard
    unsigned int v;
5291 8a7ddc38 bellard
    v = qemu_get_byte(f) << 24;
5292 8a7ddc38 bellard
    v |= qemu_get_byte(f) << 16;
5293 8a7ddc38 bellard
    v |= qemu_get_byte(f) << 8;
5294 8a7ddc38 bellard
    v |= qemu_get_byte(f);
5295 8a7ddc38 bellard
    return v;
5296 8a7ddc38 bellard
}
5297 8a7ddc38 bellard
5298 8a7ddc38 bellard
uint64_t qemu_get_be64(QEMUFile *f)
5299 8a7ddc38 bellard
{
5300 8a7ddc38 bellard
    uint64_t v;
5301 8a7ddc38 bellard
    v = (uint64_t)qemu_get_be32(f) << 32;
5302 8a7ddc38 bellard
    v |= qemu_get_be32(f);
5303 8a7ddc38 bellard
    return v;
5304 8a7ddc38 bellard
}
5305 8a7ddc38 bellard
5306 8a7ddc38 bellard
typedef struct SaveStateEntry {
5307 8a7ddc38 bellard
    char idstr[256];
5308 8a7ddc38 bellard
    int instance_id;
5309 8a7ddc38 bellard
    int version_id;
5310 8a7ddc38 bellard
    SaveStateHandler *save_state;
5311 8a7ddc38 bellard
    LoadStateHandler *load_state;
5312 8a7ddc38 bellard
    void *opaque;
5313 8a7ddc38 bellard
    struct SaveStateEntry *next;
5314 8a7ddc38 bellard
} SaveStateEntry;
5315 b4608c04 bellard
5316 8a7ddc38 bellard
static SaveStateEntry *first_se;
5317 8a7ddc38 bellard
5318 5fafdf24 ths
int register_savevm(const char *idstr,
5319 5fafdf24 ths
                    int instance_id,
5320 8a7ddc38 bellard
                    int version_id,
5321 8a7ddc38 bellard
                    SaveStateHandler *save_state,
5322 8a7ddc38 bellard
                    LoadStateHandler *load_state,
5323 8a7ddc38 bellard
                    void *opaque)
5324 8a7ddc38 bellard
{
5325 8a7ddc38 bellard
    SaveStateEntry *se, **pse;
5326 8a7ddc38 bellard
5327 8a7ddc38 bellard
    se = qemu_malloc(sizeof(SaveStateEntry));
5328 8a7ddc38 bellard
    if (!se)
5329 8a7ddc38 bellard
        return -1;
5330 8a7ddc38 bellard
    pstrcpy(se->idstr, sizeof(se->idstr), idstr);
5331 8a7ddc38 bellard
    se->instance_id = instance_id;
5332 8a7ddc38 bellard
    se->version_id = version_id;
5333 8a7ddc38 bellard
    se->save_state = save_state;
5334 8a7ddc38 bellard
    se->load_state = load_state;
5335 8a7ddc38 bellard
    se->opaque = opaque;
5336 8a7ddc38 bellard
    se->next = NULL;
5337 8a7ddc38 bellard
5338 8a7ddc38 bellard
    /* add at the end of list */
5339 8a7ddc38 bellard
    pse = &first_se;
5340 8a7ddc38 bellard
    while (*pse != NULL)
5341 8a7ddc38 bellard
        pse = &(*pse)->next;
5342 8a7ddc38 bellard
    *pse = se;
5343 8a7ddc38 bellard
    return 0;
5344 8a7ddc38 bellard
}
5345 8a7ddc38 bellard
5346 8a7ddc38 bellard
#define QEMU_VM_FILE_MAGIC   0x5145564d
5347 faea38e7 bellard
#define QEMU_VM_FILE_VERSION 0x00000002
5348 8a7ddc38 bellard
5349 faea38e7 bellard
int qemu_savevm_state(QEMUFile *f)
5350 8a7ddc38 bellard
{
5351 8a7ddc38 bellard
    SaveStateEntry *se;
5352 faea38e7 bellard
    int len, ret;
5353 faea38e7 bellard
    int64_t cur_pos, len_pos, total_len_pos;
5354 313aa567 bellard
5355 8a7ddc38 bellard
    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
5356 8a7ddc38 bellard
    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
5357 faea38e7 bellard
    total_len_pos = qemu_ftell(f);
5358 faea38e7 bellard
    qemu_put_be64(f, 0); /* total size */
5359 8a7ddc38 bellard
5360 8a7ddc38 bellard
    for(se = first_se; se != NULL; se = se->next) {
5361 8a7ddc38 bellard
        /* ID string */
5362 8a7ddc38 bellard
        len = strlen(se->idstr);
5363 8a7ddc38 bellard
        qemu_put_byte(f, len);
5364 8a7ddc38 bellard
        qemu_put_buffer(f, se->idstr, len);
5365 8a7ddc38 bellard
5366 8a7ddc38 bellard
        qemu_put_be32(f, se->instance_id);
5367 8a7ddc38 bellard
        qemu_put_be32(f, se->version_id);
5368 8a7ddc38 bellard
5369 8a7ddc38 bellard
        /* record size: filled later */
5370 faea38e7 bellard
        len_pos = qemu_ftell(f);
5371 8a7ddc38 bellard
        qemu_put_be32(f, 0);
5372 3b46e624 ths
5373 8a7ddc38 bellard
        se->save_state(f, se->opaque);
5374 8a7ddc38 bellard
5375 8a7ddc38 bellard
        /* fill record size */
5376 faea38e7 bellard
        cur_pos = qemu_ftell(f);
5377 faea38e7 bellard
        len = cur_pos - len_pos - 4;
5378 faea38e7 bellard
        qemu_fseek(f, len_pos, SEEK_SET);
5379 8a7ddc38 bellard
        qemu_put_be32(f, len);
5380 faea38e7 bellard
        qemu_fseek(f, cur_pos, SEEK_SET);
5381 8a7ddc38 bellard
    }
5382 faea38e7 bellard
    cur_pos = qemu_ftell(f);
5383 faea38e7 bellard
    qemu_fseek(f, total_len_pos, SEEK_SET);
5384 faea38e7 bellard
    qemu_put_be64(f, cur_pos - total_len_pos - 8);
5385 faea38e7 bellard
    qemu_fseek(f, cur_pos, SEEK_SET);
5386 8a7ddc38 bellard
5387 8a7ddc38 bellard
    ret = 0;
5388 8a7ddc38 bellard
    return ret;
5389 8a7ddc38 bellard
}
5390 8a7ddc38 bellard
5391 8a7ddc38 bellard
static SaveStateEntry *find_se(const char *idstr, int instance_id)
5392 8a7ddc38 bellard
{
5393 8a7ddc38 bellard
    SaveStateEntry *se;
5394 8a7ddc38 bellard
5395 8a7ddc38 bellard
    for(se = first_se; se != NULL; se = se->next) {
5396 5fafdf24 ths
        if (!strcmp(se->idstr, idstr) &&
5397 8a7ddc38 bellard
            instance_id == se->instance_id)
5398 8a7ddc38 bellard
            return se;
5399 8a7ddc38 bellard
    }
5400 8a7ddc38 bellard
    return NULL;
5401 8a7ddc38 bellard
}
5402 8a7ddc38 bellard
5403 faea38e7 bellard
int qemu_loadvm_state(QEMUFile *f)
5404 8a7ddc38 bellard
{
5405 8a7ddc38 bellard
    SaveStateEntry *se;
5406 faea38e7 bellard
    int len, ret, instance_id, record_len, version_id;
5407 faea38e7 bellard
    int64_t total_len, end_pos, cur_pos;
5408 8a7ddc38 bellard
    unsigned int v;
5409 8a7ddc38 bellard
    char idstr[256];
5410 3b46e624 ths
5411 8a7ddc38 bellard
    v = qemu_get_be32(f);
5412 8a7ddc38 bellard
    if (v != QEMU_VM_FILE_MAGIC)
5413 8a7ddc38 bellard
        goto fail;
5414 8a7ddc38 bellard
    v = qemu_get_be32(f);
5415 8a7ddc38 bellard
    if (v != QEMU_VM_FILE_VERSION) {
5416 8a7ddc38 bellard
    fail:
5417 8a7ddc38 bellard
        ret = -1;
5418 8a7ddc38 bellard
        goto the_end;
5419 8a7ddc38 bellard
    }
5420 faea38e7 bellard
    total_len = qemu_get_be64(f);
5421 faea38e7 bellard
    end_pos = total_len + qemu_ftell(f);
5422 b4608c04 bellard
    for(;;) {
5423 faea38e7 bellard
        if (qemu_ftell(f) >= end_pos)
5424 cd4c3e88 bellard
            break;
5425 faea38e7 bellard
        len = qemu_get_byte(f);
5426 8a7ddc38 bellard
        qemu_get_buffer(f, idstr, len);
5427 8a7ddc38 bellard
        idstr[len] = '\0';
5428 8a7ddc38 bellard
        instance_id = qemu_get_be32(f);
5429 8a7ddc38 bellard
        version_id = qemu_get_be32(f);
5430 8a7ddc38 bellard
        record_len = qemu_get_be32(f);
5431 8a7ddc38 bellard
#if 0
5432 5fafdf24 ths
        printf("idstr=%s instance=0x%x version=%d len=%d\n",
5433 8a7ddc38 bellard
               idstr, instance_id, version_id, record_len);
5434 8a7ddc38 bellard
#endif
5435 faea38e7 bellard
        cur_pos = qemu_ftell(f);
5436 8a7ddc38 bellard
        se = find_se(idstr, instance_id);
5437 8a7ddc38 bellard
        if (!se) {
5438 5fafdf24 ths
            fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n",
5439 8a7ddc38 bellard
                    instance_id, idstr);
5440 8a7ddc38 bellard
        } else {
5441 8a7ddc38 bellard
            ret = se->load_state(f, se->opaque, version_id);
5442 8a7ddc38 bellard
            if (ret < 0) {
5443 5fafdf24 ths
                fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
5444 8a7ddc38 bellard
                        instance_id, idstr);
5445 8a7ddc38 bellard
            }
5446 34865134 bellard
        }
5447 8a7ddc38 bellard
        /* always seek to exact end of record */
5448 8a7ddc38 bellard
        qemu_fseek(f, cur_pos + record_len, SEEK_SET);
5449 8a7ddc38 bellard
    }
5450 8a7ddc38 bellard
    ret = 0;
5451 8a7ddc38 bellard
 the_end:
5452 faea38e7 bellard
    return ret;
5453 faea38e7 bellard
}
5454 faea38e7 bellard
5455 faea38e7 bellard
/* device can contain snapshots */
5456 faea38e7 bellard
static int bdrv_can_snapshot(BlockDriverState *bs)
5457 faea38e7 bellard
{
5458 faea38e7 bellard
    return (bs &&
5459 faea38e7 bellard
            !bdrv_is_removable(bs) &&
5460 faea38e7 bellard
            !bdrv_is_read_only(bs));
5461 faea38e7 bellard
}
5462 faea38e7 bellard
5463 faea38e7 bellard
/* device must be snapshots in order to have a reliable snapshot */
5464 faea38e7 bellard
static int bdrv_has_snapshot(BlockDriverState *bs)
5465 faea38e7 bellard
{
5466 faea38e7 bellard
    return (bs &&
5467 faea38e7 bellard
            !bdrv_is_removable(bs) &&
5468 faea38e7 bellard
            !bdrv_is_read_only(bs));
5469 faea38e7 bellard
}
5470 faea38e7 bellard
5471 faea38e7 bellard
static BlockDriverState *get_bs_snapshots(void)
5472 faea38e7 bellard
{
5473 faea38e7 bellard
    BlockDriverState *bs;
5474 faea38e7 bellard
    int i;
5475 faea38e7 bellard
5476 faea38e7 bellard
    if (bs_snapshots)
5477 faea38e7 bellard
        return bs_snapshots;
5478 faea38e7 bellard
    for(i = 0; i <= MAX_DISKS; i++) {
5479 faea38e7 bellard
        bs = bs_table[i];
5480 faea38e7 bellard
        if (bdrv_can_snapshot(bs))
5481 faea38e7 bellard
            goto ok;
5482 faea38e7 bellard
    }
5483 faea38e7 bellard
    return NULL;
5484 faea38e7 bellard
 ok:
5485 faea38e7 bellard
    bs_snapshots = bs;
5486 faea38e7 bellard
    return bs;
5487 faea38e7 bellard
}
5488 faea38e7 bellard
5489 faea38e7 bellard
static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
5490 faea38e7 bellard
                              const char *name)
5491 faea38e7 bellard
{
5492 faea38e7 bellard
    QEMUSnapshotInfo *sn_tab, *sn;
5493 faea38e7 bellard
    int nb_sns, i, ret;
5494 3b46e624 ths
5495 faea38e7 bellard
    ret = -ENOENT;
5496 faea38e7 bellard
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
5497 faea38e7 bellard
    if (nb_sns < 0)
5498 faea38e7 bellard
        return ret;
5499 faea38e7 bellard
    for(i = 0; i < nb_sns; i++) {
5500 faea38e7 bellard
        sn = &sn_tab[i];
5501 faea38e7 bellard
        if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
5502 faea38e7 bellard
            *sn_info = *sn;
5503 faea38e7 bellard
            ret = 0;
5504 faea38e7 bellard
            break;
5505 faea38e7 bellard
        }
5506 faea38e7 bellard
    }
5507 faea38e7 bellard
    qemu_free(sn_tab);
5508 faea38e7 bellard
    return ret;
5509 faea38e7 bellard
}
5510 faea38e7 bellard
5511 faea38e7 bellard
void do_savevm(const char *name)
5512 faea38e7 bellard
{
5513 faea38e7 bellard
    BlockDriverState *bs, *bs1;
5514 faea38e7 bellard
    QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
5515 faea38e7 bellard
    int must_delete, ret, i;
5516 faea38e7 bellard
    BlockDriverInfo bdi1, *bdi = &bdi1;
5517 faea38e7 bellard
    QEMUFile *f;
5518 faea38e7 bellard
    int saved_vm_running;
5519 4c279bdf bellard
#ifdef _WIN32
5520 4c279bdf bellard
    struct _timeb tb;
5521 4c279bdf bellard
#else
5522 faea38e7 bellard
    struct timeval tv;
5523 4c279bdf bellard
#endif
5524 faea38e7 bellard
5525 faea38e7 bellard
    bs = get_bs_snapshots();
5526 faea38e7 bellard
    if (!bs) {
5527 faea38e7 bellard
        term_printf("No block device can accept snapshots\n");
5528 faea38e7 bellard
        return;
5529 faea38e7 bellard
    }
5530 faea38e7 bellard
5531 6192bc37 pbrook
    /* ??? Should this occur after vm_stop?  */
5532 6192bc37 pbrook
    qemu_aio_flush();
5533 6192bc37 pbrook
5534 faea38e7 bellard
    saved_vm_running = vm_running;
5535 faea38e7 bellard
    vm_stop(0);
5536 3b46e624 ths
5537 faea38e7 bellard
    must_delete = 0;
5538 faea38e7 bellard
    if (name) {
5539 faea38e7 bellard
        ret = bdrv_snapshot_find(bs, old_sn, name);
5540 faea38e7 bellard
        if (ret >= 0) {
5541 faea38e7 bellard
            must_delete = 1;
5542 faea38e7 bellard
        }
5543 faea38e7 bellard
    }
5544 faea38e7 bellard
    memset(sn, 0, sizeof(*sn));
5545 faea38e7 bellard
    if (must_delete) {
5546 faea38e7 bellard
        pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
5547 faea38e7 bellard
        pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
5548 faea38e7 bellard
    } else {
5549 faea38e7 bellard
        if (name)
5550 faea38e7 bellard
            pstrcpy(sn->name, sizeof(sn->name), name);
5551 faea38e7 bellard
    }
5552 faea38e7 bellard
5553 faea38e7 bellard
    /* fill auxiliary fields */
5554 4c279bdf bellard
#ifdef _WIN32
5555 4c279bdf bellard
    _ftime(&tb);
5556 4c279bdf bellard
    sn->date_sec = tb.time;
5557 4c279bdf bellard
    sn->date_nsec = tb.millitm * 1000000;
5558 4c279bdf bellard
#else
5559 faea38e7 bellard
    gettimeofday(&tv, NULL);
5560 faea38e7 bellard
    sn->date_sec = tv.tv_sec;
5561 faea38e7 bellard
    sn->date_nsec = tv.tv_usec * 1000;
5562 4c279bdf bellard
#endif
5563 faea38e7 bellard
    sn->vm_clock_nsec = qemu_get_clock(vm_clock);
5564 3b46e624 ths
5565 faea38e7 bellard
    if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
5566 faea38e7 bellard
        term_printf("Device %s does not support VM state snapshots\n",
5567 faea38e7 bellard
                    bdrv_get_device_name(bs));
5568 faea38e7 bellard
        goto the_end;
5569 faea38e7 bellard
    }
5570 3b46e624 ths
5571 faea38e7 bellard
    /* save the VM state */
5572 faea38e7 bellard
    f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 1);
5573 faea38e7 bellard
    if (!f) {
5574 faea38e7 bellard
        term_printf("Could not open VM state file\n");
5575 faea38e7 bellard
        goto the_end;
5576 faea38e7 bellard
    }
5577 faea38e7 bellard
    ret = qemu_savevm_state(f);
5578 faea38e7 bellard
    sn->vm_state_size = qemu_ftell(f);
5579 faea38e7 bellard
    qemu_fclose(f);
5580 faea38e7 bellard
    if (ret < 0) {
5581 faea38e7 bellard
        term_printf("Error %d while writing VM\n", ret);
5582 faea38e7 bellard
        goto the_end;
5583 faea38e7 bellard
    }
5584 3b46e624 ths
5585 faea38e7 bellard
    /* create the snapshots */
5586 faea38e7 bellard
5587 faea38e7 bellard
    for(i = 0; i < MAX_DISKS; i++) {
5588 faea38e7 bellard
        bs1 = bs_table[i];
5589 faea38e7 bellard
        if (bdrv_has_snapshot(bs1)) {
5590 faea38e7 bellard
            if (must_delete) {
5591 faea38e7 bellard
                ret = bdrv_snapshot_delete(bs1, old_sn->id_str);
5592 faea38e7 bellard
                if (ret < 0) {
5593 faea38e7 bellard
                    term_printf("Error while deleting snapshot on '%s'\n",
5594 faea38e7 bellard
                                bdrv_get_device_name(bs1));
5595 faea38e7 bellard
                }
5596 faea38e7 bellard
            }
5597 faea38e7 bellard
            ret = bdrv_snapshot_create(bs1, sn);
5598 faea38e7 bellard
            if (ret < 0) {
5599 faea38e7 bellard
                term_printf("Error while creating snapshot on '%s'\n",
5600 faea38e7 bellard
                            bdrv_get_device_name(bs1));
5601 faea38e7 bellard
            }
5602 faea38e7 bellard
        }
5603 faea38e7 bellard
    }
5604 faea38e7 bellard
5605 faea38e7 bellard
 the_end:
5606 8a7ddc38 bellard
    if (saved_vm_running)
5607 8a7ddc38 bellard
        vm_start();
5608 faea38e7 bellard
}
5609 faea38e7 bellard
5610 faea38e7 bellard
void do_loadvm(const char *name)
5611 faea38e7 bellard
{
5612 faea38e7 bellard
    BlockDriverState *bs, *bs1;
5613 faea38e7 bellard
    BlockDriverInfo bdi1, *bdi = &bdi1;
5614 faea38e7 bellard
    QEMUFile *f;
5615 faea38e7 bellard
    int i, ret;
5616 faea38e7 bellard
    int saved_vm_running;
5617 faea38e7 bellard
5618 faea38e7 bellard
    bs = get_bs_snapshots();
5619 faea38e7 bellard
    if (!bs) {
5620 faea38e7 bellard
        term_printf("No block device supports snapshots\n");
5621 faea38e7 bellard
        return;
5622 faea38e7 bellard
    }
5623 3b46e624 ths
5624 6192bc37 pbrook
    /* Flush all IO requests so they don't interfere with the new state.  */
5625 6192bc37 pbrook
    qemu_aio_flush();
5626 6192bc37 pbrook
5627 faea38e7 bellard
    saved_vm_running = vm_running;
5628 faea38e7 bellard
    vm_stop(0);
5629 faea38e7 bellard
5630 faea38e7 bellard
    for(i = 0; i <= MAX_DISKS; i++) {
5631 faea38e7 bellard
        bs1 = bs_table[i];
5632 faea38e7 bellard
        if (bdrv_has_snapshot(bs1)) {
5633 faea38e7 bellard
            ret = bdrv_snapshot_goto(bs1, name);
5634 faea38e7 bellard
            if (ret < 0) {
5635 faea38e7 bellard
                if (bs != bs1)
5636 faea38e7 bellard
                    term_printf("Warning: ");
5637 faea38e7 bellard
                switch(ret) {
5638 faea38e7 bellard
                case -ENOTSUP:
5639 faea38e7 bellard
                    term_printf("Snapshots not supported on device '%s'\n",
5640 faea38e7 bellard
                                bdrv_get_device_name(bs1));
5641 faea38e7 bellard
                    break;
5642 faea38e7 bellard
                case -ENOENT:
5643 faea38e7 bellard
                    term_printf("Could not find snapshot '%s' on device '%s'\n",
5644 faea38e7 bellard
                                name, bdrv_get_device_name(bs1));
5645 faea38e7 bellard
                    break;
5646 faea38e7 bellard
                default:
5647 faea38e7 bellard
                    term_printf("Error %d while activating snapshot on '%s'\n",
5648 faea38e7 bellard
                                ret, bdrv_get_device_name(bs1));
5649 faea38e7 bellard
                    break;
5650 faea38e7 bellard
                }
5651 faea38e7 bellard
                /* fatal on snapshot block device */
5652 faea38e7 bellard
                if (bs == bs1)
5653 faea38e7 bellard
                    goto the_end;
5654 faea38e7 bellard
            }
5655 faea38e7 bellard
        }
5656 faea38e7 bellard
    }
5657 faea38e7 bellard
5658 faea38e7 bellard
    if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
5659 faea38e7 bellard
        term_printf("Device %s does not support VM state snapshots\n",
5660 faea38e7 bellard
                    bdrv_get_device_name(bs));
5661 faea38e7 bellard
        return;
5662 faea38e7 bellard
    }
5663 3b46e624 ths
5664 faea38e7 bellard
    /* restore the VM state */
5665 faea38e7 bellard
    f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 0);
5666 faea38e7 bellard
    if (!f) {
5667 faea38e7 bellard
        term_printf("Could not open VM state file\n");
5668 faea38e7 bellard
        goto the_end;
5669 faea38e7 bellard
    }
5670 faea38e7 bellard
    ret = qemu_loadvm_state(f);
5671 faea38e7 bellard
    qemu_fclose(f);
5672 faea38e7 bellard
    if (ret < 0) {
5673 faea38e7 bellard
        term_printf("Error %d while loading VM state\n", ret);
5674 faea38e7 bellard
    }
5675 faea38e7 bellard
 the_end:
5676 faea38e7 bellard
    if (saved_vm_running)
5677 faea38e7 bellard
        vm_start();
5678 faea38e7 bellard
}
5679 faea38e7 bellard
5680 faea38e7 bellard
void do_delvm(const char *name)
5681 faea38e7 bellard
{
5682 faea38e7 bellard
    BlockDriverState *bs, *bs1;
5683 faea38e7 bellard
    int i, ret;
5684 faea38e7 bellard
5685 faea38e7 bellard
    bs = get_bs_snapshots();
5686 faea38e7 bellard
    if (!bs) {
5687 faea38e7 bellard
        term_printf("No block device supports snapshots\n");
5688 faea38e7 bellard
        return;
5689 faea38e7 bellard
    }
5690 3b46e624 ths
5691 faea38e7 bellard
    for(i = 0; i <= MAX_DISKS; i++) {
5692 faea38e7 bellard
        bs1 = bs_table[i];
5693 faea38e7 bellard
        if (bdrv_has_snapshot(bs1)) {
5694 faea38e7 bellard
            ret = bdrv_snapshot_delete(bs1, name);
5695 faea38e7 bellard
            if (ret < 0) {
5696 faea38e7 bellard
                if (ret == -ENOTSUP)
5697 faea38e7 bellard
                    term_printf("Snapshots not supported on device '%s'\n",
5698 faea38e7 bellard
                                bdrv_get_device_name(bs1));
5699 faea38e7 bellard
                else
5700 faea38e7 bellard
                    term_printf("Error %d while deleting snapshot on '%s'\n",
5701 faea38e7 bellard
                                ret, bdrv_get_device_name(bs1));
5702 faea38e7 bellard
            }
5703 faea38e7 bellard
        }
5704 faea38e7 bellard
    }
5705 faea38e7 bellard
}
5706 faea38e7 bellard
5707 faea38e7 bellard
void do_info_snapshots(void)
5708 faea38e7 bellard
{
5709 faea38e7 bellard
    BlockDriverState *bs, *bs1;
5710 faea38e7 bellard
    QEMUSnapshotInfo *sn_tab, *sn;
5711 faea38e7 bellard
    int nb_sns, i;
5712 faea38e7 bellard
    char buf[256];
5713 faea38e7 bellard
5714 faea38e7 bellard
    bs = get_bs_snapshots();
5715 faea38e7 bellard
    if (!bs) {
5716 faea38e7 bellard
        term_printf("No available block device supports snapshots\n");
5717 faea38e7 bellard
        return;
5718 faea38e7 bellard
    }
5719 faea38e7 bellard
    term_printf("Snapshot devices:");
5720 faea38e7 bellard
    for(i = 0; i <= MAX_DISKS; i++) {
5721 faea38e7 bellard
        bs1 = bs_table[i];
5722 faea38e7 bellard
        if (bdrv_has_snapshot(bs1)) {
5723 faea38e7 bellard
            if (bs == bs1)
5724 faea38e7 bellard
                term_printf(" %s", bdrv_get_device_name(bs1));
5725 faea38e7 bellard
        }
5726 faea38e7 bellard
    }
5727 faea38e7 bellard
    term_printf("\n");
5728 faea38e7 bellard
5729 faea38e7 bellard
    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
5730 faea38e7 bellard
    if (nb_sns < 0) {
5731 faea38e7 bellard
        term_printf("bdrv_snapshot_list: error %d\n", nb_sns);
5732 faea38e7 bellard
        return;
5733 faea38e7 bellard
    }
5734 faea38e7 bellard
    term_printf("Snapshot list (from %s):\n", bdrv_get_device_name(bs));
5735 faea38e7 bellard
    term_printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
5736 faea38e7 bellard
    for(i = 0; i < nb_sns; i++) {
5737 faea38e7 bellard
        sn = &sn_tab[i];
5738 faea38e7 bellard
        term_printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
5739 faea38e7 bellard
    }
5740 faea38e7 bellard
    qemu_free(sn_tab);
5741 8a7ddc38 bellard
}
5742 8a7ddc38 bellard
5743 8a7ddc38 bellard
/***********************************************************/
5744 8a7ddc38 bellard
/* cpu save/restore */
5745 8a7ddc38 bellard
5746 8a7ddc38 bellard
#if defined(TARGET_I386)
5747 8a7ddc38 bellard
5748 8a7ddc38 bellard
static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
5749 8a7ddc38 bellard
{
5750 02ba45c5 bellard
    qemu_put_be32(f, dt->selector);
5751 20f32282 bellard
    qemu_put_betl(f, dt->base);
5752 8a7ddc38 bellard
    qemu_put_be32(f, dt->limit);
5753 8a7ddc38 bellard
    qemu_put_be32(f, dt->flags);
5754 8a7ddc38 bellard
}
5755 8a7ddc38 bellard
5756 8a7ddc38 bellard
static void cpu_get_seg(QEMUFile *f, SegmentCache *dt)
5757 8a7ddc38 bellard
{
5758 02ba45c5 bellard
    dt->selector = qemu_get_be32(f);
5759 20f32282 bellard
    dt->base = qemu_get_betl(f);
5760 8a7ddc38 bellard
    dt->limit = qemu_get_be32(f);
5761 8a7ddc38 bellard
    dt->flags = qemu_get_be32(f);
5762 8a7ddc38 bellard
}
5763 8a7ddc38 bellard
5764 8a7ddc38 bellard
void cpu_save(QEMUFile *f, void *opaque)
5765 8a7ddc38 bellard
{
5766 8a7ddc38 bellard
    CPUState *env = opaque;
5767 664e0f19 bellard
    uint16_t fptag, fpus, fpuc, fpregs_format;
5768 8a7ddc38 bellard
    uint32_t hflags;
5769 8a7ddc38 bellard
    int i;
5770 3b46e624 ths
5771 20f32282 bellard
    for(i = 0; i < CPU_NB_REGS; i++)
5772 20f32282 bellard
        qemu_put_betls(f, &env->regs[i]);
5773 20f32282 bellard
    qemu_put_betls(f, &env->eip);
5774 20f32282 bellard
    qemu_put_betls(f, &env->eflags);
5775 8a7ddc38 bellard
    hflags = env->hflags; /* XXX: suppress most of the redundant hflags */
5776 8a7ddc38 bellard
    qemu_put_be32s(f, &hflags);
5777 3b46e624 ths
5778 8a7ddc38 bellard
    /* FPU */
5779 8a7ddc38 bellard
    fpuc = env->fpuc;
5780 8a7ddc38 bellard
    fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
5781 8a7ddc38 bellard
    fptag = 0;
5782 664e0f19 bellard
    for(i = 0; i < 8; i++) {
5783 664e0f19 bellard
        fptag |= ((!env->fptags[i]) << i);
5784 8a7ddc38 bellard
    }
5785 3b46e624 ths
5786 8a7ddc38 bellard
    qemu_put_be16s(f, &fpuc);
5787 8a7ddc38 bellard
    qemu_put_be16s(f, &fpus);
5788 8a7ddc38 bellard
    qemu_put_be16s(f, &fptag);
5789 8a7ddc38 bellard
5790 664e0f19 bellard
#ifdef USE_X86LDOUBLE
5791 664e0f19 bellard
    fpregs_format = 0;
5792 664e0f19 bellard
#else
5793 664e0f19 bellard
    fpregs_format = 1;
5794 664e0f19 bellard
#endif
5795 664e0f19 bellard
    qemu_put_be16s(f, &fpregs_format);
5796 3b46e624 ths
5797 8a7ddc38 bellard
    for(i = 0; i < 8; i++) {
5798 664e0f19 bellard
#ifdef USE_X86LDOUBLE
5799 8636b5d8 bellard
        {
5800 8636b5d8 bellard
            uint64_t mant;
5801 8636b5d8 bellard
            uint16_t exp;
5802 8636b5d8 bellard
            /* we save the real CPU data (in case of MMX usage only 'mant'
5803 8636b5d8 bellard
               contains the MMX register */
5804 8636b5d8 bellard
            cpu_get_fp80(&mant, &exp, env->fpregs[i].d);
5805 8636b5d8 bellard
            qemu_put_be64(f, mant);
5806 8636b5d8 bellard
            qemu_put_be16(f, exp);
5807 8636b5d8 bellard
        }
5808 664e0f19 bellard
#else
5809 664e0f19 bellard
        /* if we use doubles for float emulation, we save the doubles to
5810 664e0f19 bellard
           avoid losing information in case of MMX usage. It can give
5811 664e0f19 bellard
           problems if the image is restored on a CPU where long
5812 664e0f19 bellard
           doubles are used instead. */
5813 8636b5d8 bellard
        qemu_put_be64(f, env->fpregs[i].mmx.MMX_Q(0));
5814 664e0f19 bellard
#endif
5815 8a7ddc38 bellard
    }
5816 8a7ddc38 bellard
5817 8a7ddc38 bellard
    for(i = 0; i < 6; i++)
5818 8a7ddc38 bellard
        cpu_put_seg(f, &env->segs[i]);
5819 8a7ddc38 bellard
    cpu_put_seg(f, &env->ldt);
5820 8a7ddc38 bellard
    cpu_put_seg(f, &env->tr);
5821 8a7ddc38 bellard
    cpu_put_seg(f, &env->gdt);
5822 8a7ddc38 bellard
    cpu_put_seg(f, &env->idt);
5823 3b46e624 ths
5824 8a7ddc38 bellard
    qemu_put_be32s(f, &env->sysenter_cs);
5825 8a7ddc38 bellard
    qemu_put_be32s(f, &env->sysenter_esp);
5826 8a7ddc38 bellard
    qemu_put_be32s(f, &env->sysenter_eip);
5827 3b46e624 ths
5828 20f32282 bellard
    qemu_put_betls(f, &env->cr[0]);
5829 20f32282 bellard
    qemu_put_betls(f, &env->cr[2]);
5830 20f32282 bellard
    qemu_put_betls(f, &env->cr[3]);
5831 20f32282 bellard
    qemu_put_betls(f, &env->cr[4]);
5832 3b46e624 ths
5833 8a7ddc38 bellard
    for(i = 0; i < 8; i++)
5834 20f32282 bellard
        qemu_put_betls(f, &env->dr[i]);
5835 8a7ddc38 bellard
5836 8a7ddc38 bellard
    /* MMU */
5837 8a7ddc38 bellard
    qemu_put_be32s(f, &env->a20_mask);
5838 02536f8b bellard
5839 664e0f19 bellard
    /* XMM */
5840 664e0f19 bellard
    qemu_put_be32s(f, &env->mxcsr);
5841 02536f8b bellard
    for(i = 0; i < CPU_NB_REGS; i++) {
5842 02536f8b bellard
        qemu_put_be64s(f, &env->xmm_regs[i].XMM_Q(0));
5843 02536f8b bellard
        qemu_put_be64s(f, &env->xmm_regs[i].XMM_Q(1));
5844 02536f8b bellard
    }
5845 02536f8b bellard
5846 664e0f19 bellard
#ifdef TARGET_X86_64
5847 02536f8b bellard
    qemu_put_be64s(f, &env->efer);
5848 02536f8b bellard
    qemu_put_be64s(f, &env->star);
5849 02536f8b bellard
    qemu_put_be64s(f, &env->lstar);
5850 02536f8b bellard
    qemu_put_be64s(f, &env->cstar);
5851 02536f8b bellard
    qemu_put_be64s(f, &env->fmask);
5852 02536f8b bellard
    qemu_put_be64s(f, &env->kernelgsbase);
5853 02536f8b bellard
#endif
5854 3b21e03e bellard
    qemu_put_be32s(f, &env->smbase);
5855 8a7ddc38 bellard
}
5856 8a7ddc38 bellard
5857 8636b5d8 bellard
#ifdef USE_X86LDOUBLE
5858 664e0f19 bellard
/* XXX: add that in a FPU generic layer */
5859 664e0f19 bellard
union x86_longdouble {
5860 664e0f19 bellard
    uint64_t mant;
5861 664e0f19 bellard
    uint16_t exp;
5862 664e0f19 bellard
};
5863 664e0f19 bellard
5864 664e0f19 bellard
#define MANTD1(fp)        (fp & ((1LL << 52) - 1))
5865 664e0f19 bellard
#define EXPBIAS1 1023
5866 664e0f19 bellard
#define EXPD1(fp)        ((fp >> 52) & 0x7FF)
5867 664e0f19 bellard
#define SIGND1(fp)        ((fp >> 32) & 0x80000000)
5868 664e0f19 bellard
5869 664e0f19 bellard
static void fp64_to_fp80(union x86_longdouble *p, uint64_t temp)
5870 664e0f19 bellard
{
5871 664e0f19 bellard
    int e;
5872 664e0f19 bellard
    /* mantissa */
5873 664e0f19 bellard
    p->mant = (MANTD1(temp) << 11) | (1LL << 63);
5874 664e0f19 bellard
    /* exponent + sign */
5875 664e0f19 bellard
    e = EXPD1(temp) - EXPBIAS1 + 16383;
5876 664e0f19 bellard
    e |= SIGND1(temp) >> 16;
5877 664e0f19 bellard
    p->exp = e;
5878 664e0f19 bellard
}
5879 8636b5d8 bellard
#endif
5880 664e0f19 bellard
5881 8a7ddc38 bellard
int cpu_load(QEMUFile *f, void *opaque, int version_id)
5882 8a7ddc38 bellard
{
5883 8a7ddc38 bellard
    CPUState *env = opaque;
5884 664e0f19 bellard
    int i, guess_mmx;
5885 8a7ddc38 bellard
    uint32_t hflags;
5886 664e0f19 bellard
    uint16_t fpus, fpuc, fptag, fpregs_format;
5887 8a7ddc38 bellard
5888 3b21e03e bellard
    if (version_id != 3 && version_id != 4)
5889 8a7ddc38 bellard
        return -EINVAL;
5890 20f32282 bellard
    for(i = 0; i < CPU_NB_REGS; i++)
5891 20f32282 bellard
        qemu_get_betls(f, &env->regs[i]);
5892 20f32282 bellard
    qemu_get_betls(f, &env->eip);
5893 20f32282 bellard
    qemu_get_betls(f, &env->eflags);
5894 8a7ddc38 bellard
    qemu_get_be32s(f, &hflags);
5895 8a7ddc38 bellard
5896 8a7ddc38 bellard
    qemu_get_be16s(f, &fpuc);
5897 8a7ddc38 bellard
    qemu_get_be16s(f, &fpus);
5898 8a7ddc38 bellard
    qemu_get_be16s(f, &fptag);
5899 664e0f19 bellard
    qemu_get_be16s(f, &fpregs_format);
5900 3b46e624 ths
5901 664e0f19 bellard
    /* NOTE: we cannot always restore the FPU state if the image come
5902 664e0f19 bellard
       from a host with a different 'USE_X86LDOUBLE' define. We guess
5903 664e0f19 bellard
       if we are in an MMX state to restore correctly in that case. */
5904 664e0f19 bellard
    guess_mmx = ((fptag == 0xff) && (fpus & 0x3800) == 0);
5905 8a7ddc38 bellard
    for(i = 0; i < 8; i++) {
5906 8a7ddc38 bellard
        uint64_t mant;
5907 8a7ddc38 bellard
        uint16_t exp;
5908 3b46e624 ths
5909 664e0f19 bellard
        switch(fpregs_format) {
5910 664e0f19 bellard
        case 0:
5911 664e0f19 bellard
            mant = qemu_get_be64(f);
5912 664e0f19 bellard
            exp = qemu_get_be16(f);
5913 664e0f19 bellard
#ifdef USE_X86LDOUBLE
5914 664e0f19 bellard
            env->fpregs[i].d = cpu_set_fp80(mant, exp);
5915 664e0f19 bellard
#else
5916 664e0f19 bellard
            /* difficult case */
5917 664e0f19 bellard
            if (guess_mmx)
5918 8636b5d8 bellard
                env->fpregs[i].mmx.MMX_Q(0) = mant;
5919 664e0f19 bellard
            else
5920 664e0f19 bellard
                env->fpregs[i].d = cpu_set_fp80(mant, exp);
5921 664e0f19 bellard
#endif
5922 664e0f19 bellard
            break;
5923 664e0f19 bellard
        case 1:
5924 664e0f19 bellard
            mant = qemu_get_be64(f);
5925 664e0f19 bellard
#ifdef USE_X86LDOUBLE
5926 8636b5d8 bellard
            {
5927 8636b5d8 bellard
                union x86_longdouble *p;
5928 8636b5d8 bellard
                /* difficult case */
5929 8636b5d8 bellard
                p = (void *)&env->fpregs[i];
5930 8636b5d8 bellard
                if (guess_mmx) {
5931 8636b5d8 bellard
                    p->mant = mant;
5932 8636b5d8 bellard
                    p->exp = 0xffff;
5933 8636b5d8 bellard
                } else {
5934 8636b5d8 bellard
                    fp64_to_fp80(p, mant);
5935 8636b5d8 bellard
                }
5936 664e0f19 bellard
            }
5937 664e0f19 bellard
#else
5938 8636b5d8 bellard
            env->fpregs[i].mmx.MMX_Q(0) = mant;
5939 3b46e624 ths
#endif
5940 664e0f19 bellard
            break;
5941 664e0f19 bellard
        default:
5942 664e0f19 bellard
            return -EINVAL;
5943 664e0f19 bellard
        }
5944 8a7ddc38 bellard
    }
5945 8a7ddc38 bellard
5946 8a7ddc38 bellard
    env->fpuc = fpuc;
5947 7a0e1f41 bellard
    /* XXX: restore FPU round state */
5948 8a7ddc38 bellard
    env->fpstt = (fpus >> 11) & 7;
5949 8a7ddc38 bellard
    env->fpus = fpus & ~0x3800;
5950 664e0f19 bellard
    fptag ^= 0xff;
5951 8a7ddc38 bellard
    for(i = 0; i < 8; i++) {
5952 664e0f19 bellard
        env->fptags[i] = (fptag >> i) & 1;
5953 8a7ddc38 bellard
    }
5954 3b46e624 ths
5955 8a7ddc38 bellard
    for(i = 0; i < 6; i++)
5956 8a7ddc38 bellard
        cpu_get_seg(f, &env->segs[i]);
5957 8a7ddc38 bellard
    cpu_get_seg(f, &env->ldt);
5958 8a7ddc38 bellard
    cpu_get_seg(f, &env->tr);
5959 8a7ddc38 bellard
    cpu_get_seg(f, &env->gdt);
5960 8a7ddc38 bellard
    cpu_get_seg(f, &env->idt);
5961 3b46e624 ths
5962 8a7ddc38 bellard
    qemu_get_be32s(f, &env->sysenter_cs);
5963 8a7ddc38 bellard
    qemu_get_be32s(f, &env->sysenter_esp);
5964 8a7ddc38 bellard
    qemu_get_be32s(f, &env->sysenter_eip);
5965 3b46e624 ths
5966 20f32282 bellard
    qemu_get_betls(f, &env->cr[0]);
5967 20f32282 bellard
    qemu_get_betls(f, &env->cr[2]);
5968 20f32282 bellard
    qemu_get_betls(f, &env->cr[3]);
5969 20f32282 bellard
    qemu_get_betls(f, &env->cr[4]);
5970 3b46e624 ths
5971 8a7ddc38 bellard
    for(i = 0; i < 8; i++)
5972 20f32282 bellard
        qemu_get_betls(f, &env->dr[i]);
5973 8a7ddc38 bellard
5974 8a7ddc38 bellard
    /* MMU */
5975 8a7ddc38 bellard
    qemu_get_be32s(f, &env->a20_mask);
5976 8a7ddc38 bellard
5977 664e0f19 bellard
    qemu_get_be32s(f, &env->mxcsr);
5978 02536f8b bellard
    for(i = 0; i < CPU_NB_REGS; i++) {
5979 02536f8b bellard
        qemu_get_be64s(f, &env->xmm_regs[i].XMM_Q(0));
5980 02536f8b bellard
        qemu_get_be64s(f, &env->xmm_regs[i].XMM_Q(1));
5981 02536f8b bellard
    }
5982 02536f8b bellard
5983 664e0f19 bellard
#ifdef TARGET_X86_64
5984 02536f8b bellard
    qemu_get_be64s(f, &env->efer);
5985 02536f8b bellard
    qemu_get_be64s(f, &env->star);
5986 02536f8b bellard
    qemu_get_be64s(f, &env->lstar);
5987 02536f8b bellard
    qemu_get_be64s(f, &env->cstar);
5988 02536f8b bellard
    qemu_get_be64s(f, &env->fmask);
5989 02536f8b bellard
    qemu_get_be64s(f, &env->kernelgsbase);
5990 02536f8b bellard
#endif
5991 5fafdf24 ths
    if (version_id >= 4)
5992 3b21e03e bellard
        qemu_get_be32s(f, &env->smbase);
5993 02536f8b bellard
5994 8a7ddc38 bellard
    /* XXX: compute hflags from scratch, except for CPL and IIF */
5995 8a7ddc38 bellard
    env->hflags = hflags;
5996 8a7ddc38 bellard
    tlb_flush(env, 1);
5997 8a7ddc38 bellard
    return 0;
5998 8a7ddc38 bellard
}
5999 8a7ddc38 bellard
6000 a541f297 bellard
#elif defined(TARGET_PPC)
6001 a541f297 bellard
void cpu_save(QEMUFile *f, void *opaque)
6002 a541f297 bellard
{
6003 a541f297 bellard
}
6004 a541f297 bellard
6005 a541f297 bellard
int cpu_load(QEMUFile *f, void *opaque, int version_id)
6006 a541f297 bellard
{
6007 a541f297 bellard
    return 0;
6008 a541f297 bellard
}
6009 6af0bf9c bellard
6010 6af0bf9c bellard
#elif defined(TARGET_MIPS)
6011 6af0bf9c bellard
void cpu_save(QEMUFile *f, void *opaque)
6012 6af0bf9c bellard
{
6013 6af0bf9c bellard
}
6014 6af0bf9c bellard
6015 6af0bf9c bellard
int cpu_load(QEMUFile *f, void *opaque, int version_id)
6016 6af0bf9c bellard
{
6017 6af0bf9c bellard
    return 0;
6018 6af0bf9c bellard
}
6019 6af0bf9c bellard
6020 e95c8d51 bellard
#elif defined(TARGET_SPARC)
6021 e95c8d51 bellard
void cpu_save(QEMUFile *f, void *opaque)
6022 e95c8d51 bellard
{
6023 e80cfcfc bellard
    CPUState *env = opaque;
6024 e80cfcfc bellard
    int i;
6025 e80cfcfc bellard
    uint32_t tmp;
6026 e80cfcfc bellard
6027 4fa5d772 bellard
    for(i = 0; i < 8; i++)
6028 4fa5d772 bellard
        qemu_put_betls(f, &env->gregs[i]);
6029 4fa5d772 bellard
    for(i = 0; i < NWINDOWS * 16; i++)
6030 4fa5d772 bellard
        qemu_put_betls(f, &env->regbase[i]);
6031 e80cfcfc bellard
6032 e80cfcfc bellard
    /* FPU */
6033 4fa5d772 bellard
    for(i = 0; i < TARGET_FPREGS; i++) {
6034 4fa5d772 bellard
        union {
6035 1bdb68ea bellard
            float32 f;
6036 1bdb68ea bellard
            uint32_t i;
6037 4fa5d772 bellard
        } u;
6038 4fa5d772 bellard
        u.f = env->fpr[i];
6039 1bdb68ea bellard
        qemu_put_be32(f, u.i);
6040 4fa5d772 bellard
    }
6041 4fa5d772 bellard
6042 4fa5d772 bellard
    qemu_put_betls(f, &env->pc);
6043 4fa5d772 bellard
    qemu_put_betls(f, &env->npc);
6044 4fa5d772 bellard
    qemu_put_betls(f, &env->y);
6045 e80cfcfc bellard
    tmp = GET_PSR(env);
6046 4fa5d772 bellard
    qemu_put_be32(f, tmp);
6047 3475187d bellard
    qemu_put_betls(f, &env->fsr);
6048 3475187d bellard
    qemu_put_betls(f, &env->tbr);
6049 3475187d bellard
#ifndef TARGET_SPARC64
6050 e80cfcfc bellard
    qemu_put_be32s(f, &env->wim);
6051 e80cfcfc bellard
    /* MMU */
6052 e80cfcfc bellard
    for(i = 0; i < 16; i++)
6053 e80cfcfc bellard
        qemu_put_be32s(f, &env->mmuregs[i]);
6054 3475187d bellard
#endif
6055 e95c8d51 bellard
}
6056 e95c8d51 bellard
6057 e95c8d51 bellard
int cpu_load(QEMUFile *f, void *opaque, int version_id)
6058 e95c8d51 bellard
{
6059 e80cfcfc bellard
    CPUState *env = opaque;
6060 e80cfcfc bellard
    int i;
6061 e80cfcfc bellard
    uint32_t tmp;
6062 e80cfcfc bellard
6063 4fa5d772 bellard
    for(i = 0; i < 8; i++)
6064 4fa5d772 bellard
        qemu_get_betls(f, &env->gregs[i]);
6065 4fa5d772 bellard
    for(i = 0; i < NWINDOWS * 16; i++)
6066 4fa5d772 bellard
        qemu_get_betls(f, &env->regbase[i]);
6067 e80cfcfc bellard
6068 e80cfcfc bellard
    /* FPU */
6069 4fa5d772 bellard
    for(i = 0; i < TARGET_FPREGS; i++) {
6070 4fa5d772 bellard
        union {
6071 1bdb68ea bellard
            float32 f;
6072 1bdb68ea bellard
            uint32_t i;
6073 4fa5d772 bellard
        } u;
6074 1bdb68ea bellard
        u.i = qemu_get_be32(f);
6075 4fa5d772 bellard
        env->fpr[i] = u.f;
6076 4fa5d772 bellard
    }
6077 4fa5d772 bellard
6078 4fa5d772 bellard
    qemu_get_betls(f, &env->pc);
6079 4fa5d772 bellard
    qemu_get_betls(f, &env->npc);
6080 4fa5d772 bellard
    qemu_get_betls(f, &env->y);
6081 4fa5d772 bellard
    tmp = qemu_get_be32(f);
6082 4fa5d772 bellard
    env->cwp = 0; /* needed to ensure that the wrapping registers are
6083 4fa5d772 bellard
                     correctly updated */
6084 e80cfcfc bellard
    PUT_PSR(env, tmp);
6085 3475187d bellard
    qemu_get_betls(f, &env->fsr);
6086 3475187d bellard
    qemu_get_betls(f, &env->tbr);
6087 3475187d bellard
#ifndef TARGET_SPARC64
6088 e80cfcfc bellard
    qemu_get_be32s(f, &env->wim);
6089 e80cfcfc bellard
    /* MMU */
6090 e80cfcfc bellard
    for(i = 0; i < 16; i++)
6091 e80cfcfc bellard
        qemu_get_be32s(f, &env->mmuregs[i]);
6092 3475187d bellard
#endif
6093 e80cfcfc bellard
    tlb_flush(env, 1);
6094 e95c8d51 bellard
    return 0;
6095 e95c8d51 bellard
}
6096 b5ff1b31 bellard
6097 b5ff1b31 bellard
#elif defined(TARGET_ARM)
6098 b5ff1b31 bellard
6099 b5ff1b31 bellard
void cpu_save(QEMUFile *f, void *opaque)
6100 b5ff1b31 bellard
{
6101 aa941b94 balrog
    int i;
6102 aa941b94 balrog
    CPUARMState *env = (CPUARMState *)opaque;
6103 aa941b94 balrog
6104 aa941b94 balrog
    for (i = 0; i < 16; i++) {
6105 aa941b94 balrog
        qemu_put_be32(f, env->regs[i]);
6106 aa941b94 balrog
    }
6107 aa941b94 balrog
    qemu_put_be32(f, cpsr_read(env));
6108 aa941b94 balrog
    qemu_put_be32(f, env->spsr);
6109 aa941b94 balrog
    for (i = 0; i < 6; i++) {
6110 aa941b94 balrog
        qemu_put_be32(f, env->banked_spsr[i]);
6111 aa941b94 balrog
        qemu_put_be32(f, env->banked_r13[i]);
6112 aa941b94 balrog
        qemu_put_be32(f, env->banked_r14[i]);
6113 aa941b94 balrog
    }
6114 aa941b94 balrog
    for (i = 0; i < 5; i++) {
6115 aa941b94 balrog
        qemu_put_be32(f, env->usr_regs[i]);
6116 aa941b94 balrog
        qemu_put_be32(f, env->fiq_regs[i]);
6117 aa941b94 balrog
    }
6118 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c0_cpuid);
6119 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c0_cachetype);
6120 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c1_sys);
6121 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c1_coproc);
6122 610c3c8a balrog
    qemu_put_be32(f, env->cp15.c1_xscaleauxcr);
6123 9ee6e8bb pbrook
    qemu_put_be32(f, env->cp15.c2_base0);
6124 9ee6e8bb pbrook
    qemu_put_be32(f, env->cp15.c2_base1);
6125 9ee6e8bb pbrook
    qemu_put_be32(f, env->cp15.c2_mask);
6126 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c2_data);
6127 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c2_insn);
6128 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c3);
6129 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c5_insn);
6130 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c5_data);
6131 aa941b94 balrog
    for (i = 0; i < 8; i++) {
6132 aa941b94 balrog
        qemu_put_be32(f, env->cp15.c6_region[i]);
6133 aa941b94 balrog
    }
6134 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c6_insn);
6135 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c6_data);
6136 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c9_insn);
6137 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c9_data);
6138 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c13_fcse);
6139 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c13_context);
6140 9ee6e8bb pbrook
    qemu_put_be32(f, env->cp15.c13_tls1);
6141 9ee6e8bb pbrook
    qemu_put_be32(f, env->cp15.c13_tls2);
6142 9ee6e8bb pbrook
    qemu_put_be32(f, env->cp15.c13_tls3);
6143 aa941b94 balrog
    qemu_put_be32(f, env->cp15.c15_cpar);
6144 aa941b94 balrog
6145 aa941b94 balrog
    qemu_put_be32(f, env->features);
6146 aa941b94 balrog
6147 aa941b94 balrog
    if (arm_feature(env, ARM_FEATURE_VFP)) {
6148 aa941b94 balrog
        for (i = 0;  i < 16; i++) {
6149 aa941b94 balrog
            CPU_DoubleU u;
6150 aa941b94 balrog
            u.d = env->vfp.regs[i];
6151 aa941b94 balrog
            qemu_put_be32(f, u.l.upper);
6152 aa941b94 balrog
            qemu_put_be32(f, u.l.lower);
6153 aa941b94 balrog
        }
6154 aa941b94 balrog
        for (i = 0; i < 16; i++) {
6155 aa941b94 balrog
            qemu_put_be32(f, env->vfp.xregs[i]);
6156 aa941b94 balrog
        }
6157 aa941b94 balrog
6158 aa941b94 balrog
        /* TODO: Should use proper FPSCR access functions.  */
6159 aa941b94 balrog
        qemu_put_be32(f, env->vfp.vec_len);
6160 aa941b94 balrog
        qemu_put_be32(f, env->vfp.vec_stride);
6161 9ee6e8bb pbrook
6162 9ee6e8bb pbrook
        if (arm_feature(env, ARM_FEATURE_VFP3)) {
6163 9ee6e8bb pbrook
            for (i = 16;  i < 32; i++) {
6164 9ee6e8bb pbrook
                CPU_DoubleU u;
6165 9ee6e8bb pbrook
                u.d = env->vfp.regs[i];
6166 9ee6e8bb pbrook
                qemu_put_be32(f, u.l.upper);
6167 9ee6e8bb pbrook
                qemu_put_be32(f, u.l.lower);
6168 9ee6e8bb pbrook
            }
6169 9ee6e8bb pbrook
        }
6170 aa941b94 balrog
    }
6171 aa941b94 balrog
6172 aa941b94 balrog
    if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
6173 aa941b94 balrog
        for (i = 0; i < 16; i++) {
6174 aa941b94 balrog
            qemu_put_be64(f, env->iwmmxt.regs[i]);
6175 aa941b94 balrog
        }
6176 aa941b94 balrog
        for (i = 0; i < 16; i++) {
6177 aa941b94 balrog
            qemu_put_be32(f, env->iwmmxt.cregs[i]);
6178 aa941b94 balrog
        }
6179 aa941b94 balrog
    }
6180 9ee6e8bb pbrook
6181 9ee6e8bb pbrook
    if (arm_feature(env, ARM_FEATURE_M)) {
6182 9ee6e8bb pbrook
        qemu_put_be32(f, env->v7m.other_sp);
6183 9ee6e8bb pbrook
        qemu_put_be32(f, env->v7m.vecbase);
6184 9ee6e8bb pbrook
        qemu_put_be32(f, env->v7m.basepri);
6185 9ee6e8bb pbrook
        qemu_put_be32(f, env->v7m.control);
6186 9ee6e8bb pbrook
        qemu_put_be32(f, env->v7m.current_sp);
6187 9ee6e8bb pbrook
        qemu_put_be32(f, env->v7m.exception);
6188 9ee6e8bb pbrook
    }
6189 b5ff1b31 bellard
}
6190 b5ff1b31 bellard
6191 b5ff1b31 bellard
int cpu_load(QEMUFile *f, void *opaque, int version_id)
6192 b5ff1b31 bellard
{
6193 aa941b94 balrog
    CPUARMState *env = (CPUARMState *)opaque;
6194 aa941b94 balrog
    int i;
6195 aa941b94 balrog
6196 9ee6e8bb pbrook
    if (version_id != ARM_CPU_SAVE_VERSION)
6197 aa941b94 balrog
        return -EINVAL;
6198 aa941b94 balrog
6199 aa941b94 balrog
    for (i = 0; i < 16; i++) {
6200 aa941b94 balrog
        env->regs[i] = qemu_get_be32(f);
6201 aa941b94 balrog
    }
6202 aa941b94 balrog
    cpsr_write(env, qemu_get_be32(f), 0xffffffff);
6203 aa941b94 balrog
    env->spsr = qemu_get_be32(f);
6204 aa941b94 balrog
    for (i = 0; i < 6; i++) {
6205 aa941b94 balrog
        env->banked_spsr[i] = qemu_get_be32(f);
6206 aa941b94 balrog
        env->banked_r13[i] = qemu_get_be32(f);
6207 aa941b94 balrog
        env->banked_r14[i] = qemu_get_be32(f);
6208 aa941b94 balrog
    }
6209 aa941b94 balrog
    for (i = 0; i < 5; i++) {
6210 aa941b94 balrog
        env->usr_regs[i] = qemu_get_be32(f);
6211 aa941b94 balrog
        env->fiq_regs[i] = qemu_get_be32(f);
6212 aa941b94 balrog
    }
6213 aa941b94 balrog
    env->cp15.c0_cpuid = qemu_get_be32(f);
6214 aa941b94 balrog
    env->cp15.c0_cachetype = qemu_get_be32(f);
6215 aa941b94 balrog
    env->cp15.c1_sys = qemu_get_be32(f);
6216 aa941b94 balrog
    env->cp15.c1_coproc = qemu_get_be32(f);
6217 610c3c8a balrog
    env->cp15.c1_xscaleauxcr = qemu_get_be32(f);
6218 9ee6e8bb pbrook
    env->cp15.c2_base0 = qemu_get_be32(f);
6219 9ee6e8bb pbrook
    env->cp15.c2_base1 = qemu_get_be32(f);
6220 9ee6e8bb pbrook
    env->cp15.c2_mask = qemu_get_be32(f);
6221 aa941b94 balrog
    env->cp15.c2_data = qemu_get_be32(f);
6222 aa941b94 balrog
    env->cp15.c2_insn = qemu_get_be32(f);
6223 aa941b94 balrog
    env->cp15.c3 = qemu_get_be32(f);
6224 aa941b94 balrog
    env->cp15.c5_insn = qemu_get_be32(f);
6225 aa941b94 balrog
    env->cp15.c5_data = qemu_get_be32(f);
6226 aa941b94 balrog
    for (i = 0; i < 8; i++) {
6227 aa941b94 balrog
        env->cp15.c6_region[i] = qemu_get_be32(f);
6228 aa941b94 balrog
    }
6229 aa941b94 balrog
    env->cp15.c6_insn = qemu_get_be32(f);
6230 aa941b94 balrog
    env->cp15.c6_data = qemu_get_be32(f);
6231 aa941b94 balrog
    env->cp15.c9_insn = qemu_get_be32(f);
6232 aa941b94 balrog
    env->cp15.c9_data = qemu_get_be32(f);
6233 aa941b94 balrog
    env->cp15.c13_fcse = qemu_get_be32(f);
6234 aa941b94 balrog
    env->cp15.c13_context = qemu_get_be32(f);
6235 9ee6e8bb pbrook
    env->cp15.c13_tls1 = qemu_get_be32(f);
6236 9ee6e8bb pbrook
    env->cp15.c13_tls2 = qemu_get_be32(f);
6237 9ee6e8bb pbrook
    env->cp15.c13_tls3 = qemu_get_be32(f);
6238 aa941b94 balrog
    env->cp15.c15_cpar = qemu_get_be32(f);
6239 aa941b94 balrog
6240 aa941b94 balrog
    env->features = qemu_get_be32(f);
6241 aa941b94 balrog
6242 aa941b94 balrog
    if (arm_feature(env, ARM_FEATURE_VFP)) {
6243 aa941b94 balrog
        for (i = 0;  i < 16; i++) {
6244 aa941b94 balrog
            CPU_DoubleU u;
6245 aa941b94 balrog
            u.l.upper = qemu_get_be32(f);
6246 aa941b94 balrog
            u.l.lower = qemu_get_be32(f);
6247 aa941b94 balrog
            env->vfp.regs[i] = u.d;
6248 aa941b94 balrog
        }
6249 aa941b94 balrog
        for (i = 0; i < 16; i++) {
6250 aa941b94 balrog
            env->vfp.xregs[i] = qemu_get_be32(f);
6251 aa941b94 balrog
        }
6252 aa941b94 balrog
6253 aa941b94 balrog
        /* TODO: Should use proper FPSCR access functions.  */
6254 aa941b94 balrog
        env->vfp.vec_len = qemu_get_be32(f);
6255 aa941b94 balrog
        env->vfp.vec_stride = qemu_get_be32(f);
6256 9ee6e8bb pbrook
6257 9ee6e8bb pbrook
        if (arm_feature(env, ARM_FEATURE_VFP3)) {
6258 9ee6e8bb pbrook
            for (i = 0;  i < 16; i++) {
6259 9ee6e8bb pbrook
                CPU_DoubleU u;
6260 9ee6e8bb pbrook
                u.l.upper = qemu_get_be32(f);
6261 9ee6e8bb pbrook
                u.l.lower = qemu_get_be32(f);
6262 9ee6e8bb pbrook
                env->vfp.regs[i] = u.d;
6263 9ee6e8bb pbrook
            }
6264 9ee6e8bb pbrook
        }
6265 aa941b94 balrog
    }
6266 aa941b94 balrog
6267 aa941b94 balrog
    if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
6268 aa941b94 balrog
        for (i = 0; i < 16; i++) {
6269 aa941b94 balrog
            env->iwmmxt.regs[i] = qemu_get_be64(f);
6270 aa941b94 balrog
        }
6271 aa941b94 balrog
        for (i = 0; i < 16; i++) {
6272 aa941b94 balrog
            env->iwmmxt.cregs[i] = qemu_get_be32(f);
6273 aa941b94 balrog
        }
6274 aa941b94 balrog
    }
6275 aa941b94 balrog
6276 9ee6e8bb pbrook
    if (arm_feature(env, ARM_FEATURE_M)) {
6277 9ee6e8bb pbrook
        env->v7m.other_sp = qemu_get_be32(f);
6278 9ee6e8bb pbrook
        env->v7m.vecbase = qemu_get_be32(f);
6279 9ee6e8bb pbrook
        env->v7m.basepri = qemu_get_be32(f);
6280 9ee6e8bb pbrook
        env->v7m.control = qemu_get_be32(f);
6281 9ee6e8bb pbrook
        env->v7m.current_sp = qemu_get_be32(f);
6282 9ee6e8bb pbrook
        env->v7m.exception = qemu_get_be32(f);
6283 9ee6e8bb pbrook
    }
6284 9ee6e8bb pbrook
6285 b5ff1b31 bellard
    return 0;
6286 b5ff1b31 bellard
}
6287 b5ff1b31 bellard
6288 8a7ddc38 bellard
#else
6289 8a7ddc38 bellard
6290 8a7ddc38 bellard
#warning No CPU save/restore functions
6291 8a7ddc38 bellard
6292 8a7ddc38 bellard
#endif
6293 8a7ddc38 bellard
6294 8a7ddc38 bellard
/***********************************************************/
6295 8a7ddc38 bellard
/* ram save/restore */
6296 8a7ddc38 bellard
6297 8a7ddc38 bellard
static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
6298 8a7ddc38 bellard
{
6299 8a7ddc38 bellard
    int v;
6300 8a7ddc38 bellard
6301 8a7ddc38 bellard
    v = qemu_get_byte(f);
6302 8a7ddc38 bellard
    switch(v) {
6303 8a7ddc38 bellard
    case 0:
6304 8a7ddc38 bellard
        if (qemu_get_buffer(f, buf, len) != len)
6305 8a7ddc38 bellard
            return -EIO;
6306 8a7ddc38 bellard
        break;
6307 8a7ddc38 bellard
    case 1:
6308 8a7ddc38 bellard
        v = qemu_get_byte(f);
6309 8a7ddc38 bellard
        memset(buf, v, len);
6310 8a7ddc38 bellard
        break;
6311 8a7ddc38 bellard
    default:
6312 8a7ddc38 bellard
        return -EINVAL;
6313 8a7ddc38 bellard
    }
6314 8a7ddc38 bellard
    return 0;
6315 8a7ddc38 bellard
}
6316 8a7ddc38 bellard
6317 c88676f8 bellard
static int ram_load_v1(QEMUFile *f, void *opaque)
6318 c88676f8 bellard
{
6319 c88676f8 bellard
    int i, ret;
6320 c88676f8 bellard
6321 c88676f8 bellard
    if (qemu_get_be32(f) != phys_ram_size)
6322 c88676f8 bellard
        return -EINVAL;
6323 c88676f8 bellard
    for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
6324 c88676f8 bellard
        ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
6325 c88676f8 bellard
        if (ret)
6326 c88676f8 bellard
            return ret;
6327 c88676f8 bellard
    }
6328 c88676f8 bellard
    return 0;
6329 c88676f8 bellard
}
6330 c88676f8 bellard
6331 c88676f8 bellard
#define BDRV_HASH_BLOCK_SIZE 1024
6332 c88676f8 bellard
#define IOBUF_SIZE 4096
6333 c88676f8 bellard
#define RAM_CBLOCK_MAGIC 0xfabe
6334 c88676f8 bellard
6335 c88676f8 bellard
typedef struct RamCompressState {
6336 c88676f8 bellard
    z_stream zstream;
6337 c88676f8 bellard
    QEMUFile *f;
6338 c88676f8 bellard
    uint8_t buf[IOBUF_SIZE];
6339 c88676f8 bellard
} RamCompressState;
6340 c88676f8 bellard
6341 c88676f8 bellard
static int ram_compress_open(RamCompressState *s, QEMUFile *f)
6342 c88676f8 bellard
{
6343 c88676f8 bellard
    int ret;
6344 c88676f8 bellard
    memset(s, 0, sizeof(*s));
6345 c88676f8 bellard
    s->f = f;
6346 c88676f8 bellard
    ret = deflateInit2(&s->zstream, 1,
6347 5fafdf24 ths
                       Z_DEFLATED, 15,
6348 c88676f8 bellard
                       9, Z_DEFAULT_STRATEGY);
6349 c88676f8 bellard
    if (ret != Z_OK)
6350 c88676f8 bellard
        return -1;
6351 c88676f8 bellard
    s->zstream.avail_out = IOBUF_SIZE;
6352 c88676f8 bellard
    s->zstream.next_out = s->buf;
6353 c88676f8 bellard
    return 0;
6354 c88676f8 bellard
}
6355 c88676f8 bellard
6356 c88676f8 bellard
static void ram_put_cblock(RamCompressState *s, const uint8_t *buf, int len)
6357 c88676f8 bellard
{
6358 c88676f8 bellard
    qemu_put_be16(s->f, RAM_CBLOCK_MAGIC);
6359 c88676f8 bellard
    qemu_put_be16(s->f, len);
6360 c88676f8 bellard
    qemu_put_buffer(s->f, buf, len);
6361 c88676f8 bellard
}
6362 c88676f8 bellard
6363 c88676f8 bellard
static int ram_compress_buf(RamCompressState *s, const uint8_t *buf, int len)
6364 c88676f8 bellard
{
6365 c88676f8 bellard
    int ret;
6366 c88676f8 bellard
6367 c88676f8 bellard
    s->zstream.avail_in = len;
6368 c88676f8 bellard
    s->zstream.next_in = (uint8_t *)buf;
6369 c88676f8 bellard
    while (s->zstream.avail_in > 0) {
6370 c88676f8 bellard
        ret = deflate(&s->zstream, Z_NO_FLUSH);
6371 c88676f8 bellard
        if (ret != Z_OK)
6372 c88676f8 bellard
            return -1;
6373 c88676f8 bellard
        if (s->zstream.avail_out == 0) {
6374 c88676f8 bellard
            ram_put_cblock(s, s->buf, IOBUF_SIZE);
6375 c88676f8 bellard
            s->zstream.avail_out = IOBUF_SIZE;
6376 c88676f8 bellard
            s->zstream.next_out = s->buf;
6377 c88676f8 bellard
        }
6378 c88676f8 bellard
    }
6379 c88676f8 bellard
    return 0;
6380 c88676f8 bellard
}
6381 c88676f8 bellard
6382 c88676f8 bellard
static void ram_compress_close(RamCompressState *s)
6383 c88676f8 bellard
{
6384 c88676f8 bellard
    int len, ret;
6385 c88676f8 bellard
6386 c88676f8 bellard
    /* compress last bytes */
6387 c88676f8 bellard
    for(;;) {
6388 c88676f8 bellard
        ret = deflate(&s->zstream, Z_FINISH);
6389 c88676f8 bellard
        if (ret == Z_OK || ret == Z_STREAM_END) {
6390 c88676f8 bellard
            len = IOBUF_SIZE - s->zstream.avail_out;
6391 c88676f8 bellard
            if (len > 0) {
6392 c88676f8 bellard
                ram_put_cblock(s, s->buf, len);
6393 c88676f8 bellard
            }
6394 c88676f8 bellard
            s->zstream.avail_out = IOBUF_SIZE;
6395 c88676f8 bellard
            s->zstream.next_out = s->buf;
6396 c88676f8 bellard
            if (ret == Z_STREAM_END)
6397 c88676f8 bellard
                break;
6398 c88676f8 bellard
        } else {
6399 c88676f8 bellard
            goto fail;
6400 c88676f8 bellard
        }
6401 c88676f8 bellard
    }
6402 c88676f8 bellard
fail:
6403 c88676f8 bellard
    deflateEnd(&s->zstream);
6404 c88676f8 bellard
}
6405 c88676f8 bellard
6406 c88676f8 bellard
typedef struct RamDecompressState {
6407 c88676f8 bellard
    z_stream zstream;
6408 c88676f8 bellard
    QEMUFile *f;
6409 c88676f8 bellard
    uint8_t buf[IOBUF_SIZE];
6410 c88676f8 bellard
} RamDecompressState;
6411 c88676f8 bellard
6412 c88676f8 bellard
static int ram_decompress_open(RamDecompressState *s, QEMUFile *f)
6413 c88676f8 bellard
{
6414 c88676f8 bellard
    int ret;
6415 c88676f8 bellard
    memset(s, 0, sizeof(*s));
6416 c88676f8 bellard
    s->f = f;
6417 c88676f8 bellard
    ret = inflateInit(&s->zstream);
6418 c88676f8 bellard
    if (ret != Z_OK)
6419 c88676f8 bellard
        return -1;
6420 c88676f8 bellard
    return 0;
6421 c88676f8 bellard
}
6422 c88676f8 bellard
6423 c88676f8 bellard
static int ram_decompress_buf(RamDecompressState *s, uint8_t *buf, int len)
6424 c88676f8 bellard
{
6425 c88676f8 bellard
    int ret, clen;
6426 c88676f8 bellard
6427 c88676f8 bellard
    s->zstream.avail_out = len;
6428 c88676f8 bellard
    s->zstream.next_out = buf;
6429 c88676f8 bellard
    while (s->zstream.avail_out > 0) {
6430 c88676f8 bellard
        if (s->zstream.avail_in == 0) {
6431 c88676f8 bellard
            if (qemu_get_be16(s->f) != RAM_CBLOCK_MAGIC)
6432 c88676f8 bellard
                return -1;
6433 c88676f8 bellard
            clen = qemu_get_be16(s->f);
6434 c88676f8 bellard
            if (clen > IOBUF_SIZE)
6435 c88676f8 bellard
                return -1;
6436 c88676f8 bellard
            qemu_get_buffer(s->f, s->buf, clen);
6437 c88676f8 bellard
            s->zstream.avail_in = clen;
6438 c88676f8 bellard
            s->zstream.next_in = s->buf;
6439 c88676f8 bellard
        }
6440 c88676f8 bellard
        ret = inflate(&s->zstream, Z_PARTIAL_FLUSH);
6441 c88676f8 bellard
        if (ret != Z_OK && ret != Z_STREAM_END) {
6442 c88676f8 bellard
            return -1;
6443 c88676f8 bellard
        }
6444 c88676f8 bellard
    }
6445 c88676f8 bellard
    return 0;
6446 c88676f8 bellard
}
6447 c88676f8 bellard
6448 c88676f8 bellard
static void ram_decompress_close(RamDecompressState *s)
6449 c88676f8 bellard
{
6450 c88676f8 bellard
    inflateEnd(&s->zstream);
6451 c88676f8 bellard
}
6452 c88676f8 bellard
6453 8a7ddc38 bellard
static void ram_save(QEMUFile *f, void *opaque)
6454 8a7ddc38 bellard
{
6455 8a7ddc38 bellard
    int i;
6456 c88676f8 bellard
    RamCompressState s1, *s = &s1;
6457 c88676f8 bellard
    uint8_t buf[10];
6458 3b46e624 ths
6459 8a7ddc38 bellard
    qemu_put_be32(f, phys_ram_size);
6460 c88676f8 bellard
    if (ram_compress_open(s, f) < 0)
6461 c88676f8 bellard
        return;
6462 c88676f8 bellard
    for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
6463 c88676f8 bellard
#if 0
6464 c88676f8 bellard
        if (tight_savevm_enabled) {
6465 c88676f8 bellard
            int64_t sector_num;
6466 c88676f8 bellard
            int j;
6467 c88676f8 bellard

6468 c88676f8 bellard
            /* find if the memory block is available on a virtual
6469 c88676f8 bellard
               block device */
6470 c88676f8 bellard
            sector_num = -1;
6471 c88676f8 bellard
            for(j = 0; j < MAX_DISKS; j++) {
6472 c88676f8 bellard
                if (bs_table[j]) {
6473 5fafdf24 ths
                    sector_num = bdrv_hash_find(bs_table[j],
6474 c88676f8 bellard
                                                phys_ram_base + i, BDRV_HASH_BLOCK_SIZE);
6475 c88676f8 bellard
                    if (sector_num >= 0)
6476 c88676f8 bellard
                        break;
6477 c88676f8 bellard
                }
6478 c88676f8 bellard
            }
6479 c88676f8 bellard
            if (j == MAX_DISKS)
6480 c88676f8 bellard
                goto normal_compress;
6481 c88676f8 bellard
            buf[0] = 1;
6482 c88676f8 bellard
            buf[1] = j;
6483 c88676f8 bellard
            cpu_to_be64wu((uint64_t *)(buf + 2), sector_num);
6484 c88676f8 bellard
            ram_compress_buf(s, buf, 10);
6485 5fafdf24 ths
        } else
6486 c88676f8 bellard
#endif
6487 c88676f8 bellard
        {
6488 c88676f8 bellard
            //        normal_compress:
6489 c88676f8 bellard
            buf[0] = 0;
6490 c88676f8 bellard
            ram_compress_buf(s, buf, 1);
6491 c88676f8 bellard
            ram_compress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE);
6492 c88676f8 bellard
        }
6493 8a7ddc38 bellard
    }
6494 c88676f8 bellard
    ram_compress_close(s);
6495 8a7ddc38 bellard
}
6496 8a7ddc38 bellard
6497 8a7ddc38 bellard
static int ram_load(QEMUFile *f, void *opaque, int version_id)
6498 8a7ddc38 bellard
{
6499 c88676f8 bellard
    RamDecompressState s1, *s = &s1;
6500 c88676f8 bellard
    uint8_t buf[10];
6501 c88676f8 bellard
    int i;
6502 8a7ddc38 bellard
6503 c88676f8 bellard
    if (version_id == 1)
6504 c88676f8 bellard
        return ram_load_v1(f, opaque);
6505 c88676f8 bellard
    if (version_id != 2)
6506 8a7ddc38 bellard
        return -EINVAL;
6507 8a7ddc38 bellard
    if (qemu_get_be32(f) != phys_ram_size)
6508 8a7ddc38 bellard
        return -EINVAL;
6509 c88676f8 bellard
    if (ram_decompress_open(s, f) < 0)
6510 c88676f8 bellard
        return -EINVAL;
6511 c88676f8 bellard
    for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
6512 c88676f8 bellard
        if (ram_decompress_buf(s, buf, 1) < 0) {
6513 c88676f8 bellard
            fprintf(stderr, "Error while reading ram block header\n");
6514 c88676f8 bellard
            goto error;
6515 c88676f8 bellard
        }
6516 c88676f8 bellard
        if (buf[0] == 0) {
6517 c88676f8 bellard
            if (ram_decompress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE) < 0) {
6518 c88676f8 bellard
                fprintf(stderr, "Error while reading ram block address=0x%08x", i);
6519 c88676f8 bellard
                goto error;
6520 c88676f8 bellard
            }
6521 5fafdf24 ths
        } else
6522 c88676f8 bellard
#if 0
6523 c88676f8 bellard
        if (buf[0] == 1) {
6524 c88676f8 bellard
            int bs_index;
6525 c88676f8 bellard
            int64_t sector_num;
6526 c88676f8 bellard

6527 c88676f8 bellard
            ram_decompress_buf(s, buf + 1, 9);
6528 c88676f8 bellard
            bs_index = buf[1];
6529 c88676f8 bellard
            sector_num = be64_to_cpupu((const uint64_t *)(buf + 2));
6530 c88676f8 bellard
            if (bs_index >= MAX_DISKS || bs_table[bs_index] == NULL) {
6531 c88676f8 bellard
                fprintf(stderr, "Invalid block device index %d\n", bs_index);
6532 c88676f8 bellard
                goto error;
6533 c88676f8 bellard
            }
6534 5fafdf24 ths
            if (bdrv_read(bs_table[bs_index], sector_num, phys_ram_base + i,
6535 c88676f8 bellard
                          BDRV_HASH_BLOCK_SIZE / 512) < 0) {
6536 5fafdf24 ths
                fprintf(stderr, "Error while reading sector %d:%" PRId64 "\n",
6537 c88676f8 bellard
                        bs_index, sector_num);
6538 c88676f8 bellard
                goto error;
6539 c88676f8 bellard
            }
6540 5fafdf24 ths
        } else
6541 c88676f8 bellard
#endif
6542 c88676f8 bellard
        {
6543 c88676f8 bellard
        error:
6544 c88676f8 bellard
            printf("Error block header\n");
6545 c88676f8 bellard
            return -EINVAL;
6546 c88676f8 bellard
        }
6547 8a7ddc38 bellard
    }
6548 c88676f8 bellard
    ram_decompress_close(s);
6549 8a7ddc38 bellard
    return 0;
6550 8a7ddc38 bellard
}
6551 8a7ddc38 bellard
6552 8a7ddc38 bellard
/***********************************************************/
6553 83f64091 bellard
/* bottom halves (can be seen as timers which expire ASAP) */
6554 83f64091 bellard
6555 83f64091 bellard
struct QEMUBH {
6556 83f64091 bellard
    QEMUBHFunc *cb;
6557 83f64091 bellard
    void *opaque;
6558 83f64091 bellard
    int scheduled;
6559 83f64091 bellard
    QEMUBH *next;
6560 83f64091 bellard
};
6561 83f64091 bellard
6562 83f64091 bellard
static QEMUBH *first_bh = NULL;
6563 83f64091 bellard
6564 83f64091 bellard
QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
6565 83f64091 bellard
{
6566 83f64091 bellard
    QEMUBH *bh;
6567 83f64091 bellard
    bh = qemu_mallocz(sizeof(QEMUBH));
6568 83f64091 bellard
    if (!bh)
6569 83f64091 bellard
        return NULL;
6570 83f64091 bellard
    bh->cb = cb;
6571 83f64091 bellard
    bh->opaque = opaque;
6572 83f64091 bellard
    return bh;
6573 83f64091 bellard
}
6574 83f64091 bellard
6575 6eb5733a bellard
int qemu_bh_poll(void)
6576 83f64091 bellard
{
6577 83f64091 bellard
    QEMUBH *bh, **pbh;
6578 6eb5733a bellard
    int ret;
6579 83f64091 bellard
6580 6eb5733a bellard
    ret = 0;
6581 83f64091 bellard
    for(;;) {
6582 83f64091 bellard
        pbh = &first_bh;
6583 83f64091 bellard
        bh = *pbh;
6584 83f64091 bellard
        if (!bh)
6585 83f64091 bellard
            break;
6586 6eb5733a bellard
        ret = 1;
6587 83f64091 bellard
        *pbh = bh->next;
6588 83f64091 bellard
        bh->scheduled = 0;
6589 83f64091 bellard
        bh->cb(bh->opaque);
6590 83f64091 bellard
    }
6591 6eb5733a bellard
    return ret;
6592 83f64091 bellard
}
6593 83f64091 bellard
6594 83f64091 bellard
void qemu_bh_schedule(QEMUBH *bh)
6595 83f64091 bellard
{
6596 83f64091 bellard
    CPUState *env = cpu_single_env;
6597 83f64091 bellard
    if (bh->scheduled)
6598 83f64091 bellard
        return;
6599 83f64091 bellard
    bh->scheduled = 1;
6600 83f64091 bellard
    bh->next = first_bh;
6601 83f64091 bellard
    first_bh = bh;
6602 83f64091 bellard
6603 83f64091 bellard
    /* stop the currently executing CPU to execute the BH ASAP */
6604 83f64091 bellard
    if (env) {
6605 83f64091 bellard
        cpu_interrupt(env, CPU_INTERRUPT_EXIT);
6606 83f64091 bellard
    }
6607 83f64091 bellard
}
6608 83f64091 bellard
6609 83f64091 bellard
void qemu_bh_cancel(QEMUBH *bh)
6610 83f64091 bellard
{
6611 83f64091 bellard
    QEMUBH **pbh;
6612 83f64091 bellard
    if (bh->scheduled) {
6613 83f64091 bellard
        pbh = &first_bh;
6614 83f64091 bellard
        while (*pbh != bh)
6615 83f64091 bellard
            pbh = &(*pbh)->next;
6616 83f64091 bellard
        *pbh = bh->next;
6617 83f64091 bellard
        bh->scheduled = 0;
6618 83f64091 bellard
    }
6619 83f64091 bellard
}
6620 83f64091 bellard
6621 83f64091 bellard
void qemu_bh_delete(QEMUBH *bh)
6622 83f64091 bellard
{
6623 83f64091 bellard
    qemu_bh_cancel(bh);
6624 83f64091 bellard
    qemu_free(bh);
6625 83f64091 bellard
}
6626 83f64091 bellard
6627 83f64091 bellard
/***********************************************************/
6628 cc1daa40 bellard
/* machine registration */
6629 cc1daa40 bellard
6630 cc1daa40 bellard
QEMUMachine *first_machine = NULL;
6631 cc1daa40 bellard
6632 cc1daa40 bellard
int qemu_register_machine(QEMUMachine *m)
6633 cc1daa40 bellard
{
6634 cc1daa40 bellard
    QEMUMachine **pm;
6635 cc1daa40 bellard
    pm = &first_machine;
6636 cc1daa40 bellard
    while (*pm != NULL)
6637 cc1daa40 bellard
        pm = &(*pm)->next;
6638 cc1daa40 bellard
    m->next = NULL;
6639 cc1daa40 bellard
    *pm = m;
6640 cc1daa40 bellard
    return 0;
6641 cc1daa40 bellard
}
6642 cc1daa40 bellard
6643 cc1daa40 bellard
QEMUMachine *find_machine(const char *name)
6644 cc1daa40 bellard
{
6645 cc1daa40 bellard
    QEMUMachine *m;
6646 cc1daa40 bellard
6647 cc1daa40 bellard
    for(m = first_machine; m != NULL; m = m->next) {
6648 cc1daa40 bellard
        if (!strcmp(m->name, name))
6649 cc1daa40 bellard
            return m;
6650 cc1daa40 bellard
    }
6651 cc1daa40 bellard
    return NULL;
6652 cc1daa40 bellard
}
6653 cc1daa40 bellard
6654 cc1daa40 bellard
/***********************************************************/
6655 8a7ddc38 bellard
/* main execution loop */
6656 8a7ddc38 bellard
6657 8a7ddc38 bellard
void gui_update(void *opaque)
6658 8a7ddc38 bellard
{
6659 740733bb ths
    DisplayState *ds = opaque;
6660 740733bb ths
    ds->dpy_refresh(ds);
6661 740733bb ths
    qemu_mod_timer(ds->gui_timer, GUI_REFRESH_INTERVAL + qemu_get_clock(rt_clock));
6662 8a7ddc38 bellard
}
6663 8a7ddc38 bellard
6664 0bd48850 bellard
struct vm_change_state_entry {
6665 0bd48850 bellard
    VMChangeStateHandler *cb;
6666 0bd48850 bellard
    void *opaque;
6667 0bd48850 bellard
    LIST_ENTRY (vm_change_state_entry) entries;
6668 0bd48850 bellard
};
6669 0bd48850 bellard
6670 0bd48850 bellard
static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
6671 0bd48850 bellard
6672 0bd48850 bellard
VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
6673 0bd48850 bellard
                                                     void *opaque)
6674 0bd48850 bellard
{
6675 0bd48850 bellard
    VMChangeStateEntry *e;
6676 0bd48850 bellard
6677 0bd48850 bellard
    e = qemu_mallocz(sizeof (*e));
6678 0bd48850 bellard
    if (!e)
6679 0bd48850 bellard
        return NULL;
6680 0bd48850 bellard
6681 0bd48850 bellard
    e->cb = cb;
6682 0bd48850 bellard
    e->opaque = opaque;
6683 0bd48850 bellard
    LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
6684 0bd48850 bellard
    return e;
6685 0bd48850 bellard
}
6686 0bd48850 bellard
6687 0bd48850 bellard
void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
6688 0bd48850 bellard
{
6689 0bd48850 bellard
    LIST_REMOVE (e, entries);
6690 0bd48850 bellard
    qemu_free (e);
6691 0bd48850 bellard
}
6692 0bd48850 bellard
6693 0bd48850 bellard
static void vm_state_notify(int running)
6694 0bd48850 bellard
{
6695 0bd48850 bellard
    VMChangeStateEntry *e;
6696 0bd48850 bellard
6697 0bd48850 bellard
    for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
6698 0bd48850 bellard
        e->cb(e->opaque, running);
6699 0bd48850 bellard
    }
6700 0bd48850 bellard
}
6701 0bd48850 bellard
6702 8a7ddc38 bellard
/* XXX: support several handlers */
6703 0bd48850 bellard
static VMStopHandler *vm_stop_cb;
6704 0bd48850 bellard
static void *vm_stop_opaque;
6705 8a7ddc38 bellard
6706 8a7ddc38 bellard
int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
6707 8a7ddc38 bellard
{
6708 8a7ddc38 bellard
    vm_stop_cb = cb;
6709 8a7ddc38 bellard
    vm_stop_opaque = opaque;
6710 8a7ddc38 bellard
    return 0;
6711 8a7ddc38 bellard
}
6712 8a7ddc38 bellard
6713 8a7ddc38 bellard
void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
6714 8a7ddc38 bellard
{
6715 8a7ddc38 bellard
    vm_stop_cb = NULL;
6716 8a7ddc38 bellard
}
6717 8a7ddc38 bellard
6718 8a7ddc38 bellard
void vm_start(void)
6719 8a7ddc38 bellard
{
6720 8a7ddc38 bellard
    if (!vm_running) {
6721 8a7ddc38 bellard
        cpu_enable_ticks();
6722 8a7ddc38 bellard
        vm_running = 1;
6723 0bd48850 bellard
        vm_state_notify(1);
6724 efe75411 ths
        qemu_rearm_alarm_timer(alarm_timer);
6725 8a7ddc38 bellard
    }
6726 8a7ddc38 bellard
}
6727 8a7ddc38 bellard
6728 5fafdf24 ths
void vm_stop(int reason)
6729 8a7ddc38 bellard
{
6730 8a7ddc38 bellard
    if (vm_running) {
6731 8a7ddc38 bellard
        cpu_disable_ticks();
6732 8a7ddc38 bellard
        vm_running = 0;
6733 8a7ddc38 bellard
        if (reason != 0) {
6734 8a7ddc38 bellard
            if (vm_stop_cb) {
6735 8a7ddc38 bellard
                vm_stop_cb(vm_stop_opaque, reason);
6736 8a7ddc38 bellard
            }
6737 34865134 bellard
        }
6738 0bd48850 bellard
        vm_state_notify(0);
6739 8a7ddc38 bellard
    }
6740 8a7ddc38 bellard
}
6741 8a7ddc38 bellard
6742 bb0c6722 bellard
/* reset/shutdown handler */
6743 bb0c6722 bellard
6744 bb0c6722 bellard
typedef struct QEMUResetEntry {
6745 bb0c6722 bellard
    QEMUResetHandler *func;
6746 bb0c6722 bellard
    void *opaque;
6747 bb0c6722 bellard
    struct QEMUResetEntry *next;
6748 bb0c6722 bellard
} QEMUResetEntry;
6749 bb0c6722 bellard
6750 bb0c6722 bellard
static QEMUResetEntry *first_reset_entry;
6751 bb0c6722 bellard
static int reset_requested;
6752 bb0c6722 bellard
static int shutdown_requested;
6753 3475187d bellard
static int powerdown_requested;
6754 bb0c6722 bellard
6755 bb0c6722 bellard
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
6756 bb0c6722 bellard
{
6757 bb0c6722 bellard
    QEMUResetEntry **pre, *re;
6758 bb0c6722 bellard
6759 bb0c6722 bellard
    pre = &first_reset_entry;
6760 bb0c6722 bellard
    while (*pre != NULL)
6761 bb0c6722 bellard
        pre = &(*pre)->next;
6762 bb0c6722 bellard
    re = qemu_mallocz(sizeof(QEMUResetEntry));
6763 bb0c6722 bellard
    re->func = func;
6764 bb0c6722 bellard
    re->opaque = opaque;
6765 bb0c6722 bellard
    re->next = NULL;
6766 bb0c6722 bellard
    *pre = re;
6767 bb0c6722 bellard
}
6768 bb0c6722 bellard
6769 52f61fde ths
static void qemu_system_reset(void)
6770 bb0c6722 bellard
{
6771 bb0c6722 bellard
    QEMUResetEntry *re;
6772 bb0c6722 bellard
6773 bb0c6722 bellard
    /* reset all devices */
6774 bb0c6722 bellard
    for(re = first_reset_entry; re != NULL; re = re->next) {
6775 bb0c6722 bellard
        re->func(re->opaque);
6776 bb0c6722 bellard
    }
6777 bb0c6722 bellard
}
6778 bb0c6722 bellard
6779 bb0c6722 bellard
void qemu_system_reset_request(void)
6780 bb0c6722 bellard
{
6781 d1beab82 bellard
    if (no_reboot) {
6782 d1beab82 bellard
        shutdown_requested = 1;
6783 d1beab82 bellard
    } else {
6784 d1beab82 bellard
        reset_requested = 1;
6785 d1beab82 bellard
    }
6786 6a00d601 bellard
    if (cpu_single_env)
6787 6a00d601 bellard
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
6788 bb0c6722 bellard
}
6789 bb0c6722 bellard
6790 bb0c6722 bellard
void qemu_system_shutdown_request(void)
6791 bb0c6722 bellard
{
6792 bb0c6722 bellard
    shutdown_requested = 1;
6793 6a00d601 bellard
    if (cpu_single_env)
6794 6a00d601 bellard
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
6795 bb0c6722 bellard
}
6796 bb0c6722 bellard
6797 3475187d bellard
void qemu_system_powerdown_request(void)
6798 3475187d bellard
{
6799 3475187d bellard
    powerdown_requested = 1;
6800 6a00d601 bellard
    if (cpu_single_env)
6801 6a00d601 bellard
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
6802 bb0c6722 bellard
}
6803 bb0c6722 bellard
6804 5905b2e5 bellard
void main_loop_wait(int timeout)
6805 8a7ddc38 bellard
{
6806 cafffd40 ths
    IOHandlerRecord *ioh;
6807 e035649e bellard
    fd_set rfds, wfds, xfds;
6808 877cf882 ths
    int ret, nfds;
6809 877cf882 ths
#ifdef _WIN32
6810 877cf882 ths
    int ret2, i;
6811 877cf882 ths
#endif
6812 fd1dff4b bellard
    struct timeval tv;
6813 f331110f bellard
    PollingEntry *pe;
6814 f331110f bellard
6815 c4b1fcc0 bellard
6816 f331110f bellard
    /* XXX: need to suppress polling by better using win32 events */
6817 f331110f bellard
    ret = 0;
6818 f331110f bellard
    for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
6819 f331110f bellard
        ret |= pe->func(pe->opaque);
6820 f331110f bellard
    }
6821 38e205a2 bellard
#ifdef _WIN32
6822 e6b1e558 ths
    if (ret == 0) {
6823 a18e524a bellard
        int err;
6824 a18e524a bellard
        WaitObjects *w = &wait_objects;
6825 3b46e624 ths
6826 a18e524a bellard
        ret = WaitForMultipleObjects(w->num, w->events, FALSE, timeout);
6827 a18e524a bellard
        if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
6828 a18e524a bellard
            if (w->func[ret - WAIT_OBJECT_0])
6829 a18e524a bellard
                w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
6830 3b46e624 ths
6831 5fafdf24 ths
            /* Check for additional signaled events */
6832 e6b1e558 ths
            for(i = (ret - WAIT_OBJECT_0 + 1); i < w->num; i++) {
6833 3b46e624 ths
6834 e6b1e558 ths
                /* Check if event is signaled */
6835 e6b1e558 ths
                ret2 = WaitForSingleObject(w->events[i], 0);
6836 e6b1e558 ths
                if(ret2 == WAIT_OBJECT_0) {
6837 e6b1e558 ths
                    if (w->func[i])
6838 e6b1e558 ths
                        w->func[i](w->opaque[i]);
6839 e6b1e558 ths
                } else if (ret2 == WAIT_TIMEOUT) {
6840 e6b1e558 ths
                } else {
6841 e6b1e558 ths
                    err = GetLastError();
6842 e6b1e558 ths
                    fprintf(stderr, "WaitForSingleObject error %d %d\n", i, err);
6843 3b46e624 ths
                }
6844 3b46e624 ths
            }
6845 a18e524a bellard
        } else if (ret == WAIT_TIMEOUT) {
6846 a18e524a bellard
        } else {
6847 a18e524a bellard
            err = GetLastError();
6848 e6b1e558 ths
            fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
6849 a18e524a bellard
        }
6850 f331110f bellard
    }
6851 fd1dff4b bellard
#endif
6852 fd1dff4b bellard
    /* poll any events */
6853 fd1dff4b bellard
    /* XXX: separate device handlers from system ones */
6854 fd1dff4b bellard
    nfds = -1;
6855 fd1dff4b bellard
    FD_ZERO(&rfds);
6856 fd1dff4b bellard
    FD_ZERO(&wfds);
6857 e035649e bellard
    FD_ZERO(&xfds);
6858 fd1dff4b bellard
    for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
6859 cafffd40 ths
        if (ioh->deleted)
6860 cafffd40 ths
            continue;
6861 fd1dff4b bellard
        if (ioh->fd_read &&
6862 fd1dff4b bellard
            (!ioh->fd_read_poll ||
6863 fd1dff4b bellard
             ioh->fd_read_poll(ioh->opaque) != 0)) {
6864 fd1dff4b bellard
            FD_SET(ioh->fd, &rfds);
6865 fd1dff4b bellard
            if (ioh->fd > nfds)
6866 fd1dff4b bellard
                nfds = ioh->fd;
6867 fd1dff4b bellard
        }
6868 fd1dff4b bellard
        if (ioh->fd_write) {
6869 fd1dff4b bellard
            FD_SET(ioh->fd, &wfds);
6870 fd1dff4b bellard
            if (ioh->fd > nfds)
6871 fd1dff4b bellard
                nfds = ioh->fd;
6872 fd1dff4b bellard
        }
6873 fd1dff4b bellard
    }
6874 3b46e624 ths
6875 fd1dff4b bellard
    tv.tv_sec = 0;
6876 fd1dff4b bellard
#ifdef _WIN32
6877 fd1dff4b bellard
    tv.tv_usec = 0;
6878 38e205a2 bellard
#else
6879 fd1dff4b bellard
    tv.tv_usec = timeout * 1000;
6880 fd1dff4b bellard
#endif
6881 e035649e bellard
#if defined(CONFIG_SLIRP)
6882 e035649e bellard
    if (slirp_inited) {
6883 e035649e bellard
        slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
6884 e035649e bellard
    }
6885 e035649e bellard
#endif
6886 e035649e bellard
    ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
6887 fd1dff4b bellard
    if (ret > 0) {
6888 cafffd40 ths
        IOHandlerRecord **pioh;
6889 cafffd40 ths
6890 cafffd40 ths
        for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
6891 6ab43fdc ths
            if (!ioh->deleted && ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) {
6892 fd1dff4b bellard
                ioh->fd_read(ioh->opaque);
6893 7c9d8e07 bellard
            }
6894 6ab43fdc ths
            if (!ioh->deleted && ioh->fd_write && FD_ISSET(ioh->fd, &wfds)) {
6895 fd1dff4b bellard
                ioh->fd_write(ioh->opaque);
6896 c4b1fcc0 bellard
            }
6897 b4608c04 bellard
        }
6898 cafffd40 ths
6899 cafffd40 ths
        /* remove deleted IO handlers */
6900 cafffd40 ths
        pioh = &first_io_handler;
6901 cafffd40 ths
        while (*pioh) {
6902 cafffd40 ths
            ioh = *pioh;
6903 cafffd40 ths
            if (ioh->deleted) {
6904 cafffd40 ths
                *pioh = ioh->next;
6905 cafffd40 ths
                qemu_free(ioh);
6906 5fafdf24 ths
            } else
6907 cafffd40 ths
                pioh = &ioh->next;
6908 cafffd40 ths
        }
6909 fd1dff4b bellard
    }
6910 c20709aa bellard
#if defined(CONFIG_SLIRP)
6911 fd1dff4b bellard
    if (slirp_inited) {
6912 e035649e bellard
        if (ret < 0) {
6913 e035649e bellard
            FD_ZERO(&rfds);
6914 e035649e bellard
            FD_ZERO(&wfds);
6915 e035649e bellard
            FD_ZERO(&xfds);
6916 c20709aa bellard
        }
6917 e035649e bellard
        slirp_select_poll(&rfds, &wfds, &xfds);
6918 fd1dff4b bellard
    }
6919 c20709aa bellard
#endif
6920 83f64091 bellard
    qemu_aio_poll();
6921 c20709aa bellard
6922 fd1dff4b bellard
    if (vm_running) {
6923 5fafdf24 ths
        qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
6924 fd1dff4b bellard
                        qemu_get_clock(vm_clock));
6925 fd1dff4b bellard
        /* run dma transfers, if any */
6926 fd1dff4b bellard
        DMA_run();
6927 fd1dff4b bellard
    }
6928 423f0742 pbrook
6929 fd1dff4b bellard
    /* real time timers */
6930 5fafdf24 ths
    qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
6931 fd1dff4b bellard
                    qemu_get_clock(rt_clock));
6932 423f0742 pbrook
6933 423f0742 pbrook
    /* Check bottom-halves last in case any of the earlier events triggered
6934 423f0742 pbrook
       them.  */
6935 423f0742 pbrook
    qemu_bh_poll();
6936 3b46e624 ths
6937 5905b2e5 bellard
}
6938 5905b2e5 bellard
6939 6a00d601 bellard
static CPUState *cur_cpu;
6940 6a00d601 bellard
6941 5905b2e5 bellard
int main_loop(void)
6942 5905b2e5 bellard
{
6943 5905b2e5 bellard
    int ret, timeout;
6944 89bfc105 bellard
#ifdef CONFIG_PROFILER
6945 89bfc105 bellard
    int64_t ti;
6946 89bfc105 bellard
#endif
6947 6a00d601 bellard
    CPUState *env;
6948 5905b2e5 bellard
6949 6a00d601 bellard
    cur_cpu = first_cpu;
6950 5905b2e5 bellard
    for(;;) {
6951 5905b2e5 bellard
        if (vm_running) {
6952 15a76449 bellard
6953 15a76449 bellard
            env = cur_cpu;
6954 15a76449 bellard
            for(;;) {
6955 15a76449 bellard
                /* get next cpu */
6956 15a76449 bellard
                env = env->next_cpu;
6957 15a76449 bellard
                if (!env)
6958 15a76449 bellard
                    env = first_cpu;
6959 89bfc105 bellard
#ifdef CONFIG_PROFILER
6960 89bfc105 bellard
                ti = profile_getclock();
6961 89bfc105 bellard
#endif
6962 6a00d601 bellard
                ret = cpu_exec(env);
6963 89bfc105 bellard
#ifdef CONFIG_PROFILER
6964 89bfc105 bellard
                qemu_time += profile_getclock() - ti;
6965 89bfc105 bellard
#endif
6966 bd967e05 pbrook
                if (ret == EXCP_HLT) {
6967 bd967e05 pbrook
                    /* Give the next CPU a chance to run.  */
6968 bd967e05 pbrook
                    cur_cpu = env;
6969 bd967e05 pbrook
                    continue;
6970 bd967e05 pbrook
                }
6971 15a76449 bellard
                if (ret != EXCP_HALTED)
6972 15a76449 bellard
                    break;
6973 15a76449 bellard
                /* all CPUs are halted ? */
6974 bd967e05 pbrook
                if (env == cur_cpu)
6975 15a76449 bellard
                    break;
6976 15a76449 bellard
            }
6977 15a76449 bellard
            cur_cpu = env;
6978 15a76449 bellard
6979 5905b2e5 bellard
            if (shutdown_requested) {
6980 3475187d bellard
                ret = EXCP_INTERRUPT;
6981 5905b2e5 bellard
                break;
6982 5905b2e5 bellard
            }
6983 5905b2e5 bellard
            if (reset_requested) {
6984 5905b2e5 bellard
                reset_requested = 0;
6985 5905b2e5 bellard
                qemu_system_reset();
6986 3475187d bellard
                ret = EXCP_INTERRUPT;
6987 3475187d bellard
            }
6988 3475187d bellard
            if (powerdown_requested) {
6989 3475187d bellard
                powerdown_requested = 0;
6990 3475187d bellard
                qemu_system_powerdown();
6991 3475187d bellard
                ret = EXCP_INTERRUPT;
6992 5905b2e5 bellard
            }
6993 5905b2e5 bellard
            if (ret == EXCP_DEBUG) {
6994 5905b2e5 bellard
                vm_stop(EXCP_DEBUG);
6995 5905b2e5 bellard
            }
6996 bd967e05 pbrook
            /* If all cpus are halted then wait until the next IRQ */
6997 5905b2e5 bellard
            /* XXX: use timeout computed from timers */
6998 bd967e05 pbrook
            if (ret == EXCP_HALTED)
6999 5905b2e5 bellard
                timeout = 10;
7000 5905b2e5 bellard
            else
7001 5905b2e5 bellard
                timeout = 0;
7002 5905b2e5 bellard
        } else {
7003 5905b2e5 bellard
            timeout = 10;
7004 5905b2e5 bellard
        }
7005 89bfc105 bellard
#ifdef CONFIG_PROFILER
7006 89bfc105 bellard
        ti = profile_getclock();
7007 89bfc105 bellard
#endif
7008 5905b2e5 bellard
        main_loop_wait(timeout);
7009 89bfc105 bellard
#ifdef CONFIG_PROFILER
7010 89bfc105 bellard
        dev_time += profile_getclock() - ti;
7011 89bfc105 bellard
#endif
7012 b4608c04 bellard
    }
7013 34865134 bellard
    cpu_disable_ticks();
7014 34865134 bellard
    return ret;
7015 b4608c04 bellard
}
7016 b4608c04 bellard
7017 15f82208 ths
static void help(int exitcode)
7018 0824d6fc bellard
{
7019 84f2e8ef bellard
    printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2007 Fabrice Bellard\n"
7020 0db63474 bellard
           "usage: %s [options] [disk_image]\n"
7021 0824d6fc bellard
           "\n"
7022 a20dd508 bellard
           "'disk_image' is a raw hard image image for IDE hard disk 0\n"
7023 fc01f7e7 bellard
           "\n"
7024 a20dd508 bellard
           "Standard options:\n"
7025 cc1daa40 bellard
           "-M machine      select emulated machine (-M ? for list)\n"
7026 5adb4839 pbrook
           "-cpu cpu        select CPU (-cpu ? for list)\n"
7027 c45886db bellard
           "-fda/-fdb file  use 'file' as floppy disk 0/1 image\n"
7028 36b486bb bellard
           "-hda/-hdb file  use 'file' as IDE hard disk 0/1 image\n"
7029 36b486bb bellard
           "-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image\n"
7030 c4b1fcc0 bellard
           "-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
7031 3e3d5815 balrog
           "-mtdblock file  use 'file' as on-board Flash memory image\n"
7032 a1bb27b1 pbrook
           "-sd file        use 'file' as SecureDigital card image\n"
7033 86f55663 j_mayer
           "-pflash file    use 'file' as a parallel flash image\n"
7034 eec85c2a ths
           "-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n)\n"
7035 667accab ths
           "-snapshot       write to temporary files instead of disk image files\n"
7036 667accab ths
#ifdef CONFIG_SDL
7037 43523e93 ths
           "-no-frame       open SDL window without a frame and window decorations\n"
7038 3780e197 ths
           "-alt-grab       use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)\n"
7039 667accab ths
           "-no-quit        disable SDL window close capability\n"
7040 667accab ths
#endif
7041 52ca8d6a bellard
#ifdef TARGET_I386
7042 52ca8d6a bellard
           "-no-fd-bootchk  disable boot signature checking for floppy disks\n"
7043 52ca8d6a bellard
#endif
7044 a00bad7e bellard
           "-m megs         set virtual RAM size to megs MB [default=%d]\n"
7045 91fc2119 bellard
           "-smp n          set the number of CPUs to 'n' [default=1]\n"
7046 c4b1fcc0 bellard
           "-nographic      disable graphical output and redirect serial I/Os to console\n"
7047 a171fe39 balrog
           "-portrait       rotate graphical output 90 deg left (only PXA LCD)\n"
7048 4ca0074c bellard
#ifndef _WIN32
7049 667accab ths
           "-k language     use keyboard layout (for example \"fr\" for French)\n"
7050 4ca0074c bellard
#endif
7051 1d14ffa9 bellard
#ifdef HAS_AUDIO
7052 1d14ffa9 bellard
           "-audio-help     print list of audio drivers and their options\n"
7053 c0fe3827 bellard
           "-soundhw c1,... enable audio support\n"
7054 c0fe3827 bellard
           "                and only specified sound cards (comma separated list)\n"
7055 c0fe3827 bellard
           "                use -soundhw ? to get the list of supported cards\n"
7056 6a36d84e bellard
           "                use -soundhw all to enable all of them\n"
7057 1d14ffa9 bellard
#endif
7058 89980284 bellard
           "-localtime      set the real time clock to local time [default=utc]\n"
7059 d63d307f bellard
           "-full-screen    start in full screen\n"
7060 a09db21f bellard
#ifdef TARGET_I386
7061 a09db21f bellard
           "-win2k-hack     use it when installing Windows 2000 to avoid a disk full bug\n"
7062 a09db21f bellard
#endif
7063 b389dbfb bellard
           "-usb            enable the USB driver (will be the default soon)\n"
7064 b389dbfb bellard
           "-usbdevice name add the host or guest USB device 'name'\n"
7065 6f7e9aec bellard
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
7066 6f7e9aec bellard
           "-g WxH[xDEPTH]  Set the initial graphical resolution and depth\n"
7067 bb0c6722 bellard
#endif
7068 c35734b2 ths
           "-name string    set the name of the guest\n"
7069 c4b1fcc0 bellard
           "\n"
7070 c4b1fcc0 bellard
           "Network options:\n"
7071 a41b2ff2 pbrook
           "-net nic[,vlan=n][,macaddr=addr][,model=type]\n"
7072 7c9d8e07 bellard
           "                create a new Network Interface Card and connect it to VLAN 'n'\n"
7073 c20709aa bellard
#ifdef CONFIG_SLIRP
7074 115defd1 pbrook
           "-net user[,vlan=n][,hostname=host]\n"
7075 115defd1 pbrook
           "                connect the user mode network stack to VLAN 'n' and send\n"
7076 115defd1 pbrook
           "                hostname 'host' to DHCP clients\n"
7077 7c9d8e07 bellard
#endif
7078 7fb843f8 bellard
#ifdef _WIN32
7079 7fb843f8 bellard
           "-net tap[,vlan=n],ifname=name\n"
7080 7fb843f8 bellard
           "                connect the host TAP network interface to VLAN 'n'\n"
7081 7fb843f8 bellard
#else
7082 b46a8906 ths
           "-net tap[,vlan=n][,fd=h][,ifname=name][,script=file][,downscript=dfile]\n"
7083 b46a8906 ths
           "                connect the host TAP network interface to VLAN 'n' and use the\n"
7084 b46a8906 ths
           "                network scripts 'file' (default=%s)\n"
7085 b46a8906 ths
           "                and 'dfile' (default=%s);\n"
7086 b46a8906 ths
           "                use '[down]script=no' to disable script execution;\n"
7087 7c9d8e07 bellard
           "                use 'fd=h' to connect to an already opened TAP interface\n"
7088 7fb843f8 bellard
#endif
7089 6a00d601 bellard
           "-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]\n"
7090 7c9d8e07 bellard
           "                connect the vlan 'n' to another VLAN using a socket connection\n"
7091 3d830459 bellard
           "-net socket[,vlan=n][,fd=h][,mcast=maddr:port]\n"
7092 3d830459 bellard
           "                connect the vlan 'n' to multicast maddr and port\n"
7093 7c9d8e07 bellard
           "-net none       use it alone to have zero network devices; if no -net option\n"
7094 7c9d8e07 bellard
           "                is provided, the default is '-net nic -net user'\n"
7095 7c9d8e07 bellard
           "\n"
7096 7c9d8e07 bellard
#ifdef CONFIG_SLIRP
7097 0db1137d ths
           "-tftp dir       allow tftp access to files in dir [-net user]\n"
7098 47d5d01a ths
           "-bootp file     advertise file in BOOTP replies\n"
7099 7c9d8e07 bellard
#ifndef _WIN32
7100 7c9d8e07 bellard
           "-smb dir        allow SMB access to files in 'dir' [-net user]\n"
7101 c94c8d64 bellard
#endif
7102 9bf05444 bellard
           "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n"
7103 7c9d8e07 bellard
           "                redirect TCP or UDP connections from host to guest [-net user]\n"
7104 c20709aa bellard
#endif
7105 a20dd508 bellard
           "\n"
7106 c4b1fcc0 bellard
           "Linux boot specific:\n"
7107 a20dd508 bellard
           "-kernel bzImage use 'bzImage' as kernel image\n"
7108 a20dd508 bellard
           "-append cmdline use 'cmdline' as kernel command line\n"
7109 a20dd508 bellard
           "-initrd file    use 'file' as initial ram disk\n"
7110 fc01f7e7 bellard
           "\n"
7111 330d0414 bellard
           "Debug/Expert options:\n"
7112 82c643ff bellard
           "-monitor dev    redirect the monitor to char device 'dev'\n"
7113 82c643ff bellard
           "-serial dev     redirect the serial port to char device 'dev'\n"
7114 6508fe59 bellard
           "-parallel dev   redirect the parallel port to char device 'dev'\n"
7115 f7cce898 bellard
           "-pidfile file   Write PID to 'file'\n"
7116 cd6f1169 bellard
           "-S              freeze CPU at startup (use 'c' to start execution)\n"
7117 cfc3475a pbrook
           "-s              wait gdb connection to port\n"
7118 cfc3475a pbrook
           "-p port         set gdb connection port [default=%s]\n"
7119 f193c797 bellard
           "-d item1,...    output log to %s (use -d ? for a list of log items)\n"
7120 46d4767d bellard
           "-hdachs c,h,s[,t]  force hard disk 0 physical geometry and the optional BIOS\n"
7121 46d4767d bellard
           "                translation (t=none or lba) (usually qemu can guess them)\n"
7122 87b47350 bellard
           "-L path         set the directory for the BIOS, VGA BIOS and keymaps\n"
7123 d993e026 bellard
#ifdef USE_KQEMU
7124 6515b203 bellard
           "-kernel-kqemu   enable KQEMU full virtualization (default is user mode only)\n"
7125 d993e026 bellard
           "-no-kqemu       disable KQEMU kernel module usage\n"
7126 d993e026 bellard
#endif
7127 bb0c6722 bellard
#ifdef TARGET_I386
7128 1bfe856e bellard
           "-std-vga        simulate a standard VGA card with VESA Bochs Extensions\n"
7129 1bfe856e bellard
           "                (default is CL-GD5446 PCI VGA)\n"
7130 6515b203 bellard
           "-no-acpi        disable ACPI\n"
7131 bb0c6722 bellard
#endif
7132 d1beab82 bellard
           "-no-reboot      exit instead of rebooting\n"
7133 d63d307f bellard
           "-loadvm file    start right away with a saved state (loadvm in monitor)\n"
7134 24236869 bellard
           "-vnc display    start a VNC server on display\n"
7135 71e3ceb8 ths
#ifndef _WIN32
7136 71e3ceb8 ths
           "-daemonize      daemonize QEMU after initializing\n"
7137 71e3ceb8 ths
#endif
7138 9ae02555 ths
           "-option-rom rom load a file, rom, into the option ROM space\n"
7139 66508601 blueswir1
#ifdef TARGET_SPARC
7140 66508601 blueswir1
           "-prom-env variable=value  set OpenBIOS nvram variables\n"
7141 66508601 blueswir1
#endif
7142 f3dcfada ths
           "-clock          force the use of the given methods for timer alarm.\n"
7143 f3dcfada ths
           "                To see what timers are available use -clock help\n"
7144 0824d6fc bellard
           "\n"
7145 82c643ff bellard
           "During emulation, the following keys are useful:\n"
7146 032a8c9e bellard
           "ctrl-alt-f      toggle full screen\n"
7147 032a8c9e bellard
           "ctrl-alt-n      switch to virtual console 'n'\n"
7148 032a8c9e bellard
           "ctrl-alt        toggle mouse and keyboard grab\n"
7149 82c643ff bellard
           "\n"
7150 82c643ff bellard
           "When using -nographic, press 'ctrl-a h' to get some help.\n"
7151 82c643ff bellard
           ,
7152 0db63474 bellard
           "qemu",
7153 a00bad7e bellard
           DEFAULT_RAM_SIZE,
7154 7c9d8e07 bellard
#ifndef _WIN32
7155 a00bad7e bellard
           DEFAULT_NETWORK_SCRIPT,
7156 b46a8906 ths
           DEFAULT_NETWORK_DOWN_SCRIPT,
7157 7c9d8e07 bellard
#endif
7158 6e44ba7f bellard
           DEFAULT_GDBSTUB_PORT,
7159 6e44ba7f bellard
           "/tmp/qemu.log");
7160 15f82208 ths
    exit(exitcode);
7161 0824d6fc bellard
}
7162 0824d6fc bellard
7163 cd6f1169 bellard
#define HAS_ARG 0x0001
7164 cd6f1169 bellard
7165 cd6f1169 bellard
enum {
7166 cd6f1169 bellard
    QEMU_OPTION_h,
7167 cd6f1169 bellard
7168 cc1daa40 bellard
    QEMU_OPTION_M,
7169 94fc95cd j_mayer
    QEMU_OPTION_cpu,
7170 cd6f1169 bellard
    QEMU_OPTION_fda,
7171 cd6f1169 bellard
    QEMU_OPTION_fdb,
7172 cd6f1169 bellard
    QEMU_OPTION_hda,
7173 cd6f1169 bellard
    QEMU_OPTION_hdb,
7174 cd6f1169 bellard
    QEMU_OPTION_hdc,
7175 cd6f1169 bellard
    QEMU_OPTION_hdd,
7176 cd6f1169 bellard
    QEMU_OPTION_cdrom,
7177 3e3d5815 balrog
    QEMU_OPTION_mtdblock,
7178 a1bb27b1 pbrook
    QEMU_OPTION_sd,
7179 86f55663 j_mayer
    QEMU_OPTION_pflash,
7180 cd6f1169 bellard
    QEMU_OPTION_boot,
7181 cd6f1169 bellard
    QEMU_OPTION_snapshot,
7182 52ca8d6a bellard
#ifdef TARGET_I386
7183 52ca8d6a bellard
    QEMU_OPTION_no_fd_bootchk,
7184 52ca8d6a bellard
#endif
7185 cd6f1169 bellard
    QEMU_OPTION_m,
7186 cd6f1169 bellard
    QEMU_OPTION_nographic,
7187 a171fe39 balrog
    QEMU_OPTION_portrait,
7188 1d14ffa9 bellard
#ifdef HAS_AUDIO
7189 1d14ffa9 bellard
    QEMU_OPTION_audio_help,
7190 1d14ffa9 bellard
    QEMU_OPTION_soundhw,
7191 1d14ffa9 bellard
#endif
7192 cd6f1169 bellard
7193 7c9d8e07 bellard
    QEMU_OPTION_net,
7194 c7f74643 bellard
    QEMU_OPTION_tftp,
7195 47d5d01a ths
    QEMU_OPTION_bootp,
7196 9d728e8c bellard
    QEMU_OPTION_smb,
7197 9bf05444 bellard
    QEMU_OPTION_redir,
7198 cd6f1169 bellard
7199 cd6f1169 bellard
    QEMU_OPTION_kernel,
7200 cd6f1169 bellard
    QEMU_OPTION_append,
7201 cd6f1169 bellard
    QEMU_OPTION_initrd,
7202 cd6f1169 bellard
7203 cd6f1169 bellard
    QEMU_OPTION_S,
7204 cd6f1169 bellard
    QEMU_OPTION_s,
7205 cd6f1169 bellard
    QEMU_OPTION_p,
7206 cd6f1169 bellard
    QEMU_OPTION_d,
7207 cd6f1169 bellard
    QEMU_OPTION_hdachs,
7208 cd6f1169 bellard
    QEMU_OPTION_L,
7209 1192dad8 j_mayer
    QEMU_OPTION_bios,
7210 cd6f1169 bellard
    QEMU_OPTION_no_code_copy,
7211 3d11d0eb bellard
    QEMU_OPTION_k,
7212 ee22c2f7 bellard
    QEMU_OPTION_localtime,
7213 1f04275e bellard
    QEMU_OPTION_cirrusvga,
7214 d34cab9f ths
    QEMU_OPTION_vmsvga,
7215 e9b137c2 bellard
    QEMU_OPTION_g,
7216 1bfe856e bellard
    QEMU_OPTION_std_vga,
7217 20d8a3ed ths
    QEMU_OPTION_echr,
7218 82c643ff bellard
    QEMU_OPTION_monitor,
7219 82c643ff bellard
    QEMU_OPTION_serial,
7220 6508fe59 bellard
    QEMU_OPTION_parallel,
7221 d63d307f bellard
    QEMU_OPTION_loadvm,
7222 d63d307f bellard
    QEMU_OPTION_full_screen,
7223 43523e93 ths
    QEMU_OPTION_no_frame,
7224 3780e197 ths
    QEMU_OPTION_alt_grab,
7225 667accab ths
    QEMU_OPTION_no_quit,
7226 f7cce898 bellard
    QEMU_OPTION_pidfile,
7227 d993e026 bellard
    QEMU_OPTION_no_kqemu,
7228 89bfc105 bellard
    QEMU_OPTION_kernel_kqemu,
7229 a09db21f bellard
    QEMU_OPTION_win2k_hack,
7230 bb36d470 bellard
    QEMU_OPTION_usb,
7231 a594cfbf bellard
    QEMU_OPTION_usbdevice,
7232 6a00d601 bellard
    QEMU_OPTION_smp,
7233 24236869 bellard
    QEMU_OPTION_vnc,
7234 6515b203 bellard
    QEMU_OPTION_no_acpi,
7235 d1beab82 bellard
    QEMU_OPTION_no_reboot,
7236 9467cd46 balrog
    QEMU_OPTION_show_cursor,
7237 71e3ceb8 ths
    QEMU_OPTION_daemonize,
7238 9ae02555 ths
    QEMU_OPTION_option_rom,
7239 c35734b2 ths
    QEMU_OPTION_semihosting,
7240 c35734b2 ths
    QEMU_OPTION_name,
7241 66508601 blueswir1
    QEMU_OPTION_prom_env,
7242 2b8f2d41 balrog
    QEMU_OPTION_old_param,
7243 f3dcfada ths
    QEMU_OPTION_clock,
7244 7e0af5d0 bellard
    QEMU_OPTION_startdate,
7245 cd6f1169 bellard
};
7246 cd6f1169 bellard
7247 cd6f1169 bellard
typedef struct QEMUOption {
7248 cd6f1169 bellard
    const char *name;
7249 cd6f1169 bellard
    int flags;
7250 cd6f1169 bellard
    int index;
7251 cd6f1169 bellard
} QEMUOption;
7252 cd6f1169 bellard
7253 cd6f1169 bellard
const QEMUOption qemu_options[] = {
7254 cd6f1169 bellard
    { "h", 0, QEMU_OPTION_h },
7255 64423fb2 pbrook
    { "help", 0, QEMU_OPTION_h },
7256 cd6f1169 bellard
7257 cc1daa40 bellard
    { "M", HAS_ARG, QEMU_OPTION_M },
7258 94fc95cd j_mayer
    { "cpu", HAS_ARG, QEMU_OPTION_cpu },
7259 cd6f1169 bellard
    { "fda", HAS_ARG, QEMU_OPTION_fda },
7260 cd6f1169 bellard
    { "fdb", HAS_ARG, QEMU_OPTION_fdb },
7261 cd6f1169 bellard
    { "hda", HAS_ARG, QEMU_OPTION_hda },
7262 cd6f1169 bellard
    { "hdb", HAS_ARG, QEMU_OPTION_hdb },
7263 cd6f1169 bellard
    { "hdc", HAS_ARG, QEMU_OPTION_hdc },
7264 cd6f1169 bellard
    { "hdd", HAS_ARG, QEMU_OPTION_hdd },
7265 cd6f1169 bellard
    { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
7266 3e3d5815 balrog
    { "mtdblock", HAS_ARG, QEMU_OPTION_mtdblock },
7267 a1bb27b1 pbrook
    { "sd", HAS_ARG, QEMU_OPTION_sd },
7268 86f55663 j_mayer
    { "pflash", HAS_ARG, QEMU_OPTION_pflash },
7269 cd6f1169 bellard
    { "boot", HAS_ARG, QEMU_OPTION_boot },
7270 cd6f1169 bellard
    { "snapshot", 0, QEMU_OPTION_snapshot },
7271 52ca8d6a bellard
#ifdef TARGET_I386
7272 52ca8d6a bellard
    { "no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk },
7273 52ca8d6a bellard
#endif
7274 cd6f1169 bellard
    { "m", HAS_ARG, QEMU_OPTION_m },
7275 cd6f1169 bellard
    { "nographic", 0, QEMU_OPTION_nographic },
7276 a171fe39 balrog
    { "portrait", 0, QEMU_OPTION_portrait },
7277 3d11d0eb bellard
    { "k", HAS_ARG, QEMU_OPTION_k },
7278 1d14ffa9 bellard
#ifdef HAS_AUDIO
7279 1d14ffa9 bellard
    { "audio-help", 0, QEMU_OPTION_audio_help },
7280 1d14ffa9 bellard
    { "soundhw", HAS_ARG, QEMU_OPTION_soundhw },
7281 1d14ffa9 bellard
#endif
7282 cd6f1169 bellard
7283 7c9d8e07 bellard
    { "net", HAS_ARG, QEMU_OPTION_net},
7284 158156d1 bellard
#ifdef CONFIG_SLIRP
7285 c7f74643 bellard
    { "tftp", HAS_ARG, QEMU_OPTION_tftp },
7286 47d5d01a ths
    { "bootp", HAS_ARG, QEMU_OPTION_bootp },
7287 c94c8d64 bellard
#ifndef _WIN32
7288 9d728e8c bellard
    { "smb", HAS_ARG, QEMU_OPTION_smb },
7289 c94c8d64 bellard
#endif
7290 9bf05444 bellard
    { "redir", HAS_ARG, QEMU_OPTION_redir },
7291 158156d1 bellard
#endif
7292 cd6f1169 bellard
7293 cd6f1169 bellard
    { "kernel", HAS_ARG, QEMU_OPTION_kernel },
7294 cd6f1169 bellard
    { "append", HAS_ARG, QEMU_OPTION_append },
7295 cd6f1169 bellard
    { "initrd", HAS_ARG, QEMU_OPTION_initrd },
7296 cd6f1169 bellard
7297 cd6f1169 bellard
    { "S", 0, QEMU_OPTION_S },
7298 cd6f1169 bellard
    { "s", 0, QEMU_OPTION_s },
7299 cd6f1169 bellard
    { "p", HAS_ARG, QEMU_OPTION_p },
7300 cd6f1169 bellard
    { "d", HAS_ARG, QEMU_OPTION_d },
7301 cd6f1169 bellard
    { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
7302 cd6f1169 bellard
    { "L", HAS_ARG, QEMU_OPTION_L },
7303 1192dad8 j_mayer
    { "bios", HAS_ARG, QEMU_OPTION_bios },
7304 cd6f1169 bellard
    { "no-code-copy", 0, QEMU_OPTION_no_code_copy },
7305 d993e026 bellard
#ifdef USE_KQEMU
7306 d993e026 bellard
    { "no-kqemu", 0, QEMU_OPTION_no_kqemu },
7307 89bfc105 bellard
    { "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu },
7308 d993e026 bellard
#endif
7309 6f7e9aec bellard
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
7310 e9b137c2 bellard
    { "g", 1, QEMU_OPTION_g },
7311 77d4bc34 bellard
#endif
7312 ee22c2f7 bellard
    { "localtime", 0, QEMU_OPTION_localtime },
7313 1bfe856e bellard
    { "std-vga", 0, QEMU_OPTION_std_vga },
7314 8b6e0729 balrog
    { "echr", HAS_ARG, QEMU_OPTION_echr },
7315 8b6e0729 balrog
    { "monitor", HAS_ARG, QEMU_OPTION_monitor },
7316 8b6e0729 balrog
    { "serial", HAS_ARG, QEMU_OPTION_serial },
7317 8b6e0729 balrog
    { "parallel", HAS_ARG, QEMU_OPTION_parallel },
7318 d63d307f bellard
    { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
7319 d63d307f bellard
    { "full-screen", 0, QEMU_OPTION_full_screen },
7320 667accab ths
#ifdef CONFIG_SDL
7321 43523e93 ths
    { "no-frame", 0, QEMU_OPTION_no_frame },
7322 3780e197 ths
    { "alt-grab", 0, QEMU_OPTION_alt_grab },
7323 667accab ths
    { "no-quit", 0, QEMU_OPTION_no_quit },
7324 667accab ths
#endif
7325 f7cce898 bellard
    { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
7326 a09db21f bellard
    { "win2k-hack", 0, QEMU_OPTION_win2k_hack },
7327 a594cfbf bellard
    { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
7328 6a00d601 bellard
    { "smp", HAS_ARG, QEMU_OPTION_smp },
7329 24236869 bellard
    { "vnc", HAS_ARG, QEMU_OPTION_vnc },
7330 96d30e48 ths
7331 1f04275e bellard
    /* temporary options */
7332 a594cfbf bellard
    { "usb", 0, QEMU_OPTION_usb },
7333 1f04275e bellard
    { "cirrusvga", 0, QEMU_OPTION_cirrusvga },
7334 d34cab9f ths
    { "vmwarevga", 0, QEMU_OPTION_vmsvga },
7335 6515b203 bellard
    { "no-acpi", 0, QEMU_OPTION_no_acpi },
7336 d1beab82 bellard
    { "no-reboot", 0, QEMU_OPTION_no_reboot },
7337 9467cd46 balrog
    { "show-cursor", 0, QEMU_OPTION_show_cursor },
7338 71e3ceb8 ths
    { "daemonize", 0, QEMU_OPTION_daemonize },
7339 9ae02555 ths
    { "option-rom", HAS_ARG, QEMU_OPTION_option_rom },
7340 a87295e8 pbrook
#if defined(TARGET_ARM) || defined(TARGET_M68K)
7341 8e71621f pbrook
    { "semihosting", 0, QEMU_OPTION_semihosting },
7342 8e71621f pbrook
#endif
7343 c35734b2 ths
    { "name", HAS_ARG, QEMU_OPTION_name },
7344 66508601 blueswir1
#if defined(TARGET_SPARC)
7345 66508601 blueswir1
    { "prom-env", HAS_ARG, QEMU_OPTION_prom_env },
7346 66508601 blueswir1
#endif
7347 2b8f2d41 balrog
#if defined(TARGET_ARM)
7348 2b8f2d41 balrog
    { "old-param", 0, QEMU_OPTION_old_param },
7349 2b8f2d41 balrog
#endif
7350 f3dcfada ths
    { "clock", HAS_ARG, QEMU_OPTION_clock },
7351 7e0af5d0 bellard
    { "startdate", HAS_ARG, QEMU_OPTION_startdate },
7352 cd6f1169 bellard
    { NULL },
7353 fc01f7e7 bellard
};
7354 fc01f7e7 bellard
7355 5905b2e5 bellard
/* password input */
7356 5905b2e5 bellard
7357 2bac6019 balrog
int qemu_key_check(BlockDriverState *bs, const char *name)
7358 2bac6019 balrog
{
7359 2bac6019 balrog
    char password[256];
7360 2bac6019 balrog
    int i;
7361 2bac6019 balrog
7362 2bac6019 balrog
    if (!bdrv_is_encrypted(bs))
7363 2bac6019 balrog
        return 0;
7364 2bac6019 balrog
7365 2bac6019 balrog
    term_printf("%s is encrypted.\n", name);
7366 2bac6019 balrog
    for(i = 0; i < 3; i++) {
7367 2bac6019 balrog
        monitor_readline("Password: ", 1, password, sizeof(password));
7368 2bac6019 balrog
        if (bdrv_set_key(bs, password) == 0)
7369 2bac6019 balrog
            return 0;
7370 2bac6019 balrog
        term_printf("invalid password\n");
7371 2bac6019 balrog
    }
7372 2bac6019 balrog
    return -EPERM;
7373 2bac6019 balrog
}
7374 2bac6019 balrog
7375 5905b2e5 bellard
static BlockDriverState *get_bdrv(int index)
7376 5905b2e5 bellard
{
7377 5905b2e5 bellard
    BlockDriverState *bs;
7378 5905b2e5 bellard
7379 5905b2e5 bellard
    if (index < 4) {
7380 5905b2e5 bellard
        bs = bs_table[index];
7381 5905b2e5 bellard
    } else if (index < 6) {
7382 5905b2e5 bellard
        bs = fd_table[index - 4];
7383 5905b2e5 bellard
    } else {
7384 5905b2e5 bellard
        bs = NULL;
7385 5905b2e5 bellard
    }
7386 5905b2e5 bellard
    return bs;
7387 5905b2e5 bellard
}
7388 5905b2e5 bellard
7389 5905b2e5 bellard
static void read_passwords(void)
7390 5905b2e5 bellard
{
7391 5905b2e5 bellard
    BlockDriverState *bs;
7392 2bac6019 balrog
    int i;
7393 5905b2e5 bellard
7394 5905b2e5 bellard
    for(i = 0; i < 6; i++) {
7395 5905b2e5 bellard
        bs = get_bdrv(i);
7396 2bac6019 balrog
        if (bs)
7397 2bac6019 balrog
            qemu_key_check(bs, bdrv_get_device_name(bs));
7398 5905b2e5 bellard
    }
7399 5905b2e5 bellard
}
7400 5905b2e5 bellard
7401 cc1daa40 bellard
/* XXX: currently we cannot use simultaneously different CPUs */
7402 cc1daa40 bellard
void register_machines(void)
7403 cc1daa40 bellard
{
7404 cc1daa40 bellard
#if defined(TARGET_I386)
7405 cc1daa40 bellard
    qemu_register_machine(&pc_machine);
7406 3dbbdc25 bellard
    qemu_register_machine(&isapc_machine);
7407 cc1daa40 bellard
#elif defined(TARGET_PPC)
7408 cc1daa40 bellard
    qemu_register_machine(&heathrow_machine);
7409 cc1daa40 bellard
    qemu_register_machine(&core99_machine);
7410 cc1daa40 bellard
    qemu_register_machine(&prep_machine);
7411 1a6c0886 j_mayer
    qemu_register_machine(&ref405ep_machine);
7412 1a6c0886 j_mayer
    qemu_register_machine(&taihu_machine);
7413 6af0bf9c bellard
#elif defined(TARGET_MIPS)
7414 6af0bf9c bellard
    qemu_register_machine(&mips_machine);
7415 5856de80 ths
    qemu_register_machine(&mips_malta_machine);
7416 ad6fe1d2 ths
    qemu_register_machine(&mips_pica61_machine);
7417 6bf5b4e8 ths
    qemu_register_machine(&mips_mipssim_machine);
7418 cc1daa40 bellard
#elif defined(TARGET_SPARC)
7419 3475187d bellard
#ifdef TARGET_SPARC64
7420 3475187d bellard
    qemu_register_machine(&sun4u_machine);
7421 3475187d bellard
#else
7422 36cd9210 blueswir1
    qemu_register_machine(&ss5_machine);
7423 e0353fe2 blueswir1
    qemu_register_machine(&ss10_machine);
7424 cc1daa40 bellard
#endif
7425 b5ff1b31 bellard
#elif defined(TARGET_ARM)
7426 3371d272 pbrook
    qemu_register_machine(&integratorcp_machine);
7427 cdbdb648 pbrook
    qemu_register_machine(&versatilepb_machine);
7428 16406950 pbrook
    qemu_register_machine(&versatileab_machine);
7429 e69954b9 pbrook
    qemu_register_machine(&realview_machine);
7430 b00052e4 balrog
    qemu_register_machine(&akitapda_machine);
7431 b00052e4 balrog
    qemu_register_machine(&spitzpda_machine);
7432 b00052e4 balrog
    qemu_register_machine(&borzoipda_machine);
7433 b00052e4 balrog
    qemu_register_machine(&terrierpda_machine);
7434 c3d2689d balrog
    qemu_register_machine(&palmte_machine);
7435 9ee6e8bb pbrook
    qemu_register_machine(&lm3s811evb_machine);
7436 9ee6e8bb pbrook
    qemu_register_machine(&lm3s6965evb_machine);
7437 27c7ca7e bellard
#elif defined(TARGET_SH4)
7438 27c7ca7e bellard
    qemu_register_machine(&shix_machine);
7439 0d78f544 ths
    qemu_register_machine(&r2d_machine);
7440 eddf68a6 j_mayer
#elif defined(TARGET_ALPHA)
7441 eddf68a6 j_mayer
    /* XXX: TODO */
7442 0633879f pbrook
#elif defined(TARGET_M68K)
7443 20dcee94 pbrook
    qemu_register_machine(&mcf5208evb_machine);
7444 0633879f pbrook
    qemu_register_machine(&an5206_machine);
7445 ca02f319 pbrook
    qemu_register_machine(&dummy_m68k_machine);
7446 f1ccf904 ths
#elif defined(TARGET_CRIS)
7447 f1ccf904 ths
    qemu_register_machine(&bareetraxfs_machine);
7448 b5ff1b31 bellard
#else
7449 b5ff1b31 bellard
#error unsupported CPU
7450 3475187d bellard
#endif
7451 cc1daa40 bellard
}
7452 cc1daa40 bellard
7453 1d14ffa9 bellard
#ifdef HAS_AUDIO
7454 6a36d84e bellard
struct soundhw soundhw[] = {
7455 b00052e4 balrog
#ifdef HAS_AUDIO_CHOICE
7456 fd06c375 bellard
#ifdef TARGET_I386
7457 fd06c375 bellard
    {
7458 fd06c375 bellard
        "pcspk",
7459 fd06c375 bellard
        "PC speaker",
7460 fd06c375 bellard
        0,
7461 fd06c375 bellard
        1,
7462 fd06c375 bellard
        { .init_isa = pcspk_audio_init }
7463 fd06c375 bellard
    },
7464 fd06c375 bellard
#endif
7465 6a36d84e bellard
    {
7466 6a36d84e bellard
        "sb16",
7467 6a36d84e bellard
        "Creative Sound Blaster 16",
7468 6a36d84e bellard
        0,
7469 6a36d84e bellard
        1,
7470 6a36d84e bellard
        { .init_isa = SB16_init }
7471 6a36d84e bellard
    },
7472 6a36d84e bellard
7473 1d14ffa9 bellard
#ifdef CONFIG_ADLIB
7474 6a36d84e bellard
    {
7475 6a36d84e bellard
        "adlib",
7476 1d14ffa9 bellard
#ifdef HAS_YMF262
7477 6a36d84e bellard
        "Yamaha YMF262 (OPL3)",
7478 1d14ffa9 bellard
#else
7479 6a36d84e bellard
        "Yamaha YM3812 (OPL2)",
7480 1d14ffa9 bellard
#endif
7481 6a36d84e bellard
        0,
7482 6a36d84e bellard
        1,
7483 6a36d84e bellard
        { .init_isa = Adlib_init }
7484 6a36d84e bellard
    },
7485 1d14ffa9 bellard
#endif
7486 6a36d84e bellard
7487 1d14ffa9 bellard
#ifdef CONFIG_GUS
7488 6a36d84e bellard
    {
7489 6a36d84e bellard
        "gus",
7490 6a36d84e bellard
        "Gravis Ultrasound GF1",
7491 6a36d84e bellard
        0,
7492 6a36d84e bellard
        1,
7493 6a36d84e bellard
        { .init_isa = GUS_init }
7494 6a36d84e bellard
    },
7495 1d14ffa9 bellard
#endif
7496 6a36d84e bellard
7497 6a36d84e bellard
    {
7498 6a36d84e bellard
        "es1370",
7499 6a36d84e bellard
        "ENSONIQ AudioPCI ES1370",
7500 6a36d84e bellard
        0,
7501 6a36d84e bellard
        0,
7502 6a36d84e bellard
        { .init_pci = es1370_init }
7503 6a36d84e bellard
    },
7504 b00052e4 balrog
#endif
7505 6a36d84e bellard
7506 6a36d84e bellard
    { NULL, NULL, 0, 0, { NULL } }
7507 6a36d84e bellard
};
7508 6a36d84e bellard
7509 6a36d84e bellard
static void select_soundhw (const char *optarg)
7510 6a36d84e bellard
{
7511 6a36d84e bellard
    struct soundhw *c;
7512 6a36d84e bellard
7513 6a36d84e bellard
    if (*optarg == '?') {
7514 6a36d84e bellard
    show_valid_cards:
7515 6a36d84e bellard
7516 6a36d84e bellard
        printf ("Valid sound card names (comma separated):\n");
7517 6a36d84e bellard
        for (c = soundhw; c->name; ++c) {
7518 6a36d84e bellard
            printf ("%-11s %s\n", c->name, c->descr);
7519 6a36d84e bellard
        }
7520 6a36d84e bellard
        printf ("\n-soundhw all will enable all of the above\n");
7521 1d14ffa9 bellard
        exit (*optarg != '?');
7522 1d14ffa9 bellard
    }
7523 1d14ffa9 bellard
    else {
7524 6a36d84e bellard
        size_t l;
7525 1d14ffa9 bellard
        const char *p;
7526 1d14ffa9 bellard
        char *e;
7527 1d14ffa9 bellard
        int bad_card = 0;
7528 1d14ffa9 bellard
7529 6a36d84e bellard
        if (!strcmp (optarg, "all")) {
7530 6a36d84e bellard
            for (c = soundhw; c->name; ++c) {
7531 6a36d84e bellard
                c->enabled = 1;
7532 6a36d84e bellard
            }
7533 6a36d84e bellard
            return;
7534 6a36d84e bellard
        }
7535 1d14ffa9 bellard
7536 6a36d84e bellard
        p = optarg;
7537 1d14ffa9 bellard
        while (*p) {
7538 1d14ffa9 bellard
            e = strchr (p, ',');
7539 1d14ffa9 bellard
            l = !e ? strlen (p) : (size_t) (e - p);
7540 6a36d84e bellard
7541 6a36d84e bellard
            for (c = soundhw; c->name; ++c) {
7542 6a36d84e bellard
                if (!strncmp (c->name, p, l)) {
7543 6a36d84e bellard
                    c->enabled = 1;
7544 1d14ffa9 bellard
                    break;
7545 1d14ffa9 bellard
                }
7546 1d14ffa9 bellard
            }
7547 6a36d84e bellard
7548 6a36d84e bellard
            if (!c->name) {
7549 1d14ffa9 bellard
                if (l > 80) {
7550 1d14ffa9 bellard
                    fprintf (stderr,
7551 1d14ffa9 bellard
                             "Unknown sound card name (too big to show)\n");
7552 1d14ffa9 bellard
                }
7553 1d14ffa9 bellard
                else {
7554 1d14ffa9 bellard
                    fprintf (stderr, "Unknown sound card name `%.*s'\n",
7555 1d14ffa9 bellard
                             (int) l, p);
7556 1d14ffa9 bellard
                }
7557 1d14ffa9 bellard
                bad_card = 1;
7558 1d14ffa9 bellard
            }
7559 1d14ffa9 bellard
            p += l + (e != NULL);
7560 1d14ffa9 bellard
        }
7561 1d14ffa9 bellard
7562 1d14ffa9 bellard
        if (bad_card)
7563 1d14ffa9 bellard
            goto show_valid_cards;
7564 1d14ffa9 bellard
    }
7565 1d14ffa9 bellard
}
7566 1d14ffa9 bellard
#endif
7567 1d14ffa9 bellard
7568 3587d7e6 bellard
#ifdef _WIN32
7569 3587d7e6 bellard
static BOOL WINAPI qemu_ctrl_handler(DWORD type)
7570 3587d7e6 bellard
{
7571 3587d7e6 bellard
    exit(STATUS_CONTROL_C_EXIT);
7572 3587d7e6 bellard
    return TRUE;
7573 3587d7e6 bellard
}
7574 3587d7e6 bellard
#endif
7575 3587d7e6 bellard
7576 7c9d8e07 bellard
#define MAX_NET_CLIENTS 32
7577 c20709aa bellard
7578 0824d6fc bellard
int main(int argc, char **argv)
7579 0824d6fc bellard
{
7580 67b915a5 bellard
#ifdef CONFIG_GDBSTUB
7581 cfc3475a pbrook
    int use_gdbstub;
7582 cfc3475a pbrook
    const char *gdbstub_port;
7583 67b915a5 bellard
#endif
7584 28c5af54 j_mayer
    uint32_t boot_devices_bitmap = 0;
7585 86f55663 j_mayer
    int i, cdrom_index, pflash_index;
7586 28c5af54 j_mayer
    int snapshot, linux_boot, net_boot;
7587 7f7f9873 bellard
    const char *initrd_filename;
7588 96d30e48 ths
    const char *hd_filename[MAX_DISKS], *fd_filename[MAX_FD];
7589 86f55663 j_mayer
    const char *pflash_filename[MAX_PFLASH];
7590 a1bb27b1 pbrook
    const char *sd_filename;
7591 3e3d5815 balrog
    const char *mtd_filename;
7592 a20dd508 bellard
    const char *kernel_filename, *kernel_cmdline;
7593 28c5af54 j_mayer
    const char *boot_devices = "";
7594 313aa567 bellard
    DisplayState *ds = &display_state;
7595 46d4767d bellard
    int cyls, heads, secs, translation;
7596 7c9d8e07 bellard
    char net_clients[MAX_NET_CLIENTS][256];
7597 7c9d8e07 bellard
    int nb_net_clients;
7598 cd6f1169 bellard
    int optind;
7599 cd6f1169 bellard
    const char *r, *optarg;
7600 82c643ff bellard
    CharDriverState *monitor_hd;
7601 82c643ff bellard
    char monitor_device[128];
7602 8d11df9e bellard
    char serial_devices[MAX_SERIAL_PORTS][128];
7603 8d11df9e bellard
    int serial_device_index;
7604 6508fe59 bellard
    char parallel_devices[MAX_PARALLEL_PORTS][128];
7605 6508fe59 bellard
    int parallel_device_index;
7606 d63d307f bellard
    const char *loadvm = NULL;
7607 cc1daa40 bellard
    QEMUMachine *machine;
7608 94fc95cd j_mayer
    const char *cpu_model;
7609 0d92ed30 pbrook
    char usb_devices[MAX_USB_CMDLINE][128];
7610 a594cfbf bellard
    int usb_devices_index;
7611 71e3ceb8 ths
    int fds[2];
7612 93815bc2 ths
    const char *pid_file = NULL;
7613 833c7174 blueswir1
    VLANState *vlan;
7614 0bd48850 bellard
7615 0bd48850 bellard
    LIST_INIT (&vm_change_state_head);
7616 be995c27 bellard
#ifndef _WIN32
7617 be995c27 bellard
    {
7618 be995c27 bellard
        struct sigaction act;
7619 be995c27 bellard
        sigfillset(&act.sa_mask);
7620 be995c27 bellard
        act.sa_flags = 0;
7621 be995c27 bellard
        act.sa_handler = SIG_IGN;
7622 be995c27 bellard
        sigaction(SIGPIPE, &act, NULL);
7623 be995c27 bellard
    }
7624 3587d7e6 bellard
#else
7625 3587d7e6 bellard
    SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
7626 a8e5ac33 bellard
    /* Note: cpu_interrupt() is currently not SMP safe, so we force
7627 a8e5ac33 bellard
       QEMU to run on a single CPU */
7628 a8e5ac33 bellard
    {
7629 a8e5ac33 bellard
        HANDLE h;
7630 a8e5ac33 bellard
        DWORD mask, smask;
7631 a8e5ac33 bellard
        int i;
7632 a8e5ac33 bellard
        h = GetCurrentProcess();
7633 a8e5ac33 bellard
        if (GetProcessAffinityMask(h, &mask, &smask)) {
7634 a8e5ac33 bellard
            for(i = 0; i < 32; i++) {
7635 a8e5ac33 bellard
                if (mask & (1 << i))
7636 a8e5ac33 bellard
                    break;
7637 a8e5ac33 bellard
            }
7638 a8e5ac33 bellard
            if (i != 32) {
7639 a8e5ac33 bellard
                mask = 1 << i;
7640 a8e5ac33 bellard
                SetProcessAffinityMask(h, mask);
7641 a8e5ac33 bellard
            }
7642 a8e5ac33 bellard
        }
7643 a8e5ac33 bellard
    }
7644 67b915a5 bellard
#endif
7645 be995c27 bellard
7646 cc1daa40 bellard
    register_machines();
7647 cc1daa40 bellard
    machine = first_machine;
7648 94fc95cd j_mayer
    cpu_model = NULL;
7649 fc01f7e7 bellard
    initrd_filename = NULL;
7650 c45886db bellard
    for(i = 0; i < MAX_FD; i++)
7651 c45886db bellard
        fd_filename[i] = NULL;
7652 96d30e48 ths
    for(i = 0; i < MAX_DISKS; i++)
7653 96d30e48 ths
        hd_filename[i] = NULL;
7654 86f55663 j_mayer
    for(i = 0; i < MAX_PFLASH; i++)
7655 86f55663 j_mayer
        pflash_filename[i] = NULL;
7656 86f55663 j_mayer
    pflash_index = 0;
7657 a1bb27b1 pbrook
    sd_filename = NULL;
7658 3e3d5815 balrog
    mtd_filename = NULL;
7659 a00bad7e bellard
    ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
7660 313aa567 bellard
    vga_ram_size = VGA_RAM_SIZE;
7661 67b915a5 bellard
#ifdef CONFIG_GDBSTUB
7662 b4608c04 bellard
    use_gdbstub = 0;
7663 c636bb66 bellard
    gdbstub_port = DEFAULT_GDBSTUB_PORT;
7664 67b915a5 bellard
#endif
7665 33e3963e bellard
    snapshot = 0;
7666 a20dd508 bellard
    nographic = 0;
7667 a20dd508 bellard
    kernel_filename = NULL;
7668 a20dd508 bellard
    kernel_cmdline = "";
7669 cc1daa40 bellard
#ifdef TARGET_PPC
7670 cc1daa40 bellard
    cdrom_index = 1;
7671 cc1daa40 bellard
#else
7672 cc1daa40 bellard
    cdrom_index = 2;
7673 cc1daa40 bellard
#endif
7674 c4b1fcc0 bellard
    cyls = heads = secs = 0;
7675 46d4767d bellard
    translation = BIOS_ATA_TRANSLATION_AUTO;
7676 82c643ff bellard
    pstrcpy(monitor_device, sizeof(monitor_device), "vc");
7677 c4b1fcc0 bellard
7678 8d11df9e bellard
    pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "vc");
7679 8d11df9e bellard
    for(i = 1; i < MAX_SERIAL_PORTS; i++)
7680 8d11df9e bellard
        serial_devices[i][0] = '\0';
7681 8d11df9e bellard
    serial_device_index = 0;
7682 3b46e624 ths
7683 6508fe59 bellard
    pstrcpy(parallel_devices[0], sizeof(parallel_devices[0]), "vc");
7684 6508fe59 bellard
    for(i = 1; i < MAX_PARALLEL_PORTS; i++)
7685 6508fe59 bellard
        parallel_devices[i][0] = '\0';
7686 6508fe59 bellard
    parallel_device_index = 0;
7687 3b46e624 ths
7688 a594cfbf bellard
    usb_devices_index = 0;
7689 3b46e624 ths
7690 7c9d8e07 bellard
    nb_net_clients = 0;
7691 7c9d8e07 bellard
7692 7c9d8e07 bellard
    nb_nics = 0;
7693 702c651c bellard
    /* default mac address of the first network interface */
7694 3b46e624 ths
7695 cd6f1169 bellard
    optind = 1;
7696 0824d6fc bellard
    for(;;) {
7697 cd6f1169 bellard
        if (optind >= argc)
7698 0824d6fc bellard
            break;
7699 cd6f1169 bellard
        r = argv[optind];
7700 cd6f1169 bellard
        if (r[0] != '-') {
7701 96d30e48 ths
            hd_filename[0] = argv[optind++];
7702 cd6f1169 bellard
        } else {
7703 cd6f1169 bellard
            const QEMUOption *popt;
7704 cd6f1169 bellard
7705 cd6f1169 bellard
            optind++;
7706 dff5efc8 pbrook
            /* Treat --foo the same as -foo.  */
7707 dff5efc8 pbrook
            if (r[1] == '-')
7708 dff5efc8 pbrook
                r++;
7709 cd6f1169 bellard
            popt = qemu_options;
7710 cd6f1169 bellard
            for(;;) {
7711 cd6f1169 bellard
                if (!popt->name) {
7712 5fafdf24 ths
                    fprintf(stderr, "%s: invalid option -- '%s'\n",
7713 cd6f1169 bellard
                            argv[0], r);
7714 cd6f1169 bellard
                    exit(1);
7715 cd6f1169 bellard
                }
7716 cd6f1169 bellard
                if (!strcmp(popt->name, r + 1))
7717 cd6f1169 bellard
                    break;
7718 cd6f1169 bellard
                popt++;
7719 cd6f1169 bellard
            }
7720 cd6f1169 bellard
            if (popt->flags & HAS_ARG) {
7721 cd6f1169 bellard
                if (optind >= argc) {
7722 cd6f1169 bellard
                    fprintf(stderr, "%s: option '%s' requires an argument\n",
7723 cd6f1169 bellard
                            argv[0], r);
7724 cd6f1169 bellard
                    exit(1);
7725 cd6f1169 bellard
                }
7726 cd6f1169 bellard
                optarg = argv[optind++];
7727 cd6f1169 bellard
            } else {
7728 cd6f1169 bellard
                optarg = NULL;
7729 cd6f1169 bellard
            }
7730 cd6f1169 bellard
7731 cd6f1169 bellard
            switch(popt->index) {
7732 cc1daa40 bellard
            case QEMU_OPTION_M:
7733 cc1daa40 bellard
                machine = find_machine(optarg);
7734 cc1daa40 bellard
                if (!machine) {
7735 cc1daa40 bellard
                    QEMUMachine *m;
7736 cc1daa40 bellard
                    printf("Supported machines are:\n");
7737 cc1daa40 bellard
                    for(m = first_machine; m != NULL; m = m->next) {
7738 cc1daa40 bellard
                        printf("%-10s %s%s\n",
7739 5fafdf24 ths
                               m->name, m->desc,
7740 cc1daa40 bellard
                               m == first_machine ? " (default)" : "");
7741 cc1daa40 bellard
                    }
7742 15f82208 ths
                    exit(*optarg != '?');
7743 cc1daa40 bellard
                }
7744 cc1daa40 bellard
                break;
7745 94fc95cd j_mayer
            case QEMU_OPTION_cpu:
7746 94fc95cd j_mayer
                /* hw initialization will check this */
7747 15f82208 ths
                if (*optarg == '?') {
7748 c732abe2 j_mayer
/* XXX: implement xxx_cpu_list for targets that still miss it */
7749 c732abe2 j_mayer
#if defined(cpu_list)
7750 c732abe2 j_mayer
                    cpu_list(stdout, &fprintf);
7751 94fc95cd j_mayer
#endif
7752 15f82208 ths
                    exit(0);
7753 94fc95cd j_mayer
                } else {
7754 94fc95cd j_mayer
                    cpu_model = optarg;
7755 94fc95cd j_mayer
                }
7756 94fc95cd j_mayer
                break;
7757 cd6f1169 bellard
            case QEMU_OPTION_initrd:
7758 fc01f7e7 bellard
                initrd_filename = optarg;
7759 fc01f7e7 bellard
                break;
7760 cd6f1169 bellard
            case QEMU_OPTION_hda:
7761 cd6f1169 bellard
            case QEMU_OPTION_hdb:
7762 cc1daa40 bellard
            case QEMU_OPTION_hdc:
7763 cc1daa40 bellard
            case QEMU_OPTION_hdd:
7764 cc1daa40 bellard
                {
7765 cc1daa40 bellard
                    int hd_index;
7766 cc1daa40 bellard
                    hd_index = popt->index - QEMU_OPTION_hda;
7767 96d30e48 ths
                    hd_filename[hd_index] = optarg;
7768 96d30e48 ths
                    if (hd_index == cdrom_index)
7769 96d30e48 ths
                        cdrom_index = -1;
7770 cc1daa40 bellard
                }
7771 fc01f7e7 bellard
                break;
7772 3e3d5815 balrog
            case QEMU_OPTION_mtdblock:
7773 3e3d5815 balrog
                mtd_filename = optarg;
7774 3e3d5815 balrog
                break;
7775 a1bb27b1 pbrook
            case QEMU_OPTION_sd:
7776 a1bb27b1 pbrook
                sd_filename = optarg;
7777 a1bb27b1 pbrook
                break;
7778 86f55663 j_mayer
            case QEMU_OPTION_pflash:
7779 86f55663 j_mayer
                if (pflash_index >= MAX_PFLASH) {
7780 86f55663 j_mayer
                    fprintf(stderr, "qemu: too many parallel flash images\n");
7781 86f55663 j_mayer
                    exit(1);
7782 86f55663 j_mayer
                }
7783 86f55663 j_mayer
                pflash_filename[pflash_index++] = optarg;
7784 86f55663 j_mayer
                break;
7785 cd6f1169 bellard
            case QEMU_OPTION_snapshot:
7786 33e3963e bellard
                snapshot = 1;
7787 33e3963e bellard
                break;
7788 cd6f1169 bellard
            case QEMU_OPTION_hdachs:
7789 330d0414 bellard
                {
7790 330d0414 bellard
                    const char *p;
7791 330d0414 bellard
                    p = optarg;
7792 330d0414 bellard
                    cyls = strtol(p, (char **)&p, 0);
7793 46d4767d bellard
                    if (cyls < 1 || cyls > 16383)
7794 46d4767d bellard
                        goto chs_fail;
7795 330d0414 bellard
                    if (*p != ',')
7796 330d0414 bellard
                        goto chs_fail;
7797 330d0414 bellard
                    p++;
7798 330d0414 bellard
                    heads = strtol(p, (char **)&p, 0);
7799 46d4767d bellard
                    if (heads < 1 || heads > 16)
7800 46d4767d bellard
                        goto chs_fail;
7801 330d0414 bellard
                    if (*p != ',')
7802 330d0414 bellard
                        goto chs_fail;
7803 330d0414 bellard
                    p++;
7804 330d0414 bellard
                    secs = strtol(p, (char **)&p, 0);
7805 46d4767d bellard
                    if (secs < 1 || secs > 63)
7806 46d4767d bellard
                        goto chs_fail;
7807 46d4767d bellard
                    if (*p == ',') {
7808 46d4767d bellard
                        p++;
7809 46d4767d bellard
                        if (!strcmp(p, "none"))
7810 46d4767d bellard
                            translation = BIOS_ATA_TRANSLATION_NONE;
7811 46d4767d bellard
                        else if (!strcmp(p, "lba"))
7812 46d4767d bellard
                            translation = BIOS_ATA_TRANSLATION_LBA;
7813 46d4767d bellard
                        else if (!strcmp(p, "auto"))
7814 46d4767d bellard
                            translation = BIOS_ATA_TRANSLATION_AUTO;
7815 46d4767d bellard
                        else
7816 46d4767d bellard
                            goto chs_fail;
7817 46d4767d bellard
                    } else if (*p != '\0') {
7818 c4b1fcc0 bellard
                    chs_fail:
7819 46d4767d bellard
                        fprintf(stderr, "qemu: invalid physical CHS format\n");
7820 46d4767d bellard
                        exit(1);
7821 c4b1fcc0 bellard
                    }
7822 330d0414 bellard
                }
7823 330d0414 bellard
                break;
7824 cd6f1169 bellard
            case QEMU_OPTION_nographic:
7825 8d11df9e bellard
                pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "stdio");
7826 a39437aa ths
                pstrcpy(parallel_devices[0], sizeof(parallel_devices[0]), "null");
7827 20d8a3ed ths
                pstrcpy(monitor_device, sizeof(monitor_device), "stdio");
7828 a20dd508 bellard
                nographic = 1;
7829 a20dd508 bellard
                break;
7830 a171fe39 balrog
            case QEMU_OPTION_portrait:
7831 a171fe39 balrog
                graphic_rotate = 1;
7832 a171fe39 balrog
                break;
7833 cd6f1169 bellard
            case QEMU_OPTION_kernel:
7834 a20dd508 bellard
                kernel_filename = optarg;
7835 a20dd508 bellard
                break;
7836 cd6f1169 bellard
            case QEMU_OPTION_append:
7837 a20dd508 bellard
                kernel_cmdline = optarg;
7838 313aa567 bellard
                break;
7839 cd6f1169 bellard
            case QEMU_OPTION_cdrom:
7840 96d30e48 ths
                if (cdrom_index >= 0) {
7841 96d30e48 ths
                    hd_filename[cdrom_index] = optarg;
7842 fa1fb14c ths
                }
7843 36b486bb bellard
                break;
7844 cd6f1169 bellard
            case QEMU_OPTION_boot:
7845 28c5af54 j_mayer
                boot_devices = optarg;
7846 28c5af54 j_mayer
                /* We just do some generic consistency checks */
7847 28c5af54 j_mayer
                {
7848 28c5af54 j_mayer
                    /* Could easily be extended to 64 devices if needed */
7849 28c5af54 j_mayer
                    const unsigned char *p;
7850 28c5af54 j_mayer
                    
7851 28c5af54 j_mayer
                    boot_devices_bitmap = 0;
7852 28c5af54 j_mayer
                    for (p = boot_devices; *p != '\0'; p++) {
7853 28c5af54 j_mayer
                        /* Allowed boot devices are:
7854 28c5af54 j_mayer
                         * a b     : floppy disk drives
7855 28c5af54 j_mayer
                         * c ... f : IDE disk drives
7856 28c5af54 j_mayer
                         * g ... m : machine implementation dependant drives
7857 28c5af54 j_mayer
                         * n ... p : network devices
7858 28c5af54 j_mayer
                         * It's up to each machine implementation to check
7859 28c5af54 j_mayer
                         * if the given boot devices match the actual hardware
7860 28c5af54 j_mayer
                         * implementation and firmware features.
7861 28c5af54 j_mayer
                         */
7862 28c5af54 j_mayer
                        if (*p < 'a' || *p > 'q') {
7863 28c5af54 j_mayer
                            fprintf(stderr, "Invalid boot device '%c'\n", *p);
7864 28c5af54 j_mayer
                            exit(1);
7865 28c5af54 j_mayer
                        }
7866 28c5af54 j_mayer
                        if (boot_devices_bitmap & (1 << (*p - 'a'))) {
7867 28c5af54 j_mayer
                            fprintf(stderr,
7868 28c5af54 j_mayer
                                    "Boot device '%c' was given twice\n",*p);
7869 28c5af54 j_mayer
                            exit(1);
7870 28c5af54 j_mayer
                        }
7871 28c5af54 j_mayer
                        boot_devices_bitmap |= 1 << (*p - 'a');
7872 28c5af54 j_mayer
                    }
7873 36b486bb bellard
                }
7874 36b486bb bellard
                break;
7875 cd6f1169 bellard
            case QEMU_OPTION_fda:
7876 c45886db bellard
                fd_filename[0] = optarg;
7877 c45886db bellard
                break;
7878 cd6f1169 bellard
            case QEMU_OPTION_fdb:
7879 c45886db bellard
                fd_filename[1] = optarg;
7880 c45886db bellard
                break;
7881 52ca8d6a bellard
#ifdef TARGET_I386
7882 52ca8d6a bellard
            case QEMU_OPTION_no_fd_bootchk:
7883 52ca8d6a bellard
                fd_bootchk = 0;
7884 52ca8d6a bellard
                break;
7885 52ca8d6a bellard
#endif
7886 cd6f1169 bellard
            case QEMU_OPTION_no_code_copy:
7887 77fef8c1 bellard
                code_copy_enabled = 0;
7888 77fef8c1 bellard
                break;
7889 7c9d8e07 bellard
            case QEMU_OPTION_net:
7890 7c9d8e07 bellard
                if (nb_net_clients >= MAX_NET_CLIENTS) {
7891 7c9d8e07 bellard
                    fprintf(stderr, "qemu: too many network clients\n");
7892 c4b1fcc0 bellard
                    exit(1);
7893 c4b1fcc0 bellard
                }
7894 7c9d8e07 bellard
                pstrcpy(net_clients[nb_net_clients],
7895 7c9d8e07 bellard
                        sizeof(net_clients[0]),
7896 7c9d8e07 bellard
                        optarg);
7897 7c9d8e07 bellard
                nb_net_clients++;
7898 702c651c bellard
                break;
7899 c7f74643 bellard
#ifdef CONFIG_SLIRP
7900 c7f74643 bellard
            case QEMU_OPTION_tftp:
7901 c7f74643 bellard
                tftp_prefix = optarg;
7902 9bf05444 bellard
                break;
7903 47d5d01a ths
            case QEMU_OPTION_bootp:
7904 47d5d01a ths
                bootp_filename = optarg;
7905 47d5d01a ths
                break;
7906 c94c8d64 bellard
#ifndef _WIN32
7907 9d728e8c bellard
            case QEMU_OPTION_smb:
7908 9d728e8c bellard
                net_slirp_smb(optarg);
7909 9d728e8c bellard
                break;
7910 c94c8d64 bellard
#endif
7911 9bf05444 bellard
            case QEMU_OPTION_redir:
7912 3b46e624 ths
                net_slirp_redir(optarg);
7913 9bf05444 bellard
                break;
7914 c7f74643 bellard
#endif
7915 1d14ffa9 bellard
#ifdef HAS_AUDIO
7916 1d14ffa9 bellard
            case QEMU_OPTION_audio_help:
7917 1d14ffa9 bellard
                AUD_help ();
7918 1d14ffa9 bellard
                exit (0);
7919 1d14ffa9 bellard
                break;
7920 1d14ffa9 bellard
            case QEMU_OPTION_soundhw:
7921 1d14ffa9 bellard
                select_soundhw (optarg);
7922 1d14ffa9 bellard
                break;
7923 1d14ffa9 bellard
#endif
7924 cd6f1169 bellard
            case QEMU_OPTION_h:
7925 15f82208 ths
                help(0);
7926 cd6f1169 bellard
                break;
7927 cd6f1169 bellard
            case QEMU_OPTION_m:
7928 cd6f1169 bellard
                ram_size = atoi(optarg) * 1024 * 1024;
7929 cd6f1169 bellard
                if (ram_size <= 0)
7930 15f82208 ths
                    help(1);
7931 cd6f1169 bellard
                if (ram_size > PHYS_RAM_MAX_SIZE) {
7932 cd6f1169 bellard
                    fprintf(stderr, "qemu: at most %d MB RAM can be simulated\n",
7933 cd6f1169 bellard
                            PHYS_RAM_MAX_SIZE / (1024 * 1024));
7934 cd6f1169 bellard
                    exit(1);
7935 cd6f1169 bellard
                }
7936 cd6f1169 bellard
                break;
7937 cd6f1169 bellard
            case QEMU_OPTION_d:
7938 cd6f1169 bellard
                {
7939 cd6f1169 bellard
                    int mask;
7940 cd6f1169 bellard
                    CPULogItem *item;
7941 3b46e624 ths
7942 cd6f1169 bellard
                    mask = cpu_str_to_log_mask(optarg);
7943 cd6f1169 bellard
                    if (!mask) {
7944 cd6f1169 bellard
                        printf("Log items (comma separated):\n");
7945 f193c797 bellard
                    for(item = cpu_log_items; item->mask != 0; item++) {
7946 f193c797 bellard
                        printf("%-10s %s\n", item->name, item->help);
7947 f193c797 bellard
                    }
7948 f193c797 bellard
                    exit(1);
7949 cd6f1169 bellard
                    }
7950 cd6f1169 bellard
                    cpu_set_log(mask);
7951 f193c797 bellard
                }
7952 cd6f1169 bellard
                break;
7953 67b915a5 bellard
#ifdef CONFIG_GDBSTUB
7954 cd6f1169 bellard
            case QEMU_OPTION_s:
7955 cd6f1169 bellard
                use_gdbstub = 1;
7956 cd6f1169 bellard
                break;
7957 cd6f1169 bellard
            case QEMU_OPTION_p:
7958 cfc3475a pbrook
                gdbstub_port = optarg;
7959 cd6f1169 bellard
                break;
7960 67b915a5 bellard
#endif
7961 cd6f1169 bellard
            case QEMU_OPTION_L:
7962 cd6f1169 bellard
                bios_dir = optarg;
7963 cd6f1169 bellard
                break;
7964 1192dad8 j_mayer
            case QEMU_OPTION_bios:
7965 1192dad8 j_mayer
                bios_name = optarg;
7966 1192dad8 j_mayer
                break;
7967 cd6f1169 bellard
            case QEMU_OPTION_S:
7968 3c07f8e8 pbrook
                autostart = 0;
7969 cd6f1169 bellard
                break;
7970 3d11d0eb bellard
            case QEMU_OPTION_k:
7971 3d11d0eb bellard
                keyboard_layout = optarg;
7972 3d11d0eb bellard
                break;
7973 ee22c2f7 bellard
            case QEMU_OPTION_localtime:
7974 ee22c2f7 bellard
                rtc_utc = 0;
7975 ee22c2f7 bellard
                break;
7976 1f04275e bellard
            case QEMU_OPTION_cirrusvga:
7977 1f04275e bellard
                cirrus_vga_enabled = 1;
7978 d34cab9f ths
                vmsvga_enabled = 0;
7979 d34cab9f ths
                break;
7980 d34cab9f ths
            case QEMU_OPTION_vmsvga:
7981 d34cab9f ths
                cirrus_vga_enabled = 0;
7982 d34cab9f ths
                vmsvga_enabled = 1;
7983 1f04275e bellard
                break;
7984 1bfe856e bellard
            case QEMU_OPTION_std_vga:
7985 1bfe856e bellard
                cirrus_vga_enabled = 0;
7986 d34cab9f ths
                vmsvga_enabled = 0;
7987 1bfe856e bellard
                break;
7988 e9b137c2 bellard
            case QEMU_OPTION_g:
7989 e9b137c2 bellard
                {
7990 e9b137c2 bellard
                    const char *p;
7991 e9b137c2 bellard
                    int w, h, depth;
7992 e9b137c2 bellard
                    p = optarg;
7993 e9b137c2 bellard
                    w = strtol(p, (char **)&p, 10);
7994 e9b137c2 bellard
                    if (w <= 0) {
7995 e9b137c2 bellard
                    graphic_error:
7996 e9b137c2 bellard
                        fprintf(stderr, "qemu: invalid resolution or depth\n");
7997 e9b137c2 bellard
                        exit(1);
7998 e9b137c2 bellard
                    }
7999 e9b137c2 bellard
                    if (*p != 'x')
8000 e9b137c2 bellard
                        goto graphic_error;
8001 e9b137c2 bellard
                    p++;
8002 e9b137c2 bellard
                    h = strtol(p, (char **)&p, 10);
8003 e9b137c2 bellard
                    if (h <= 0)
8004 e9b137c2 bellard
                        goto graphic_error;
8005 e9b137c2 bellard
                    if (*p == 'x') {
8006 e9b137c2 bellard
                        p++;
8007 e9b137c2 bellard
                        depth = strtol(p, (char **)&p, 10);
8008 5fafdf24 ths
                        if (depth != 8 && depth != 15 && depth != 16 &&
8009 e9b137c2 bellard
                            depth != 24 && depth != 32)
8010 e9b137c2 bellard
                            goto graphic_error;
8011 e9b137c2 bellard
                    } else if (*p == '\0') {
8012 e9b137c2 bellard
                        depth = graphic_depth;
8013 e9b137c2 bellard
                    } else {
8014 e9b137c2 bellard
                        goto graphic_error;
8015 e9b137c2 bellard
                    }
8016 3b46e624 ths
8017 e9b137c2 bellard
                    graphic_width = w;
8018 e9b137c2 bellard
                    graphic_height = h;
8019 e9b137c2 bellard
                    graphic_depth = depth;
8020 e9b137c2 bellard
                }
8021 e9b137c2 bellard
                break;
8022 20d8a3ed ths
            case QEMU_OPTION_echr:
8023 20d8a3ed ths
                {
8024 20d8a3ed ths
                    char *r;
8025 20d8a3ed ths
                    term_escape_char = strtol(optarg, &r, 0);
8026 20d8a3ed ths
                    if (r == optarg)
8027 20d8a3ed ths
                        printf("Bad argument to echr\n");
8028 20d8a3ed ths
                    break;
8029 20d8a3ed ths
                }
8030 82c643ff bellard
            case QEMU_OPTION_monitor:
8031 82c643ff bellard
                pstrcpy(monitor_device, sizeof(monitor_device), optarg);
8032 82c643ff bellard
                break;
8033 82c643ff bellard
            case QEMU_OPTION_serial:
8034 8d11df9e bellard
                if (serial_device_index >= MAX_SERIAL_PORTS) {
8035 8d11df9e bellard
                    fprintf(stderr, "qemu: too many serial ports\n");
8036 8d11df9e bellard
                    exit(1);
8037 8d11df9e bellard
                }
8038 5fafdf24 ths
                pstrcpy(serial_devices[serial_device_index],
8039 8d11df9e bellard
                        sizeof(serial_devices[0]), optarg);
8040 8d11df9e bellard
                serial_device_index++;
8041 82c643ff bellard
                break;
8042 6508fe59 bellard
            case QEMU_OPTION_parallel:
8043 6508fe59 bellard
                if (parallel_device_index >= MAX_PARALLEL_PORTS) {
8044 6508fe59 bellard
                    fprintf(stderr, "qemu: too many parallel ports\n");
8045 6508fe59 bellard
                    exit(1);
8046 6508fe59 bellard
                }
8047 5fafdf24 ths
                pstrcpy(parallel_devices[parallel_device_index],
8048 6508fe59 bellard
                        sizeof(parallel_devices[0]), optarg);
8049 6508fe59 bellard
                parallel_device_index++;
8050 6508fe59 bellard
                break;
8051 d63d307f bellard
            case QEMU_OPTION_loadvm:
8052 d63d307f bellard
                loadvm = optarg;
8053 d63d307f bellard
                break;
8054 d63d307f bellard
            case QEMU_OPTION_full_screen:
8055 d63d307f bellard
                full_screen = 1;
8056 d63d307f bellard
                break;
8057 667accab ths
#ifdef CONFIG_SDL
8058 43523e93 ths
            case QEMU_OPTION_no_frame:
8059 43523e93 ths
                no_frame = 1;
8060 43523e93 ths
                break;
8061 3780e197 ths
            case QEMU_OPTION_alt_grab:
8062 3780e197 ths
                alt_grab = 1;
8063 3780e197 ths
                break;
8064 667accab ths
            case QEMU_OPTION_no_quit:
8065 667accab ths
                no_quit = 1;
8066 667accab ths
                break;
8067 667accab ths
#endif
8068 f7cce898 bellard
            case QEMU_OPTION_pidfile:
8069 93815bc2 ths
                pid_file = optarg;
8070 f7cce898 bellard
                break;
8071 a09db21f bellard
#ifdef TARGET_I386
8072 a09db21f bellard
            case QEMU_OPTION_win2k_hack:
8073 a09db21f bellard
                win2k_install_hack = 1;
8074 a09db21f bellard
                break;
8075 a09db21f bellard
#endif
8076 d993e026 bellard
#ifdef USE_KQEMU
8077 d993e026 bellard
            case QEMU_OPTION_no_kqemu:
8078 d993e026 bellard
                kqemu_allowed = 0;
8079 d993e026 bellard
                break;
8080 89bfc105 bellard
            case QEMU_OPTION_kernel_kqemu:
8081 89bfc105 bellard
                kqemu_allowed = 2;
8082 89bfc105 bellard
                break;
8083 d993e026 bellard
#endif
8084 bb36d470 bellard
            case QEMU_OPTION_usb:
8085 bb36d470 bellard
                usb_enabled = 1;
8086 bb36d470 bellard
                break;
8087 a594cfbf bellard
            case QEMU_OPTION_usbdevice:
8088 a594cfbf bellard
                usb_enabled = 1;
8089 0d92ed30 pbrook
                if (usb_devices_index >= MAX_USB_CMDLINE) {
8090 a594cfbf bellard
                    fprintf(stderr, "Too many USB devices\n");
8091 a594cfbf bellard
                    exit(1);
8092 a594cfbf bellard
                }
8093 a594cfbf bellard
                pstrcpy(usb_devices[usb_devices_index],
8094 a594cfbf bellard
                        sizeof(usb_devices[usb_devices_index]),
8095 a594cfbf bellard
                        optarg);
8096 a594cfbf bellard
                usb_devices_index++;
8097 a594cfbf bellard
                break;
8098 6a00d601 bellard
            case QEMU_OPTION_smp:
8099 6a00d601 bellard
                smp_cpus = atoi(optarg);
8100 ba3c64fb bellard
                if (smp_cpus < 1 || smp_cpus > MAX_CPUS) {
8101 6a00d601 bellard
                    fprintf(stderr, "Invalid number of CPUs\n");
8102 6a00d601 bellard
                    exit(1);
8103 6a00d601 bellard
                }
8104 6a00d601 bellard
                break;
8105 24236869 bellard
            case QEMU_OPTION_vnc:
8106 73fc9742 ths
                vnc_display = optarg;
8107 24236869 bellard
                break;
8108 6515b203 bellard
            case QEMU_OPTION_no_acpi:
8109 6515b203 bellard
                acpi_enabled = 0;
8110 6515b203 bellard
                break;
8111 d1beab82 bellard
            case QEMU_OPTION_no_reboot:
8112 d1beab82 bellard
                no_reboot = 1;
8113 d1beab82 bellard
                break;
8114 9467cd46 balrog
            case QEMU_OPTION_show_cursor:
8115 9467cd46 balrog
                cursor_hide = 0;
8116 9467cd46 balrog
                break;
8117 71e3ceb8 ths
            case QEMU_OPTION_daemonize:
8118 71e3ceb8 ths
                daemonize = 1;
8119 71e3ceb8 ths
                break;
8120 9ae02555 ths
            case QEMU_OPTION_option_rom:
8121 9ae02555 ths
                if (nb_option_roms >= MAX_OPTION_ROMS) {
8122 9ae02555 ths
                    fprintf(stderr, "Too many option ROMs\n");
8123 9ae02555 ths
                    exit(1);
8124 9ae02555 ths
                }
8125 9ae02555 ths
                option_rom[nb_option_roms] = optarg;
8126 9ae02555 ths
                nb_option_roms++;
8127 9ae02555 ths
                break;
8128 8e71621f pbrook
            case QEMU_OPTION_semihosting:
8129 8e71621f pbrook
                semihosting_enabled = 1;
8130 8e71621f pbrook
                break;
8131 c35734b2 ths
            case QEMU_OPTION_name:
8132 c35734b2 ths
                qemu_name = optarg;
8133 c35734b2 ths
                break;
8134 66508601 blueswir1
#ifdef TARGET_SPARC
8135 66508601 blueswir1
            case QEMU_OPTION_prom_env:
8136 66508601 blueswir1
                if (nb_prom_envs >= MAX_PROM_ENVS) {
8137 66508601 blueswir1
                    fprintf(stderr, "Too many prom variables\n");
8138 66508601 blueswir1
                    exit(1);
8139 66508601 blueswir1
                }
8140 66508601 blueswir1
                prom_envs[nb_prom_envs] = optarg;
8141 66508601 blueswir1
                nb_prom_envs++;
8142 66508601 blueswir1
                break;
8143 66508601 blueswir1
#endif
8144 2b8f2d41 balrog
#ifdef TARGET_ARM
8145 2b8f2d41 balrog
            case QEMU_OPTION_old_param:
8146 2b8f2d41 balrog
                old_param = 1;
8147 2b8f2d41 balrog
#endif
8148 f3dcfada ths
            case QEMU_OPTION_clock:
8149 f3dcfada ths
                configure_alarms(optarg);
8150 f3dcfada ths
                break;
8151 7e0af5d0 bellard
            case QEMU_OPTION_startdate:
8152 7e0af5d0 bellard
                {
8153 7e0af5d0 bellard
                    struct tm tm;
8154 7e0af5d0 bellard
                    if (!strcmp(optarg, "now")) {
8155 7e0af5d0 bellard
                        rtc_start_date = -1;
8156 7e0af5d0 bellard
                    } else {
8157 7e0af5d0 bellard
                        if (sscanf(optarg, "%d-%d-%dT%d:%d:%d",
8158 7e0af5d0 bellard
                               &tm.tm_year,
8159 7e0af5d0 bellard
                               &tm.tm_mon,
8160 7e0af5d0 bellard
                               &tm.tm_mday,
8161 7e0af5d0 bellard
                               &tm.tm_hour,
8162 7e0af5d0 bellard
                               &tm.tm_min,
8163 7e0af5d0 bellard
                               &tm.tm_sec) == 6) {
8164 7e0af5d0 bellard
                            /* OK */
8165 7e0af5d0 bellard
                        } else if (sscanf(optarg, "%d-%d-%d",
8166 7e0af5d0 bellard
                                          &tm.tm_year,
8167 7e0af5d0 bellard
                                          &tm.tm_mon,
8168 7e0af5d0 bellard
                                          &tm.tm_mday) == 3) {
8169 7e0af5d0 bellard
                            tm.tm_hour = 0;
8170 7e0af5d0 bellard
                            tm.tm_min = 0;
8171 7e0af5d0 bellard
                            tm.tm_sec = 0;
8172 7e0af5d0 bellard
                        } else {
8173 7e0af5d0 bellard
                            goto date_fail;
8174 7e0af5d0 bellard
                        }
8175 7e0af5d0 bellard
                        tm.tm_year -= 1900;
8176 7e0af5d0 bellard
                        tm.tm_mon--;
8177 3c6b2088 bellard
                        rtc_start_date = mktimegm(&tm);
8178 7e0af5d0 bellard
                        if (rtc_start_date == -1) {
8179 7e0af5d0 bellard
                        date_fail:
8180 7e0af5d0 bellard
                            fprintf(stderr, "Invalid date format. Valid format are:\n"
8181 7e0af5d0 bellard
                                    "'now' or '2006-06-17T16:01:21' or '2006-06-17'\n");
8182 7e0af5d0 bellard
                            exit(1);
8183 7e0af5d0 bellard
                        }
8184 7e0af5d0 bellard
                    }
8185 7e0af5d0 bellard
                }
8186 7e0af5d0 bellard
                break;
8187 cd6f1169 bellard
            }
8188 0824d6fc bellard
        }
8189 0824d6fc bellard
    }
8190 330d0414 bellard
8191 71e3ceb8 ths
#ifndef _WIN32
8192 71e3ceb8 ths
    if (daemonize && !nographic && vnc_display == NULL) {
8193 71e3ceb8 ths
        fprintf(stderr, "Can only daemonize if using -nographic or -vnc\n");
8194 71e3ceb8 ths
        daemonize = 0;
8195 71e3ceb8 ths
    }
8196 71e3ceb8 ths
8197 71e3ceb8 ths
    if (daemonize) {
8198 71e3ceb8 ths
        pid_t pid;
8199 71e3ceb8 ths
8200 71e3ceb8 ths
        if (pipe(fds) == -1)
8201 71e3ceb8 ths
            exit(1);
8202 71e3ceb8 ths
8203 71e3ceb8 ths
        pid = fork();
8204 71e3ceb8 ths
        if (pid > 0) {
8205 71e3ceb8 ths
            uint8_t status;
8206 71e3ceb8 ths
            ssize_t len;
8207 71e3ceb8 ths
8208 71e3ceb8 ths
            close(fds[1]);
8209 71e3ceb8 ths
8210 71e3ceb8 ths
        again:
8211 93815bc2 ths
            len = read(fds[0], &status, 1);
8212 93815bc2 ths
            if (len == -1 && (errno == EINTR))
8213 93815bc2 ths
                goto again;
8214 93815bc2 ths
8215 93815bc2 ths
            if (len != 1)
8216 93815bc2 ths
                exit(1);
8217 93815bc2 ths
            else if (status == 1) {
8218 93815bc2 ths
                fprintf(stderr, "Could not acquire pidfile\n");
8219 93815bc2 ths
                exit(1);
8220 93815bc2 ths
            } else
8221 93815bc2 ths
                exit(0);
8222 71e3ceb8 ths
        } else if (pid < 0)
8223 93815bc2 ths
            exit(1);
8224 71e3ceb8 ths
8225 71e3ceb8 ths
        setsid();
8226 71e3ceb8 ths
8227 71e3ceb8 ths
        pid = fork();
8228 71e3ceb8 ths
        if (pid > 0)
8229 71e3ceb8 ths
            exit(0);
8230 71e3ceb8 ths
        else if (pid < 0)
8231 71e3ceb8 ths
            exit(1);
8232 71e3ceb8 ths
8233 71e3ceb8 ths
        umask(027);
8234 71e3ceb8 ths
        chdir("/");
8235 71e3ceb8 ths
8236 71e3ceb8 ths
        signal(SIGTSTP, SIG_IGN);
8237 71e3ceb8 ths
        signal(SIGTTOU, SIG_IGN);
8238 71e3ceb8 ths
        signal(SIGTTIN, SIG_IGN);
8239 71e3ceb8 ths
    }
8240 71e3ceb8 ths
#endif
8241 71e3ceb8 ths
8242 aa26bb2d ths
    if (pid_file && qemu_create_pidfile(pid_file) != 0) {
8243 93815bc2 ths
        if (daemonize) {
8244 93815bc2 ths
            uint8_t status = 1;
8245 93815bc2 ths
            write(fds[1], &status, 1);
8246 93815bc2 ths
        } else
8247 93815bc2 ths
            fprintf(stderr, "Could not acquire pid file\n");
8248 93815bc2 ths
        exit(1);
8249 93815bc2 ths
    }
8250 93815bc2 ths
8251 ff3fbb30 bellard
#ifdef USE_KQEMU
8252 ff3fbb30 bellard
    if (smp_cpus > 1)
8253 ff3fbb30 bellard
        kqemu_allowed = 0;
8254 ff3fbb30 bellard
#endif
8255 a20dd508 bellard
    linux_boot = (kernel_filename != NULL);
8256 28c5af54 j_mayer
    net_boot = (boot_devices_bitmap >> ('n' - 'a')) && 0xF;
8257 28c5af54 j_mayer
    
8258 28c5af54 j_mayer
    /* XXX: this should not be: some embedded targets just have flash */
8259 28c5af54 j_mayer
    if (!linux_boot && net_boot == 0 &&
8260 5fafdf24 ths
        hd_filename[0] == '\0' &&
8261 96d30e48 ths
        (cdrom_index >= 0 && hd_filename[cdrom_index] == '\0') &&
8262 c45886db bellard
        fd_filename[0] == '\0')
8263 15f82208 ths
        help(1);
8264 0824d6fc bellard
8265 96d30e48 ths
    /* boot to floppy or the default cd if no hard disk defined yet */
8266 28c5af54 j_mayer
    if (!boot_devices[0]) {
8267 6ac0e82d balrog
        if (hd_filename[0] != '\0')
8268 28c5af54 j_mayer
            boot_devices = "c";
8269 6ac0e82d balrog
        else if (fd_filename[0] != '\0')
8270 28c5af54 j_mayer
            boot_devices = "a";
8271 96d30e48 ths
        else
8272 28c5af54 j_mayer
            boot_devices = "d";
8273 96d30e48 ths
    }
8274 b118d61e bellard
    setvbuf(stdout, NULL, _IOLBF, 0);
8275 3b46e624 ths
8276 634fce96 pbrook
    init_timers();
8277 634fce96 pbrook
    init_timer_alarm();
8278 83f64091 bellard
    qemu_aio_init();
8279 634fce96 pbrook
8280 fd1dff4b bellard
#ifdef _WIN32
8281 fd1dff4b bellard
    socket_init();
8282 fd1dff4b bellard
#endif
8283 fd1dff4b bellard
8284 7c9d8e07 bellard
    /* init network clients */
8285 7c9d8e07 bellard
    if (nb_net_clients == 0) {
8286 7c9d8e07 bellard
        /* if no clients, we use a default config */
8287 7c9d8e07 bellard
        pstrcpy(net_clients[0], sizeof(net_clients[0]),
8288 7c9d8e07 bellard
                "nic");
8289 7c9d8e07 bellard
        pstrcpy(net_clients[1], sizeof(net_clients[0]),
8290 7c9d8e07 bellard
                "user");
8291 7c9d8e07 bellard
        nb_net_clients = 2;
8292 c20709aa bellard
    }
8293 c20709aa bellard
8294 7c9d8e07 bellard
    for(i = 0;i < nb_net_clients; i++) {
8295 7c9d8e07 bellard
        if (net_client_init(net_clients[i]) < 0)
8296 7c9d8e07 bellard
            exit(1);
8297 702c651c bellard
    }
8298 833c7174 blueswir1
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
8299 833c7174 blueswir1
        if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
8300 833c7174 blueswir1
            continue;
8301 833c7174 blueswir1
        if (vlan->nb_guest_devs == 0) {
8302 833c7174 blueswir1
            fprintf(stderr, "Invalid vlan (%d) with no nics\n", vlan->id);
8303 833c7174 blueswir1
            exit(1);
8304 833c7174 blueswir1
        }
8305 833c7174 blueswir1
        if (vlan->nb_host_devs == 0)
8306 833c7174 blueswir1
            fprintf(stderr,
8307 833c7174 blueswir1
                    "Warning: vlan %d is not connected to host network\n",
8308 833c7174 blueswir1
                    vlan->id);
8309 833c7174 blueswir1
    }
8310 f1510b2c bellard
8311 eec85c2a ths
#ifdef TARGET_I386
8312 28c5af54 j_mayer
    /* XXX: this should be moved in the PC machine instanciation code */
8313 28c5af54 j_mayer
    if (net_boot != 0) {
8314 28c5af54 j_mayer
        int netroms = 0;
8315 28c5af54 j_mayer
        for (i = 0; i < nb_nics && i < 4; i++) {
8316 eec85c2a ths
            const char *model = nd_table[i].model;
8317 eec85c2a ths
            char buf[1024];
8318 28c5af54 j_mayer
            if (net_boot & (1 << i)) {
8319 28c5af54 j_mayer
                if (model == NULL)
8320 28c5af54 j_mayer
                    model = "ne2k_pci";
8321 28c5af54 j_mayer
                snprintf(buf, sizeof(buf), "%s/pxe-%s.bin", bios_dir, model);
8322 28c5af54 j_mayer
                if (get_image_size(buf) > 0) {
8323 28c5af54 j_mayer
                    if (nb_option_roms >= MAX_OPTION_ROMS) {
8324 28c5af54 j_mayer
                        fprintf(stderr, "Too many option ROMs\n");
8325 28c5af54 j_mayer
                        exit(1);
8326 28c5af54 j_mayer
                    }
8327 28c5af54 j_mayer
                    option_rom[nb_option_roms] = strdup(buf);
8328 28c5af54 j_mayer
                    nb_option_roms++;
8329 28c5af54 j_mayer
                    netroms++;
8330 28c5af54 j_mayer
                }
8331 28c5af54 j_mayer
            }
8332 eec85c2a ths
        }
8333 28c5af54 j_mayer
        if (netroms == 0) {
8334 eec85c2a ths
            fprintf(stderr, "No valid PXE rom found for network device\n");
8335 eec85c2a ths
            exit(1);
8336 eec85c2a ths
        }
8337 eec85c2a ths
    }
8338 eec85c2a ths
#endif
8339 eec85c2a ths
8340 0824d6fc bellard
    /* init the memory */
8341 970ac5a3 bellard
    phys_ram_size = ram_size + vga_ram_size + MAX_BIOS_SIZE;
8342 9ae02555 ths
8343 d993e026 bellard
    phys_ram_base = qemu_vmalloc(phys_ram_size);
8344 7f7f9873 bellard
    if (!phys_ram_base) {
8345 7f7f9873 bellard
        fprintf(stderr, "Could not allocate physical memory\n");
8346 0824d6fc bellard
        exit(1);
8347 0824d6fc bellard
    }
8348 0824d6fc bellard
8349 96d30e48 ths
    /* we always create the cdrom drive, even if no disk is there */
8350 5905b2e5 bellard
    bdrv_init();
8351 96d30e48 ths
    if (cdrom_index >= 0) {
8352 96d30e48 ths
        bs_table[cdrom_index] = bdrv_new("cdrom");
8353 96d30e48 ths
        bdrv_set_type_hint(bs_table[cdrom_index], BDRV_TYPE_CDROM);
8354 c4b1fcc0 bellard
    }
8355 c4b1fcc0 bellard
8356 96d30e48 ths
    /* open the virtual block devices */
8357 96d30e48 ths
    for(i = 0; i < MAX_DISKS; i++) {
8358 96d30e48 ths
        if (hd_filename[i]) {
8359 96d30e48 ths
            if (!bs_table[i]) {
8360 96d30e48 ths
                char buf[64];
8361 96d30e48 ths
                snprintf(buf, sizeof(buf), "hd%c", i + 'a');
8362 96d30e48 ths
                bs_table[i] = bdrv_new(buf);
8363 96d30e48 ths
            }
8364 96d30e48 ths
            if (bdrv_open(bs_table[i], hd_filename[i], snapshot ? BDRV_O_SNAPSHOT : 0) < 0) {
8365 96d30e48 ths
                fprintf(stderr, "qemu: could not open hard disk image '%s'\n",
8366 96d30e48 ths
                        hd_filename[i]);
8367 96d30e48 ths
                exit(1);
8368 96d30e48 ths
            }
8369 96d30e48 ths
            if (i == 0 && cyls != 0) {
8370 96d30e48 ths
                bdrv_set_geometry_hint(bs_table[i], cyls, heads, secs);
8371 96d30e48 ths
                bdrv_set_translation_hint(bs_table[i], translation);
8372 96d30e48 ths
            }
8373 96d30e48 ths
        }
8374 c4b1fcc0 bellard
    }
8375 c4b1fcc0 bellard
8376 c4b1fcc0 bellard
    /* we always create at least one floppy disk */
8377 c4b1fcc0 bellard
    fd_table[0] = bdrv_new("fda");
8378 c4b1fcc0 bellard
    bdrv_set_type_hint(fd_table[0], BDRV_TYPE_FLOPPY);
8379 c4b1fcc0 bellard
8380 c4b1fcc0 bellard
    for(i = 0; i < MAX_FD; i++) {
8381 c4b1fcc0 bellard
        if (fd_filename[i]) {
8382 c4b1fcc0 bellard
            if (!fd_table[i]) {
8383 c4b1fcc0 bellard
                char buf[64];
8384 c4b1fcc0 bellard
                snprintf(buf, sizeof(buf), "fd%c", i + 'a');
8385 c4b1fcc0 bellard
                fd_table[i] = bdrv_new(buf);
8386 c4b1fcc0 bellard
                bdrv_set_type_hint(fd_table[i], BDRV_TYPE_FLOPPY);
8387 c4b1fcc0 bellard
            }
8388 a1bb27b1 pbrook
            if (fd_filename[i][0] != '\0') {
8389 83f64091 bellard
                if (bdrv_open(fd_table[i], fd_filename[i],
8390 83f64091 bellard
                              snapshot ? BDRV_O_SNAPSHOT : 0) < 0) {
8391 c20709aa bellard
                    fprintf(stderr, "qemu: could not open floppy disk image '%s'\n",
8392 c4b1fcc0 bellard
                            fd_filename[i]);
8393 c4b1fcc0 bellard
                    exit(1);
8394 c4b1fcc0 bellard
                }
8395 c4b1fcc0 bellard
            }
8396 33e3963e bellard
        }
8397 33e3963e bellard
    }
8398 33e3963e bellard
8399 2bac6019 balrog
    /* Open the virtual parallel flash block devices */
8400 86f55663 j_mayer
    for(i = 0; i < MAX_PFLASH; i++) {
8401 86f55663 j_mayer
        if (pflash_filename[i]) {
8402 86f55663 j_mayer
            if (!pflash_table[i]) {
8403 86f55663 j_mayer
                char buf[64];
8404 86f55663 j_mayer
                snprintf(buf, sizeof(buf), "fl%c", i + 'a');
8405 86f55663 j_mayer
                pflash_table[i] = bdrv_new(buf);
8406 86f55663 j_mayer
            }
8407 86f55663 j_mayer
            if (bdrv_open(pflash_table[i], pflash_filename[i],
8408 86f55663 j_mayer
                          snapshot ? BDRV_O_SNAPSHOT : 0) < 0) {
8409 86f55663 j_mayer
                fprintf(stderr, "qemu: could not open flash image '%s'\n",
8410 86f55663 j_mayer
                        pflash_filename[i]);
8411 86f55663 j_mayer
                exit(1);
8412 86f55663 j_mayer
            }
8413 86f55663 j_mayer
        }
8414 86f55663 j_mayer
    }
8415 86f55663 j_mayer
8416 a1bb27b1 pbrook
    sd_bdrv = bdrv_new ("sd");
8417 a1bb27b1 pbrook
    /* FIXME: This isn't really a floppy, but it's a reasonable
8418 a1bb27b1 pbrook
       approximation.  */
8419 a1bb27b1 pbrook
    bdrv_set_type_hint(sd_bdrv, BDRV_TYPE_FLOPPY);
8420 a1bb27b1 pbrook
    if (sd_filename) {
8421 a1bb27b1 pbrook
        if (bdrv_open(sd_bdrv, sd_filename,
8422 a1bb27b1 pbrook
                      snapshot ? BDRV_O_SNAPSHOT : 0) < 0) {
8423 a1bb27b1 pbrook
            fprintf(stderr, "qemu: could not open SD card image %s\n",
8424 a1bb27b1 pbrook
                    sd_filename);
8425 2bac6019 balrog
        } else
8426 a171fe39 balrog
            qemu_key_check(sd_bdrv, sd_filename);
8427 a1bb27b1 pbrook
    }
8428 a1bb27b1 pbrook
8429 3e3d5815 balrog
    if (mtd_filename) {
8430 3e3d5815 balrog
        mtd_bdrv = bdrv_new ("mtd");
8431 3e3d5815 balrog
        if (bdrv_open(mtd_bdrv, mtd_filename,
8432 3e3d5815 balrog
                      snapshot ? BDRV_O_SNAPSHOT : 0) < 0 ||
8433 3e3d5815 balrog
            qemu_key_check(mtd_bdrv, mtd_filename)) {
8434 3e3d5815 balrog
            fprintf(stderr, "qemu: could not open Flash image %s\n",
8435 3e3d5815 balrog
                    mtd_filename);
8436 3e3d5815 balrog
            bdrv_delete(mtd_bdrv);
8437 3e3d5815 balrog
            mtd_bdrv = 0;
8438 3e3d5815 balrog
        }
8439 3e3d5815 balrog
    }
8440 3e3d5815 balrog
8441 c88676f8 bellard
    register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
8442 c88676f8 bellard
    register_savevm("ram", 0, 2, ram_save, ram_load, NULL);
8443 8a7ddc38 bellard
8444 330d0414 bellard
    init_ioports();
8445 0824d6fc bellard
8446 313aa567 bellard
    /* terminal init */
8447 740733bb ths
    memset(&display_state, 0, sizeof(display_state));
8448 a20dd508 bellard
    if (nographic) {
8449 2ff89790 ths
        /* nearly nothing to do */
8450 2ff89790 ths
        dumb_display_init(ds);
8451 73fc9742 ths
    } else if (vnc_display != NULL) {
8452 71cab5ca ths
        vnc_display_init(ds);
8453 71cab5ca ths
        if (vnc_display_open(ds, vnc_display) < 0)
8454 71cab5ca ths
            exit(1);
8455 313aa567 bellard
    } else {
8456 5b0753e0 bellard
#if defined(CONFIG_SDL)
8457 43523e93 ths
        sdl_display_init(ds, full_screen, no_frame);
8458 5b0753e0 bellard
#elif defined(CONFIG_COCOA)
8459 5b0753e0 bellard
        cocoa_display_init(ds, full_screen);
8460 313aa567 bellard
#endif
8461 313aa567 bellard
    }
8462 0824d6fc bellard
8463 20d8a3ed ths
    /* Maintain compatibility with multiple stdio monitors */
8464 20d8a3ed ths
    if (!strcmp(monitor_device,"stdio")) {
8465 20d8a3ed ths
        for (i = 0; i < MAX_SERIAL_PORTS; i++) {
8466 20d8a3ed ths
            if (!strcmp(serial_devices[i],"mon:stdio")) {
8467 20d8a3ed ths
                monitor_device[0] = '\0';
8468 20d8a3ed ths
                break;
8469 20d8a3ed ths
            } else if (!strcmp(serial_devices[i],"stdio")) {
8470 20d8a3ed ths
                monitor_device[0] = '\0';
8471 20d8a3ed ths
                pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "mon:stdio");
8472 20d8a3ed ths
                break;
8473 20d8a3ed ths
            }
8474 20d8a3ed ths
        }
8475 20d8a3ed ths
    }
8476 20d8a3ed ths
    if (monitor_device[0] != '\0') {
8477 20d8a3ed ths
        monitor_hd = qemu_chr_open(monitor_device);
8478 20d8a3ed ths
        if (!monitor_hd) {
8479 20d8a3ed ths
            fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
8480 20d8a3ed ths
            exit(1);
8481 20d8a3ed ths
        }
8482 20d8a3ed ths
        monitor_init(monitor_hd, !nographic);
8483 82c643ff bellard
    }
8484 82c643ff bellard
8485 8d11df9e bellard
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
8486 c03b0f0f bellard
        const char *devname = serial_devices[i];
8487 c03b0f0f bellard
        if (devname[0] != '\0' && strcmp(devname, "none")) {
8488 c03b0f0f bellard
            serial_hds[i] = qemu_chr_open(devname);
8489 8d11df9e bellard
            if (!serial_hds[i]) {
8490 5fafdf24 ths
                fprintf(stderr, "qemu: could not open serial device '%s'\n",
8491 c03b0f0f bellard
                        devname);
8492 8d11df9e bellard
                exit(1);
8493 8d11df9e bellard
            }
8494 af3a9031 ths
            if (strstart(devname, "vc", 0))
8495 7ba1260a bellard
                qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
8496 8d11df9e bellard
        }
8497 82c643ff bellard
    }
8498 82c643ff bellard
8499 6508fe59 bellard
    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
8500 c03b0f0f bellard
        const char *devname = parallel_devices[i];
8501 c03b0f0f bellard
        if (devname[0] != '\0' && strcmp(devname, "none")) {
8502 c03b0f0f bellard
            parallel_hds[i] = qemu_chr_open(devname);
8503 6508fe59 bellard
            if (!parallel_hds[i]) {
8504 5fafdf24 ths
                fprintf(stderr, "qemu: could not open parallel device '%s'\n",
8505 c03b0f0f bellard
                        devname);
8506 6508fe59 bellard
                exit(1);
8507 6508fe59 bellard
            }
8508 af3a9031 ths
            if (strstart(devname, "vc", 0))
8509 7ba1260a bellard
                qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
8510 6508fe59 bellard
        }
8511 6508fe59 bellard
    }
8512 6508fe59 bellard
8513 28c5af54 j_mayer
    machine->init(ram_size, vga_ram_size, boot_devices,
8514 cc1daa40 bellard
                  ds, fd_filename, snapshot,
8515 94fc95cd j_mayer
                  kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
8516 73332e5c bellard
8517 0d92ed30 pbrook
    /* init USB devices */
8518 0d92ed30 pbrook
    if (usb_enabled) {
8519 0d92ed30 pbrook
        for(i = 0; i < usb_devices_index; i++) {
8520 0d92ed30 pbrook
            if (usb_device_add(usb_devices[i]) < 0) {
8521 0d92ed30 pbrook
                fprintf(stderr, "Warning: could not add USB device %s\n",
8522 0d92ed30 pbrook
                        usb_devices[i]);
8523 0d92ed30 pbrook
            }
8524 0d92ed30 pbrook
        }
8525 0d92ed30 pbrook
    }
8526 0d92ed30 pbrook
8527 740733bb ths
    if (display_state.dpy_refresh) {
8528 740733bb ths
        display_state.gui_timer = qemu_new_timer(rt_clock, gui_update, &display_state);
8529 740733bb ths
        qemu_mod_timer(display_state.gui_timer, qemu_get_clock(rt_clock));
8530 740733bb ths
    }
8531 7f7f9873 bellard
8532 67b915a5 bellard
#ifdef CONFIG_GDBSTUB
8533 b4608c04 bellard
    if (use_gdbstub) {
8534 c636bb66 bellard
        /* XXX: use standard host:port notation and modify options
8535 c636bb66 bellard
           accordingly. */
8536 cfc3475a pbrook
        if (gdbserver_start(gdbstub_port) < 0) {
8537 cfc3475a pbrook
            fprintf(stderr, "qemu: could not open gdbstub device on port '%s'\n",
8538 c636bb66 bellard
                    gdbstub_port);
8539 8a7ddc38 bellard
            exit(1);
8540 8a7ddc38 bellard
        }
8541 45669e00 balrog
    }
8542 67b915a5 bellard
#endif
8543 45669e00 balrog
8544 d63d307f bellard
    if (loadvm)
8545 faea38e7 bellard
        do_loadvm(loadvm);
8546 d63d307f bellard
8547 67b915a5 bellard
    {
8548 5905b2e5 bellard
        /* XXX: simplify init */
8549 5905b2e5 bellard
        read_passwords();
8550 3c07f8e8 pbrook
        if (autostart) {
8551 5905b2e5 bellard
            vm_start();
8552 5905b2e5 bellard
        }
8553 0824d6fc bellard
    }
8554 ffd843bc ths
8555 71e3ceb8 ths
    if (daemonize) {
8556 71e3ceb8 ths
        uint8_t status = 0;
8557 71e3ceb8 ths
        ssize_t len;
8558 71e3ceb8 ths
        int fd;
8559 71e3ceb8 ths
8560 71e3ceb8 ths
    again1:
8561 71e3ceb8 ths
        len = write(fds[1], &status, 1);
8562 71e3ceb8 ths
        if (len == -1 && (errno == EINTR))
8563 71e3ceb8 ths
            goto again1;
8564 71e3ceb8 ths
8565 71e3ceb8 ths
        if (len != 1)
8566 71e3ceb8 ths
            exit(1);
8567 71e3ceb8 ths
8568 aeb30be6 balrog
        TFR(fd = open("/dev/null", O_RDWR));
8569 71e3ceb8 ths
        if (fd == -1)
8570 71e3ceb8 ths
            exit(1);
8571 71e3ceb8 ths
8572 71e3ceb8 ths
        dup2(fd, 0);
8573 71e3ceb8 ths
        dup2(fd, 1);
8574 71e3ceb8 ths
        dup2(fd, 2);
8575 71e3ceb8 ths
8576 71e3ceb8 ths
        close(fd);
8577 71e3ceb8 ths
    }
8578 71e3ceb8 ths
8579 8a7ddc38 bellard
    main_loop();
8580 40c3bac3 bellard
    quit_timers();
8581 b46a8906 ths
8582 7d294b61 ths
#if !defined(_WIN32)
8583 b46a8906 ths
    /* close network clients */
8584 b46a8906 ths
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
8585 b46a8906 ths
        VLANClientState *vc;
8586 b46a8906 ths
8587 7d294b61 ths
        for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
8588 b46a8906 ths
            if (vc->fd_read == tap_receive) {
8589 b46a8906 ths
                char ifname[64];
8590 b46a8906 ths
                TAPState *s = vc->opaque;
8591 b46a8906 ths
8592 b46a8906 ths
                if (sscanf(vc->info_str, "tap: ifname=%63s ", ifname) == 1 &&
8593 b46a8906 ths
                    s->down_script[0])
8594 b46a8906 ths
                    launch_script(s->down_script, ifname, s->fd);
8595 b46a8906 ths
            }
8596 b46a8906 ths
    }
8597 7d294b61 ths
    }
8598 7d294b61 ths
#endif
8599 0824d6fc bellard
    return 0;
8600 0824d6fc bellard
}