Print this page
Enable pty-based serial console emulation in ioemu.
Signed-off-by: John Levon <john.levon@sun.com>
| Split |
Close |
| Expand all |
| Collapse all |
--- old/tools/ioemu/vl.c
+++ new/tools/ioemu/vl.c
1 1 /*
2 2 * QEMU System Emulator
3 3 *
4 4 * Copyright (c) 2003-2007 Fabrice Bellard
5 5 *
6 6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 7 * of this software and associated documentation files (the "Software"), to deal
8 8 * in the Software without restriction, including without limitation the rights
9 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 10 * copies of the Software, and to permit persons to whom the Software is
11 11 * furnished to do so, subject to the following conditions:
12 12 *
13 13 * The above copyright notice and this permission notice shall be included in
14 14 * all copies or substantial portions of the Software.
15 15 *
16 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 22 * THE SOFTWARE.
23 23 */
24 24 #include "vl.h"
25 25
26 26 #include <unistd.h>
27 27 #include <fcntl.h>
28 28 #include <signal.h>
29 29 #include <time.h>
30 30 #include <errno.h>
31 31 #include <sys/time.h>
32 32 #include <zlib.h>
33 33
34 34 #ifndef _WIN32
35 35 #include <sys/times.h>
36 36 #include <sys/wait.h>
37 37 #include <termios.h>
38 38 #include <sys/poll.h>
39 39 #include <sys/mman.h>
40 40 #include <sys/ioctl.h>
41 41 #include <sys/socket.h>
42 42 #include <netinet/in.h>
43 43 #include <arpa/inet.h>
44 44 #include <dirent.h>
45 45 #include <netdb.h>
46 46 #ifdef _BSD
|
↓ open down ↓ |
46 lines elided |
↑ open up ↑ |
47 47 #include <sys/stat.h>
48 48 #ifndef __APPLE__
49 49 #include <libutil.h>
50 50 #endif
51 51 #else
52 52 #ifdef __sun__
53 53 #include <libdlpi.h>
54 54 #include <sys/ethernet.h>
55 55 #include <stropts.h>
56 56 #include <sys/bufmod.h>
57 +#include <assert.h>
57 58 #else
58 59 #include <linux/if.h>
59 60 #include <linux/if_tun.h>
60 61 #include <pty.h>
61 62 #include <malloc.h>
62 63 #include <linux/rtc.h>
63 64 #include <linux/ppdev.h>
64 65 #endif
65 66 #endif
66 67 #endif
67 68
68 69 #if defined(CONFIG_SLIRP)
69 70 #include "libslirp.h"
70 71 #endif
71 72
72 73 #ifdef _WIN32
73 74 #include <malloc.h>
74 75 #include <sys/timeb.h>
75 76 #include <windows.h>
76 77 #define getopt_long_only getopt_long
77 78 #define memalign(align, size) malloc(size)
78 79 #endif
79 80
80 81 #include "qemu_socket.h"
81 82
82 83 #ifdef CONFIG_SDL
83 84 #ifdef __APPLE__
84 85 #include <SDL/SDL.h>
85 86 #endif
86 87 #endif /* CONFIG_SDL */
87 88
88 89 #ifdef CONFIG_COCOA
89 90 #undef main
90 91 #define main qemu_main
91 92 #endif /* CONFIG_COCOA */
92 93
93 94 #include "disas.h"
94 95
95 96 #include "exec-all.h"
96 97
97 98 #include <xen/hvm/params.h>
98 99 #define DEFAULT_NETWORK_SCRIPT "/etc/xen/qemu-ifup"
99 100 #define DEFAULT_BRIDGE "xenbr0"
100 101 #ifdef __sun__
101 102 #define SMBD_COMMAND "/usr/sfw/sbin/smbd"
102 103 #else
103 104 #define SMBD_COMMAND "/usr/sbin/smbd"
104 105 #endif
105 106
106 107 //#define DEBUG_UNUSED_IOPORT
107 108 //#define DEBUG_IOPORT
108 109
109 110 #define PHYS_RAM_MAX_SIZE (2047 * 1024 * 1024)
110 111
111 112 #ifdef TARGET_PPC
112 113 #define DEFAULT_RAM_SIZE 144
113 114 #else
114 115 #define DEFAULT_RAM_SIZE 128
115 116 #endif
116 117 /* in ms */
117 118 #define GUI_REFRESH_INTERVAL 30
118 119
119 120 /* Max number of USB devices that can be specified on the commandline. */
120 121 #define MAX_USB_CMDLINE 8
121 122
122 123 /* XXX: use a two level table to limit memory usage */
123 124 #define MAX_IOPORTS 65536
124 125
125 126 const char *bios_dir = CONFIG_QEMU_SHAREDIR;
126 127 char phys_ram_file[1024];
127 128 void *ioport_opaque[MAX_IOPORTS];
128 129 IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
129 130 IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
130 131 /* Note: bs_table[MAX_DISKS] is a dummy block driver if none available
131 132 to store the VM snapshots */
132 133 BlockDriverState *bs_table[MAX_DISKS + MAX_SCSI_DISKS + 1], *fd_table[MAX_FD];
133 134 /* point to the block driver where the snapshots are managed */
134 135 BlockDriverState *bs_snapshots;
135 136 int vga_ram_size;
136 137 int bios_size;
137 138 static DisplayState display_state;
138 139 int nographic;
139 140 int vncviewer;
140 141 int vncunused;
141 142 struct sockaddr_in vnclisten_addr;
142 143 const char* keyboard_layout = NULL;
143 144 int64_t ticks_per_sec;
144 145 char *boot_device = NULL;
145 146 uint64_t ram_size;
146 147 int pit_min_timer_count = 0;
147 148 int nb_nics;
148 149 NICInfo nd_table[MAX_NICS];
149 150 QEMUTimer *gui_timer;
150 151 int vm_running;
151 152 int rtc_utc = 1;
152 153 int cirrus_vga_enabled = 1;
153 154 #ifdef TARGET_SPARC
154 155 int graphic_width = 1024;
155 156 int graphic_height = 768;
156 157 #else
157 158 int graphic_width = 800;
158 159 int graphic_height = 600;
159 160 #endif
160 161 int graphic_depth = 15;
161 162 int full_screen = 0;
162 163 int no_quit = 0;
163 164 CharDriverState *serial_hds[MAX_SERIAL_PORTS];
164 165 CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
165 166 #ifdef TARGET_I386
166 167 int win2k_install_hack = 0;
167 168 #endif
168 169 int usb_enabled = 0;
169 170 static VLANState *first_vlan;
170 171 int smp_cpus = 1;
171 172 const char *vnc_display;
172 173 #if defined(TARGET_SPARC)
173 174 #define MAX_CPUS 16
174 175 #elif defined(TARGET_I386)
175 176 #define MAX_CPUS 255
176 177 #else
177 178 #define MAX_CPUS 1
178 179 #endif
179 180 int acpi_enabled = 0;
180 181 int fd_bootchk = 1;
181 182 int no_reboot = 0;
182 183 int daemonize = 0;
183 184 const char *option_rom[MAX_OPTION_ROMS];
184 185 int nb_option_roms;
185 186 int semihosting_enabled = 0;
186 187 int autostart = 1;
187 188
188 189 extern int vcpus;
189 190
190 191 int xc_handle;
191 192
192 193 time_t timeoffset = 0;
193 194
194 195 char domain_name[64] = "xVM-HVM-no-name";
195 196 extern int domid;
196 197
197 198 char vncpasswd[64];
198 199 unsigned char challenge[AUTHCHALLENGESIZE];
199 200
200 201 /***********************************************************/
201 202 /* x86 ISA bus support */
202 203
203 204 target_phys_addr_t isa_mem_base = 0;
204 205 PicState2 *isa_pic;
205 206
206 207 uint32_t default_ioport_readb(void *opaque, uint32_t address)
207 208 {
208 209 #ifdef DEBUG_UNUSED_IOPORT
209 210 fprintf(stderr, "inb: port=0x%04x\n", address);
210 211 #endif
211 212 return 0xff;
212 213 }
213 214
214 215 void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data)
215 216 {
216 217 #ifdef DEBUG_UNUSED_IOPORT
217 218 fprintf(stderr, "outb: port=0x%04x data=0x%02x\n", address, data);
218 219 #endif
219 220 }
220 221
221 222 /* default is to make two byte accesses */
222 223 uint32_t default_ioport_readw(void *opaque, uint32_t address)
223 224 {
224 225 uint32_t data;
225 226 IOPortReadFunc *func = ioport_read_table[0][address];
226 227 if (!func)
227 228 func = default_ioport_readb;
228 229 data = func(ioport_opaque[address], address);
229 230 address = (address + 1) & (MAX_IOPORTS - 1);
230 231 func = ioport_read_table[0][address];
231 232 if (!func)
232 233 func = default_ioport_readb;
233 234 data |= func(ioport_opaque[address], address) << 8;
234 235 return data;
235 236 }
236 237
237 238 void default_ioport_writew(void *opaque, uint32_t address, uint32_t data)
238 239 {
239 240 IOPortWriteFunc *func = ioport_write_table[0][address];
240 241 if (!func)
241 242 func = default_ioport_writeb;
242 243 func(ioport_opaque[address], address, data & 0xff);
243 244 address = (address + 1) & (MAX_IOPORTS - 1);
244 245 func = ioport_write_table[0][address];
245 246 if (!func)
246 247 func = default_ioport_writeb;
247 248 func(ioport_opaque[address], address, (data >> 8) & 0xff);
248 249 }
249 250
250 251 uint32_t default_ioport_readl(void *opaque, uint32_t address)
251 252 {
252 253 #ifdef DEBUG_UNUSED_IOPORT
253 254 fprintf(stderr, "inl: port=0x%04x\n", address);
254 255 #endif
255 256 return 0xffffffff;
256 257 }
257 258
258 259 void default_ioport_writel(void *opaque, uint32_t address, uint32_t data)
259 260 {
260 261 #ifdef DEBUG_UNUSED_IOPORT
261 262 fprintf(stderr, "outl: port=0x%04x data=0x%02x\n", address, data);
262 263 #endif
263 264 }
264 265
265 266 void init_ioports(void)
266 267 {
267 268 }
268 269
269 270 /* size is the word size in byte */
270 271 int register_ioport_read(int start, int length, int size,
271 272 IOPortReadFunc *func, void *opaque)
272 273 {
273 274 int i, bsize;
274 275
275 276 if (size == 1) {
276 277 bsize = 0;
277 278 } else if (size == 2) {
278 279 bsize = 1;
279 280 } else if (size == 4) {
280 281 bsize = 2;
281 282 } else {
282 283 hw_error("register_ioport_read: invalid size");
283 284 return -1;
284 285 }
285 286 for(i = start; i < start + length; i += size) {
286 287 ioport_read_table[bsize][i] = func;
287 288 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
288 289 hw_error("register_ioport_write: invalid opaque");
289 290 ioport_opaque[i] = opaque;
290 291 }
291 292 return 0;
292 293 }
293 294
294 295 /* size is the word size in byte */
295 296 int register_ioport_write(int start, int length, int size,
296 297 IOPortWriteFunc *func, void *opaque)
297 298 {
298 299 int i, bsize;
299 300
300 301 if (size == 1) {
301 302 bsize = 0;
302 303 } else if (size == 2) {
303 304 bsize = 1;
304 305 } else if (size == 4) {
305 306 bsize = 2;
306 307 } else {
307 308 hw_error("register_ioport_write: invalid size");
308 309 return -1;
309 310 }
310 311 for(i = start; i < start + length; i += size) {
311 312 ioport_write_table[bsize][i] = func;
312 313 if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
313 314 hw_error("register_ioport_write: invalid opaque");
314 315 ioport_opaque[i] = opaque;
315 316 }
316 317 return 0;
317 318 }
318 319
319 320 void isa_unassign_ioport(int start, int length)
320 321 {
321 322 int i;
322 323
323 324 for(i = start; i < start + length; i++) {
324 325 ioport_read_table[0][i] = default_ioport_readb;
325 326 ioport_read_table[1][i] = default_ioport_readw;
326 327 ioport_read_table[2][i] = default_ioport_readl;
327 328
328 329 ioport_write_table[0][i] = default_ioport_writeb;
329 330 ioport_write_table[1][i] = default_ioport_writew;
330 331 ioport_write_table[2][i] = default_ioport_writel;
331 332 }
332 333 }
333 334
334 335 /***********************************************************/
335 336
336 337 void cpu_outb(CPUState *env, int addr, int val)
337 338 {
338 339 IOPortWriteFunc *func = ioport_write_table[0][addr];
339 340 if (!func)
340 341 func = default_ioport_writeb;
341 342 #ifdef DEBUG_IOPORT
342 343 if (loglevel & CPU_LOG_IOPORT)
343 344 fprintf(logfile, "outb: %04x %02x\n", addr, val);
344 345 #endif
345 346 func(ioport_opaque[addr], addr, val);
346 347 #ifdef USE_KQEMU
347 348 if (env)
348 349 env->last_io_time = cpu_get_time_fast();
349 350 #endif
350 351 }
351 352
352 353 void cpu_outw(CPUState *env, int addr, int val)
353 354 {
354 355 IOPortWriteFunc *func = ioport_write_table[1][addr];
355 356 if (!func)
356 357 func = default_ioport_writew;
357 358 #ifdef DEBUG_IOPORT
358 359 if (loglevel & CPU_LOG_IOPORT)
359 360 fprintf(logfile, "outw: %04x %04x\n", addr, val);
360 361 #endif
361 362 func(ioport_opaque[addr], addr, val);
362 363 #ifdef USE_KQEMU
363 364 if (env)
364 365 env->last_io_time = cpu_get_time_fast();
365 366 #endif
366 367 }
367 368
368 369 void cpu_outl(CPUState *env, int addr, int val)
369 370 {
370 371 IOPortWriteFunc *func = ioport_write_table[2][addr];
371 372 if (!func)
372 373 func = default_ioport_writel;
373 374 #ifdef DEBUG_IOPORT
374 375 if (loglevel & CPU_LOG_IOPORT)
375 376 fprintf(logfile, "outl: %04x %08x\n", addr, val);
376 377 #endif
377 378 func(ioport_opaque[addr], addr, val);
378 379 #ifdef USE_KQEMU
379 380 if (env)
380 381 env->last_io_time = cpu_get_time_fast();
381 382 #endif
382 383 }
383 384
384 385 int cpu_inb(CPUState *env, int addr)
385 386 {
386 387 int val;
387 388 IOPortReadFunc *func = ioport_read_table[0][addr];
388 389 if (!func)
389 390 func = default_ioport_readb;
390 391 val = func(ioport_opaque[addr], addr);
391 392 #ifdef DEBUG_IOPORT
392 393 if (loglevel & CPU_LOG_IOPORT)
393 394 fprintf(logfile, "inb : %04x %02x\n", addr, val);
394 395 #endif
395 396 #ifdef USE_KQEMU
396 397 if (env)
397 398 env->last_io_time = cpu_get_time_fast();
398 399 #endif
399 400 return val;
400 401 }
401 402
402 403 int cpu_inw(CPUState *env, int addr)
403 404 {
404 405 int val;
405 406 IOPortReadFunc *func = ioport_read_table[1][addr];
406 407 if (!func)
407 408 func = default_ioport_readw;
408 409 val = func(ioport_opaque[addr], addr);
409 410 #ifdef DEBUG_IOPORT
410 411 if (loglevel & CPU_LOG_IOPORT)
411 412 fprintf(logfile, "inw : %04x %04x\n", addr, val);
412 413 #endif
413 414 #ifdef USE_KQEMU
414 415 if (env)
415 416 env->last_io_time = cpu_get_time_fast();
416 417 #endif
417 418 return val;
418 419 }
419 420
420 421 int cpu_inl(CPUState *env, int addr)
421 422 {
422 423 int val;
423 424 IOPortReadFunc *func = ioport_read_table[2][addr];
424 425 if (!func)
425 426 func = default_ioport_readl;
426 427 val = func(ioport_opaque[addr], addr);
427 428 #ifdef DEBUG_IOPORT
428 429 if (loglevel & CPU_LOG_IOPORT)
429 430 fprintf(logfile, "inl : %04x %08x\n", addr, val);
430 431 #endif
431 432 #ifdef USE_KQEMU
432 433 if (env)
433 434 env->last_io_time = cpu_get_time_fast();
434 435 #endif
435 436 return val;
436 437 }
437 438
438 439 /***********************************************************/
439 440 void hw_error(const char *fmt, ...)
440 441 {
441 442 va_list ap;
442 443 #ifndef CONFIG_DM
443 444 CPUState *env;
444 445 #endif /* !CONFIG_DM */
445 446
446 447 va_start(ap, fmt);
447 448 fprintf(stderr, "qemu: hardware error: ");
448 449 vfprintf(stderr, fmt, ap);
449 450 fprintf(stderr, "\n");
450 451 #ifndef CONFIG_DM
451 452 for(env = first_cpu; env != NULL; env = env->next_cpu) {
452 453 fprintf(stderr, "CPU #%d:\n", env->cpu_index);
453 454 #ifdef TARGET_I386
454 455 cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
455 456 #else
456 457 cpu_dump_state(env, stderr, fprintf, 0);
457 458 #endif
458 459 }
459 460 #endif /* !CONFIG_DM */
460 461 va_end(ap);
461 462 abort();
462 463 }
463 464
464 465 /***********************************************************/
465 466 /* keyboard/mouse */
466 467
467 468 static QEMUPutKBDEvent *qemu_put_kbd_event;
468 469 static void *qemu_put_kbd_event_opaque;
469 470 static QEMUPutMouseEntry *qemu_put_mouse_event_head;
470 471 static QEMUPutMouseEntry *qemu_put_mouse_event_current;
471 472
472 473 void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
473 474 {
474 475 qemu_put_kbd_event_opaque = opaque;
475 476 qemu_put_kbd_event = func;
476 477 }
477 478
478 479 QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
479 480 void *opaque, int absolute,
480 481 const char *name)
481 482 {
482 483 QEMUPutMouseEntry *s, *cursor;
483 484
484 485 s = qemu_mallocz(sizeof(QEMUPutMouseEntry));
485 486 if (!s)
486 487 return NULL;
487 488
488 489 s->qemu_put_mouse_event = func;
489 490 s->qemu_put_mouse_event_opaque = opaque;
490 491 s->qemu_put_mouse_event_absolute = absolute;
491 492 s->qemu_put_mouse_event_name = qemu_strdup(name);
492 493 s->next = NULL;
493 494
494 495 if (!qemu_put_mouse_event_head) {
495 496 qemu_put_mouse_event_head = qemu_put_mouse_event_current = s;
496 497 return s;
497 498 }
498 499
499 500 cursor = qemu_put_mouse_event_head;
500 501 while (cursor->next != NULL)
501 502 cursor = cursor->next;
502 503
503 504 cursor->next = s;
504 505 qemu_put_mouse_event_current = s;
505 506
506 507 return s;
507 508 }
508 509
509 510 void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry)
510 511 {
511 512 QEMUPutMouseEntry *prev = NULL, *cursor;
512 513
513 514 if (!qemu_put_mouse_event_head || entry == NULL)
514 515 return;
515 516
516 517 cursor = qemu_put_mouse_event_head;
517 518 while (cursor != NULL && cursor != entry) {
518 519 prev = cursor;
519 520 cursor = cursor->next;
520 521 }
521 522
522 523 if (cursor == NULL) // does not exist or list empty
523 524 return;
524 525 else if (prev == NULL) { // entry is head
525 526 qemu_put_mouse_event_head = cursor->next;
526 527 if (qemu_put_mouse_event_current == entry)
527 528 qemu_put_mouse_event_current = cursor->next;
528 529 qemu_free(entry->qemu_put_mouse_event_name);
529 530 qemu_free(entry);
530 531 return;
531 532 }
532 533
533 534 prev->next = entry->next;
534 535
535 536 if (qemu_put_mouse_event_current == entry)
536 537 qemu_put_mouse_event_current = prev;
537 538
538 539 qemu_free(entry->qemu_put_mouse_event_name);
539 540 qemu_free(entry);
540 541 }
541 542
542 543 void kbd_put_keycode(int keycode)
543 544 {
544 545 if (qemu_put_kbd_event) {
545 546 qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
546 547 }
547 548 }
548 549
549 550 void kbd_mouse_event(int dx, int dy, int dz, int buttons_state)
550 551 {
551 552 QEMUPutMouseEvent *mouse_event;
552 553 void *mouse_event_opaque;
553 554
554 555 if (!qemu_put_mouse_event_current) {
555 556 return;
556 557 }
557 558
558 559 mouse_event =
559 560 qemu_put_mouse_event_current->qemu_put_mouse_event;
560 561 mouse_event_opaque =
561 562 qemu_put_mouse_event_current->qemu_put_mouse_event_opaque;
562 563
563 564 if (mouse_event) {
564 565 mouse_event(mouse_event_opaque, dx, dy, dz, buttons_state);
565 566 }
566 567 }
567 568
568 569 int kbd_mouse_is_absolute(void)
569 570 {
570 571 if (!qemu_put_mouse_event_current)
571 572 return 0;
572 573
573 574 return qemu_put_mouse_event_current->qemu_put_mouse_event_absolute;
574 575 }
575 576
576 577 void do_info_mice(void)
577 578 {
578 579 QEMUPutMouseEntry *cursor;
579 580 int index = 0;
580 581
581 582 if (!qemu_put_mouse_event_head) {
582 583 term_printf("No mouse devices connected\n");
583 584 return;
584 585 }
585 586
586 587 term_printf("Mouse devices available:\n");
587 588 cursor = qemu_put_mouse_event_head;
588 589 while (cursor != NULL) {
589 590 term_printf("%c Mouse #%d: %s\n",
590 591 (cursor == qemu_put_mouse_event_current ? '*' : ' '),
591 592 index, cursor->qemu_put_mouse_event_name);
592 593 index++;
593 594 cursor = cursor->next;
594 595 }
595 596 }
596 597
597 598 void do_mouse_set(int index)
598 599 {
599 600 QEMUPutMouseEntry *cursor;
600 601 int i = 0;
601 602
602 603 if (!qemu_put_mouse_event_head) {
603 604 term_printf("No mouse devices connected\n");
604 605 return;
605 606 }
606 607
607 608 cursor = qemu_put_mouse_event_head;
608 609 while (cursor != NULL && index != i) {
609 610 i++;
610 611 cursor = cursor->next;
611 612 }
612 613
613 614 if (cursor != NULL)
614 615 qemu_put_mouse_event_current = cursor;
615 616 else
616 617 term_printf("Mouse at given index not found\n");
617 618 }
618 619
619 620 /* compute with 96 bit intermediate result: (a*b)/c */
620 621 uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
621 622 {
622 623 union {
623 624 uint64_t ll;
624 625 struct {
625 626 #ifdef WORDS_BIGENDIAN
626 627 uint32_t high, low;
627 628 #else
628 629 uint32_t low, high;
629 630 #endif
630 631 } l;
631 632 } u, res;
632 633 uint64_t rl, rh;
633 634
634 635 u.ll = a;
635 636 rl = (uint64_t)u.l.low * (uint64_t)b;
636 637 rh = (uint64_t)u.l.high * (uint64_t)b;
637 638 rh += (rl >> 32);
638 639 res.l.high = rh / c;
639 640 res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
640 641 return res.ll;
641 642 }
642 643
643 644 /***********************************************************/
644 645 /* real time host monotonic timer */
645 646
646 647 #define QEMU_TIMER_BASE 1000000000LL
647 648
648 649 #ifdef WIN32
649 650
650 651 static int64_t clock_freq;
651 652
652 653 static void init_get_clock(void)
653 654 {
654 655 LARGE_INTEGER freq;
655 656 int ret;
656 657 ret = QueryPerformanceFrequency(&freq);
657 658 if (ret == 0) {
658 659 fprintf(stderr, "Could not calibrate ticks\n");
659 660 exit(1);
660 661 }
661 662 clock_freq = freq.QuadPart;
662 663 }
663 664
664 665 static int64_t get_clock(void)
665 666 {
666 667 LARGE_INTEGER ti;
667 668 QueryPerformanceCounter(&ti);
668 669 return muldiv64(ti.QuadPart, QEMU_TIMER_BASE, clock_freq);
669 670 }
670 671
671 672 #else
672 673
673 674 static int use_rt_clock;
674 675
675 676 static void init_get_clock(void)
676 677 {
677 678 use_rt_clock = 0;
678 679 #if defined(__linux__)
679 680 {
680 681 struct timespec ts;
681 682 if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
682 683 use_rt_clock = 1;
683 684 }
684 685 }
685 686 #endif
686 687 }
687 688
688 689 static int64_t get_clock(void)
689 690 {
690 691 #if defined(__linux__)
691 692 if (use_rt_clock) {
692 693 struct timespec ts;
693 694 clock_gettime(CLOCK_MONOTONIC, &ts);
694 695 return ts.tv_sec * 1000000000LL + ts.tv_nsec;
695 696 } else
696 697 #endif
697 698 {
698 699 /* XXX: using gettimeofday leads to problems if the date
699 700 changes, so it should be avoided. */
700 701 struct timeval tv;
701 702 gettimeofday(&tv, NULL);
702 703 return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
703 704 }
704 705 }
705 706
706 707 #endif
707 708
708 709 /***********************************************************/
709 710 /* guest cycle counter */
710 711
711 712 static int64_t cpu_ticks_prev;
712 713 static int64_t cpu_ticks_offset;
713 714 static int64_t cpu_clock_offset;
714 715 static int cpu_ticks_enabled;
715 716
716 717 /* return the host CPU cycle counter and handle stop/restart */
717 718 int64_t cpu_get_ticks(void)
718 719 {
719 720 if (!cpu_ticks_enabled) {
720 721 return cpu_ticks_offset;
721 722 } else {
722 723 int64_t ticks;
723 724 ticks = cpu_get_real_ticks();
724 725 if (cpu_ticks_prev > ticks) {
725 726 /* Note: non increasing ticks may happen if the host uses
726 727 software suspend */
727 728 cpu_ticks_offset += cpu_ticks_prev - ticks;
728 729 }
729 730 cpu_ticks_prev = ticks;
730 731 return ticks + cpu_ticks_offset;
731 732 }
732 733 }
733 734
734 735 /* return the host CPU monotonic timer and handle stop/restart */
735 736 static int64_t cpu_get_clock(void)
736 737 {
737 738 int64_t ti;
738 739 if (!cpu_ticks_enabled) {
739 740 return cpu_clock_offset;
740 741 } else {
741 742 ti = get_clock();
742 743 return ti + cpu_clock_offset;
743 744 }
744 745 }
745 746
746 747 /* enable cpu_get_ticks() */
747 748 void cpu_enable_ticks(void)
748 749 {
749 750 if (!cpu_ticks_enabled) {
750 751 cpu_ticks_offset -= cpu_get_real_ticks();
751 752 cpu_clock_offset -= get_clock();
752 753 cpu_ticks_enabled = 1;
753 754 }
754 755 }
755 756
756 757 /* disable cpu_get_ticks() : the clock is stopped. You must not call
757 758 cpu_get_ticks() after that. */
758 759 void cpu_disable_ticks(void)
759 760 {
760 761 if (cpu_ticks_enabled) {
761 762 cpu_ticks_offset = cpu_get_ticks();
762 763 cpu_clock_offset = cpu_get_clock();
763 764 cpu_ticks_enabled = 0;
764 765 }
765 766 }
766 767
767 768 /***********************************************************/
768 769 /* timers */
769 770
770 771 #define QEMU_TIMER_REALTIME 0
771 772 #define QEMU_TIMER_VIRTUAL 1
772 773
773 774 struct QEMUClock {
774 775 int type;
775 776 /* XXX: add frequency */
776 777 };
777 778
778 779 struct QEMUTimer {
779 780 QEMUClock *clock;
780 781 int64_t expire_time;
781 782 QEMUTimerCB *cb;
782 783 void *opaque;
783 784 struct QEMUTimer *next;
784 785 };
785 786
786 787 QEMUClock *rt_clock;
787 788 QEMUClock *vm_clock;
788 789
789 790 static QEMUTimer *active_timers[2];
790 791 #ifdef _WIN32
791 792 static MMRESULT timerID;
792 793 static HANDLE host_alarm = NULL;
793 794 static unsigned int period = 1;
794 795 #else
795 796 /* frequency of the times() clock tick */
796 797 static int timer_freq;
797 798 #endif
798 799
799 800 QEMUClock *qemu_new_clock(int type)
800 801 {
801 802 QEMUClock *clock;
802 803 clock = qemu_mallocz(sizeof(QEMUClock));
803 804 if (!clock)
804 805 return NULL;
805 806 clock->type = type;
806 807 return clock;
807 808 }
808 809
809 810 QEMUTimer *qemu_new_timer(QEMUClock *clock, QEMUTimerCB *cb, void *opaque)
810 811 {
811 812 QEMUTimer *ts;
812 813
813 814 ts = qemu_mallocz(sizeof(QEMUTimer));
814 815 ts->clock = clock;
815 816 ts->cb = cb;
816 817 ts->opaque = opaque;
817 818 return ts;
818 819 }
819 820
820 821 void qemu_free_timer(QEMUTimer *ts)
821 822 {
822 823 qemu_free(ts);
823 824 }
824 825
825 826 /* stop a timer, but do not dealloc it */
826 827 void qemu_del_timer(QEMUTimer *ts)
827 828 {
828 829 QEMUTimer **pt, *t;
829 830
830 831 /* NOTE: this code must be signal safe because
831 832 qemu_timer_expired() can be called from a signal. */
832 833 pt = &active_timers[ts->clock->type];
833 834 for(;;) {
834 835 t = *pt;
835 836 if (!t)
836 837 break;
837 838 if (t == ts) {
838 839 *pt = t->next;
839 840 break;
840 841 }
841 842 pt = &t->next;
842 843 }
843 844 }
844 845
845 846 void qemu_advance_timer(QEMUTimer *ts, int64_t expire_time)
846 847 {
847 848 if (ts->expire_time > expire_time || !qemu_timer_pending(ts))
848 849 qemu_mod_timer(ts, expire_time);
849 850 }
850 851
851 852 /* modify the current timer so that it will be fired when current_time
852 853 >= expire_time. The corresponding callback will be called. */
853 854 void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
854 855 {
855 856 QEMUTimer **pt, *t;
856 857
857 858 qemu_del_timer(ts);
858 859
859 860 /* add the timer in the sorted list */
860 861 /* NOTE: this code must be signal safe because
861 862 qemu_timer_expired() can be called from a signal. */
862 863 pt = &active_timers[ts->clock->type];
863 864 for(;;) {
864 865 t = *pt;
865 866 if (!t)
866 867 break;
867 868 if (t->expire_time > expire_time)
868 869 break;
869 870 pt = &t->next;
870 871 }
871 872 ts->expire_time = expire_time;
872 873 ts->next = *pt;
873 874 *pt = ts;
874 875 }
875 876
876 877 int qemu_timer_pending(QEMUTimer *ts)
877 878 {
878 879 QEMUTimer *t;
879 880 for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
880 881 if (t == ts)
881 882 return 1;
882 883 }
883 884 return 0;
884 885 }
885 886
886 887 static inline int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time)
887 888 {
888 889 if (!timer_head)
889 890 return 0;
890 891 return (timer_head->expire_time <= current_time);
891 892 }
892 893
893 894 static void qemu_run_timers(QEMUTimer **ptimer_head, int64_t current_time)
894 895 {
895 896 QEMUTimer *ts;
896 897
897 898 for(;;) {
898 899 ts = *ptimer_head;
899 900 if (!ts || ts->expire_time > current_time)
900 901 break;
901 902 /* remove timer from the list before calling the callback */
902 903 *ptimer_head = ts->next;
903 904 ts->next = NULL;
904 905
905 906 /* run the callback (the timer list can be modified) */
906 907 ts->cb(ts->opaque);
907 908 }
908 909 }
909 910
910 911 int64_t qemu_get_clock(QEMUClock *clock)
911 912 {
912 913 switch(clock->type) {
913 914 case QEMU_TIMER_REALTIME:
914 915 return get_clock() / 1000000;
915 916 default:
916 917 case QEMU_TIMER_VIRTUAL:
917 918 return cpu_get_clock();
918 919 }
919 920 }
920 921
921 922 static void init_timers(void)
922 923 {
923 924 init_get_clock();
924 925 ticks_per_sec = QEMU_TIMER_BASE;
925 926 rt_clock = qemu_new_clock(QEMU_TIMER_REALTIME);
926 927 vm_clock = qemu_new_clock(QEMU_TIMER_VIRTUAL);
927 928 }
928 929
929 930 /* save a timer */
930 931 void qemu_put_timer(QEMUFile *f, QEMUTimer *ts)
931 932 {
932 933 uint64_t expire_time;
933 934
934 935 if (qemu_timer_pending(ts)) {
935 936 expire_time = ts->expire_time;
936 937 } else {
937 938 expire_time = -1;
938 939 }
939 940 qemu_put_be64(f, expire_time);
940 941 }
941 942
942 943 void qemu_get_timer(QEMUFile *f, QEMUTimer *ts)
943 944 {
944 945 uint64_t expire_time;
945 946
946 947 expire_time = qemu_get_be64(f);
947 948 if (expire_time != -1) {
948 949 qemu_mod_timer(ts, expire_time);
949 950 } else {
950 951 qemu_del_timer(ts);
951 952 }
952 953 }
953 954
954 955 #ifdef CONFIG_DM
955 956 static void timer_save(QEMUFile *f, void *opaque)
956 957 {
957 958 /* need timer for save/restoe qemu_timer in usb_uhci */
958 959 if (cpu_ticks_enabled) {
959 960 hw_error("cannot save state if virtual timers are running");
960 961 }
961 962 qemu_put_be64s(f, &cpu_clock_offset);
962 963 }
963 964
964 965 static int timer_load(QEMUFile *f, void *opaque, int version_id)
965 966 {
966 967 if (version_id != 1 && version_id != 2)
967 968 return -EINVAL;
968 969 if (cpu_ticks_enabled) {
969 970 return -EINVAL;
970 971 }
971 972
972 973 qemu_get_be64s(f, &cpu_clock_offset);
973 974 return 0;
974 975 }
975 976 #else /* !CONFIG_DM */
976 977 static void timer_save(QEMUFile *f, void *opaque)
977 978 {
978 979 if (cpu_ticks_enabled) {
979 980 hw_error("cannot save state if virtual timers are running");
980 981 }
981 982 qemu_put_be64s(f, &cpu_ticks_offset);
982 983 qemu_put_be64s(f, &ticks_per_sec);
983 984 qemu_put_be64s(f, &cpu_clock_offset);
984 985 }
985 986
986 987 static int timer_load(QEMUFile *f, void *opaque, int version_id)
987 988 {
988 989 if (version_id != 1 && version_id != 2)
989 990 return -EINVAL;
990 991 if (cpu_ticks_enabled) {
991 992 return -EINVAL;
992 993 }
993 994 qemu_get_be64s(f, &cpu_ticks_offset);
994 995 qemu_get_be64s(f, &ticks_per_sec);
995 996 if (version_id == 2) {
996 997 qemu_get_be64s(f, &cpu_clock_offset);
997 998 }
998 999 return 0;
999 1000 }
1000 1001
1001 1002 #ifdef _WIN32
1002 1003 void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
1003 1004 DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
1004 1005 #else
1005 1006 static void host_alarm_handler(int host_signum)
1006 1007 #endif
1007 1008 {
1008 1009 #if 0
1009 1010 #define DISP_FREQ 1000
1010 1011 {
1011 1012 static int64_t delta_min = INT64_MAX;
1012 1013 static int64_t delta_max, delta_cum, last_clock, delta, ti;
1013 1014 static int count;
1014 1015 ti = qemu_get_clock(vm_clock);
1015 1016 if (last_clock != 0) {
1016 1017 delta = ti - last_clock;
1017 1018 if (delta < delta_min)
1018 1019 delta_min = delta;
1019 1020 if (delta > delta_max)
1020 1021 delta_max = delta;
1021 1022 delta_cum += delta;
1022 1023 if (++count == DISP_FREQ) {
1023 1024 printf("timer: min=%" PRId64 " us max=%" PRId64 " us avg=%" PRId64 " us avg_freq=%0.3f Hz\n",
1024 1025 muldiv64(delta_min, 1000000, ticks_per_sec),
1025 1026 muldiv64(delta_max, 1000000, ticks_per_sec),
1026 1027 muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
1027 1028 (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
1028 1029 count = 0;
1029 1030 delta_min = INT64_MAX;
1030 1031 delta_max = 0;
1031 1032 delta_cum = 0;
1032 1033 }
1033 1034 }
1034 1035 last_clock = ti;
1035 1036 }
1036 1037 #endif
1037 1038 if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
1038 1039 qemu_get_clock(vm_clock)) ||
1039 1040 qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
1040 1041 qemu_get_clock(rt_clock))) {
1041 1042 #ifdef _WIN32
1042 1043 SetEvent(host_alarm);
1043 1044 #endif
1044 1045 CPUState *env = cpu_single_env;
1045 1046 if (env) {
1046 1047 /* stop the currently executing cpu because a timer occured */
1047 1048 cpu_interrupt(env, CPU_INTERRUPT_EXIT);
1048 1049 #ifdef USE_KQEMU
1049 1050 if (env->kqemu_enabled) {
1050 1051 kqemu_cpu_interrupt(env);
1051 1052 }
1052 1053 #endif
1053 1054 }
1054 1055 }
1055 1056 }
1056 1057
1057 1058 #ifndef _WIN32
1058 1059
1059 1060 #if defined(__linux__)
1060 1061
1061 1062 #define RTC_FREQ 1024
1062 1063
1063 1064 static int rtc_fd;
1064 1065
1065 1066 static int start_rtc_timer(void)
1066 1067 {
1067 1068 rtc_fd = open("/dev/rtc", O_RDONLY);
1068 1069 if (rtc_fd < 0)
1069 1070 return -1;
1070 1071 if (ioctl(rtc_fd, RTC_IRQP_SET, RTC_FREQ) < 0) {
1071 1072 fprintf(stderr, "Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal\n"
1072 1073 "error, but for better emulation accuracy either use a 2.6 host Linux kernel or\n"
1073 1074 "type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.\n");
1074 1075 goto fail;
1075 1076 }
1076 1077 if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) {
1077 1078 fail:
1078 1079 close(rtc_fd);
1079 1080 return -1;
1080 1081 }
1081 1082 pit_min_timer_count = PIT_FREQ / RTC_FREQ;
1082 1083 return 0;
1083 1084 }
1084 1085
1085 1086 #else
1086 1087
1087 1088 static int start_rtc_timer(void)
1088 1089 {
1089 1090 return -1;
1090 1091 }
1091 1092
1092 1093 #endif /* !defined(__linux__) */
1093 1094
1094 1095 #endif /* !defined(_WIN32) */
1095 1096
1096 1097 #endif /* !CONFIG_DM */
1097 1098
1098 1099 static void init_timer_alarm(void)
1099 1100 {
1100 1101 #ifdef _WIN32
1101 1102 {
1102 1103 int count=0;
1103 1104 TIMECAPS tc;
1104 1105
1105 1106 ZeroMemory(&tc, sizeof(TIMECAPS));
1106 1107 timeGetDevCaps(&tc, sizeof(TIMECAPS));
1107 1108 if (period < tc.wPeriodMin)
1108 1109 period = tc.wPeriodMin;
1109 1110 timeBeginPeriod(period);
1110 1111 timerID = timeSetEvent(1, // interval (ms)
1111 1112 period, // resolution
1112 1113 host_alarm_handler, // function
1113 1114 (DWORD)&count, // user parameter
1114 1115 TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
1115 1116 if( !timerID ) {
1116 1117 perror("failed timer alarm");
1117 1118 exit(1);
1118 1119 }
1119 1120 host_alarm = CreateEvent(NULL, FALSE, FALSE, NULL);
1120 1121 if (!host_alarm) {
1121 1122 perror("failed CreateEvent");
1122 1123 exit(1);
1123 1124 }
1124 1125 qemu_add_wait_object(host_alarm, NULL, NULL);
1125 1126 }
1126 1127 pit_min_timer_count = ((uint64_t)10000 * PIT_FREQ) / 1000000;
1127 1128 #else
1128 1129 {
1129 1130 #ifndef CONFIG_DM
1130 1131 struct sigaction act;
1131 1132 struct itimerval itv;
1132 1133 #endif
1133 1134
1134 1135 /* get times() syscall frequency */
1135 1136 timer_freq = sysconf(_SC_CLK_TCK);
1136 1137
1137 1138 #ifndef CONFIG_DM
1138 1139 /* timer signal */
1139 1140 sigfillset(&act.sa_mask);
1140 1141 act.sa_flags = 0;
1141 1142 #if defined (TARGET_I386) && defined(USE_CODE_COPY)
1142 1143 act.sa_flags |= SA_ONSTACK;
1143 1144 #endif
1144 1145 act.sa_handler = host_alarm_handler;
1145 1146 sigaction(SIGALRM, &act, NULL);
1146 1147
1147 1148 itv.it_interval.tv_sec = 0;
1148 1149 itv.it_interval.tv_usec = 999; /* for i386 kernel 2.6 to get 1 ms */
1149 1150 itv.it_value.tv_sec = 0;
1150 1151 itv.it_value.tv_usec = 10 * 1000;
1151 1152 setitimer(ITIMER_REAL, &itv, NULL);
1152 1153 /* we probe the tick duration of the kernel to inform the user if
1153 1154 the emulated kernel requested a too high timer frequency */
1154 1155 getitimer(ITIMER_REAL, &itv);
1155 1156
1156 1157 #if defined(__linux__)
1157 1158 /* XXX: force /dev/rtc usage because even 2.6 kernels may not
1158 1159 have timers with 1 ms resolution. The correct solution will
1159 1160 be to use the POSIX real time timers available in recent
1160 1161 2.6 kernels */
1161 1162 if (itv.it_interval.tv_usec > 1000 || 1) {
1162 1163 /* try to use /dev/rtc to have a faster timer */
1163 1164 if (start_rtc_timer() < 0)
1164 1165 goto use_itimer;
1165 1166 /* disable itimer */
1166 1167 itv.it_interval.tv_sec = 0;
1167 1168 itv.it_interval.tv_usec = 0;
1168 1169 itv.it_value.tv_sec = 0;
1169 1170 itv.it_value.tv_usec = 0;
1170 1171 setitimer(ITIMER_REAL, &itv, NULL);
1171 1172
1172 1173 /* use the RTC */
1173 1174 sigaction(SIGIO, &act, NULL);
1174 1175 fcntl(rtc_fd, F_SETFL, O_ASYNC);
1175 1176 fcntl(rtc_fd, F_SETOWN, getpid());
1176 1177 } else
1177 1178 #endif /* defined(__linux__) */
1178 1179 {
1179 1180 use_itimer:
1180 1181 pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec *
1181 1182 PIT_FREQ) / 1000000;
1182 1183 }
1183 1184 #endif /* CONFIG_DM */
1184 1185 }
1185 1186 #endif
1186 1187 }
1187 1188
1188 1189 void quit_timers(void)
1189 1190 {
1190 1191 #ifdef _WIN32
1191 1192 timeKillEvent(timerID);
1192 1193 timeEndPeriod(period);
1193 1194 if (host_alarm) {
1194 1195 CloseHandle(host_alarm);
1195 1196 host_alarm = NULL;
1196 1197 }
1197 1198 #endif
1198 1199 }
1199 1200
1200 1201 /***********************************************************/
1201 1202 /* character device */
1202 1203
1203 1204 static void qemu_chr_event(CharDriverState *s, int event)
1204 1205 {
1205 1206 if (!s->chr_event)
1206 1207 return;
1207 1208 s->chr_event(s->handler_opaque, event);
1208 1209 }
1209 1210
1210 1211 static void qemu_chr_reset_bh(void *opaque)
1211 1212 {
1212 1213 CharDriverState *s = opaque;
1213 1214 qemu_chr_event(s, CHR_EVENT_RESET);
1214 1215 qemu_bh_delete(s->bh);
1215 1216 s->bh = NULL;
1216 1217 }
1217 1218
1218 1219 void qemu_chr_reset(CharDriverState *s)
1219 1220 {
1220 1221 if (s->bh == NULL) {
1221 1222 s->bh = qemu_bh_new(qemu_chr_reset_bh, s);
1222 1223 qemu_bh_schedule(s->bh);
1223 1224 }
1224 1225 }
1225 1226
1226 1227 int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len)
1227 1228 {
1228 1229 return s->chr_write(s, buf, len);
1229 1230 }
1230 1231
1231 1232 int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg)
1232 1233 {
1233 1234 if (!s->chr_ioctl)
1234 1235 return -ENOTSUP;
1235 1236 return s->chr_ioctl(s, cmd, arg);
1236 1237 }
1237 1238
1238 1239 int qemu_chr_can_read(CharDriverState *s)
1239 1240 {
1240 1241 if (!s->chr_can_read)
1241 1242 return 0;
1242 1243 return s->chr_can_read(s->handler_opaque);
1243 1244 }
1244 1245
1245 1246 void qemu_chr_read(CharDriverState *s, uint8_t *buf, int len)
1246 1247 {
1247 1248 s->chr_read(s->handler_opaque, buf, len);
1248 1249 }
1249 1250
1250 1251
1251 1252 void qemu_chr_printf(CharDriverState *s, const char *fmt, ...)
1252 1253 {
1253 1254 char buf[4096];
1254 1255 va_list ap;
1255 1256 va_start(ap, fmt);
1256 1257 vsnprintf(buf, sizeof(buf), fmt, ap);
1257 1258 qemu_chr_write(s, buf, strlen(buf));
1258 1259 va_end(ap);
1259 1260 }
1260 1261
1261 1262 void qemu_chr_send_event(CharDriverState *s, int event)
1262 1263 {
1263 1264 if (s->chr_send_event)
1264 1265 s->chr_send_event(s, event);
1265 1266 }
1266 1267
1267 1268 void qemu_chr_add_handlers(CharDriverState *s,
1268 1269 IOCanRWHandler *fd_can_read,
1269 1270 IOReadHandler *fd_read,
1270 1271 IOEventHandler *fd_event,
1271 1272 void *opaque)
1272 1273 {
1273 1274 s->chr_can_read = fd_can_read;
1274 1275 s->chr_read = fd_read;
1275 1276 s->chr_event = fd_event;
1276 1277 s->handler_opaque = opaque;
1277 1278 if (s->chr_update_read_handler)
1278 1279 s->chr_update_read_handler(s);
1279 1280 }
1280 1281
1281 1282 static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1282 1283 {
1283 1284 return len;
1284 1285 }
1285 1286
1286 1287 static CharDriverState *qemu_chr_open_null(void)
1287 1288 {
1288 1289 CharDriverState *chr;
1289 1290
1290 1291 chr = qemu_mallocz(sizeof(CharDriverState));
1291 1292 if (!chr)
1292 1293 return NULL;
1293 1294 chr->chr_write = null_chr_write;
1294 1295 return chr;
1295 1296 }
1296 1297
1297 1298 #ifdef _WIN32
1298 1299
1299 1300 static void socket_cleanup(void)
1300 1301 {
1301 1302 WSACleanup();
1302 1303 }
1303 1304
1304 1305 static int socket_init(void)
1305 1306 {
1306 1307 WSADATA Data;
1307 1308 int ret, err;
1308 1309
1309 1310 ret = WSAStartup(MAKEWORD(2,2), &Data);
1310 1311 if (ret != 0) {
1311 1312 err = WSAGetLastError();
1312 1313 fprintf(stderr, "WSAStartup: %d\n", err);
1313 1314 return -1;
1314 1315 }
1315 1316 atexit(socket_cleanup);
1316 1317 return 0;
1317 1318 }
1318 1319
1319 1320 static int send_all(int fd, const uint8_t *buf, int len1)
1320 1321 {
1321 1322 int ret, len;
1322 1323
1323 1324 len = len1;
1324 1325 while (len > 0) {
1325 1326 ret = send(fd, buf, len, 0);
1326 1327 if (ret < 0) {
1327 1328 int errno;
1328 1329 errno = WSAGetLastError();
1329 1330 if (errno != WSAEWOULDBLOCK) {
1330 1331 return -1;
1331 1332 }
1332 1333 } else if (ret == 0) {
1333 1334 break;
1334 1335 } else {
1335 1336 buf += ret;
1336 1337 len -= ret;
1337 1338 }
1338 1339 }
1339 1340 return len1 - len;
1340 1341 }
1341 1342
1342 1343 void socket_set_nonblock(int fd)
1343 1344 {
1344 1345 unsigned long opt = 1;
1345 1346 ioctlsocket(fd, FIONBIO, &opt);
1346 1347 }
1347 1348
1348 1349 #else
1349 1350
1350 1351 static int unix_write(int fd, const uint8_t *buf, int len1)
1351 1352 {
1352 1353 int ret, sel_ret, len;
1353 1354 int max_fd;
1354 1355 fd_set writefds;
1355 1356 struct timeval timeout;
1356 1357
1357 1358 max_fd = fd;
1358 1359
1359 1360 len = len1;
1360 1361 while (len > 0) {
1361 1362 FD_ZERO(&writefds);
1362 1363 FD_SET(fd, &writefds);
1363 1364 timeout.tv_sec = 0;
1364 1365 timeout.tv_usec = 0;
1365 1366 sel_ret = select(max_fd + 1, NULL, &writefds, 0, &timeout);
1366 1367 if (sel_ret <= 0) {
1367 1368 /* Timeout or select error */
1368 1369 return -1;
1369 1370 } else {
1370 1371 ret = write(fd, buf, len);
1371 1372 if (ret < 0) {
1372 1373 if (errno != EINTR && errno != EAGAIN)
1373 1374 return -1;
1374 1375 } else if (ret == 0) {
1375 1376 break;
1376 1377 } else {
1377 1378 buf += ret;
1378 1379 len -= ret;
1379 1380 }
1380 1381 }
1381 1382 }
1382 1383 return len1 - len;
1383 1384 }
1384 1385
1385 1386 static inline int send_all(int fd, const uint8_t *buf, int len1)
1386 1387 {
1387 1388 return unix_write(fd, buf, len1);
1388 1389 }
1389 1390
1390 1391 void socket_set_nonblock(int fd)
1391 1392 {
1392 1393 fcntl(fd, F_SETFL, O_NONBLOCK);
1393 1394 }
1394 1395 #endif /* !_WIN32 */
1395 1396
1396 1397 #ifndef _WIN32
1397 1398
1398 1399 typedef struct {
1399 1400 int fd_in, fd_out;
1400 1401 int max_size;
1401 1402 } FDCharDriver;
1402 1403
1403 1404 #define STDIO_MAX_CLIENTS 2
1404 1405
1405 1406 static int stdio_nb_clients;
1406 1407 static CharDriverState *stdio_clients[STDIO_MAX_CLIENTS];
1407 1408
1408 1409 static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
1409 1410 {
1410 1411 FDCharDriver *s = chr->opaque;
1411 1412 return unix_write(s->fd_out, buf, len);
1412 1413 }
1413 1414
1414 1415 static int fd_chr_read_poll(void *opaque)
1415 1416 {
1416 1417 CharDriverState *chr = opaque;
1417 1418 FDCharDriver *s = chr->opaque;
1418 1419
1419 1420 s->max_size = qemu_chr_can_read(chr);
1420 1421 return s->max_size;
1421 1422 }
1422 1423
1423 1424 static void fd_chr_read(void *opaque)
1424 1425 {
1425 1426 CharDriverState *chr = opaque;
1426 1427 FDCharDriver *s = chr->opaque;
1427 1428 int size, len;
1428 1429 uint8_t buf[1024];
1429 1430
1430 1431 len = sizeof(buf);
1431 1432 if (len > s->max_size)
1432 1433 len = s->max_size;
1433 1434 if (len == 0)
1434 1435 return;
1435 1436 size = read(s->fd_in, buf, len);
1436 1437 if (size == 0) {
1437 1438 /* FD has been closed. Remove it from the active list. */
1438 1439 qemu_set_fd_handler2(s->fd_in, NULL, NULL, NULL, NULL);
1439 1440 return;
1440 1441 }
1441 1442 if (size > 0) {
1442 1443 qemu_chr_read(chr, buf, size);
1443 1444 }
1444 1445 }
1445 1446
1446 1447 static void fd_chr_update_read_handler(CharDriverState *chr)
1447 1448 {
1448 1449 FDCharDriver *s = chr->opaque;
1449 1450
1450 1451 if (s->fd_in >= 0) {
1451 1452 if (nographic && s->fd_in == 0) {
1452 1453 } else {
1453 1454 qemu_set_fd_handler2(s->fd_in, fd_chr_read_poll,
1454 1455 fd_chr_read, NULL, chr);
1455 1456 }
1456 1457 }
1457 1458 }
1458 1459
1459 1460 /* open a character device to a unix fd */
1460 1461 static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
1461 1462 {
1462 1463 CharDriverState *chr;
1463 1464 FDCharDriver *s;
1464 1465
1465 1466 chr = qemu_mallocz(sizeof(CharDriverState));
1466 1467 if (!chr)
1467 1468 return NULL;
1468 1469 s = qemu_mallocz(sizeof(FDCharDriver));
1469 1470 if (!s) {
1470 1471 free(chr);
1471 1472 return NULL;
1472 1473 }
1473 1474 s->fd_in = fd_in;
1474 1475 s->fd_out = fd_out;
1475 1476 chr->opaque = s;
1476 1477 chr->chr_write = fd_chr_write;
1477 1478 chr->chr_update_read_handler = fd_chr_update_read_handler;
1478 1479
1479 1480 qemu_chr_reset(chr);
1480 1481
1481 1482 return chr;
1482 1483 }
1483 1484
1484 1485 static CharDriverState *qemu_chr_open_file_out(const char *file_out)
1485 1486 {
1486 1487 int fd_out;
1487 1488
1488 1489 fd_out = open(file_out, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0666);
1489 1490 if (fd_out < 0)
1490 1491 return NULL;
1491 1492 return qemu_chr_open_fd(-1, fd_out);
1492 1493 }
1493 1494
1494 1495 static CharDriverState *qemu_chr_open_pipe(const char *filename)
1495 1496 {
1496 1497 int fd_in, fd_out;
1497 1498 char filename_in[256], filename_out[256];
1498 1499
1499 1500 snprintf(filename_in, 256, "%s.in", filename);
1500 1501 snprintf(filename_out, 256, "%s.out", filename);
1501 1502 fd_in = open(filename_in, O_RDWR | O_BINARY);
1502 1503 fd_out = open(filename_out, O_RDWR | O_BINARY);
1503 1504 if (fd_in < 0 || fd_out < 0) {
1504 1505 if (fd_in >= 0)
1505 1506 close(fd_in);
1506 1507 if (fd_out >= 0)
1507 1508 close(fd_out);
1508 1509 fd_in = fd_out = open(filename, O_RDWR | O_BINARY);
1509 1510 if (fd_in < 0)
1510 1511 return NULL;
1511 1512 }
1512 1513 return qemu_chr_open_fd(fd_in, fd_out);
1513 1514 }
1514 1515
1515 1516
1516 1517 /* for STDIO, we handle the case where several clients use it
1517 1518 (nographic mode) */
1518 1519
1519 1520 #define TERM_ESCAPE 0x01 /* ctrl-a is used for escape */
1520 1521
1521 1522 #define TERM_FIFO_MAX_SIZE 1
1522 1523
1523 1524 static int term_got_escape, client_index;
1524 1525 static uint8_t term_fifo[TERM_FIFO_MAX_SIZE];
1525 1526 static int term_fifo_size;
1526 1527 static int term_timestamps;
1527 1528 static int64_t term_timestamps_start;
1528 1529
1529 1530 void term_print_help(void)
1530 1531 {
1531 1532 printf("\n"
1532 1533 "C-a h print this help\n"
1533 1534 "C-a x exit emulator\n"
1534 1535 "C-a s save disk data back to file (if -snapshot)\n"
1535 1536 "C-a b send break (magic sysrq)\n"
1536 1537 "C-a t toggle console timestamps\n"
1537 1538 "C-a c switch between console and monitor\n"
1538 1539 "C-a C-a send C-a\n"
1539 1540 );
1540 1541 }
1541 1542
1542 1543 /* called when a char is received */
1543 1544 static void stdio_received_byte(int ch)
1544 1545 {
1545 1546 if (term_got_escape) {
1546 1547 term_got_escape = 0;
1547 1548 switch(ch) {
1548 1549 case 'h':
1549 1550 term_print_help();
1550 1551 break;
1551 1552 case 'x':
1552 1553 exit(0);
1553 1554 break;
1554 1555 case 's':
1555 1556 {
1556 1557 int i;
1557 1558 for (i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++) {
1558 1559 if (bs_table[i])
1559 1560 bdrv_commit(bs_table[i]);
1560 1561 }
1561 1562 }
1562 1563 break;
1563 1564 case 'b':
1564 1565 if (client_index < stdio_nb_clients) {
1565 1566 CharDriverState *chr;
1566 1567 FDCharDriver *s;
1567 1568
1568 1569 chr = stdio_clients[client_index];
1569 1570 s = chr->opaque;
1570 1571 qemu_chr_event(chr, CHR_EVENT_BREAK);
1571 1572 }
1572 1573 break;
1573 1574 case 'c':
1574 1575 client_index++;
1575 1576 if (client_index >= stdio_nb_clients)
1576 1577 client_index = 0;
1577 1578 if (client_index == 0) {
1578 1579 /* send a new line in the monitor to get the prompt */
1579 1580 ch = '\r';
1580 1581 goto send_char;
1581 1582 }
1582 1583 break;
1583 1584 case 't':
1584 1585 term_timestamps = !term_timestamps;
1585 1586 term_timestamps_start = -1;
1586 1587 break;
1587 1588 case TERM_ESCAPE:
1588 1589 goto send_char;
1589 1590 }
1590 1591 } else if (ch == TERM_ESCAPE) {
1591 1592 term_got_escape = 1;
1592 1593 } else {
1593 1594 send_char:
1594 1595 if (client_index < stdio_nb_clients) {
1595 1596 uint8_t buf[1];
1596 1597 CharDriverState *chr;
1597 1598
1598 1599 chr = stdio_clients[client_index];
1599 1600 if (qemu_chr_can_read(chr) > 0) {
1600 1601 buf[0] = ch;
1601 1602 qemu_chr_read(chr, buf, 1);
1602 1603 } else if (term_fifo_size == 0) {
1603 1604 term_fifo[term_fifo_size++] = ch;
1604 1605 }
1605 1606 }
1606 1607 }
1607 1608 }
1608 1609
1609 1610 static int stdio_read_poll(void *opaque)
1610 1611 {
1611 1612 CharDriverState *chr;
1612 1613
1613 1614 if (client_index < stdio_nb_clients) {
1614 1615 chr = stdio_clients[client_index];
1615 1616 /* try to flush the queue if needed */
1616 1617 if (term_fifo_size != 0 && qemu_chr_can_read(chr) > 0) {
1617 1618 qemu_chr_read(chr, term_fifo, 1);
1618 1619 term_fifo_size = 0;
1619 1620 }
1620 1621 /* see if we can absorb more chars */
1621 1622 if (term_fifo_size == 0)
1622 1623 return 1;
1623 1624 else
1624 1625 return 0;
1625 1626 } else {
1626 1627 return 1;
1627 1628 }
1628 1629 }
1629 1630
1630 1631 static void stdio_read(void *opaque)
1631 1632 {
1632 1633 int size;
1633 1634 uint8_t buf[1];
1634 1635
1635 1636 size = read(0, buf, 1);
1636 1637 if (size == 0) {
1637 1638 /* stdin has been closed. Remove it from the active list. */
1638 1639 qemu_set_fd_handler2(0, NULL, NULL, NULL, NULL);
1639 1640 return;
1640 1641 }
1641 1642 if (size > 0)
1642 1643 stdio_received_byte(buf[0]);
1643 1644 }
1644 1645
1645 1646 static int stdio_write(CharDriverState *chr, const uint8_t *buf, int len)
1646 1647 {
1647 1648 FDCharDriver *s = chr->opaque;
1648 1649 if (!term_timestamps) {
1649 1650 return unix_write(s->fd_out, buf, len);
1650 1651 } else {
1651 1652 int i;
1652 1653 char buf1[64];
1653 1654
1654 1655 for(i = 0; i < len; i++) {
1655 1656 unix_write(s->fd_out, buf + i, 1);
1656 1657 if (buf[i] == '\n') {
1657 1658 int64_t ti;
1658 1659 int secs;
1659 1660
1660 1661 ti = get_clock();
1661 1662 if (term_timestamps_start == -1)
1662 1663 term_timestamps_start = ti;
1663 1664 ti -= term_timestamps_start;
1664 1665 secs = ti / 1000000000;
1665 1666 snprintf(buf1, sizeof(buf1),
1666 1667 "[%02d:%02d:%02d.%03d] ",
1667 1668 secs / 3600,
1668 1669 (secs / 60) % 60,
1669 1670 secs % 60,
1670 1671 (int)((ti / 1000000) % 1000));
1671 1672 unix_write(s->fd_out, buf1, strlen(buf1));
1672 1673 }
1673 1674 }
1674 1675 return len;
1675 1676 }
1676 1677 }
1677 1678
1678 1679 /* init terminal so that we can grab keys */
1679 1680 static struct termios oldtty;
1680 1681 static int old_fd0_flags;
1681 1682
1682 1683 static void term_exit(void)
1683 1684 {
1684 1685 tcsetattr (0, TCSANOW, &oldtty);
1685 1686 fcntl(0, F_SETFL, old_fd0_flags);
1686 1687 }
1687 1688
1688 1689 static void term_init(void)
1689 1690 {
1690 1691 struct termios tty;
1691 1692
1692 1693 tcgetattr (0, &tty);
1693 1694 oldtty = tty;
1694 1695 old_fd0_flags = fcntl(0, F_GETFL);
1695 1696
1696 1697 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1697 1698 |INLCR|IGNCR|ICRNL|IXON);
1698 1699 tty.c_oflag |= OPOST;
1699 1700 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1700 1701 /* if graphical mode, we allow Ctrl-C handling */
1701 1702 if (nographic)
1702 1703 tty.c_lflag &= ~ISIG;
1703 1704 tty.c_cflag &= ~(CSIZE|PARENB);
1704 1705 tty.c_cflag |= CS8;
1705 1706 tty.c_cc[VMIN] = 1;
1706 1707 tty.c_cc[VTIME] = 0;
1707 1708
1708 1709 tcsetattr (0, TCSANOW, &tty);
1709 1710
1710 1711 atexit(term_exit);
1711 1712
1712 1713 fcntl(0, F_SETFL, O_NONBLOCK);
1713 1714 }
1714 1715
1715 1716 static CharDriverState *qemu_chr_open_stdio(void)
1716 1717 {
1717 1718 CharDriverState *chr;
1718 1719
1719 1720 if (nographic) {
1720 1721 if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
1721 1722 return NULL;
1722 1723 chr = qemu_chr_open_fd(0, 1);
1723 1724 chr->chr_write = stdio_write;
1724 1725 if (stdio_nb_clients == 0)
1725 1726 qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, NULL);
1726 1727 client_index = stdio_nb_clients;
1727 1728 } else {
1728 1729 if (stdio_nb_clients != 0)
1729 1730 return NULL;
1730 1731 chr = qemu_chr_open_fd(0, 1);
1731 1732 }
1732 1733 stdio_clients[stdio_nb_clients++] = chr;
1733 1734 if (stdio_nb_clients == 1) {
1734 1735 /* set the terminal in raw mode */
1735 1736 term_init();
1736 1737 }
1737 1738 return chr;
1738 1739 }
1739 1740
1740 1741 /*
1741 1742 * Create a store entry for a device (e.g., monitor, serial/parallel lines).
1742 1743 * The entry is <domain-path><storeString>/tty and the value is the name
1743 1744 * of the pty associated with the device.
1744 1745 */
1745 1746 static int store_dev_info(char *devName, int domid,
1746 1747 CharDriverState *cState, char *storeString)
1747 1748 {
1748 1749 int xc_handle;
1749 1750 struct xs_handle *xs;
1750 1751 char *path;
1751 1752 char *newpath;
1752 1753 FDCharDriver *s;
1753 1754 char *pts;
1754 1755
1755 1756 /* Check for valid arguments (at least, prevent segfaults). */
1756 1757 if ((devName == NULL) || (cState == NULL) || (storeString == NULL)) {
1757 1758 fprintf(logfile, "%s - invalid arguments\n", __FUNCTION__);
1758 1759 return EINVAL;
1759 1760 }
1760 1761
1761 1762 /*
1762 1763 * Only continue if we're talking to a pty
1763 1764 * Actually, the following code works for any CharDriverState using
1764 1765 * FDCharDriver, but we really only care about pty's here
1765 1766 */
1766 1767 if (strcmp(devName, "pty"))
1767 1768 return 0;
1768 1769
1769 1770 s = cState->opaque;
1770 1771 if (s == NULL) {
1771 1772 fprintf(logfile, "%s - unable to retrieve fd for '%s'/'%s'\n",
1772 1773 __FUNCTION__, storeString, devName);
1773 1774 return EBADF;
1774 1775 }
1775 1776
1776 1777 pts = ptsname(s->fd_in);
1777 1778 if (pts == NULL) {
1778 1779 fprintf(logfile, "%s - unable to determine ptsname '%s'/'%s', "
1779 1780 "error %d (%s)\n",
1780 1781 __FUNCTION__, storeString, devName, errno, strerror(errno));
1781 1782 return errno;
1782 1783 }
1783 1784
1784 1785 /* We now have everything we need to set the xenstore entry. */
1785 1786 xs = xs_daemon_open();
1786 1787 if (xs == NULL) {
1787 1788 fprintf(logfile, "Could not contact XenStore\n");
1788 1789 return -1;
1789 1790 }
1790 1791
1791 1792 xc_handle = xc_interface_open();
1792 1793 if (xc_handle == -1) {
1793 1794 fprintf(logfile, "xc_interface_open() error\n");
1794 1795 return -1;
1795 1796 }
1796 1797
1797 1798 path = xs_get_domain_path(xs, domid);
1798 1799 if (path == NULL) {
1799 1800 fprintf(logfile, "xs_get_domain_path() error\n");
1800 1801 return -1;
1801 1802 }
1802 1803 newpath = realloc(path, (strlen(path) + strlen(storeString) +
1803 1804 strlen("/tty") + 1));
1804 1805 if (newpath == NULL) {
1805 1806 free(path); /* realloc errors leave old block */
1806 1807 fprintf(logfile, "realloc error\n");
1807 1808 return -1;
1808 1809 }
1809 1810 path = newpath;
1810 1811
1811 1812 strcat(path, storeString);
1812 1813 strcat(path, "/tty");
1813 1814 if (!xs_write(xs, XBT_NULL, path, pts, strlen(pts))) {
1814 1815 fprintf(logfile, "xs_write for '%s' fail", storeString);
|
↓ open down ↓ |
1748 lines elided |
↑ open up ↑ |
1815 1816 return -1;
1816 1817 }
1817 1818
1818 1819 free(path);
1819 1820 xs_daemon_close(xs);
1820 1821 close(xc_handle);
1821 1822
1822 1823 return 0;
1823 1824 }
1824 1825
1825 -#if defined(__linux__)
1826 +#ifdef __sun__
1827 +static int openpty(int *amaster, int *aslave, char *name,
1828 + struct termios *termp, struct winsize *winp)
1829 +{
1830 + const char *slave;
1831 + int mfd = -1, sfd = -1;
1832 +
1833 + *amaster = *aslave = -1;
1834 +
1835 + mfd = open("/dev/ptmx", O_RDWR | O_NOCTTY);
1836 + if (mfd < 0)
1837 + goto err;
1838 +
1839 + if (grantpt(mfd) == -1 || unlockpt(mfd) == -1)
1840 + goto err;
1841 +
1842 + if ((slave = ptsname(mfd)) == NULL)
1843 + goto err;
1844 +
1845 + if ((sfd = open(slave, O_RDONLY | O_NOCTTY)) == -1)
1846 + goto err;
1847 +
1848 + if (ioctl(sfd, I_PUSH, "ptem") == -1 ||
1849 + ioctl(sfd, I_PUSH, "ldterm") == -1)
1850 + goto err;
1851 +
1852 + if (amaster)
1853 + *amaster = mfd;
1854 + if (aslave)
1855 + *aslave = sfd;
1856 + if (winp)
1857 + ioctl(sfd, TIOCSWINSZ, winp);
1858 +
1859 + if (termp)
1860 + tcsetattr(sfd, TCSANOW, termp);
1861 +
1862 + assert(name == NULL);
1863 +
1864 + return 0;
1865 +
1866 +err:
1867 + if (sfd != -1)
1868 + close(sfd);
1869 + close(mfd);
1870 + return -1;
1871 +}
1872 +
1873 +void cfmakeraw (struct termios *termios_p)
1874 +{
1875 + termios_p->c_iflag &=
1876 + ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
1877 + termios_p->c_oflag &= ~OPOST;
1878 + termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
1879 + termios_p->c_cflag &= ~(CSIZE|PARENB);
1880 + termios_p->c_cflag |= CS8;
1881 +
1882 + termios_p->c_cc[VMIN] = 0;
1883 + termios_p->c_cc[VTIME] = 0;
1884 +}
1885 +
1886 +#endif /* __sun__ */
1887 +
1888 +#if defined(__linux__) || defined(__sun__)
1826 1889 static CharDriverState *qemu_chr_open_pty(void)
1827 1890 {
1828 1891 struct termios tty;
1829 1892 int master_fd, slave_fd;
1830 1893
1831 - /* Not satisfying */
1832 1894 if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) < 0) {
1833 1895 return NULL;
1834 1896 }
1835 1897
1836 1898 /* Set raw attributes on the pty. */
1899 + tcgetattr(slave_fd, &tty);
1837 1900 cfmakeraw(&tty);
1838 - tcsetattr(slave_fd, TCSAFLUSH, &tty);
1901 + tcsetattr(slave_fd, TCSANOW, &tty);
1839 1902
1840 1903 fprintf(stderr, "char device redirected to %s\n", ptsname(master_fd));
1841 1904
1842 1905 return qemu_chr_open_fd(master_fd, master_fd);
1843 1906 }
1907 +#else /* defined(__linux__) || defined(__sun__) */
1908 +static CharDriverState *qemu_chr_open_pty(void)
1909 +{
1910 + return NULL;
1911 +}
1912 +#endif /* defined(__linux__) || defined(__sun__) */
1844 1913
1914 +#ifdef __linux__
1915 +
1845 1916 static void tty_serial_init(int fd, int speed,
1846 1917 int parity, int data_bits, int stop_bits)
1847 1918 {
1848 1919 struct termios tty;
1849 1920 speed_t spd;
1850 1921
1851 1922 #if 0
1852 1923 printf("tty_serial_init: speed=%d parity=%c data=%d stop=%d\n",
1853 1924 speed, parity, data_bits, stop_bits);
1854 1925 #endif
1855 1926 tcgetattr (fd, &tty);
1856 1927
1857 1928 switch(speed) {
1858 1929 case 50:
1859 1930 spd = B50;
1860 1931 break;
1861 1932 case 75:
1862 1933 spd = B75;
1863 1934 break;
1864 1935 case 300:
1865 1936 spd = B300;
1866 1937 break;
1867 1938 case 600:
1868 1939 spd = B600;
1869 1940 break;
1870 1941 case 1200:
1871 1942 spd = B1200;
1872 1943 break;
1873 1944 case 2400:
1874 1945 spd = B2400;
1875 1946 break;
1876 1947 case 4800:
1877 1948 spd = B4800;
1878 1949 break;
1879 1950 case 9600:
1880 1951 spd = B9600;
1881 1952 break;
1882 1953 case 19200:
1883 1954 spd = B19200;
1884 1955 break;
1885 1956 case 38400:
1886 1957 spd = B38400;
1887 1958 break;
1888 1959 case 57600:
1889 1960 spd = B57600;
1890 1961 break;
1891 1962 default:
1892 1963 case 115200:
1893 1964 spd = B115200;
1894 1965 break;
1895 1966 }
1896 1967
1897 1968 cfsetispeed(&tty, spd);
1898 1969 cfsetospeed(&tty, spd);
1899 1970
1900 1971 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1901 1972 |INLCR|IGNCR|ICRNL|IXON);
1902 1973 tty.c_oflag &= ~OPOST; /* no output mangling of raw serial stream */
1903 1974 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG);
1904 1975 tty.c_cflag &= ~(CSIZE|PARENB|PARODD|CRTSCTS|CSTOPB);
1905 1976 switch(data_bits) {
1906 1977 default:
1907 1978 case 8:
1908 1979 tty.c_cflag |= CS8;
1909 1980 break;
1910 1981 case 7:
1911 1982 tty.c_cflag |= CS7;
1912 1983 break;
1913 1984 case 6:
1914 1985 tty.c_cflag |= CS6;
1915 1986 break;
1916 1987 case 5:
1917 1988 tty.c_cflag |= CS5;
1918 1989 break;
1919 1990 }
1920 1991 switch(parity) {
1921 1992 default:
1922 1993 case 'N':
1923 1994 break;
1924 1995 case 'E':
1925 1996 tty.c_cflag |= PARENB;
1926 1997 break;
1927 1998 case 'O':
1928 1999 tty.c_cflag |= PARENB | PARODD;
1929 2000 break;
1930 2001 }
1931 2002 if (stop_bits == 2)
1932 2003 tty.c_cflag |= CSTOPB;
1933 2004
1934 2005 tcsetattr (fd, TCSANOW, &tty);
1935 2006 }
1936 2007
1937 2008 static int tty_serial_ioctl(CharDriverState *chr, int cmd, void *arg)
1938 2009 {
1939 2010 FDCharDriver *s = chr->opaque;
1940 2011
1941 2012 switch(cmd) {
1942 2013 case CHR_IOCTL_SERIAL_SET_PARAMS:
1943 2014 {
1944 2015 QEMUSerialSetParams *ssp = arg;
1945 2016 tty_serial_init(s->fd_in, ssp->speed, ssp->parity,
1946 2017 ssp->data_bits, ssp->stop_bits);
1947 2018 }
1948 2019 break;
1949 2020 case CHR_IOCTL_SERIAL_SET_BREAK:
1950 2021 {
1951 2022 int enable = *(int *)arg;
1952 2023 if (enable)
1953 2024 tcsendbreak(s->fd_in, 1);
1954 2025 }
1955 2026 break;
1956 2027 default:
1957 2028 return -ENOTSUP;
1958 2029 }
1959 2030 return 0;
1960 2031 }
1961 2032
1962 2033 static CharDriverState *qemu_chr_open_tty(const char *filename)
1963 2034 {
1964 2035 CharDriverState *chr;
1965 2036 int fd;
1966 2037
1967 2038 fd = open(filename, O_RDWR | O_NONBLOCK);
1968 2039 if (fd < 0)
1969 2040 return NULL;
1970 2041 fcntl(fd, F_SETFL, O_NONBLOCK);
1971 2042 tty_serial_init(fd, 115200, 'N', 8, 1);
1972 2043 chr = qemu_chr_open_fd(fd, fd);
1973 2044 if (!chr)
1974 2045 return NULL;
1975 2046 chr->chr_ioctl = tty_serial_ioctl;
1976 2047 qemu_chr_reset(chr);
1977 2048 return chr;
1978 2049 }
1979 2050
1980 2051 static int pp_ioctl(CharDriverState *chr, int cmd, void *arg)
1981 2052 {
1982 2053 int fd = (int)chr->opaque;
1983 2054 uint8_t b;
1984 2055
1985 2056 switch(cmd) {
1986 2057 case CHR_IOCTL_PP_READ_DATA:
1987 2058 if (ioctl(fd, PPRDATA, &b) < 0)
1988 2059 return -ENOTSUP;
1989 2060 *(uint8_t *)arg = b;
1990 2061 break;
1991 2062 case CHR_IOCTL_PP_WRITE_DATA:
1992 2063 b = *(uint8_t *)arg;
1993 2064 if (ioctl(fd, PPWDATA, &b) < 0)
1994 2065 return -ENOTSUP;
1995 2066 break;
1996 2067 case CHR_IOCTL_PP_READ_CONTROL:
1997 2068 if (ioctl(fd, PPRCONTROL, &b) < 0)
1998 2069 return -ENOTSUP;
1999 2070 *(uint8_t *)arg = b;
2000 2071 break;
2001 2072 case CHR_IOCTL_PP_WRITE_CONTROL:
2002 2073 b = *(uint8_t *)arg;
2003 2074 if (ioctl(fd, PPWCONTROL, &b) < 0)
2004 2075 return -ENOTSUP;
2005 2076 break;
2006 2077 case CHR_IOCTL_PP_READ_STATUS:
2007 2078 if (ioctl(fd, PPRSTATUS, &b) < 0)
2008 2079 return -ENOTSUP;
2009 2080 *(uint8_t *)arg = b;
2010 2081 break;
2011 2082 default:
2012 2083 return -ENOTSUP;
2013 2084 }
2014 2085 return 0;
2015 2086 }
2016 2087
2017 2088 static CharDriverState *qemu_chr_open_pp(const char *filename)
2018 2089 {
2019 2090 CharDriverState *chr;
2020 2091 int fd;
2021 2092
2022 2093 fd = open(filename, O_RDWR);
2023 2094 if (fd < 0)
2024 2095 return NULL;
2025 2096
2026 2097 if (ioctl(fd, PPCLAIM) < 0) {
2027 2098 close(fd);
2028 2099 return NULL;
2029 2100 }
2030 2101
2031 2102 chr = qemu_mallocz(sizeof(CharDriverState));
2032 2103 if (!chr) {
2033 2104 close(fd);
2034 2105 return NULL;
|
↓ open down ↓ |
180 lines elided |
↑ open up ↑ |
2035 2106 }
2036 2107 chr->opaque = (void *)fd;
2037 2108 chr->chr_write = null_chr_write;
2038 2109 chr->chr_ioctl = pp_ioctl;
2039 2110
2040 2111 qemu_chr_reset(chr);
2041 2112
2042 2113 return chr;
2043 2114 }
2044 2115
2045 -#else
2046 -static CharDriverState *qemu_chr_open_pty(void)
2047 -{
2048 - return NULL;
2049 -}
2050 -#endif
2116 +#endif /* __linux__ */
2051 2117
2052 2118 #endif /* !defined(_WIN32) */
2053 2119
2054 2120 #ifdef _WIN32
2055 2121 typedef struct {
2056 2122 CharDriverState *chr;
2057 2123 int max_size;
2058 2124 HANDLE hcom, hrecv, hsend;
2059 2125 OVERLAPPED orecv, osend;
2060 2126 BOOL fpipe;
2061 2127 DWORD len;
2062 2128 } WinCharState;
2063 2129
2064 2130 #define NSENDBUF 2048
2065 2131 #define NRECVBUF 2048
2066 2132 #define MAXCONNECT 1
2067 2133 #define NTIMEOUT 5000
2068 2134
2069 2135 static int win_chr_poll(void *opaque);
2070 2136 static int win_chr_pipe_poll(void *opaque);
2071 2137
2072 2138 static void win_chr_close2(WinCharState *s)
2073 2139 {
2074 2140 if (s->hsend) {
2075 2141 CloseHandle(s->hsend);
2076 2142 s->hsend = NULL;
2077 2143 }
2078 2144 if (s->hrecv) {
2079 2145 CloseHandle(s->hrecv);
2080 2146 s->hrecv = NULL;
2081 2147 }
2082 2148 if (s->hcom) {
2083 2149 CloseHandle(s->hcom);
2084 2150 s->hcom = NULL;
2085 2151 }
2086 2152 if (s->fpipe)
2087 2153 qemu_del_polling_cb(win_chr_pipe_poll, s);
2088 2154 else
2089 2155 qemu_del_polling_cb(win_chr_poll, s);
2090 2156 }
2091 2157
2092 2158 static void win_chr_close(CharDriverState *chr)
2093 2159 {
2094 2160 WinCharState *s = chr->opaque;
2095 2161 win_chr_close2(s);
2096 2162 }
2097 2163
2098 2164 static int win_chr_init(WinCharState *s, CharDriverState *chr, const char *filename)
2099 2165 {
2100 2166 COMMCONFIG comcfg;
2101 2167 COMMTIMEOUTS cto = { 0, 0, 0, 0, 0};
2102 2168 COMSTAT comstat;
2103 2169 DWORD size;
2104 2170 DWORD err;
2105 2171
2106 2172 s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
2107 2173 if (!s->hsend) {
2108 2174 fprintf(stderr, "Failed CreateEvent\n");
2109 2175 goto fail;
2110 2176 }
2111 2177 s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
2112 2178 if (!s->hrecv) {
2113 2179 fprintf(stderr, "Failed CreateEvent\n");
2114 2180 goto fail;
2115 2181 }
2116 2182
2117 2183 s->hcom = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL,
2118 2184 OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
2119 2185 if (s->hcom == INVALID_HANDLE_VALUE) {
2120 2186 fprintf(stderr, "Failed CreateFile (%lu)\n", GetLastError());
2121 2187 s->hcom = NULL;
2122 2188 goto fail;
2123 2189 }
2124 2190
2125 2191 if (!SetupComm(s->hcom, NRECVBUF, NSENDBUF)) {
2126 2192 fprintf(stderr, "Failed SetupComm\n");
2127 2193 goto fail;
2128 2194 }
2129 2195
2130 2196 ZeroMemory(&comcfg, sizeof(COMMCONFIG));
2131 2197 size = sizeof(COMMCONFIG);
2132 2198 GetDefaultCommConfig(filename, &comcfg, &size);
2133 2199 comcfg.dcb.DCBlength = sizeof(DCB);
2134 2200 CommConfigDialog(filename, NULL, &comcfg);
2135 2201
2136 2202 if (!SetCommState(s->hcom, &comcfg.dcb)) {
2137 2203 fprintf(stderr, "Failed SetCommState\n");
2138 2204 goto fail;
2139 2205 }
2140 2206
2141 2207 if (!SetCommMask(s->hcom, EV_ERR)) {
2142 2208 fprintf(stderr, "Failed SetCommMask\n");
2143 2209 goto fail;
2144 2210 }
2145 2211
2146 2212 cto.ReadIntervalTimeout = MAXDWORD;
2147 2213 if (!SetCommTimeouts(s->hcom, &cto)) {
2148 2214 fprintf(stderr, "Failed SetCommTimeouts\n");
2149 2215 goto fail;
2150 2216 }
2151 2217
2152 2218 if (!ClearCommError(s->hcom, &err, &comstat)) {
2153 2219 fprintf(stderr, "Failed ClearCommError\n");
2154 2220 goto fail;
2155 2221 }
2156 2222 s->chr = chr;
2157 2223 qemu_add_polling_cb(win_chr_poll, s);
2158 2224 return 0;
2159 2225
2160 2226 fail:
2161 2227 win_chr_close2(s);
2162 2228 return -1;
2163 2229 }
2164 2230
2165 2231 static int win_chr_write(CharDriverState *chr, const uint8_t *buf, int len1)
2166 2232 {
2167 2233 WinCharState *s = chr->opaque;
2168 2234 DWORD len, ret, size, err;
2169 2235
2170 2236 len = len1;
2171 2237 ZeroMemory(&s->osend, sizeof(s->osend));
2172 2238 s->osend.hEvent = s->hsend;
2173 2239 while (len > 0) {
2174 2240 if (s->hsend)
2175 2241 ret = WriteFile(s->hcom, buf, len, &size, &s->osend);
2176 2242 else
2177 2243 ret = WriteFile(s->hcom, buf, len, &size, NULL);
2178 2244 if (!ret) {
2179 2245 err = GetLastError();
2180 2246 if (err == ERROR_IO_PENDING) {
2181 2247 ret = GetOverlappedResult(s->hcom, &s->osend, &size, TRUE);
2182 2248 if (ret) {
2183 2249 buf += size;
2184 2250 len -= size;
2185 2251 } else {
2186 2252 break;
2187 2253 }
2188 2254 } else {
2189 2255 break;
2190 2256 }
2191 2257 } else {
2192 2258 buf += size;
2193 2259 len -= size;
2194 2260 }
2195 2261 }
2196 2262 return len1 - len;
2197 2263 }
2198 2264
2199 2265 static int win_chr_read_poll(WinCharState *s)
2200 2266 {
2201 2267 s->max_size = qemu_chr_can_read(s->chr);
2202 2268 return s->max_size;
2203 2269 }
2204 2270
2205 2271 static void win_chr_readfile(WinCharState *s)
2206 2272 {
2207 2273 int ret, err;
2208 2274 uint8_t buf[1024];
2209 2275 DWORD size;
2210 2276
2211 2277 ZeroMemory(&s->orecv, sizeof(s->orecv));
2212 2278 s->orecv.hEvent = s->hrecv;
2213 2279 ret = ReadFile(s->hcom, buf, s->len, &size, &s->orecv);
2214 2280 if (!ret) {
2215 2281 err = GetLastError();
2216 2282 if (err == ERROR_IO_PENDING) {
2217 2283 ret = GetOverlappedResult(s->hcom, &s->orecv, &size, TRUE);
2218 2284 }
2219 2285 }
2220 2286
2221 2287 if (size > 0) {
2222 2288 qemu_chr_read(s->chr, buf, size);
2223 2289 }
2224 2290 }
2225 2291
2226 2292 static void win_chr_read(WinCharState *s)
2227 2293 {
2228 2294 if (s->len > s->max_size)
2229 2295 s->len = s->max_size;
2230 2296 if (s->len == 0)
2231 2297 return;
2232 2298
2233 2299 win_chr_readfile(s);
2234 2300 }
2235 2301
2236 2302 static int win_chr_poll(void *opaque)
2237 2303 {
2238 2304 WinCharState *s = opaque;
2239 2305 COMSTAT status;
2240 2306 DWORD comerr;
2241 2307
2242 2308 ClearCommError(s->hcom, &comerr, &status);
2243 2309 if (status.cbInQue > 0) {
2244 2310 s->len = status.cbInQue;
2245 2311 win_chr_read_poll(s);
2246 2312 win_chr_read(s);
2247 2313 return 1;
2248 2314 }
2249 2315 return 0;
2250 2316 }
2251 2317
2252 2318 static CharDriverState *qemu_chr_open_win(const char *filename)
2253 2319 {
2254 2320 CharDriverState *chr;
2255 2321 WinCharState *s;
2256 2322
2257 2323 chr = qemu_mallocz(sizeof(CharDriverState));
2258 2324 if (!chr)
2259 2325 return NULL;
2260 2326 s = qemu_mallocz(sizeof(WinCharState));
2261 2327 if (!s) {
2262 2328 free(chr);
2263 2329 return NULL;
2264 2330 }
2265 2331 chr->opaque = s;
2266 2332 chr->chr_write = win_chr_write;
2267 2333 chr->chr_close = win_chr_close;
2268 2334
2269 2335 if (win_chr_init(s, chr, filename) < 0) {
2270 2336 free(s);
2271 2337 free(chr);
2272 2338 return NULL;
2273 2339 }
2274 2340 qemu_chr_reset(chr);
2275 2341 return chr;
2276 2342 }
2277 2343
2278 2344 static int win_chr_pipe_poll(void *opaque)
2279 2345 {
2280 2346 WinCharState *s = opaque;
2281 2347 DWORD size;
2282 2348
2283 2349 PeekNamedPipe(s->hcom, NULL, 0, NULL, &size, NULL);
2284 2350 if (size > 0) {
2285 2351 s->len = size;
2286 2352 win_chr_read_poll(s);
2287 2353 win_chr_read(s);
2288 2354 return 1;
2289 2355 }
2290 2356 return 0;
2291 2357 }
2292 2358
2293 2359 static int win_chr_pipe_init(WinCharState *s, const char *filename)
2294 2360 {
2295 2361 OVERLAPPED ov;
2296 2362 int ret;
2297 2363 DWORD size;
2298 2364 char openname[256];
2299 2365
2300 2366 s->fpipe = TRUE;
2301 2367
2302 2368 s->hsend = CreateEvent(NULL, TRUE, FALSE, NULL);
2303 2369 if (!s->hsend) {
2304 2370 fprintf(stderr, "Failed CreateEvent\n");
2305 2371 goto fail;
2306 2372 }
2307 2373 s->hrecv = CreateEvent(NULL, TRUE, FALSE, NULL);
2308 2374 if (!s->hrecv) {
2309 2375 fprintf(stderr, "Failed CreateEvent\n");
2310 2376 goto fail;
2311 2377 }
2312 2378
2313 2379 snprintf(openname, sizeof(openname), "\\\\.\\pipe\\%s", filename);
2314 2380 s->hcom = CreateNamedPipe(openname, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
2315 2381 PIPE_TYPE_BYTE | PIPE_READMODE_BYTE |
2316 2382 PIPE_WAIT,
2317 2383 MAXCONNECT, NSENDBUF, NRECVBUF, NTIMEOUT, NULL);
2318 2384 if (s->hcom == INVALID_HANDLE_VALUE) {
2319 2385 fprintf(stderr, "Failed CreateNamedPipe (%lu)\n", GetLastError());
2320 2386 s->hcom = NULL;
2321 2387 goto fail;
2322 2388 }
2323 2389
2324 2390 ZeroMemory(&ov, sizeof(ov));
2325 2391 ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
2326 2392 ret = ConnectNamedPipe(s->hcom, &ov);
2327 2393 if (ret) {
2328 2394 fprintf(stderr, "Failed ConnectNamedPipe\n");
2329 2395 goto fail;
2330 2396 }
2331 2397
2332 2398 ret = GetOverlappedResult(s->hcom, &ov, &size, TRUE);
2333 2399 if (!ret) {
2334 2400 fprintf(stderr, "Failed GetOverlappedResult\n");
2335 2401 if (ov.hEvent) {
2336 2402 CloseHandle(ov.hEvent);
2337 2403 ov.hEvent = NULL;
2338 2404 }
2339 2405 goto fail;
2340 2406 }
2341 2407
2342 2408 if (ov.hEvent) {
2343 2409 CloseHandle(ov.hEvent);
2344 2410 ov.hEvent = NULL;
2345 2411 }
2346 2412 qemu_add_polling_cb(win_chr_pipe_poll, s);
2347 2413 return 0;
2348 2414
2349 2415 fail:
2350 2416 win_chr_close2(s);
2351 2417 return -1;
2352 2418 }
2353 2419
2354 2420
2355 2421 static CharDriverState *qemu_chr_open_win_pipe(const char *filename)
2356 2422 {
2357 2423 CharDriverState *chr;
2358 2424 WinCharState *s;
2359 2425
2360 2426 chr = qemu_mallocz(sizeof(CharDriverState));
2361 2427 if (!chr)
2362 2428 return NULL;
2363 2429 s = qemu_mallocz(sizeof(WinCharState));
2364 2430 if (!s) {
2365 2431 free(chr);
2366 2432 return NULL;
2367 2433 }
2368 2434 chr->opaque = s;
2369 2435 chr->chr_write = win_chr_write;
2370 2436 chr->chr_close = win_chr_close;
2371 2437
2372 2438 if (win_chr_pipe_init(s, filename) < 0) {
2373 2439 free(s);
2374 2440 free(chr);
2375 2441 return NULL;
2376 2442 }
2377 2443 qemu_chr_reset(chr);
2378 2444 return chr;
2379 2445 }
2380 2446
2381 2447 static CharDriverState *qemu_chr_open_win_file(HANDLE fd_out)
2382 2448 {
2383 2449 CharDriverState *chr;
2384 2450 WinCharState *s;
2385 2451
2386 2452 chr = qemu_mallocz(sizeof(CharDriverState));
2387 2453 if (!chr)
2388 2454 return NULL;
2389 2455 s = qemu_mallocz(sizeof(WinCharState));
2390 2456 if (!s) {
2391 2457 free(chr);
2392 2458 return NULL;
2393 2459 }
2394 2460 s->hcom = fd_out;
2395 2461 chr->opaque = s;
2396 2462 chr->chr_write = win_chr_write;
2397 2463 qemu_chr_reset(chr);
2398 2464 return chr;
2399 2465 }
2400 2466
2401 2467 static CharDriverState *qemu_chr_open_win_file_out(const char *file_out)
2402 2468 {
2403 2469 HANDLE fd_out;
2404 2470
2405 2471 fd_out = CreateFile(file_out, GENERIC_WRITE, FILE_SHARE_READ, NULL,
2406 2472 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2407 2473 if (fd_out == INVALID_HANDLE_VALUE)
2408 2474 return NULL;
2409 2475
2410 2476 return qemu_chr_open_win_file(fd_out);
2411 2477 }
2412 2478 #endif
2413 2479
2414 2480 /***********************************************************/
2415 2481 /* UDP Net console */
2416 2482
2417 2483 typedef struct {
2418 2484 int fd;
2419 2485 struct sockaddr_in daddr;
2420 2486 char buf[1024];
2421 2487 int bufcnt;
2422 2488 int bufptr;
2423 2489 int max_size;
2424 2490 } NetCharDriver;
2425 2491
2426 2492 static int udp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
2427 2493 {
2428 2494 NetCharDriver *s = chr->opaque;
2429 2495
2430 2496 return sendto(s->fd, buf, len, 0,
2431 2497 (struct sockaddr *)&s->daddr, sizeof(struct sockaddr_in));
2432 2498 }
2433 2499
2434 2500 static int udp_chr_read_poll(void *opaque)
2435 2501 {
2436 2502 CharDriverState *chr = opaque;
2437 2503 NetCharDriver *s = chr->opaque;
2438 2504
2439 2505 s->max_size = qemu_chr_can_read(chr);
2440 2506
2441 2507 /* If there were any stray characters in the queue process them
2442 2508 * first
2443 2509 */
2444 2510 while (s->max_size > 0 && s->bufptr < s->bufcnt) {
2445 2511 qemu_chr_read(chr, &s->buf[s->bufptr], 1);
2446 2512 s->bufptr++;
2447 2513 s->max_size = qemu_chr_can_read(chr);
2448 2514 }
2449 2515 return s->max_size;
2450 2516 }
2451 2517
2452 2518 static void udp_chr_read(void *opaque)
2453 2519 {
2454 2520 CharDriverState *chr = opaque;
2455 2521 NetCharDriver *s = chr->opaque;
2456 2522
2457 2523 if (s->max_size == 0)
2458 2524 return;
2459 2525 s->bufcnt = recv(s->fd, s->buf, sizeof(s->buf), 0);
2460 2526 s->bufptr = s->bufcnt;
2461 2527 if (s->bufcnt <= 0)
2462 2528 return;
2463 2529
2464 2530 s->bufptr = 0;
2465 2531 while (s->max_size > 0 && s->bufptr < s->bufcnt) {
2466 2532 qemu_chr_read(chr, &s->buf[s->bufptr], 1);
2467 2533 s->bufptr++;
2468 2534 s->max_size = qemu_chr_can_read(chr);
2469 2535 }
2470 2536 }
2471 2537
2472 2538 static void udp_chr_update_read_handler(CharDriverState *chr)
2473 2539 {
2474 2540 NetCharDriver *s = chr->opaque;
2475 2541
2476 2542 if (s->fd >= 0) {
2477 2543 qemu_set_fd_handler2(s->fd, udp_chr_read_poll,
2478 2544 udp_chr_read, NULL, chr);
2479 2545 }
2480 2546 }
2481 2547
2482 2548 int parse_host_port(struct sockaddr_in *saddr, const char *str);
2483 2549 #ifndef _WIN32
2484 2550 static int parse_unix_path(struct sockaddr_un *uaddr, const char *str);
2485 2551 #endif
2486 2552 int parse_host_src_port(struct sockaddr_in *haddr,
2487 2553 struct sockaddr_in *saddr,
2488 2554 const char *str);
2489 2555
2490 2556 static CharDriverState *qemu_chr_open_udp(const char *def)
2491 2557 {
2492 2558 CharDriverState *chr = NULL;
2493 2559 NetCharDriver *s = NULL;
2494 2560 int fd = -1;
2495 2561 struct sockaddr_in saddr;
2496 2562
2497 2563 chr = qemu_mallocz(sizeof(CharDriverState));
2498 2564 if (!chr)
2499 2565 goto return_err;
2500 2566 s = qemu_mallocz(sizeof(NetCharDriver));
2501 2567 if (!s)
2502 2568 goto return_err;
2503 2569
2504 2570 fd = socket(PF_INET, SOCK_DGRAM, 0);
2505 2571 if (fd < 0) {
2506 2572 perror("socket(PF_INET, SOCK_DGRAM)");
2507 2573 goto return_err;
2508 2574 }
2509 2575
2510 2576 if (parse_host_src_port(&s->daddr, &saddr, def) < 0) {
2511 2577 printf("Could not parse: %s\n", def);
2512 2578 goto return_err;
2513 2579 }
2514 2580
2515 2581 if (bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0)
2516 2582 {
2517 2583 perror("bind");
2518 2584 goto return_err;
2519 2585 }
2520 2586
2521 2587 s->fd = fd;
2522 2588 s->bufcnt = 0;
2523 2589 s->bufptr = 0;
2524 2590 chr->opaque = s;
2525 2591 chr->chr_write = udp_chr_write;
2526 2592 chr->chr_update_read_handler = udp_chr_update_read_handler;
2527 2593 return chr;
2528 2594
2529 2595 return_err:
2530 2596 if (chr)
2531 2597 free(chr);
2532 2598 if (s)
2533 2599 free(s);
2534 2600 if (fd >= 0)
2535 2601 closesocket(fd);
2536 2602 return NULL;
2537 2603 }
2538 2604
2539 2605 /***********************************************************/
2540 2606 /* TCP Net console */
2541 2607
2542 2608 typedef struct {
2543 2609 int fd, listen_fd;
2544 2610 int connected;
2545 2611 int max_size;
2546 2612 int do_telnetopt;
2547 2613 int do_nodelay;
2548 2614 int is_unix;
2549 2615 int is_localhost;
2550 2616 } TCPCharDriver;
2551 2617
2552 2618 static void tcp_chr_accept(void *opaque);
2553 2619
2554 2620 static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
2555 2621 {
2556 2622 TCPCharDriver *s = chr->opaque;
2557 2623 if (s->connected) {
2558 2624 return send_all(s->fd, buf, len);
2559 2625 } else {
2560 2626 /* XXX: indicate an error ? */
2561 2627 return len;
2562 2628 }
2563 2629 }
2564 2630
2565 2631 static int tcp_chr_read_poll(void *opaque)
2566 2632 {
2567 2633 CharDriverState *chr = opaque;
2568 2634 TCPCharDriver *s = chr->opaque;
2569 2635 if (!s->connected)
2570 2636 return 0;
2571 2637 s->max_size = qemu_chr_can_read(chr);
2572 2638 return s->max_size;
2573 2639 }
2574 2640
2575 2641 #define IAC 255
2576 2642 #define IAC_BREAK 243
2577 2643 static void tcp_chr_process_IAC_bytes(CharDriverState *chr,
2578 2644 TCPCharDriver *s,
2579 2645 char *buf, int *size)
2580 2646 {
2581 2647 /* Handle any telnet client's basic IAC options to satisfy char by
2582 2648 * char mode with no echo. All IAC options will be removed from
2583 2649 * the buf and the do_telnetopt variable will be used to track the
2584 2650 * state of the width of the IAC information.
2585 2651 *
2586 2652 * IAC commands come in sets of 3 bytes with the exception of the
2587 2653 * "IAC BREAK" command and the double IAC.
2588 2654 */
2589 2655
2590 2656 int i;
2591 2657 int j = 0;
2592 2658
2593 2659 for (i = 0; i < *size; i++) {
2594 2660 if (s->do_telnetopt > 1) {
2595 2661 if ((unsigned char)buf[i] == IAC && s->do_telnetopt == 2) {
2596 2662 /* Double IAC means send an IAC */
2597 2663 if (j != i)
2598 2664 buf[j] = buf[i];
2599 2665 j++;
2600 2666 s->do_telnetopt = 1;
2601 2667 } else {
2602 2668 if ((unsigned char)buf[i] == IAC_BREAK && s->do_telnetopt == 2) {
2603 2669 /* Handle IAC break commands by sending a serial break */
2604 2670 qemu_chr_event(chr, CHR_EVENT_BREAK);
2605 2671 s->do_telnetopt++;
2606 2672 }
2607 2673 s->do_telnetopt++;
2608 2674 }
2609 2675 if (s->do_telnetopt >= 4) {
2610 2676 s->do_telnetopt = 1;
2611 2677 }
2612 2678 } else {
2613 2679 if ((unsigned char)buf[i] == IAC) {
2614 2680 s->do_telnetopt = 2;
2615 2681 } else {
2616 2682 if (j != i)
2617 2683 buf[j] = buf[i];
2618 2684 j++;
2619 2685 }
2620 2686 }
2621 2687 }
2622 2688 *size = j;
2623 2689 }
2624 2690
2625 2691 static void tcp_chr_read(void *opaque)
2626 2692 {
2627 2693 CharDriverState *chr = opaque;
2628 2694 TCPCharDriver *s = chr->opaque;
2629 2695 uint8_t buf[1024];
2630 2696 int len, size;
2631 2697
2632 2698 if (!s->connected || s->max_size <= 0)
2633 2699 return;
2634 2700 len = sizeof(buf);
2635 2701 if (len > s->max_size)
2636 2702 len = s->max_size;
2637 2703 size = recv(s->fd, buf, len, 0);
2638 2704 if (size == 0) {
2639 2705 /* connection closed */
2640 2706 s->connected = 0;
2641 2707 if (s->listen_fd >= 0) {
2642 2708 qemu_set_fd_handler(s->listen_fd, tcp_chr_accept, NULL, chr);
2643 2709 }
2644 2710 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2645 2711 closesocket(s->fd);
2646 2712 s->fd = -1;
2647 2713 } else if (size > 0) {
2648 2714 if (s->do_telnetopt)
2649 2715 tcp_chr_process_IAC_bytes(chr, s, buf, &size);
2650 2716 if (size > 0)
2651 2717 qemu_chr_read(chr, buf, size);
2652 2718 }
2653 2719 }
2654 2720
2655 2721 static void tcp_chr_connect(void *opaque)
2656 2722 {
2657 2723 CharDriverState *chr = opaque;
2658 2724 TCPCharDriver *s = chr->opaque;
2659 2725
2660 2726 s->connected = 1;
2661 2727 qemu_set_fd_handler2(s->fd, tcp_chr_read_poll,
2662 2728 tcp_chr_read, NULL, chr);
2663 2729 qemu_chr_reset(chr);
2664 2730 }
2665 2731
2666 2732 #define IACSET(x,a,b,c) x[0] = a; x[1] = b; x[2] = c;
2667 2733 static void tcp_chr_telnet_init(int fd)
2668 2734 {
2669 2735 char buf[3];
2670 2736 /* Send the telnet negotion to put telnet in binary, no echo, single char mode */
2671 2737 IACSET(buf, 0xff, 0xfb, 0x01); /* IAC WILL ECHO */
2672 2738 send(fd, (char *)buf, 3, 0);
2673 2739 IACSET(buf, 0xff, 0xfb, 0x03); /* IAC WILL Suppress go ahead */
2674 2740 send(fd, (char *)buf, 3, 0);
2675 2741 IACSET(buf, 0xff, 0xfb, 0x00); /* IAC WILL Binary */
2676 2742 send(fd, (char *)buf, 3, 0);
2677 2743 IACSET(buf, 0xff, 0xfd, 0x00); /* IAC DO Binary */
2678 2744 send(fd, (char *)buf, 3, 0);
2679 2745 }
2680 2746
2681 2747 static void socket_set_nodelay(int fd)
2682 2748 {
2683 2749 int val = 1;
2684 2750 setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
2685 2751 }
2686 2752
2687 2753 #ifdef __sun__
2688 2754
2689 2755 #include <priv.h>
2690 2756 #include <ucred.h>
2691 2757
2692 2758 #ifndef PRIV_VIRT_MANAGE
2693 2759 #define PRIV_VIRT_MANAGE ((const char *)("virt_manage"))
2694 2760 #endif
2695 2761
2696 2762 /*
2697 2763 * The logic is as follows: if the user has asked for a localhost-only
2698 2764 * connection, then anyone connecting must be privileged. Otherwise,
2699 2765 * it's a remote connection explicitly specified by the user, and we
2700 2766 * don't check.
2701 2767 */
2702 2768 static int connection_allowed(TCPCharDriver *s, int fd)
2703 2769 {
2704 2770 ucred_t *ucred = NULL;
2705 2771 const priv_set_t *privs;
2706 2772 int ret = 0;
2707 2773
2708 2774 if (!s->is_localhost)
2709 2775 return 1;
2710 2776
2711 2777 if (getpeerucred(fd, &ucred) == -1 ||
2712 2778 (privs = ucred_getprivset(ucred, PRIV_EFFECTIVE)) == NULL)
2713 2779 goto out;
2714 2780
2715 2781 ret = priv_ismember(privs, PRIV_VIRT_MANAGE);
2716 2782
2717 2783 out:
2718 2784 if (ucred != NULL)
2719 2785 ucred_free(ucred);
2720 2786 return ret;
2721 2787 }
2722 2788
2723 2789 #else
2724 2790 #define connection_allowed(s, fd) 1
2725 2791 #endif
2726 2792
2727 2793 static void tcp_chr_accept(void *opaque)
2728 2794 {
2729 2795 CharDriverState *chr = opaque;
2730 2796 TCPCharDriver *s = chr->opaque;
2731 2797 struct sockaddr_in saddr;
2732 2798 #ifndef _WIN32
2733 2799 struct sockaddr_un uaddr;
2734 2800 #endif
2735 2801 struct sockaddr *addr;
2736 2802 socklen_t len;
2737 2803 int fd;
2738 2804
2739 2805 for(;;) {
2740 2806 #ifndef _WIN32
2741 2807 if (s->is_unix) {
2742 2808 len = sizeof(uaddr);
2743 2809 addr = (struct sockaddr *)&uaddr;
2744 2810 } else
2745 2811 #endif
2746 2812 {
2747 2813 len = sizeof(saddr);
2748 2814 addr = (struct sockaddr *)&saddr;
2749 2815 }
2750 2816 fd = accept(s->listen_fd, addr, &len);
2751 2817 if (fd < 0 && errno != EINTR) {
2752 2818 return;
2753 2819 } else if (fd >= 0) {
2754 2820 if (s->do_telnetopt)
2755 2821 tcp_chr_telnet_init(fd);
2756 2822 break;
2757 2823 }
2758 2824 }
2759 2825
2760 2826 if (!connection_allowed(s, fd)) {
2761 2827 close(fd);
2762 2828 return;
2763 2829 }
2764 2830
2765 2831 socket_set_nonblock(fd);
2766 2832 if (s->do_nodelay)
2767 2833 socket_set_nodelay(fd);
2768 2834 s->fd = fd;
2769 2835 qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
2770 2836 tcp_chr_connect(chr);
2771 2837 }
2772 2838
2773 2839 static void tcp_chr_close(CharDriverState *chr)
2774 2840 {
2775 2841 TCPCharDriver *s = chr->opaque;
2776 2842 if (s->fd >= 0)
2777 2843 closesocket(s->fd);
2778 2844 if (s->listen_fd >= 0)
2779 2845 closesocket(s->listen_fd);
2780 2846 qemu_free(s);
2781 2847 }
2782 2848
2783 2849 static CharDriverState *qemu_chr_open_tcp(const char *host_str,
2784 2850 int is_telnet,
2785 2851 int is_unix)
2786 2852 {
2787 2853 CharDriverState *chr = NULL;
2788 2854 TCPCharDriver *s = NULL;
2789 2855 int fd = -1, ret, err, val;
2790 2856 int is_listen = 0;
2791 2857 int is_waitconnect = 1;
2792 2858 int do_nodelay = 0;
2793 2859 int is_localhost = 0;
2794 2860 const char *ptr;
2795 2861 struct sockaddr_in saddr;
2796 2862 #ifndef _WIN32
2797 2863 struct sockaddr_un uaddr;
2798 2864 #endif
2799 2865 struct sockaddr *addr;
2800 2866 socklen_t addrlen;
2801 2867
2802 2868 #ifndef _WIN32
2803 2869 if (is_unix) {
2804 2870 is_localhost = 1;
2805 2871 addr = (struct sockaddr *)&uaddr;
2806 2872 addrlen = sizeof(uaddr);
2807 2873 if (parse_unix_path(&uaddr, host_str) < 0)
2808 2874 goto fail;
2809 2875 } else
2810 2876 #endif
2811 2877 {
2812 2878 addr = (struct sockaddr *)&saddr;
2813 2879 addrlen = sizeof(saddr);
2814 2880 if (parse_host_port(&saddr, host_str) < 0)
2815 2881 goto fail;
2816 2882 }
2817 2883
2818 2884 if (!strncmp("localhost", host_str, sizeof("localhost") - 1) ||
2819 2885 !strncmp("127.0.0.1", host_str, sizeof("127.0.0.1") - 1))
2820 2886 is_localhost = 1;
2821 2887
2822 2888 ptr = host_str;
2823 2889 while((ptr = strchr(ptr,','))) {
2824 2890 ptr++;
2825 2891 if (!strncmp(ptr,"server",6)) {
2826 2892 is_listen = 1;
2827 2893 } else if (!strncmp(ptr,"nowait",6)) {
2828 2894 is_waitconnect = 0;
2829 2895 } else if (!strncmp(ptr,"nodelay",6)) {
2830 2896 do_nodelay = 1;
2831 2897 } else {
2832 2898 printf("Unknown option: %s\n", ptr);
2833 2899 goto fail;
2834 2900 }
2835 2901 }
2836 2902 if (!is_listen)
2837 2903 is_waitconnect = 0;
2838 2904
2839 2905 chr = qemu_mallocz(sizeof(CharDriverState));
2840 2906 if (!chr)
2841 2907 goto fail;
2842 2908 s = qemu_mallocz(sizeof(TCPCharDriver));
2843 2909 if (!s)
2844 2910 goto fail;
2845 2911
2846 2912 #ifndef _WIN32
2847 2913 if (is_unix)
2848 2914 fd = socket(PF_UNIX, SOCK_STREAM, 0);
2849 2915 else
2850 2916 #endif
2851 2917 fd = socket(PF_INET, SOCK_STREAM, 0);
2852 2918
2853 2919 if (fd < 0)
2854 2920 goto fail;
2855 2921
2856 2922 if (!is_waitconnect)
2857 2923 socket_set_nonblock(fd);
2858 2924
2859 2925 s->connected = 0;
2860 2926 s->fd = -1;
2861 2927 s->listen_fd = -1;
2862 2928 s->is_unix = is_unix;
2863 2929 s->is_localhost = is_localhost;
2864 2930 s->do_nodelay = do_nodelay && !is_unix;
2865 2931
2866 2932 chr->opaque = s;
2867 2933 chr->chr_write = tcp_chr_write;
2868 2934 chr->chr_close = tcp_chr_close;
2869 2935
2870 2936 if (is_listen) {
2871 2937 /* allow fast reuse */
2872 2938 #ifndef _WIN32
2873 2939 if (is_unix) {
2874 2940 char path[109];
2875 2941 strncpy(path, uaddr.sun_path, 108);
2876 2942 path[108] = 0;
2877 2943 unlink(path);
2878 2944 } else
2879 2945 #endif
2880 2946 {
2881 2947 val = 1;
2882 2948 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
2883 2949 }
2884 2950
2885 2951 ret = bind(fd, addr, addrlen);
2886 2952 if (ret < 0)
2887 2953 goto fail;
2888 2954
2889 2955 ret = listen(fd, 0);
2890 2956 if (ret < 0)
2891 2957 goto fail;
2892 2958
2893 2959 s->listen_fd = fd;
2894 2960 qemu_set_fd_handler(s->listen_fd, tcp_chr_accept, NULL, chr);
2895 2961 if (is_telnet)
2896 2962 s->do_telnetopt = 1;
2897 2963 } else {
2898 2964 for(;;) {
2899 2965 ret = connect(fd, addr, addrlen);
2900 2966 if (ret < 0) {
2901 2967 err = socket_error();
2902 2968 if (err == EINTR || err == EWOULDBLOCK) {
2903 2969 } else if (err == EINPROGRESS) {
2904 2970 break;
2905 2971 } else {
2906 2972 goto fail;
2907 2973 }
2908 2974 } else {
2909 2975 s->connected = 1;
2910 2976 break;
2911 2977 }
2912 2978 }
2913 2979 s->fd = fd;
2914 2980 socket_set_nodelay(fd);
2915 2981 if (s->connected)
2916 2982 tcp_chr_connect(chr);
2917 2983 else
2918 2984 qemu_set_fd_handler(s->fd, NULL, tcp_chr_connect, chr);
2919 2985 }
2920 2986
2921 2987 if (is_listen && is_waitconnect) {
2922 2988 printf("QEMU waiting for connection on: %s\n", host_str);
2923 2989 tcp_chr_accept(chr);
2924 2990 socket_set_nonblock(s->listen_fd);
2925 2991 }
2926 2992
2927 2993 return chr;
2928 2994 fail:
2929 2995 if (fd >= 0)
2930 2996 closesocket(fd);
2931 2997 qemu_free(s);
2932 2998 qemu_free(chr);
2933 2999 return NULL;
2934 3000 }
2935 3001
2936 3002 CharDriverState *qemu_chr_open(const char *filename)
2937 3003 {
2938 3004 const char *p;
2939 3005
2940 3006 if (!strcmp(filename, "vc")) {
2941 3007 return text_console_init(&display_state);
2942 3008 } else if (!strcmp(filename, "null")) {
2943 3009 return qemu_chr_open_null();
2944 3010 } else
2945 3011 if (strstart(filename, "tcp:", &p)) {
2946 3012 return qemu_chr_open_tcp(p, 0, 0);
2947 3013 } else
2948 3014 if (strstart(filename, "telnet:", &p)) {
2949 3015 return qemu_chr_open_tcp(p, 1, 0);
2950 3016 } else
2951 3017 if (strstart(filename, "udp:", &p)) {
2952 3018 return qemu_chr_open_udp(p);
2953 3019 } else
2954 3020 #ifndef _WIN32
2955 3021 if (strstart(filename, "unix:", &p)) {
2956 3022 return qemu_chr_open_tcp(p, 0, 1);
2957 3023 } else if (strstart(filename, "file:", &p)) {
2958 3024 return qemu_chr_open_file_out(p);
2959 3025 } else if (strstart(filename, "pipe:", &p)) {
2960 3026 return qemu_chr_open_pipe(p);
2961 3027 } else if (!strcmp(filename, "pty")) {
2962 3028 return qemu_chr_open_pty();
2963 3029 } else if (!strcmp(filename, "stdio")) {
2964 3030 return qemu_chr_open_stdio();
2965 3031 } else
2966 3032 #endif
2967 3033 #if defined(__linux__)
2968 3034 if (strstart(filename, "/dev/parport", NULL)) {
2969 3035 return qemu_chr_open_pp(filename);
2970 3036 } else
2971 3037 if (strstart(filename, "/dev/", NULL)) {
2972 3038 return qemu_chr_open_tty(filename);
2973 3039 } else
2974 3040 #endif
2975 3041 #ifdef _WIN32
2976 3042 if (strstart(filename, "COM", NULL)) {
2977 3043 return qemu_chr_open_win(filename);
2978 3044 } else
2979 3045 if (strstart(filename, "pipe:", &p)) {
2980 3046 return qemu_chr_open_win_pipe(p);
2981 3047 } else
2982 3048 if (strstart(filename, "file:", &p)) {
2983 3049 return qemu_chr_open_win_file_out(p);
2984 3050 }
2985 3051 #endif
2986 3052 {
2987 3053 return NULL;
2988 3054 }
2989 3055 }
2990 3056
2991 3057 void qemu_chr_close(CharDriverState *chr)
2992 3058 {
2993 3059 if (chr->chr_close)
2994 3060 chr->chr_close(chr);
2995 3061 }
2996 3062
2997 3063 /***********************************************************/
2998 3064 /* network device redirectors */
2999 3065
3000 3066 void hex_dump(FILE *f, const uint8_t *buf, int size)
3001 3067 {
3002 3068 int len, i, j, c;
3003 3069
3004 3070 for(i=0;i<size;i+=16) {
3005 3071 len = size - i;
3006 3072 if (len > 16)
3007 3073 len = 16;
3008 3074 fprintf(f, "%08x ", i);
3009 3075 for(j=0;j<16;j++) {
3010 3076 if (j < len)
3011 3077 fprintf(f, " %02x", buf[i+j]);
3012 3078 else
3013 3079 fprintf(f, " ");
3014 3080 }
3015 3081 fprintf(f, " ");
3016 3082 for(j=0;j<len;j++) {
3017 3083 c = buf[i+j];
3018 3084 if (c < ' ' || c > '~')
3019 3085 c = '.';
3020 3086 fprintf(f, "%c", c);
3021 3087 }
3022 3088 fprintf(f, "\n");
3023 3089 }
3024 3090 }
3025 3091
3026 3092 static int parse_macaddr(uint8_t *macaddr, const char *p)
3027 3093 {
3028 3094 int i;
3029 3095 for(i = 0; i < 6; i++) {
3030 3096 macaddr[i] = strtol(p, (char **)&p, 16);
3031 3097 if (i == 5) {
3032 3098 if (*p != '\0')
3033 3099 return -1;
3034 3100 } else {
3035 3101 if (*p != ':')
3036 3102 return -1;
3037 3103 p++;
3038 3104 }
3039 3105 }
3040 3106 return 0;
3041 3107 }
3042 3108
3043 3109 static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
3044 3110 {
3045 3111 const char *p, *p1;
3046 3112 int len;
3047 3113 p = *pp;
3048 3114 p1 = strchr(p, sep);
3049 3115 if (!p1)
3050 3116 return -1;
3051 3117 len = p1 - p;
3052 3118 p1++;
3053 3119 if (buf_size > 0) {
3054 3120 if (len > buf_size - 1)
3055 3121 len = buf_size - 1;
3056 3122 memcpy(buf, p, len);
3057 3123 buf[len] = '\0';
3058 3124 }
3059 3125 *pp = p1;
3060 3126 return 0;
3061 3127 }
3062 3128
3063 3129 int parse_host_src_port(struct sockaddr_in *haddr,
3064 3130 struct sockaddr_in *saddr,
3065 3131 const char *input_str)
3066 3132 {
3067 3133 char *str = strdup(input_str);
3068 3134 char *host_str = str;
3069 3135 char *src_str;
3070 3136 char *ptr;
3071 3137
3072 3138 /*
3073 3139 * Chop off any extra arguments at the end of the string which
3074 3140 * would start with a comma, then fill in the src port information
3075 3141 * if it was provided else use the "any address" and "any port".
3076 3142 */
3077 3143 if ((ptr = strchr(str,',')))
3078 3144 *ptr = '\0';
3079 3145
3080 3146 if ((src_str = strchr(input_str,'@'))) {
3081 3147 *src_str = '\0';
3082 3148 src_str++;
3083 3149 }
3084 3150
3085 3151 if (parse_host_port(haddr, host_str) < 0)
3086 3152 goto fail;
3087 3153
3088 3154 if (!src_str || *src_str == '\0')
3089 3155 src_str = ":0";
3090 3156
3091 3157 if (parse_host_port(saddr, src_str) < 0)
3092 3158 goto fail;
3093 3159
3094 3160 free(str);
3095 3161 return(0);
3096 3162
3097 3163 fail:
3098 3164 free(str);
3099 3165 return -1;
3100 3166 }
3101 3167
3102 3168 int parse_host(struct sockaddr_in *saddr, const char *buf)
3103 3169 {
3104 3170 struct hostent *he;
3105 3171
3106 3172 if ((he = gethostbyname(buf)) != NULL) {
3107 3173 saddr->sin_addr = *(struct in_addr *)he->h_addr;
3108 3174 } else {
3109 3175 if (!inet_aton(buf, &saddr->sin_addr))
3110 3176 return -1;
3111 3177 }
3112 3178 return 0;
3113 3179 }
3114 3180
3115 3181 int parse_host_port(struct sockaddr_in *saddr, const char *str)
3116 3182 {
3117 3183 char buf[512];
3118 3184 const char *p, *r;
3119 3185 int port;
3120 3186
3121 3187 p = str;
3122 3188 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3123 3189 return -1;
3124 3190 saddr->sin_family = AF_INET;
3125 3191 if (buf[0] == '\0') {
3126 3192 saddr->sin_addr.s_addr = 0;
3127 3193 } else {
3128 3194 if (parse_host(saddr, buf) == -1)
3129 3195 return -1;
3130 3196 }
3131 3197 port = strtol(p, (char **)&r, 0);
3132 3198 if (r == p)
3133 3199 return -1;
3134 3200 saddr->sin_port = htons(port);
3135 3201 return 0;
3136 3202 }
3137 3203
3138 3204 #ifndef _WIN32
3139 3205 static int parse_unix_path(struct sockaddr_un *uaddr, const char *str)
3140 3206 {
3141 3207 const char *p;
3142 3208 int len;
3143 3209
3144 3210 len = MIN(108, strlen(str));
3145 3211 p = strchr(str, ',');
3146 3212 if (p)
3147 3213 len = MIN(len, p - str);
3148 3214
3149 3215 memset(uaddr, 0, sizeof(*uaddr));
3150 3216
3151 3217 uaddr->sun_family = AF_UNIX;
3152 3218 memcpy(uaddr->sun_path, str, len);
3153 3219
3154 3220 return 0;
3155 3221 }
3156 3222 #endif
3157 3223
3158 3224 /* find or alloc a new VLAN */
3159 3225 VLANState *qemu_find_vlan(int id)
3160 3226 {
3161 3227 VLANState **pvlan, *vlan;
3162 3228 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
3163 3229 if (vlan->id == id)
3164 3230 return vlan;
3165 3231 }
3166 3232 vlan = qemu_mallocz(sizeof(VLANState));
3167 3233 if (!vlan)
3168 3234 return NULL;
3169 3235 vlan->id = id;
3170 3236 vlan->next = NULL;
3171 3237 pvlan = &first_vlan;
3172 3238 while (*pvlan != NULL)
3173 3239 pvlan = &(*pvlan)->next;
3174 3240 *pvlan = vlan;
3175 3241 return vlan;
3176 3242 }
3177 3243
3178 3244 VLANClientState *qemu_new_vlan_client(VLANState *vlan,
3179 3245 IOReadHandler *fd_read,
3180 3246 IOCanRWHandler *fd_can_read,
3181 3247 void *opaque)
3182 3248 {
3183 3249 VLANClientState *vc, **pvc;
3184 3250 vc = qemu_mallocz(sizeof(VLANClientState));
3185 3251 if (!vc)
3186 3252 return NULL;
3187 3253 vc->fd_read = fd_read;
3188 3254 vc->fd_can_read = fd_can_read;
3189 3255 vc->opaque = opaque;
3190 3256 vc->vlan = vlan;
3191 3257
3192 3258 vc->next = NULL;
3193 3259 pvc = &vlan->first_client;
3194 3260 while (*pvc != NULL)
3195 3261 pvc = &(*pvc)->next;
3196 3262 *pvc = vc;
3197 3263 return vc;
3198 3264 }
3199 3265
3200 3266 int qemu_can_send_packet(VLANClientState *vc1)
3201 3267 {
3202 3268 VLANState *vlan = vc1->vlan;
3203 3269 VLANClientState *vc;
3204 3270
3205 3271 for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
3206 3272 if (vc != vc1) {
3207 3273 if (vc->fd_can_read && !vc->fd_can_read(vc->opaque))
3208 3274 return 0;
3209 3275 }
3210 3276 }
3211 3277 return 1;
3212 3278 }
3213 3279
3214 3280 void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size)
3215 3281 {
3216 3282 VLANState *vlan = vc1->vlan;
3217 3283 VLANClientState *vc;
3218 3284
3219 3285 #if 0
3220 3286 printf("vlan %d send:\n", vlan->id);
3221 3287 hex_dump(stdout, buf, size);
3222 3288 #endif
3223 3289 for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
3224 3290 if (vc != vc1) {
3225 3291 vc->fd_read(vc->opaque, buf, size);
3226 3292 }
3227 3293 }
3228 3294 }
3229 3295
3230 3296 #if defined(CONFIG_SLIRP)
3231 3297
3232 3298 /* slirp network adapter */
3233 3299
3234 3300 static int slirp_inited;
3235 3301 static VLANClientState *slirp_vc;
3236 3302
3237 3303 int slirp_can_output(void)
3238 3304 {
3239 3305 return !slirp_vc || qemu_can_send_packet(slirp_vc);
3240 3306 }
3241 3307
3242 3308 void slirp_output(const uint8_t *pkt, int pkt_len)
3243 3309 {
3244 3310 #if 0
3245 3311 printf("slirp output:\n");
3246 3312 hex_dump(stdout, pkt, pkt_len);
3247 3313 #endif
3248 3314 if (!slirp_vc)
3249 3315 return;
3250 3316 qemu_send_packet(slirp_vc, pkt, pkt_len);
3251 3317 }
3252 3318
3253 3319 static void slirp_receive(void *opaque, const uint8_t *buf, int size)
3254 3320 {
3255 3321 #if 0
3256 3322 printf("slirp input:\n");
3257 3323 hex_dump(stdout, buf, size);
3258 3324 #endif
3259 3325 slirp_input(buf, size);
3260 3326 }
3261 3327
3262 3328 static int net_slirp_init(VLANState *vlan)
3263 3329 {
3264 3330 if (!slirp_inited) {
3265 3331 slirp_inited = 1;
3266 3332 slirp_init();
3267 3333 }
3268 3334 slirp_vc = qemu_new_vlan_client(vlan,
3269 3335 slirp_receive, NULL, NULL);
3270 3336 snprintf(slirp_vc->info_str, sizeof(slirp_vc->info_str), "user redirector");
3271 3337 return 0;
3272 3338 }
3273 3339
3274 3340 static void net_slirp_redir(const char *redir_str)
3275 3341 {
3276 3342 int is_udp;
3277 3343 char buf[256], *r;
3278 3344 const char *p;
3279 3345 struct in_addr guest_addr;
3280 3346 int host_port, guest_port;
3281 3347
3282 3348 if (!slirp_inited) {
3283 3349 slirp_inited = 1;
3284 3350 slirp_init();
3285 3351 }
3286 3352
3287 3353 p = redir_str;
3288 3354 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3289 3355 goto fail;
3290 3356 if (!strcmp(buf, "tcp")) {
3291 3357 is_udp = 0;
3292 3358 } else if (!strcmp(buf, "udp")) {
3293 3359 is_udp = 1;
3294 3360 } else {
3295 3361 goto fail;
3296 3362 }
3297 3363
3298 3364 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3299 3365 goto fail;
3300 3366 host_port = strtol(buf, &r, 0);
3301 3367 if (r == buf)
3302 3368 goto fail;
3303 3369
3304 3370 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
3305 3371 goto fail;
3306 3372 if (buf[0] == '\0') {
3307 3373 pstrcpy(buf, sizeof(buf), "10.0.2.15");
3308 3374 }
3309 3375 if (!inet_aton(buf, &guest_addr))
3310 3376 goto fail;
3311 3377
3312 3378 guest_port = strtol(p, &r, 0);
3313 3379 if (r == p)
3314 3380 goto fail;
3315 3381
3316 3382 if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
3317 3383 fprintf(stderr, "qemu: could not set up redirection\n");
3318 3384 exit(1);
3319 3385 }
3320 3386 return;
3321 3387 fail:
3322 3388 fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n");
3323 3389 exit(1);
3324 3390 }
3325 3391
3326 3392 #ifndef _WIN32
3327 3393
3328 3394 char smb_dir[1024];
3329 3395
3330 3396 static void smb_exit(void)
3331 3397 {
3332 3398 DIR *d;
3333 3399 struct dirent *de;
3334 3400 char filename[1024];
3335 3401
3336 3402 /* erase all the files in the directory */
3337 3403 d = opendir(smb_dir);
3338 3404 for(;;) {
3339 3405 de = readdir(d);
3340 3406 if (!de)
3341 3407 break;
3342 3408 if (strcmp(de->d_name, ".") != 0 &&
3343 3409 strcmp(de->d_name, "..") != 0) {
3344 3410 snprintf(filename, sizeof(filename), "%s/%s",
3345 3411 smb_dir, de->d_name);
3346 3412 unlink(filename);
3347 3413 }
3348 3414 }
3349 3415 closedir(d);
3350 3416 rmdir(smb_dir);
3351 3417 }
3352 3418
3353 3419 /* automatic user mode samba server configuration */
3354 3420 void net_slirp_smb(const char *exported_dir)
3355 3421 {
3356 3422 char smb_conf[1024];
3357 3423 char smb_cmdline[1024];
3358 3424 FILE *f;
3359 3425
3360 3426 if (!slirp_inited) {
3361 3427 slirp_inited = 1;
3362 3428 slirp_init();
3363 3429 }
3364 3430
3365 3431 /* XXX: better tmp dir construction */
3366 3432 snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%ld", (long)getpid());
3367 3433 if (mkdir(smb_dir, 0700) < 0) {
3368 3434 fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
3369 3435 exit(1);
3370 3436 }
3371 3437 snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
3372 3438
3373 3439 f = fopen(smb_conf, "w");
3374 3440 if (!f) {
3375 3441 fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
3376 3442 exit(1);
3377 3443 }
3378 3444 fprintf(f,
3379 3445 "[global]\n"
3380 3446 "private dir=%s\n"
3381 3447 "smb ports=0\n"
3382 3448 "socket address=127.0.0.1\n"
3383 3449 "pid directory=%s\n"
3384 3450 "lock directory=%s\n"
3385 3451 "log file=%s/log.smbd\n"
3386 3452 "smb passwd file=%s/smbpasswd\n"
3387 3453 "security = share\n"
3388 3454 "[qemu]\n"
3389 3455 "path=%s\n"
3390 3456 "read only=no\n"
3391 3457 "guest ok=yes\n",
3392 3458 smb_dir,
3393 3459 smb_dir,
3394 3460 smb_dir,
3395 3461 smb_dir,
3396 3462 smb_dir,
3397 3463 exported_dir
3398 3464 );
3399 3465 fclose(f);
3400 3466 atexit(smb_exit);
3401 3467
3402 3468 snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
3403 3469 SMBD_COMMAND, smb_conf);
3404 3470
3405 3471 slirp_add_exec(0, smb_cmdline, 4, 139);
3406 3472 }
3407 3473
3408 3474 #endif /* !defined(_WIN32) */
3409 3475
3410 3476 #endif /* CONFIG_SLIRP */
3411 3477
3412 3478 #if !defined(_WIN32)
3413 3479
3414 3480 typedef struct TAPState {
3415 3481 VLANClientState *vc;
3416 3482 int fd;
3417 3483 #ifdef __sun__
3418 3484 uint8_t mac_addr[ETHERADDRL];
3419 3485 dlpi_handle_t dh;
3420 3486 #endif /* __sun__ */
3421 3487 } TAPState;
3422 3488
3423 3489 static void tap_receive(void *opaque, const uint8_t *buf, int size)
3424 3490 {
3425 3491 TAPState *s = opaque;
3426 3492 int ret;
3427 3493
3428 3494 #if 0
3429 3495 fprintf(logfile, "tap_receive: sending %d @ %p:\n", size, buf);
3430 3496 hex_dump(logfile, buf, size);
3431 3497 #endif
3432 3498 for(;;) {
3433 3499 ret = write(s->fd, buf, size);
3434 3500 if (ret < 0 && (errno == EINTR || errno == EAGAIN)) {
3435 3501 } else {
3436 3502 break;
3437 3503 }
3438 3504 }
3439 3505 }
3440 3506
3441 3507 static void tap_send(void *opaque)
3442 3508 {
3443 3509 TAPState *s = opaque;
3444 3510 uint8_t buf[4096];
3445 3511 size_t size;
3446 3512
3447 3513 #ifdef __sun__
3448 3514 size = sizeof (buf);
3449 3515 if (dlpi_recv(s->dh, NULL, NULL, buf, &size, -1, NULL) != DLPI_SUCCESS)
3450 3516 return;
3451 3517 #else /* _!sun__ */
3452 3518 size = read(s->fd, buf, sizeof(buf));
3453 3519 #endif /* __sun__ */
3454 3520 if (size > 0)
3455 3521 qemu_send_packet(s->vc, buf, size);
3456 3522 }
3457 3523
3458 3524 /* fd support */
3459 3525
3460 3526 static TAPState *net_tap_fd_init(VLANState *vlan, int fd)
3461 3527 {
3462 3528 TAPState *s;
3463 3529
3464 3530 s = qemu_mallocz(sizeof(TAPState));
3465 3531 if (!s)
3466 3532 return NULL;
3467 3533 s->fd = fd;
3468 3534 s->vc = qemu_new_vlan_client(vlan, tap_receive, NULL, s);
3469 3535 qemu_set_fd_handler(s->fd, tap_send, NULL, s);
3470 3536 snprintf(s->vc->info_str, sizeof(s->vc->info_str), "tap: fd=%d", fd);
3471 3537 return s;
3472 3538 }
3473 3539
3474 3540 #ifdef _BSD
3475 3541 static int tap_open(char *ifname, int ifname_size)
3476 3542 {
3477 3543 int fd;
3478 3544 char *dev;
3479 3545 struct stat s;
3480 3546
3481 3547 fd = open("/dev/tap", O_RDWR);
3482 3548 if (fd < 0) {
3483 3549 fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
3484 3550 return -1;
3485 3551 }
3486 3552
3487 3553 fstat(fd, &s);
3488 3554 dev = devname(s.st_rdev, S_IFCHR);
3489 3555 pstrcpy(ifname, ifname_size, dev);
3490 3556
3491 3557 fcntl(fd, F_SETFL, O_NONBLOCK);
3492 3558 return fd;
3493 3559 }
3494 3560 #elif defined(__sun__)
3495 3561 static char *net_tap_get_nic(int nth, boolean_t *setphysaddr,
3496 3562 boolean_t *promiscuous, uint8_t *mac_addr)
3497 3563 {
3498 3564 struct xs_handle *xs = NULL;
3499 3565 char *nic = NULL, *dompath, *bepath, *status = NULL, path[MAXPATHLEN];
3500 3566 unsigned int l;
3501 3567 boolean_t hotplug_connected = 0;
3502 3568 int hotplug_wait = 30; /* seconds */
3503 3569
3504 3570 xs = xs_daemon_open();
3505 3571 if (xs == NULL) {
3506 3572 fprintf(logfile, "net_tap_get_nic: cannot open store\n");
3507 3573 goto fail;
3508 3574 }
3509 3575
3510 3576 dompath = xs_get_domain_path(xs, domid);
3511 3577 if (dompath == NULL) {
3512 3578 fprintf(logfile,
3513 3579 "net_tap_get_nic: cannot get domain path for %d\n",
3514 3580 domid);
3515 3581 goto fail;
3516 3582 }
3517 3583
3518 3584 sprintf(path, "%s/device/vif/%d/backend", dompath, nth);
3519 3585 free(dompath);
3520 3586 dompath = NULL;
3521 3587
3522 3588 bepath = xs_read(xs, XBT_NULL, path, &l);
3523 3589 if (bepath == NULL) {
3524 3590 fprintf(logfile,
3525 3591 "net_tap_get_nic: cannot read backend pathname from %s\n",
3526 3592 path);
3527 3593 goto fail;
3528 3594 }
3529 3595
3530 3596 sprintf(path, "%s/hotplug-status", bepath);
3531 3597 do {
3532 3598 status = xs_read(xs, XBT_NULL, path, &l);
3533 3599 if (status != NULL) {
3534 3600 if (strcmp(status, "connected") == 0) {
3535 3601 hotplug_connected = 1;
3536 3602 break;
3537 3603 }
3538 3604 if (strcmp(status, "error") == 0) {
3539 3605 /* It's not going to work. */
3540 3606 break;
3541 3607 }
3542 3608 }
3543 3609 free(status);
3544 3610 status = NULL;
3545 3611
3546 3612 sleep(1);
3547 3613
3548 3614 hotplug_wait--;
3549 3615 } while (hotplug_wait > 0);
3550 3616
3551 3617 free(status);
3552 3618
3553 3619 if (!hotplug_connected) {
3554 3620 fprintf(logfile,
3555 3621 "net_tap_get_nic: timeout waiting for hotplug at %s\n",
3556 3622 path);
3557 3623 goto fail;
3558 3624 }
3559 3625
3560 3626 sprintf(path, "%s/nic", bepath);
3561 3627 nic = xs_read(xs, XBT_NULL, path, &l);
3562 3628
3563 3629 if (nic != NULL) {
3564 3630 char *v;
3565 3631 struct ether_addr *eap;
3566 3632
3567 3633 sprintf(path, "%s/SUNW-need-set-physaddr", bepath);
3568 3634 v = xs_read(xs, XBT_NULL, path, &l);
3569 3635 if (v == NULL) {
3570 3636 *setphysaddr = 0;
3571 3637 } else {
3572 3638 int i = atoi(v);
3573 3639
3574 3640 if (i == 0)
3575 3641 *setphysaddr = 0;
3576 3642 else
3577 3643 *setphysaddr = 1;
3578 3644 }
3579 3645 free(v);
3580 3646
3581 3647 sprintf(path, "%s/SUNW-need-promiscuous", bepath);
3582 3648 v = xs_read(xs, XBT_NULL, path, &l);
3583 3649 if (v == NULL) {
3584 3650 *promiscuous = 0;
3585 3651 } else {
3586 3652 int i = atoi(v);
3587 3653
3588 3654 if (i == 0)
3589 3655 *promiscuous = 0;
3590 3656 else
3591 3657 *promiscuous = 1;
3592 3658 }
3593 3659 free(v);
3594 3660
3595 3661 sprintf(path, "%s/mac", bepath);
3596 3662 v = xs_read(xs, XBT_NULL, path, &l);
3597 3663 if ((v == NULL) || ((eap = ether_aton(v)) == NULL)) {
3598 3664 /*
3599 3665 * It doesn't really matter what we do here -
3600 3666 * if the mac address was needed then things
3601 3667 * won't work without the correct mac address
3602 3668 * being specified.
3603 3669 */
3604 3670 fprintf(logfile,
3605 3671 "net_tap_get_nic: cannot find mac address at %s",
3606 3672 path);
3607 3673 memset(mac_addr, 0xff, ETHERADDRL);
3608 3674 } else {
3609 3675 memcpy(mac_addr, eap->ether_addr_octet, ETHERADDRL);
3610 3676 }
3611 3677 free(v);
3612 3678 }
3613 3679
3614 3680 free(bepath);
3615 3681
3616 3682 fail:
3617 3683 if (xs != NULL)
3618 3684 xs_daemon_close(xs);
3619 3685
3620 3686 return (nic);
3621 3687 }
3622 3688
3623 3689 static int net_tap_init(VLANState *vlan, const char *ifname1,
3624 3690 const char *setup_script, const char *bridge)
3625 3691 {
3626 3692 char *nic;
3627 3693 boolean_t need_setphysaddr, need_promiscuous;
3628 3694 uint8_t mac_addr[ETHERADDRL];
3629 3695 int fd = -1, ret = 0, r;
3630 3696 dlpi_handle_t dh = NULL;
3631 3697 dlpi_info_t info;
3632 3698 TAPState *s = NULL;
3633 3699
3634 3700 /*
3635 3701 * We rely on the hotplug script having written a 'nic' entry
3636 3702 * into the store. It's the name of a device that we can open
3637 3703 * and speak DLPI.
3638 3704 *
3639 3705 * XXPV dme: is 'nic' a mac device name or a link device name?
3640 3706 * xnbo requires that it be a mac device name - this code
3641 3707 * would appear to need a link device name. Obviously they
3642 3708 * are generally the same, but when Clearview vanity naming
3643 3709 * arrives, they could be different...
3644 3710 */
3645 3711 nic = net_tap_get_nic(vlan->id, &need_setphysaddr,
3646 3712 &need_promiscuous, mac_addr);
3647 3713
3648 3714 fprintf(logfile, "net_tap_init: nic = %s, setphysaddr = %d\n",
3649 3715 nic ? nic : "NULL", need_setphysaddr);
3650 3716 if (nic == NULL) {
3651 3717 ret = -1;
3652 3718 goto done;
3653 3719 }
3654 3720
3655 3721 if ((r = dlpi_open(nic, &dh, DLPI_RAW)) != DLPI_SUCCESS) {
3656 3722 fprintf(logfile, "net_tap_init: "
3657 3723 "cannot open dlpi interface (%d)\n", r);
3658 3724 ret = -1;
3659 3725 goto done;
3660 3726 }
3661 3727
3662 3728 if ((r = dlpi_info(dh, &info, 0)) != DLPI_SUCCESS) {
3663 3729 fprintf(logfile, "net_tap_init: dlpi_info failed (%d)\n", r);
3664 3730 ret = -1;
3665 3731 goto done;
3666 3732 }
3667 3733
3668 3734 if (info.di_mactype != DL_ETHER) {
3669 3735 fprintf(logfile, "net_tap_init: not DL_ETHER\n");
3670 3736 ret = -1;
3671 3737 goto done;
3672 3738 }
3673 3739
3674 3740 if ((r = dlpi_bind(dh, DLPI_ANY_SAP, NULL)) != DLPI_SUCCESS) {
3675 3741 fprintf(logfile, "net_tap_init: dlpi_bind failed (%d)\n", r);
3676 3742 ret = -1;
3677 3743 goto done;
3678 3744 }
3679 3745
3680 3746 if (need_setphysaddr) {
3681 3747 if ((r = dlpi_set_physaddr(dh, DL_CURR_PHYS_ADDR,
3682 3748 mac_addr, ETHERADDRL)) != DLPI_SUCCESS) {
3683 3749 fprintf(logfile,
3684 3750 "net_tap_init: cannot set physaddr (%d)\n",
3685 3751 r);
3686 3752 ret = -1;
3687 3753 goto done;
3688 3754 }
3689 3755 }
3690 3756
3691 3757 if ((r = dlpi_promiscon(dh, DL_PROMISC_SAP)) != DLPI_SUCCESS) {
3692 3758 ret = -1;
3693 3759 goto done;
3694 3760 }
3695 3761
3696 3762 /*
3697 3763 * If the NIC needs to be in promiscuous mode for relevant
3698 3764 * traffic to arrive, make it so.
3699 3765 *
3700 3766 * Even if it doesn't need to be fully promiscuous, we don't
3701 3767 * know which multicast addresses the guest domain cares
3702 3768 * about, so we send it packets addressed to all of them.
3703 3769 */
3704 3770 if ((r = dlpi_promiscon(dh,
3705 3771 (need_promiscuous ? DL_PROMISC_PHYS : DL_PROMISC_MULTI)))
3706 3772 != DLPI_SUCCESS) {
3707 3773 ret = -1;
3708 3774 goto done;
3709 3775 }
3710 3776
3711 3777 if ((fd = dlpi_fd(dh)) < 0) {
3712 3778 fprintf(logfile, "net_tap_init: cannot get fd (%d)\n", fd);
3713 3779 ret = -1;
3714 3780 goto done;
3715 3781 }
3716 3782
3717 3783 s = net_tap_fd_init(vlan, fd);
3718 3784 if (s == NULL) {
3719 3785 ret = -1;
3720 3786 goto done;
3721 3787 }
3722 3788
3723 3789 memcpy(s->mac_addr, mac_addr, ETHERADDRL);
3724 3790 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
3725 3791 "tap: ifname=%s", nic);
3726 3792 s->dh = dh;
3727 3793
3728 3794 done:
3729 3795 if (ret < 0)
3730 3796 dlpi_close(dh);
3731 3797 free(nic);
3732 3798
3733 3799 return (ret);
3734 3800 }
3735 3801 #else
3736 3802 static int tap_open(char *ifname, int ifname_size)
3737 3803 {
3738 3804 struct ifreq ifr;
3739 3805 int fd, ret, retries = 0;
3740 3806
3741 3807 fd = open("/dev/net/tun", O_RDWR);
3742 3808 if (fd < 0) {
3743 3809 fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
3744 3810 return -1;
3745 3811 }
3746 3812 memset(&ifr, 0, sizeof(ifr));
3747 3813 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
3748 3814 if (ifname[0] != '\0')
3749 3815 pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
3750 3816 else
3751 3817 pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
3752 3818 do {
3753 3819 ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
3754 3820 } while ((ret != 0) && (retries++ < 3));
3755 3821 if (ret != 0) {
3756 3822 fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
3757 3823 close(fd);
3758 3824 return -1;
3759 3825 }
3760 3826 pstrcpy(ifname, ifname_size, ifr.ifr_name);
3761 3827 fcntl(fd, F_SETFL, O_NONBLOCK);
3762 3828 return fd;
3763 3829 }
3764 3830
3765 3831 static int net_tap_init(VLANState *vlan, const char *ifname1,
3766 3832 const char *setup_script, const char *bridge)
3767 3833 {
3768 3834 TAPState *s;
3769 3835 int pid, status, fd;
3770 3836 char *args[4];
3771 3837 char **parg;
3772 3838 char ifname[128];
3773 3839
3774 3840 if (ifname1 != NULL)
3775 3841 pstrcpy(ifname, sizeof(ifname), ifname1);
3776 3842 else
3777 3843 ifname[0] = '\0';
3778 3844 fd = tap_open(ifname, sizeof(ifname));
3779 3845 if (fd < 0)
3780 3846 return -1;
3781 3847
3782 3848 if (!setup_script || !strcmp(setup_script, "no"))
3783 3849 setup_script = "";
3784 3850 if (setup_script[0] != '\0') {
3785 3851 /* try to launch network init script */
3786 3852 pid = fork();
3787 3853 if (pid >= 0) {
3788 3854 if (pid == 0) {
3789 3855 int open_max = sysconf(_SC_OPEN_MAX), i;
3790 3856 for (i = 0; i < open_max; i++)
3791 3857 if (i != STDIN_FILENO &&
3792 3858 i != STDOUT_FILENO &&
3793 3859 i != STDERR_FILENO &&
3794 3860 i != fd)
3795 3861 close(i);
3796 3862
3797 3863 parg = args;
3798 3864 *parg++ = (char *)setup_script;
3799 3865 *parg++ = ifname;
3800 3866 *parg++ = (char *)bridge;
3801 3867 *parg++ = NULL;
3802 3868 execv(setup_script, args);
3803 3869 _exit(1);
3804 3870 }
3805 3871 while (waitpid(pid, &status, 0) != pid);
3806 3872 if (!WIFEXITED(status) ||
3807 3873 WEXITSTATUS(status) != 0) {
3808 3874 fprintf(stderr, "%s: could not launch network script\n",
3809 3875 setup_script);
3810 3876 return -1;
3811 3877 }
3812 3878 }
3813 3879 }
3814 3880 s = net_tap_fd_init(vlan, fd);
3815 3881 if (!s)
3816 3882 return -1;
3817 3883 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
3818 3884 "tap: ifname=%s setup_script=%s", ifname, setup_script);
3819 3885 return 0;
3820 3886 }
3821 3887 #endif
3822 3888 #endif /* !_WIN32 */
3823 3889
3824 3890 /* network connection */
3825 3891 typedef struct NetSocketState {
3826 3892 VLANClientState *vc;
3827 3893 int fd;
3828 3894 int state; /* 0 = getting length, 1 = getting data */
3829 3895 int index;
3830 3896 int packet_len;
3831 3897 uint8_t buf[4096];
3832 3898 struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
3833 3899 } NetSocketState;
3834 3900
3835 3901 typedef struct NetSocketListenState {
3836 3902 VLANState *vlan;
3837 3903 int fd;
3838 3904 } NetSocketListenState;
3839 3905
3840 3906 /* XXX: we consider we can send the whole packet without blocking */
3841 3907 static void net_socket_receive(void *opaque, const uint8_t *buf, int size)
3842 3908 {
3843 3909 NetSocketState *s = opaque;
3844 3910 uint32_t len;
3845 3911 len = htonl(size);
3846 3912
3847 3913 send_all(s->fd, (const uint8_t *)&len, sizeof(len));
3848 3914 send_all(s->fd, buf, size);
3849 3915 }
3850 3916
3851 3917 static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, int size)
3852 3918 {
3853 3919 NetSocketState *s = opaque;
3854 3920 sendto(s->fd, buf, size, 0,
3855 3921 (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
3856 3922 }
3857 3923
3858 3924 static void net_socket_send(void *opaque)
3859 3925 {
3860 3926 NetSocketState *s = opaque;
3861 3927 int l, size, err;
3862 3928 uint8_t buf1[4096];
3863 3929 const uint8_t *buf;
3864 3930
3865 3931 size = recv(s->fd, buf1, sizeof(buf1), 0);
3866 3932 if (size < 0) {
3867 3933 err = socket_error();
3868 3934 if (err != EWOULDBLOCK)
3869 3935 goto eoc;
3870 3936 } else if (size == 0) {
3871 3937 /* end of connection */
3872 3938 eoc:
3873 3939 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
3874 3940 closesocket(s->fd);
3875 3941 return;
3876 3942 }
3877 3943 buf = buf1;
3878 3944 while (size > 0) {
3879 3945 /* reassemble a packet from the network */
3880 3946 switch(s->state) {
3881 3947 case 0:
3882 3948 l = 4 - s->index;
3883 3949 if (l > size)
3884 3950 l = size;
3885 3951 memcpy(s->buf + s->index, buf, l);
3886 3952 buf += l;
3887 3953 size -= l;
3888 3954 s->index += l;
3889 3955 if (s->index == 4) {
3890 3956 /* got length */
3891 3957 s->packet_len = ntohl(*(uint32_t *)s->buf);
3892 3958 s->index = 0;
3893 3959 s->state = 1;
3894 3960 }
3895 3961 break;
3896 3962 case 1:
3897 3963 l = s->packet_len - s->index;
3898 3964 if (l > size)
3899 3965 l = size;
3900 3966 memcpy(s->buf + s->index, buf, l);
3901 3967 s->index += l;
3902 3968 buf += l;
3903 3969 size -= l;
3904 3970 if (s->index >= s->packet_len) {
3905 3971 qemu_send_packet(s->vc, s->buf, s->packet_len);
3906 3972 s->index = 0;
3907 3973 s->state = 0;
3908 3974 }
3909 3975 break;
3910 3976 }
3911 3977 }
3912 3978 }
3913 3979
3914 3980 static void net_socket_send_dgram(void *opaque)
3915 3981 {
3916 3982 NetSocketState *s = opaque;
3917 3983 int size;
3918 3984
3919 3985 size = recv(s->fd, s->buf, sizeof(s->buf), 0);
3920 3986 if (size < 0)
3921 3987 return;
3922 3988 if (size == 0) {
3923 3989 /* end of connection */
3924 3990 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
3925 3991 return;
3926 3992 }
3927 3993 qemu_send_packet(s->vc, s->buf, size);
3928 3994 }
3929 3995
3930 3996 static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
3931 3997 {
3932 3998 struct ip_mreq imr;
3933 3999 int fd;
3934 4000 int val, ret;
3935 4001 if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
3936 4002 fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
3937 4003 inet_ntoa(mcastaddr->sin_addr),
3938 4004 (int)ntohl(mcastaddr->sin_addr.s_addr));
3939 4005 return -1;
3940 4006
3941 4007 }
3942 4008 fd = socket(PF_INET, SOCK_DGRAM, 0);
3943 4009 if (fd < 0) {
3944 4010 perror("socket(PF_INET, SOCK_DGRAM)");
3945 4011 return -1;
3946 4012 }
3947 4013
3948 4014 val = 1;
3949 4015 ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
3950 4016 (const char *)&val, sizeof(val));
3951 4017 if (ret < 0) {
3952 4018 perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
3953 4019 goto fail;
3954 4020 }
3955 4021
3956 4022 ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
3957 4023 if (ret < 0) {
3958 4024 perror("bind");
3959 4025 goto fail;
3960 4026 }
3961 4027
3962 4028 /* Add host to multicast group */
3963 4029 imr.imr_multiaddr = mcastaddr->sin_addr;
3964 4030 imr.imr_interface.s_addr = htonl(INADDR_ANY);
3965 4031
3966 4032 ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
3967 4033 (const char *)&imr, sizeof(struct ip_mreq));
3968 4034 if (ret < 0) {
3969 4035 perror("setsockopt(IP_ADD_MEMBERSHIP)");
3970 4036 goto fail;
3971 4037 }
3972 4038
3973 4039 /* Force mcast msgs to loopback (eg. several QEMUs in same host */
3974 4040 val = 1;
3975 4041 ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
3976 4042 (const char *)&val, sizeof(val));
3977 4043 if (ret < 0) {
3978 4044 perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
3979 4045 goto fail;
3980 4046 }
3981 4047
3982 4048 socket_set_nonblock(fd);
3983 4049 return fd;
3984 4050 fail:
3985 4051 if (fd >= 0)
3986 4052 closesocket(fd);
3987 4053 return -1;
3988 4054 }
3989 4055
3990 4056 static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan, int fd,
3991 4057 int is_connected)
3992 4058 {
3993 4059 struct sockaddr_in saddr;
3994 4060 int newfd;
3995 4061 socklen_t saddr_len;
3996 4062 NetSocketState *s;
3997 4063
3998 4064 /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
3999 4065 * Because this may be "shared" socket from a "master" process, datagrams would be recv()
4000 4066 * by ONLY ONE process: we must "clone" this dgram socket --jjo
4001 4067 */
4002 4068
4003 4069 if (is_connected) {
4004 4070 if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
4005 4071 /* must be bound */
4006 4072 if (saddr.sin_addr.s_addr==0) {
4007 4073 fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
4008 4074 fd);
4009 4075 return NULL;
4010 4076 }
4011 4077 /* clone dgram socket */
4012 4078 newfd = net_socket_mcast_create(&saddr);
4013 4079 if (newfd < 0) {
4014 4080 /* error already reported by net_socket_mcast_create() */
4015 4081 close(fd);
4016 4082 return NULL;
4017 4083 }
4018 4084 /* clone newfd to fd, close newfd */
4019 4085 dup2(newfd, fd);
4020 4086 close(newfd);
4021 4087
4022 4088 } else {
4023 4089 fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
4024 4090 fd, strerror(errno));
4025 4091 return NULL;
4026 4092 }
4027 4093 }
4028 4094
4029 4095 s = qemu_mallocz(sizeof(NetSocketState));
4030 4096 if (!s)
4031 4097 return NULL;
4032 4098 s->fd = fd;
4033 4099
4034 4100 s->vc = qemu_new_vlan_client(vlan, net_socket_receive_dgram, NULL, s);
4035 4101 qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
4036 4102
4037 4103 /* mcast: save bound address as dst */
4038 4104 if (is_connected) s->dgram_dst=saddr;
4039 4105
4040 4106 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4041 4107 "socket: fd=%d (%s mcast=%s:%d)",
4042 4108 fd, is_connected? "cloned" : "",
4043 4109 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4044 4110 return s;
4045 4111 }
4046 4112
4047 4113 static void net_socket_connect(void *opaque)
4048 4114 {
4049 4115 NetSocketState *s = opaque;
4050 4116 qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
4051 4117 }
4052 4118
4053 4119 static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, int fd,
4054 4120 int is_connected)
4055 4121 {
4056 4122 NetSocketState *s;
4057 4123 s = qemu_mallocz(sizeof(NetSocketState));
4058 4124 if (!s)
4059 4125 return NULL;
4060 4126 s->fd = fd;
4061 4127 s->vc = qemu_new_vlan_client(vlan,
4062 4128 net_socket_receive, NULL, s);
4063 4129 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4064 4130 "socket: fd=%d", fd);
4065 4131 if (is_connected) {
4066 4132 net_socket_connect(s);
4067 4133 } else {
4068 4134 qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
4069 4135 }
4070 4136 return s;
4071 4137 }
4072 4138
4073 4139 static NetSocketState *net_socket_fd_init(VLANState *vlan, int fd,
4074 4140 int is_connected)
4075 4141 {
4076 4142 int so_type=-1, optlen=sizeof(so_type);
4077 4143
4078 4144 if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type, &optlen)< 0) {
4079 4145 fprintf(stderr, "qemu: error: setsockopt(SO_TYPE) for fd=%d failed\n", fd);
4080 4146 return NULL;
4081 4147 }
4082 4148 switch(so_type) {
4083 4149 case SOCK_DGRAM:
4084 4150 return net_socket_fd_init_dgram(vlan, fd, is_connected);
4085 4151 case SOCK_STREAM:
4086 4152 return net_socket_fd_init_stream(vlan, fd, is_connected);
4087 4153 default:
4088 4154 /* who knows ... this could be a eg. a pty, do warn and continue as stream */
4089 4155 fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
4090 4156 return net_socket_fd_init_stream(vlan, fd, is_connected);
4091 4157 }
4092 4158 return NULL;
4093 4159 }
4094 4160
4095 4161 static void net_socket_accept(void *opaque)
4096 4162 {
4097 4163 NetSocketListenState *s = opaque;
4098 4164 NetSocketState *s1;
4099 4165 struct sockaddr_in saddr;
4100 4166 socklen_t len;
4101 4167 int fd;
4102 4168
4103 4169 for(;;) {
4104 4170 len = sizeof(saddr);
4105 4171 fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
4106 4172 if (fd < 0 && errno != EINTR) {
4107 4173 return;
4108 4174 } else if (fd >= 0) {
4109 4175 break;
4110 4176 }
4111 4177 }
4112 4178 s1 = net_socket_fd_init(s->vlan, fd, 1);
4113 4179 if (!s1) {
4114 4180 closesocket(fd);
4115 4181 } else {
4116 4182 snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
4117 4183 "socket: connection from %s:%d",
4118 4184 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4119 4185 }
4120 4186 }
4121 4187
4122 4188 static int net_socket_listen_init(VLANState *vlan, const char *host_str)
4123 4189 {
4124 4190 NetSocketListenState *s;
4125 4191 int fd, val, ret;
4126 4192 struct sockaddr_in saddr;
4127 4193
4128 4194 if (parse_host_port(&saddr, host_str) < 0)
4129 4195 return -1;
4130 4196
4131 4197 s = qemu_mallocz(sizeof(NetSocketListenState));
4132 4198 if (!s)
4133 4199 return -1;
4134 4200
4135 4201 fd = socket(PF_INET, SOCK_STREAM, 0);
4136 4202 if (fd < 0) {
4137 4203 perror("socket");
4138 4204 return -1;
4139 4205 }
4140 4206 socket_set_nonblock(fd);
4141 4207
4142 4208 /* allow fast reuse */
4143 4209 val = 1;
4144 4210 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
4145 4211
4146 4212 ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
4147 4213 if (ret < 0) {
4148 4214 perror("bind");
4149 4215 return -1;
4150 4216 }
4151 4217 ret = listen(fd, 0);
4152 4218 if (ret < 0) {
4153 4219 perror("listen");
4154 4220 return -1;
4155 4221 }
4156 4222 s->vlan = vlan;
4157 4223 s->fd = fd;
4158 4224 qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
4159 4225 return 0;
4160 4226 }
4161 4227
4162 4228 static int net_socket_connect_init(VLANState *vlan, const char *host_str)
4163 4229 {
4164 4230 NetSocketState *s;
4165 4231 int fd, connected, ret, err;
4166 4232 struct sockaddr_in saddr;
4167 4233
4168 4234 if (parse_host_port(&saddr, host_str) < 0)
4169 4235 return -1;
4170 4236
4171 4237 fd = socket(PF_INET, SOCK_STREAM, 0);
4172 4238 if (fd < 0) {
4173 4239 perror("socket");
4174 4240 return -1;
4175 4241 }
4176 4242 socket_set_nonblock(fd);
4177 4243
4178 4244 connected = 0;
4179 4245 for(;;) {
4180 4246 ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
4181 4247 if (ret < 0) {
4182 4248 err = socket_error();
4183 4249 if (err == EINTR || err == EWOULDBLOCK) {
4184 4250 } else if (err == EINPROGRESS) {
4185 4251 break;
4186 4252 } else {
4187 4253 perror("connect");
4188 4254 closesocket(fd);
4189 4255 return -1;
4190 4256 }
4191 4257 } else {
4192 4258 connected = 1;
4193 4259 break;
4194 4260 }
4195 4261 }
4196 4262 s = net_socket_fd_init(vlan, fd, connected);
4197 4263 if (!s)
4198 4264 return -1;
4199 4265 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4200 4266 "socket: connect to %s:%d",
4201 4267 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4202 4268 return 0;
4203 4269 }
4204 4270
4205 4271 static int net_socket_mcast_init(VLANState *vlan, const char *host_str)
4206 4272 {
4207 4273 NetSocketState *s;
4208 4274 int fd;
4209 4275 struct sockaddr_in saddr;
4210 4276
4211 4277 if (parse_host_port(&saddr, host_str) < 0)
4212 4278 return -1;
4213 4279
4214 4280
4215 4281 fd = net_socket_mcast_create(&saddr);
4216 4282 if (fd < 0)
4217 4283 return -1;
4218 4284
4219 4285 s = net_socket_fd_init(vlan, fd, 0);
4220 4286 if (!s)
4221 4287 return -1;
4222 4288
4223 4289 s->dgram_dst = saddr;
4224 4290
4225 4291 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
4226 4292 "socket: mcast=%s:%d",
4227 4293 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
4228 4294 return 0;
4229 4295
4230 4296 }
4231 4297
4232 4298 static int get_param_value(char *buf, int buf_size,
4233 4299 const char *tag, const char *str)
4234 4300 {
4235 4301 const char *p;
4236 4302 char *q;
4237 4303 char option[128];
4238 4304
4239 4305 p = str;
4240 4306 for(;;) {
4241 4307 q = option;
4242 4308 while (*p != '\0' && *p != '=') {
4243 4309 if ((q - option) < sizeof(option) - 1)
4244 4310 *q++ = *p;
4245 4311 p++;
4246 4312 }
4247 4313 *q = '\0';
4248 4314 if (*p != '=')
4249 4315 break;
4250 4316 p++;
4251 4317 if (!strcmp(tag, option)) {
4252 4318 q = buf;
4253 4319 while (*p != '\0' && *p != ',') {
4254 4320 if ((q - buf) < buf_size - 1)
4255 4321 *q++ = *p;
4256 4322 p++;
4257 4323 }
4258 4324 *q = '\0';
4259 4325 return q - buf;
4260 4326 } else {
4261 4327 while (*p != '\0' && *p != ',') {
4262 4328 p++;
4263 4329 }
4264 4330 }
4265 4331 if (*p != ',')
4266 4332 break;
4267 4333 p++;
4268 4334 }
4269 4335 return 0;
4270 4336 }
4271 4337
4272 4338 static int net_client_init(const char *str)
4273 4339 {
4274 4340 const char *p;
4275 4341 char *q;
4276 4342 char device[64];
4277 4343 char buf[1024];
4278 4344 int vlan_id, ret;
4279 4345 VLANState *vlan;
4280 4346
4281 4347 p = str;
4282 4348 q = device;
4283 4349 while (*p != '\0' && *p != ',') {
4284 4350 if ((q - device) < sizeof(device) - 1)
4285 4351 *q++ = *p;
4286 4352 p++;
4287 4353 }
4288 4354 *q = '\0';
4289 4355 if (*p == ',')
4290 4356 p++;
4291 4357 vlan_id = 0;
4292 4358 if (get_param_value(buf, sizeof(buf), "vlan", p)) {
4293 4359 vlan_id = strtol(buf, NULL, 0);
4294 4360 }
4295 4361 vlan = qemu_find_vlan(vlan_id);
4296 4362 if (!vlan) {
4297 4363 fprintf(stderr, "Could not create vlan %d\n", vlan_id);
4298 4364 return -1;
4299 4365 }
4300 4366 if (!strcmp(device, "nic")) {
4301 4367 NICInfo *nd;
4302 4368 uint8_t *macaddr;
4303 4369
4304 4370 if (nb_nics >= MAX_NICS) {
4305 4371 fprintf(stderr, "Too Many NICs\n");
4306 4372 return -1;
4307 4373 }
4308 4374 nd = &nd_table[nb_nics];
4309 4375 macaddr = nd->macaddr;
4310 4376 macaddr[0] = 0x52;
4311 4377 macaddr[1] = 0x54;
4312 4378 macaddr[2] = 0x00;
4313 4379 macaddr[3] = 0x12;
4314 4380 macaddr[4] = 0x34;
4315 4381 macaddr[5] = 0x56 + nb_nics;
4316 4382
4317 4383 if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
4318 4384 if (parse_macaddr(macaddr, buf) < 0) {
4319 4385 fprintf(stderr, "invalid syntax for ethernet address\n");
4320 4386 return -1;
4321 4387 }
4322 4388 }
4323 4389 if (get_param_value(buf, sizeof(buf), "model", p)) {
4324 4390 nd->model = strdup(buf);
4325 4391 }
4326 4392 nd->vlan = vlan;
4327 4393 nb_nics++;
4328 4394 ret = 0;
4329 4395 } else
4330 4396 if (!strcmp(device, "none")) {
4331 4397 /* does nothing. It is needed to signal that no network cards
4332 4398 are wanted */
4333 4399 ret = 0;
4334 4400 } else
4335 4401 #ifdef CONFIG_SLIRP
4336 4402 if (!strcmp(device, "user")) {
4337 4403 if (get_param_value(buf, sizeof(buf), "hostname", p)) {
4338 4404 pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf);
4339 4405 }
4340 4406 ret = net_slirp_init(vlan);
4341 4407 } else
4342 4408 #endif
4343 4409 #ifdef _WIN32
4344 4410 if (!strcmp(device, "tap")) {
4345 4411 char ifname[64];
4346 4412 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
4347 4413 fprintf(stderr, "tap: no interface name\n");
4348 4414 return -1;
4349 4415 }
4350 4416 ret = tap_win32_init(vlan, ifname);
4351 4417 } else
4352 4418 #else
4353 4419 if (!strcmp(device, "tap")) {
4354 4420 char ifname[64];
4355 4421 char setup_script[1024];
4356 4422 char bridge[16];
4357 4423 int fd;
4358 4424 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
4359 4425 fd = strtol(buf, NULL, 0);
4360 4426 ret = -1;
4361 4427 if (net_tap_fd_init(vlan, fd))
4362 4428 ret = 0;
4363 4429 } else {
4364 4430 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
4365 4431 ifname[0] = '\0';
4366 4432 }
4367 4433 if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
4368 4434 pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
4369 4435 }
4370 4436 if (get_param_value(bridge, sizeof(bridge), "bridge", p) == 0) {
4371 4437 pstrcpy(bridge, sizeof(bridge), DEFAULT_BRIDGE);
4372 4438 }
4373 4439 ret = net_tap_init(vlan, ifname, setup_script, bridge);
4374 4440 }
4375 4441 } else
4376 4442 #endif
4377 4443 if (!strcmp(device, "socket")) {
4378 4444 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
4379 4445 int fd;
4380 4446 fd = strtol(buf, NULL, 0);
4381 4447 ret = -1;
4382 4448 if (net_socket_fd_init(vlan, fd, 1))
4383 4449 ret = 0;
4384 4450 } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
4385 4451 ret = net_socket_listen_init(vlan, buf);
4386 4452 } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
4387 4453 ret = net_socket_connect_init(vlan, buf);
4388 4454 } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
4389 4455 ret = net_socket_mcast_init(vlan, buf);
4390 4456 } else {
4391 4457 fprintf(stderr, "Unknown socket options: %s\n", p);
4392 4458 return -1;
4393 4459 }
4394 4460 } else
4395 4461 {
4396 4462 fprintf(stderr, "Unknown network device: %s\n", device);
4397 4463 return -1;
4398 4464 }
4399 4465 if (ret < 0) {
4400 4466 fprintf(stderr, "Could not initialize device '%s'\n", device);
4401 4467 }
4402 4468
4403 4469 return ret;
4404 4470 }
4405 4471
4406 4472 void do_info_network(void)
4407 4473 {
4408 4474 VLANState *vlan;
4409 4475 VLANClientState *vc;
4410 4476
4411 4477 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
4412 4478 term_printf("VLAN %d devices:\n", vlan->id);
4413 4479 for(vc = vlan->first_client; vc != NULL; vc = vc->next)
4414 4480 term_printf(" %s\n", vc->info_str);
4415 4481 }
4416 4482 }
4417 4483
4418 4484 /***********************************************************/
4419 4485 /* USB devices */
4420 4486
4421 4487 static USBPort *used_usb_ports;
4422 4488 static USBPort *free_usb_ports;
4423 4489
4424 4490 /* ??? Maybe change this to register a hub to keep track of the topology. */
4425 4491 void qemu_register_usb_port(USBPort *port, void *opaque, int index,
4426 4492 usb_attachfn attach)
4427 4493 {
4428 4494 port->opaque = opaque;
4429 4495 port->index = index;
4430 4496 port->attach = attach;
4431 4497 port->next = free_usb_ports;
4432 4498 free_usb_ports = port;
4433 4499 }
4434 4500
4435 4501 static int usb_device_add(const char *devname)
4436 4502 {
4437 4503 const char *p;
4438 4504 USBDevice *dev;
4439 4505 USBPort *port;
4440 4506 char usb_name[256] = "USB ";
4441 4507
4442 4508 if (!free_usb_ports)
4443 4509 return -1;
4444 4510
4445 4511 if (strstart(devname, "host:", &p)) {
4446 4512 dev = usb_host_device_open(p);
4447 4513 } else if (!strcmp(devname, "mouse")) {
4448 4514 dev = usb_mouse_init();
4449 4515 } else if (!strcmp(devname, "tablet")) {
4450 4516 dev = usb_tablet_init();
4451 4517 } else if (strstart(devname, "disk:", &p)) {
4452 4518 dev = usb_msd_init(p);
4453 4519 } else {
4454 4520 return -1;
4455 4521 }
4456 4522 if (!dev)
4457 4523 return -1;
4458 4524
4459 4525 /* Find a USB port to add the device to. */
4460 4526 port = free_usb_ports;
4461 4527 if (!port->next) {
4462 4528 USBDevice *hub;
4463 4529
4464 4530 /* Create a new hub and chain it on. */
4465 4531 free_usb_ports = NULL;
4466 4532 port->next = used_usb_ports;
4467 4533 used_usb_ports = port;
4468 4534
4469 4535 hub = usb_hub_init(VM_USB_HUB_SIZE);
4470 4536 usb_attach(port, hub);
4471 4537 port = free_usb_ports;
4472 4538 }
4473 4539
4474 4540 free_usb_ports = port->next;
4475 4541 port->next = used_usb_ports;
4476 4542 used_usb_ports = port;
4477 4543
4478 4544 pstrcpy(usb_name + strlen(usb_name),
4479 4545 sizeof(usb_name) - strlen(usb_name),
4480 4546 devname);
4481 4547 register_savevm(usb_name, 0, 1, generic_usb_save, generic_usb_load, dev);
4482 4548
4483 4549 usb_attach(port, dev);
4484 4550 return 0;
4485 4551 }
4486 4552
4487 4553 static int usb_device_del(const char *devname)
4488 4554 {
4489 4555 USBPort *port;
4490 4556 USBPort **lastp;
4491 4557 USBDevice *dev;
4492 4558 int bus_num, addr;
4493 4559 const char *p;
4494 4560
4495 4561 if (!used_usb_ports)
4496 4562 return -1;
4497 4563
4498 4564 p = strchr(devname, '.');
4499 4565 if (!p)
4500 4566 return -1;
4501 4567 bus_num = strtoul(devname, NULL, 0);
4502 4568 addr = strtoul(p + 1, NULL, 0);
4503 4569 if (bus_num != 0)
4504 4570 return -1;
4505 4571
4506 4572 lastp = &used_usb_ports;
4507 4573 port = used_usb_ports;
4508 4574 while (port && port->dev->addr != addr) {
4509 4575 lastp = &port->next;
4510 4576 port = port->next;
4511 4577 }
4512 4578
4513 4579 if (!port)
4514 4580 return -1;
4515 4581
4516 4582 dev = port->dev;
4517 4583 *lastp = port->next;
4518 4584 usb_attach(port, NULL);
4519 4585 dev->handle_destroy(dev);
4520 4586 port->next = free_usb_ports;
4521 4587 free_usb_ports = port;
4522 4588 return 0;
4523 4589 }
4524 4590
4525 4591 void do_usb_add(const char *devname)
4526 4592 {
4527 4593 int ret;
4528 4594 ret = usb_device_add(devname);
4529 4595 if (ret < 0)
4530 4596 term_printf("Could not add USB device '%s'\n", devname);
4531 4597 }
4532 4598
4533 4599 void do_usb_del(const char *devname)
4534 4600 {
4535 4601 int ret;
4536 4602 ret = usb_device_del(devname);
4537 4603 if (ret < 0)
4538 4604 term_printf("Could not remove USB device '%s'\n", devname);
4539 4605 }
4540 4606
4541 4607 void usb_info(void)
4542 4608 {
4543 4609 USBDevice *dev;
4544 4610 USBPort *port;
4545 4611 const char *speed_str;
4546 4612
4547 4613 if (!usb_enabled) {
4548 4614 term_printf("USB support not enabled\n");
4549 4615 return;
4550 4616 }
4551 4617
4552 4618 for (port = used_usb_ports; port; port = port->next) {
4553 4619 dev = port->dev;
4554 4620 if (!dev)
4555 4621 continue;
4556 4622 switch(dev->speed) {
4557 4623 case USB_SPEED_LOW:
4558 4624 speed_str = "1.5";
4559 4625 break;
4560 4626 case USB_SPEED_FULL:
4561 4627 speed_str = "12";
4562 4628 break;
4563 4629 case USB_SPEED_HIGH:
4564 4630 speed_str = "480";
4565 4631 break;
4566 4632 default:
4567 4633 speed_str = "?";
4568 4634 break;
4569 4635 }
4570 4636 term_printf(" Device %d.%d, Speed %s Mb/s, Product %s\n",
4571 4637 0, dev->addr, speed_str, dev->devname);
4572 4638 }
4573 4639 }
4574 4640
4575 4641 /***********************************************************/
4576 4642 /* pid file */
4577 4643
4578 4644 static char *pid_filename;
4579 4645
4580 4646 /* Remove PID file. Called on normal exit */
4581 4647
4582 4648 static void remove_pidfile(void)
4583 4649 {
4584 4650 unlink (pid_filename);
4585 4651 }
4586 4652
4587 4653 static void create_pidfile(const char *filename)
4588 4654 {
4589 4655 struct stat pidstat;
4590 4656 FILE *f;
4591 4657
4592 4658 /* Try to write our PID to the named file */
4593 4659 if (stat(filename, &pidstat) < 0) {
4594 4660 if (errno == ENOENT) {
4595 4661 if ((f = fopen (filename, "w")) == NULL) {
4596 4662 perror("Opening pidfile");
4597 4663 exit(1);
4598 4664 }
4599 4665 fprintf(f, "%ld\n", (long)getpid());
4600 4666 fclose(f);
4601 4667 pid_filename = qemu_strdup(filename);
4602 4668 if (!pid_filename) {
4603 4669 fprintf(stderr, "Could not save PID filename");
4604 4670 exit(1);
4605 4671 }
4606 4672 atexit(remove_pidfile);
4607 4673 }
4608 4674 } else {
4609 4675 fprintf(stderr, "%s already exists. Remove it and try again.\n",
4610 4676 filename);
4611 4677 exit(1);
4612 4678 }
4613 4679 }
4614 4680
4615 4681 /***********************************************************/
4616 4682 /* dumb display */
4617 4683
4618 4684 static void dumb_update(DisplayState *ds, int x, int y, int w, int h)
4619 4685 {
4620 4686 }
4621 4687
4622 4688 static void dumb_resize(DisplayState *ds, int w, int h)
4623 4689 {
4624 4690 }
4625 4691
4626 4692 static void dumb_refresh(DisplayState *ds)
4627 4693 {
4628 4694 vga_hw_update();
4629 4695 }
4630 4696
4631 4697 void dumb_display_init(DisplayState *ds)
4632 4698 {
4633 4699 ds->data = NULL;
4634 4700 ds->linesize = 0;
4635 4701 ds->depth = 0;
4636 4702 ds->dpy_update = dumb_update;
4637 4703 ds->dpy_resize = dumb_resize;
4638 4704 ds->dpy_refresh = dumb_refresh;
4639 4705 }
4640 4706
4641 4707 /***********************************************************/
4642 4708 /* I/O handling */
4643 4709
4644 4710 #define MAX_IO_HANDLERS 64
4645 4711
4646 4712 typedef struct IOHandlerRecord {
4647 4713 int fd;
4648 4714 IOCanRWHandler *fd_read_poll;
4649 4715 IOHandler *fd_read;
4650 4716 IOHandler *fd_write;
4651 4717 int deleted;
4652 4718 void *opaque;
4653 4719 /* temporary data */
4654 4720 struct pollfd *ufd;
4655 4721 struct IOHandlerRecord *next;
4656 4722 } IOHandlerRecord;
4657 4723
4658 4724 static IOHandlerRecord *first_io_handler;
4659 4725
4660 4726 /* XXX: fd_read_poll should be suppressed, but an API change is
4661 4727 necessary in the character devices to suppress fd_can_read(). */
4662 4728 int qemu_set_fd_handler2(int fd,
4663 4729 IOCanRWHandler *fd_read_poll,
4664 4730 IOHandler *fd_read,
4665 4731 IOHandler *fd_write,
4666 4732 void *opaque)
4667 4733 {
4668 4734 IOHandlerRecord **pioh, *ioh;
4669 4735
4670 4736 if (!fd_read && !fd_write) {
4671 4737 pioh = &first_io_handler;
4672 4738 for(;;) {
4673 4739 ioh = *pioh;
4674 4740 if (ioh == NULL)
4675 4741 break;
4676 4742 if (ioh->fd == fd) {
4677 4743 ioh->deleted = 1;
4678 4744 break;
4679 4745 }
4680 4746 pioh = &ioh->next;
4681 4747 }
4682 4748 } else {
4683 4749 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
4684 4750 if (ioh->fd == fd)
4685 4751 goto found;
4686 4752 }
4687 4753 ioh = qemu_mallocz(sizeof(IOHandlerRecord));
4688 4754 if (!ioh)
4689 4755 return -1;
4690 4756 ioh->next = first_io_handler;
4691 4757 first_io_handler = ioh;
4692 4758 found:
4693 4759 ioh->fd = fd;
4694 4760 ioh->fd_read_poll = fd_read_poll;
4695 4761 ioh->fd_read = fd_read;
4696 4762 ioh->fd_write = fd_write;
4697 4763 ioh->opaque = opaque;
4698 4764 ioh->deleted = 0;
4699 4765 }
4700 4766 return 0;
4701 4767 }
4702 4768
4703 4769 int qemu_set_fd_handler(int fd,
4704 4770 IOHandler *fd_read,
4705 4771 IOHandler *fd_write,
4706 4772 void *opaque)
4707 4773 {
4708 4774 return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque);
4709 4775 }
4710 4776
4711 4777 /***********************************************************/
4712 4778 /* Polling handling */
4713 4779
4714 4780 typedef struct PollingEntry {
4715 4781 PollingFunc *func;
4716 4782 void *opaque;
4717 4783 struct PollingEntry *next;
4718 4784 } PollingEntry;
4719 4785
4720 4786 static PollingEntry *first_polling_entry;
4721 4787
4722 4788 int qemu_add_polling_cb(PollingFunc *func, void *opaque)
4723 4789 {
4724 4790 PollingEntry **ppe, *pe;
4725 4791 pe = qemu_mallocz(sizeof(PollingEntry));
4726 4792 if (!pe)
4727 4793 return -1;
4728 4794 pe->func = func;
4729 4795 pe->opaque = opaque;
4730 4796 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
4731 4797 *ppe = pe;
4732 4798 return 0;
4733 4799 }
4734 4800
4735 4801 void qemu_del_polling_cb(PollingFunc *func, void *opaque)
4736 4802 {
4737 4803 PollingEntry **ppe, *pe;
4738 4804 for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
4739 4805 pe = *ppe;
4740 4806 if (pe->func == func && pe->opaque == opaque) {
4741 4807 *ppe = pe->next;
4742 4808 qemu_free(pe);
4743 4809 break;
4744 4810 }
4745 4811 }
4746 4812 }
4747 4813
4748 4814 #ifdef _WIN32
4749 4815 /***********************************************************/
4750 4816 /* Wait objects support */
4751 4817 typedef struct WaitObjects {
4752 4818 int num;
4753 4819 HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
4754 4820 WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
4755 4821 void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
4756 4822 } WaitObjects;
4757 4823
4758 4824 static WaitObjects wait_objects = {0};
4759 4825
4760 4826 int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
4761 4827 {
4762 4828 WaitObjects *w = &wait_objects;
4763 4829
4764 4830 if (w->num >= MAXIMUM_WAIT_OBJECTS)
4765 4831 return -1;
4766 4832 w->events[w->num] = handle;
4767 4833 w->func[w->num] = func;
4768 4834 w->opaque[w->num] = opaque;
4769 4835 w->num++;
4770 4836 return 0;
4771 4837 }
4772 4838
4773 4839 void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
4774 4840 {
4775 4841 int i, found;
4776 4842 WaitObjects *w = &wait_objects;
4777 4843
4778 4844 found = 0;
4779 4845 for (i = 0; i < w->num; i++) {
4780 4846 if (w->events[i] == handle)
4781 4847 found = 1;
4782 4848 if (found) {
4783 4849 w->events[i] = w->events[i + 1];
4784 4850 w->func[i] = w->func[i + 1];
4785 4851 w->opaque[i] = w->opaque[i + 1];
4786 4852 }
4787 4853 }
4788 4854 if (found)
4789 4855 w->num--;
4790 4856 }
4791 4857 #endif
4792 4858
4793 4859 /***********************************************************/
4794 4860 /* savevm/loadvm support */
4795 4861
4796 4862 #define IO_BUF_SIZE 32768
4797 4863
4798 4864 struct QEMUFile {
4799 4865 FILE *outfile;
4800 4866 BlockDriverState *bs;
4801 4867 int is_file;
4802 4868 int is_writable;
4803 4869 int64_t base_offset;
4804 4870 int64_t buf_offset; /* start of buffer when writing, end of buffer
4805 4871 when reading */
4806 4872 int buf_index;
4807 4873 int buf_size; /* 0 when writing */
4808 4874 uint8_t buf[IO_BUF_SIZE];
4809 4875 };
4810 4876
4811 4877 QEMUFile *qemu_fopen(const char *filename, const char *mode)
4812 4878 {
4813 4879 QEMUFile *f;
4814 4880
4815 4881 f = qemu_mallocz(sizeof(QEMUFile));
4816 4882 if (!f)
4817 4883 return NULL;
4818 4884 if (!strcmp(mode, "wb")) {
4819 4885 f->is_writable = 1;
4820 4886 } else if (!strcmp(mode, "rb")) {
4821 4887 f->is_writable = 0;
4822 4888 } else {
4823 4889 goto fail;
4824 4890 }
4825 4891 f->outfile = fopen(filename, mode);
4826 4892 if (!f->outfile)
4827 4893 goto fail;
4828 4894 f->is_file = 1;
4829 4895 return f;
4830 4896 fail:
4831 4897 if (f->outfile)
4832 4898 fclose(f->outfile);
4833 4899 qemu_free(f);
4834 4900 return NULL;
4835 4901 }
4836 4902
4837 4903 QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int64_t offset, int is_writable)
4838 4904 {
4839 4905 QEMUFile *f;
4840 4906
4841 4907 f = qemu_mallocz(sizeof(QEMUFile));
4842 4908 if (!f)
4843 4909 return NULL;
4844 4910 f->is_file = 0;
4845 4911 f->bs = bs;
4846 4912 f->is_writable = is_writable;
4847 4913 f->base_offset = offset;
4848 4914 return f;
4849 4915 }
4850 4916
4851 4917 void qemu_fflush(QEMUFile *f)
4852 4918 {
4853 4919 if (!f->is_writable)
4854 4920 return;
4855 4921 if (f->buf_index > 0) {
4856 4922 if (f->is_file) {
4857 4923 fseek(f->outfile, f->buf_offset, SEEK_SET);
4858 4924 fwrite(f->buf, 1, f->buf_index, f->outfile);
4859 4925 } else {
4860 4926 bdrv_pwrite(f->bs, f->base_offset + f->buf_offset,
4861 4927 f->buf, f->buf_index);
4862 4928 }
4863 4929 f->buf_offset += f->buf_index;
4864 4930 f->buf_index = 0;
4865 4931 }
4866 4932 }
4867 4933
4868 4934 static void qemu_fill_buffer(QEMUFile *f)
4869 4935 {
4870 4936 int len;
4871 4937
4872 4938 if (f->is_writable)
4873 4939 return;
4874 4940 if (f->is_file) {
4875 4941 fseek(f->outfile, f->buf_offset, SEEK_SET);
4876 4942 len = fread(f->buf, 1, IO_BUF_SIZE, f->outfile);
4877 4943 if (len < 0)
4878 4944 len = 0;
4879 4945 } else {
4880 4946 len = bdrv_pread(f->bs, f->base_offset + f->buf_offset,
4881 4947 f->buf, IO_BUF_SIZE);
4882 4948 if (len < 0)
4883 4949 len = 0;
4884 4950 }
4885 4951 f->buf_index = 0;
4886 4952 f->buf_size = len;
4887 4953 f->buf_offset += len;
4888 4954 }
4889 4955
4890 4956 void qemu_fclose(QEMUFile *f)
4891 4957 {
4892 4958 if (f->is_writable)
4893 4959 qemu_fflush(f);
4894 4960 if (f->is_file) {
4895 4961 fclose(f->outfile);
4896 4962 }
4897 4963 qemu_free(f);
4898 4964 }
4899 4965
4900 4966 void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
4901 4967 {
4902 4968 int l;
4903 4969 while (size > 0) {
4904 4970 l = IO_BUF_SIZE - f->buf_index;
4905 4971 if (l > size)
4906 4972 l = size;
4907 4973 memcpy(f->buf + f->buf_index, buf, l);
4908 4974 f->buf_index += l;
4909 4975 buf += l;
4910 4976 size -= l;
4911 4977 if (f->buf_index >= IO_BUF_SIZE)
4912 4978 qemu_fflush(f);
4913 4979 }
4914 4980 }
4915 4981
4916 4982 void qemu_put_byte(QEMUFile *f, int v)
4917 4983 {
4918 4984 f->buf[f->buf_index++] = v;
4919 4985 if (f->buf_index >= IO_BUF_SIZE)
4920 4986 qemu_fflush(f);
4921 4987 }
4922 4988
4923 4989 int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size1)
4924 4990 {
4925 4991 int size, l;
4926 4992
4927 4993 size = size1;
4928 4994 while (size > 0) {
4929 4995 l = f->buf_size - f->buf_index;
4930 4996 if (l == 0) {
4931 4997 qemu_fill_buffer(f);
4932 4998 l = f->buf_size - f->buf_index;
4933 4999 if (l == 0)
4934 5000 break;
4935 5001 }
4936 5002 if (l > size)
4937 5003 l = size;
4938 5004 memcpy(buf, f->buf + f->buf_index, l);
4939 5005 f->buf_index += l;
4940 5006 buf += l;
4941 5007 size -= l;
4942 5008 }
4943 5009 return size1 - size;
4944 5010 }
4945 5011
4946 5012 int qemu_get_byte(QEMUFile *f)
4947 5013 {
4948 5014 if (f->buf_index >= f->buf_size) {
4949 5015 qemu_fill_buffer(f);
4950 5016 if (f->buf_index >= f->buf_size)
4951 5017 return 0;
4952 5018 }
4953 5019 return f->buf[f->buf_index++];
4954 5020 }
4955 5021
4956 5022 int64_t qemu_ftell(QEMUFile *f)
4957 5023 {
4958 5024 return f->buf_offset - f->buf_size + f->buf_index;
4959 5025 }
4960 5026
4961 5027 int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence)
4962 5028 {
4963 5029 if (whence == SEEK_SET) {
4964 5030 /* nothing to do */
4965 5031 } else if (whence == SEEK_CUR) {
4966 5032 pos += qemu_ftell(f);
4967 5033 } else {
4968 5034 /* SEEK_END not supported */
4969 5035 return -1;
4970 5036 }
4971 5037 if (f->is_writable) {
4972 5038 qemu_fflush(f);
4973 5039 f->buf_offset = pos;
4974 5040 } else {
4975 5041 f->buf_offset = pos;
4976 5042 f->buf_index = 0;
4977 5043 f->buf_size = 0;
4978 5044 }
4979 5045 return pos;
4980 5046 }
4981 5047
4982 5048 void qemu_put_be16(QEMUFile *f, unsigned int v)
4983 5049 {
4984 5050 qemu_put_byte(f, v >> 8);
4985 5051 qemu_put_byte(f, v);
4986 5052 }
4987 5053
4988 5054 void qemu_put_be32(QEMUFile *f, unsigned int v)
4989 5055 {
4990 5056 qemu_put_byte(f, v >> 24);
4991 5057 qemu_put_byte(f, v >> 16);
4992 5058 qemu_put_byte(f, v >> 8);
4993 5059 qemu_put_byte(f, v);
4994 5060 }
4995 5061
4996 5062 void qemu_put_be64(QEMUFile *f, uint64_t v)
4997 5063 {
4998 5064 qemu_put_be32(f, v >> 32);
4999 5065 qemu_put_be32(f, v);
5000 5066 }
5001 5067
5002 5068 unsigned int qemu_get_be16(QEMUFile *f)
5003 5069 {
5004 5070 unsigned int v;
5005 5071 v = qemu_get_byte(f) << 8;
5006 5072 v |= qemu_get_byte(f);
5007 5073 return v;
5008 5074 }
5009 5075
5010 5076 unsigned int qemu_get_be32(QEMUFile *f)
5011 5077 {
5012 5078 unsigned int v;
5013 5079 v = qemu_get_byte(f) << 24;
5014 5080 v |= qemu_get_byte(f) << 16;
5015 5081 v |= qemu_get_byte(f) << 8;
5016 5082 v |= qemu_get_byte(f);
5017 5083 return v;
5018 5084 }
5019 5085
5020 5086 uint64_t qemu_get_be64(QEMUFile *f)
5021 5087 {
5022 5088 uint64_t v;
5023 5089 v = (uint64_t)qemu_get_be32(f) << 32;
5024 5090 v |= qemu_get_be32(f);
5025 5091 return v;
5026 5092 }
5027 5093
5028 5094 typedef struct SaveStateEntry {
5029 5095 char idstr[256];
5030 5096 int instance_id;
5031 5097 int version_id;
5032 5098 SaveStateHandler *save_state;
5033 5099 LoadStateHandler *load_state;
5034 5100 void *opaque;
5035 5101 struct SaveStateEntry *next;
5036 5102 } SaveStateEntry;
5037 5103
5038 5104 static SaveStateEntry *first_se;
5039 5105
5040 5106 int register_savevm(const char *idstr,
5041 5107 int instance_id,
5042 5108 int version_id,
5043 5109 SaveStateHandler *save_state,
5044 5110 LoadStateHandler *load_state,
5045 5111 void *opaque)
5046 5112 {
5047 5113 SaveStateEntry *se, **pse;
5048 5114
5049 5115 se = qemu_malloc(sizeof(SaveStateEntry));
5050 5116 if (!se)
5051 5117 return -1;
5052 5118 pstrcpy(se->idstr, sizeof(se->idstr), idstr);
5053 5119 se->instance_id = instance_id;
5054 5120 se->version_id = version_id;
5055 5121 se->save_state = save_state;
5056 5122 se->load_state = load_state;
5057 5123 se->opaque = opaque;
5058 5124 se->next = NULL;
5059 5125
5060 5126 /* add at the end of list */
5061 5127 pse = &first_se;
5062 5128 while (*pse != NULL)
5063 5129 pse = &(*pse)->next;
5064 5130 *pse = se;
5065 5131 return 0;
5066 5132 }
5067 5133
5068 5134 #define QEMU_VM_FILE_MAGIC 0x5145564d
5069 5135 #define QEMU_VM_FILE_VERSION 0x00000002
5070 5136
5071 5137 int qemu_savevm_state(QEMUFile *f)
5072 5138 {
5073 5139 SaveStateEntry *se;
5074 5140 int len, ret;
5075 5141 int64_t cur_pos, len_pos, total_len_pos;
5076 5142
5077 5143 qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
5078 5144 qemu_put_be32(f, QEMU_VM_FILE_VERSION);
5079 5145 total_len_pos = qemu_ftell(f);
5080 5146 qemu_put_be64(f, 0); /* total size */
5081 5147
5082 5148 for(se = first_se; se != NULL; se = se->next) {
5083 5149 /* ID string */
5084 5150 len = strlen(se->idstr);
5085 5151 qemu_put_byte(f, len);
5086 5152 qemu_put_buffer(f, se->idstr, len);
5087 5153
5088 5154 qemu_put_be32(f, se->instance_id);
5089 5155 qemu_put_be32(f, se->version_id);
5090 5156
5091 5157 /* record size: filled later */
5092 5158 len_pos = qemu_ftell(f);
5093 5159 qemu_put_be32(f, 0);
5094 5160
5095 5161 se->save_state(f, se->opaque);
5096 5162
5097 5163 /* fill record size */
5098 5164 cur_pos = qemu_ftell(f);
5099 5165 len = cur_pos - len_pos - 4;
5100 5166 qemu_fseek(f, len_pos, SEEK_SET);
5101 5167 qemu_put_be32(f, len);
5102 5168 qemu_fseek(f, cur_pos, SEEK_SET);
5103 5169 }
5104 5170 cur_pos = qemu_ftell(f);
5105 5171 qemu_fseek(f, total_len_pos, SEEK_SET);
5106 5172 qemu_put_be64(f, cur_pos - total_len_pos - 8);
5107 5173 qemu_fseek(f, cur_pos, SEEK_SET);
5108 5174
5109 5175 ret = 0;
5110 5176 return ret;
5111 5177 }
5112 5178
5113 5179 static SaveStateEntry *find_se(const char *idstr, int instance_id)
5114 5180 {
5115 5181 SaveStateEntry *se;
5116 5182
5117 5183 for(se = first_se; se != NULL; se = se->next) {
5118 5184 if (!strcmp(se->idstr, idstr) &&
5119 5185 instance_id == se->instance_id)
5120 5186 return se;
5121 5187 }
5122 5188 return NULL;
5123 5189 }
5124 5190
5125 5191 int qemu_loadvm_state(QEMUFile *f)
5126 5192 {
5127 5193 SaveStateEntry *se;
5128 5194 int len, ret, instance_id, record_len, version_id;
5129 5195 int64_t total_len, end_pos, cur_pos;
5130 5196 unsigned int v;
5131 5197 char idstr[256];
5132 5198
5133 5199 v = qemu_get_be32(f);
5134 5200 if (v != QEMU_VM_FILE_MAGIC)
5135 5201 goto fail;
5136 5202 v = qemu_get_be32(f);
5137 5203 if (v != QEMU_VM_FILE_VERSION) {
5138 5204 fail:
5139 5205 ret = -1;
5140 5206 goto the_end;
5141 5207 }
5142 5208 total_len = qemu_get_be64(f);
5143 5209 end_pos = total_len + qemu_ftell(f);
5144 5210 for(;;) {
5145 5211 if (qemu_ftell(f) >= end_pos)
5146 5212 break;
5147 5213 len = qemu_get_byte(f);
5148 5214 qemu_get_buffer(f, idstr, len);
5149 5215 idstr[len] = '\0';
5150 5216 instance_id = qemu_get_be32(f);
5151 5217 version_id = qemu_get_be32(f);
5152 5218 record_len = qemu_get_be32(f);
5153 5219 #if 0
5154 5220 printf("idstr=%s instance=0x%x version=%d len=%d\n",
5155 5221 idstr, instance_id, version_id, record_len);
5156 5222 #endif
5157 5223 cur_pos = qemu_ftell(f);
5158 5224 se = find_se(idstr, instance_id);
5159 5225 if (!se) {
5160 5226 fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n",
5161 5227 instance_id, idstr);
5162 5228 } else {
5163 5229 ret = se->load_state(f, se->opaque, version_id);
5164 5230 if (ret < 0) {
5165 5231 fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
5166 5232 instance_id, idstr);
5167 5233 }
5168 5234 }
5169 5235 /* always seek to exact end of record */
5170 5236 qemu_fseek(f, cur_pos + record_len, SEEK_SET);
5171 5237 }
5172 5238 ret = 0;
5173 5239 the_end:
5174 5240 return ret;
5175 5241 }
5176 5242
5177 5243 /* device can contain snapshots */
5178 5244 static int bdrv_can_snapshot(BlockDriverState *bs)
5179 5245 {
5180 5246 return (bs &&
5181 5247 !bdrv_is_removable(bs) &&
5182 5248 !bdrv_is_read_only(bs));
5183 5249 }
5184 5250
5185 5251 /* device must be snapshots in order to have a reliable snapshot */
5186 5252 static int bdrv_has_snapshot(BlockDriverState *bs)
5187 5253 {
5188 5254 return (bs &&
5189 5255 !bdrv_is_removable(bs) &&
5190 5256 !bdrv_is_read_only(bs));
5191 5257 }
5192 5258
5193 5259 static BlockDriverState *get_bs_snapshots(void)
5194 5260 {
5195 5261 BlockDriverState *bs;
5196 5262 int i;
5197 5263
5198 5264 if (bs_snapshots)
5199 5265 return bs_snapshots;
5200 5266 for(i = 0; i <= MAX_DISKS; i++) {
5201 5267 bs = bs_table[i];
5202 5268 if (bdrv_can_snapshot(bs))
5203 5269 goto ok;
5204 5270 }
5205 5271 return NULL;
5206 5272 ok:
5207 5273 bs_snapshots = bs;
5208 5274 return bs;
5209 5275 }
5210 5276
5211 5277 static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
5212 5278 const char *name)
5213 5279 {
5214 5280 QEMUSnapshotInfo *sn_tab, *sn;
5215 5281 int nb_sns, i, ret;
5216 5282
5217 5283 ret = -ENOENT;
5218 5284 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
5219 5285 if (nb_sns < 0)
5220 5286 return ret;
5221 5287 for(i = 0; i < nb_sns; i++) {
5222 5288 sn = &sn_tab[i];
5223 5289 if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
5224 5290 *sn_info = *sn;
5225 5291 ret = 0;
5226 5292 break;
5227 5293 }
5228 5294 }
5229 5295 qemu_free(sn_tab);
5230 5296 return ret;
5231 5297 }
5232 5298
5233 5299 #ifdef CONFIG_DM
5234 5300 /* We use simpler state save/load functions for Xen */
5235 5301 void do_savevm(const char *name)
5236 5302 {
5237 5303 QEMUFile *f;
5238 5304 int saved_vm_running, ret;
5239 5305
5240 5306 f = qemu_fopen(name, "wb");
5241 5307
5242 5308 /* ??? Should this occur after vm_stop? */
5243 5309 qemu_aio_flush();
5244 5310
5245 5311 saved_vm_running = vm_running;
5246 5312 vm_stop(0);
5247 5313
5248 5314 if (!f) {
5249 5315 fprintf(logfile, "Failed to open savevm file '%s'\n", name);
5250 5316 goto the_end;
5251 5317 }
5252 5318
5253 5319 ret = qemu_savevm_state(f);
5254 5320 qemu_fclose(f);
5255 5321
5256 5322 if (ret < 0)
5257 5323 fprintf(logfile, "Error %d while writing VM to savevm file '%s'\n",
5258 5324 ret, name);
5259 5325
5260 5326 the_end:
5261 5327 if (saved_vm_running)
5262 5328 vm_start();
5263 5329
5264 5330 return;
5265 5331 }
5266 5332 void do_loadvm(const char *name)
5267 5333 {
5268 5334 QEMUFile *f;
5269 5335 int saved_vm_running, ret;
5270 5336
5271 5337 /* Flush all IO requests so they don't interfere with the new state. */
5272 5338 qemu_aio_flush();
5273 5339
5274 5340 saved_vm_running = vm_running;
5275 5341 vm_stop(0);
5276 5342
5277 5343 /* restore the VM state */
5278 5344 f = qemu_fopen(name, "rb");
5279 5345 if (!f) {
5280 5346 fprintf(logfile, "Could not open VM state file\n");
5281 5347 goto the_end;
5282 5348 }
5283 5349
5284 5350 ret = qemu_loadvm_state(f);
5285 5351 qemu_fclose(f);
5286 5352 if (ret < 0) {
5287 5353 fprintf(logfile, "Error %d while loading savevm file '%s'\n",
5288 5354 ret, name);
5289 5355 goto the_end;
5290 5356 }
5291 5357
5292 5358 #if 0
5293 5359 /* del tmp file */
5294 5360 if (unlink(name) == -1)
5295 5361 fprintf(stderr, "delete tmp qemu state file failed.\n");
5296 5362 #endif
5297 5363
5298 5364
5299 5365 the_end:
5300 5366 if (saved_vm_running)
5301 5367 vm_start();
5302 5368 }
5303 5369 #else
5304 5370 void do_savevm(const char *name)
5305 5371 {
5306 5372 BlockDriverState *bs, *bs1;
5307 5373 QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
5308 5374 int must_delete, ret, i;
5309 5375 BlockDriverInfo bdi1, *bdi = &bdi1;
5310 5376 QEMUFile *f;
5311 5377 int saved_vm_running;
5312 5378 #ifdef _WIN32
5313 5379 struct _timeb tb;
5314 5380 #else
5315 5381 struct timeval tv;
5316 5382 #endif
5317 5383
5318 5384 bs = get_bs_snapshots();
5319 5385 if (!bs) {
5320 5386 term_printf("No block device can accept snapshots\n");
5321 5387 return;
5322 5388 }
5323 5389
5324 5390 /* ??? Should this occur after vm_stop? */
5325 5391 qemu_aio_flush();
5326 5392
5327 5393 saved_vm_running = vm_running;
5328 5394 vm_stop(0);
5329 5395
5330 5396 must_delete = 0;
5331 5397 if (name) {
5332 5398 ret = bdrv_snapshot_find(bs, old_sn, name);
5333 5399 if (ret >= 0) {
5334 5400 must_delete = 1;
5335 5401 }
5336 5402 }
5337 5403 memset(sn, 0, sizeof(*sn));
5338 5404 if (must_delete) {
5339 5405 pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
5340 5406 pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
5341 5407 } else {
5342 5408 if (name)
5343 5409 pstrcpy(sn->name, sizeof(sn->name), name);
5344 5410 }
5345 5411
5346 5412 /* fill auxiliary fields */
5347 5413 #ifdef _WIN32
5348 5414 _ftime(&tb);
5349 5415 sn->date_sec = tb.time;
5350 5416 sn->date_nsec = tb.millitm * 1000000;
5351 5417 #else
5352 5418 gettimeofday(&tv, NULL);
5353 5419 sn->date_sec = tv.tv_sec;
5354 5420 sn->date_nsec = tv.tv_usec * 1000;
5355 5421 #endif
5356 5422 sn->vm_clock_nsec = qemu_get_clock(vm_clock);
5357 5423
5358 5424 if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
5359 5425 term_printf("Device %s does not support VM state snapshots\n",
5360 5426 bdrv_get_device_name(bs));
5361 5427 goto the_end;
5362 5428 }
5363 5429
5364 5430 /* save the VM state */
5365 5431 f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 1);
5366 5432 if (!f) {
5367 5433 term_printf("Could not open VM state file\n");
5368 5434 goto the_end;
5369 5435 }
5370 5436 ret = qemu_savevm_state(f);
5371 5437 sn->vm_state_size = qemu_ftell(f);
5372 5438 qemu_fclose(f);
5373 5439 if (ret < 0) {
5374 5440 term_printf("Error %d while writing VM\n", ret);
5375 5441 goto the_end;
5376 5442 }
5377 5443
5378 5444 /* create the snapshots */
5379 5445
5380 5446 for(i = 0; i < MAX_DISKS; i++) {
5381 5447 bs1 = bs_table[i];
5382 5448 if (bdrv_has_snapshot(bs1)) {
5383 5449 if (must_delete) {
5384 5450 ret = bdrv_snapshot_delete(bs1, old_sn->id_str);
5385 5451 if (ret < 0) {
5386 5452 term_printf("Error while deleting snapshot on '%s'\n",
5387 5453 bdrv_get_device_name(bs1));
5388 5454 }
5389 5455 }
5390 5456 ret = bdrv_snapshot_create(bs1, sn);
5391 5457 if (ret < 0) {
5392 5458 term_printf("Error while creating snapshot on '%s'\n",
5393 5459 bdrv_get_device_name(bs1));
5394 5460 }
5395 5461 }
5396 5462 }
5397 5463
5398 5464 the_end:
5399 5465 if (saved_vm_running)
5400 5466 vm_start();
5401 5467 }
5402 5468
5403 5469 void do_loadvm(const char *name)
5404 5470 {
5405 5471 BlockDriverState *bs, *bs1;
5406 5472 BlockDriverInfo bdi1, *bdi = &bdi1;
5407 5473 QEMUFile *f;
5408 5474 int i, ret;
5409 5475 int saved_vm_running;
5410 5476
5411 5477 bs = get_bs_snapshots();
5412 5478 if (!bs) {
5413 5479 term_printf("No block device supports snapshots\n");
5414 5480 return;
5415 5481 }
5416 5482
5417 5483 /* Flush all IO requests so they don't interfere with the new state. */
5418 5484 qemu_aio_flush();
5419 5485
5420 5486 saved_vm_running = vm_running;
5421 5487 vm_stop(0);
5422 5488
5423 5489 for(i = 0; i <= MAX_DISKS; i++) {
5424 5490 bs1 = bs_table[i];
5425 5491 if (bdrv_has_snapshot(bs1)) {
5426 5492 ret = bdrv_snapshot_goto(bs1, name);
5427 5493 if (ret < 0) {
5428 5494 if (bs != bs1)
5429 5495 term_printf("Warning: ");
5430 5496 switch(ret) {
5431 5497 case -ENOTSUP:
5432 5498 term_printf("Snapshots not supported on device '%s'\n",
5433 5499 bdrv_get_device_name(bs1));
5434 5500 break;
5435 5501 case -ENOENT:
5436 5502 term_printf("Could not find snapshot '%s' on device '%s'\n",
5437 5503 name, bdrv_get_device_name(bs1));
5438 5504 break;
5439 5505 default:
5440 5506 term_printf("Error %d while activating snapshot on '%s'\n",
5441 5507 ret, bdrv_get_device_name(bs1));
5442 5508 break;
5443 5509 }
5444 5510 /* fatal on snapshot block device */
5445 5511 if (bs == bs1)
5446 5512 goto the_end;
5447 5513 }
5448 5514 }
5449 5515 }
5450 5516
5451 5517 if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) {
5452 5518 term_printf("Device %s does not support VM state snapshots\n",
5453 5519 bdrv_get_device_name(bs));
5454 5520 return;
5455 5521 }
5456 5522
5457 5523 /* restore the VM state */
5458 5524 f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 0);
5459 5525 if (!f) {
5460 5526 term_printf("Could not open VM state file\n");
5461 5527 goto the_end;
5462 5528 }
5463 5529 ret = qemu_loadvm_state(f);
5464 5530 qemu_fclose(f);
5465 5531 if (ret < 0) {
5466 5532 term_printf("Error %d while loading VM state\n", ret);
5467 5533 }
5468 5534
5469 5535 /* del tmp file */
5470 5536 if (unlink(name) == -1)
5471 5537 fprintf(stderr, "delete tmp qemu state file failed.\n");
5472 5538
5473 5539 the_end:
5474 5540 if (saved_vm_running)
5475 5541 vm_start();
5476 5542 }
5477 5543 #endif
5478 5544
5479 5545 void do_delvm(const char *name)
5480 5546 {
5481 5547 BlockDriverState *bs, *bs1;
5482 5548 int i, ret;
5483 5549
5484 5550 bs = get_bs_snapshots();
5485 5551 if (!bs) {
5486 5552 term_printf("No block device supports snapshots\n");
5487 5553 return;
5488 5554 }
5489 5555
5490 5556 for(i = 0; i <= MAX_DISKS; i++) {
5491 5557 bs1 = bs_table[i];
5492 5558 if (bdrv_has_snapshot(bs1)) {
5493 5559 ret = bdrv_snapshot_delete(bs1, name);
5494 5560 if (ret < 0) {
5495 5561 if (ret == -ENOTSUP)
5496 5562 term_printf("Snapshots not supported on device '%s'\n",
5497 5563 bdrv_get_device_name(bs1));
5498 5564 else
5499 5565 term_printf("Error %d while deleting snapshot on '%s'\n",
5500 5566 ret, bdrv_get_device_name(bs1));
5501 5567 }
5502 5568 }
5503 5569 }
5504 5570 }
5505 5571
5506 5572 void do_info_snapshots(void)
5507 5573 {
5508 5574 BlockDriverState *bs, *bs1;
5509 5575 QEMUSnapshotInfo *sn_tab, *sn;
5510 5576 int nb_sns, i;
5511 5577 char buf[256];
5512 5578
5513 5579 bs = get_bs_snapshots();
5514 5580 if (!bs) {
5515 5581 term_printf("No available block device supports snapshots\n");
5516 5582 return;
5517 5583 }
5518 5584 term_printf("Snapshot devices:");
5519 5585 for(i = 0; i <= MAX_DISKS; i++) {
5520 5586 bs1 = bs_table[i];
5521 5587 if (bdrv_has_snapshot(bs1)) {
5522 5588 if (bs == bs1)
5523 5589 term_printf(" %s", bdrv_get_device_name(bs1));
5524 5590 }
5525 5591 }
5526 5592 term_printf("\n");
5527 5593
5528 5594 nb_sns = bdrv_snapshot_list(bs, &sn_tab);
5529 5595 if (nb_sns < 0) {
5530 5596 term_printf("bdrv_snapshot_list: error %d\n", nb_sns);
5531 5597 return;
5532 5598 }
5533 5599 term_printf("Snapshot list (from %s):\n", bdrv_get_device_name(bs));
5534 5600 term_printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
5535 5601 for(i = 0; i < nb_sns; i++) {
5536 5602 sn = &sn_tab[i];
5537 5603 term_printf("%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
5538 5604 }
5539 5605 qemu_free(sn_tab);
5540 5606 }
5541 5607
5542 5608 #ifndef CONFIG_DM
5543 5609 /***********************************************************/
5544 5610 /* cpu save/restore */
5545 5611
5546 5612 #if defined(TARGET_I386)
5547 5613
5548 5614 static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
5549 5615 {
5550 5616 qemu_put_be32(f, dt->selector);
5551 5617 qemu_put_betl(f, dt->base);
5552 5618 qemu_put_be32(f, dt->limit);
5553 5619 qemu_put_be32(f, dt->flags);
5554 5620 }
5555 5621
5556 5622 static void cpu_get_seg(QEMUFile *f, SegmentCache *dt)
5557 5623 {
5558 5624 dt->selector = qemu_get_be32(f);
5559 5625 dt->base = qemu_get_betl(f);
5560 5626 dt->limit = qemu_get_be32(f);
5561 5627 dt->flags = qemu_get_be32(f);
5562 5628 }
5563 5629
5564 5630 void cpu_save(QEMUFile *f, void *opaque)
5565 5631 {
5566 5632 CPUState *env = opaque;
5567 5633 uint16_t fptag, fpus, fpuc, fpregs_format;
5568 5634 uint32_t hflags;
5569 5635 int i;
5570 5636
5571 5637 for(i = 0; i < CPU_NB_REGS; i++)
5572 5638 qemu_put_betls(f, &env->regs[i]);
5573 5639 qemu_put_betls(f, &env->eip);
5574 5640 qemu_put_betls(f, &env->eflags);
5575 5641 hflags = env->hflags; /* XXX: suppress most of the redundant hflags */
5576 5642 qemu_put_be32s(f, &hflags);
5577 5643
5578 5644 /* FPU */
5579 5645 fpuc = env->fpuc;
5580 5646 fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
5581 5647 fptag = 0;
5582 5648 for(i = 0; i < 8; i++) {
5583 5649 fptag |= ((!env->fptags[i]) << i);
5584 5650 }
5585 5651
5586 5652 qemu_put_be16s(f, &fpuc);
5587 5653 qemu_put_be16s(f, &fpus);
5588 5654 qemu_put_be16s(f, &fptag);
5589 5655
5590 5656 #ifdef USE_X86LDOUBLE
5591 5657 fpregs_format = 0;
5592 5658 #else
5593 5659 fpregs_format = 1;
5594 5660 #endif
5595 5661 qemu_put_be16s(f, &fpregs_format);
5596 5662
5597 5663 for(i = 0; i < 8; i++) {
5598 5664 #ifdef USE_X86LDOUBLE
5599 5665 {
5600 5666 uint64_t mant;
5601 5667 uint16_t exp;
5602 5668 /* we save the real CPU data (in case of MMX usage only 'mant'
5603 5669 contains the MMX register */
5604 5670 cpu_get_fp80(&mant, &exp, env->fpregs[i].d);
5605 5671 qemu_put_be64(f, mant);
5606 5672 qemu_put_be16(f, exp);
5607 5673 }
5608 5674 #else
5609 5675 /* if we use doubles for float emulation, we save the doubles to
5610 5676 avoid losing information in case of MMX usage. It can give
5611 5677 problems if the image is restored on a CPU where long
5612 5678 doubles are used instead. */
5613 5679 qemu_put_be64(f, env->fpregs[i].mmx.MMX_Q(0));
5614 5680 #endif
5615 5681 }
5616 5682
5617 5683 for(i = 0; i < 6; i++)
5618 5684 cpu_put_seg(f, &env->segs[i]);
5619 5685 cpu_put_seg(f, &env->ldt);
5620 5686 cpu_put_seg(f, &env->tr);
5621 5687 cpu_put_seg(f, &env->gdt);
5622 5688 cpu_put_seg(f, &env->idt);
5623 5689
5624 5690 qemu_put_be32s(f, &env->sysenter_cs);
5625 5691 qemu_put_be32s(f, &env->sysenter_esp);
5626 5692 qemu_put_be32s(f, &env->sysenter_eip);
5627 5693
5628 5694 qemu_put_betls(f, &env->cr[0]);
5629 5695 qemu_put_betls(f, &env->cr[2]);
5630 5696 qemu_put_betls(f, &env->cr[3]);
5631 5697 qemu_put_betls(f, &env->cr[4]);
5632 5698
5633 5699 for(i = 0; i < 8; i++)
5634 5700 qemu_put_betls(f, &env->dr[i]);
5635 5701
5636 5702 /* MMU */
5637 5703 qemu_put_be32s(f, &env->a20_mask);
5638 5704
5639 5705 /* XMM */
5640 5706 qemu_put_be32s(f, &env->mxcsr);
5641 5707 for(i = 0; i < CPU_NB_REGS; i++) {
5642 5708 qemu_put_be64s(f, &env->xmm_regs[i].XMM_Q(0));
5643 5709 qemu_put_be64s(f, &env->xmm_regs[i].XMM_Q(1));
5644 5710 }
5645 5711
5646 5712 #ifdef TARGET_X86_64
5647 5713 qemu_put_be64s(f, &env->efer);
5648 5714 qemu_put_be64s(f, &env->star);
5649 5715 qemu_put_be64s(f, &env->lstar);
5650 5716 qemu_put_be64s(f, &env->cstar);
5651 5717 qemu_put_be64s(f, &env->fmask);
5652 5718 qemu_put_be64s(f, &env->kernelgsbase);
5653 5719 #endif
5654 5720 qemu_put_be32s(f, &env->smbase);
5655 5721 }
5656 5722
5657 5723 #ifdef USE_X86LDOUBLE
5658 5724 /* XXX: add that in a FPU generic layer */
5659 5725 union x86_longdouble {
5660 5726 uint64_t mant;
5661 5727 uint16_t exp;
5662 5728 };
5663 5729
5664 5730 #define MANTD1(fp) (fp & ((1LL << 52) - 1))
5665 5731 #define EXPBIAS1 1023
5666 5732 #define EXPD1(fp) ((fp >> 52) & 0x7FF)
5667 5733 #define SIGND1(fp) ((fp >> 32) & 0x80000000)
5668 5734
5669 5735 static void fp64_to_fp80(union x86_longdouble *p, uint64_t temp)
5670 5736 {
5671 5737 int e;
5672 5738 /* mantissa */
5673 5739 p->mant = (MANTD1(temp) << 11) | (1LL << 63);
5674 5740 /* exponent + sign */
5675 5741 e = EXPD1(temp) - EXPBIAS1 + 16383;
5676 5742 e |= SIGND1(temp) >> 16;
5677 5743 p->exp = e;
5678 5744 }
5679 5745 #endif
5680 5746
5681 5747 int cpu_load(QEMUFile *f, void *opaque, int version_id)
5682 5748 {
5683 5749 CPUState *env = opaque;
5684 5750 int i, guess_mmx;
5685 5751 uint32_t hflags;
5686 5752 uint16_t fpus, fpuc, fptag, fpregs_format;
5687 5753
5688 5754 if (version_id != 3 && version_id != 4)
5689 5755 return -EINVAL;
5690 5756 for(i = 0; i < CPU_NB_REGS; i++)
5691 5757 qemu_get_betls(f, &env->regs[i]);
5692 5758 qemu_get_betls(f, &env->eip);
5693 5759 qemu_get_betls(f, &env->eflags);
5694 5760 qemu_get_be32s(f, &hflags);
5695 5761
5696 5762 qemu_get_be16s(f, &fpuc);
5697 5763 qemu_get_be16s(f, &fpus);
5698 5764 qemu_get_be16s(f, &fptag);
5699 5765 qemu_get_be16s(f, &fpregs_format);
5700 5766
5701 5767 /* NOTE: we cannot always restore the FPU state if the image come
5702 5768 from a host with a different 'USE_X86LDOUBLE' define. We guess
5703 5769 if we are in an MMX state to restore correctly in that case. */
5704 5770 guess_mmx = ((fptag == 0xff) && (fpus & 0x3800) == 0);
5705 5771 for(i = 0; i < 8; i++) {
5706 5772 uint64_t mant;
5707 5773 uint16_t exp;
5708 5774
5709 5775 switch(fpregs_format) {
5710 5776 case 0:
5711 5777 mant = qemu_get_be64(f);
5712 5778 exp = qemu_get_be16(f);
5713 5779 #ifdef USE_X86LDOUBLE
5714 5780 env->fpregs[i].d = cpu_set_fp80(mant, exp);
5715 5781 #else
5716 5782 /* difficult case */
5717 5783 if (guess_mmx)
5718 5784 env->fpregs[i].mmx.MMX_Q(0) = mant;
5719 5785 else
5720 5786 env->fpregs[i].d = cpu_set_fp80(mant, exp);
5721 5787 #endif
5722 5788 break;
5723 5789 case 1:
5724 5790 mant = qemu_get_be64(f);
5725 5791 #ifdef USE_X86LDOUBLE
5726 5792 {
5727 5793 union x86_longdouble *p;
5728 5794 /* difficult case */
5729 5795 p = (void *)&env->fpregs[i];
5730 5796 if (guess_mmx) {
5731 5797 p->mant = mant;
5732 5798 p->exp = 0xffff;
5733 5799 } else {
5734 5800 fp64_to_fp80(p, mant);
5735 5801 }
5736 5802 }
5737 5803 #else
5738 5804 env->fpregs[i].mmx.MMX_Q(0) = mant;
5739 5805 #endif
5740 5806 break;
5741 5807 default:
5742 5808 return -EINVAL;
5743 5809 }
5744 5810 }
5745 5811
5746 5812 env->fpuc = fpuc;
5747 5813 /* XXX: restore FPU round state */
5748 5814 env->fpstt = (fpus >> 11) & 7;
5749 5815 env->fpus = fpus & ~0x3800;
5750 5816 fptag ^= 0xff;
5751 5817 for(i = 0; i < 8; i++) {
5752 5818 env->fptags[i] = (fptag >> i) & 1;
5753 5819 }
5754 5820
5755 5821 for(i = 0; i < 6; i++)
5756 5822 cpu_get_seg(f, &env->segs[i]);
5757 5823 cpu_get_seg(f, &env->ldt);
5758 5824 cpu_get_seg(f, &env->tr);
5759 5825 cpu_get_seg(f, &env->gdt);
5760 5826 cpu_get_seg(f, &env->idt);
5761 5827
5762 5828 qemu_get_be32s(f, &env->sysenter_cs);
5763 5829 qemu_get_be32s(f, &env->sysenter_esp);
5764 5830 qemu_get_be32s(f, &env->sysenter_eip);
5765 5831
5766 5832 qemu_get_betls(f, &env->cr[0]);
5767 5833 qemu_get_betls(f, &env->cr[2]);
5768 5834 qemu_get_betls(f, &env->cr[3]);
5769 5835 qemu_get_betls(f, &env->cr[4]);
5770 5836
5771 5837 for(i = 0; i < 8; i++)
5772 5838 qemu_get_betls(f, &env->dr[i]);
5773 5839
5774 5840 /* MMU */
5775 5841 qemu_get_be32s(f, &env->a20_mask);
5776 5842
5777 5843 qemu_get_be32s(f, &env->mxcsr);
5778 5844 for(i = 0; i < CPU_NB_REGS; i++) {
5779 5845 qemu_get_be64s(f, &env->xmm_regs[i].XMM_Q(0));
5780 5846 qemu_get_be64s(f, &env->xmm_regs[i].XMM_Q(1));
5781 5847 }
5782 5848
5783 5849 #ifdef TARGET_X86_64
5784 5850 qemu_get_be64s(f, &env->efer);
5785 5851 qemu_get_be64s(f, &env->star);
5786 5852 qemu_get_be64s(f, &env->lstar);
5787 5853 qemu_get_be64s(f, &env->cstar);
5788 5854 qemu_get_be64s(f, &env->fmask);
5789 5855 qemu_get_be64s(f, &env->kernelgsbase);
5790 5856 #endif
5791 5857 if (version_id >= 4)
5792 5858 qemu_get_be32s(f, &env->smbase);
5793 5859
5794 5860 /* XXX: compute hflags from scratch, except for CPL and IIF */
5795 5861 env->hflags = hflags;
5796 5862 tlb_flush(env, 1);
5797 5863 return 0;
5798 5864 }
5799 5865
5800 5866 #elif defined(TARGET_PPC)
5801 5867 void cpu_save(QEMUFile *f, void *opaque)
5802 5868 {
5803 5869 }
5804 5870
5805 5871 int cpu_load(QEMUFile *f, void *opaque, int version_id)
5806 5872 {
5807 5873 return 0;
5808 5874 }
5809 5875
5810 5876 #elif defined(TARGET_MIPS)
5811 5877 void cpu_save(QEMUFile *f, void *opaque)
5812 5878 {
5813 5879 }
5814 5880
5815 5881 int cpu_load(QEMUFile *f, void *opaque, int version_id)
5816 5882 {
5817 5883 return 0;
5818 5884 }
5819 5885
5820 5886 #elif defined(TARGET_SPARC)
5821 5887 void cpu_save(QEMUFile *f, void *opaque)
5822 5888 {
5823 5889 CPUState *env = opaque;
5824 5890 int i;
5825 5891 uint32_t tmp;
5826 5892
5827 5893 for(i = 0; i < 8; i++)
5828 5894 qemu_put_betls(f, &env->gregs[i]);
5829 5895 for(i = 0; i < NWINDOWS * 16; i++)
5830 5896 qemu_put_betls(f, &env->regbase[i]);
5831 5897
5832 5898 /* FPU */
5833 5899 for(i = 0; i < TARGET_FPREGS; i++) {
5834 5900 union {
5835 5901 float32 f;
5836 5902 uint32_t i;
5837 5903 } u;
5838 5904 u.f = env->fpr[i];
5839 5905 qemu_put_be32(f, u.i);
5840 5906 }
5841 5907
5842 5908 qemu_put_betls(f, &env->pc);
5843 5909 qemu_put_betls(f, &env->npc);
5844 5910 qemu_put_betls(f, &env->y);
5845 5911 tmp = GET_PSR(env);
5846 5912 qemu_put_be32(f, tmp);
5847 5913 qemu_put_betls(f, &env->fsr);
5848 5914 qemu_put_betls(f, &env->tbr);
5849 5915 #ifndef TARGET_SPARC64
5850 5916 qemu_put_be32s(f, &env->wim);
5851 5917 /* MMU */
5852 5918 for(i = 0; i < 16; i++)
5853 5919 qemu_put_be32s(f, &env->mmuregs[i]);
5854 5920 #endif
5855 5921 }
5856 5922
5857 5923 int cpu_load(QEMUFile *f, void *opaque, int version_id)
5858 5924 {
5859 5925 CPUState *env = opaque;
5860 5926 int i;
5861 5927 uint32_t tmp;
5862 5928
5863 5929 for(i = 0; i < 8; i++)
5864 5930 qemu_get_betls(f, &env->gregs[i]);
5865 5931 for(i = 0; i < NWINDOWS * 16; i++)
5866 5932 qemu_get_betls(f, &env->regbase[i]);
5867 5933
5868 5934 /* FPU */
5869 5935 for(i = 0; i < TARGET_FPREGS; i++) {
5870 5936 union {
5871 5937 float32 f;
5872 5938 uint32_t i;
5873 5939 } u;
5874 5940 u.i = qemu_get_be32(f);
5875 5941 env->fpr[i] = u.f;
5876 5942 }
5877 5943
5878 5944 qemu_get_betls(f, &env->pc);
5879 5945 qemu_get_betls(f, &env->npc);
5880 5946 qemu_get_betls(f, &env->y);
5881 5947 tmp = qemu_get_be32(f);
5882 5948 env->cwp = 0; /* needed to ensure that the wrapping registers are
5883 5949 correctly updated */
5884 5950 PUT_PSR(env, tmp);
5885 5951 qemu_get_betls(f, &env->fsr);
5886 5952 qemu_get_betls(f, &env->tbr);
5887 5953 #ifndef TARGET_SPARC64
5888 5954 qemu_get_be32s(f, &env->wim);
5889 5955 /* MMU */
5890 5956 for(i = 0; i < 16; i++)
5891 5957 qemu_get_be32s(f, &env->mmuregs[i]);
5892 5958 #endif
5893 5959 tlb_flush(env, 1);
5894 5960 return 0;
5895 5961 }
5896 5962
5897 5963 #elif defined(TARGET_ARM)
5898 5964
5899 5965 /* ??? Need to implement these. */
5900 5966 void cpu_save(QEMUFile *f, void *opaque)
5901 5967 {
5902 5968 }
5903 5969
5904 5970 int cpu_load(QEMUFile *f, void *opaque, int version_id)
5905 5971 {
5906 5972 return 0;
5907 5973 }
5908 5974
5909 5975 #else
5910 5976
5911 5977 #warning No CPU save/restore functions
5912 5978
5913 5979 #endif
5914 5980
5915 5981 /***********************************************************/
5916 5982 /* ram save/restore */
5917 5983
5918 5984 static int ram_get_page(QEMUFile *f, uint8_t *buf, int len)
5919 5985 {
5920 5986 int v;
5921 5987
5922 5988 v = qemu_get_byte(f);
5923 5989 switch(v) {
5924 5990 case 0:
5925 5991 if (qemu_get_buffer(f, buf, len) != len)
5926 5992 return -EIO;
5927 5993 break;
5928 5994 case 1:
5929 5995 v = qemu_get_byte(f);
5930 5996 memset(buf, v, len);
5931 5997 break;
5932 5998 default:
5933 5999 return -EINVAL;
5934 6000 }
5935 6001 return 0;
5936 6002 }
5937 6003
5938 6004 static int ram_load_v1(QEMUFile *f, void *opaque)
5939 6005 {
5940 6006 int i, ret;
5941 6007
5942 6008 if (qemu_get_be32(f) != phys_ram_size)
5943 6009 return -EINVAL;
5944 6010 for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
5945 6011 ret = ram_get_page(f, phys_ram_base + i, TARGET_PAGE_SIZE);
5946 6012 if (ret)
5947 6013 return ret;
5948 6014 }
5949 6015 return 0;
5950 6016 }
5951 6017
5952 6018 #define BDRV_HASH_BLOCK_SIZE 1024
5953 6019 #define IOBUF_SIZE 4096
5954 6020 #define RAM_CBLOCK_MAGIC 0xfabe
5955 6021
5956 6022 typedef struct RamCompressState {
5957 6023 z_stream zstream;
5958 6024 QEMUFile *f;
5959 6025 uint8_t buf[IOBUF_SIZE];
5960 6026 } RamCompressState;
5961 6027
5962 6028 static int ram_compress_open(RamCompressState *s, QEMUFile *f)
5963 6029 {
5964 6030 int ret;
5965 6031 memset(s, 0, sizeof(*s));
5966 6032 s->f = f;
5967 6033 ret = deflateInit2(&s->zstream, 1,
5968 6034 Z_DEFLATED, 15,
5969 6035 9, Z_DEFAULT_STRATEGY);
5970 6036 if (ret != Z_OK)
5971 6037 return -1;
5972 6038 s->zstream.avail_out = IOBUF_SIZE;
5973 6039 s->zstream.next_out = s->buf;
5974 6040 return 0;
5975 6041 }
5976 6042
5977 6043 static void ram_put_cblock(RamCompressState *s, const uint8_t *buf, int len)
5978 6044 {
5979 6045 qemu_put_be16(s->f, RAM_CBLOCK_MAGIC);
5980 6046 qemu_put_be16(s->f, len);
5981 6047 qemu_put_buffer(s->f, buf, len);
5982 6048 }
5983 6049
5984 6050 static int ram_compress_buf(RamCompressState *s, const uint8_t *buf, int len)
5985 6051 {
5986 6052 int ret;
5987 6053
5988 6054 s->zstream.avail_in = len;
5989 6055 s->zstream.next_in = (uint8_t *)buf;
5990 6056 while (s->zstream.avail_in > 0) {
5991 6057 ret = deflate(&s->zstream, Z_NO_FLUSH);
5992 6058 if (ret != Z_OK)
5993 6059 return -1;
5994 6060 if (s->zstream.avail_out == 0) {
5995 6061 ram_put_cblock(s, s->buf, IOBUF_SIZE);
5996 6062 s->zstream.avail_out = IOBUF_SIZE;
5997 6063 s->zstream.next_out = s->buf;
5998 6064 }
5999 6065 }
6000 6066 return 0;
6001 6067 }
6002 6068
6003 6069 static void ram_compress_close(RamCompressState *s)
6004 6070 {
6005 6071 int len, ret;
6006 6072
6007 6073 /* compress last bytes */
6008 6074 for(;;) {
6009 6075 ret = deflate(&s->zstream, Z_FINISH);
6010 6076 if (ret == Z_OK || ret == Z_STREAM_END) {
6011 6077 len = IOBUF_SIZE - s->zstream.avail_out;
6012 6078 if (len > 0) {
6013 6079 ram_put_cblock(s, s->buf, len);
6014 6080 }
6015 6081 s->zstream.avail_out = IOBUF_SIZE;
6016 6082 s->zstream.next_out = s->buf;
6017 6083 if (ret == Z_STREAM_END)
6018 6084 break;
6019 6085 } else {
6020 6086 goto fail;
6021 6087 }
6022 6088 }
6023 6089 fail:
6024 6090 deflateEnd(&s->zstream);
6025 6091 }
6026 6092
6027 6093 typedef struct RamDecompressState {
6028 6094 z_stream zstream;
6029 6095 QEMUFile *f;
6030 6096 uint8_t buf[IOBUF_SIZE];
6031 6097 } RamDecompressState;
6032 6098
6033 6099 static int ram_decompress_open(RamDecompressState *s, QEMUFile *f)
6034 6100 {
6035 6101 int ret;
6036 6102 memset(s, 0, sizeof(*s));
6037 6103 s->f = f;
6038 6104 ret = inflateInit(&s->zstream);
6039 6105 if (ret != Z_OK)
6040 6106 return -1;
6041 6107 return 0;
6042 6108 }
6043 6109
6044 6110 static int ram_decompress_buf(RamDecompressState *s, uint8_t *buf, int len)
6045 6111 {
6046 6112 int ret, clen;
6047 6113
6048 6114 s->zstream.avail_out = len;
6049 6115 s->zstream.next_out = buf;
6050 6116 while (s->zstream.avail_out > 0) {
6051 6117 if (s->zstream.avail_in == 0) {
6052 6118 if (qemu_get_be16(s->f) != RAM_CBLOCK_MAGIC)
6053 6119 return -1;
6054 6120 clen = qemu_get_be16(s->f);
6055 6121 if (clen > IOBUF_SIZE)
6056 6122 return -1;
6057 6123 qemu_get_buffer(s->f, s->buf, clen);
6058 6124 s->zstream.avail_in = clen;
6059 6125 s->zstream.next_in = s->buf;
6060 6126 }
6061 6127 ret = inflate(&s->zstream, Z_PARTIAL_FLUSH);
6062 6128 if (ret != Z_OK && ret != Z_STREAM_END) {
6063 6129 return -1;
6064 6130 }
6065 6131 }
6066 6132 return 0;
6067 6133 }
6068 6134
6069 6135 static void ram_decompress_close(RamDecompressState *s)
6070 6136 {
6071 6137 inflateEnd(&s->zstream);
6072 6138 }
6073 6139
6074 6140 static void ram_save(QEMUFile *f, void *opaque)
6075 6141 {
6076 6142 int i;
6077 6143 RamCompressState s1, *s = &s1;
6078 6144 uint8_t buf[10];
6079 6145
6080 6146 qemu_put_be32(f, phys_ram_size);
6081 6147 if (ram_compress_open(s, f) < 0)
6082 6148 return;
6083 6149 for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
6084 6150 #if 0
6085 6151 if (tight_savevm_enabled) {
6086 6152 int64_t sector_num;
6087 6153 int j;
6088 6154
6089 6155 /* find if the memory block is available on a virtual
6090 6156 block device */
6091 6157 sector_num = -1;
6092 6158 for(j = 0; j < MAX_DISKS; j++) {
6093 6159 if (bs_table[j]) {
6094 6160 sector_num = bdrv_hash_find(bs_table[j],
6095 6161 phys_ram_base + i, BDRV_HASH_BLOCK_SIZE);
6096 6162 if (sector_num >= 0)
6097 6163 break;
6098 6164 }
6099 6165 }
6100 6166 if (j == MAX_DISKS)
6101 6167 goto normal_compress;
6102 6168 buf[0] = 1;
6103 6169 buf[1] = j;
6104 6170 cpu_to_be64wu((uint64_t *)(buf + 2), sector_num);
6105 6171 ram_compress_buf(s, buf, 10);
6106 6172 } else
6107 6173 #endif
6108 6174 {
6109 6175 // normal_compress:
6110 6176 buf[0] = 0;
6111 6177 ram_compress_buf(s, buf, 1);
6112 6178 ram_compress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE);
6113 6179 }
6114 6180 }
6115 6181 ram_compress_close(s);
6116 6182 }
6117 6183
6118 6184 static int ram_load(QEMUFile *f, void *opaque, int version_id)
6119 6185 {
6120 6186 RamDecompressState s1, *s = &s1;
6121 6187 uint8_t buf[10];
6122 6188 int i;
6123 6189
6124 6190 if (version_id == 1)
6125 6191 return ram_load_v1(f, opaque);
6126 6192 if (version_id != 2)
6127 6193 return -EINVAL;
6128 6194 if (qemu_get_be32(f) != phys_ram_size)
6129 6195 return -EINVAL;
6130 6196 if (ram_decompress_open(s, f) < 0)
6131 6197 return -EINVAL;
6132 6198 for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
6133 6199 if (ram_decompress_buf(s, buf, 1) < 0) {
6134 6200 fprintf(stderr, "Error while reading ram block header\n");
6135 6201 goto error;
6136 6202 }
6137 6203 if (buf[0] == 0) {
6138 6204 if (ram_decompress_buf(s, phys_ram_base + i, BDRV_HASH_BLOCK_SIZE) < 0) {
6139 6205 fprintf(stderr, "Error while reading ram block address=0x%08x", i);
6140 6206 goto error;
6141 6207 }
6142 6208 } else
6143 6209 #if 0
6144 6210 if (buf[0] == 1) {
6145 6211 int bs_index;
6146 6212 int64_t sector_num;
6147 6213
6148 6214 ram_decompress_buf(s, buf + 1, 9);
6149 6215 bs_index = buf[1];
6150 6216 sector_num = be64_to_cpupu((const uint64_t *)(buf + 2));
6151 6217 if (bs_index >= MAX_DISKS || bs_table[bs_index] == NULL) {
6152 6218 fprintf(stderr, "Invalid block device index %d\n", bs_index);
6153 6219 goto error;
6154 6220 }
6155 6221 if (bdrv_read(bs_table[bs_index], sector_num, phys_ram_base + i,
6156 6222 BDRV_HASH_BLOCK_SIZE / 512) < 0) {
6157 6223 fprintf(stderr, "Error while reading sector %d:%" PRId64 "\n",
6158 6224 bs_index, sector_num);
6159 6225 goto error;
6160 6226 }
6161 6227 } else
6162 6228 #endif
6163 6229 {
6164 6230 error:
6165 6231 printf("Error block header\n");
6166 6232 return -EINVAL;
6167 6233 }
6168 6234 }
6169 6235 ram_decompress_close(s);
6170 6236 return 0;
6171 6237 }
6172 6238 #else /* CONFIG_DM */
6173 6239 void cpu_save(QEMUFile *f, void *opaque)
6174 6240 {
6175 6241 }
6176 6242
6177 6243 int cpu_load(QEMUFile *f, void *opaque, int version_id)
6178 6244 {
6179 6245 return 0;
6180 6246 }
6181 6247
6182 6248 static void ram_save(QEMUFile *f, void *opaque)
6183 6249 {
6184 6250 }
6185 6251
6186 6252 static int ram_load(QEMUFile *f, void *opaque, int version_id)
6187 6253 {
6188 6254 return 0;
6189 6255 }
6190 6256 #endif /* CONFIG_DM */
6191 6257
6192 6258 /***********************************************************/
6193 6259 /* bottom halves (can be seen as timers which expire ASAP) */
6194 6260
6195 6261 struct QEMUBH {
6196 6262 QEMUBHFunc *cb;
6197 6263 void *opaque;
6198 6264 int scheduled;
6199 6265 QEMUBH *next;
6200 6266 };
6201 6267
6202 6268 static QEMUBH *first_bh = NULL;
6203 6269
6204 6270 QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
6205 6271 {
6206 6272 QEMUBH *bh;
6207 6273 bh = qemu_mallocz(sizeof(QEMUBH));
6208 6274 if (!bh)
6209 6275 return NULL;
6210 6276 bh->cb = cb;
6211 6277 bh->opaque = opaque;
6212 6278 return bh;
6213 6279 }
6214 6280
6215 6281 int qemu_bh_poll(void)
6216 6282 {
6217 6283 QEMUBH *bh, **pbh;
6218 6284 int ret;
6219 6285
6220 6286 ret = 0;
6221 6287 for(;;) {
6222 6288 pbh = &first_bh;
6223 6289 bh = *pbh;
6224 6290 if (!bh)
6225 6291 break;
6226 6292 ret = 1;
6227 6293 *pbh = bh->next;
6228 6294 bh->scheduled = 0;
6229 6295 bh->cb(bh->opaque);
6230 6296 }
6231 6297 return ret;
6232 6298 }
6233 6299
6234 6300 void qemu_bh_schedule(QEMUBH *bh)
6235 6301 {
6236 6302 CPUState *env = cpu_single_env;
6237 6303 if (bh->scheduled)
6238 6304 return;
6239 6305 bh->scheduled = 1;
6240 6306 bh->next = first_bh;
6241 6307 first_bh = bh;
6242 6308
6243 6309 /* stop the currently executing CPU to execute the BH ASAP */
6244 6310 if (env) {
6245 6311 cpu_interrupt(env, CPU_INTERRUPT_EXIT);
6246 6312 }
6247 6313 }
6248 6314
6249 6315 void qemu_bh_cancel(QEMUBH *bh)
6250 6316 {
6251 6317 QEMUBH **pbh;
6252 6318 if (bh->scheduled) {
6253 6319 pbh = &first_bh;
6254 6320 while (*pbh != bh)
6255 6321 pbh = &(*pbh)->next;
6256 6322 *pbh = bh->next;
6257 6323 bh->scheduled = 0;
6258 6324 }
6259 6325 }
6260 6326
6261 6327 void qemu_bh_delete(QEMUBH *bh)
6262 6328 {
6263 6329 qemu_bh_cancel(bh);
6264 6330 qemu_free(bh);
6265 6331 }
6266 6332
6267 6333 /***********************************************************/
6268 6334 /* machine registration */
6269 6335
6270 6336 QEMUMachine *first_machine = NULL;
6271 6337
6272 6338 int qemu_register_machine(QEMUMachine *m)
6273 6339 {
6274 6340 QEMUMachine **pm;
6275 6341 pm = &first_machine;
6276 6342 while (*pm != NULL)
6277 6343 pm = &(*pm)->next;
6278 6344 m->next = NULL;
6279 6345 *pm = m;
6280 6346 return 0;
6281 6347 }
6282 6348
6283 6349 QEMUMachine *find_machine(const char *name)
6284 6350 {
6285 6351 QEMUMachine *m;
6286 6352
6287 6353 for(m = first_machine; m != NULL; m = m->next) {
6288 6354 if (!strcmp(m->name, name))
6289 6355 return m;
6290 6356 }
6291 6357 return NULL;
6292 6358 }
6293 6359
6294 6360 /***********************************************************/
6295 6361 /* main execution loop */
6296 6362
6297 6363 void gui_update(void *opaque)
6298 6364 {
6299 6365 display_state.dpy_refresh(&display_state);
6300 6366 qemu_mod_timer(gui_timer, GUI_REFRESH_INTERVAL + qemu_get_clock(rt_clock));
6301 6367 }
6302 6368
6303 6369 struct vm_change_state_entry {
6304 6370 VMChangeStateHandler *cb;
6305 6371 void *opaque;
6306 6372 LIST_ENTRY (vm_change_state_entry) entries;
6307 6373 };
6308 6374
6309 6375 static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
6310 6376
6311 6377 VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
6312 6378 void *opaque)
6313 6379 {
6314 6380 VMChangeStateEntry *e;
6315 6381
6316 6382 e = qemu_mallocz(sizeof (*e));
6317 6383 if (!e)
6318 6384 return NULL;
6319 6385
6320 6386 e->cb = cb;
6321 6387 e->opaque = opaque;
6322 6388 LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
6323 6389 return e;
6324 6390 }
6325 6391
6326 6392 void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
6327 6393 {
6328 6394 LIST_REMOVE (e, entries);
6329 6395 qemu_free (e);
6330 6396 }
6331 6397
6332 6398 static void vm_state_notify(int running)
6333 6399 {
6334 6400 VMChangeStateEntry *e;
6335 6401
6336 6402 for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
6337 6403 e->cb(e->opaque, running);
6338 6404 }
6339 6405 }
6340 6406
6341 6407 /* XXX: support several handlers */
6342 6408 static VMStopHandler *vm_stop_cb;
6343 6409 static void *vm_stop_opaque;
6344 6410
6345 6411 int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
6346 6412 {
6347 6413 vm_stop_cb = cb;
6348 6414 vm_stop_opaque = opaque;
6349 6415 return 0;
6350 6416 }
6351 6417
6352 6418 void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
6353 6419 {
6354 6420 vm_stop_cb = NULL;
6355 6421 }
6356 6422
6357 6423 void vm_start(void)
6358 6424 {
6359 6425 if (!vm_running) {
6360 6426 cpu_enable_ticks();
6361 6427 vm_running = 1;
6362 6428 vm_state_notify(1);
6363 6429 }
6364 6430 }
6365 6431
6366 6432 void vm_stop(int reason)
6367 6433 {
6368 6434 if (vm_running) {
6369 6435 cpu_disable_ticks();
6370 6436 vm_running = 0;
6371 6437 if (reason != 0) {
6372 6438 if (vm_stop_cb) {
6373 6439 vm_stop_cb(vm_stop_opaque, reason);
6374 6440 }
6375 6441 }
6376 6442 vm_state_notify(0);
6377 6443 }
6378 6444 }
6379 6445
6380 6446 /* reset/shutdown handler */
6381 6447
6382 6448 typedef struct QEMUResetEntry {
6383 6449 QEMUResetHandler *func;
6384 6450 void *opaque;
6385 6451 struct QEMUResetEntry *next;
6386 6452 } QEMUResetEntry;
6387 6453
6388 6454 static QEMUResetEntry *first_reset_entry;
6389 6455 int reset_requested;
6390 6456 int shutdown_requested;
6391 6457 int suspend_requested;
6392 6458 static int powerdown_requested;
6393 6459
6394 6460 void qemu_register_reset(QEMUResetHandler *func, void *opaque)
6395 6461 {
6396 6462 QEMUResetEntry **pre, *re;
6397 6463
6398 6464 pre = &first_reset_entry;
6399 6465 while (*pre != NULL)
6400 6466 pre = &(*pre)->next;
6401 6467 re = qemu_mallocz(sizeof(QEMUResetEntry));
6402 6468 re->func = func;
6403 6469 re->opaque = opaque;
6404 6470 re->next = NULL;
6405 6471 *pre = re;
6406 6472 }
6407 6473
6408 6474 void qemu_system_reset(void)
6409 6475 {
6410 6476 QEMUResetEntry *re;
6411 6477
6412 6478 /* reset all devices */
6413 6479 for(re = first_reset_entry; re != NULL; re = re->next) {
6414 6480 re->func(re->opaque);
6415 6481 }
6416 6482 }
6417 6483
6418 6484 void qemu_system_reset_request(void)
6419 6485 {
6420 6486 if (no_reboot) {
6421 6487 shutdown_requested = 1;
6422 6488 } else {
6423 6489 reset_requested = 1;
6424 6490 }
6425 6491 if (cpu_single_env)
6426 6492 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
6427 6493 }
6428 6494
6429 6495 void qemu_system_shutdown_request(void)
6430 6496 {
6431 6497 shutdown_requested = 1;
6432 6498 if (cpu_single_env)
6433 6499 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
6434 6500 }
6435 6501
6436 6502 void qemu_system_powerdown_request(void)
6437 6503 {
6438 6504 powerdown_requested = 1;
6439 6505 if (cpu_single_env)
6440 6506 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
6441 6507 }
6442 6508
6443 6509 void main_loop_wait(int timeout)
6444 6510 {
6445 6511 IOHandlerRecord *ioh;
6446 6512 fd_set rfds, wfds, xfds;
6447 6513 int ret, nfds;
6448 6514 struct timeval tv;
6449 6515 PollingEntry *pe;
6450 6516
6451 6517
6452 6518 /* XXX: need to suppress polling by better using win32 events */
6453 6519 ret = 0;
6454 6520 for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
6455 6521 ret |= pe->func(pe->opaque);
6456 6522 }
6457 6523 #ifdef _WIN32
6458 6524 if (ret == 0 && timeout > 0) {
6459 6525 int err;
6460 6526 WaitObjects *w = &wait_objects;
6461 6527
6462 6528 ret = WaitForMultipleObjects(w->num, w->events, FALSE, timeout);
6463 6529 if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
6464 6530 if (w->func[ret - WAIT_OBJECT_0])
6465 6531 w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
6466 6532 } else if (ret == WAIT_TIMEOUT) {
6467 6533 } else {
6468 6534 err = GetLastError();
6469 6535 fprintf(stderr, "Wait error %d %d\n", ret, err);
6470 6536 }
6471 6537 }
6472 6538 #endif
6473 6539 /* poll any events */
6474 6540 /* XXX: separate device handlers from system ones */
6475 6541 nfds = -1;
6476 6542 FD_ZERO(&rfds);
6477 6543 FD_ZERO(&wfds);
6478 6544 FD_ZERO(&xfds);
6479 6545 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
6480 6546 if (ioh->deleted)
6481 6547 continue;
6482 6548 if (ioh->fd_read &&
6483 6549 (!ioh->fd_read_poll ||
6484 6550 ioh->fd_read_poll(ioh->opaque) != 0)) {
6485 6551 FD_SET(ioh->fd, &rfds);
6486 6552 if (ioh->fd > nfds)
6487 6553 nfds = ioh->fd;
6488 6554 }
6489 6555 if (ioh->fd_write) {
6490 6556 FD_SET(ioh->fd, &wfds);
6491 6557 if (ioh->fd > nfds)
6492 6558 nfds = ioh->fd;
6493 6559 }
6494 6560 }
6495 6561
6496 6562 tv.tv_sec = 0;
6497 6563 #ifdef _WIN32
6498 6564 tv.tv_usec = 0;
6499 6565 #else
6500 6566 tv.tv_usec = timeout * 1000;
6501 6567 #endif
6502 6568 #if defined(CONFIG_SLIRP)
6503 6569 if (slirp_inited) {
6504 6570 slirp_select_fill(&nfds, &rfds, &wfds, &xfds);
6505 6571 }
6506 6572 #endif
6507 6573 ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv);
6508 6574 if (ret > 0) {
6509 6575 IOHandlerRecord **pioh;
6510 6576
6511 6577 for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) {
6512 6578 if (ioh->deleted)
6513 6579 continue;
6514 6580 if (ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) {
6515 6581 ioh->fd_read(ioh->opaque);
6516 6582 }
6517 6583 if (ioh->fd_write && FD_ISSET(ioh->fd, &wfds)) {
6518 6584 ioh->fd_write(ioh->opaque);
6519 6585 }
6520 6586 }
6521 6587
6522 6588 /* remove deleted IO handlers */
6523 6589 pioh = &first_io_handler;
6524 6590 while (*pioh) {
6525 6591 ioh = *pioh;
6526 6592 if (ioh->deleted) {
6527 6593 *pioh = ioh->next;
6528 6594 qemu_free(ioh);
6529 6595 } else
6530 6596 pioh = &ioh->next;
6531 6597 }
6532 6598 }
6533 6599 #if defined(CONFIG_SLIRP)
6534 6600 if (slirp_inited) {
6535 6601 if (ret < 0) {
6536 6602 FD_ZERO(&rfds);
6537 6603 FD_ZERO(&wfds);
6538 6604 FD_ZERO(&xfds);
6539 6605 }
6540 6606 slirp_select_poll(&rfds, &wfds, &xfds);
6541 6607 }
6542 6608 #endif
6543 6609 qemu_aio_poll();
6544 6610 qemu_bh_poll();
6545 6611
6546 6612 if (vm_running) {
6547 6613 qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],
6548 6614 qemu_get_clock(vm_clock));
6549 6615 /* run dma transfers, if any */
6550 6616 DMA_run();
6551 6617 }
6552 6618
6553 6619 /* real time timers */
6554 6620 qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
6555 6621 qemu_get_clock(rt_clock));
6556 6622 }
6557 6623
6558 6624 #ifndef CONFIG_DM
6559 6625 static CPUState *cur_cpu;
6560 6626
6561 6627 int main_loop(void)
6562 6628 {
6563 6629 int ret, timeout;
6564 6630 #ifdef CONFIG_PROFILER
6565 6631 int64_t ti;
6566 6632 #endif
6567 6633 CPUState *env;
6568 6634
6569 6635 cur_cpu = first_cpu;
6570 6636 for(;;) {
6571 6637 if (vm_running) {
6572 6638
6573 6639 env = cur_cpu;
6574 6640 for(;;) {
6575 6641 /* get next cpu */
6576 6642 env = env->next_cpu;
6577 6643 if (!env)
6578 6644 env = first_cpu;
6579 6645 #ifdef CONFIG_PROFILER
6580 6646 ti = profile_getclock();
6581 6647 #endif
6582 6648 ret = cpu_exec(env);
6583 6649 #ifdef CONFIG_PROFILER
6584 6650 qemu_time += profile_getclock() - ti;
6585 6651 #endif
6586 6652 if (ret != EXCP_HALTED)
6587 6653 break;
6588 6654 /* all CPUs are halted ? */
6589 6655 if (env == cur_cpu) {
6590 6656 ret = EXCP_HLT;
6591 6657 break;
6592 6658 }
6593 6659 }
6594 6660 cur_cpu = env;
6595 6661
6596 6662 if (shutdown_requested) {
6597 6663 ret = EXCP_INTERRUPT;
6598 6664 break;
6599 6665 }
6600 6666 if (reset_requested) {
6601 6667 reset_requested = 0;
6602 6668 qemu_system_reset();
6603 6669 ret = EXCP_INTERRUPT;
6604 6670 }
6605 6671 if (powerdown_requested) {
6606 6672 powerdown_requested = 0;
6607 6673 qemu_system_powerdown();
6608 6674 ret = EXCP_INTERRUPT;
6609 6675 }
6610 6676 if (ret == EXCP_DEBUG) {
6611 6677 vm_stop(EXCP_DEBUG);
6612 6678 }
6613 6679 /* if hlt instruction, we wait until the next IRQ */
6614 6680 /* XXX: use timeout computed from timers */
6615 6681 if (ret == EXCP_HLT)
6616 6682 timeout = 10;
6617 6683 else
6618 6684 timeout = 0;
6619 6685 } else {
6620 6686 timeout = 10;
6621 6687 }
6622 6688 #ifdef CONFIG_PROFILER
6623 6689 ti = profile_getclock();
6624 6690 #endif
6625 6691 main_loop_wait(timeout);
6626 6692 #ifdef CONFIG_PROFILER
6627 6693 dev_time += profile_getclock() - ti;
6628 6694 #endif
6629 6695 }
6630 6696 cpu_disable_ticks();
6631 6697 return ret;
6632 6698 }
6633 6699 #endif /* !CONFIG_DM */
6634 6700
6635 6701 void help(void)
6636 6702 {
6637 6703 printf("QEMU PC emulator version " QEMU_VERSION ", Copyright (c) 2003-2007 Fabrice Bellard\n"
6638 6704 "usage: %s [options] [disk_image]\n"
6639 6705 "\n"
6640 6706 "'disk_image' is a raw hard image image for IDE hard disk 0\n"
6641 6707 "\n"
6642 6708 "Standard options:\n"
6643 6709 "-M machine select emulated machine (-M ? for list)\n"
6644 6710 "-fda/-fdb file use 'file' as floppy disk 0/1 image\n"
6645 6711 #ifndef CONFIG_DM
6646 6712 "-hda/-hdb file use 'file' as IDE hard disk 0/1 image\n"
6647 6713 "-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n"
6648 6714 "-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
6649 6715 #endif /* !CONFIG_DM */
6650 6716 "-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n)\n"
6651 6717 "-snapshot write to temporary files instead of disk image files\n"
6652 6718 #ifdef CONFIG_SDL
6653 6719 "-no-quit disable SDL window close capability\n"
6654 6720 #endif
6655 6721 #ifdef TARGET_I386
6656 6722 "-no-fd-bootchk disable boot signature checking for floppy disks\n"
6657 6723 #endif
6658 6724 "-m megs set virtual RAM size to megs MB [default=%d]\n"
6659 6725 "-smp n set the number of CPUs to 'n' [default=1]\n"
6660 6726 "-nographic disable graphical output and redirect serial I/Os to console\n"
6661 6727 "-vcpus set CPU number of guest platform\n"
6662 6728 #ifndef _WIN32
6663 6729 "-k language use keyboard layout (for example \"fr\" for French)\n"
6664 6730 #endif
6665 6731 #ifdef HAS_AUDIO
6666 6732 "-audio-help print list of audio drivers and their options\n"
6667 6733 "-soundhw c1,... enable audio support\n"
6668 6734 " and only specified sound cards (comma separated list)\n"
6669 6735 " use -soundhw ? to get the list of supported cards\n"
6670 6736 " use -soundhw all to enable all of them\n"
6671 6737 #endif
6672 6738 "-localtime set the real time clock to local time [default=utc]\n"
6673 6739 "-full-screen start in full screen\n"
6674 6740 #ifdef TARGET_I386
6675 6741 "-win2k-hack use it when installing Windows 2000 to avoid a disk full bug\n"
6676 6742 #endif
6677 6743 "-usb enable the USB driver (will be the default soon)\n"
6678 6744 "-usbdevice name add the host or guest USB device 'name'\n"
6679 6745 #if defined(TARGET_PPC) || defined(TARGET_SPARC)
6680 6746 "-g WxH[xDEPTH] Set the initial graphical resolution and depth\n"
6681 6747 #endif
6682 6748 "\n"
6683 6749 "Network options:\n"
6684 6750 "-net nic[,vlan=n][,macaddr=addr][,model=type]\n"
6685 6751 " create a new Network Interface Card and connect it to VLAN 'n'\n"
6686 6752 #ifdef CONFIG_SLIRP
6687 6753 "-net user[,vlan=n][,hostname=host]\n"
6688 6754 " connect the user mode network stack to VLAN 'n' and send\n"
6689 6755 " hostname 'host' to DHCP clients\n"
6690 6756 #endif
6691 6757 #ifdef _WIN32
6692 6758 "-net tap[,vlan=n],ifname=name\n"
6693 6759 " connect the host TAP network interface to VLAN 'n'\n"
6694 6760 #else
6695 6761 "-net tap[,vlan=n][,fd=h][,ifname=name][,script=file][,bridge=br]\n"
6696 6762 " connect the host TAP network interface to VLAN 'n' and use\n"
6697 6763 " the network script 'file' (default=%s);\n"
6698 6764 " use 'script=no' to disable script execution;\n"
6699 6765 " use 'fd=h' to connect to an already opened TAP interface\n"
6700 6766 #endif
6701 6767 "-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]\n"
6702 6768 " connect the vlan 'n' to another VLAN using a socket connection\n"
6703 6769 "-net socket[,vlan=n][,fd=h][,mcast=maddr:port]\n"
6704 6770 " connect the vlan 'n' to multicast maddr and port\n"
6705 6771 "-net none use it alone to have zero network devices; if no -net option\n"
6706 6772 " is provided, the default is '-net nic -net user'\n"
6707 6773 "\n"
6708 6774 #ifdef CONFIG_SLIRP
6709 6775 "-tftp prefix allow tftp access to files starting with prefix [-net user]\n"
6710 6776 #ifndef _WIN32
6711 6777 "-smb dir allow SMB access to files in 'dir' [-net user]\n"
6712 6778 #endif
6713 6779 "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n"
6714 6780 " redirect TCP or UDP connections from host to guest [-net user]\n"
6715 6781 #endif
6716 6782 "\n"
6717 6783 "Linux boot specific:\n"
6718 6784 "-kernel bzImage use 'bzImage' as kernel image\n"
6719 6785 "-append cmdline use 'cmdline' as kernel command line\n"
6720 6786 "-initrd file use 'file' as initial ram disk\n"
6721 6787 "\n"
6722 6788 "Debug/Expert options:\n"
6723 6789 "-monitor dev redirect the monitor to char device 'dev'\n"
6724 6790 "-serial dev redirect the serial port to char device 'dev'\n"
6725 6791 "-parallel dev redirect the parallel port to char device 'dev'\n"
6726 6792 "-pidfile file Write PID to 'file'\n"
6727 6793 "-S freeze CPU at startup (use 'c' to start execution)\n"
6728 6794 "-s wait gdb connection to port %d\n"
6729 6795 "-p port change gdb connection port\n"
6730 6796 "-l item1,... output log to %s (use -d ? for a list of log items)\n"
6731 6797 "-d domain domain that we're serving\n"
6732 6798 "-domain-name domain name that we're serving\n"
6733 6799 "-hdachs c,h,s[,t] force hard disk 0 physical geometry and the optional BIOS\n"
6734 6800 " translation (t=none or lba) (usually qemu can guess them)\n"
6735 6801 "-L path set the directory for the BIOS, VGA BIOS and keymaps\n"
6736 6802 #ifdef USE_KQEMU
6737 6803 "-kernel-kqemu enable KQEMU full virtualization (default is user mode only)\n"
6738 6804 "-no-kqemu disable KQEMU kernel module usage\n"
6739 6805 #endif
6740 6806 #ifdef USE_CODE_COPY
6741 6807 "-no-code-copy disable code copy acceleration\n"
6742 6808 #endif
6743 6809 #ifdef TARGET_I386
6744 6810 "-std-vga simulate a standard VGA card with VESA Bochs Extensions\n"
6745 6811 " (default is CL-GD5446 PCI VGA)\n"
6746 6812 "-no-acpi disable ACPI\n"
6747 6813 #endif
6748 6814 "-no-reboot exit instead of rebooting\n"
6749 6815 "-loadvm file start right away with a saved state (loadvm in monitor)\n"
6750 6816 "-vnc display start a VNC server on display\n"
6751 6817 "-vncviewer start a vncviewer process for this domain\n"
6752 6818 "-vncunused bind the VNC server to an unused port\n"
6753 6819 "-vnclisten bind the VNC server to this address\n"
6754 6820 "-timeoffset time offset (in seconds) from local time\n"
6755 6821 #ifndef _WIN32
6756 6822 "-daemonize daemonize QEMU after initializing\n"
6757 6823 #endif
6758 6824 "-option-rom rom load a file, rom, into the option ROM space\n"
6759 6825 "-acpi disable or enable ACPI of HVM domain \n"
6760 6826 "\n"
6761 6827 "During emulation, the following keys are useful:\n"
6762 6828 "ctrl-alt-f toggle full screen\n"
6763 6829 "ctrl-alt-n switch to virtual console 'n'\n"
6764 6830 "ctrl-alt toggle mouse and keyboard grab\n"
6765 6831 "\n"
6766 6832 "When using -nographic, press 'ctrl-a h' to get some help.\n"
6767 6833 ,
6768 6834 "qemu",
6769 6835 DEFAULT_RAM_SIZE,
6770 6836 #ifndef _WIN32
6771 6837 DEFAULT_NETWORK_SCRIPT,
6772 6838 #endif
6773 6839 DEFAULT_GDBSTUB_PORT,
6774 6840 "/tmp/qemu.log");
6775 6841 exit(1);
6776 6842 }
6777 6843
6778 6844 #define HAS_ARG 0x0001
6779 6845
6780 6846 enum {
6781 6847 QEMU_OPTION_h,
6782 6848
6783 6849 QEMU_OPTION_M,
6784 6850 QEMU_OPTION_fda,
6785 6851 QEMU_OPTION_fdb,
6786 6852 #ifndef CONFIG_DM
6787 6853 QEMU_OPTION_hda,
6788 6854 QEMU_OPTION_hdb,
6789 6855 QEMU_OPTION_hdc,
6790 6856 QEMU_OPTION_hdd,
6791 6857 QEMU_OPTION_cdrom,
6792 6858 #endif /* !CONFIG_DM */
6793 6859 QEMU_OPTION_boot,
6794 6860 QEMU_OPTION_snapshot,
6795 6861 #ifdef TARGET_I386
6796 6862 QEMU_OPTION_no_fd_bootchk,
6797 6863 #endif
6798 6864 QEMU_OPTION_m,
6799 6865 QEMU_OPTION_nographic,
6800 6866 #ifdef HAS_AUDIO
6801 6867 QEMU_OPTION_audio_help,
6802 6868 QEMU_OPTION_soundhw,
6803 6869 #endif
6804 6870
6805 6871 QEMU_OPTION_net,
6806 6872 QEMU_OPTION_tftp,
6807 6873 QEMU_OPTION_smb,
6808 6874 QEMU_OPTION_redir,
6809 6875
6810 6876 QEMU_OPTION_kernel,
6811 6877 QEMU_OPTION_append,
6812 6878 QEMU_OPTION_initrd,
6813 6879
6814 6880 QEMU_OPTION_S,
6815 6881 QEMU_OPTION_s,
6816 6882 QEMU_OPTION_p,
6817 6883 QEMU_OPTION_l,
6818 6884 QEMU_OPTION_hdachs,
6819 6885 QEMU_OPTION_L,
6820 6886 #ifdef USE_CODE_COPY
6821 6887 QEMU_OPTION_no_code_copy,
6822 6888 #endif
6823 6889 QEMU_OPTION_k,
6824 6890 QEMU_OPTION_localtime,
6825 6891 QEMU_OPTION_cirrusvga,
6826 6892 QEMU_OPTION_g,
6827 6893 QEMU_OPTION_std_vga,
6828 6894 QEMU_OPTION_monitor,
6829 6895 QEMU_OPTION_domainname,
6830 6896 QEMU_OPTION_serial,
6831 6897 QEMU_OPTION_parallel,
6832 6898 QEMU_OPTION_loadvm,
6833 6899 QEMU_OPTION_full_screen,
6834 6900 QEMU_OPTION_no_quit,
6835 6901 QEMU_OPTION_pidfile,
6836 6902 QEMU_OPTION_no_kqemu,
6837 6903 QEMU_OPTION_kernel_kqemu,
6838 6904 QEMU_OPTION_win2k_hack,
6839 6905 QEMU_OPTION_usb,
6840 6906 QEMU_OPTION_usbdevice,
6841 6907 QEMU_OPTION_smp,
6842 6908 QEMU_OPTION_vnc,
6843 6909 QEMU_OPTION_no_acpi,
6844 6910 QEMU_OPTION_no_reboot,
6845 6911 QEMU_OPTION_daemonize,
6846 6912 QEMU_OPTION_option_rom,
6847 6913 QEMU_OPTION_semihosting
6848 6914 ,
6849 6915 QEMU_OPTION_d,
6850 6916 QEMU_OPTION_vcpus,
6851 6917 QEMU_OPTION_timeoffset,
6852 6918 QEMU_OPTION_acpi,
6853 6919 QEMU_OPTION_vncviewer,
6854 6920 QEMU_OPTION_vncunused,
6855 6921 QEMU_OPTION_vnclisten,
6856 6922 };
6857 6923
6858 6924 typedef struct QEMUOption {
6859 6925 const char *name;
6860 6926 int flags;
6861 6927 int index;
6862 6928 } QEMUOption;
6863 6929
6864 6930 const QEMUOption qemu_options[] = {
6865 6931 { "h", 0, QEMU_OPTION_h },
6866 6932 { "help", 0, QEMU_OPTION_h },
6867 6933
6868 6934 { "M", HAS_ARG, QEMU_OPTION_M },
6869 6935 { "fda", HAS_ARG, QEMU_OPTION_fda },
6870 6936 { "fdb", HAS_ARG, QEMU_OPTION_fdb },
6871 6937 #ifndef CONFIG_DM
6872 6938 { "hda", HAS_ARG, QEMU_OPTION_hda },
6873 6939 { "hdb", HAS_ARG, QEMU_OPTION_hdb },
6874 6940 { "hdc", HAS_ARG, QEMU_OPTION_hdc },
6875 6941 { "hdd", HAS_ARG, QEMU_OPTION_hdd },
6876 6942 { "cdrom", HAS_ARG, QEMU_OPTION_cdrom },
6877 6943 #endif /* !CONFIG_DM */
6878 6944 { "boot", HAS_ARG, QEMU_OPTION_boot },
6879 6945 { "snapshot", 0, QEMU_OPTION_snapshot },
6880 6946 #ifdef TARGET_I386
6881 6947 { "no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk },
6882 6948 #endif
6883 6949 { "m", HAS_ARG, QEMU_OPTION_m },
6884 6950 { "nographic", 0, QEMU_OPTION_nographic },
6885 6951 { "k", HAS_ARG, QEMU_OPTION_k },
6886 6952 #ifdef HAS_AUDIO
6887 6953 { "audio-help", 0, QEMU_OPTION_audio_help },
6888 6954 { "soundhw", HAS_ARG, QEMU_OPTION_soundhw },
6889 6955 #endif
6890 6956
6891 6957 { "net", HAS_ARG, QEMU_OPTION_net},
6892 6958 #ifdef CONFIG_SLIRP
6893 6959 { "tftp", HAS_ARG, QEMU_OPTION_tftp },
6894 6960 #ifndef _WIN32
6895 6961 { "smb", HAS_ARG, QEMU_OPTION_smb },
6896 6962 #endif
6897 6963 { "redir", HAS_ARG, QEMU_OPTION_redir },
6898 6964 #endif
6899 6965
6900 6966 { "kernel", HAS_ARG, QEMU_OPTION_kernel },
6901 6967 { "append", HAS_ARG, QEMU_OPTION_append },
6902 6968 { "initrd", HAS_ARG, QEMU_OPTION_initrd },
6903 6969
6904 6970 { "S", 0, QEMU_OPTION_S },
6905 6971 { "s", 0, QEMU_OPTION_s },
6906 6972 { "p", HAS_ARG, QEMU_OPTION_p },
6907 6973 { "l", HAS_ARG, QEMU_OPTION_l },
6908 6974 { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
6909 6975 { "L", HAS_ARG, QEMU_OPTION_L },
6910 6976 #ifdef USE_CODE_COPY
6911 6977 { "no-code-copy", 0, QEMU_OPTION_no_code_copy },
6912 6978 #endif
6913 6979 #ifdef USE_KQEMU
6914 6980 { "no-kqemu", 0, QEMU_OPTION_no_kqemu },
6915 6981 { "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu },
6916 6982 #endif
6917 6983 #if defined(TARGET_PPC) || defined(TARGET_SPARC)
6918 6984 { "g", 1, QEMU_OPTION_g },
6919 6985 #endif
6920 6986 { "localtime", 0, QEMU_OPTION_localtime },
6921 6987 { "std-vga", 0, QEMU_OPTION_std_vga },
6922 6988 { "monitor", 1, QEMU_OPTION_monitor },
6923 6989 { "domain-name", 1, QEMU_OPTION_domainname },
6924 6990 { "serial", 1, QEMU_OPTION_serial },
6925 6991 { "parallel", 1, QEMU_OPTION_parallel },
6926 6992 { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
6927 6993 { "full-screen", 0, QEMU_OPTION_full_screen },
6928 6994 #ifdef CONFIG_SDL
6929 6995 { "no-quit", 0, QEMU_OPTION_no_quit },
6930 6996 #endif
6931 6997 { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
6932 6998 { "win2k-hack", 0, QEMU_OPTION_win2k_hack },
6933 6999 { "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
6934 7000 { "smp", HAS_ARG, QEMU_OPTION_smp },
6935 7001 { "vnc", HAS_ARG, QEMU_OPTION_vnc },
6936 7002 { "vncviewer", 0, QEMU_OPTION_vncviewer },
6937 7003 { "vncunused", 0, QEMU_OPTION_vncunused },
6938 7004 { "vnclisten", HAS_ARG, QEMU_OPTION_vnclisten },
6939 7005
6940 7006 /* temporary options */
6941 7007 { "usb", 0, QEMU_OPTION_usb },
6942 7008 { "cirrusvga", 0, QEMU_OPTION_cirrusvga },
6943 7009 { "no-acpi", 0, QEMU_OPTION_no_acpi },
6944 7010 { "no-reboot", 0, QEMU_OPTION_no_reboot },
6945 7011 { "daemonize", 0, QEMU_OPTION_daemonize },
6946 7012 { "option-rom", HAS_ARG, QEMU_OPTION_option_rom },
6947 7013 #if defined(TARGET_ARM)
6948 7014 { "semihosting", 0, QEMU_OPTION_semihosting },
6949 7015 #endif
6950 7016
6951 7017 { "d", HAS_ARG, QEMU_OPTION_d },
6952 7018 { "vcpus", 1, QEMU_OPTION_vcpus },
6953 7019 { "timeoffset", HAS_ARG, QEMU_OPTION_timeoffset },
6954 7020 { "acpi", 0, QEMU_OPTION_acpi },
6955 7021 { NULL },
6956 7022 };
6957 7023
6958 7024 #if defined (TARGET_I386) && defined(USE_CODE_COPY)
6959 7025
6960 7026 /* this stack is only used during signal handling */
6961 7027 #define SIGNAL_STACK_SIZE 32768
6962 7028
6963 7029 static uint8_t *signal_stack;
6964 7030
6965 7031 #endif
6966 7032
6967 7033 /* password input */
6968 7034
6969 7035 static BlockDriverState *get_bdrv(int index)
6970 7036 {
6971 7037 BlockDriverState *bs;
6972 7038
6973 7039 if (index < 4) {
6974 7040 bs = bs_table[index];
6975 7041 } else if (index < 6) {
6976 7042 bs = fd_table[index - 4];
6977 7043 } else {
6978 7044 bs = NULL;
6979 7045 }
6980 7046 return bs;
6981 7047 }
6982 7048
6983 7049 static void read_passwords(void)
6984 7050 {
6985 7051 BlockDriverState *bs;
6986 7052 int i, j;
6987 7053 char password[256];
6988 7054
6989 7055 for(i = 0; i < 6; i++) {
6990 7056 bs = get_bdrv(i);
6991 7057 if (bs && bdrv_is_encrypted(bs)) {
6992 7058 term_printf("%s is encrypted.\n", bdrv_get_device_name(bs));
6993 7059 for(j = 0; j < 3; j++) {
6994 7060 monitor_readline("Password: ",
6995 7061 1, password, sizeof(password));
6996 7062 if (bdrv_set_key(bs, password) == 0)
6997 7063 break;
6998 7064 term_printf("invalid password\n");
6999 7065 }
7000 7066 }
7001 7067 }
7002 7068 }
7003 7069
7004 7070 /* XXX: currently we cannot use simultaneously different CPUs */
7005 7071 void register_machines(void)
7006 7072 {
7007 7073 #if defined(TARGET_I386)
7008 7074 qemu_register_machine(&pc_machine);
7009 7075 qemu_register_machine(&isapc_machine);
7010 7076 #elif defined(TARGET_PPC)
7011 7077 qemu_register_machine(&heathrow_machine);
7012 7078 qemu_register_machine(&core99_machine);
7013 7079 qemu_register_machine(&prep_machine);
7014 7080 #elif defined(TARGET_MIPS)
7015 7081 qemu_register_machine(&mips_machine);
7016 7082 qemu_register_machine(&mips_malta_machine);
7017 7083 #elif defined(TARGET_SPARC)
7018 7084 #ifdef TARGET_SPARC64
7019 7085 qemu_register_machine(&sun4u_machine);
7020 7086 #else
7021 7087 qemu_register_machine(&sun4m_machine);
7022 7088 #endif
7023 7089 #elif defined(TARGET_ARM)
7024 7090 qemu_register_machine(&integratorcp926_machine);
7025 7091 qemu_register_machine(&integratorcp1026_machine);
7026 7092 qemu_register_machine(&versatilepb_machine);
7027 7093 qemu_register_machine(&versatileab_machine);
7028 7094 qemu_register_machine(&realview_machine);
7029 7095 #elif defined(TARGET_SH4)
7030 7096 qemu_register_machine(&shix_machine);
7031 7097 #else
7032 7098 #error unsupported CPU
7033 7099 #endif
7034 7100 }
7035 7101
7036 7102 #ifdef HAS_AUDIO
7037 7103 struct soundhw soundhw[] = {
7038 7104 #ifndef CONFIG_DM
7039 7105 #ifdef TARGET_I386
7040 7106 {
7041 7107 "pcspk",
7042 7108 "PC speaker",
7043 7109 0,
7044 7110 1,
7045 7111 { .init_isa = pcspk_audio_init }
7046 7112 },
7047 7113 #endif
7048 7114 #endif /* !CONFIG_DM */
7049 7115 {
7050 7116 "sb16",
7051 7117 "Creative Sound Blaster 16",
7052 7118 0,
7053 7119 1,
7054 7120 { .init_isa = SB16_init }
7055 7121 },
7056 7122
7057 7123 #ifdef CONFIG_ADLIB
7058 7124 {
7059 7125 "adlib",
7060 7126 #ifdef HAS_YMF262
7061 7127 "Yamaha YMF262 (OPL3)",
7062 7128 #else
7063 7129 "Yamaha YM3812 (OPL2)",
7064 7130 #endif
7065 7131 0,
7066 7132 1,
7067 7133 { .init_isa = Adlib_init }
7068 7134 },
7069 7135 #endif
7070 7136
7071 7137 #ifdef CONFIG_GUS
7072 7138 {
7073 7139 "gus",
7074 7140 "Gravis Ultrasound GF1",
7075 7141 0,
7076 7142 1,
7077 7143 { .init_isa = GUS_init }
7078 7144 },
7079 7145 #endif
7080 7146
7081 7147 {
7082 7148 "es1370",
7083 7149 "ENSONIQ AudioPCI ES1370",
7084 7150 0,
7085 7151 0,
7086 7152 { .init_pci = es1370_init }
7087 7153 },
7088 7154
7089 7155 { NULL, NULL, 0, 0, { NULL } }
7090 7156 };
7091 7157
7092 7158 static void select_soundhw (const char *optarg)
7093 7159 {
7094 7160 struct soundhw *c;
7095 7161
7096 7162 if (*optarg == '?') {
7097 7163 show_valid_cards:
7098 7164
7099 7165 printf ("Valid sound card names (comma separated):\n");
7100 7166 for (c = soundhw; c->name; ++c) {
7101 7167 printf ("%-11s %s\n", c->name, c->descr);
7102 7168 }
7103 7169 printf ("\n-soundhw all will enable all of the above\n");
7104 7170 exit (*optarg != '?');
7105 7171 }
7106 7172 else {
7107 7173 size_t l;
7108 7174 const char *p;
7109 7175 char *e;
7110 7176 int bad_card = 0;
7111 7177
7112 7178 if (!strcmp (optarg, "all")) {
7113 7179 for (c = soundhw; c->name; ++c) {
7114 7180 c->enabled = 1;
7115 7181 }
7116 7182 return;
7117 7183 }
7118 7184
7119 7185 p = optarg;
7120 7186 while (*p) {
7121 7187 e = strchr (p, ',');
7122 7188 l = !e ? strlen (p) : (size_t) (e - p);
7123 7189
7124 7190 for (c = soundhw; c->name; ++c) {
7125 7191 if (!strncmp (c->name, p, l)) {
7126 7192 c->enabled = 1;
7127 7193 break;
7128 7194 }
7129 7195 }
7130 7196
7131 7197 if (!c->name) {
7132 7198 if (l > 80) {
7133 7199 fprintf (stderr,
7134 7200 "Unknown sound card name (too big to show)\n");
7135 7201 }
7136 7202 else {
7137 7203 fprintf (stderr, "Unknown sound card name `%.*s'\n",
7138 7204 (int) l, p);
7139 7205 }
7140 7206 bad_card = 1;
7141 7207 }
7142 7208 p += l + (e != NULL);
7143 7209 }
7144 7210
7145 7211 if (bad_card)
7146 7212 goto show_valid_cards;
7147 7213 }
7148 7214 }
7149 7215 #endif
7150 7216
7151 7217 #ifdef _WIN32
7152 7218 static BOOL WINAPI qemu_ctrl_handler(DWORD type)
7153 7219 {
7154 7220 exit(STATUS_CONTROL_C_EXIT);
7155 7221 return TRUE;
7156 7222 }
7157 7223 #endif
7158 7224
7159 7225 #define MAX_NET_CLIENTS 32
7160 7226
7161 7227 #include <xg_private.h>
7162 7228
7163 7229 /* FIXME Flush the shadow page */
7164 7230 int unset_mm_mapping(int xc_handle, uint32_t domid,
7165 7231 unsigned long nr_pages, unsigned int address_bits,
7166 7232 xen_pfn_t *extent_start)
7167 7233 {
7168 7234 int err = 0;
7169 7235 xc_dominfo_t info;
7170 7236
7171 7237 xc_domain_getinfo(xc_handle, domid, 1, &info);
7172 7238 if ((info.nr_pages - nr_pages) <= 0) {
7173 7239 fprintf(stderr, "unset_mm_mapping: error nr_pages\n");
7174 7240 err = -1;
7175 7241 }
7176 7242
7177 7243 err = xc_domain_memory_decrease_reservation(xc_handle, domid,
7178 7244 nr_pages, 0, extent_start);
7179 7245 if (err)
7180 7246 fprintf(stderr, "Failed to decrease physmap\n");
7181 7247
7182 7248
7183 7249 if (xc_domain_setmaxmem(xc_handle, domid, (info.nr_pages - nr_pages) *
7184 7250 PAGE_SIZE/1024) != 0) {
7185 7251 fprintf(logfile, "set maxmem returned error %d\n", errno);
7186 7252 err = -1;
7187 7253 }
7188 7254
7189 7255 return err;
7190 7256 }
7191 7257
7192 7258 int set_mm_mapping(int xc_handle, uint32_t domid,
7193 7259 unsigned long nr_pages, unsigned int address_bits,
7194 7260 xen_pfn_t *extent_start)
7195 7261 {
7196 7262 xc_dominfo_t info;
7197 7263 int err = 0;
7198 7264
7199 7265 xc_domain_getinfo(xc_handle, domid, 1, &info);
7200 7266
7201 7267 if (xc_domain_setmaxmem(xc_handle, domid, info.max_memkb +
7202 7268 nr_pages * PAGE_SIZE/1024) != 0) {
7203 7269 fprintf(logfile, "set maxmem returned error %d\n", errno);
7204 7270 return -1;
7205 7271 }
7206 7272
7207 7273 err = xc_domain_memory_populate_physmap(xc_handle, domid, nr_pages, 0,
7208 7274 address_bits, extent_start);
7209 7275 if (err) {
7210 7276 fprintf(stderr, "Failed to populate physmap\n");
7211 7277 return -1;
7212 7278 }
7213 7279
7214 7280 return 0;
7215 7281 }
7216 7282
7217 7283 void suspend(int sig)
7218 7284 {
7219 7285 fprintf(logfile, "suspend sig handler called with requested=%d!\n",
7220 7286 suspend_requested);
7221 7287 if (sig != SIGUSR1)
7222 7288 fprintf(logfile, "suspend signal dismatch, get sig=%d!\n", sig);
7223 7289 suspend_requested = 1;
7224 7290 }
7225 7291
7226 7292 #if defined(MAPCACHE)
7227 7293
7228 7294 #if defined(__i386__)
7229 7295 #define MAX_MCACHE_SIZE 0x40000000 /* 1GB max for x86 */
7230 7296 #define MCACHE_BUCKET_SHIFT 16
7231 7297 #elif defined(__x86_64__)
7232 7298 #define MAX_MCACHE_SIZE 0x1000000000 /* 64GB max for x86_64 */
7233 7299 #define MCACHE_BUCKET_SHIFT 20
7234 7300 #endif
7235 7301
7236 7302 #define MCACHE_BUCKET_SIZE (1UL << MCACHE_BUCKET_SHIFT)
7237 7303
7238 7304 #define BITS_PER_LONG (sizeof(long)*8)
7239 7305 #define BITS_TO_LONGS(bits) \
7240 7306 (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
7241 7307 #define DECLARE_BITMAP(name,bits) \
7242 7308 unsigned long name[BITS_TO_LONGS(bits)]
7243 7309 #define test_bit(bit,map) \
7244 7310 (!!((map)[(bit)/BITS_PER_LONG] & (1UL << ((bit)%BITS_PER_LONG))))
7245 7311
7246 7312 struct map_cache {
7247 7313 unsigned long paddr_index;
7248 7314 uint8_t *vaddr_base;
7249 7315 DECLARE_BITMAP(valid_mapping, MCACHE_BUCKET_SIZE>>PAGE_SHIFT);
7250 7316 };
7251 7317
7252 7318 static struct map_cache *mapcache_entry;
7253 7319 static unsigned long nr_buckets;
7254 7320
7255 7321 /* For most cases (>99.9%), the page address is the same. */
7256 7322 static unsigned long last_address_index = ~0UL;
7257 7323 static uint8_t *last_address_vaddr;
7258 7324
7259 7325 static int qemu_map_cache_init(void)
7260 7326 {
7261 7327 unsigned long size;
7262 7328
7263 7329 nr_buckets = (((MAX_MCACHE_SIZE >> PAGE_SHIFT) +
7264 7330 (1UL << (MCACHE_BUCKET_SHIFT - PAGE_SHIFT)) - 1) >>
7265 7331 (MCACHE_BUCKET_SHIFT - PAGE_SHIFT));
7266 7332 fprintf(logfile, "qemu_map_cache_init nr_buckets = %lx\n", nr_buckets);
7267 7333
7268 7334 /*
7269 7335 * Use mmap() directly: lets us allocate a big hash table with no up-front
7270 7336 * cost in storage space. The OS will allocate memory only for the buckets
7271 7337 * that we actually use. All others will contain all zeroes.
7272 7338 */
7273 7339 size = nr_buckets * sizeof(struct map_cache);
7274 7340 size = (size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
7275 7341 mapcache_entry = mmap(NULL, size, PROT_READ|PROT_WRITE,
7276 7342 MAP_SHARED|MAP_ANONYMOUS, -1, 0);
7277 7343 if (mapcache_entry == MAP_FAILED) {
7278 7344 errno = ENOMEM;
7279 7345 return -1;
7280 7346 }
7281 7347
7282 7348 return 0;
7283 7349 }
7284 7350
7285 7351 static void qemu_remap_bucket(struct map_cache *entry,
7286 7352 unsigned long address_index)
7287 7353 {
7288 7354 uint8_t *vaddr_base;
7289 7355 unsigned long pfns[MCACHE_BUCKET_SIZE >> PAGE_SHIFT];
7290 7356 unsigned int i, j;
7291 7357
7292 7358 if (entry->vaddr_base != NULL) {
7293 7359 errno = munmap(entry->vaddr_base, MCACHE_BUCKET_SIZE);
7294 7360 if (errno) {
7295 7361 fprintf(logfile, "unmap fails %d\n", errno);
7296 7362 exit(-1);
7297 7363 }
7298 7364 }
7299 7365
7300 7366 for (i = 0; i < MCACHE_BUCKET_SIZE >> PAGE_SHIFT; i++)
7301 7367 pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT-PAGE_SHIFT)) + i;
7302 7368
7303 7369 vaddr_base = xc_map_foreign_batch(xc_handle, domid, PROT_READ|PROT_WRITE,
7304 7370 pfns, MCACHE_BUCKET_SIZE >> PAGE_SHIFT);
7305 7371 if (vaddr_base == NULL) {
7306 7372 fprintf(logfile, "xc_map_foreign_batch error %d\n", errno);
7307 7373 exit(-1);
7308 7374 }
7309 7375
7310 7376 entry->vaddr_base = vaddr_base;
7311 7377 entry->paddr_index = address_index;
7312 7378
7313 7379 for (i = 0; i < MCACHE_BUCKET_SIZE >> PAGE_SHIFT; i += BITS_PER_LONG) {
7314 7380 unsigned long word = 0;
7315 7381 j = ((i + BITS_PER_LONG) > (MCACHE_BUCKET_SIZE >> PAGE_SHIFT)) ?
7316 7382 (MCACHE_BUCKET_SIZE >> PAGE_SHIFT) % BITS_PER_LONG : BITS_PER_LONG;
7317 7383 while (j > 0)
7318 7384 word = (word << 1) | (((pfns[i + --j] >> 28) & 0xf) != 0xf);
7319 7385 entry->valid_mapping[i / BITS_PER_LONG] = word;
7320 7386 }
7321 7387 }
7322 7388
7323 7389 uint8_t *qemu_map_cache(target_phys_addr_t phys_addr)
7324 7390 {
7325 7391 struct map_cache *entry;
7326 7392 unsigned long address_index = phys_addr >> MCACHE_BUCKET_SHIFT;
7327 7393 unsigned long address_offset = phys_addr & (MCACHE_BUCKET_SIZE-1);
7328 7394
7329 7395 if (address_index == last_address_index)
7330 7396 return last_address_vaddr + address_offset;
7331 7397
7332 7398 entry = &mapcache_entry[address_index % nr_buckets];
7333 7399
7334 7400 if (entry->vaddr_base == NULL || entry->paddr_index != address_index ||
7335 7401 !test_bit(address_offset>>PAGE_SHIFT, entry->valid_mapping))
7336 7402 qemu_remap_bucket(entry, address_index);
7337 7403
7338 7404 if (!test_bit(address_offset>>PAGE_SHIFT, entry->valid_mapping))
7339 7405 return NULL;
7340 7406
7341 7407 last_address_index = address_index;
7342 7408 last_address_vaddr = entry->vaddr_base;
7343 7409
7344 7410 return last_address_vaddr + address_offset;
7345 7411 }
7346 7412
7347 7413 void qemu_invalidate_map_cache(void)
7348 7414 {
7349 7415 unsigned long i;
7350 7416
7351 7417 mapcache_lock();
7352 7418
7353 7419 for (i = 0; i < nr_buckets; i++) {
7354 7420 struct map_cache *entry = &mapcache_entry[i];
7355 7421
7356 7422 if (entry->vaddr_base == NULL)
7357 7423 continue;
7358 7424
7359 7425 errno = munmap(entry->vaddr_base, MCACHE_BUCKET_SIZE);
7360 7426 if (errno) {
7361 7427 fprintf(logfile, "unmap fails %d\n", errno);
7362 7428 exit(-1);
7363 7429 }
7364 7430
7365 7431 entry->paddr_index = 0;
7366 7432 entry->vaddr_base = NULL;
7367 7433 }
7368 7434
7369 7435 last_address_index = ~0UL;
7370 7436 last_address_vaddr = NULL;
7371 7437
7372 7438 mapcache_unlock();
7373 7439 }
7374 7440
7375 7441 #endif /* defined(MAPCACHE) */
7376 7442
7377 7443 int main(int argc, char **argv)
7378 7444 {
7379 7445 #ifdef CONFIG_GDBSTUB
7380 7446 int use_gdbstub, gdbstub_port;
7381 7447 #endif
7382 7448 int i;
7383 7449 #ifndef CONFIG_DM
7384 7450 int cdrom_index;
7385 7451 #endif /* !CONFIG_DM */
7386 7452 int snapshot, linux_boot;
7387 7453 const char *initrd_filename;
7388 7454 #ifndef CONFIG_DM
7389 7455 const char *hd_filename[MAX_DISKS + MAX_SCSI_DISKS];
7390 7456 #endif /* !CONFIG_DM */
7391 7457 const char *fd_filename[MAX_FD];
7392 7458 const char *kernel_filename, *kernel_cmdline;
7393 7459 DisplayState *ds = &display_state;
7394 7460 int cyls, heads, secs, translation;
7395 7461 char net_clients[MAX_NET_CLIENTS][256];
7396 7462 int nb_net_clients;
7397 7463 int optind;
7398 7464 const char *r, *optarg;
7399 7465 CharDriverState *monitor_hd;
7400 7466 char monitor_device[128];
7401 7467 char serial_devices[MAX_SERIAL_PORTS][128];
7402 7468 int serial_device_index;
7403 7469 char parallel_devices[MAX_PARALLEL_PORTS][128];
7404 7470 int parallel_device_index;
7405 7471 const char *loadvm = NULL;
7406 7472 QEMUMachine *machine;
7407 7473 char usb_devices[MAX_USB_CMDLINE][128];
7408 7474 int usb_devices_index;
7409 7475 int fds[2];
7410 7476 unsigned long ioreq_pfn;
7411 7477 extern void *shared_page;
7412 7478 extern void *buffered_io_page;
7413 7479 #ifdef __ia64__
7414 7480 unsigned long nr_pages;
7415 7481 xen_pfn_t *page_array;
7416 7482 extern void *buffered_pio_page;
7417 7483 #endif
7418 7484
7419 7485 char qemu_dm_logfilename[64];
7420 7486
7421 7487 LIST_INIT (&vm_change_state_head);
7422 7488 #ifndef _WIN32
7423 7489 {
7424 7490 struct sigaction act;
7425 7491 sigfillset(&act.sa_mask);
7426 7492 act.sa_flags = 0;
7427 7493 act.sa_handler = SIG_IGN;
7428 7494 sigaction(SIGPIPE, &act, NULL);
7429 7495 }
7430 7496 #else
7431 7497 SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
7432 7498 /* Note: cpu_interrupt() is currently not SMP safe, so we force
7433 7499 QEMU to run on a single CPU */
7434 7500 {
7435 7501 HANDLE h;
7436 7502 DWORD mask, smask;
7437 7503 int i;
7438 7504 h = GetCurrentProcess();
7439 7505 if (GetProcessAffinityMask(h, &mask, &smask)) {
7440 7506 for(i = 0; i < 32; i++) {
7441 7507 if (mask & (1 << i))
7442 7508 break;
7443 7509 }
7444 7510 if (i != 32) {
7445 7511 mask = 1 << i;
7446 7512 SetProcessAffinityMask(h, mask);
7447 7513 }
7448 7514 }
7449 7515 }
7450 7516 #endif
7451 7517
7452 7518 register_machines();
7453 7519 machine = first_machine;
7454 7520 initrd_filename = NULL;
7455 7521 for(i = 0; i < MAX_FD; i++)
7456 7522 fd_filename[i] = NULL;
7457 7523 #ifndef CONFIG_DM
7458 7524 for(i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++)
7459 7525 hd_filename[i] = NULL;
7460 7526 #endif /* !CONFIG_DM */
7461 7527 ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
7462 7528 vga_ram_size = VGA_RAM_SIZE;
7463 7529 bios_size = BIOS_SIZE;
7464 7530 #ifdef CONFIG_GDBSTUB
7465 7531 use_gdbstub = 0;
7466 7532 gdbstub_port = DEFAULT_GDBSTUB_PORT;
7467 7533 #endif
7468 7534 snapshot = 0;
7469 7535 nographic = 0;
7470 7536 vncviewer = 0;
7471 7537 vncunused = 0;
7472 7538 kernel_filename = NULL;
7473 7539 kernel_cmdline = "";
7474 7540 *vncpasswd = '\0';
7475 7541 #ifndef CONFIG_DM
7476 7542 #ifdef TARGET_PPC
7477 7543 cdrom_index = 1;
7478 7544 #else
7479 7545 cdrom_index = 2;
7480 7546 #endif
7481 7547 #endif /* !CONFIG_DM */
7482 7548 cyls = heads = secs = 0;
7483 7549 translation = BIOS_ATA_TRANSLATION_AUTO;
7484 7550 pstrcpy(monitor_device, sizeof(monitor_device), "null");
7485 7551
7486 7552 for(i = 0; i < MAX_SERIAL_PORTS; i++)
7487 7553 serial_devices[i][0] = '\0';
7488 7554 serial_device_index = 0;
7489 7555
7490 7556 pstrcpy(parallel_devices[0], sizeof(parallel_devices[0]), "vc");
7491 7557 for(i = 1; i < MAX_PARALLEL_PORTS; i++)
7492 7558 parallel_devices[i][0] = '\0';
7493 7559 parallel_device_index = 0;
7494 7560
7495 7561 usb_devices_index = 0;
7496 7562
7497 7563 nb_net_clients = 0;
7498 7564
7499 7565 nb_nics = 0;
7500 7566 /* default mac address of the first network interface */
7501 7567
7502 7568 memset(&vnclisten_addr.sin_addr, 0, sizeof(vnclisten_addr.sin_addr));
7503 7569
7504 7570 /* init debug */
7505 7571 sprintf(qemu_dm_logfilename, "/var/log/xen/qemu-dm.%ld.log", (long)getpid());
7506 7572 cpu_set_log_filename(qemu_dm_logfilename);
7507 7573 cpu_set_log(0);
7508 7574
7509 7575 optind = 1;
7510 7576 for(;;) {
7511 7577 if (optind >= argc)
7512 7578 break;
7513 7579 r = argv[optind];
7514 7580 if (r[0] != '-') {
7515 7581 #ifndef CONFIG_DM
7516 7582 hd_filename[0] = argv[optind++];
7517 7583 #else
7518 7584 help();
7519 7585 #endif /* !CONFIG_DM */
7520 7586 } else {
7521 7587 const QEMUOption *popt;
7522 7588
7523 7589 optind++;
7524 7590 /* Treat --foo the same as -foo. */
7525 7591 if (r[1] == '-')
7526 7592 r++;
7527 7593 popt = qemu_options;
7528 7594 for(;;) {
7529 7595 if (!popt->name) {
7530 7596 fprintf(stderr, "%s: invalid option -- '%s'\n",
7531 7597 argv[0], r);
7532 7598 exit(1);
7533 7599 }
7534 7600 if (!strcmp(popt->name, r + 1))
7535 7601 break;
7536 7602 popt++;
7537 7603 }
7538 7604 if (popt->flags & HAS_ARG) {
7539 7605 if (optind >= argc) {
7540 7606 fprintf(stderr, "%s: option '%s' requires an argument\n",
7541 7607 argv[0], r);
7542 7608 exit(1);
7543 7609 }
7544 7610 optarg = argv[optind++];
7545 7611 } else {
7546 7612 optarg = NULL;
7547 7613 }
7548 7614
7549 7615 switch(popt->index) {
7550 7616 case QEMU_OPTION_M:
7551 7617 machine = find_machine(optarg);
7552 7618 if (!machine) {
7553 7619 QEMUMachine *m;
7554 7620 printf("Supported machines are:\n");
7555 7621 for(m = first_machine; m != NULL; m = m->next) {
7556 7622 printf("%-10s %s%s\n",
7557 7623 m->name, m->desc,
7558 7624 m == first_machine ? " (default)" : "");
7559 7625 }
7560 7626 exit(1);
7561 7627 }
7562 7628 break;
7563 7629 case QEMU_OPTION_initrd:
7564 7630 initrd_filename = optarg;
7565 7631 break;
7566 7632 #ifndef CONFIG_DM
7567 7633 case QEMU_OPTION_hda:
7568 7634 case QEMU_OPTION_hdb:
7569 7635 case QEMU_OPTION_hdc:
7570 7636 case QEMU_OPTION_hdd:
7571 7637 {
7572 7638 int hd_index;
7573 7639 hd_index = popt->index - QEMU_OPTION_hda;
7574 7640 hd_filename[hd_index] = optarg;
7575 7641 if (hd_index == cdrom_index)
7576 7642 cdrom_index = -1;
7577 7643 }
7578 7644 break;
7579 7645 #endif /* !CONFIG_DM */
7580 7646 case QEMU_OPTION_snapshot:
7581 7647 snapshot = 1;
7582 7648 break;
7583 7649 case QEMU_OPTION_hdachs:
7584 7650 {
7585 7651 const char *p;
7586 7652 p = optarg;
7587 7653 cyls = strtol(p, (char **)&p, 0);
7588 7654 if (cyls < 1 || cyls > 16383)
7589 7655 goto chs_fail;
7590 7656 if (*p != ',')
7591 7657 goto chs_fail;
7592 7658 p++;
7593 7659 heads = strtol(p, (char **)&p, 0);
7594 7660 if (heads < 1 || heads > 16)
7595 7661 goto chs_fail;
7596 7662 if (*p != ',')
7597 7663 goto chs_fail;
7598 7664 p++;
7599 7665 secs = strtol(p, (char **)&p, 0);
7600 7666 if (secs < 1 || secs > 63)
7601 7667 goto chs_fail;
7602 7668 if (*p == ',') {
7603 7669 p++;
7604 7670 if (!strcmp(p, "none"))
7605 7671 translation = BIOS_ATA_TRANSLATION_NONE;
7606 7672 else if (!strcmp(p, "lba"))
7607 7673 translation = BIOS_ATA_TRANSLATION_LBA;
7608 7674 else if (!strcmp(p, "auto"))
7609 7675 translation = BIOS_ATA_TRANSLATION_AUTO;
7610 7676 else
7611 7677 goto chs_fail;
7612 7678 } else if (*p != '\0') {
7613 7679 chs_fail:
7614 7680 fprintf(stderr, "qemu: invalid physical CHS format\n");
7615 7681 exit(1);
7616 7682 }
7617 7683 }
7618 7684 break;
7619 7685 case QEMU_OPTION_nographic:
7620 7686 if(!strcmp(monitor_device, "vc"))
7621 7687 pstrcpy(monitor_device, sizeof(monitor_device), "null");
7622 7688 if(!strcmp(serial_devices[0], "vc"))
7623 7689 pstrcpy(serial_devices[0], sizeof(serial_devices[0]),
7624 7690 "null");
7625 7691 nographic = 1;
7626 7692 break;
7627 7693 case QEMU_OPTION_kernel:
7628 7694 kernel_filename = optarg;
7629 7695 break;
7630 7696 case QEMU_OPTION_append:
7631 7697 kernel_cmdline = optarg;
7632 7698 break;
7633 7699 #ifndef CONFIG_DM
7634 7700 case QEMU_OPTION_cdrom:
7635 7701 if (cdrom_index >= 0) {
7636 7702 hd_filename[cdrom_index] = optarg;
7637 7703 }
7638 7704 break;
7639 7705 #endif /* !CONFIG_DM */
7640 7706 case QEMU_OPTION_boot:
7641 7707 boot_device = strdup(optarg);
7642 7708 if (strspn(boot_device, "a"
7643 7709 #if defined(TARGET_SPARC) || defined(TARGET_I386)
7644 7710 // Network boot
7645 7711 "n"
7646 7712 #endif
7647 7713 "cd") != strlen(boot_device)) {
7648 7714 fprintf(stderr, "qemu: invalid boot device in '%s'\n", boot_device);
7649 7715 exit(1);
7650 7716 }
7651 7717 break;
7652 7718 case QEMU_OPTION_fda:
7653 7719 fd_filename[0] = optarg;
7654 7720 break;
7655 7721 case QEMU_OPTION_fdb:
7656 7722 fd_filename[1] = optarg;
7657 7723 break;
7658 7724 #ifdef TARGET_I386
7659 7725 case QEMU_OPTION_no_fd_bootchk:
7660 7726 fd_bootchk = 0;
7661 7727 break;
7662 7728 #endif
7663 7729 #ifdef USE_CODE_COPY
7664 7730 case QEMU_OPTION_no_code_copy:
7665 7731 code_copy_enabled = 0;
7666 7732 break;
7667 7733 #endif
7668 7734 case QEMU_OPTION_net:
7669 7735 if (nb_net_clients >= MAX_NET_CLIENTS) {
7670 7736 fprintf(stderr, "qemu: too many network clients\n");
7671 7737 exit(1);
7672 7738 }
7673 7739 pstrcpy(net_clients[nb_net_clients],
7674 7740 sizeof(net_clients[0]),
7675 7741 optarg);
7676 7742 nb_net_clients++;
7677 7743 break;
7678 7744 #ifdef CONFIG_SLIRP
7679 7745 case QEMU_OPTION_tftp:
7680 7746 tftp_prefix = optarg;
7681 7747 break;
7682 7748 #ifndef _WIN32
7683 7749 case QEMU_OPTION_smb:
7684 7750 net_slirp_smb(optarg);
7685 7751 break;
7686 7752 #endif
7687 7753 case QEMU_OPTION_redir:
7688 7754 net_slirp_redir(optarg);
7689 7755 break;
7690 7756 #endif
7691 7757 #ifdef HAS_AUDIO
7692 7758 case QEMU_OPTION_audio_help:
7693 7759 AUD_help ();
7694 7760 exit (0);
7695 7761 break;
7696 7762 case QEMU_OPTION_soundhw:
7697 7763 select_soundhw (optarg);
7698 7764 break;
7699 7765 #endif
7700 7766 case QEMU_OPTION_h:
7701 7767 help();
7702 7768 break;
7703 7769 case QEMU_OPTION_m:
7704 7770 ram_size = atol(optarg) * 1024 * 1024;
7705 7771 ram_size = (uint64_t)atol(optarg) * 1024 * 1024;
7706 7772 if (ram_size <= 0)
7707 7773 help();
7708 7774 #ifndef CONFIG_DM
7709 7775 if (ram_size > PHYS_RAM_MAX_SIZE) {
7710 7776 fprintf(stderr, "qemu: at most %d MB RAM can be simulated\n",
7711 7777 PHYS_RAM_MAX_SIZE / (1024 * 1024));
7712 7778 exit(1);
7713 7779 }
7714 7780 #endif /* !CONFIG_DM */
7715 7781 break;
7716 7782 case QEMU_OPTION_l:
7717 7783 {
7718 7784 int mask;
7719 7785 CPULogItem *item;
7720 7786
7721 7787 mask = cpu_str_to_log_mask(optarg);
7722 7788 if (!mask) {
7723 7789 printf("Log items (comma separated):\n");
7724 7790 for(item = cpu_log_items; item->mask != 0; item++) {
7725 7791 printf("%-10s %s\n", item->name, item->help);
7726 7792 }
7727 7793 exit(1);
7728 7794 }
7729 7795 cpu_set_log(mask);
7730 7796 }
7731 7797 break;
7732 7798 #ifdef CONFIG_GDBSTUB
7733 7799 case QEMU_OPTION_s:
7734 7800 use_gdbstub = 1;
7735 7801 break;
7736 7802 case QEMU_OPTION_p:
7737 7803 gdbstub_port = atoi(optarg);
7738 7804 break;
7739 7805 #endif
7740 7806 case QEMU_OPTION_L:
7741 7807 bios_dir = optarg;
7742 7808 break;
7743 7809 case QEMU_OPTION_S:
7744 7810 autostart = 0;
7745 7811 break;
7746 7812 case QEMU_OPTION_k:
7747 7813 keyboard_layout = optarg;
7748 7814 break;
7749 7815 case QEMU_OPTION_localtime:
7750 7816 rtc_utc = 0;
7751 7817 break;
7752 7818 case QEMU_OPTION_cirrusvga:
7753 7819 cirrus_vga_enabled = 1;
7754 7820 break;
7755 7821 case QEMU_OPTION_std_vga:
7756 7822 cirrus_vga_enabled = 0;
7757 7823 break;
7758 7824 case QEMU_OPTION_g:
7759 7825 {
7760 7826 const char *p;
7761 7827 int w, h, depth;
7762 7828 p = optarg;
7763 7829 w = strtol(p, (char **)&p, 10);
7764 7830 if (w <= 0) {
7765 7831 graphic_error:
7766 7832 fprintf(stderr, "qemu: invalid resolution or depth\n");
7767 7833 exit(1);
7768 7834 }
7769 7835 if (*p != 'x')
7770 7836 goto graphic_error;
7771 7837 p++;
7772 7838 h = strtol(p, (char **)&p, 10);
7773 7839 if (h <= 0)
7774 7840 goto graphic_error;
7775 7841 if (*p == 'x') {
7776 7842 p++;
7777 7843 depth = strtol(p, (char **)&p, 10);
7778 7844 if (depth != 8 && depth != 15 && depth != 16 &&
7779 7845 depth != 24 && depth != 32)
7780 7846 goto graphic_error;
7781 7847 } else if (*p == '\0') {
7782 7848 depth = graphic_depth;
7783 7849 } else {
7784 7850 goto graphic_error;
7785 7851 }
7786 7852
7787 7853 graphic_width = w;
7788 7854 graphic_height = h;
7789 7855 graphic_depth = depth;
7790 7856 }
7791 7857 break;
7792 7858 case QEMU_OPTION_monitor:
7793 7859 pstrcpy(monitor_device, sizeof(monitor_device), optarg);
7794 7860 break;
7795 7861 case QEMU_OPTION_serial:
7796 7862 if (serial_device_index >= MAX_SERIAL_PORTS) {
7797 7863 fprintf(stderr, "qemu: too many serial ports\n");
7798 7864 exit(1);
7799 7865 }
7800 7866 pstrcpy(serial_devices[serial_device_index],
7801 7867 sizeof(serial_devices[0]), optarg);
7802 7868 serial_device_index++;
7803 7869 break;
7804 7870 case QEMU_OPTION_parallel:
7805 7871 if (parallel_device_index >= MAX_PARALLEL_PORTS) {
7806 7872 fprintf(stderr, "qemu: too many parallel ports\n");
7807 7873 exit(1);
7808 7874 }
7809 7875 pstrcpy(parallel_devices[parallel_device_index],
7810 7876 sizeof(parallel_devices[0]), optarg);
7811 7877 parallel_device_index++;
7812 7878 break;
7813 7879 case QEMU_OPTION_loadvm:
7814 7880 loadvm = optarg;
7815 7881 break;
7816 7882 case QEMU_OPTION_full_screen:
7817 7883 full_screen = 1;
7818 7884 break;
7819 7885 #ifdef CONFIG_SDL
7820 7886 case QEMU_OPTION_no_quit:
7821 7887 no_quit = 1;
7822 7888 break;
7823 7889 #endif
7824 7890 case QEMU_OPTION_pidfile:
7825 7891 create_pidfile(optarg);
7826 7892 break;
7827 7893 #ifdef TARGET_I386
7828 7894 case QEMU_OPTION_win2k_hack:
7829 7895 win2k_install_hack = 1;
7830 7896 break;
7831 7897 #endif
7832 7898 #ifdef USE_KQEMU
7833 7899 case QEMU_OPTION_no_kqemu:
7834 7900 kqemu_allowed = 0;
7835 7901 break;
7836 7902 case QEMU_OPTION_kernel_kqemu:
7837 7903 kqemu_allowed = 2;
7838 7904 break;
7839 7905 #endif
7840 7906 case QEMU_OPTION_usb:
7841 7907 usb_enabled = 1;
7842 7908 break;
7843 7909 case QEMU_OPTION_usbdevice:
7844 7910 usb_enabled = 1;
7845 7911 if (usb_devices_index >= MAX_USB_CMDLINE) {
7846 7912 fprintf(stderr, "Too many USB devices\n");
7847 7913 exit(1);
7848 7914 }
7849 7915 pstrcpy(usb_devices[usb_devices_index],
7850 7916 sizeof(usb_devices[usb_devices_index]),
7851 7917 optarg);
7852 7918 usb_devices_index++;
7853 7919 break;
7854 7920 case QEMU_OPTION_smp:
7855 7921 smp_cpus = atoi(optarg);
7856 7922 if (smp_cpus < 1 || smp_cpus > MAX_CPUS) {
7857 7923 fprintf(stderr, "Invalid number of CPUs\n");
7858 7924 exit(1);
7859 7925 }
7860 7926 break;
7861 7927 case QEMU_OPTION_vnc:
7862 7928 vnc_display = optarg;
7863 7929 break;
7864 7930 case QEMU_OPTION_no_acpi:
7865 7931 acpi_enabled = 0;
7866 7932 break;
7867 7933 case QEMU_OPTION_no_reboot:
7868 7934 no_reboot = 1;
7869 7935 break;
7870 7936 case QEMU_OPTION_daemonize:
7871 7937 daemonize = 1;
7872 7938 break;
7873 7939 case QEMU_OPTION_option_rom:
7874 7940 if (nb_option_roms >= MAX_OPTION_ROMS) {
7875 7941 fprintf(stderr, "Too many option ROMs\n");
7876 7942 exit(1);
7877 7943 }
7878 7944 option_rom[nb_option_roms] = optarg;
7879 7945 nb_option_roms++;
7880 7946 break;
7881 7947 case QEMU_OPTION_semihosting:
7882 7948 semihosting_enabled = 1;
7883 7949 break;
7884 7950 case QEMU_OPTION_domainname:
7885 7951 snprintf(domain_name, sizeof(domain_name),
7886 7952 "xVM-HVM-%s", optarg);
7887 7953 break;
7888 7954 case QEMU_OPTION_d:
7889 7955 domid = atoi(optarg);
7890 7956 fprintf(logfile, "domid: %d\n", domid);
7891 7957 break;
7892 7958 case QEMU_OPTION_vcpus:
7893 7959 vcpus = atoi(optarg);
7894 7960 fprintf(logfile, "qemu: the number of cpus is %d\n", vcpus);
7895 7961 break;
7896 7962 case QEMU_OPTION_timeoffset:
7897 7963 timeoffset = strtol(optarg, NULL, 0);
7898 7964 break;
7899 7965 case QEMU_OPTION_acpi:
7900 7966 acpi_enabled = 1;
7901 7967 break;
7902 7968 case QEMU_OPTION_vncviewer:
7903 7969 vncviewer++;
7904 7970 break;
7905 7971 case QEMU_OPTION_vncunused:
7906 7972 vncunused++;
7907 7973 break;
7908 7974 case QEMU_OPTION_vnclisten:
7909 7975 parse_host(&vnclisten_addr, optarg);
7910 7976 break;
7911 7977 }
7912 7978 }
7913 7979 }
7914 7980
7915 7981 #ifndef _WIN32
7916 7982 if (daemonize && !nographic && vnc_display == NULL && vncunused == 0) {
7917 7983 fprintf(stderr, "Can only daemonize if using -nographic or -vnc\n");
7918 7984 daemonize = 0;
7919 7985 }
7920 7986
7921 7987 if (daemonize) {
7922 7988 pid_t pid;
7923 7989
7924 7990 if (pipe(fds) == -1)
7925 7991 exit(1);
7926 7992
7927 7993 pid = fork();
7928 7994 if (pid > 0) {
7929 7995 uint8_t status;
7930 7996 ssize_t len;
7931 7997
7932 7998 close(fds[1]);
7933 7999
7934 8000 again:
7935 8001 len = read(fds[0], &status, 1);
7936 8002 if (len == -1 && (errno == EINTR))
7937 8003 goto again;
7938 8004
7939 8005 if (len != 1 || status != 0)
7940 8006 exit(1);
7941 8007 else
7942 8008 exit(0);
7943 8009 } else if (pid < 0)
7944 8010 exit(1);
7945 8011
7946 8012 setsid();
7947 8013
7948 8014 pid = fork();
7949 8015 if (pid > 0)
7950 8016 exit(0);
7951 8017 else if (pid < 0)
7952 8018 exit(1);
7953 8019
7954 8020 umask(027);
7955 8021 chdir("/");
7956 8022
7957 8023 signal(SIGTSTP, SIG_IGN);
7958 8024 signal(SIGTTOU, SIG_IGN);
7959 8025 signal(SIGTTIN, SIG_IGN);
7960 8026 }
7961 8027 #endif
7962 8028
7963 8029 #ifdef CONFIG_DM
7964 8030 bdrv_init();
7965 8031 xenstore_parse_domain_config(domid);
7966 8032 #endif /* CONFIG_DM */
7967 8033
7968 8034 #ifdef USE_KQEMU
7969 8035 if (smp_cpus > 1)
7970 8036 kqemu_allowed = 0;
7971 8037 #endif
7972 8038 linux_boot = (kernel_filename != NULL);
7973 8039
7974 8040 #ifndef CONFIG_DM
7975 8041 if (!linux_boot &&
7976 8042 hd_filename[0] == '\0' &&
7977 8043 (cdrom_index >= 0 && hd_filename[cdrom_index] == '\0') &&
7978 8044 fd_filename[0] == '\0')
7979 8045 help();
7980 8046
7981 8047 /* boot to floppy or the default cd if no hard disk defined yet */
7982 8048 if (hd_filename[0] == '\0' && boot_device == 'c') {
7983 8049 if (fd_filename[0] != '\0')
7984 8050 boot_device = 'a';
7985 8051 else
7986 8052 boot_device = 'd';
7987 8053 }
7988 8054 #endif /* !CONFIG_DM */
7989 8055
7990 8056 setvbuf(stdout, NULL, _IOLBF, 0);
7991 8057
7992 8058 init_timers();
7993 8059 init_timer_alarm();
7994 8060 qemu_aio_init();
7995 8061
7996 8062 #ifdef _WIN32
7997 8063 socket_init();
7998 8064 #endif
7999 8065
8000 8066 #ifndef CONFIG_DM
8001 8067 /* init network clients */
8002 8068 if (nb_net_clients == 0) {
8003 8069 /* if no clients, we use a default config */
8004 8070 pstrcpy(net_clients[0], sizeof(net_clients[0]),
8005 8071 "nic");
8006 8072 pstrcpy(net_clients[1], sizeof(net_clients[0]),
8007 8073 "user");
8008 8074 nb_net_clients = 2;
8009 8075 }
8010 8076 #endif /* !CONFIG_DM */
8011 8077
8012 8078 for(i = 0;i < nb_net_clients; i++) {
8013 8079 if (net_client_init(net_clients[i]) < 0)
8014 8080 exit(1);
8015 8081 }
8016 8082
8017 8083 #ifndef CONFIG_DM
8018 8084 #ifdef TARGET_I386
8019 8085 if (boot_device == 'n') {
8020 8086 for (i = 0; i < nb_nics; i++) {
8021 8087 const char *model = nd_table[i].model;
8022 8088 char buf[1024];
8023 8089 if (model == NULL)
8024 8090 model = "ne2k_pci";
8025 8091 snprintf(buf, sizeof(buf), "%s/pxe-%s.bin", bios_dir, model);
8026 8092 if (get_image_size(buf) > 0) {
8027 8093 option_rom[nb_option_roms] = strdup(buf);
8028 8094 nb_option_roms++;
8029 8095 break;
8030 8096 }
8031 8097 }
8032 8098 if (i == nb_nics) {
8033 8099 fprintf(stderr, "No valid PXE rom found for network device\n");
8034 8100 exit(1);
8035 8101 }
8036 8102 boot_device = 'c'; /* to prevent confusion by the BIOS */
8037 8103 }
8038 8104 #endif
8039 8105 #endif /* !CONFIG_DM */
8040 8106
8041 8107 #if defined (__ia64__)
8042 8108 if (ram_size > MMIO_START)
8043 8109 ram_size += 1 * MEM_G; /* skip 3G-4G MMIO, LEGACY_IO_SPACE etc. */
8044 8110 #endif
8045 8111
8046 8112 /* init the memory */
8047 8113 phys_ram_size = ram_size + vga_ram_size + bios_size;
8048 8114
8049 8115 #ifndef CONFIG_DM
8050 8116 for (i = 0; i < nb_option_roms; i++) {
8051 8117 int ret = get_image_size(option_rom[i]);
8052 8118 if (ret == -1) {
8053 8119 fprintf(stderr, "Could not load option rom '%s'\n", option_rom[i]);
8054 8120 exit(1);
8055 8121 }
8056 8122 phys_ram_size += ret;
8057 8123 }
8058 8124 #endif /* !CONFIG_DM */
8059 8125
8060 8126 #ifdef CONFIG_DM
8061 8127
8062 8128 xc_handle = xc_interface_open();
8063 8129
8064 8130 #if defined(__i386__) || defined(__x86_64__)
8065 8131
8066 8132 if (qemu_map_cache_init()) {
8067 8133 fprintf(logfile, "qemu_map_cache_init returned: error %d\n", errno);
8068 8134 exit(-1);
8069 8135 }
8070 8136
8071 8137 xc_get_hvm_param(xc_handle, domid, HVM_PARAM_IOREQ_PFN, &ioreq_pfn);
8072 8138 fprintf(logfile, "shared page at pfn %lx\n", ioreq_pfn);
8073 8139 shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
8074 8140 PROT_READ|PROT_WRITE, ioreq_pfn);
8075 8141 if (shared_page == NULL) {
8076 8142 fprintf(logfile, "map shared IO page returned error %d\n", errno);
8077 8143 exit(-1);
8078 8144 }
8079 8145
8080 8146 xc_get_hvm_param(xc_handle, domid, HVM_PARAM_BUFIOREQ_PFN, &ioreq_pfn);
8081 8147 fprintf(logfile, "buffered io page at pfn %lx\n", ioreq_pfn);
8082 8148 buffered_io_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
8083 8149 PROT_READ|PROT_WRITE, ioreq_pfn);
8084 8150 if (buffered_io_page == NULL) {
8085 8151 fprintf(logfile, "map buffered IO page returned error %d\n", errno);
8086 8152 exit(-1);
8087 8153 }
8088 8154
8089 8155 #elif defined(__ia64__)
8090 8156
8091 8157 nr_pages = ram_size/PAGE_SIZE;
8092 8158
8093 8159 page_array = (xen_pfn_t *)malloc(nr_pages * sizeof(xen_pfn_t));
8094 8160 if (page_array == NULL) {
8095 8161 fprintf(logfile, "malloc returned error %d\n", errno);
8096 8162 exit(-1);
8097 8163 }
8098 8164
8099 8165 shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
8100 8166 PROT_READ|PROT_WRITE,
8101 8167 IO_PAGE_START >> PAGE_SHIFT);
8102 8168
8103 8169 buffered_io_page =xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
8104 8170 PROT_READ|PROT_WRITE,
8105 8171 BUFFER_IO_PAGE_START >> PAGE_SHIFT);
8106 8172
8107 8173 buffered_pio_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
8108 8174 PROT_READ|PROT_WRITE,
8109 8175 BUFFER_PIO_PAGE_START >> PAGE_SHIFT);
8110 8176
8111 8177 for (i = 0; i < nr_pages; i++)
8112 8178 page_array[i] = i;
8113 8179
8114 8180 /* VTI will not use memory between 3G~4G, so we just pass a legal pfn
8115 8181 to make QEMU map continuous virtual memory space */
8116 8182 if (ram_size > MMIO_START) {
8117 8183 for (i = 0 ; i < (MEM_G >> PAGE_SHIFT); i++)
8118 8184 page_array[(MMIO_START >> PAGE_SHIFT) + i] =
8119 8185 (STORE_PAGE_START >> PAGE_SHIFT);
8120 8186 }
8121 8187
8122 8188 phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
8123 8189 PROT_READ|PROT_WRITE,
8124 8190 page_array, nr_pages);
8125 8191 if (phys_ram_base == 0) {
8126 8192 fprintf(logfile, "xc_map_foreign_batch returned error %d\n", errno);
8127 8193 exit(-1);
8128 8194 }
8129 8195 free(page_array);
8130 8196 #endif
8131 8197
8132 8198 timeoffset_get();
8133 8199
8134 8200 #else /* !CONFIG_DM */
8135 8201
8136 8202 phys_ram_base = qemu_vmalloc(phys_ram_size);
8137 8203 if (!phys_ram_base) {
8138 8204 fprintf(stderr, "Could not allocate physical memory\n");
8139 8205 exit(1);
8140 8206 }
8141 8207
8142 8208 #endif /* !CONFIG_DM */
8143 8209
8144 8210 #ifndef CONFIG_DM
8145 8211 /* we always create the cdrom drive, even if no disk is there */
8146 8212 bdrv_init();
8147 8213 if (cdrom_index >= 0) {
8148 8214 bs_table[cdrom_index] = bdrv_new("cdrom");
8149 8215 bdrv_set_type_hint(bs_table[cdrom_index], BDRV_TYPE_CDROM);
8150 8216 }
8151 8217
8152 8218 /* open the virtual block devices */
8153 8219 for(i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++) {
8154 8220 if (hd_filename[i]) {
8155 8221 if (!bs_table[i]) {
8156 8222 char buf[64];
8157 8223 snprintf(buf, sizeof(buf), "hd%c", i + 'a');
8158 8224 bs_table[i] = bdrv_new(buf);
8159 8225 }
8160 8226 if (bdrv_open(bs_table[i], hd_filename[i], snapshot ? BDRV_O_SNAPSHOT : 0) < 0) {
8161 8227 fprintf(stderr, "qemu: could not open hard disk image '%s'\n",
8162 8228 hd_filename[i]);
8163 8229 exit(1);
8164 8230 }
8165 8231 if (i == 0 && cyls != 0) {
8166 8232 bdrv_set_geometry_hint(bs_table[i], cyls, heads, secs);
8167 8233 bdrv_set_translation_hint(bs_table[i], translation);
8168 8234 }
8169 8235 }
8170 8236 }
8171 8237 #endif /* !CONFIG_DM */
8172 8238
8173 8239 /* we always create at least one floppy disk */
8174 8240 fd_table[0] = bdrv_new("fda");
8175 8241 bdrv_set_type_hint(fd_table[0], BDRV_TYPE_FLOPPY);
8176 8242
8177 8243 for(i = 0; i < MAX_FD; i++) {
8178 8244 if (fd_filename[i]) {
8179 8245 if (!fd_table[i]) {
8180 8246 char buf[64];
8181 8247 snprintf(buf, sizeof(buf), "fd%c", i + 'a');
8182 8248 fd_table[i] = bdrv_new(buf);
8183 8249 bdrv_set_type_hint(fd_table[i], BDRV_TYPE_FLOPPY);
8184 8250 }
8185 8251 if (fd_filename[i] != '\0') {
8186 8252 if (bdrv_open(fd_table[i], fd_filename[i],
8187 8253 snapshot ? BDRV_O_SNAPSHOT : 0) < 0) {
8188 8254 fprintf(stderr, "qemu: could not open floppy disk image '%s'\n",
8189 8255 fd_filename[i]);
8190 8256 exit(1);
8191 8257 }
8192 8258 }
8193 8259 }
8194 8260 }
8195 8261
8196 8262 register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
8197 8263 register_savevm("ram", 0, 2, ram_save, ram_load, NULL);
8198 8264
8199 8265 init_ioports();
8200 8266
8201 8267 /* read vncpasswd from xenstore */
8202 8268 if (0 > xenstore_read_vncpasswd(domid))
8203 8269 exit(1);
8204 8270
8205 8271 /* terminal init */
8206 8272 if (nographic) {
8207 8273 dumb_display_init(ds);
8208 8274 } else if (vnc_display != NULL || vncunused != 0) {
8209 8275 int vnc_display_port;
8210 8276 vnc_display_port = vnc_display_init(ds, vnc_display, vncunused,
8211 8277 &vnclisten_addr);
8212 8278 if (vncviewer)
8213 8279 vnc_start_viewer(vnc_display_port);
8214 8280 xenstore_write_vncport(vnc_display_port);
8215 8281 } else {
8216 8282 #if defined(CONFIG_SDL)
8217 8283 sdl_display_init(ds, full_screen);
8218 8284 #elif defined(CONFIG_COCOA)
8219 8285 cocoa_display_init(ds, full_screen);
8220 8286 #else
8221 8287 dumb_display_init(ds);
8222 8288 #endif
8223 8289 }
8224 8290
8225 8291 monitor_hd = qemu_chr_open(monitor_device);
8226 8292 if (!monitor_hd) {
8227 8293 fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
8228 8294 exit(1);
8229 8295 }
8230 8296 store_dev_info(monitor_device, domid, monitor_hd, "/monitor");
8231 8297 monitor_init(monitor_hd, !nographic);
8232 8298
8233 8299 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
8234 8300 const char *devname = serial_devices[i];
8235 8301 if (devname[0] != '\0' && strcmp(devname, "none")) {
8236 8302 char buf[16];
8237 8303 serial_hds[i] = qemu_chr_open(devname);
8238 8304 if (!serial_hds[i]) {
8239 8305 fprintf(stderr, "qemu: could not open serial device '%s'\n",
8240 8306 devname);
8241 8307 exit(1);
8242 8308 }
8243 8309 snprintf(buf, sizeof(buf), "/serial/%d", i);
8244 8310 store_dev_info(serial_devices[i], domid, serial_hds[i], buf);
8245 8311 if (i == 0) /* serial 0 is also called the console */
8246 8312 store_dev_info(serial_devices[i], domid,
8247 8313 serial_hds[i], "/console");
8248 8314 if (!strcmp(devname, "vc"))
8249 8315 qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
8250 8316 }
8251 8317 }
8252 8318
8253 8319 for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
8254 8320 const char *devname = parallel_devices[i];
8255 8321 if (devname[0] != '\0' && strcmp(devname, "none")) {
8256 8322 char buf[16];
8257 8323 parallel_hds[i] = qemu_chr_open(devname);
8258 8324 if (!parallel_hds[i]) {
8259 8325 fprintf(stderr, "qemu: could not open parallel device '%s'\n",
8260 8326 devname);
8261 8327 exit(1);
8262 8328 }
8263 8329 snprintf(buf, sizeof(buf), "/parallel/%d", i);
8264 8330 store_dev_info(parallel_devices[i], domid, parallel_hds[i], buf);
8265 8331 if (!strcmp(devname, "vc"))
8266 8332 qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
8267 8333 }
8268 8334 }
8269 8335
8270 8336 qemu_set_fd_handler(xenstore_fd(), xenstore_process_event, NULL, NULL);
8271 8337
8272 8338 machine->init(ram_size, vga_ram_size, boot_device,
8273 8339 ds, fd_filename, snapshot,
8274 8340 kernel_filename, kernel_cmdline, initrd_filename,
8275 8341 timeoffset);
8276 8342 free(boot_device);
8277 8343
8278 8344 /* init USB devices */
8279 8345 if (usb_enabled) {
8280 8346 for(i = 0; i < usb_devices_index; i++) {
8281 8347 if (usb_device_add(usb_devices[i]) < 0) {
8282 8348 fprintf(stderr, "Warning: could not add USB device %s\n",
8283 8349 usb_devices[i]);
8284 8350 }
8285 8351 }
8286 8352 }
8287 8353
8288 8354 if (vnc_display == NULL && vncunused == 0) {
8289 8355 gui_timer = qemu_new_timer(rt_clock, gui_update, NULL);
8290 8356 qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock));
8291 8357 }
8292 8358
8293 8359 #ifdef CONFIG_GDBSTUB
8294 8360 if (use_gdbstub) {
8295 8361 /* XXX: use standard host:port notation and modify options
8296 8362 accordingly. */
8297 8363 if (gdbserver_start_port(gdbstub_port) < 0) {
8298 8364 fprintf(stderr, "qemu: could not open gdbstub device on port '%d'\n",
8299 8365 gdbstub_port);
8300 8366 exit(1);
8301 8367 }
8302 8368 } else
8303 8369 #endif
8304 8370 if (loadvm)
8305 8371 do_loadvm(loadvm);
8306 8372
8307 8373 {
8308 8374 /* XXX: simplify init */
8309 8375 read_passwords();
8310 8376 if (autostart) {
8311 8377 vm_start();
8312 8378 }
8313 8379 }
8314 8380
8315 8381 if (daemonize) {
8316 8382 uint8_t status = 0;
8317 8383 ssize_t len;
8318 8384 int fd;
8319 8385
8320 8386 again1:
8321 8387 len = write(fds[1], &status, 1);
8322 8388 if (len == -1 && (errno == EINTR))
8323 8389 goto again1;
8324 8390
8325 8391 if (len != 1)
8326 8392 exit(1);
8327 8393
8328 8394 fd = open("/dev/null", O_RDWR);
8329 8395 if (fd == -1)
8330 8396 exit(1);
8331 8397
8332 8398 dup2(fd, 0);
8333 8399 dup2(fd, 1);
8334 8400 dup2(fd, 2);
8335 8401
8336 8402 close(fd);
8337 8403 }
8338 8404
8339 8405 /* register signal for the suspend request when save */
8340 8406 {
8341 8407 struct sigaction act;
8342 8408 sigset_t set;
8343 8409 act.sa_handler = suspend;
8344 8410 act.sa_flags = SA_RESTART;
8345 8411 sigemptyset(&act.sa_mask);
8346 8412
8347 8413 sigaction(SIGUSR1, &act, NULL);
8348 8414
8349 8415 /* control panel mask some signals when spawn qemu, need unmask here*/
8350 8416 sigemptyset(&set);
8351 8417 sigaddset(&set, SIGUSR1);
8352 8418 sigaddset(&set, SIGTERM);
8353 8419 if (sigprocmask(SIG_UNBLOCK, &set, NULL) == -1)
8354 8420 fprintf(stderr, "unblock signal fail, possible issue for HVM save!\n");
8355 8421
8356 8422 }
8357 8423
8358 8424 main_loop();
8359 8425 quit_timers();
8360 8426 return 0;
8361 8427 }
|
↓ open down ↓ |
6301 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX