Statistics
| Branch: | Revision:

root / vl.c @ b227a8e9

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

6411 c88676f8 bellard
            /* find if the memory block is available on a virtual
6412 c88676f8 bellard
               block device */
6413 c88676f8 bellard
            sector_num = -1;
6414 c88676f8 bellard
            for(j = 0; j < MAX_DISKS; j++) {
6415 c88676f8 bellard
                if (bs_table[j]) {
6416 5fafdf24 ths
                    sector_num = bdrv_hash_find(bs_table[j],
6417 c88676f8 bellard
                                                phys_ram_base + i, BDRV_HASH_BLOCK_SIZE);
6418 c88676f8 bellard
                    if (sector_num >= 0)
6419 c88676f8 bellard
                        break;
6420 c88676f8 bellard
                }
6421 c88676f8 bellard
            }
6422 c88676f8 bellard
            if (j == MAX_DISKS)
6423 c88676f8 bellard
                goto normal_compress;
6424 c88676f8 bellard
            buf[0] = 1;
6425 c88676f8 bellard
            buf[1] = j;
6426 c88676f8 bellard
            cpu_to_be64wu((uint64_t *)(buf + 2), sector_num);
6427 c88676f8 bellard
            ram_compress_buf(s, buf, 10);
6428 5fafdf24 ths
        } else
6429 c88676f8 bellard
#endif
6430 c88676f8 bellard
        {
6431 c88676f8 bellard
            //        normal_compress:
6432 c88676f8 bellard
            buf[0] = 0;
6433 c88676f8 bellard
            ram_compress_buf(s, buf, 1);
6434 c88676f8 bellard
            ram_compress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE);
6435 c88676f8 bellard
        }
6436 8a7ddc38 bellard
    }
6437 c88676f8 bellard
    ram_compress_close(s);
6438 8a7ddc38 bellard
}
6439 8a7ddc38 bellard
6440 8a7ddc38 bellard
static int ram_load(QEMUFile *f, void *opaque, int version_id)
6441 8a7ddc38 bellard
{
6442 c88676f8 bellard
    RamDecompressState s1, *s = &s1;
6443 c88676f8 bellard
    uint8_t buf[10];
6444 c88676f8 bellard
    int i;
6445 8a7ddc38 bellard
6446 c88676f8 bellard
    if (version_id == 1)
6447 c88676f8 bellard
        return ram_load_v1(f, opaque);
6448 c88676f8 bellard
    if (version_id != 2)
6449 8a7ddc38 bellard
        return -EINVAL;
6450 8a7ddc38 bellard
    if (qemu_get_be32(f) != phys_ram_size)
6451 8a7ddc38 bellard
        return -EINVAL;
6452 c88676f8 bellard
    if (ram_decompress_open(s, f) < 0)
6453 c88676f8 bellard
        return -EINVAL;
6454 c88676f8 bellard
    for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
6455 c88676f8 bellard
        if (ram_decompress_buf(s, buf, 1) < 0) {
6456 c88676f8 bellard
            fprintf(stderr, "Error while reading ram block header\n");
6457 c88676f8 bellard
            goto error;
6458 c88676f8 bellard
        }
6459 c88676f8 bellard
        if (buf[0] == 0) {
6460 c88676f8 bellard
            if (ram_decompress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE) < 0) {
6461 c88676f8 bellard
                fprintf(stderr, "Error while reading ram block address=0x%08x", i);
6462 c88676f8 bellard
                goto error;
6463 c88676f8 bellard
            }
6464 5fafdf24 ths
        } else
6465 c88676f8 bellard
#if 0
6466 c88676f8 bellard
        if (buf[0] == 1) {
6467 c88676f8 bellard
            int bs_index;
6468 c88676f8 bellard
            int64_t sector_num;
6469 c88676f8 bellard

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