Statistics
| Branch: | Revision:

root / vl.c @ 1ae26a18

History | View | Annotate | Download (241.8 kB)

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

7054 c88676f8 bellard
            /* find if the memory block is available on a virtual
7055 c88676f8 bellard
               block device */
7056 c88676f8 bellard
            sector_num = -1;
7057 e4bcb14c ths
            for(j = 0; j < nb_drives; j++) {
7058 e4bcb14c ths
                sector_num = bdrv_hash_find(drives_table[j].bdrv,
7059 e4bcb14c ths
                                            phys_ram_base + i,
7060 e4bcb14c ths
                                            BDRV_HASH_BLOCK_SIZE);
7061 e4bcb14c ths
                if (sector_num >= 0)
7062 e4bcb14c ths
                    break;
7063 c88676f8 bellard
            }
7064 e4bcb14c ths
            if (j == nb_drives)
7065 c88676f8 bellard
                goto normal_compress;
7066 c88676f8 bellard
            buf[0] = 1;
7067 c88676f8 bellard
            buf[1] = j;
7068 c88676f8 bellard
            cpu_to_be64wu((uint64_t *)(buf + 2), sector_num);
7069 c88676f8 bellard
            ram_compress_buf(s, buf, 10);
7070 5fafdf24 ths
        } else
7071 c88676f8 bellard
#endif
7072 c88676f8 bellard
        {
7073 c88676f8 bellard
            //        normal_compress:
7074 c88676f8 bellard
            buf[0] = 0;
7075 c88676f8 bellard
            ram_compress_buf(s, buf, 1);
7076 c88676f8 bellard
            ram_compress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE);
7077 c88676f8 bellard
        }
7078 8a7ddc38 bellard
    }
7079 c88676f8 bellard
    ram_compress_close(s);
7080 8a7ddc38 bellard
}
7081 8a7ddc38 bellard
7082 8a7ddc38 bellard
static int ram_load(QEMUFile *f, void *opaque, int version_id)
7083 8a7ddc38 bellard
{
7084 c88676f8 bellard
    RamDecompressState s1, *s = &s1;
7085 c88676f8 bellard
    uint8_t buf[10];
7086 00f82b8a aurel32
    ram_addr_t i;
7087 8a7ddc38 bellard
7088 c88676f8 bellard
    if (version_id == 1)
7089 c88676f8 bellard
        return ram_load_v1(f, opaque);
7090 c88676f8 bellard
    if (version_id != 2)
7091 8a7ddc38 bellard
        return -EINVAL;
7092 8a7ddc38 bellard
    if (qemu_get_be32(f) != phys_ram_size)
7093 8a7ddc38 bellard
        return -EINVAL;
7094 c88676f8 bellard
    if (ram_decompress_open(s, f) < 0)
7095 c88676f8 bellard
        return -EINVAL;
7096 c88676f8 bellard
    for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
7097 c88676f8 bellard
        if (ram_decompress_buf(s, buf, 1) < 0) {
7098 c88676f8 bellard
            fprintf(stderr, "Error while reading ram block header\n");
7099 c88676f8 bellard
            goto error;
7100 c88676f8 bellard
        }
7101 c88676f8 bellard
        if (buf[0] == 0) {
7102 c88676f8 bellard
            if (ram_decompress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE) < 0) {
7103 00f82b8a aurel32
                fprintf(stderr, "Error while reading ram block address=0x%08" PRIx64, (uint64_t)i);
7104 c88676f8 bellard
                goto error;
7105 c88676f8 bellard
            }
7106 5fafdf24 ths
        } else
7107 c88676f8 bellard
#if 0
7108 c88676f8 bellard
        if (buf[0] == 1) {
7109 c88676f8 bellard
            int bs_index;
7110 c88676f8 bellard
            int64_t sector_num;
7111 c88676f8 bellard

7112 c88676f8 bellard
            ram_decompress_buf(s, buf + 1, 9);
7113 c88676f8 bellard
            bs_index = buf[1];
7114 c88676f8 bellard
            sector_num = be64_to_cpupu((const uint64_t *)(buf + 2));
7115 e4bcb14c ths
            if (bs_index >= nb_drives) {
7116 c88676f8 bellard
                fprintf(stderr, "Invalid block device index %d\n", bs_index);
7117 c88676f8 bellard
                goto error;
7118 c88676f8 bellard
            }
7119 e4bcb14c ths
            if (bdrv_read(drives_table[bs_index].bdrv, sector_num,
7120 e4bcb14c ths
                          phys_ram_base + i,
7121 c88676f8 bellard
                          BDRV_HASH_BLOCK_SIZE / 512) < 0) {
7122 5fafdf24 ths
                fprintf(stderr, "Error while reading sector %d:%" PRId64 "\n",
7123 c88676f8 bellard
                        bs_index, sector_num);
7124 c88676f8 bellard
                goto error;
7125 c88676f8 bellard
            }
7126 5fafdf24 ths
        } else
7127 c88676f8 bellard
#endif
7128 c88676f8 bellard
        {
7129 c88676f8 bellard
        error:
7130 c88676f8 bellard
            printf("Error block header\n");
7131 c88676f8 bellard
            return -EINVAL;
7132 c88676f8 bellard
        }
7133 8a7ddc38 bellard
    }
7134 c88676f8 bellard
    ram_decompress_close(s);
7135 8a7ddc38 bellard
    return 0;
7136 8a7ddc38 bellard
}
7137 8a7ddc38 bellard
7138 8a7ddc38 bellard
/***********************************************************/
7139 83f64091 bellard
/* bottom halves (can be seen as timers which expire ASAP) */
7140 83f64091 bellard
7141 83f64091 bellard
struct QEMUBH {
7142 83f64091 bellard
    QEMUBHFunc *cb;
7143 83f64091 bellard
    void *opaque;
7144 83f64091 bellard
    int scheduled;
7145 83f64091 bellard
    QEMUBH *next;
7146 83f64091 bellard
};
7147 83f64091 bellard
7148 83f64091 bellard
static QEMUBH *first_bh = NULL;
7149 83f64091 bellard
7150 83f64091 bellard
QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
7151 83f64091 bellard
{
7152 83f64091 bellard
    QEMUBH *bh;
7153 83f64091 bellard
    bh = qemu_mallocz(sizeof(QEMUBH));
7154 83f64091 bellard
    if (!bh)
7155 83f64091 bellard
        return NULL;
7156 83f64091 bellard
    bh->cb = cb;
7157 83f64091 bellard
    bh->opaque = opaque;
7158 83f64091 bellard
    return bh;
7159 83f64091 bellard
}
7160 83f64091 bellard
7161 6eb5733a bellard
int qemu_bh_poll(void)
7162 83f64091 bellard
{
7163 83f64091 bellard
    QEMUBH *bh, **pbh;
7164 6eb5733a bellard
    int ret;
7165 83f64091 bellard
7166 6eb5733a bellard
    ret = 0;
7167 83f64091 bellard
    for(;;) {
7168 83f64091 bellard
        pbh = &first_bh;
7169 83f64091 bellard
        bh = *pbh;
7170 83f64091 bellard
        if (!bh)
7171 83f64091 bellard
            break;
7172 6eb5733a bellard
        ret = 1;
7173 83f64091 bellard
        *pbh = bh->next;
7174 83f64091 bellard
        bh->scheduled = 0;
7175 83f64091 bellard
        bh->cb(bh->opaque);
7176 83f64091 bellard
    }
7177 6eb5733a bellard
    return ret;
7178 83f64091 bellard
}
7179 83f64091 bellard
7180 83f64091 bellard
void qemu_bh_schedule(QEMUBH *bh)
7181 83f64091 bellard
{
7182 83f64091 bellard
    CPUState *env = cpu_single_env;
7183 83f64091 bellard
    if (bh->scheduled)
7184 83f64091 bellard
        return;
7185 83f64091 bellard
    bh->scheduled = 1;
7186 83f64091 bellard
    bh->next = first_bh;
7187 83f64091 bellard
    first_bh = bh;
7188 83f64091 bellard
7189 83f64091 bellard
    /* stop the currently executing CPU to execute the BH ASAP */
7190 83f64091 bellard
    if (env) {
7191 83f64091 bellard
        cpu_interrupt(env, CPU_INTERRUPT_EXIT);
7192 83f64091 bellard
    }
7193 83f64091 bellard
}
7194 83f64091 bellard
7195 83f64091 bellard
void qemu_bh_cancel(QEMUBH *bh)
7196 83f64091 bellard
{
7197 83f64091 bellard
    QEMUBH **pbh;
7198 83f64091 bellard
    if (bh->scheduled) {
7199 83f64091 bellard
        pbh = &first_bh;
7200 83f64091 bellard
        while (*pbh != bh)
7201 83f64091 bellard
            pbh = &(*pbh)->next;
7202 83f64091 bellard
        *pbh = bh->next;
7203 83f64091 bellard
        bh->scheduled = 0;
7204 83f64091 bellard
    }
7205 83f64091 bellard
}
7206 83f64091 bellard
7207 83f64091 bellard
void qemu_bh_delete(QEMUBH *bh)
7208 83f64091 bellard
{
7209 83f64091 bellard
    qemu_bh_cancel(bh);
7210 83f64091 bellard
    qemu_free(bh);
7211 83f64091 bellard
}
7212 83f64091 bellard
7213 83f64091 bellard
/***********************************************************/
7214 cc1daa40 bellard
/* machine registration */
7215 cc1daa40 bellard
7216 cc1daa40 bellard
QEMUMachine *first_machine = NULL;
7217 cc1daa40 bellard
7218 cc1daa40 bellard
int qemu_register_machine(QEMUMachine *m)
7219 cc1daa40 bellard
{
7220 cc1daa40 bellard
    QEMUMachine **pm;
7221 cc1daa40 bellard
    pm = &first_machine;
7222 cc1daa40 bellard
    while (*pm != NULL)
7223 cc1daa40 bellard
        pm = &(*pm)->next;
7224 cc1daa40 bellard
    m->next = NULL;
7225 cc1daa40 bellard
    *pm = m;
7226 cc1daa40 bellard
    return 0;
7227 cc1daa40 bellard
}
7228 cc1daa40 bellard
7229 9596ebb7 pbrook
static QEMUMachine *find_machine(const char *name)
7230 cc1daa40 bellard
{
7231 cc1daa40 bellard
    QEMUMachine *m;
7232 cc1daa40 bellard
7233 cc1daa40 bellard
    for(m = first_machine; m != NULL; m = m->next) {
7234 cc1daa40 bellard
        if (!strcmp(m->name, name))
7235 cc1daa40 bellard
            return m;
7236 cc1daa40 bellard
    }
7237 cc1daa40 bellard
    return NULL;
7238 cc1daa40 bellard
}
7239 cc1daa40 bellard
7240 cc1daa40 bellard
/***********************************************************/
7241 8a7ddc38 bellard
/* main execution loop */
7242 8a7ddc38 bellard
7243 9596ebb7 pbrook
static void gui_update(void *opaque)
7244 8a7ddc38 bellard
{
7245 740733bb ths
    DisplayState *ds = opaque;
7246 740733bb ths
    ds->dpy_refresh(ds);
7247 f442e08b aurel32
    qemu_mod_timer(ds->gui_timer,
7248 f442e08b aurel32
        (ds->gui_timer_interval ?
7249 f442e08b aurel32
            ds->gui_timer_interval :
7250 f442e08b aurel32
            GUI_REFRESH_INTERVAL)
7251 f442e08b aurel32
        + qemu_get_clock(rt_clock));
7252 8a7ddc38 bellard
}
7253 8a7ddc38 bellard
7254 0bd48850 bellard
struct vm_change_state_entry {
7255 0bd48850 bellard
    VMChangeStateHandler *cb;
7256 0bd48850 bellard
    void *opaque;
7257 0bd48850 bellard
    LIST_ENTRY (vm_change_state_entry) entries;
7258 0bd48850 bellard
};
7259 0bd48850 bellard
7260 0bd48850 bellard
static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
7261 0bd48850 bellard
7262 0bd48850 bellard
VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
7263 0bd48850 bellard
                                                     void *opaque)
7264 0bd48850 bellard
{
7265 0bd48850 bellard
    VMChangeStateEntry *e;
7266 0bd48850 bellard
7267 0bd48850 bellard
    e = qemu_mallocz(sizeof (*e));
7268 0bd48850 bellard
    if (!e)
7269 0bd48850 bellard
        return NULL;
7270 0bd48850 bellard
7271 0bd48850 bellard
    e->cb = cb;
7272 0bd48850 bellard
    e->opaque = opaque;
7273 0bd48850 bellard
    LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
7274 0bd48850 bellard
    return e;
7275 0bd48850 bellard
}
7276 0bd48850 bellard
7277 0bd48850 bellard
void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
7278 0bd48850 bellard
{
7279 0bd48850 bellard
    LIST_REMOVE (e, entries);
7280 0bd48850 bellard
    qemu_free (e);
7281 0bd48850 bellard
}
7282 0bd48850 bellard
7283 0bd48850 bellard
static void vm_state_notify(int running)
7284 0bd48850 bellard
{
7285 0bd48850 bellard
    VMChangeStateEntry *e;
7286 0bd48850 bellard
7287 0bd48850 bellard
    for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
7288 0bd48850 bellard
        e->cb(e->opaque, running);
7289 0bd48850 bellard
    }
7290 0bd48850 bellard
}
7291 0bd48850 bellard
7292 8a7ddc38 bellard
/* XXX: support several handlers */
7293 0bd48850 bellard
static VMStopHandler *vm_stop_cb;
7294 0bd48850 bellard
static void *vm_stop_opaque;
7295 8a7ddc38 bellard
7296 8a7ddc38 bellard
int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
7297 8a7ddc38 bellard
{
7298 8a7ddc38 bellard
    vm_stop_cb = cb;
7299 8a7ddc38 bellard
    vm_stop_opaque = opaque;
7300 8a7ddc38 bellard
    return 0;
7301 8a7ddc38 bellard
}
7302 8a7ddc38 bellard
7303 8a7ddc38 bellard
void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
7304 8a7ddc38 bellard
{
7305 8a7ddc38 bellard
    vm_stop_cb = NULL;
7306 8a7ddc38 bellard
}
7307 8a7ddc38 bellard
7308 8a7ddc38 bellard
void vm_start(void)
7309 8a7ddc38 bellard
{
7310 8a7ddc38 bellard
    if (!vm_running) {
7311 8a7ddc38 bellard
        cpu_enable_ticks();
7312 8a7ddc38 bellard
        vm_running = 1;
7313 0bd48850 bellard
        vm_state_notify(1);
7314 efe75411 ths
        qemu_rearm_alarm_timer(alarm_timer);
7315 8a7ddc38 bellard
    }
7316 8a7ddc38 bellard
}
7317 8a7ddc38 bellard
7318 5fafdf24 ths
void vm_stop(int reason)
7319 8a7ddc38 bellard
{
7320 8a7ddc38 bellard
    if (vm_running) {
7321 8a7ddc38 bellard
        cpu_disable_ticks();
7322 8a7ddc38 bellard
        vm_running = 0;
7323 8a7ddc38 bellard
        if (reason != 0) {
7324 8a7ddc38 bellard
            if (vm_stop_cb) {
7325 8a7ddc38 bellard
                vm_stop_cb(vm_stop_opaque, reason);
7326 8a7ddc38 bellard
            }
7327 34865134 bellard
        }
7328 0bd48850 bellard
        vm_state_notify(0);
7329 8a7ddc38 bellard
    }
7330 8a7ddc38 bellard
}
7331 8a7ddc38 bellard
7332 bb0c6722 bellard
/* reset/shutdown handler */
7333 bb0c6722 bellard
7334 bb0c6722 bellard
typedef struct QEMUResetEntry {
7335 bb0c6722 bellard
    QEMUResetHandler *func;
7336 bb0c6722 bellard
    void *opaque;
7337 bb0c6722 bellard
    struct QEMUResetEntry *next;
7338 bb0c6722 bellard
} QEMUResetEntry;
7339 bb0c6722 bellard
7340 bb0c6722 bellard
static QEMUResetEntry *first_reset_entry;
7341 bb0c6722 bellard
static int reset_requested;
7342 bb0c6722 bellard
static int shutdown_requested;
7343 3475187d bellard
static int powerdown_requested;
7344 bb0c6722 bellard
7345 cf7a2fe2 aurel32
int qemu_shutdown_requested(void)
7346 cf7a2fe2 aurel32
{
7347 cf7a2fe2 aurel32
    int r = shutdown_requested;
7348 cf7a2fe2 aurel32
    shutdown_requested = 0;
7349 cf7a2fe2 aurel32
    return r;
7350 cf7a2fe2 aurel32
}
7351 cf7a2fe2 aurel32
7352 cf7a2fe2 aurel32
int qemu_reset_requested(void)
7353 cf7a2fe2 aurel32
{
7354 cf7a2fe2 aurel32
    int r = reset_requested;
7355 cf7a2fe2 aurel32
    reset_requested = 0;
7356 cf7a2fe2 aurel32
    return r;
7357 cf7a2fe2 aurel32
}
7358 cf7a2fe2 aurel32
7359 cf7a2fe2 aurel32
int qemu_powerdown_requested(void)
7360 cf7a2fe2 aurel32
{
7361 cf7a2fe2 aurel32
    int r = powerdown_requested;
7362 cf7a2fe2 aurel32
    powerdown_requested = 0;
7363 cf7a2fe2 aurel32
    return r;
7364 cf7a2fe2 aurel32
}
7365 cf7a2fe2 aurel32
7366 bb0c6722 bellard
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
7367 bb0c6722 bellard
{
7368 bb0c6722 bellard
    QEMUResetEntry **pre, *re;
7369 bb0c6722 bellard
7370 bb0c6722 bellard
    pre = &first_reset_entry;
7371 bb0c6722 bellard
    while (*pre != NULL)
7372 bb0c6722 bellard
        pre = &(*pre)->next;
7373 bb0c6722 bellard
    re = qemu_mallocz(sizeof(QEMUResetEntry));
7374 bb0c6722 bellard
    re->func = func;
7375 bb0c6722 bellard
    re->opaque = opaque;
7376 bb0c6722 bellard
    re->next = NULL;
7377 bb0c6722 bellard
    *pre = re;
7378 bb0c6722 bellard
}
7379 bb0c6722 bellard
7380 cf7a2fe2 aurel32
void qemu_system_reset(void)
7381 bb0c6722 bellard
{
7382 bb0c6722 bellard
    QEMUResetEntry *re;
7383 bb0c6722 bellard
7384 bb0c6722 bellard
    /* reset all devices */
7385 bb0c6722 bellard
    for(re = first_reset_entry; re != NULL; re = re->next) {
7386 bb0c6722 bellard
        re->func(re->opaque);
7387 bb0c6722 bellard
    }
7388 bb0c6722 bellard
}
7389 bb0c6722 bellard
7390 bb0c6722 bellard
void qemu_system_reset_request(void)
7391 bb0c6722 bellard
{
7392 d1beab82 bellard
    if (no_reboot) {
7393 d1beab82 bellard
        shutdown_requested = 1;
7394 d1beab82 bellard
    } else {
7395 d1beab82 bellard
        reset_requested = 1;
7396 d1beab82 bellard
    }
7397 6a00d601 bellard
    if (cpu_single_env)
7398 6a00d601 bellard
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
7399 bb0c6722 bellard
}
7400 bb0c6722 bellard
7401 bb0c6722 bellard
void qemu_system_shutdown_request(void)
7402 bb0c6722 bellard
{
7403 bb0c6722 bellard
    shutdown_requested = 1;
7404 6a00d601 bellard
    if (cpu_single_env)
7405 6a00d601 bellard
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
7406 bb0c6722 bellard
}
7407 bb0c6722 bellard
7408 3475187d bellard
void qemu_system_powerdown_request(void)
7409 3475187d bellard
{
7410 3475187d bellard
    powerdown_requested = 1;
7411 6a00d601 bellard
    if (cpu_single_env)
7412 6a00d601 bellard
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
7413 bb0c6722 bellard
}
7414 bb0c6722 bellard
7415 5905b2e5 bellard
void main_loop_wait(int timeout)
7416 8a7ddc38 bellard
{
7417 cafffd40 ths
    IOHandlerRecord *ioh;
7418 e035649e bellard
    fd_set rfds, wfds, xfds;
7419 877cf882 ths
    int ret, nfds;
7420 877cf882 ths
#ifdef _WIN32
7421 877cf882 ths
    int ret2, i;
7422 877cf882 ths
#endif
7423 fd1dff4b bellard
    struct timeval tv;
7424 f331110f bellard
    PollingEntry *pe;
7425 f331110f bellard
7426 c4b1fcc0 bellard
7427 f331110f bellard
    /* XXX: need to suppress polling by better using win32 events */
7428 f331110f bellard
    ret = 0;
7429 f331110f bellard
    for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
7430 f331110f bellard
        ret |= pe->func(pe->opaque);
7431 f331110f bellard
    }
7432 38e205a2 bellard
#ifdef _WIN32
7433 e6b1e558 ths
    if (ret == 0) {
7434 a18e524a bellard
        int err;
7435 a18e524a bellard
        WaitObjects *w = &wait_objects;
7436 3b46e624 ths
7437 a18e524a bellard
        ret = WaitForMultipleObjects(w->num, w->events, FALSE, timeout);
7438 a18e524a bellard
        if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
7439 a18e524a bellard
            if (w->func[ret - WAIT_OBJECT_0])
7440 a18e524a bellard
                w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
7441 3b46e624 ths
7442 5fafdf24 ths
            /* Check for additional signaled events */
7443 e6b1e558 ths
            for(i = (ret - WAIT_OBJECT_0 + 1); i < w->num; i++) {
7444 3b46e624 ths
7445 e6b1e558 ths
                /* Check if event is signaled */
7446 e6b1e558 ths
                ret2 = WaitForSingleObject(w->events[i], 0);
7447 e6b1e558 ths
                if(ret2 == WAIT_OBJECT_0) {
7448 e6b1e558 ths
                    if (w->func[i])
7449 e6b1e558 ths
                        w->func[i](w->opaque[i]);
7450 e6b1e558 ths
                } else if (ret2 == WAIT_TIMEOUT) {
7451 e6b1e558 ths
                } else {
7452 e6b1e558 ths
                    err = GetLastError();
7453 e6b1e558 ths
                    fprintf(stderr, "WaitForSingleObject error %d %d\n", i, err);
7454 3b46e624 ths
                }
7455 3b46e624 ths
            }
7456 a18e524a bellard
        } else if (ret == WAIT_TIMEOUT) {
7457 a18e524a bellard
        } else {
7458 a18e524a bellard
            err = GetLastError();
7459 e6b1e558 ths
            fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
7460 a18e524a bellard
        }
7461 f331110f bellard
    }
7462 fd1dff4b bellard
#endif
7463 fd1dff4b bellard
    /* poll any events */
7464 fd1dff4b bellard
    /* XXX: separate device handlers from system ones */
7465 fd1dff4b bellard
    nfds = -1;
7466 fd1dff4b bellard
    FD_ZERO(&rfds);
7467 fd1dff4b bellard
    FD_ZERO(&wfds);
7468 e035649e bellard
    FD_ZERO(&xfds);
7469 fd1dff4b bellard
    for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
7470 cafffd40 ths
        if (ioh->deleted)
7471 cafffd40 ths
            continue;
7472 fd1dff4b bellard
        if (ioh->fd_read &&
7473 fd1dff4b bellard
            (!ioh->fd_read_poll ||
7474 fd1dff4b bellard
             ioh->fd_read_poll(ioh->opaque) != 0)) {
7475 fd1dff4b bellard
            FD_SET(ioh->fd, &rfds);
7476 fd1dff4b bellard
            if (ioh->fd > nfds)
7477 fd1dff4b bellard
                nfds = ioh->fd;
7478 fd1dff4b bellard
        }
7479 fd1dff4b bellard
        if (ioh->fd_write) {
7480 fd1dff4b bellard
            FD_SET(ioh->fd, &wfds);
7481 fd1dff4b bellard
            if (ioh->fd > nfds)
7482 fd1dff4b bellard
                nfds = ioh->fd;
7483 fd1dff4b bellard
        }
7484 fd1dff4b bellard
    }
7485 3b46e624 ths
7486 fd1dff4b bellard
    tv.tv_sec = 0;
7487 fd1dff4b bellard
#ifdef _WIN32
7488 fd1dff4b bellard
    tv.tv_usec = 0;
7489 38e205a2 bellard
#else
7490 fd1dff4b bellard
    tv.tv_usec = timeout * 1000;
7491 fd1dff4b bellard
#endif
7492 e035649e bellard
#if defined(CONFIG_SLIRP)
7493 e035649e bellard
    if (slirp_inited) {
7494 e035649e bellard
        slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
7495 e035649e bellard
    }
7496 e035649e bellard
#endif
7497 e035649e bellard
    ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
7498 fd1dff4b bellard
    if (ret > 0) {
7499 cafffd40 ths
        IOHandlerRecord **pioh;
7500 cafffd40 ths
7501 cafffd40 ths
        for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
7502 6ab43fdc ths
            if (!ioh->deleted && ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) {
7503 fd1dff4b bellard
                ioh->fd_read(ioh->opaque);
7504 7c9d8e07 bellard
            }
7505 6ab43fdc ths
            if (!ioh->deleted && ioh->fd_write && FD_ISSET(ioh->fd, &wfds)) {
7506 fd1dff4b bellard
                ioh->fd_write(ioh->opaque);
7507 c4b1fcc0 bellard
            }
7508 b4608c04 bellard
        }
7509 cafffd40 ths
7510 cafffd40 ths
        /* remove deleted IO handlers */
7511 cafffd40 ths
        pioh = &first_io_handler;
7512 cafffd40 ths
        while (*pioh) {
7513 cafffd40 ths
            ioh = *pioh;
7514 cafffd40 ths
            if (ioh->deleted) {
7515 cafffd40 ths
                *pioh = ioh->next;
7516 cafffd40 ths
                qemu_free(ioh);
7517 5fafdf24 ths
            } else
7518 cafffd40 ths
                pioh = &ioh->next;
7519 cafffd40 ths
        }
7520 fd1dff4b bellard
    }
7521 c20709aa bellard
#if defined(CONFIG_SLIRP)
7522 fd1dff4b bellard
    if (slirp_inited) {
7523 e035649e bellard
        if (ret < 0) {
7524 e035649e bellard
            FD_ZERO(&rfds);
7525 e035649e bellard
            FD_ZERO(&wfds);
7526 e035649e bellard
            FD_ZERO(&xfds);
7527 c20709aa bellard
        }
7528 e035649e bellard
        slirp_select_poll(&rfds, &wfds, &xfds);
7529 fd1dff4b bellard
    }
7530 c20709aa bellard
#endif
7531 c20709aa bellard
7532 fd1dff4b bellard
    if (vm_running) {
7533 21b20814 edgar_igl
        if (likely(!(cur_cpu->singlestep_enabled & SSTEP_NOTIMER)))
7534 5fafdf24 ths
        qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
7535 fd1dff4b bellard
                        qemu_get_clock(vm_clock));
7536 fd1dff4b bellard
        /* run dma transfers, if any */
7537 fd1dff4b bellard
        DMA_run();
7538 fd1dff4b bellard
    }
7539 423f0742 pbrook
7540 fd1dff4b bellard
    /* real time timers */
7541 5fafdf24 ths
    qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
7542 fd1dff4b bellard
                    qemu_get_clock(rt_clock));
7543 423f0742 pbrook
7544 d5d08334 balrog
    if (alarm_timer->flags & ALARM_FLAG_EXPIRED) {
7545 d5d08334 balrog
        alarm_timer->flags &= ~(ALARM_FLAG_EXPIRED);
7546 d5d08334 balrog
        qemu_rearm_alarm_timer(alarm_timer);
7547 d5d08334 balrog
    }
7548 b99dc0d1 balrog
7549 423f0742 pbrook
    /* Check bottom-halves last in case any of the earlier events triggered
7550 423f0742 pbrook
       them.  */
7551 423f0742 pbrook
    qemu_bh_poll();
7552 3b46e624 ths
7553 5905b2e5 bellard
}
7554 5905b2e5 bellard
7555 9596ebb7 pbrook
static int main_loop(void)
7556 5905b2e5 bellard
{
7557 5905b2e5 bellard
    int ret, timeout;
7558 89bfc105 bellard
#ifdef CONFIG_PROFILER
7559 89bfc105 bellard
    int64_t ti;
7560 89bfc105 bellard
#endif
7561 6a00d601 bellard
    CPUState *env;
7562 5905b2e5 bellard
7563 6a00d601 bellard
    cur_cpu = first_cpu;
7564 ee5605e5 balrog
    next_cpu = cur_cpu->next_cpu ?: first_cpu;
7565 5905b2e5 bellard
    for(;;) {
7566 5905b2e5 bellard
        if (vm_running) {
7567 15a76449 bellard
7568 15a76449 bellard
            for(;;) {
7569 15a76449 bellard
                /* get next cpu */
7570 ee5605e5 balrog
                env = next_cpu;
7571 89bfc105 bellard
#ifdef CONFIG_PROFILER
7572 89bfc105 bellard
                ti = profile_getclock();
7573 89bfc105 bellard
#endif
7574 2e70f6ef pbrook
                if (use_icount) {
7575 2e70f6ef pbrook
                    int64_t count;
7576 2e70f6ef pbrook
                    int decr;
7577 2e70f6ef pbrook
                    qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
7578 2e70f6ef pbrook
                    env->icount_decr.u16.low = 0;
7579 2e70f6ef pbrook
                    env->icount_extra = 0;
7580 2e70f6ef pbrook
                    count = qemu_next_deadline();
7581 2e70f6ef pbrook
                    count = (count + (1 << icount_time_shift) - 1)
7582 2e70f6ef pbrook
                            >> icount_time_shift;
7583 2e70f6ef pbrook
                    qemu_icount += count;
7584 2e70f6ef pbrook
                    decr = (count > 0xffff) ? 0xffff : count;
7585 2e70f6ef pbrook
                    count -= decr;
7586 2e70f6ef pbrook
                    env->icount_decr.u16.low = decr;
7587 2e70f6ef pbrook
                    env->icount_extra = count;
7588 2e70f6ef pbrook
                }
7589 6a00d601 bellard
                ret = cpu_exec(env);
7590 89bfc105 bellard
#ifdef CONFIG_PROFILER
7591 89bfc105 bellard
                qemu_time += profile_getclock() - ti;
7592 89bfc105 bellard
#endif
7593 2e70f6ef pbrook
                if (use_icount) {
7594 2e70f6ef pbrook
                    /* Fold pending instructions back into the
7595 2e70f6ef pbrook
                       instruction counter, and clear the interrupt flag.  */
7596 2e70f6ef pbrook
                    qemu_icount -= (env->icount_decr.u16.low
7597 2e70f6ef pbrook
                                    + env->icount_extra);
7598 2e70f6ef pbrook
                    env->icount_decr.u32 = 0;
7599 2e70f6ef pbrook
                    env->icount_extra = 0;
7600 2e70f6ef pbrook
                }
7601 ee5605e5 balrog
                next_cpu = env->next_cpu ?: first_cpu;
7602 95b01009 aurel32
                if (event_pending && likely(ret != EXCP_DEBUG)) {
7603 ee5605e5 balrog
                    ret = EXCP_INTERRUPT;
7604 ee5605e5 balrog
                    event_pending = 0;
7605 ee5605e5 balrog
                    break;
7606 ee5605e5 balrog
                }
7607 bd967e05 pbrook
                if (ret == EXCP_HLT) {
7608 bd967e05 pbrook
                    /* Give the next CPU a chance to run.  */
7609 bd967e05 pbrook
                    cur_cpu = env;
7610 bd967e05 pbrook
                    continue;
7611 bd967e05 pbrook
                }
7612 15a76449 bellard
                if (ret != EXCP_HALTED)
7613 15a76449 bellard
                    break;
7614 15a76449 bellard
                /* all CPUs are halted ? */
7615 bd967e05 pbrook
                if (env == cur_cpu)
7616 15a76449 bellard
                    break;
7617 15a76449 bellard
            }
7618 15a76449 bellard
            cur_cpu = env;
7619 15a76449 bellard
7620 5905b2e5 bellard
            if (shutdown_requested) {
7621 3475187d bellard
                ret = EXCP_INTERRUPT;
7622 b2f76161 aurel32
                if (no_shutdown) {
7623 b2f76161 aurel32
                    vm_stop(0);
7624 b2f76161 aurel32
                    no_shutdown = 0;
7625 b2f76161 aurel32
                }
7626 b2f76161 aurel32
                else
7627 b2f76161 aurel32
                    break;
7628 5905b2e5 bellard
            }
7629 5905b2e5 bellard
            if (reset_requested) {
7630 5905b2e5 bellard
                reset_requested = 0;
7631 5905b2e5 bellard
                qemu_system_reset();
7632 3475187d bellard
                ret = EXCP_INTERRUPT;
7633 3475187d bellard
            }
7634 3475187d bellard
            if (powerdown_requested) {
7635 3475187d bellard
                powerdown_requested = 0;
7636 3475187d bellard
                qemu_system_powerdown();
7637 3475187d bellard
                ret = EXCP_INTERRUPT;
7638 5905b2e5 bellard
            }
7639 95b01009 aurel32
            if (unlikely(ret == EXCP_DEBUG)) {
7640 5905b2e5 bellard
                vm_stop(EXCP_DEBUG);
7641 5905b2e5 bellard
            }
7642 bd967e05 pbrook
            /* If all cpus are halted then wait until the next IRQ */
7643 5905b2e5 bellard
            /* XXX: use timeout computed from timers */
7644 2e70f6ef pbrook
            if (ret == EXCP_HALTED) {
7645 2e70f6ef pbrook
                if (use_icount) {
7646 2e70f6ef pbrook
                    int64_t add;
7647 2e70f6ef pbrook
                    int64_t delta;
7648 2e70f6ef pbrook
                    /* Advance virtual time to the next event.  */
7649 2e70f6ef pbrook
                    if (use_icount == 1) {
7650 2e70f6ef pbrook
                        /* When not using an adaptive execution frequency
7651 2e70f6ef pbrook
                           we tend to get badly out of sync with real time,
7652 bf20dc07 ths
                           so just delay for a reasonable amount of time.  */
7653 2e70f6ef pbrook
                        delta = 0;
7654 2e70f6ef pbrook
                    } else {
7655 2e70f6ef pbrook
                        delta = cpu_get_icount() - cpu_get_clock();
7656 2e70f6ef pbrook
                    }
7657 2e70f6ef pbrook
                    if (delta > 0) {
7658 2e70f6ef pbrook
                        /* If virtual time is ahead of real time then just
7659 2e70f6ef pbrook
                           wait for IO.  */
7660 2e70f6ef pbrook
                        timeout = (delta / 1000000) + 1;
7661 2e70f6ef pbrook
                    } else {
7662 2e70f6ef pbrook
                        /* Wait for either IO to occur or the next
7663 2e70f6ef pbrook
                           timer event.  */
7664 2e70f6ef pbrook
                        add = qemu_next_deadline();
7665 2e70f6ef pbrook
                        /* We advance the timer before checking for IO.
7666 2e70f6ef pbrook
                           Limit the amount we advance so that early IO
7667 2e70f6ef pbrook
                           activity won't get the guest too far ahead.  */
7668 2e70f6ef pbrook
                        if (add > 10000000)
7669 2e70f6ef pbrook
                            add = 10000000;
7670 2e70f6ef pbrook
                        delta += add;
7671 2e70f6ef pbrook
                        add = (add + (1 << icount_time_shift) - 1)
7672 2e70f6ef pbrook
                              >> icount_time_shift;
7673 2e70f6ef pbrook
                        qemu_icount += add;
7674 2e70f6ef pbrook
                        timeout = delta / 1000000;
7675 2e70f6ef pbrook
                        if (timeout < 0)
7676 2e70f6ef pbrook
                            timeout = 0;
7677 2e70f6ef pbrook
                    }
7678 2e70f6ef pbrook
                } else {
7679 2e70f6ef pbrook
                    timeout = 10;
7680 2e70f6ef pbrook
                }
7681 2e70f6ef pbrook
            } else {
7682 5905b2e5 bellard
                timeout = 0;
7683 2e70f6ef pbrook
            }
7684 5905b2e5 bellard
        } else {
7685 5b08fc10 aliguori
            if (shutdown_requested)
7686 5b08fc10 aliguori
                break;
7687 5905b2e5 bellard
            timeout = 10;
7688 5905b2e5 bellard
        }
7689 89bfc105 bellard
#ifdef CONFIG_PROFILER
7690 89bfc105 bellard
        ti = profile_getclock();
7691 89bfc105 bellard
#endif
7692 5905b2e5 bellard
        main_loop_wait(timeout);
7693 89bfc105 bellard
#ifdef CONFIG_PROFILER
7694 89bfc105 bellard
        dev_time += profile_getclock() - ti;
7695 89bfc105 bellard
#endif
7696 b4608c04 bellard
    }
7697 34865134 bellard
    cpu_disable_ticks();
7698 34865134 bellard
    return ret;
7699 b4608c04 bellard
}
7700 b4608c04 bellard
7701 15f82208 ths
static void help(int exitcode)
7702 0824d6fc bellard
{
7703 68d0f70e bellard
    printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n"
7704 0db63474 bellard
           "usage: %s [options] [disk_image]\n"
7705 0824d6fc bellard
           "\n"
7706 a20dd508 bellard
           "'disk_image' is a raw hard image image for IDE hard disk 0\n"
7707 fc01f7e7 bellard
           "\n"
7708 a20dd508 bellard
           "Standard options:\n"
7709 cc1daa40 bellard
           "-M machine      select emulated machine (-M ? for list)\n"
7710 5adb4839 pbrook
           "-cpu cpu        select CPU (-cpu ? for list)\n"
7711 c45886db bellard
           "-fda/-fdb file  use 'file' as floppy disk 0/1 image\n"
7712 36b486bb bellard
           "-hda/-hdb file  use 'file' as IDE hard disk 0/1 image\n"
7713 36b486bb bellard
           "-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image\n"
7714 c4b1fcc0 bellard
           "-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
7715 a1620fac aurel32
           "-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n"
7716 a1620fac aurel32
           "       [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
7717 a1620fac aurel32
           "       [,cache=on|off][,format=f]\n"
7718 e4bcb14c ths
           "                use 'file' as a drive image\n"
7719 3e3d5815 balrog
           "-mtdblock file  use 'file' as on-board Flash memory image\n"
7720 a1bb27b1 pbrook
           "-sd file        use 'file' as SecureDigital card image\n"
7721 86f55663 j_mayer
           "-pflash file    use 'file' as a parallel flash image\n"
7722 eec85c2a ths
           "-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n)\n"
7723 667accab ths
           "-snapshot       write to temporary files instead of disk image files\n"
7724 667accab ths
#ifdef CONFIG_SDL
7725 43523e93 ths
           "-no-frame       open SDL window without a frame and window decorations\n"
7726 3780e197 ths
           "-alt-grab       use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)\n"
7727 667accab ths
           "-no-quit        disable SDL window close capability\n"
7728 667accab ths
#endif
7729 52ca8d6a bellard
#ifdef TARGET_I386
7730 52ca8d6a bellard
           "-no-fd-bootchk  disable boot signature checking for floppy disks\n"
7731 52ca8d6a bellard
#endif
7732 a00bad7e bellard
           "-m megs         set virtual RAM size to megs MB [default=%d]\n"
7733 91fc2119 bellard
           "-smp n          set the number of CPUs to 'n' [default=1]\n"
7734 c4b1fcc0 bellard
           "-nographic      disable graphical output and redirect serial I/Os to console\n"
7735 a171fe39 balrog
           "-portrait       rotate graphical output 90 deg left (only PXA LCD)\n"
7736 4ca0074c bellard
#ifndef _WIN32
7737 667accab ths
           "-k language     use keyboard layout (for example \"fr\" for French)\n"
7738 4ca0074c bellard
#endif
7739 1d14ffa9 bellard
#ifdef HAS_AUDIO
7740 1d14ffa9 bellard
           "-audio-help     print list of audio drivers and their options\n"
7741 c0fe3827 bellard
           "-soundhw c1,... enable audio support\n"
7742 c0fe3827 bellard
           "                and only specified sound cards (comma separated list)\n"
7743 c0fe3827 bellard
           "                use -soundhw ? to get the list of supported cards\n"
7744 6a36d84e bellard
           "                use -soundhw all to enable all of them\n"
7745 1d14ffa9 bellard
#endif
7746 3893c124 malc
           "-vga [std|cirrus|vmware]\n"
7747 3893c124 malc
           "                select video card type\n"
7748 89980284 bellard
           "-localtime      set the real time clock to local time [default=utc]\n"
7749 d63d307f bellard
           "-full-screen    start in full screen\n"
7750 a09db21f bellard
#ifdef TARGET_I386
7751 a09db21f bellard
           "-win2k-hack     use it when installing Windows 2000 to avoid a disk full bug\n"
7752 a09db21f bellard
#endif
7753 b389dbfb bellard
           "-usb            enable the USB driver (will be the default soon)\n"
7754 b389dbfb bellard
           "-usbdevice name add the host or guest USB device 'name'\n"
7755 6f7e9aec bellard
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
7756 6f7e9aec bellard
           "-g WxH[xDEPTH]  Set the initial graphical resolution and depth\n"
7757 bb0c6722 bellard
#endif
7758 c35734b2 ths
           "-name string    set the name of the guest\n"
7759 8fcb1b90 blueswir1
           "-uuid %%08x-%%04x-%%04x-%%04x-%%012x specify machine UUID\n"
7760 c4b1fcc0 bellard
           "\n"
7761 c4b1fcc0 bellard
           "Network options:\n"
7762 a41b2ff2 pbrook
           "-net nic[,vlan=n][,macaddr=addr][,model=type]\n"
7763 7c9d8e07 bellard
           "                create a new Network Interface Card and connect it to VLAN 'n'\n"
7764 c20709aa bellard
#ifdef CONFIG_SLIRP
7765 115defd1 pbrook
           "-net user[,vlan=n][,hostname=host]\n"
7766 115defd1 pbrook
           "                connect the user mode network stack to VLAN 'n' and send\n"
7767 115defd1 pbrook
           "                hostname 'host' to DHCP clients\n"
7768 7c9d8e07 bellard
#endif
7769 7fb843f8 bellard
#ifdef _WIN32
7770 7fb843f8 bellard
           "-net tap[,vlan=n],ifname=name\n"
7771 7fb843f8 bellard
           "                connect the host TAP network interface to VLAN 'n'\n"
7772 7fb843f8 bellard
#else
7773 b46a8906 ths
           "-net tap[,vlan=n][,fd=h][,ifname=name][,script=file][,downscript=dfile]\n"
7774 b46a8906 ths
           "                connect the host TAP network interface to VLAN 'n' and use the\n"
7775 b46a8906 ths
           "                network scripts 'file' (default=%s)\n"
7776 b46a8906 ths
           "                and 'dfile' (default=%s);\n"
7777 b46a8906 ths
           "                use '[down]script=no' to disable script execution;\n"
7778 7c9d8e07 bellard
           "                use 'fd=h' to connect to an already opened TAP interface\n"
7779 7fb843f8 bellard
#endif
7780 6a00d601 bellard
           "-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]\n"
7781 7c9d8e07 bellard
           "                connect the vlan 'n' to another VLAN using a socket connection\n"
7782 3d830459 bellard
           "-net socket[,vlan=n][,fd=h][,mcast=maddr:port]\n"
7783 3d830459 bellard
           "                connect the vlan 'n' to multicast maddr and port\n"
7784 8a16d273 ths
#ifdef CONFIG_VDE
7785 8a16d273 ths
           "-net vde[,vlan=n][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode]\n"
7786 8a16d273 ths
           "                connect the vlan 'n' to port 'n' of a vde switch running\n"
7787 8a16d273 ths
           "                on host and listening for incoming connections on 'socketpath'.\n"
7788 8a16d273 ths
           "                Use group 'groupname' and mode 'octalmode' to change default\n"
7789 8a16d273 ths
           "                ownership and permissions for communication port.\n"
7790 8a16d273 ths
#endif
7791 7c9d8e07 bellard
           "-net none       use it alone to have zero network devices; if no -net option\n"
7792 7c9d8e07 bellard
           "                is provided, the default is '-net nic -net user'\n"
7793 7c9d8e07 bellard
           "\n"
7794 7c9d8e07 bellard
#ifdef CONFIG_SLIRP
7795 0db1137d ths
           "-tftp dir       allow tftp access to files in dir [-net user]\n"
7796 47d5d01a ths
           "-bootp file     advertise file in BOOTP replies\n"
7797 7c9d8e07 bellard
#ifndef _WIN32
7798 7c9d8e07 bellard
           "-smb dir        allow SMB access to files in 'dir' [-net user]\n"
7799 c94c8d64 bellard
#endif
7800 9bf05444 bellard
           "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n"
7801 7c9d8e07 bellard
           "                redirect TCP or UDP connections from host to guest [-net user]\n"
7802 c20709aa bellard
#endif
7803 a20dd508 bellard
           "\n"
7804 c4b1fcc0 bellard
           "Linux boot specific:\n"
7805 a20dd508 bellard
           "-kernel bzImage use 'bzImage' as kernel image\n"
7806 a20dd508 bellard
           "-append cmdline use 'cmdline' as kernel command line\n"
7807 a20dd508 bellard
           "-initrd file    use 'file' as initial ram disk\n"
7808 fc01f7e7 bellard
           "\n"
7809 330d0414 bellard
           "Debug/Expert options:\n"
7810 82c643ff bellard
           "-monitor dev    redirect the monitor to char device 'dev'\n"
7811 82c643ff bellard
           "-serial dev     redirect the serial port to char device 'dev'\n"
7812 6508fe59 bellard
           "-parallel dev   redirect the parallel port to char device 'dev'\n"
7813 f7cce898 bellard
           "-pidfile file   Write PID to 'file'\n"
7814 cd6f1169 bellard
           "-S              freeze CPU at startup (use 'c' to start execution)\n"
7815 cfc3475a pbrook
           "-s              wait gdb connection to port\n"
7816 cfc3475a pbrook
           "-p port         set gdb connection port [default=%s]\n"
7817 f193c797 bellard
           "-d item1,...    output log to %s (use -d ? for a list of log items)\n"
7818 46d4767d bellard
           "-hdachs c,h,s[,t]  force hard disk 0 physical geometry and the optional BIOS\n"
7819 46d4767d bellard
           "                translation (t=none or lba) (usually qemu can guess them)\n"
7820 87b47350 bellard
           "-L path         set the directory for the BIOS, VGA BIOS and keymaps\n"
7821 d993e026 bellard
#ifdef USE_KQEMU
7822 6515b203 bellard
           "-kernel-kqemu   enable KQEMU full virtualization (default is user mode only)\n"
7823 d993e026 bellard
           "-no-kqemu       disable KQEMU kernel module usage\n"
7824 d993e026 bellard
#endif
7825 bb0c6722 bellard
#ifdef TARGET_I386
7826 6515b203 bellard
           "-no-acpi        disable ACPI\n"
7827 bb0c6722 bellard
#endif
7828 4d3b6f6e balrog
#ifdef CONFIG_CURSES
7829 4d3b6f6e balrog
           "-curses         use a curses/ncurses interface instead of SDL\n"
7830 4d3b6f6e balrog
#endif
7831 d1beab82 bellard
           "-no-reboot      exit instead of rebooting\n"
7832 b2f76161 aurel32
           "-no-shutdown    stop before shutdown\n"
7833 a8080006 aurel32
           "-loadvm [tag|id]  start right away with a saved state (loadvm in monitor)\n"
7834 24236869 bellard
           "-vnc display    start a VNC server on display\n"
7835 71e3ceb8 ths
#ifndef _WIN32
7836 71e3ceb8 ths
           "-daemonize      daemonize QEMU after initializing\n"
7837 71e3ceb8 ths
#endif
7838 9ae02555 ths
           "-option-rom rom load a file, rom, into the option ROM space\n"
7839 66508601 blueswir1
#ifdef TARGET_SPARC
7840 66508601 blueswir1
           "-prom-env variable=value  set OpenBIOS nvram variables\n"
7841 66508601 blueswir1
#endif
7842 f3dcfada ths
           "-clock          force the use of the given methods for timer alarm.\n"
7843 3adda04c aurel32
           "                To see what timers are available use -clock ?\n"
7844 bce61846 bellard
           "-startdate      select initial date of the clock\n"
7845 2e70f6ef pbrook
           "-icount [N|auto]\n"
7846 dd5d6fe9 pbrook
           "                Enable virtual instruction counter with 2^N clock ticks per instruction\n"
7847 0824d6fc bellard
           "\n"
7848 82c643ff bellard
           "During emulation, the following keys are useful:\n"
7849 032a8c9e bellard
           "ctrl-alt-f      toggle full screen\n"
7850 032a8c9e bellard
           "ctrl-alt-n      switch to virtual console 'n'\n"
7851 032a8c9e bellard
           "ctrl-alt        toggle mouse and keyboard grab\n"
7852 82c643ff bellard
           "\n"
7853 82c643ff bellard
           "When using -nographic, press 'ctrl-a h' to get some help.\n"
7854 82c643ff bellard
           ,
7855 0db63474 bellard
           "qemu",
7856 a00bad7e bellard
           DEFAULT_RAM_SIZE,
7857 7c9d8e07 bellard
#ifndef _WIN32
7858 a00bad7e bellard
           DEFAULT_NETWORK_SCRIPT,
7859 b46a8906 ths
           DEFAULT_NETWORK_DOWN_SCRIPT,
7860 7c9d8e07 bellard
#endif
7861 6e44ba7f bellard
           DEFAULT_GDBSTUB_PORT,
7862 bce61846 bellard
           "/tmp/qemu.log");
7863 15f82208 ths
    exit(exitcode);
7864 0824d6fc bellard
}
7865 0824d6fc bellard
7866 cd6f1169 bellard
#define HAS_ARG 0x0001
7867 cd6f1169 bellard
7868 cd6f1169 bellard
enum {
7869 cd6f1169 bellard
    QEMU_OPTION_h,
7870 cd6f1169 bellard
7871 cc1daa40 bellard
    QEMU_OPTION_M,
7872 94fc95cd j_mayer
    QEMU_OPTION_cpu,
7873 cd6f1169 bellard
    QEMU_OPTION_fda,
7874 cd6f1169 bellard
    QEMU_OPTION_fdb,
7875 cd6f1169 bellard
    QEMU_OPTION_hda,
7876 cd6f1169 bellard
    QEMU_OPTION_hdb,
7877 cd6f1169 bellard
    QEMU_OPTION_hdc,
7878 cd6f1169 bellard
    QEMU_OPTION_hdd,
7879 e4bcb14c ths
    QEMU_OPTION_drive,
7880 cd6f1169 bellard
    QEMU_OPTION_cdrom,
7881 3e3d5815 balrog
    QEMU_OPTION_mtdblock,
7882 a1bb27b1 pbrook
    QEMU_OPTION_sd,
7883 86f55663 j_mayer
    QEMU_OPTION_pflash,
7884 cd6f1169 bellard
    QEMU_OPTION_boot,
7885 cd6f1169 bellard
    QEMU_OPTION_snapshot,
7886 52ca8d6a bellard
#ifdef TARGET_I386
7887 52ca8d6a bellard
    QEMU_OPTION_no_fd_bootchk,
7888 52ca8d6a bellard
#endif
7889 cd6f1169 bellard
    QEMU_OPTION_m,
7890 cd6f1169 bellard
    QEMU_OPTION_nographic,
7891 a171fe39 balrog
    QEMU_OPTION_portrait,
7892 1d14ffa9 bellard
#ifdef HAS_AUDIO
7893 1d14ffa9 bellard
    QEMU_OPTION_audio_help,
7894 1d14ffa9 bellard
    QEMU_OPTION_soundhw,
7895 1d14ffa9 bellard
#endif
7896 cd6f1169 bellard
7897 7c9d8e07 bellard
    QEMU_OPTION_net,
7898 c7f74643 bellard
    QEMU_OPTION_tftp,
7899 47d5d01a ths
    QEMU_OPTION_bootp,
7900 9d728e8c bellard
    QEMU_OPTION_smb,
7901 9bf05444 bellard
    QEMU_OPTION_redir,
7902 cd6f1169 bellard
7903 cd6f1169 bellard
    QEMU_OPTION_kernel,
7904 cd6f1169 bellard
    QEMU_OPTION_append,
7905 cd6f1169 bellard
    QEMU_OPTION_initrd,
7906 cd6f1169 bellard
7907 cd6f1169 bellard
    QEMU_OPTION_S,
7908 cd6f1169 bellard
    QEMU_OPTION_s,
7909 cd6f1169 bellard
    QEMU_OPTION_p,
7910 cd6f1169 bellard
    QEMU_OPTION_d,
7911 cd6f1169 bellard
    QEMU_OPTION_hdachs,
7912 cd6f1169 bellard
    QEMU_OPTION_L,
7913 1192dad8 j_mayer
    QEMU_OPTION_bios,
7914 3d11d0eb bellard
    QEMU_OPTION_k,
7915 ee22c2f7 bellard
    QEMU_OPTION_localtime,
7916 e9b137c2 bellard
    QEMU_OPTION_g,
7917 3893c124 malc
    QEMU_OPTION_vga,
7918 20d8a3ed ths
    QEMU_OPTION_echr,
7919 82c643ff bellard
    QEMU_OPTION_monitor,
7920 82c643ff bellard
    QEMU_OPTION_serial,
7921 6508fe59 bellard
    QEMU_OPTION_parallel,
7922 d63d307f bellard
    QEMU_OPTION_loadvm,
7923 d63d307f bellard
    QEMU_OPTION_full_screen,
7924 43523e93 ths
    QEMU_OPTION_no_frame,
7925 3780e197 ths
    QEMU_OPTION_alt_grab,
7926 667accab ths
    QEMU_OPTION_no_quit,
7927 f7cce898 bellard
    QEMU_OPTION_pidfile,
7928 d993e026 bellard
    QEMU_OPTION_no_kqemu,
7929 89bfc105 bellard
    QEMU_OPTION_kernel_kqemu,
7930 a09db21f bellard
    QEMU_OPTION_win2k_hack,
7931 bb36d470 bellard
    QEMU_OPTION_usb,
7932 a594cfbf bellard
    QEMU_OPTION_usbdevice,
7933 6a00d601 bellard
    QEMU_OPTION_smp,
7934 24236869 bellard
    QEMU_OPTION_vnc,
7935 6515b203 bellard
    QEMU_OPTION_no_acpi,
7936 4d3b6f6e balrog
    QEMU_OPTION_curses,
7937 d1beab82 bellard
    QEMU_OPTION_no_reboot,
7938 b2f76161 aurel32
    QEMU_OPTION_no_shutdown,
7939 9467cd46 balrog
    QEMU_OPTION_show_cursor,
7940 71e3ceb8 ths
    QEMU_OPTION_daemonize,
7941 9ae02555 ths
    QEMU_OPTION_option_rom,
7942 c35734b2 ths
    QEMU_OPTION_semihosting,
7943 c35734b2 ths
    QEMU_OPTION_name,
7944 66508601 blueswir1
    QEMU_OPTION_prom_env,
7945 2b8f2d41 balrog
    QEMU_OPTION_old_param,
7946 f3dcfada ths
    QEMU_OPTION_clock,
7947 7e0af5d0 bellard
    QEMU_OPTION_startdate,
7948 26a5f13b bellard
    QEMU_OPTION_tb_size,
7949 2e70f6ef pbrook
    QEMU_OPTION_icount,
7950 8fcb1b90 blueswir1
    QEMU_OPTION_uuid,
7951 cd6f1169 bellard
};
7952 cd6f1169 bellard
7953 cd6f1169 bellard
typedef struct QEMUOption {
7954 cd6f1169 bellard
    const char *name;
7955 cd6f1169 bellard
    int flags;
7956 cd6f1169 bellard
    int index;
7957 cd6f1169 bellard
} QEMUOption;
7958 cd6f1169 bellard
7959 cd6f1169 bellard
const QEMUOption qemu_options[] = {
7960 cd6f1169 bellard
    { "h", 0, QEMU_OPTION_h },
7961 64423fb2 pbrook
    { "help", 0, QEMU_OPTION_h },
7962 cd6f1169 bellard
7963 cc1daa40 bellard
    { "M", HAS_ARG, QEMU_OPTION_M },
7964 94fc95cd j_mayer
    { "cpu", HAS_ARG, QEMU_OPTION_cpu },
7965 cd6f1169 bellard
    { "fda", HAS_ARG, QEMU_OPTION_fda },
7966 cd6f1169 bellard
    { "fdb", HAS_ARG, QEMU_OPTION_fdb },
7967 cd6f1169 bellard
    { "hda", HAS_ARG, QEMU_OPTION_hda },
7968 cd6f1169 bellard
    { "hdb", HAS_ARG, QEMU_OPTION_hdb },
7969 cd6f1169 bellard
    { "hdc", HAS_ARG, QEMU_OPTION_hdc },
7970 cd6f1169 bellard
    { "hdd", HAS_ARG, QEMU_OPTION_hdd },
7971 e4bcb14c ths
    { "drive", HAS_ARG, QEMU_OPTION_drive },
7972 cd6f1169 bellard
    { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
7973 3e3d5815 balrog
    { "mtdblock", HAS_ARG, QEMU_OPTION_mtdblock },
7974 a1bb27b1 pbrook
    { "sd", HAS_ARG, QEMU_OPTION_sd },
7975 86f55663 j_mayer
    { "pflash", HAS_ARG, QEMU_OPTION_pflash },
7976 cd6f1169 bellard
    { "boot", HAS_ARG, QEMU_OPTION_boot },
7977 cd6f1169 bellard
    { "snapshot", 0, QEMU_OPTION_snapshot },
7978 52ca8d6a bellard
#ifdef TARGET_I386
7979 52ca8d6a bellard
    { "no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk },
7980 52ca8d6a bellard
#endif
7981 cd6f1169 bellard
    { "m", HAS_ARG, QEMU_OPTION_m },
7982 cd6f1169 bellard
    { "nographic", 0, QEMU_OPTION_nographic },
7983 a171fe39 balrog
    { "portrait", 0, QEMU_OPTION_portrait },
7984 3d11d0eb bellard
    { "k", HAS_ARG, QEMU_OPTION_k },
7985 1d14ffa9 bellard
#ifdef HAS_AUDIO
7986 1d14ffa9 bellard
    { "audio-help", 0, QEMU_OPTION_audio_help },
7987 1d14ffa9 bellard
    { "soundhw", HAS_ARG, QEMU_OPTION_soundhw },
7988 1d14ffa9 bellard
#endif
7989 cd6f1169 bellard
7990 7c9d8e07 bellard
    { "net", HAS_ARG, QEMU_OPTION_net},
7991 158156d1 bellard
#ifdef CONFIG_SLIRP
7992 c7f74643 bellard
    { "tftp", HAS_ARG, QEMU_OPTION_tftp },
7993 47d5d01a ths
    { "bootp", HAS_ARG, QEMU_OPTION_bootp },
7994 c94c8d64 bellard
#ifndef _WIN32
7995 9d728e8c bellard
    { "smb", HAS_ARG, QEMU_OPTION_smb },
7996 c94c8d64 bellard
#endif
7997 9bf05444 bellard
    { "redir", HAS_ARG, QEMU_OPTION_redir },
7998 158156d1 bellard
#endif
7999 cd6f1169 bellard
8000 cd6f1169 bellard
    { "kernel", HAS_ARG, QEMU_OPTION_kernel },
8001 cd6f1169 bellard
    { "append", HAS_ARG, QEMU_OPTION_append },
8002 cd6f1169 bellard
    { "initrd", HAS_ARG, QEMU_OPTION_initrd },
8003 cd6f1169 bellard
8004 cd6f1169 bellard
    { "S", 0, QEMU_OPTION_S },
8005 cd6f1169 bellard
    { "s", 0, QEMU_OPTION_s },
8006 cd6f1169 bellard
    { "p", HAS_ARG, QEMU_OPTION_p },
8007 cd6f1169 bellard
    { "d", HAS_ARG, QEMU_OPTION_d },
8008 cd6f1169 bellard
    { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
8009 cd6f1169 bellard
    { "L", HAS_ARG, QEMU_OPTION_L },
8010 1192dad8 j_mayer
    { "bios", HAS_ARG, QEMU_OPTION_bios },
8011 d993e026 bellard
#ifdef USE_KQEMU
8012 d993e026 bellard
    { "no-kqemu", 0, QEMU_OPTION_no_kqemu },
8013 89bfc105 bellard
    { "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu },
8014 d993e026 bellard
#endif
8015 6f7e9aec bellard
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
8016 e9b137c2 bellard
    { "g", 1, QEMU_OPTION_g },
8017 77d4bc34 bellard
#endif
8018 ee22c2f7 bellard
    { "localtime", 0, QEMU_OPTION_localtime },
8019 3893c124 malc
    { "vga", HAS_ARG, QEMU_OPTION_vga },
8020 8b6e0729 balrog
    { "echr", HAS_ARG, QEMU_OPTION_echr },
8021 8b6e0729 balrog
    { "monitor", HAS_ARG, QEMU_OPTION_monitor },
8022 8b6e0729 balrog
    { "serial", HAS_ARG, QEMU_OPTION_serial },
8023 8b6e0729 balrog
    { "parallel", HAS_ARG, QEMU_OPTION_parallel },
8024 d63d307f bellard
    { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
8025 d63d307f bellard
    { "full-screen", 0, QEMU_OPTION_full_screen },
8026 667accab ths
#ifdef CONFIG_SDL
8027 43523e93 ths
    { "no-frame", 0, QEMU_OPTION_no_frame },
8028 3780e197 ths
    { "alt-grab", 0, QEMU_OPTION_alt_grab },
8029 667accab ths
    { "no-quit", 0, QEMU_OPTION_no_quit },
8030 667accab ths
#endif
8031 f7cce898 bellard
    { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
8032 a09db21f bellard
    { "win2k-hack", 0, QEMU_OPTION_win2k_hack },
8033 a594cfbf bellard
    { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
8034 6a00d601 bellard
    { "smp", HAS_ARG, QEMU_OPTION_smp },
8035 24236869 bellard
    { "vnc", HAS_ARG, QEMU_OPTION_vnc },
8036 4d3b6f6e balrog
#ifdef CONFIG_CURSES
8037 4d3b6f6e balrog
    { "curses", 0, QEMU_OPTION_curses },
8038 4d3b6f6e balrog
#endif
8039 8fcb1b90 blueswir1
    { "uuid", HAS_ARG, QEMU_OPTION_uuid },
8040 96d30e48 ths
8041 1f04275e bellard
    /* temporary options */
8042 a594cfbf bellard
    { "usb", 0, QEMU_OPTION_usb },
8043 6515b203 bellard
    { "no-acpi", 0, QEMU_OPTION_no_acpi },
8044 d1beab82 bellard
    { "no-reboot", 0, QEMU_OPTION_no_reboot },
8045 b2f76161 aurel32
    { "no-shutdown", 0, QEMU_OPTION_no_shutdown },
8046 9467cd46 balrog
    { "show-cursor", 0, QEMU_OPTION_show_cursor },
8047 71e3ceb8 ths
    { "daemonize", 0, QEMU_OPTION_daemonize },
8048 9ae02555 ths
    { "option-rom", HAS_ARG, QEMU_OPTION_option_rom },
8049 a87295e8 pbrook
#if defined(TARGET_ARM) || defined(TARGET_M68K)
8050 8e71621f pbrook
    { "semihosting", 0, QEMU_OPTION_semihosting },
8051 8e71621f pbrook
#endif
8052 c35734b2 ths
    { "name", HAS_ARG, QEMU_OPTION_name },
8053 66508601 blueswir1
#if defined(TARGET_SPARC)
8054 66508601 blueswir1
    { "prom-env", HAS_ARG, QEMU_OPTION_prom_env },
8055 66508601 blueswir1
#endif
8056 2b8f2d41 balrog
#if defined(TARGET_ARM)
8057 2b8f2d41 balrog
    { "old-param", 0, QEMU_OPTION_old_param },
8058 2b8f2d41 balrog
#endif
8059 f3dcfada ths
    { "clock", HAS_ARG, QEMU_OPTION_clock },
8060 7e0af5d0 bellard
    { "startdate", HAS_ARG, QEMU_OPTION_startdate },
8061 26a5f13b bellard
    { "tb-size", HAS_ARG, QEMU_OPTION_tb_size },
8062 2e70f6ef pbrook
    { "icount", HAS_ARG, QEMU_OPTION_icount },
8063 cd6f1169 bellard
    { NULL },
8064 fc01f7e7 bellard
};
8065 fc01f7e7 bellard
8066 5905b2e5 bellard
/* password input */
8067 5905b2e5 bellard
8068 2bac6019 balrog
int qemu_key_check(BlockDriverState *bs, const char *name)
8069 2bac6019 balrog
{
8070 2bac6019 balrog
    char password[256];
8071 2bac6019 balrog
    int i;
8072 2bac6019 balrog
8073 2bac6019 balrog
    if (!bdrv_is_encrypted(bs))
8074 2bac6019 balrog
        return 0;
8075 2bac6019 balrog
8076 2bac6019 balrog
    term_printf("%s is encrypted.\n", name);
8077 2bac6019 balrog
    for(i = 0; i < 3; i++) {
8078 2bac6019 balrog
        monitor_readline("Password: ", 1, password, sizeof(password));
8079 2bac6019 balrog
        if (bdrv_set_key(bs, password) == 0)
8080 2bac6019 balrog
            return 0;
8081 2bac6019 balrog
        term_printf("invalid password\n");
8082 2bac6019 balrog
    }
8083 2bac6019 balrog
    return -EPERM;
8084 2bac6019 balrog
}
8085 2bac6019 balrog
8086 83ab7950 aliguori
static BlockDriverState *get_bdrv(int index)
8087 83ab7950 aliguori
{
8088 83ab7950 aliguori
    if (index > nb_drives)
8089 83ab7950 aliguori
        return NULL;
8090 83ab7950 aliguori
    return drives_table[index].bdrv;
8091 83ab7950 aliguori
}
8092 83ab7950 aliguori
8093 5905b2e5 bellard
static void read_passwords(void)
8094 5905b2e5 bellard
{
8095 5905b2e5 bellard
    BlockDriverState *bs;
8096 2bac6019 balrog
    int i;
8097 5905b2e5 bellard
8098 83ab7950 aliguori
    for(i = 0; i < 6; i++) {
8099 83ab7950 aliguori
        bs = get_bdrv(i);
8100 83ab7950 aliguori
        if (bs)
8101 83ab7950 aliguori
            qemu_key_check(bs, bdrv_get_device_name(bs));
8102 5905b2e5 bellard
    }
8103 5905b2e5 bellard
}
8104 5905b2e5 bellard
8105 1d14ffa9 bellard
#ifdef HAS_AUDIO
8106 6a36d84e bellard
struct soundhw soundhw[] = {
8107 b00052e4 balrog
#ifdef HAS_AUDIO_CHOICE
8108 4ce7ff6e aurel32
#if defined(TARGET_I386) || defined(TARGET_MIPS)
8109 fd06c375 bellard
    {
8110 fd06c375 bellard
        "pcspk",
8111 fd06c375 bellard
        "PC speaker",
8112 fd06c375 bellard
        0,
8113 fd06c375 bellard
        1,
8114 fd06c375 bellard
        { .init_isa = pcspk_audio_init }
8115 fd06c375 bellard
    },
8116 fd06c375 bellard
#endif
8117 6a36d84e bellard
    {
8118 6a36d84e bellard
        "sb16",
8119 6a36d84e bellard
        "Creative Sound Blaster 16",
8120 6a36d84e bellard
        0,
8121 6a36d84e bellard
        1,
8122 6a36d84e bellard
        { .init_isa = SB16_init }
8123 6a36d84e bellard
    },
8124 6a36d84e bellard
8125 cc53d26d malc
#ifdef CONFIG_CS4231A
8126 cc53d26d malc
    {
8127 cc53d26d malc
        "cs4231a",
8128 cc53d26d malc
        "CS4231A",
8129 cc53d26d malc
        0,
8130 cc53d26d malc
        1,
8131 cc53d26d malc
        { .init_isa = cs4231a_init }
8132 cc53d26d malc
    },
8133 cc53d26d malc
#endif
8134 cc53d26d malc
8135 1d14ffa9 bellard
#ifdef CONFIG_ADLIB
8136 6a36d84e bellard
    {
8137 6a36d84e bellard
        "adlib",
8138 1d14ffa9 bellard
#ifdef HAS_YMF262
8139 6a36d84e bellard
        "Yamaha YMF262 (OPL3)",
8140 1d14ffa9 bellard
#else
8141 6a36d84e bellard
        "Yamaha YM3812 (OPL2)",
8142 1d14ffa9 bellard
#endif
8143 6a36d84e bellard
        0,
8144 6a36d84e bellard
        1,
8145 6a36d84e bellard
        { .init_isa = Adlib_init }
8146 6a36d84e bellard
    },
8147 1d14ffa9 bellard
#endif
8148 6a36d84e bellard
8149 1d14ffa9 bellard
#ifdef CONFIG_GUS
8150 6a36d84e bellard
    {
8151 6a36d84e bellard
        "gus",
8152 6a36d84e bellard
        "Gravis Ultrasound GF1",
8153 6a36d84e bellard
        0,
8154 6a36d84e bellard
        1,
8155 6a36d84e bellard
        { .init_isa = GUS_init }
8156 6a36d84e bellard
    },
8157 1d14ffa9 bellard
#endif
8158 6a36d84e bellard
8159 e5c9a13e balrog
#ifdef CONFIG_AC97
8160 e5c9a13e balrog
    {
8161 e5c9a13e balrog
        "ac97",
8162 e5c9a13e balrog
        "Intel 82801AA AC97 Audio",
8163 e5c9a13e balrog
        0,
8164 e5c9a13e balrog
        0,
8165 e5c9a13e balrog
        { .init_pci = ac97_init }
8166 e5c9a13e balrog
    },
8167 e5c9a13e balrog
#endif
8168 e5c9a13e balrog
8169 6a36d84e bellard
    {
8170 6a36d84e bellard
        "es1370",
8171 6a36d84e bellard
        "ENSONIQ AudioPCI ES1370",
8172 6a36d84e bellard
        0,
8173 6a36d84e bellard
        0,
8174 6a36d84e bellard
        { .init_pci = es1370_init }
8175 6a36d84e bellard
    },
8176 b00052e4 balrog
#endif
8177 6a36d84e bellard
8178 6a36d84e bellard
    { NULL, NULL, 0, 0, { NULL } }
8179 6a36d84e bellard
};
8180 6a36d84e bellard
8181 6a36d84e bellard
static void select_soundhw (const char *optarg)
8182 6a36d84e bellard
{
8183 6a36d84e bellard
    struct soundhw *c;
8184 6a36d84e bellard
8185 6a36d84e bellard
    if (*optarg == '?') {
8186 6a36d84e bellard
    show_valid_cards:
8187 6a36d84e bellard
8188 6a36d84e bellard
        printf ("Valid sound card names (comma separated):\n");
8189 6a36d84e bellard
        for (c = soundhw; c->name; ++c) {
8190 6a36d84e bellard
            printf ("%-11s %s\n", c->name, c->descr);
8191 6a36d84e bellard
        }
8192 6a36d84e bellard
        printf ("\n-soundhw all will enable all of the above\n");
8193 1d14ffa9 bellard
        exit (*optarg != '?');
8194 1d14ffa9 bellard
    }
8195 1d14ffa9 bellard
    else {
8196 6a36d84e bellard
        size_t l;
8197 1d14ffa9 bellard
        const char *p;
8198 1d14ffa9 bellard
        char *e;
8199 1d14ffa9 bellard
        int bad_card = 0;
8200 1d14ffa9 bellard
8201 6a36d84e bellard
        if (!strcmp (optarg, "all")) {
8202 6a36d84e bellard
            for (c = soundhw; c->name; ++c) {
8203 6a36d84e bellard
                c->enabled = 1;
8204 6a36d84e bellard
            }
8205 6a36d84e bellard
            return;
8206 6a36d84e bellard
        }
8207 1d14ffa9 bellard
8208 6a36d84e bellard
        p = optarg;
8209 1d14ffa9 bellard
        while (*p) {
8210 1d14ffa9 bellard
            e = strchr (p, ',');
8211 1d14ffa9 bellard
            l = !e ? strlen (p) : (size_t) (e - p);
8212 6a36d84e bellard
8213 6a36d84e bellard
            for (c = soundhw; c->name; ++c) {
8214 6a36d84e bellard
                if (!strncmp (c->name, p, l)) {
8215 6a36d84e bellard
                    c->enabled = 1;
8216 1d14ffa9 bellard
                    break;
8217 1d14ffa9 bellard
                }
8218 1d14ffa9 bellard
            }
8219 6a36d84e bellard
8220 6a36d84e bellard
            if (!c->name) {
8221 1d14ffa9 bellard
                if (l > 80) {
8222 1d14ffa9 bellard
                    fprintf (stderr,
8223 1d14ffa9 bellard
                             "Unknown sound card name (too big to show)\n");
8224 1d14ffa9 bellard
                }
8225 1d14ffa9 bellard
                else {
8226 1d14ffa9 bellard
                    fprintf (stderr, "Unknown sound card name `%.*s'\n",
8227 1d14ffa9 bellard
                             (int) l, p);
8228 1d14ffa9 bellard
                }
8229 1d14ffa9 bellard
                bad_card = 1;
8230 1d14ffa9 bellard
            }
8231 1d14ffa9 bellard
            p += l + (e != NULL);
8232 1d14ffa9 bellard
        }
8233 1d14ffa9 bellard
8234 1d14ffa9 bellard
        if (bad_card)
8235 1d14ffa9 bellard
            goto show_valid_cards;
8236 1d14ffa9 bellard
    }
8237 1d14ffa9 bellard
}
8238 1d14ffa9 bellard
#endif
8239 1d14ffa9 bellard
8240 3893c124 malc
static void select_vgahw (const char *p)
8241 3893c124 malc
{
8242 3893c124 malc
    const char *opts;
8243 3893c124 malc
8244 3893c124 malc
    if (strstart(p, "std", &opts)) {
8245 3893c124 malc
        cirrus_vga_enabled = 0;
8246 3893c124 malc
        vmsvga_enabled = 0;
8247 3893c124 malc
    } else if (strstart(p, "cirrus", &opts)) {
8248 3893c124 malc
        cirrus_vga_enabled = 1;
8249 3893c124 malc
        vmsvga_enabled = 0;
8250 3893c124 malc
    } else if (strstart(p, "vmware", &opts)) {
8251 3893c124 malc
        cirrus_vga_enabled = 0;
8252 3893c124 malc
        vmsvga_enabled = 1;
8253 3893c124 malc
    } else {
8254 3893c124 malc
    invalid_vga:
8255 3893c124 malc
        fprintf(stderr, "Unknown vga type: %s\n", p);
8256 3893c124 malc
        exit(1);
8257 3893c124 malc
    }
8258 cb5a7aa8 malc
    while (*opts) {
8259 cb5a7aa8 malc
        const char *nextopt;
8260 cb5a7aa8 malc
8261 cb5a7aa8 malc
        if (strstart(opts, ",retrace=", &nextopt)) {
8262 cb5a7aa8 malc
            opts = nextopt;
8263 cb5a7aa8 malc
            if (strstart(opts, "dumb", &nextopt))
8264 cb5a7aa8 malc
                vga_retrace_method = VGA_RETRACE_DUMB;
8265 cb5a7aa8 malc
            else if (strstart(opts, "precise", &nextopt))
8266 cb5a7aa8 malc
                vga_retrace_method = VGA_RETRACE_PRECISE;
8267 cb5a7aa8 malc
            else goto invalid_vga;
8268 cb5a7aa8 malc
        } else goto invalid_vga;
8269 cb5a7aa8 malc
        opts = nextopt;
8270 cb5a7aa8 malc
    }
8271 3893c124 malc
}
8272 3893c124 malc
8273 3587d7e6 bellard
#ifdef _WIN32
8274 3587d7e6 bellard
static BOOL WINAPI qemu_ctrl_handler(DWORD type)
8275 3587d7e6 bellard
{
8276 3587d7e6 bellard
    exit(STATUS_CONTROL_C_EXIT);
8277 3587d7e6 bellard
    return TRUE;
8278 3587d7e6 bellard
}
8279 3587d7e6 bellard
#endif
8280 3587d7e6 bellard
8281 8fcb1b90 blueswir1
static int qemu_uuid_parse(const char *str, uint8_t *uuid)
8282 8fcb1b90 blueswir1
{
8283 8fcb1b90 blueswir1
    int ret;
8284 8fcb1b90 blueswir1
8285 8fcb1b90 blueswir1
    if(strlen(str) != 36)
8286 8fcb1b90 blueswir1
        return -1;
8287 8fcb1b90 blueswir1
8288 8fcb1b90 blueswir1
    ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
8289 8fcb1b90 blueswir1
            &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
8290 8fcb1b90 blueswir1
            &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]);
8291 8fcb1b90 blueswir1
8292 8fcb1b90 blueswir1
    if(ret != 16)
8293 8fcb1b90 blueswir1
        return -1;
8294 8fcb1b90 blueswir1
8295 8fcb1b90 blueswir1
    return 0;
8296 8fcb1b90 blueswir1
}
8297 8fcb1b90 blueswir1
8298 7c9d8e07 bellard
#define MAX_NET_CLIENTS 32
8299 c20709aa bellard
8300 5b08fc10 aliguori
#ifndef _WIN32
8301 5b08fc10 aliguori
8302 5b08fc10 aliguori
static void termsig_handler(int signal)
8303 5b08fc10 aliguori
{
8304 5b08fc10 aliguori
    qemu_system_shutdown_request();
8305 5b08fc10 aliguori
}
8306 5b08fc10 aliguori
8307 6f9e3801 blueswir1
static void termsig_setup(void)
8308 5b08fc10 aliguori
{
8309 5b08fc10 aliguori
    struct sigaction act;
8310 5b08fc10 aliguori
8311 5b08fc10 aliguori
    memset(&act, 0, sizeof(act));
8312 5b08fc10 aliguori
    act.sa_handler = termsig_handler;
8313 5b08fc10 aliguori
    sigaction(SIGINT,  &act, NULL);
8314 5b08fc10 aliguori
    sigaction(SIGHUP,  &act, NULL);
8315 5b08fc10 aliguori
    sigaction(SIGTERM, &act, NULL);
8316 5b08fc10 aliguori
}
8317 5b08fc10 aliguori
8318 5b08fc10 aliguori
#endif
8319 5b08fc10 aliguori
8320 0824d6fc bellard
int main(int argc, char **argv)
8321 0824d6fc bellard
{
8322 67b915a5 bellard
#ifdef CONFIG_GDBSTUB
8323 cfc3475a pbrook
    int use_gdbstub;
8324 cfc3475a pbrook
    const char *gdbstub_port;
8325 67b915a5 bellard
#endif
8326 28c5af54 j_mayer
    uint32_t boot_devices_bitmap = 0;
8327 e4bcb14c ths
    int i;
8328 28c5af54 j_mayer
    int snapshot, linux_boot, net_boot;
8329 7f7f9873 bellard
    const char *initrd_filename;
8330 a20dd508 bellard
    const char *kernel_filename, *kernel_cmdline;
8331 28c5af54 j_mayer
    const char *boot_devices = "";
8332 313aa567 bellard
    DisplayState *ds = &display_state;
8333 46d4767d bellard
    int cyls, heads, secs, translation;
8334 fd5f393a pbrook
    const char *net_clients[MAX_NET_CLIENTS];
8335 7c9d8e07 bellard
    int nb_net_clients;
8336 e4bcb14c ths
    int hda_index;
8337 cd6f1169 bellard
    int optind;
8338 cd6f1169 bellard
    const char *r, *optarg;
8339 82c643ff bellard
    CharDriverState *monitor_hd;
8340 fd5f393a pbrook
    const char *monitor_device;
8341 fd5f393a pbrook
    const char *serial_devices[MAX_SERIAL_PORTS];
8342 8d11df9e bellard
    int serial_device_index;
8343 fd5f393a pbrook
    const char *parallel_devices[MAX_PARALLEL_PORTS];
8344 6508fe59 bellard
    int parallel_device_index;
8345 d63d307f bellard
    const char *loadvm = NULL;
8346 cc1daa40 bellard
    QEMUMachine *machine;
8347 94fc95cd j_mayer
    const char *cpu_model;
8348 fd5f393a pbrook
    const char *usb_devices[MAX_USB_CMDLINE];
8349 a594cfbf bellard
    int usb_devices_index;
8350 71e3ceb8 ths
    int fds[2];
8351 26a5f13b bellard
    int tb_size;
8352 93815bc2 ths
    const char *pid_file = NULL;
8353 833c7174 blueswir1
    VLANState *vlan;
8354 0bd48850 bellard
8355 0bd48850 bellard
    LIST_INIT (&vm_change_state_head);
8356 be995c27 bellard
#ifndef _WIN32
8357 be995c27 bellard
    {
8358 be995c27 bellard
        struct sigaction act;
8359 be995c27 bellard
        sigfillset(&act.sa_mask);
8360 be995c27 bellard
        act.sa_flags = 0;
8361 be995c27 bellard
        act.sa_handler = SIG_IGN;
8362 be995c27 bellard
        sigaction(SIGPIPE, &act, NULL);
8363 be995c27 bellard
    }
8364 3587d7e6 bellard
#else
8365 3587d7e6 bellard
    SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
8366 a8e5ac33 bellard
    /* Note: cpu_interrupt() is currently not SMP safe, so we force
8367 a8e5ac33 bellard
       QEMU to run on a single CPU */
8368 a8e5ac33 bellard
    {
8369 a8e5ac33 bellard
        HANDLE h;
8370 a8e5ac33 bellard
        DWORD mask, smask;
8371 a8e5ac33 bellard
        int i;
8372 a8e5ac33 bellard
        h = GetCurrentProcess();
8373 a8e5ac33 bellard
        if (GetProcessAffinityMask(h, &mask, &smask)) {
8374 a8e5ac33 bellard
            for(i = 0; i < 32; i++) {
8375 a8e5ac33 bellard
                if (mask & (1 << i))
8376 a8e5ac33 bellard
                    break;
8377 a8e5ac33 bellard
            }
8378 a8e5ac33 bellard
            if (i != 32) {
8379 a8e5ac33 bellard
                mask = 1 << i;
8380 a8e5ac33 bellard
                SetProcessAffinityMask(h, mask);
8381 a8e5ac33 bellard
            }
8382 a8e5ac33 bellard
        }
8383 a8e5ac33 bellard
    }
8384 67b915a5 bellard
#endif
8385 be995c27 bellard
8386 cc1daa40 bellard
    register_machines();
8387 cc1daa40 bellard
    machine = first_machine;
8388 94fc95cd j_mayer
    cpu_model = NULL;
8389 fc01f7e7 bellard
    initrd_filename = NULL;
8390 4fc5d071 aurel32
    ram_size = 0;
8391 313aa567 bellard
    vga_ram_size = VGA_RAM_SIZE;
8392 67b915a5 bellard
#ifdef CONFIG_GDBSTUB
8393 b4608c04 bellard
    use_gdbstub = 0;
8394 c636bb66 bellard
    gdbstub_port = DEFAULT_GDBSTUB_PORT;
8395 67b915a5 bellard
#endif
8396 33e3963e bellard
    snapshot = 0;
8397 a20dd508 bellard
    nographic = 0;
8398 4d3b6f6e balrog
    curses = 0;
8399 a20dd508 bellard
    kernel_filename = NULL;
8400 a20dd508 bellard
    kernel_cmdline = "";
8401 c4b1fcc0 bellard
    cyls = heads = secs = 0;
8402 46d4767d bellard
    translation = BIOS_ATA_TRANSLATION_AUTO;
8403 c60e08d9 pbrook
    monitor_device = "vc";
8404 c4b1fcc0 bellard
8405 c75a823c aurel32
    serial_devices[0] = "vc:80Cx24C";
8406 8d11df9e bellard
    for(i = 1; i < MAX_SERIAL_PORTS; i++)
8407 fd5f393a pbrook
        serial_devices[i] = NULL;
8408 8d11df9e bellard
    serial_device_index = 0;
8409 3b46e624 ths
8410 c75a823c aurel32
    parallel_devices[0] = "vc:640x480";
8411 6508fe59 bellard
    for(i = 1; i < MAX_PARALLEL_PORTS; i++)
8412 fd5f393a pbrook
        parallel_devices[i] = NULL;
8413 6508fe59 bellard
    parallel_device_index = 0;
8414 3b46e624 ths
8415 a594cfbf bellard
    usb_devices_index = 0;
8416 3b46e624 ths
8417 7c9d8e07 bellard
    nb_net_clients = 0;
8418 e4bcb14c ths
    nb_drives = 0;
8419 e4bcb14c ths
    nb_drives_opt = 0;
8420 e4bcb14c ths
    hda_index = -1;
8421 7c9d8e07 bellard
8422 7c9d8e07 bellard
    nb_nics = 0;
8423 3b46e624 ths
8424 26a5f13b bellard
    tb_size = 0;
8425 26a5f13b bellard
    
8426 cd6f1169 bellard
    optind = 1;
8427 0824d6fc bellard
    for(;;) {
8428 cd6f1169 bellard
        if (optind >= argc)
8429 0824d6fc bellard
            break;
8430 cd6f1169 bellard
        r = argv[optind];
8431 cd6f1169 bellard
        if (r[0] != '-') {
8432 609497ab balrog
            hda_index = drive_add(argv[optind++], HD_ALIAS, 0);
8433 cd6f1169 bellard
        } else {
8434 cd6f1169 bellard
            const QEMUOption *popt;
8435 cd6f1169 bellard
8436 cd6f1169 bellard
            optind++;
8437 dff5efc8 pbrook
            /* Treat --foo the same as -foo.  */
8438 dff5efc8 pbrook
            if (r[1] == '-')
8439 dff5efc8 pbrook
                r++;
8440 cd6f1169 bellard
            popt = qemu_options;
8441 cd6f1169 bellard
            for(;;) {
8442 cd6f1169 bellard
                if (!popt->name) {
8443 5fafdf24 ths
                    fprintf(stderr, "%s: invalid option -- '%s'\n",
8444 cd6f1169 bellard
                            argv[0], r);
8445 cd6f1169 bellard
                    exit(1);
8446 cd6f1169 bellard
                }
8447 cd6f1169 bellard
                if (!strcmp(popt->name, r + 1))
8448 cd6f1169 bellard
                    break;
8449 cd6f1169 bellard
                popt++;
8450 cd6f1169 bellard
            }
8451 cd6f1169 bellard
            if (popt->flags & HAS_ARG) {
8452 cd6f1169 bellard
                if (optind >= argc) {
8453 cd6f1169 bellard
                    fprintf(stderr, "%s: option '%s' requires an argument\n",
8454 cd6f1169 bellard
                            argv[0], r);
8455 cd6f1169 bellard
                    exit(1);
8456 cd6f1169 bellard
                }
8457 cd6f1169 bellard
                optarg = argv[optind++];
8458 cd6f1169 bellard
            } else {
8459 cd6f1169 bellard
                optarg = NULL;
8460 cd6f1169 bellard
            }
8461 cd6f1169 bellard
8462 cd6f1169 bellard
            switch(popt->index) {
8463 cc1daa40 bellard
            case QEMU_OPTION_M:
8464 cc1daa40 bellard
                machine = find_machine(optarg);
8465 cc1daa40 bellard
                if (!machine) {
8466 cc1daa40 bellard
                    QEMUMachine *m;
8467 cc1daa40 bellard
                    printf("Supported machines are:\n");
8468 cc1daa40 bellard
                    for(m = first_machine; m != NULL; m = m->next) {
8469 cc1daa40 bellard
                        printf("%-10s %s%s\n",
8470 5fafdf24 ths
                               m->name, m->desc,
8471 cc1daa40 bellard
                               m == first_machine ? " (default)" : "");
8472 cc1daa40 bellard
                    }
8473 15f82208 ths
                    exit(*optarg != '?');
8474 cc1daa40 bellard
                }
8475 cc1daa40 bellard
                break;
8476 94fc95cd j_mayer
            case QEMU_OPTION_cpu:
8477 94fc95cd j_mayer
                /* hw initialization will check this */
8478 15f82208 ths
                if (*optarg == '?') {
8479 c732abe2 j_mayer
/* XXX: implement xxx_cpu_list for targets that still miss it */
8480 c732abe2 j_mayer
#if defined(cpu_list)
8481 c732abe2 j_mayer
                    cpu_list(stdout, &fprintf);
8482 94fc95cd j_mayer
#endif
8483 15f82208 ths
                    exit(0);
8484 94fc95cd j_mayer
                } else {
8485 94fc95cd j_mayer
                    cpu_model = optarg;
8486 94fc95cd j_mayer
                }
8487 94fc95cd j_mayer
                break;
8488 cd6f1169 bellard
            case QEMU_OPTION_initrd:
8489 fc01f7e7 bellard
                initrd_filename = optarg;
8490 fc01f7e7 bellard
                break;
8491 cd6f1169 bellard
            case QEMU_OPTION_hda:
8492 e4bcb14c ths
                if (cyls == 0)
8493 609497ab balrog
                    hda_index = drive_add(optarg, HD_ALIAS, 0);
8494 e4bcb14c ths
                else
8495 609497ab balrog
                    hda_index = drive_add(optarg, HD_ALIAS
8496 e4bcb14c ths
                             ",cyls=%d,heads=%d,secs=%d%s",
8497 609497ab balrog
                             0, cyls, heads, secs,
8498 e4bcb14c ths
                             translation == BIOS_ATA_TRANSLATION_LBA ?
8499 e4bcb14c ths
                                 ",trans=lba" :
8500 e4bcb14c ths
                             translation == BIOS_ATA_TRANSLATION_NONE ?
8501 e4bcb14c ths
                                 ",trans=none" : "");
8502 e4bcb14c ths
                 break;
8503 cd6f1169 bellard
            case QEMU_OPTION_hdb:
8504 cc1daa40 bellard
            case QEMU_OPTION_hdc:
8505 cc1daa40 bellard
            case QEMU_OPTION_hdd:
8506 609497ab balrog
                drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda);
8507 fc01f7e7 bellard
                break;
8508 e4bcb14c ths
            case QEMU_OPTION_drive:
8509 609497ab balrog
                drive_add(NULL, "%s", optarg);
8510 e4bcb14c ths
                break;
8511 3e3d5815 balrog
            case QEMU_OPTION_mtdblock:
8512 609497ab balrog
                drive_add(optarg, MTD_ALIAS);
8513 3e3d5815 balrog
                break;
8514 a1bb27b1 pbrook
            case QEMU_OPTION_sd:
8515 609497ab balrog
                drive_add(optarg, SD_ALIAS);
8516 a1bb27b1 pbrook
                break;
8517 86f55663 j_mayer
            case QEMU_OPTION_pflash:
8518 609497ab balrog
                drive_add(optarg, PFLASH_ALIAS);
8519 86f55663 j_mayer
                break;
8520 cd6f1169 bellard
            case QEMU_OPTION_snapshot:
8521 33e3963e bellard
                snapshot = 1;
8522 33e3963e bellard
                break;
8523 cd6f1169 bellard
            case QEMU_OPTION_hdachs:
8524 330d0414 bellard
                {
8525 330d0414 bellard
                    const char *p;
8526 330d0414 bellard
                    p = optarg;
8527 330d0414 bellard
                    cyls = strtol(p, (char **)&p, 0);
8528 46d4767d bellard
                    if (cyls < 1 || cyls > 16383)
8529 46d4767d bellard
                        goto chs_fail;
8530 330d0414 bellard
                    if (*p != ',')
8531 330d0414 bellard
                        goto chs_fail;
8532 330d0414 bellard
                    p++;
8533 330d0414 bellard
                    heads = strtol(p, (char **)&p, 0);
8534 46d4767d bellard
                    if (heads < 1 || heads > 16)
8535 46d4767d bellard
                        goto chs_fail;
8536 330d0414 bellard
                    if (*p != ',')
8537 330d0414 bellard
                        goto chs_fail;
8538 330d0414 bellard
                    p++;
8539 330d0414 bellard
                    secs = strtol(p, (char **)&p, 0);
8540 46d4767d bellard
                    if (secs < 1 || secs > 63)
8541 46d4767d bellard
                        goto chs_fail;
8542 46d4767d bellard
                    if (*p == ',') {
8543 46d4767d bellard
                        p++;
8544 46d4767d bellard
                        if (!strcmp(p, "none"))
8545 46d4767d bellard
                            translation = BIOS_ATA_TRANSLATION_NONE;
8546 46d4767d bellard
                        else if (!strcmp(p, "lba"))
8547 46d4767d bellard
                            translation = BIOS_ATA_TRANSLATION_LBA;
8548 46d4767d bellard
                        else if (!strcmp(p, "auto"))
8549 46d4767d bellard
                            translation = BIOS_ATA_TRANSLATION_AUTO;
8550 46d4767d bellard
                        else
8551 46d4767d bellard
                            goto chs_fail;
8552 46d4767d bellard
                    } else if (*p != '\0') {
8553 c4b1fcc0 bellard
                    chs_fail:
8554 46d4767d bellard
                        fprintf(stderr, "qemu: invalid physical CHS format\n");
8555 46d4767d bellard
                        exit(1);
8556 c4b1fcc0 bellard
                    }
8557 e4bcb14c ths
                    if (hda_index != -1)
8558 609497ab balrog
                        snprintf(drives_opt[hda_index].opt,
8559 609497ab balrog
                                 sizeof(drives_opt[hda_index].opt),
8560 609497ab balrog
                                 HD_ALIAS ",cyls=%d,heads=%d,secs=%d%s",
8561 609497ab balrog
                                 0, cyls, heads, secs,
8562 e4bcb14c ths
                                 translation == BIOS_ATA_TRANSLATION_LBA ?
8563 e4bcb14c ths
                                         ",trans=lba" :
8564 e4bcb14c ths
                                 translation == BIOS_ATA_TRANSLATION_NONE ?
8565 e4bcb14c ths
                                     ",trans=none" : "");
8566 330d0414 bellard
                }
8567 330d0414 bellard
                break;
8568 cd6f1169 bellard
            case QEMU_OPTION_nographic:
8569 a20dd508 bellard
                nographic = 1;
8570 a20dd508 bellard
                break;
8571 4d3b6f6e balrog
#ifdef CONFIG_CURSES
8572 4d3b6f6e balrog
            case QEMU_OPTION_curses:
8573 4d3b6f6e balrog
                curses = 1;
8574 4d3b6f6e balrog
                break;
8575 4d3b6f6e balrog
#endif
8576 a171fe39 balrog
            case QEMU_OPTION_portrait:
8577 a171fe39 balrog
                graphic_rotate = 1;
8578 a171fe39 balrog
                break;
8579 cd6f1169 bellard
            case QEMU_OPTION_kernel:
8580 a20dd508 bellard
                kernel_filename = optarg;
8581 a20dd508 bellard
                break;
8582 cd6f1169 bellard
            case QEMU_OPTION_append:
8583 a20dd508 bellard
                kernel_cmdline = optarg;
8584 313aa567 bellard
                break;
8585 cd6f1169 bellard
            case QEMU_OPTION_cdrom:
8586 609497ab balrog
                drive_add(optarg, CDROM_ALIAS);
8587 36b486bb bellard
                break;
8588 cd6f1169 bellard
            case QEMU_OPTION_boot:
8589 28c5af54 j_mayer
                boot_devices = optarg;
8590 28c5af54 j_mayer
                /* We just do some generic consistency checks */
8591 28c5af54 j_mayer
                {
8592 28c5af54 j_mayer
                    /* Could easily be extended to 64 devices if needed */
8593 60fe76f3 ths
                    const char *p;
8594 28c5af54 j_mayer
                    
8595 28c5af54 j_mayer
                    boot_devices_bitmap = 0;
8596 28c5af54 j_mayer
                    for (p = boot_devices; *p != '\0'; p++) {
8597 28c5af54 j_mayer
                        /* Allowed boot devices are:
8598 28c5af54 j_mayer
                         * a b     : floppy disk drives
8599 28c5af54 j_mayer
                         * c ... f : IDE disk drives
8600 28c5af54 j_mayer
                         * g ... m : machine implementation dependant drives
8601 28c5af54 j_mayer
                         * n ... p : network devices
8602 28c5af54 j_mayer
                         * It's up to each machine implementation to check
8603 28c5af54 j_mayer
                         * if the given boot devices match the actual hardware
8604 28c5af54 j_mayer
                         * implementation and firmware features.
8605 28c5af54 j_mayer
                         */
8606 28c5af54 j_mayer
                        if (*p < 'a' || *p > 'q') {
8607 28c5af54 j_mayer
                            fprintf(stderr, "Invalid boot device '%c'\n", *p);
8608 28c5af54 j_mayer
                            exit(1);
8609 28c5af54 j_mayer
                        }
8610 28c5af54 j_mayer
                        if (boot_devices_bitmap & (1 << (*p - 'a'))) {
8611 28c5af54 j_mayer
                            fprintf(stderr,
8612 28c5af54 j_mayer
                                    "Boot device '%c' was given twice\n",*p);
8613 28c5af54 j_mayer
                            exit(1);
8614 28c5af54 j_mayer
                        }
8615 28c5af54 j_mayer
                        boot_devices_bitmap |= 1 << (*p - 'a');
8616 28c5af54 j_mayer
                    }
8617 36b486bb bellard
                }
8618 36b486bb bellard
                break;
8619 cd6f1169 bellard
            case QEMU_OPTION_fda:
8620 cd6f1169 bellard
            case QEMU_OPTION_fdb:
8621 609497ab balrog
                drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda);
8622 c45886db bellard
                break;
8623 52ca8d6a bellard
#ifdef TARGET_I386
8624 52ca8d6a bellard
            case QEMU_OPTION_no_fd_bootchk:
8625 52ca8d6a bellard
                fd_bootchk = 0;
8626 52ca8d6a bellard
                break;
8627 52ca8d6a bellard
#endif
8628 7c9d8e07 bellard
            case QEMU_OPTION_net:
8629 7c9d8e07 bellard
                if (nb_net_clients >= MAX_NET_CLIENTS) {
8630 7c9d8e07 bellard
                    fprintf(stderr, "qemu: too many network clients\n");
8631 c4b1fcc0 bellard
                    exit(1);
8632 c4b1fcc0 bellard
                }
8633 fd5f393a pbrook
                net_clients[nb_net_clients] = optarg;
8634 7c9d8e07 bellard
                nb_net_clients++;
8635 702c651c bellard
                break;
8636 c7f74643 bellard
#ifdef CONFIG_SLIRP
8637 c7f74643 bellard
            case QEMU_OPTION_tftp:
8638 c7f74643 bellard
                tftp_prefix = optarg;
8639 9bf05444 bellard
                break;
8640 47d5d01a ths
            case QEMU_OPTION_bootp:
8641 47d5d01a ths
                bootp_filename = optarg;
8642 47d5d01a ths
                break;
8643 c94c8d64 bellard
#ifndef _WIN32
8644 9d728e8c bellard
            case QEMU_OPTION_smb:
8645 9d728e8c bellard
                net_slirp_smb(optarg);
8646 9d728e8c bellard
                break;
8647 c94c8d64 bellard
#endif
8648 9bf05444 bellard
            case QEMU_OPTION_redir:
8649 3b46e624 ths
                net_slirp_redir(optarg);
8650 9bf05444 bellard
                break;
8651 c7f74643 bellard
#endif
8652 1d14ffa9 bellard
#ifdef HAS_AUDIO
8653 1d14ffa9 bellard
            case QEMU_OPTION_audio_help:
8654 1d14ffa9 bellard
                AUD_help ();
8655 1d14ffa9 bellard
                exit (0);
8656 1d14ffa9 bellard
                break;
8657 1d14ffa9 bellard
            case QEMU_OPTION_soundhw:
8658 1d14ffa9 bellard
                select_soundhw (optarg);
8659 1d14ffa9 bellard
                break;
8660 1d14ffa9 bellard
#endif
8661 cd6f1169 bellard
            case QEMU_OPTION_h:
8662 15f82208 ths
                help(0);
8663 cd6f1169 bellard
                break;
8664 00f82b8a aurel32
            case QEMU_OPTION_m: {
8665 00f82b8a aurel32
                uint64_t value;
8666 00f82b8a aurel32
                char *ptr;
8667 00f82b8a aurel32
8668 00f82b8a aurel32
                value = strtoul(optarg, &ptr, 10);
8669 00f82b8a aurel32
                switch (*ptr) {
8670 00f82b8a aurel32
                case 0: case 'M': case 'm':
8671 00f82b8a aurel32
                    value <<= 20;
8672 00f82b8a aurel32
                    break;
8673 00f82b8a aurel32
                case 'G': case 'g':
8674 00f82b8a aurel32
                    value <<= 30;
8675 00f82b8a aurel32
                    break;
8676 00f82b8a aurel32
                default:
8677 00f82b8a aurel32
                    fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
8678 cd6f1169 bellard
                    exit(1);
8679 cd6f1169 bellard
                }
8680 00f82b8a aurel32
8681 00f82b8a aurel32
                /* On 32-bit hosts, QEMU is limited by virtual address space */
8682 00f82b8a aurel32
                if (value > (2047 << 20)
8683 00f82b8a aurel32
#ifndef USE_KQEMU
8684 00f82b8a aurel32
                    && HOST_LONG_BITS == 32
8685 00f82b8a aurel32
#endif
8686 00f82b8a aurel32
                    ) {
8687 00f82b8a aurel32
                    fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n");
8688 00f82b8a aurel32
                    exit(1);
8689 00f82b8a aurel32
                }
8690 00f82b8a aurel32
                if (value != (uint64_t)(ram_addr_t)value) {
8691 00f82b8a aurel32
                    fprintf(stderr, "qemu: ram size too large\n");
8692 00f82b8a aurel32
                    exit(1);
8693 00f82b8a aurel32
                }
8694 00f82b8a aurel32
                ram_size = value;
8695 cd6f1169 bellard
                break;
8696 00f82b8a aurel32
            }
8697 cd6f1169 bellard
            case QEMU_OPTION_d:
8698 cd6f1169 bellard
                {
8699 cd6f1169 bellard
                    int mask;
8700 cd6f1169 bellard
                    CPULogItem *item;
8701 3b46e624 ths
8702 cd6f1169 bellard
                    mask = cpu_str_to_log_mask(optarg);
8703 cd6f1169 bellard
                    if (!mask) {
8704 cd6f1169 bellard
                        printf("Log items (comma separated):\n");
8705 f193c797 bellard
                    for(item = cpu_log_items; item->mask != 0; item++) {
8706 f193c797 bellard
                        printf("%-10s %s\n", item->name, item->help);
8707 f193c797 bellard
                    }
8708 f193c797 bellard
                    exit(1);
8709 cd6f1169 bellard
                    }
8710 cd6f1169 bellard
                    cpu_set_log(mask);
8711 f193c797 bellard
                }
8712 cd6f1169 bellard
                break;
8713 67b915a5 bellard
#ifdef CONFIG_GDBSTUB
8714 cd6f1169 bellard
            case QEMU_OPTION_s:
8715 cd6f1169 bellard
                use_gdbstub = 1;
8716 cd6f1169 bellard
                break;
8717 cd6f1169 bellard
            case QEMU_OPTION_p:
8718 cfc3475a pbrook
                gdbstub_port = optarg;
8719 cd6f1169 bellard
                break;
8720 67b915a5 bellard
#endif
8721 cd6f1169 bellard
            case QEMU_OPTION_L:
8722 cd6f1169 bellard
                bios_dir = optarg;
8723 cd6f1169 bellard
                break;
8724 1192dad8 j_mayer
            case QEMU_OPTION_bios:
8725 1192dad8 j_mayer
                bios_name = optarg;
8726 1192dad8 j_mayer
                break;
8727 cd6f1169 bellard
            case QEMU_OPTION_S:
8728 3c07f8e8 pbrook
                autostart = 0;
8729 cd6f1169 bellard
                break;
8730 3d11d0eb bellard
            case QEMU_OPTION_k:
8731 3d11d0eb bellard
                keyboard_layout = optarg;
8732 3d11d0eb bellard
                break;
8733 ee22c2f7 bellard
            case QEMU_OPTION_localtime:
8734 ee22c2f7 bellard
                rtc_utc = 0;
8735 ee22c2f7 bellard
                break;
8736 3893c124 malc
            case QEMU_OPTION_vga:
8737 3893c124 malc
                select_vgahw (optarg);
8738 1bfe856e bellard
                break;
8739 e9b137c2 bellard
            case QEMU_OPTION_g:
8740 e9b137c2 bellard
                {
8741 e9b137c2 bellard
                    const char *p;
8742 e9b137c2 bellard
                    int w, h, depth;
8743 e9b137c2 bellard
                    p = optarg;
8744 e9b137c2 bellard
                    w = strtol(p, (char **)&p, 10);
8745 e9b137c2 bellard
                    if (w <= 0) {
8746 e9b137c2 bellard
                    graphic_error:
8747 e9b137c2 bellard
                        fprintf(stderr, "qemu: invalid resolution or depth\n");
8748 e9b137c2 bellard
                        exit(1);
8749 e9b137c2 bellard
                    }
8750 e9b137c2 bellard
                    if (*p != 'x')
8751 e9b137c2 bellard
                        goto graphic_error;
8752 e9b137c2 bellard
                    p++;
8753 e9b137c2 bellard
                    h = strtol(p, (char **)&p, 10);
8754 e9b137c2 bellard
                    if (h <= 0)
8755 e9b137c2 bellard
                        goto graphic_error;
8756 e9b137c2 bellard
                    if (*p == 'x') {
8757 e9b137c2 bellard
                        p++;
8758 e9b137c2 bellard
                        depth = strtol(p, (char **)&p, 10);
8759 5fafdf24 ths
                        if (depth != 8 && depth != 15 && depth != 16 &&
8760 e9b137c2 bellard
                            depth != 24 && depth != 32)
8761 e9b137c2 bellard
                            goto graphic_error;
8762 e9b137c2 bellard
                    } else if (*p == '\0') {
8763 e9b137c2 bellard
                        depth = graphic_depth;
8764 e9b137c2 bellard
                    } else {
8765 e9b137c2 bellard
                        goto graphic_error;
8766 e9b137c2 bellard
                    }
8767 3b46e624 ths
8768 e9b137c2 bellard
                    graphic_width = w;
8769 e9b137c2 bellard
                    graphic_height = h;
8770 e9b137c2 bellard
                    graphic_depth = depth;
8771 e9b137c2 bellard
                }
8772 e9b137c2 bellard
                break;
8773 20d8a3ed ths
            case QEMU_OPTION_echr:
8774 20d8a3ed ths
                {
8775 20d8a3ed ths
                    char *r;
8776 20d8a3ed ths
                    term_escape_char = strtol(optarg, &r, 0);
8777 20d8a3ed ths
                    if (r == optarg)
8778 20d8a3ed ths
                        printf("Bad argument to echr\n");
8779 20d8a3ed ths
                    break;
8780 20d8a3ed ths
                }
8781 82c643ff bellard
            case QEMU_OPTION_monitor:
8782 fd5f393a pbrook
                monitor_device = optarg;
8783 82c643ff bellard
                break;
8784 82c643ff bellard
            case QEMU_OPTION_serial:
8785 8d11df9e bellard
                if (serial_device_index >= MAX_SERIAL_PORTS) {
8786 8d11df9e bellard
                    fprintf(stderr, "qemu: too many serial ports\n");
8787 8d11df9e bellard
                    exit(1);
8788 8d11df9e bellard
                }
8789 fd5f393a pbrook
                serial_devices[serial_device_index] = optarg;
8790 8d11df9e bellard
                serial_device_index++;
8791 82c643ff bellard
                break;
8792 6508fe59 bellard
            case QEMU_OPTION_parallel:
8793 6508fe59 bellard
                if (parallel_device_index >= MAX_PARALLEL_PORTS) {
8794 6508fe59 bellard
                    fprintf(stderr, "qemu: too many parallel ports\n");
8795 6508fe59 bellard
                    exit(1);
8796 6508fe59 bellard
                }
8797 fd5f393a pbrook
                parallel_devices[parallel_device_index] = optarg;
8798 6508fe59 bellard
                parallel_device_index++;
8799 6508fe59 bellard
                break;
8800 d63d307f bellard
            case QEMU_OPTION_loadvm:
8801 d63d307f bellard
                loadvm = optarg;
8802 d63d307f bellard
                break;
8803 d63d307f bellard
            case QEMU_OPTION_full_screen:
8804 d63d307f bellard
                full_screen = 1;
8805 d63d307f bellard
                break;
8806 667accab ths
#ifdef CONFIG_SDL
8807 43523e93 ths
            case QEMU_OPTION_no_frame:
8808 43523e93 ths
                no_frame = 1;
8809 43523e93 ths
                break;
8810 3780e197 ths
            case QEMU_OPTION_alt_grab:
8811 3780e197 ths
                alt_grab = 1;
8812 3780e197 ths
                break;
8813 667accab ths
            case QEMU_OPTION_no_quit:
8814 667accab ths
                no_quit = 1;
8815 667accab ths
                break;
8816 667accab ths
#endif
8817 f7cce898 bellard
            case QEMU_OPTION_pidfile:
8818 93815bc2 ths
                pid_file = optarg;
8819 f7cce898 bellard
                break;
8820 a09db21f bellard
#ifdef TARGET_I386
8821 a09db21f bellard
            case QEMU_OPTION_win2k_hack:
8822 a09db21f bellard
                win2k_install_hack = 1;
8823 a09db21f bellard
                break;
8824 a09db21f bellard
#endif
8825 d993e026 bellard
#ifdef USE_KQEMU
8826 d993e026 bellard
            case QEMU_OPTION_no_kqemu:
8827 d993e026 bellard
                kqemu_allowed = 0;
8828 d993e026 bellard
                break;
8829 89bfc105 bellard
            case QEMU_OPTION_kernel_kqemu:
8830 89bfc105 bellard
                kqemu_allowed = 2;
8831 89bfc105 bellard
                break;
8832 d993e026 bellard
#endif
8833 bb36d470 bellard
            case QEMU_OPTION_usb:
8834 bb36d470 bellard
                usb_enabled = 1;
8835 bb36d470 bellard
                break;
8836 a594cfbf bellard
            case QEMU_OPTION_usbdevice:
8837 a594cfbf bellard
                usb_enabled = 1;
8838 0d92ed30 pbrook
                if (usb_devices_index >= MAX_USB_CMDLINE) {
8839 a594cfbf bellard
                    fprintf(stderr, "Too many USB devices\n");
8840 a594cfbf bellard
                    exit(1);
8841 a594cfbf bellard
                }
8842 fd5f393a pbrook
                usb_devices[usb_devices_index] = optarg;
8843 a594cfbf bellard
                usb_devices_index++;
8844 a594cfbf bellard
                break;
8845 6a00d601 bellard
            case QEMU_OPTION_smp:
8846 6a00d601 bellard
                smp_cpus = atoi(optarg);
8847 ba3c64fb bellard
                if (smp_cpus < 1 || smp_cpus > MAX_CPUS) {
8848 6a00d601 bellard
                    fprintf(stderr, "Invalid number of CPUs\n");
8849 6a00d601 bellard
                    exit(1);
8850 6a00d601 bellard
                }
8851 6a00d601 bellard
                break;
8852 24236869 bellard
            case QEMU_OPTION_vnc:
8853 73fc9742 ths
                vnc_display = optarg;
8854 24236869 bellard
                break;
8855 6515b203 bellard
            case QEMU_OPTION_no_acpi:
8856 6515b203 bellard
                acpi_enabled = 0;
8857 6515b203 bellard
                break;
8858 d1beab82 bellard
            case QEMU_OPTION_no_reboot:
8859 d1beab82 bellard
                no_reboot = 1;
8860 d1beab82 bellard
                break;
8861 b2f76161 aurel32
            case QEMU_OPTION_no_shutdown:
8862 b2f76161 aurel32
                no_shutdown = 1;
8863 b2f76161 aurel32
                break;
8864 9467cd46 balrog
            case QEMU_OPTION_show_cursor:
8865 9467cd46 balrog
                cursor_hide = 0;
8866 9467cd46 balrog
                break;
8867 8fcb1b90 blueswir1
            case QEMU_OPTION_uuid:
8868 8fcb1b90 blueswir1
                if(qemu_uuid_parse(optarg, qemu_uuid) < 0) {
8869 8fcb1b90 blueswir1
                    fprintf(stderr, "Fail to parse UUID string."
8870 8fcb1b90 blueswir1
                            " Wrong format.\n");
8871 8fcb1b90 blueswir1
                    exit(1);
8872 8fcb1b90 blueswir1
                }
8873 8fcb1b90 blueswir1
                break;
8874 71e3ceb8 ths
            case QEMU_OPTION_daemonize:
8875 71e3ceb8 ths
                daemonize = 1;
8876 71e3ceb8 ths
                break;
8877 9ae02555 ths
            case QEMU_OPTION_option_rom:
8878 9ae02555 ths
                if (nb_option_roms >= MAX_OPTION_ROMS) {
8879 9ae02555 ths
                    fprintf(stderr, "Too many option ROMs\n");
8880 9ae02555 ths
                    exit(1);
8881 9ae02555 ths
                }
8882 9ae02555 ths
                option_rom[nb_option_roms] = optarg;
8883 9ae02555 ths
                nb_option_roms++;
8884 9ae02555 ths
                break;
8885 8e71621f pbrook
            case QEMU_OPTION_semihosting:
8886 8e71621f pbrook
                semihosting_enabled = 1;
8887 8e71621f pbrook
                break;
8888 c35734b2 ths
            case QEMU_OPTION_name:
8889 c35734b2 ths
                qemu_name = optarg;
8890 c35734b2 ths
                break;
8891 66508601 blueswir1
#ifdef TARGET_SPARC
8892 66508601 blueswir1
            case QEMU_OPTION_prom_env:
8893 66508601 blueswir1
                if (nb_prom_envs >= MAX_PROM_ENVS) {
8894 66508601 blueswir1
                    fprintf(stderr, "Too many prom variables\n");
8895 66508601 blueswir1
                    exit(1);
8896 66508601 blueswir1
                }
8897 66508601 blueswir1
                prom_envs[nb_prom_envs] = optarg;
8898 66508601 blueswir1
                nb_prom_envs++;
8899 66508601 blueswir1
                break;
8900 66508601 blueswir1
#endif
8901 2b8f2d41 balrog
#ifdef TARGET_ARM
8902 2b8f2d41 balrog
            case QEMU_OPTION_old_param:
8903 2b8f2d41 balrog
                old_param = 1;
8904 05ebd537 ths
                break;
8905 2b8f2d41 balrog
#endif
8906 f3dcfada ths
            case QEMU_OPTION_clock:
8907 f3dcfada ths
                configure_alarms(optarg);
8908 f3dcfada ths
                break;
8909 7e0af5d0 bellard
            case QEMU_OPTION_startdate:
8910 7e0af5d0 bellard
                {
8911 7e0af5d0 bellard
                    struct tm tm;
8912 f6503059 balrog
                    time_t rtc_start_date;
8913 7e0af5d0 bellard
                    if (!strcmp(optarg, "now")) {
8914 f6503059 balrog
                        rtc_date_offset = -1;
8915 7e0af5d0 bellard
                    } else {
8916 7e0af5d0 bellard
                        if (sscanf(optarg, "%d-%d-%dT%d:%d:%d",
8917 7e0af5d0 bellard
                               &tm.tm_year,
8918 7e0af5d0 bellard
                               &tm.tm_mon,
8919 7e0af5d0 bellard
                               &tm.tm_mday,
8920 7e0af5d0 bellard
                               &tm.tm_hour,
8921 7e0af5d0 bellard
                               &tm.tm_min,
8922 7e0af5d0 bellard
                               &tm.tm_sec) == 6) {
8923 7e0af5d0 bellard
                            /* OK */
8924 7e0af5d0 bellard
                        } else if (sscanf(optarg, "%d-%d-%d",
8925 7e0af5d0 bellard
                                          &tm.tm_year,
8926 7e0af5d0 bellard
                                          &tm.tm_mon,
8927 7e0af5d0 bellard
                                          &tm.tm_mday) == 3) {
8928 7e0af5d0 bellard
                            tm.tm_hour = 0;
8929 7e0af5d0 bellard
                            tm.tm_min = 0;
8930 7e0af5d0 bellard
                            tm.tm_sec = 0;
8931 7e0af5d0 bellard
                        } else {
8932 7e0af5d0 bellard
                            goto date_fail;
8933 7e0af5d0 bellard
                        }
8934 7e0af5d0 bellard
                        tm.tm_year -= 1900;
8935 7e0af5d0 bellard
                        tm.tm_mon--;
8936 3c6b2088 bellard
                        rtc_start_date = mktimegm(&tm);
8937 7e0af5d0 bellard
                        if (rtc_start_date == -1) {
8938 7e0af5d0 bellard
                        date_fail:
8939 7e0af5d0 bellard
                            fprintf(stderr, "Invalid date format. Valid format are:\n"
8940 7e0af5d0 bellard
                                    "'now' or '2006-06-17T16:01:21' or '2006-06-17'\n");
8941 7e0af5d0 bellard
                            exit(1);
8942 7e0af5d0 bellard
                        }
8943 f6503059 balrog
                        rtc_date_offset = time(NULL) - rtc_start_date;
8944 7e0af5d0 bellard
                    }
8945 7e0af5d0 bellard
                }
8946 7e0af5d0 bellard
                break;
8947 26a5f13b bellard
            case QEMU_OPTION_tb_size:
8948 26a5f13b bellard
                tb_size = strtol(optarg, NULL, 0);
8949 26a5f13b bellard
                if (tb_size < 0)
8950 26a5f13b bellard
                    tb_size = 0;
8951 26a5f13b bellard
                break;
8952 2e70f6ef pbrook
            case QEMU_OPTION_icount:
8953 2e70f6ef pbrook
                use_icount = 1;
8954 2e70f6ef pbrook
                if (strcmp(optarg, "auto") == 0) {
8955 2e70f6ef pbrook
                    icount_time_shift = -1;
8956 2e70f6ef pbrook
                } else {
8957 2e70f6ef pbrook
                    icount_time_shift = strtol(optarg, NULL, 0);
8958 2e70f6ef pbrook
                }
8959 2e70f6ef pbrook
                break;
8960 cd6f1169 bellard
            }
8961 0824d6fc bellard
        }
8962 0824d6fc bellard
    }
8963 330d0414 bellard
8964 bc0129d9 aliguori
    if (nographic) {
8965 bc0129d9 aliguori
       if (serial_device_index == 0)
8966 bc0129d9 aliguori
           serial_devices[0] = "stdio";
8967 bc0129d9 aliguori
       if (parallel_device_index == 0)
8968 bc0129d9 aliguori
           parallel_devices[0] = "null";
8969 bc0129d9 aliguori
       if (strncmp(monitor_device, "vc", 2) == 0)
8970 bc0129d9 aliguori
           monitor_device = "stdio";
8971 bc0129d9 aliguori
    }
8972 bc0129d9 aliguori
8973 71e3ceb8 ths
#ifndef _WIN32
8974 71e3ceb8 ths
    if (daemonize) {
8975 71e3ceb8 ths
        pid_t pid;
8976 71e3ceb8 ths
8977 71e3ceb8 ths
        if (pipe(fds) == -1)
8978 71e3ceb8 ths
            exit(1);
8979 71e3ceb8 ths
8980 71e3ceb8 ths
        pid = fork();
8981 71e3ceb8 ths
        if (pid > 0) {
8982 71e3ceb8 ths
            uint8_t status;
8983 71e3ceb8 ths
            ssize_t len;
8984 71e3ceb8 ths
8985 71e3ceb8 ths
            close(fds[1]);
8986 71e3ceb8 ths
8987 71e3ceb8 ths
        again:
8988 93815bc2 ths
            len = read(fds[0], &status, 1);
8989 93815bc2 ths
            if (len == -1 && (errno == EINTR))
8990 93815bc2 ths
                goto again;
8991 93815bc2 ths
8992 93815bc2 ths
            if (len != 1)
8993 93815bc2 ths
                exit(1);
8994 93815bc2 ths
            else if (status == 1) {
8995 93815bc2 ths
                fprintf(stderr, "Could not acquire pidfile\n");
8996 93815bc2 ths
                exit(1);
8997 93815bc2 ths
            } else
8998 93815bc2 ths
                exit(0);
8999 71e3ceb8 ths
        } else if (pid < 0)
9000 93815bc2 ths
            exit(1);
9001 71e3ceb8 ths
9002 71e3ceb8 ths
        setsid();
9003 71e3ceb8 ths
9004 71e3ceb8 ths
        pid = fork();
9005 71e3ceb8 ths
        if (pid > 0)
9006 71e3ceb8 ths
            exit(0);
9007 71e3ceb8 ths
        else if (pid < 0)
9008 71e3ceb8 ths
            exit(1);
9009 71e3ceb8 ths
9010 71e3ceb8 ths
        umask(027);
9011 71e3ceb8 ths
9012 71e3ceb8 ths
        signal(SIGTSTP, SIG_IGN);
9013 71e3ceb8 ths
        signal(SIGTTOU, SIG_IGN);
9014 71e3ceb8 ths
        signal(SIGTTIN, SIG_IGN);
9015 71e3ceb8 ths
    }
9016 71e3ceb8 ths
#endif
9017 71e3ceb8 ths
9018 aa26bb2d ths
    if (pid_file && qemu_create_pidfile(pid_file) != 0) {
9019 93815bc2 ths
        if (daemonize) {
9020 93815bc2 ths
            uint8_t status = 1;
9021 93815bc2 ths
            write(fds[1], &status, 1);
9022 93815bc2 ths
        } else
9023 93815bc2 ths
            fprintf(stderr, "Could not acquire pid file\n");
9024 93815bc2 ths
        exit(1);
9025 93815bc2 ths
    }
9026 93815bc2 ths
9027 ff3fbb30 bellard
#ifdef USE_KQEMU
9028 ff3fbb30 bellard
    if (smp_cpus > 1)
9029 ff3fbb30 bellard
        kqemu_allowed = 0;
9030 ff3fbb30 bellard
#endif
9031 a20dd508 bellard
    linux_boot = (kernel_filename != NULL);
9032 7317b8ca balrog
    net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
9033 6c41b272 balrog
9034 28c5af54 j_mayer
    if (!linux_boot && net_boot == 0 &&
9035 f88e4b91 blueswir1
        !machine->nodisk_ok && nb_drives_opt == 0)
9036 15f82208 ths
        help(1);
9037 0824d6fc bellard
9038 f8d39c01 ths
    if (!linux_boot && *kernel_cmdline != '\0') {
9039 f8d39c01 ths
        fprintf(stderr, "-append only allowed with -kernel option\n");
9040 f8d39c01 ths
        exit(1);
9041 f8d39c01 ths
    }
9042 f8d39c01 ths
9043 f8d39c01 ths
    if (!linux_boot && initrd_filename != NULL) {
9044 f8d39c01 ths
        fprintf(stderr, "-initrd only allowed with -kernel option\n");
9045 f8d39c01 ths
        exit(1);
9046 f8d39c01 ths
    }
9047 f8d39c01 ths
9048 96d30e48 ths
    /* boot to floppy or the default cd if no hard disk defined yet */
9049 28c5af54 j_mayer
    if (!boot_devices[0]) {
9050 e4bcb14c ths
        boot_devices = "cad";
9051 96d30e48 ths
    }
9052 b118d61e bellard
    setvbuf(stdout, NULL, _IOLBF, 0);
9053 3b46e624 ths
9054 634fce96 pbrook
    init_timers();
9055 634fce96 pbrook
    init_timer_alarm();
9056 2e70f6ef pbrook
    if (use_icount && icount_time_shift < 0) {
9057 2e70f6ef pbrook
        use_icount = 2;
9058 2e70f6ef pbrook
        /* 125MIPS seems a reasonable initial guess at the guest speed.
9059 2e70f6ef pbrook
           It will be corrected fairly quickly anyway.  */
9060 2e70f6ef pbrook
        icount_time_shift = 3;
9061 2e70f6ef pbrook
        init_icount_adjust();
9062 2e70f6ef pbrook
    }
9063 634fce96 pbrook
9064 fd1dff4b bellard
#ifdef _WIN32
9065 fd1dff4b bellard
    socket_init();
9066 fd1dff4b bellard
#endif
9067 fd1dff4b bellard
9068 7c9d8e07 bellard
    /* init network clients */
9069 7c9d8e07 bellard
    if (nb_net_clients == 0) {
9070 7c9d8e07 bellard
        /* if no clients, we use a default config */
9071 f441b28b aliguori
        net_clients[nb_net_clients++] = "nic";
9072 f441b28b aliguori
#ifdef CONFIG_SLIRP
9073 f441b28b aliguori
        net_clients[nb_net_clients++] = "user";
9074 f441b28b aliguori
#endif
9075 c20709aa bellard
    }
9076 c20709aa bellard
9077 7c9d8e07 bellard
    for(i = 0;i < nb_net_clients; i++) {
9078 9ad97e65 balrog
        if (net_client_parse(net_clients[i]) < 0)
9079 7c9d8e07 bellard
            exit(1);
9080 702c651c bellard
    }
9081 833c7174 blueswir1
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
9082 833c7174 blueswir1
        if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
9083 833c7174 blueswir1
            continue;
9084 9ad97e65 balrog
        if (vlan->nb_guest_devs == 0)
9085 9ad97e65 balrog
            fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
9086 833c7174 blueswir1
        if (vlan->nb_host_devs == 0)
9087 833c7174 blueswir1
            fprintf(stderr,
9088 833c7174 blueswir1
                    "Warning: vlan %d is not connected to host network\n",
9089 833c7174 blueswir1
                    vlan->id);
9090 833c7174 blueswir1
    }
9091 f1510b2c bellard
9092 eec85c2a ths
#ifdef TARGET_I386
9093 ed494d87 balrog
    /* XXX: this should be moved in the PC machine instantiation code */
9094 28c5af54 j_mayer
    if (net_boot != 0) {
9095 28c5af54 j_mayer
        int netroms = 0;
9096 28c5af54 j_mayer
        for (i = 0; i < nb_nics && i < 4; i++) {
9097 eec85c2a ths
            const char *model = nd_table[i].model;
9098 eec85c2a ths
            char buf[1024];
9099 28c5af54 j_mayer
            if (net_boot & (1 << i)) {
9100 28c5af54 j_mayer
                if (model == NULL)
9101 28c5af54 j_mayer
                    model = "ne2k_pci";
9102 28c5af54 j_mayer
                snprintf(buf, sizeof(buf), "%s/pxe-%s.bin", bios_dir, model);
9103 28c5af54 j_mayer
                if (get_image_size(buf) > 0) {
9104 28c5af54 j_mayer
                    if (nb_option_roms >= MAX_OPTION_ROMS) {
9105 28c5af54 j_mayer
                        fprintf(stderr, "Too many option ROMs\n");
9106 28c5af54 j_mayer
                        exit(1);
9107 28c5af54 j_mayer
                    }
9108 28c5af54 j_mayer
                    option_rom[nb_option_roms] = strdup(buf);
9109 28c5af54 j_mayer
                    nb_option_roms++;
9110 28c5af54 j_mayer
                    netroms++;
9111 28c5af54 j_mayer
                }
9112 28c5af54 j_mayer
            }
9113 eec85c2a ths
        }
9114 28c5af54 j_mayer
        if (netroms == 0) {
9115 eec85c2a ths
            fprintf(stderr, "No valid PXE rom found for network device\n");
9116 eec85c2a ths
            exit(1);
9117 eec85c2a ths
        }
9118 eec85c2a ths
    }
9119 eec85c2a ths
#endif
9120 eec85c2a ths
9121 0824d6fc bellard
    /* init the memory */
9122 7fb4fdcf balrog
    phys_ram_size = machine->ram_require & ~RAMSIZE_FIXED;
9123 7fb4fdcf balrog
9124 7fb4fdcf balrog
    if (machine->ram_require & RAMSIZE_FIXED) {
9125 7fb4fdcf balrog
        if (ram_size > 0) {
9126 7fb4fdcf balrog
            if (ram_size < phys_ram_size) {
9127 cd940061 aurel32
                fprintf(stderr, "Machine `%s' requires %llu bytes of memory\n",
9128 cd940061 aurel32
                                machine->name, (unsigned long long) phys_ram_size);
9129 7fb4fdcf balrog
                exit(-1);
9130 7fb4fdcf balrog
            }
9131 7fb4fdcf balrog
9132 7fb4fdcf balrog
            phys_ram_size = ram_size;
9133 7fb4fdcf balrog
        } else
9134 7fb4fdcf balrog
            ram_size = phys_ram_size;
9135 7fb4fdcf balrog
    } else {
9136 4fc5d071 aurel32
        if (ram_size == 0)
9137 7fb4fdcf balrog
            ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
9138 7fb4fdcf balrog
9139 7fb4fdcf balrog
        phys_ram_size += ram_size;
9140 7fb4fdcf balrog
    }
9141 9ae02555 ths
9142 d993e026 bellard
    phys_ram_base = qemu_vmalloc(phys_ram_size);
9143 7f7f9873 bellard
    if (!phys_ram_base) {
9144 7f7f9873 bellard
        fprintf(stderr, "Could not allocate physical memory\n");
9145 0824d6fc bellard
        exit(1);
9146 0824d6fc bellard
    }
9147 0824d6fc bellard
9148 26a5f13b bellard
    /* init the dynamic translator */
9149 26a5f13b bellard
    cpu_exec_init_all(tb_size * 1024 * 1024);
9150 26a5f13b bellard
9151 5905b2e5 bellard
    bdrv_init();
9152 c4b1fcc0 bellard
9153 e4bcb14c ths
    /* we always create the cdrom drive, even if no disk is there */
9154 c4b1fcc0 bellard
9155 e4bcb14c ths
    if (nb_drives_opt < MAX_DRIVES)
9156 609497ab balrog
        drive_add(NULL, CDROM_ALIAS);
9157 c4b1fcc0 bellard
9158 9d413d1d balrog
    /* we always create at least one floppy */
9159 33e3963e bellard
9160 e4bcb14c ths
    if (nb_drives_opt < MAX_DRIVES)
9161 609497ab balrog
        drive_add(NULL, FD_ALIAS, 0);
9162 86f55663 j_mayer
9163 9d413d1d balrog
    /* we always create one sd slot, even if no card is in it */
9164 9d413d1d balrog
9165 9d413d1d balrog
    if (nb_drives_opt < MAX_DRIVES)
9166 609497ab balrog
        drive_add(NULL, SD_ALIAS);
9167 9d413d1d balrog
9168 e4bcb14c ths
    /* open the virtual block devices */
9169 e4bcb14c ths
9170 e4bcb14c ths
    for(i = 0; i < nb_drives_opt; i++)
9171 609497ab balrog
        if (drive_init(&drives_opt[i], snapshot, machine) == -1)
9172 e4bcb14c ths
            exit(1);
9173 3e3d5815 balrog
9174 c88676f8 bellard
    register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
9175 c88676f8 bellard
    register_savevm("ram", 0, 2, ram_save, ram_load, NULL);
9176 8a7ddc38 bellard
9177 313aa567 bellard
    /* terminal init */
9178 740733bb ths
    memset(&display_state, 0, sizeof(display_state));
9179 a20dd508 bellard
    if (nographic) {
9180 4d3b6f6e balrog
        if (curses) {
9181 4d3b6f6e balrog
            fprintf(stderr, "fatal: -nographic can't be used with -curses\n");
9182 4d3b6f6e balrog
            exit(1);
9183 4d3b6f6e balrog
        }
9184 2ff89790 ths
        /* nearly nothing to do */
9185 2ff89790 ths
        dumb_display_init(ds);
9186 73fc9742 ths
    } else if (vnc_display != NULL) {
9187 71cab5ca ths
        vnc_display_init(ds);
9188 71cab5ca ths
        if (vnc_display_open(ds, vnc_display) < 0)
9189 71cab5ca ths
            exit(1);
9190 4d3b6f6e balrog
    } else
9191 4d3b6f6e balrog
#if defined(CONFIG_CURSES)
9192 4d3b6f6e balrog
    if (curses) {
9193 4d3b6f6e balrog
        curses_display_init(ds, full_screen);
9194 4d3b6f6e balrog
    } else
9195 4d3b6f6e balrog
#endif
9196 4d3b6f6e balrog
    {
9197 5b0753e0 bellard
#if defined(CONFIG_SDL)
9198 43523e93 ths
        sdl_display_init(ds, full_screen, no_frame);
9199 5b0753e0 bellard
#elif defined(CONFIG_COCOA)
9200 5b0753e0 bellard
        cocoa_display_init(ds, full_screen);
9201 67276f53 pbrook
#else
9202 67276f53 pbrook
        dumb_display_init(ds);
9203 313aa567 bellard
#endif
9204 313aa567 bellard
    }
9205 0824d6fc bellard
9206 5b08fc10 aliguori
#ifndef _WIN32
9207 5b08fc10 aliguori
    /* must be after terminal init, SDL library changes signal handlers */
9208 5b08fc10 aliguori
    termsig_setup();
9209 5b08fc10 aliguori
#endif
9210 5b08fc10 aliguori
9211 20d8a3ed ths
    /* Maintain compatibility with multiple stdio monitors */
9212 20d8a3ed ths
    if (!strcmp(monitor_device,"stdio")) {
9213 20d8a3ed ths
        for (i = 0; i < MAX_SERIAL_PORTS; i++) {
9214 fd5f393a pbrook
            const char *devname = serial_devices[i];
9215 fd5f393a pbrook
            if (devname && !strcmp(devname,"mon:stdio")) {
9216 fd5f393a pbrook
                monitor_device = NULL;
9217 20d8a3ed ths
                break;
9218 fd5f393a pbrook
            } else if (devname && !strcmp(devname,"stdio")) {
9219 fd5f393a pbrook
                monitor_device = NULL;
9220 fd5f393a pbrook
                serial_devices[i] = "mon:stdio";
9221 20d8a3ed ths
                break;
9222 20d8a3ed ths
            }
9223 20d8a3ed ths
        }
9224 20d8a3ed ths
    }
9225 fd5f393a pbrook
    if (monitor_device) {
9226 20d8a3ed ths
        monitor_hd = qemu_chr_open(monitor_device);
9227 20d8a3ed ths
        if (!monitor_hd) {
9228 20d8a3ed ths
            fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
9229 20d8a3ed ths
            exit(1);
9230 20d8a3ed ths
        }
9231 20d8a3ed ths
        monitor_init(monitor_hd, !nographic);
9232 82c643ff bellard
    }
9233 82c643ff bellard
9234 8d11df9e bellard
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
9235 c03b0f0f bellard
        const char *devname = serial_devices[i];
9236 fd5f393a pbrook
        if (devname && strcmp(devname, "none")) {
9237 c03b0f0f bellard
            serial_hds[i] = qemu_chr_open(devname);
9238 8d11df9e bellard
            if (!serial_hds[i]) {
9239 5fafdf24 ths
                fprintf(stderr, "qemu: could not open serial device '%s'\n",
9240 c03b0f0f bellard
                        devname);
9241 8d11df9e bellard
                exit(1);
9242 8d11df9e bellard
            }
9243 af3a9031 ths
            if (strstart(devname, "vc", 0))
9244 7ba1260a bellard
                qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
9245 8d11df9e bellard
        }
9246 82c643ff bellard
    }
9247 82c643ff bellard
9248 6508fe59 bellard
    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
9249 c03b0f0f bellard
        const char *devname = parallel_devices[i];
9250 fd5f393a pbrook
        if (devname && strcmp(devname, "none")) {
9251 c03b0f0f bellard
            parallel_hds[i] = qemu_chr_open(devname);
9252 6508fe59 bellard
            if (!parallel_hds[i]) {
9253 5fafdf24 ths
                fprintf(stderr, "qemu: could not open parallel device '%s'\n",
9254 c03b0f0f bellard
                        devname);
9255 6508fe59 bellard
                exit(1);
9256 6508fe59 bellard
            }
9257 af3a9031 ths
            if (strstart(devname, "vc", 0))
9258 7ba1260a bellard
                qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
9259 6508fe59 bellard
        }
9260 6508fe59 bellard
    }
9261 6508fe59 bellard
9262 b881c2c6 blueswir1
    machine->init(ram_size, vga_ram_size, boot_devices, ds,
9263 94fc95cd j_mayer
                  kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
9264 73332e5c bellard
9265 0d92ed30 pbrook
    /* init USB devices */
9266 0d92ed30 pbrook
    if (usb_enabled) {
9267 0d92ed30 pbrook
        for(i = 0; i < usb_devices_index; i++) {
9268 0d92ed30 pbrook
            if (usb_device_add(usb_devices[i]) < 0) {
9269 0d92ed30 pbrook
                fprintf(stderr, "Warning: could not add USB device %s\n",
9270 0d92ed30 pbrook
                        usb_devices[i]);
9271 0d92ed30 pbrook
            }
9272 0d92ed30 pbrook
        }
9273 0d92ed30 pbrook
    }
9274 0d92ed30 pbrook
9275 740733bb ths
    if (display_state.dpy_refresh) {
9276 740733bb ths
        display_state.gui_timer = qemu_new_timer(rt_clock, gui_update, &display_state);
9277 740733bb ths
        qemu_mod_timer(display_state.gui_timer, qemu_get_clock(rt_clock));
9278 740733bb ths
    }
9279 7f7f9873 bellard
9280 67b915a5 bellard
#ifdef CONFIG_GDBSTUB
9281 b4608c04 bellard
    if (use_gdbstub) {
9282 c636bb66 bellard
        /* XXX: use standard host:port notation and modify options
9283 c636bb66 bellard
           accordingly. */
9284 cfc3475a pbrook
        if (gdbserver_start(gdbstub_port) < 0) {
9285 cfc3475a pbrook
            fprintf(stderr, "qemu: could not open gdbstub device on port '%s'\n",
9286 c636bb66 bellard
                    gdbstub_port);
9287 8a7ddc38 bellard
            exit(1);
9288 8a7ddc38 bellard
        }
9289 45669e00 balrog
    }
9290 67b915a5 bellard
#endif
9291 45669e00 balrog
9292 d63d307f bellard
    if (loadvm)
9293 faea38e7 bellard
        do_loadvm(loadvm);
9294 d63d307f bellard
9295 67b915a5 bellard
    {
9296 5905b2e5 bellard
        /* XXX: simplify init */
9297 83ab7950 aliguori
        read_passwords();
9298 3c07f8e8 pbrook
        if (autostart) {
9299 5905b2e5 bellard
            vm_start();
9300 5905b2e5 bellard
        }
9301 0824d6fc bellard
    }
9302 ffd843bc ths
9303 71e3ceb8 ths
    if (daemonize) {
9304 71e3ceb8 ths
        uint8_t status = 0;
9305 71e3ceb8 ths
        ssize_t len;
9306 71e3ceb8 ths
        int fd;
9307 71e3ceb8 ths
9308 71e3ceb8 ths
    again1:
9309 71e3ceb8 ths
        len = write(fds[1], &status, 1);
9310 71e3ceb8 ths
        if (len == -1 && (errno == EINTR))
9311 71e3ceb8 ths
            goto again1;
9312 71e3ceb8 ths
9313 71e3ceb8 ths
        if (len != 1)
9314 71e3ceb8 ths
            exit(1);
9315 71e3ceb8 ths
9316 bd54b863 aliguori
        chdir("/");
9317 aeb30be6 balrog
        TFR(fd = open("/dev/null", O_RDWR));
9318 71e3ceb8 ths
        if (fd == -1)
9319 71e3ceb8 ths
            exit(1);
9320 71e3ceb8 ths
9321 71e3ceb8 ths
        dup2(fd, 0);
9322 71e3ceb8 ths
        dup2(fd, 1);
9323 71e3ceb8 ths
        dup2(fd, 2);
9324 71e3ceb8 ths
9325 71e3ceb8 ths
        close(fd);
9326 71e3ceb8 ths
    }
9327 71e3ceb8 ths
9328 8a7ddc38 bellard
    main_loop();
9329 40c3bac3 bellard
    quit_timers();
9330 b46a8906 ths
9331 7d294b61 ths
#if !defined(_WIN32)
9332 b46a8906 ths
    /* close network clients */
9333 b46a8906 ths
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
9334 b46a8906 ths
        VLANClientState *vc;
9335 b46a8906 ths
9336 7d294b61 ths
        for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
9337 b46a8906 ths
            if (vc->fd_read == tap_receive) {
9338 b46a8906 ths
                char ifname[64];
9339 b46a8906 ths
                TAPState *s = vc->opaque;
9340 b46a8906 ths
9341 b46a8906 ths
                if (sscanf(vc->info_str, "tap: ifname=%63s ", ifname) == 1 &&
9342 b46a8906 ths
                    s->down_script[0])
9343 b46a8906 ths
                    launch_script(s->down_script, ifname, s->fd);
9344 b46a8906 ths
            }
9345 8a16d273 ths
#if defined(CONFIG_VDE)
9346 8a16d273 ths
            if (vc->fd_read == vde_from_qemu) {
9347 8a16d273 ths
                VDEState *s = vc->opaque;
9348 8a16d273 ths
                vde_close(s->vde);
9349 8a16d273 ths
            }
9350 8a16d273 ths
#endif
9351 4fddf62a ths
        }
9352 7d294b61 ths
    }
9353 7d294b61 ths
#endif
9354 0824d6fc bellard
    return 0;
9355 0824d6fc bellard
}