Statistics
| Branch: | Revision:

root / vl.c @ 8fcb1b90

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

7002 c88676f8 bellard
            /* find if the memory block is available on a virtual
7003 c88676f8 bellard
               block device */
7004 c88676f8 bellard
            sector_num = -1;
7005 e4bcb14c ths
            for(j = 0; j < nb_drives; j++) {
7006 e4bcb14c ths
                sector_num = bdrv_hash_find(drives_table[j].bdrv,
7007 e4bcb14c ths
                                            phys_ram_base + i,
7008 e4bcb14c ths
                                            BDRV_HASH_BLOCK_SIZE);
7009 e4bcb14c ths
                if (sector_num >= 0)
7010 e4bcb14c ths
                    break;
7011 c88676f8 bellard
            }
7012 e4bcb14c ths
            if (j == nb_drives)
7013 c88676f8 bellard
                goto normal_compress;
7014 c88676f8 bellard
            buf[0] = 1;
7015 c88676f8 bellard
            buf[1] = j;
7016 c88676f8 bellard
            cpu_to_be64wu((uint64_t *)(buf + 2), sector_num);
7017 c88676f8 bellard
            ram_compress_buf(s, buf, 10);
7018 5fafdf24 ths
        } else
7019 c88676f8 bellard
#endif
7020 c88676f8 bellard
        {
7021 c88676f8 bellard
            //        normal_compress:
7022 c88676f8 bellard
            buf[0] = 0;
7023 c88676f8 bellard
            ram_compress_buf(s, buf, 1);
7024 c88676f8 bellard
            ram_compress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE);
7025 c88676f8 bellard
        }
7026 8a7ddc38 bellard
    }
7027 c88676f8 bellard
    ram_compress_close(s);
7028 8a7ddc38 bellard
}
7029 8a7ddc38 bellard
7030 8a7ddc38 bellard
static int ram_load(QEMUFile *f, void *opaque, int version_id)
7031 8a7ddc38 bellard
{
7032 c88676f8 bellard
    RamDecompressState s1, *s = &s1;
7033 c88676f8 bellard
    uint8_t buf[10];
7034 00f82b8a aurel32
    ram_addr_t i;
7035 8a7ddc38 bellard
7036 c88676f8 bellard
    if (version_id == 1)
7037 c88676f8 bellard
        return ram_load_v1(f, opaque);
7038 c88676f8 bellard
    if (version_id != 2)
7039 8a7ddc38 bellard
        return -EINVAL;
7040 8a7ddc38 bellard
    if (qemu_get_be32(f) != phys_ram_size)
7041 8a7ddc38 bellard
        return -EINVAL;
7042 c88676f8 bellard
    if (ram_decompress_open(s, f) < 0)
7043 c88676f8 bellard
        return -EINVAL;
7044 c88676f8 bellard
    for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
7045 c88676f8 bellard
        if (ram_decompress_buf(s, buf, 1) < 0) {
7046 c88676f8 bellard
            fprintf(stderr, "Error while reading ram block header\n");
7047 c88676f8 bellard
            goto error;
7048 c88676f8 bellard
        }
7049 c88676f8 bellard
        if (buf[0] == 0) {
7050 c88676f8 bellard
            if (ram_decompress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE) < 0) {
7051 00f82b8a aurel32
                fprintf(stderr, "Error while reading ram block address=0x%08" PRIx64, (uint64_t)i);
7052 c88676f8 bellard
                goto error;
7053 c88676f8 bellard
            }
7054 5fafdf24 ths
        } else
7055 c88676f8 bellard
#if 0
7056 c88676f8 bellard
        if (buf[0] == 1) {
7057 c88676f8 bellard
            int bs_index;
7058 c88676f8 bellard
            int64_t sector_num;
7059 c88676f8 bellard

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