18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * QEMU System Emulator 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 2003-2008 Fabrice Bellard 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * in the Software without restriction, including without limitation the rights 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * furnished to do so, subject to the following conditions: 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The above copyright notice and this permission notice shall be included in 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * all copies or substantial portions of the Software. 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE. 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <unistd.h> 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <fcntl.h> 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <signal.h> 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <time.h> 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <errno.h> 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/time.h> 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <zlib.h> 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 322c538c86c15d597cc875dc926e4e39285c5625dfDavid 'Digit' Turner/* Needed early for CONFIG_BSD etc. */ 335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "config-host.h" 345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _WIN32 365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <libgen.h> 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/times.h> 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/wait.h> 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <termios.h> 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/mman.h> 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/ioctl.h> 425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <sys/resource.h> 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/socket.h> 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <netinet/in.h> 455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <net/if.h> 465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(__NetBSD__) 475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <net/if_tap.h> 485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef __linux__ 505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <linux/if_tun.h> 515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <arpa/inet.h> 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <dirent.h> 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <netdb.h> 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/select.h> 562c538c86c15d597cc875dc926e4e39285c5625dfDavid 'Digit' Turner#ifdef CONFIG_BSD 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/stat.h> 585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(__FreeBSD__) || defined(__DragonFly__) 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <libutil.h> 605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else 615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <util.h> 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__) 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <freebsd/stdlib.h> 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef __linux__ 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <pty.h> 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <malloc.h> 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <linux/rtc.h> 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* For the benefit of older linux systems which don't supply it, 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project we use a local copy of hpet.h. */ 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* #include <linux/hpet.h> */ 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hpet.h" 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <linux/ppdev.h> 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <linux/parport.h> 785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef __sun__ 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/stat.h> 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/ethernet.h> 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/sockio.h> 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <netinet/arp.h> 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <netinet/in.h> 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <netinet/in_systm.h> 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <netinet/ip.h> 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <netinet/ip_icmp.h> // must come after ip.h 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <netinet/udp.h> 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <netinet/tcp.h> 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <net/if.h> 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <syslog.h> 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stropts.h> 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__OpenBSD__) 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <util.h> 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(CONFIG_VDE) 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <libvdeplug.h> 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 1065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <windows.h> 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <malloc.h> 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/timeb.h> 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <mmsystem.h> 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define getopt_long_only getopt_long 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define memalign(align, size) malloc(size) 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 114ae3098a3bce898cf958a6c3334f3d62282b12d2aDavid 'Digit' Turner#include "cpus.h" 115ae3098a3bce898cf958a6c3334f3d62282b12d2aDavid 'Digit' Turner#include "arch_init.h" 116ae3098a3bce898cf958a6c3334f3d62282b12d2aDavid 'Digit' Turner 1175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_SDL 1185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef __APPLE__ 1195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <SDL.h> 1205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_main(int argc, char **argv, char **envp); 1215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint main(int argc, char **argv) 1225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_main(argc, argv, NULL); 1245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef main 1265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define main qemu_main 1275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 1285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif /* CONFIG_SDL */ 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_COCOA 1318354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turnerint qemu_main(int argc, char **argv, char **envp); 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef main 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define main qemu_main 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* CONFIG_COCOA */ 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/hw.h" 1375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/boards.h" 1385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/usb.h" 1395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/pcmcia.h" 1405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/pc.h" 1415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/isa.h" 1425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/baum.h" 1435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/bt.h" 1445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/watchdog.h" 1455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/smbios.h" 1465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "hw/xen.h" 1475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "bt-host.h" 1485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "net.h" 1495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "monitor.h" 1505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "console.h" 1515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "sysemu.h" 1525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "gdbstub.h" 1535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-timer.h" 1545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-char.h" 1555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "cache-utils.h" 1565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "block.h" 1575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "dma.h" 1585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "audio/audio.h" 1595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "migration.h" 1605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "kvm.h" 1615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "balloon.h" 1625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-option.h" 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "disas.h" 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "exec-all.h" 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu_socket.h" 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(CONFIG_SLIRP) 1715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "libslirp.h" 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEFAULT_RAM_SIZE 128 1775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Max number of USB devices that can be specified on the commandline. */ 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MAX_USB_CMDLINE 8 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Max number of bluetooth switches on the commandline. */ 1825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MAX_BT_CMDLINE 10 1835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX: use a two level table to limit memory usage */ 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MAX_IOPORTS 65536 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic const char *data_dir; 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char *bios_name = NULL; 1895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void *ioport_opaque[MAX_IOPORTS]; 1905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS]; 1915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS]; 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project to store the VM snapshots */ 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectDriveInfo drives_table[MAX_DRIVES+1]; 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint nb_drives; 1965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerenum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB; 1975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerDisplayType display_type = DT_DEFAULT; 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* keyboard_layout = NULL; 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectram_addr_t ram_size; 200280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnerconst char *mem_path = NULL; 201280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner#ifdef MAP_POPULATE 202280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnerint mem_prealloc = 0; /* force preallocation of physical target memory */ 203280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner#endif 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint nb_nics; 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectNICInfo nd_table[MAX_NICS]; 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint vm_running; 2075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int autostart; 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int rtc_utc = 1; 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int rtc_date_offset = -1; /* -1 means no change */ 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint cirrus_vga_enabled = 1; 2115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint std_vga_enabled = 0; 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint vmsvga_enabled = 0; 2135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint xenfb_enabled = 0; 214a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' TurnerQEMUClock *rtc_clock; 2155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int full_screen = 0; 2165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_SDL 2175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int no_frame = 0; 2185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint no_quit = 0; 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectCharDriverState *serial_hds[MAX_SERIAL_PORTS]; 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectCharDriverState *parallel_hds[MAX_PARALLEL_PORTS]; 2225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerCharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES]; 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_I386 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint win2k_install_hack = 0; 2255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint rtc_td_hack = 0; 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint usb_enabled = 0; 2285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint singlestep = 0; 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint smp_cpus = 1; 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char *vnc_display; 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint acpi_enabled = 1; 2325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint no_hpet = 0; 2335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint no_virtio_balloon = 0; 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint fd_bootchk = 1; 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint no_reboot = 0; 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint no_shutdown = 0; 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint cursor_hide = 1; 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint graphic_rotate = 0; 2395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerWatchdogTimerModel *watchdog = NULL; 2405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint watchdog_action = WDT_RESET; 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char *option_rom[MAX_OPTION_ROMS]; 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint nb_option_roms; 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint semihosting_enabled = 0; 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_ARM 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint old_param = 0; 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char *qemu_name; 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint alt_grab = 0; 2495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(TARGET_SPARC) || defined(TARGET_PPC) 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned int nb_prom_envs = 0; 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char *prom_envs[MAX_PROM_ENVS]; 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint nb_drives_opt; 2545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct drive_opt drives_opt[MAX_DRIVES]; 2555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint nb_numa_nodes; 2575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turneruint64_t node_mem[MAX_NODES]; 2585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turneruint64_t node_cpumask[MAX_NODES]; 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic QEMUTimer *nographic_timer; 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turneruint8_t qemu_uuid[16]; 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************/ 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* x86 ISA bus support */ 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttarget_phys_addr_t isa_mem_base = 0; 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectPicState2 *isa_pic; 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic IOPortReadFunc default_ioport_readb, default_ioport_readw, default_ioport_readl; 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic IOPortWriteFunc default_ioport_writeb, default_ioport_writew, default_ioport_writel; 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic uint32_t ioport_read(int index, uint32_t address) 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static IOPortReadFunc *default_func[3] = { 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default_ioport_readb, 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default_ioport_readw, 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default_ioport_readl 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project IOPortReadFunc *func = ioport_read_table[index][address]; 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!func) 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project func = default_func[index]; 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return func(ioport_opaque[address], address); 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void ioport_write(int index, uint32_t address, uint32_t data) 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static IOPortWriteFunc *default_func[3] = { 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default_ioport_writeb, 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default_ioport_writew, 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default_ioport_writel 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project IOPortWriteFunc *func = ioport_write_table[index][address]; 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!func) 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project func = default_func[index]; 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project func(ioport_opaque[address], address, data); 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic uint32_t default_ioport_readb(void *opaque, uint32_t address) 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG_UNUSED_IOPORT 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unused inb: port=0x%04x\n", address); 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0xff; 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void default_ioport_writeb(void *opaque, uint32_t address, uint32_t data) 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG_UNUSED_IOPORT 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unused outb: port=0x%04x data=0x%02x\n", address, data); 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* default is to make two byte accesses */ 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic uint32_t default_ioport_readw(void *opaque, uint32_t address) 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t data; 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project data = ioport_read(0, address); 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project address = (address + 1) & (MAX_IOPORTS - 1); 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project data |= ioport_read(0, address) << 8; 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return data; 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void default_ioport_writew(void *opaque, uint32_t address, uint32_t data) 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ioport_write(0, address, data & 0xff); 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project address = (address + 1) & (MAX_IOPORTS - 1); 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ioport_write(0, address, (data >> 8) & 0xff); 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic uint32_t default_ioport_readl(void *opaque, uint32_t address) 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG_UNUSED_IOPORT 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unused inl: port=0x%04x\n", address); 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0xffffffff; 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void default_ioport_writel(void *opaque, uint32_t address, uint32_t data) 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG_UNUSED_IOPORT 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unused outl: port=0x%04x data=0x%02x\n", address, data); 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/***************/ 3485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* ballooning */ 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic QEMUBalloonEvent *qemu_balloon_event; 3515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid *qemu_balloon_event_opaque; 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_add_balloon_handler(QEMUBalloonEvent *func, void *opaque) 3545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 3555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_balloon_event = func; 3565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_balloon_event_opaque = opaque; 3575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_balloon(ram_addr_t target) 3605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 3615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (qemu_balloon_event) 3625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_balloon_event(qemu_balloon_event_opaque, target); 3635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerram_addr_t qemu_balloon_status(void) 3665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 3675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (qemu_balloon_event) 3685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return qemu_balloon_event(qemu_balloon_event_opaque, 0); 3695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 3705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/***********************************************************/ 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* host time/date access */ 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_get_timedate(struct tm *tm, int offset) 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project time_t ti; 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct tm *ret; 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project time(&ti); 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ti += offset; 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (rtc_date_offset == -1) { 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (rtc_utc) 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = gmtime(&ti); 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = localtime(&ti); 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ti -= rtc_date_offset; 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = gmtime(&ti); 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memcpy(tm, ret, sizeof(struct tm)); 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_timedate_diff(struct tm *tm) 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project time_t seconds; 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (rtc_date_offset == -1) 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (rtc_utc) 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project seconds = mktimegm(tm); 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project seconds = mktime(tm); 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project seconds = mktimegm(tm) + rtc_date_offset; 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return seconds - time(NULL); 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef _WIN32 4105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void socket_cleanup(void) 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner WSACleanup(); 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int socket_init(void) 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner WSADATA Data; 4185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int ret, err; 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ret = WSAStartup(MAKEWORD(2,2), &Data); 4215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (ret != 0) { 4225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner err = WSAGetLastError(); 4235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "WSAStartup: %d\n", err); 4245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 4255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 4265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner atexit(socket_cleanup); 4275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint get_param_value(char *buf, int buf_size, 4325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *tag, const char *str) 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *p; 4355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char option[128]; 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p = str; 4385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for(;;) { 4395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p = get_opt_name(option, sizeof(option), p, '='); 4405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (*p != '=') 4415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 4425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p++; 4435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!strcmp(tag, option)) { 4445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (void)get_opt_value(buf, buf_size, p); 4455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return strlen(buf); 4465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 4475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p = get_opt_value(NULL, 0, p); 4485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 4495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (*p != ',') 4505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 4515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p++; 4525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 4535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint check_params(char *buf, int buf_size, 4575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char * const *params, const char *str) 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *p; 4605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int i; 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p = str; 4635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner while (*p != '\0') { 4645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p = get_opt_name(buf, buf_size, p, '='); 4655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (*p != '=') { 4665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 4675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 4685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p++; 4695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (i = 0; params[i] != NULL; i++) { 4705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!strcmp(params[i], buf)) { 4715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 4725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 4735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 4745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (params[i] == NULL) { 4755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 4765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 4775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p = get_opt_value(NULL, 0, p); 4785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (*p != ',') { 4795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 4805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 4815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p++; 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/***********************************************************/ 4875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Bluetooth support */ 4885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int nb_hcis; 4895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int cur_hci; 4905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic struct HCIInfo *hci_table[MAX_NICS]; 4915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 4925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic struct bt_vlan_s { 4935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct bt_scatternet_s net; 4945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int id; 4955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct bt_vlan_s *next; 4965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} *first_bt_vlan; 4975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 4985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* find or alloc a new bluetooth "VLAN" */ 4995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic struct bt_scatternet_s *qemu_find_bt_vlan(int id) 5005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 5015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct bt_vlan_s **pvlan, *vlan; 5025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) { 5035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (vlan->id == id) 5045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return &vlan->net; 5055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 5065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vlan = qemu_mallocz(sizeof(struct bt_vlan_s)); 5075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vlan->id = id; 5085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pvlan = &first_bt_vlan; 5095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner while (*pvlan != NULL) 5105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pvlan = &(*pvlan)->next; 5115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *pvlan = vlan; 5125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return &vlan->net; 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len) 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr) 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -ENOTSUP; 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic struct HCIInfo null_hci = { 5255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner .cmd_send = null_hci_send, 5265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner .sco_send = null_hci_send, 5275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner .acl_send = null_hci_send, 5285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner .bdaddr_set = null_hci_addr_set, 5295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}; 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct HCIInfo *qemu_next_hci(void) 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (cur_hci == nb_hcis) 5345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return &null_hci; 5355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 5365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return hci_table[cur_hci++]; 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic struct HCIInfo *hci_init(const char *str) 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char *endp; 5425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct bt_scatternet_s *vlan = 0; 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!strcmp(str, "null")) 5455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* null */ 5465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return &null_hci; 5475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else if (!strncmp(str, "host", 4) && (str[4] == '\0' || str[4] == ':')) 5485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* host[:hciN] */ 5495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return bt_host_hci(str[4] ? str + 5 : "hci0"); 5505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else if (!strncmp(str, "hci", 3)) { 5515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* hci[,vlan=n] */ 5525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (str[3]) { 5535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!strncmp(str + 3, ",vlan=", 6)) { 5545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vlan = qemu_find_bt_vlan(strtol(str + 9, &endp, 0)); 5555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (*endp) 5565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vlan = 0; 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else 5595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vlan = qemu_find_bt_vlan(0); 5605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (vlan) 5615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return bt_new_hci(vlan); 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: Unknown bluetooth HCI `%s'.\n", str); 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int bt_hci_parse(const char *str) 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct HCIInfo *hci; 5725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bdaddr_t bdaddr; 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (nb_hcis >= MAX_NICS) { 5755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: Too many bluetooth HCIs (max %i).\n", MAX_NICS); 5765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner hci = hci_init(str); 5805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!hci) 5815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bdaddr.b[0] = 0x52; 5845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bdaddr.b[1] = 0x54; 5855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bdaddr.b[2] = 0x00; 5865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bdaddr.b[3] = 0x12; 5875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bdaddr.b[4] = 0x34; 5885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bdaddr.b[5] = 0x56 + nb_hcis; 5895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner hci->bdaddr_set(hci, bdaddr.b); 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner hci_table[nb_hcis++] = hci; 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void bt_vhci_add(int vlan_id) 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct bt_scatternet_s *vlan = qemu_find_bt_vlan(vlan_id); 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!vlan->slave) 6015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: warning: adding a VHCI to " 6025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "an empty scatternet %i\n", vlan_id); 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bt_vhci_init(bt_new_hci(vlan)); 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic struct bt_device_s *bt_device_add(const char *opt) 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct bt_scatternet_s *vlan; 6105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int vlan_id = 0; 6115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char *endp = strstr(opt, ",vlan="); 6125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int len = (endp ? endp - opt : strlen(opt)) + 1; 6135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char devname[10]; 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pstrcpy(devname, MIN(sizeof(devname), len), opt); 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (endp) { 6185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vlan_id = strtol(endp + 6, &endp, 0); 6195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (*endp) { 6205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: unrecognised bluetooth vlan Id\n"); 6215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vlan = qemu_find_bt_vlan(vlan_id); 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!vlan->slave) 6285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: warning: adding a slave device to " 6295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "an empty scatternet %i\n", vlan_id); 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!strcmp(devname, "keyboard")) 6325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return bt_keyboard_init(vlan); 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: unsupported bluetooth device `%s'\n", devname); 6355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int bt_parse(const char *opt) 6395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 6405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *endp, *p; 6415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int vlan; 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (strstart(opt, "hci", &endp)) { 6445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!*endp || *endp == ',') { 6455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (*endp) 6465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!strstart(endp, ",vlan=", 0)) 6475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner opt = endp + 1; 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return bt_hci_parse(opt); 6505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 6515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else if (strstart(opt, "vhci", &endp)) { 6525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!*endp || *endp == ',') { 6535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (*endp) { 6545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (strstart(endp, ",vlan=", &p)) { 6555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vlan = strtol(p, (char **) &endp, 0); 6565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (*endp) { 6575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: bad scatternet '%s'\n", p); 6585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 1; 6595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 6605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 6615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: bad parameter '%s'\n", endp + 1); 6625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 1; 6635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 6645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else 6655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vlan = 0; 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bt_vhci_add(vlan); 6685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 6695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 6705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else if (strstart(opt, "device:", &endp)) 6715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return !bt_device_add(endp); 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: bad bluetooth parameter '%s'\n", opt); 6745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 1; 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/***********************************************************/ 6785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* QEMU Block devices */ 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define HD_ALIAS "index=%d,media=disk" 6815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define CDROM_ALIAS "index=2,media=cdrom" 6825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define FD_ALIAS "index=%d,if=floppy" 6835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define PFLASH_ALIAS "if=pflash" 6845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MTD_ALIAS "if=mtd" 6855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define SD_ALIAS "index=0,if=sd" 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 687cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turnerstatic int drive_init_func(QemuOpts *opts, void *opaque) 688cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner{ 689cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int *use_scsi = opaque; 690cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner int fatal_error = 0; 691cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 692cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner if (drive_init(opts, *use_scsi, &fatal_error) == NULL) { 693cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner if (fatal_error) 694cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner return 1; 695cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner } 696cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner return 0; 697cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner} 698cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 699cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turnerstatic int drive_enable_snapshot(QemuOpts *opts, void *opaque) 700cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner{ 701cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner if (NULL == qemu_opt_get(opts, "snapshot")) { 702cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner qemu_opt_set(opts, "snapshot", "on"); 703cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner } 704cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner return 0; 705cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner} 706cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner 7075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int drive_opt_get_free_idx(void) 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int index; 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (index = 0; index < MAX_DRIVES; index++) 7125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!drives_opt[index].used) { 7135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_opt[index].used = 1; 7145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return index; 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 7175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int drive_get_free_idx(void) 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int index; 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (index = 0; index < MAX_DRIVES; index++) 7255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!drives_table[index].used) { 7265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[index].used = 1; 7275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return index; 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint drive_add(const char *file, const char *fmt, ...) 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner va_list ap; 7365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int index = drive_opt_get_free_idx(); 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (nb_drives_opt >= MAX_DRIVES || index == -1) { 7395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: too many drives\n"); 7405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_opt[index].file = file; 7445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner va_start(ap, fmt); 7455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vsnprintf(drives_opt[index].opt, 7465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner sizeof(drives_opt[0].opt), fmt, ap); 7475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner va_end(ap); 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner nb_drives_opt++; 7505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return index; 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid drive_remove(int index) 7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_opt[index].used = 0; 7565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner nb_drives_opt--; 7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint drive_get_index(BlockInterfaceType type, int bus, int unit) 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int index; 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* seek interface, bus and unit */ 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (index = 0; index < MAX_DRIVES; index++) 7665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (drives_table[index].type == type && 7675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[index].bus == bus && 7685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[index].unit == unit && 7695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[index].used) 7705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return index; 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint drive_get_max_bus(BlockInterfaceType type) 7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int max_bus; 7785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int index; 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner max_bus = -1; 7815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (index = 0; index < nb_drives; index++) { 7825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if(drives_table[index].type == type && 7835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[index].bus > max_bus) 7845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner max_bus = drives_table[index].bus; 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return max_bus; 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerconst char *drive_get_serial(BlockDriverState *bdrv) 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int index; 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (index = 0; index < nb_drives; index++) 7945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (drives_table[index].bdrv == bdrv) 7955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return drives_table[index].serial; 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return "\0"; 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerBlockInterfaceErrorAction drive_get_onerror(BlockDriverState *bdrv) 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int index; 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (index = 0; index < nb_drives; index++) 8055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (drives_table[index].bdrv == bdrv) 8065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return drives_table[index].onerror; 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return BLOCK_ERR_STOP_ENOSPC; 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void bdrv_format_print(void *opaque, const char *name) 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, " %s", name); 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid drive_uninit(BlockDriverState *bdrv) 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int i; 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (i = 0; i < MAX_DRIVES; i++) 8215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (drives_table[i].bdrv == bdrv) { 8225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[i].bdrv = NULL; 8235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[i].used = 0; 8245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drive_remove(drives_table[i].drive_opt_idx); 8255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner nb_drives--; 8265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 8275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint drive_init(struct drive_opt *arg, int snapshot, void *opaque) 8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char buf[128]; 8335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char file[1024]; 8345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char devname[128]; 8355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char serial[21]; 8365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *mediastr = ""; 8375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner BlockInterfaceType type; 8385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner enum { MEDIA_DISK, MEDIA_CDROM } media; 8395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int bus_id, unit_id; 8405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int cyls, heads, secs, translation; 8415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner BlockDriverState *bdrv; 8425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner BlockDriver *drv = NULL; 8435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner QEMUMachine *machine = opaque; 8445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int max_devs; 8455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int index; 8465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int cache; 8475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int bdrv_flags, onerror; 8485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int drives_table_idx; 8495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char *str = arg->opt; 8505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner static const char * const params[] = { "bus", "unit", "if", "index", 8515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "cyls", "heads", "secs", "trans", 8525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "media", "snapshot", "file", 8535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "cache", "format", "serial", "werror", 8545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner NULL }; 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (check_params(buf, sizeof(buf), params, str) < 0) { 8575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n", 8585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner buf, str); 8595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 8605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner file[0] = 0; 8635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner cyls = heads = secs = 0; 8645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bus_id = 0; 8655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner unit_id = -1; 8665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner translation = BIOS_ATA_TRANSLATION_AUTO; 8675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner index = -1; 8685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner cache = 3; 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (machine->use_scsi) { 8715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner type = IF_SCSI; 8725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner max_devs = MAX_SCSI_DEVS; 8735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pstrcpy(devname, sizeof(devname), "scsi"); 8745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 8755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner type = IF_IDE; 8765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner max_devs = MAX_IDE_DEVS; 8775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pstrcpy(devname, sizeof(devname), "ide"); 8785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 8795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner media = MEDIA_DISK; 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* extract parameters */ 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (get_param_value(buf, sizeof(buf), "bus", str)) { 8845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bus_id = strtol(buf, NULL, 0); 8855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (bus_id < 0) { 8865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: '%s' invalid bus id\n", str); 8875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 8885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (get_param_value(buf, sizeof(buf), "unit", str)) { 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unit_id = strtol(buf, NULL, 0); 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (unit_id < 0) { 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: '%s' invalid unit id\n", str); 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (get_param_value(buf, sizeof(buf), "if", str)) { 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pstrcpy(devname, sizeof(devname), buf); 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(buf, "ide")) { 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project type = IF_IDE; 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project max_devs = MAX_IDE_DEVS; 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (!strcmp(buf, "scsi")) { 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project type = IF_SCSI; 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project max_devs = MAX_SCSI_DEVS; 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (!strcmp(buf, "floppy")) { 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project type = IF_FLOPPY; 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project max_devs = 0; 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (!strcmp(buf, "pflash")) { 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project type = IF_PFLASH; 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project max_devs = 0; 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (!strcmp(buf, "mtd")) { 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project type = IF_MTD; 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project max_devs = 0; 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (!strcmp(buf, "sd")) { 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project type = IF_SD; 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project max_devs = 0; 9195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else if (!strcmp(buf, "virtio")) { 9205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner type = IF_VIRTIO; 9215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner max_devs = 0; 9225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else if (!strcmp(buf, "xen")) { 9235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner type = IF_XEN; 9245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner max_devs = 0; 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: '%s' unsupported bus type '%s'\n", str, buf); 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (get_param_value(buf, sizeof(buf), "index", str)) { 9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project index = strtol(buf, NULL, 0); 9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (index < 0) { 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: '%s' invalid index\n", str); 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (get_param_value(buf, sizeof(buf), "cyls", str)) { 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cyls = strtol(buf, NULL, 0); 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (get_param_value(buf, sizeof(buf), "heads", str)) { 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project heads = strtol(buf, NULL, 0); 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (get_param_value(buf, sizeof(buf), "secs", str)) { 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project secs = strtol(buf, NULL, 0); 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cyls || heads || secs) { 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cyls < 1 || cyls > 16383) { 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: '%s' invalid physical cyls number\n", str); 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (heads < 1 || heads > 16) { 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: '%s' invalid physical heads number\n", str); 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (secs < 1 || secs > 63) { 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: '%s' invalid physical secs number\n", str); 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (get_param_value(buf, sizeof(buf), "trans", str)) { 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!cyls) { 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "qemu: '%s' trans must be used with cyls,heads and secs\n", 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project str); 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(buf, "none")) 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project translation = BIOS_ATA_TRANSLATION_NONE; 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!strcmp(buf, "lba")) 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project translation = BIOS_ATA_TRANSLATION_LBA; 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!strcmp(buf, "auto")) 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project translation = BIOS_ATA_TRANSLATION_AUTO; 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: '%s' invalid translation type\n", str); 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (get_param_value(buf, sizeof(buf), "media", str)) { 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(buf, "disk")) { 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project media = MEDIA_DISK; 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (!strcmp(buf, "cdrom")) { 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cyls || secs || heads) { 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "qemu: '%s' invalid physical CHS format\n", str); 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project media = MEDIA_CDROM; 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: '%s' invalid media\n", str); 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (get_param_value(buf, sizeof(buf), "snapshot", str)) { 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(buf, "on")) 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project snapshot = 1; 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!strcmp(buf, "off")) 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project snapshot = 0; 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: '%s' invalid snapshot option\n", str); 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (get_param_value(buf, sizeof(buf), "cache", str)) { 10135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!strcmp(buf, "off") || !strcmp(buf, "none")) 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cache = 0; 10155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else if (!strcmp(buf, "writethrough")) 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cache = 1; 10175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else if (!strcmp(buf, "writeback")) 10185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner cache = 2; 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: invalid cache option\n"); 10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (get_param_value(buf, sizeof(buf), "format", str)) { 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strcmp(buf, "?") == 0) { 10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: Supported formats:"); 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bdrv_iterate_format(bdrv_format_print, NULL); 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "\n"); 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drv = bdrv_find_format(buf); 10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!drv) { 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: '%s' invalid format\n", buf); 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (arg->file == NULL) 10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project get_param_value(file, sizeof(file), "file", str); 10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pstrcpy(file, sizeof(file), arg->file); 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!get_param_value(serial, sizeof(serial), "serial", str)) 10455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner memset(serial, 0, sizeof(serial)); 10465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 10475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner onerror = BLOCK_ERR_STOP_ENOSPC; 10485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (get_param_value(buf, sizeof(serial), "werror", str)) { 10495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO) { 10505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "werror is no supported by this format\n"); 10515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 10525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 10535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!strcmp(buf, "ignore")) 10545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner onerror = BLOCK_ERR_IGNORE; 10555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else if (!strcmp(buf, "enospc")) 10565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner onerror = BLOCK_ERR_STOP_ENOSPC; 10575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else if (!strcmp(buf, "stop")) 10585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner onerror = BLOCK_ERR_STOP_ANY; 10595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else if (!strcmp(buf, "report")) 10605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner onerror = BLOCK_ERR_REPORT; 10615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else { 10625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: '%s' invalid write error action\n", buf); 10635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 10645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 10655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 10665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* compute bus and unit according index */ 10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (index != -1) { 10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (bus_id != 0 || unit_id != -1) { 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "qemu: '%s' index cannot be used with bus and unit\n", str); 10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (max_devs == 0) 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unit_id = index; 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bus_id = 0; 10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unit_id = index % max_devs; 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bus_id = index / max_devs; 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if user doesn't specify a unit_id, 10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * try to find the first free 10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (unit_id == -1) { 10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unit_id = 0; 10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (drive_get_index(type, bus_id, unit_id) != -1) { 10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unit_id++; 10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (max_devs && unit_id >= max_devs) { 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unit_id -= max_devs; 10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bus_id++; 10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check unit id */ 11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (max_devs && unit_id >= max_devs) { 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: '%s' unit %d too big (max is %d)\n", 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project str, unit_id, max_devs - 1); 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * ignore multiple definitions 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (drive_get_index(type, bus_id, unit_id) != -1) 11135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -2; 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* init */ 11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (type == IF_IDE || type == IF_SCSI) 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd"; 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (max_devs) 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project snprintf(buf, sizeof(buf), "%s%i%s%i", 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project devname, bus_id, mediastr, unit_id); 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project snprintf(buf, sizeof(buf), "%s%s%i", 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project devname, mediastr, unit_id); 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bdrv = bdrv_new(buf); 11265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table_idx = drive_get_free_idx(); 11275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[drives_table_idx].bdrv = bdrv; 11285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[drives_table_idx].type = type; 11295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[drives_table_idx].bus = bus_id; 11305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[drives_table_idx].unit = unit_id; 11315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[drives_table_idx].onerror = onerror; 11325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner drives_table[drives_table_idx].drive_opt_idx = arg - drives_opt; 11335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner strncpy(drives_table[drives_table_idx].serial, serial, sizeof(serial)); 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nb_drives++; 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch(type) { 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case IF_IDE: 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case IF_SCSI: 11395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case IF_XEN: 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch(media) { 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case MEDIA_DISK: 11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cyls != 0) { 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bdrv_set_geometry_hint(bdrv, cyls, heads, secs); 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bdrv_set_translation_hint(bdrv, translation); 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case MEDIA_CDROM: 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bdrv_set_type_hint(bdrv, BDRV_TYPE_CDROM); 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case IF_SD: 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* FIXME: This isn't really a floppy, but it's a reasonable 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project approximation. */ 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case IF_FLOPPY: 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bdrv_set_type_hint(bdrv, BDRV_TYPE_FLOPPY); 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case IF_PFLASH: 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case IF_MTD: 11605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case IF_VIRTIO: 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 11625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case IF_COUNT: 11635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner abort(); 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!file[0]) 11665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -2; 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bdrv_flags = 0; 11685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (snapshot) { 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bdrv_flags |= BDRV_O_SNAPSHOT; 11705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner cache = 2; /* always use write-back with snapshot */ 11715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 11725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (cache == 0) /* no caching */ 11735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bdrv_flags |= BDRV_O_NOCACHE; 11745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else if (cache == 2) /* write-back */ 11755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bdrv_flags |= BDRV_O_CACHE_WB; 11765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else if (cache == 3) /* not specified */ 11775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bdrv_flags |= BDRV_O_CACHE_DEF; 11785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0) { 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: could not open disk image %s\n", 11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file); 11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (bdrv_key_required(bdrv)) 11845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner autostart = 0; 11855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return drives_table_idx; 11865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 11875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 11885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void numa_add(const char *optarg) 11895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 11905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char option[128]; 11915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char *endptr; 11925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner unsigned long long value, endvalue; 11935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int nodenr; 11945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 11955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner optarg = get_opt_name(option, 128, optarg, ',') + 1; 11965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!strcmp(option, "node")) { 11975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (get_param_value(option, 128, "nodeid", optarg) == 0) { 11985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner nodenr = nb_numa_nodes; 11995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 12005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner nodenr = strtoull(option, NULL, 10); 12015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 12025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 12035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (get_param_value(option, 128, "mem", optarg) == 0) { 12045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner node_mem[nodenr] = 0; 12055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 12065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner value = strtoull(option, &endptr, 0); 12075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner switch (*endptr) { 12085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case 0: case 'M': case 'm': 12095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner value <<= 20; 12105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 12115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case 'G': case 'g': 12125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner value <<= 30; 12135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 12145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 12155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner node_mem[nodenr] = value; 12165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 12175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (get_param_value(option, 128, "cpus", optarg) == 0) { 12185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner node_cpumask[nodenr] = 0; 12195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 12205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner value = strtoull(option, &endptr, 10); 12215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (value >= 64) { 12225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner value = 63; 12235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "only 64 CPUs in NUMA mode supported.\n"); 12245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 12255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (*endptr == '-') { 12265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner endvalue = strtoull(endptr+1, &endptr, 10); 12275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (endvalue >= 63) { 12285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner endvalue = 62; 12295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, 12305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "only 63 CPUs in NUMA mode supported.\n"); 12315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 12325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner value = (1 << (endvalue + 1)) - (1 << value); 12335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 12345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner value = 1 << value; 12355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 12365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 12375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner node_cpumask[nodenr] = value; 12385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 12395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner nb_numa_nodes++; 12405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 12415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return; 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************/ 12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* USB devices */ 12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic USBPort *used_usb_ports; 12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic USBPort *free_usb_ports; 12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* ??? Maybe change this to register a hub to keep track of the topology. */ 12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_register_usb_port(USBPort *port, void *opaque, int index, 12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project usb_attachfn attach) 12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port->opaque = opaque; 12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port->index = index; 12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port->attach = attach; 12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port->next = free_usb_ports; 12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free_usb_ports = port; 12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint usb_device_add_dev(USBDevice *dev) 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project USBPort *port; 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Find a USB port to add the device to. */ 12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port = free_usb_ports; 12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!port->next) { 12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project USBDevice *hub; 12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Create a new hub and chain it on. */ 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free_usb_ports = NULL; 12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port->next = used_usb_ports; 12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project used_usb_ports = port; 12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hub = usb_hub_init(VM_USB_HUB_SIZE); 12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project usb_attach(port, hub); 12778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port = free_usb_ports; 12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free_usb_ports = port->next; 12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port->next = used_usb_ports; 12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project used_usb_ports = port; 12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project usb_attach(port, dev); 12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void usb_msd_password_cb(void *opaque, int err) 12885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 12895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner USBDevice *dev = opaque; 12905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 12915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!err) 12925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner usb_device_add_dev(dev); 12935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else 12945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dev->handle_destroy(dev); 12955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 12965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 12975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int usb_device_add(const char *devname, int is_hotplug) 12988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 12998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *p; 13008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project USBDevice *dev; 13018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!free_usb_ports) 13038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strstart(devname, "host:", &p)) { 13068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev = usb_host_device_open(p); 13078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (!strcmp(devname, "mouse")) { 13088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev = usb_mouse_init(); 13098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (!strcmp(devname, "tablet")) { 13108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev = usb_tablet_init(); 13118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (!strcmp(devname, "keyboard")) { 13128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev = usb_keyboard_init(); 13138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (strstart(devname, "disk:", &p)) { 13145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner BlockDriverState *bs; 13155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 13168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev = usb_msd_init(p); 13175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!dev) 13185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return -1; 13195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bs = usb_msd_get_bdrv(dev); 13205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (bdrv_key_required(bs)) { 13215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner autostart = 0; 13225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (is_hotplug) { 13235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_read_bdrv_key_start(cur_mon, bs, usb_msd_password_cb, 13245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dev); 13255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 13265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 13275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 13288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (!strcmp(devname, "wacom-tablet")) { 13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev = usb_wacom_init(); 13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (strstart(devname, "serial:", &p)) { 13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev = usb_serial_init(p); 13328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_BRLAPI 13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (!strcmp(devname, "braille")) { 13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev = usb_baum_init(); 13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 13368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (strstart(devname, "net:", &p)) { 13378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nic = nb_nics; 13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (net_client_init(NULL, "nic", p) < 0) 13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nd_table[nic].model = "usb"; 13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev = usb_net_init(&nd_table[nic]); 13435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else if (!strcmp(devname, "bt") || strstart(devname, "bt:", &p)) { 13445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dev = usb_bt_init(devname[2] ? hci_init(p) : 13455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bt_new_hci(qemu_find_bt_vlan(0))); 13468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 13478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!dev) 13508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return usb_device_add_dev(dev); 13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint usb_device_del_addr(int bus_num, int addr) 13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project USBPort *port; 13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project USBPort **lastp; 13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project USBDevice *dev; 13608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!used_usb_ports) 13628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (bus_num != 0) 13658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project lastp = &used_usb_ports; 13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port = used_usb_ports; 13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (port && port->dev->addr != addr) { 13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project lastp = &port->next; 13718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port = port->next; 13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!port) 13758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev = port->dev; 13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *lastp = port->next; 13798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project usb_attach(port, NULL); 13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev->handle_destroy(dev); 13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project port->next = free_usb_ports; 13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free_usb_ports = port; 13838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 13858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int usb_device_del(const char *devname) 13878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 13888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int bus_num, addr; 13898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *p; 13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strstart(devname, "host:", &p)) 13928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return usb_host_device_close(p); 13938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!used_usb_ports) 13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 13968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = strchr(devname, '.'); 13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!p) 13998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 14008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bus_num = strtoul(devname, NULL, 0); 14018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project addr = strtoul(p + 1, NULL, 0); 14028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return usb_device_del_addr(bus_num, addr); 14048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid do_usb_add(Monitor *mon, const char *devname) 14078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner usb_device_add(devname, 1); 14098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid do_usb_del(Monitor *mon, const char *devname) 14128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project usb_device_del(devname); 14148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid usb_info(Monitor *mon) 14178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project USBDevice *dev; 14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project USBPort *port; 14208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *speed_str; 14218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!usb_enabled) { 14235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_printf(mon, "USB support not enabled\n"); 14248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 14258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (port = used_usb_ports; port; port = port->next) { 14288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev = port->dev; 14298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!dev) 14308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 14318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch(dev->speed) { 14328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case USB_SPEED_LOW: 14338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project speed_str = "1.5"; 14348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 14358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case USB_SPEED_FULL: 14368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project speed_str = "12"; 14378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 14388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case USB_SPEED_HIGH: 14398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project speed_str = "480"; 14408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 14418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 14428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project speed_str = "?"; 14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 14448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_printf(mon, " Device %d.%d, Speed %s Mb/s, Product %s\n", 14465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 0, dev->addr, speed_str, dev->devname); 14478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************/ 14515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* PCMCIA/Cardbus */ 14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic struct pcmcia_socket_entry_s { 14545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PCMCIASocket *socket; 14555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct pcmcia_socket_entry_s *next; 14565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} *pcmcia_sockets = 0; 14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid pcmcia_socket_register(PCMCIASocket *socket) 14598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct pcmcia_socket_entry_s *entry; 14615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 14625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner entry = qemu_malloc(sizeof(struct pcmcia_socket_entry_s)); 14635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner entry->socket = socket; 14645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner entry->next = pcmcia_sockets; 14655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pcmcia_sockets = entry; 14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid pcmcia_socket_unregister(PCMCIASocket *socket) 14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 14705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct pcmcia_socket_entry_s *entry, **ptr; 14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ptr = &pcmcia_sockets; 14735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (entry = *ptr; entry; ptr = &entry->next, entry = *ptr) 14745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (entry->socket == socket) { 14755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *ptr = entry->next; 14765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_free(entry); 14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 14795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 14805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid pcmcia_info(Monitor *mon) 14815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 14825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct pcmcia_socket_entry_s *iter; 14835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 14845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!pcmcia_sockets) 14855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_printf(mon, "No PCMCIA sockets\n"); 14865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 14875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (iter = pcmcia_sockets; iter; iter = iter->next) 14885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_printf(mon, "%s: %s\n", iter->socket->slot_string, 14895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner iter->socket->attached ? iter->socket->card_string : 14905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "Empty"); 14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************/ 14945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* machine registration */ 14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic QEMUMachine *first_machine = NULL; 14975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerQEMUMachine *current_machine = NULL; 14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_register_machine(QEMUMachine *m) 15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner QEMUMachine **pm; 15025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pm = &first_machine; 15035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner while (*pm != NULL) 15045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pm = &(*pm)->next; 15055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner m->next = NULL; 15065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *pm = m; 15075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic QEMUMachine *find_machine(const char *name) 15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner QEMUMachine *m; 15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for(m = first_machine; m != NULL; m = m->next) { 15155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!strcmp(m->name, name)) 15165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return m; 15178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic QEMUMachine *find_default_machine(void) 15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner QEMUMachine *m; 15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for(m = first_machine; m != NULL; m = m->next) { 15265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (m->is_default) { 15275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return m; 15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return NULL; 15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/***********************************************************/ 15345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* main execution loop */ 15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void gui_update(void *opaque) 15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner uint64_t interval = GUI_REFRESH_INTERVAL; 15395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner DisplayState *ds = opaque; 15405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner DisplayChangeListener *dcl = ds->listeners; 15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dpy_refresh(ds); 15438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner while (dcl != NULL) { 15455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (dcl->gui_timer_interval && 15465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dcl->gui_timer_interval < interval) 15475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner interval = dcl->gui_timer_interval; 15485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dcl = dcl->next; 15498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15505973c775c853e26f684de58ad28c267281aaffd6David 'Digit' Turner qemu_mod_timer(ds->gui_timer, interval + qemu_get_clock_ms(rt_clock)); 15518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void nographic_update(void *opaque) 15548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner uint64_t interval = GUI_REFRESH_INTERVAL; 15568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15575973c775c853e26f684de58ad28c267281aaffd6David 'Digit' Turner qemu_mod_timer(nographic_timer, interval + qemu_get_clock_ms(rt_clock)); 15588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct vm_change_state_entry { 15615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner VMChangeStateHandler *cb; 15625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void *opaque; 1563a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner QLIST_ENTRY (vm_change_state_entry) entries; 15645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}; 15658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1566a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turnerstatic QLIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head; 15678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerVMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb, 15695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void *opaque) 15705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 15715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner VMChangeStateEntry *e; 15728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner e = qemu_mallocz(sizeof (*e)); 15748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner e->cb = cb; 15765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner e->opaque = opaque; 1577a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner QLIST_INSERT_HEAD(&vm_change_state_head, e, entries); 15785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return e; 15795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 15808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_del_vm_change_state_handler(VMChangeStateEntry *e) 15825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 1583a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner QLIST_REMOVE (e, entries); 15845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_free (e); 15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 15868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 158723ca2ae2bf303236eb6b1e0beb126ec05c6c23bfDavid 'Digit' Turnervoid vm_state_notify(int running, int reason) 15888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 15895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner VMChangeStateEntry *e; 15908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) { 15925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner e->cb(e->opaque, running, reason); 15938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 15958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid vm_start(void) 15975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 15985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!vm_running) { 15995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner cpu_enable_ticks(); 16005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vm_running = 1; 16015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vm_state_notify(1, 0); 16026a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner //qemu_rearm_alarm_timer(alarm_timer); 16035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner resume_all_vcpus(); 16048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 16065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 16075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* reset/shutdown handler */ 16085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 16095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct QEMUResetEntry { 1610025c32ffcd9f682cd761a836fe8798738d1648f2David Turner QTAILQ_ENTRY(QEMUResetEntry) entry; 16115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner QEMUResetHandler *func; 16125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void *opaque; 16135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} QEMUResetEntry; 16148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1615025c32ffcd9f682cd761a836fe8798738d1648f2David Turnerstatic QTAILQ_HEAD(reset_handlers, QEMUResetEntry) reset_handlers = 1616025c32ffcd9f682cd761a836fe8798738d1648f2David Turner QTAILQ_HEAD_INITIALIZER(reset_handlers); 16175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int reset_requested; 1618088edf82b3d34409ed9d9fd09ec1f7e9b933304fDavid 'Digit' Turnerstatic int shutdown_requested, shutdown_signal = -1; 1619088edf82b3d34409ed9d9fd09ec1f7e9b933304fDavid 'Digit' Turnerstatic pid_t shutdown_pid; 16205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int powerdown_requested; 162123ca2ae2bf303236eb6b1e0beb126ec05c6c23bfDavid 'Digit' Turnerint debug_requested; 16225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int vmstop_requested; 16238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_shutdown_requested(void) 16255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 16265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int r = shutdown_requested; 16275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner shutdown_requested = 0; 16285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return r; 16298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_reset_requested(void) 16328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int r = reset_requested; 16345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner reset_requested = 0; 16355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return r; 16365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 16378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_powerdown_requested(void) 16395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 16405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int r = powerdown_requested; 16415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner powerdown_requested = 0; 16425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return r; 16438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int qemu_debug_requested(void) 16468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int r = debug_requested; 16485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner debug_requested = 0; 16495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return r; 16505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 16518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int qemu_vmstop_requested(void) 16535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 16545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int r = vmstop_requested; 16555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vmstop_requested = 0; 16565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return r; 16575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 16588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_register_reset(QEMUResetHandler *func, int order, void *opaque) 16608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner QEMUResetEntry **pre, *re; 16628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pre = &first_reset_entry; 16645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner while (*pre != NULL && (*pre)->order >= order) { 16655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pre = &(*pre)->next; 16668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner re = qemu_mallocz(sizeof(QEMUResetEntry)); 16685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner re->func = func; 16695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner re->opaque = opaque; 16705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner re->order = order; 16715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner re->next = NULL; 16725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *pre = re; 16738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_system_reset(void) 16768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner QEMUResetEntry *re; 16788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* reset all devices */ 1680025c32ffcd9f682cd761a836fe8798738d1648f2David Turner QTAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) { 16815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner re->func(re->opaque); 16828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_system_reset_request(void) 16868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 16875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (no_reboot) { 16885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner shutdown_requested = 1; 16895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else { 16905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner reset_requested = 1; 16918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_notify_event(); 16938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 16948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1695088edf82b3d34409ed9d9fd09ec1f7e9b933304fDavid 'Digit' Turnervoid qemu_system_killed(int signal, pid_t pid) 1696088edf82b3d34409ed9d9fd09ec1f7e9b933304fDavid 'Digit' Turner{ 1697088edf82b3d34409ed9d9fd09ec1f7e9b933304fDavid 'Digit' Turner shutdown_signal = signal; 1698088edf82b3d34409ed9d9fd09ec1f7e9b933304fDavid 'Digit' Turner shutdown_pid = pid; 1699088edf82b3d34409ed9d9fd09ec1f7e9b933304fDavid 'Digit' Turner qemu_system_shutdown_request(); 1700088edf82b3d34409ed9d9fd09ec1f7e9b933304fDavid 'Digit' Turner} 1701088edf82b3d34409ed9d9fd09ec1f7e9b933304fDavid 'Digit' Turner 17025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_system_shutdown_request(void) 17035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 17045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner shutdown_requested = 1; 17055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_notify_event(); 17065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 17078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_system_powerdown_request(void) 17098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner powerdown_requested = 1; 17115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_notify_event(); 17128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_IOTHREAD 17155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void qemu_system_vmstop_request(int reason) 17168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vmstop_requested = reason; 17185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_notify_event(); 17198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 17215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 17225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid main_loop_wait(int timeout) 17235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 17245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fd_set rfds, wfds, xfds; 17255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int ret, nfds; 17265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct timeval tv; 17275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 17285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_bh_update_timeout(&timeout); 17295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 173023ca2ae2bf303236eb6b1e0beb126ec05c6c23bfDavid 'Digit' Turner os_host_main_loop_wait(&timeout); 17315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 17328354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turner 17338354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turner tv.tv_sec = timeout / 1000; 17348354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turner tv.tv_usec = (timeout % 1000) * 1000; 17358354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turner 17368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* poll any events */ 17378354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turner 17388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXX: separate device handlers from system ones */ 17398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nfds = -1; 17408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FD_ZERO(&rfds); 17418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FD_ZERO(&wfds); 17428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FD_ZERO(&xfds); 17438354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turner qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds); 17445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (slirp_is_inited()) { 17458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project slirp_select_fill(&nfds, &rfds, &wfds, &xfds); 17468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17478354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turner 17485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_mutex_unlock_iothread(); 17498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv); 17505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_mutex_lock_iothread(); 17518354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turner qemu_iohandler_poll(&rfds, &wfds, &xfds, ret); 17525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (slirp_is_inited()) { 17538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 17548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FD_ZERO(&rfds); 17558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FD_ZERO(&wfds); 17568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FD_ZERO(&xfds); 17578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner slirp_select_poll(&rfds, &wfds, &xfds); 17595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 17605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 17616a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner qemu_run_all_timers(); 1762a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' Turner 17635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* Check bottom-halves last in case any of the earlier events triggered 17645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner them. */ 17655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_bh_poll(); 17665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 17675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 17685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 17695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic int vm_can_run(void) 17705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 17715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (powerdown_requested) 17725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 17735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (reset_requested) 17745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 17755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (shutdown_requested) 17765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 17775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (debug_requested) 17785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 17795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 1; 17808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 17818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void main_loop(void) 17838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 17845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int r; 17858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_IOTHREAD 17875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_system_ready = 1; 17885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_cond_broadcast(&qemu_system_cond); 17895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 17908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (;;) { 17925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner do { 17938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER 17945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int64_t ti; 17955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 17965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef CONFIG_IOTHREAD 17975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner tcg_cpu_exec(); 17988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 17998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER 18005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ti = profile_getclock(); 18018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 18025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner main_loop_wait(qemu_calculate_timeout()); 18035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_PROFILER 18045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dev_time += profile_getclock() - ti; 18058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 18065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } while (vm_can_run()); 18078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (qemu_debug_requested()) 18095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vm_stop(EXCP_DEBUG); 18105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (qemu_shutdown_requested()) { 18115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (no_shutdown) { 18125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vm_stop(0); 18135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner no_shutdown = 0; 18145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else 18158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 18168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (qemu_reset_requested()) { 18185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pause_all_vcpus(); 18195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_system_reset(); 18205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner resume_all_vcpus(); 18215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 18225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (qemu_powerdown_requested()) 18235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_system_powerdown(); 18245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if ((r = qemu_vmstop_requested())) 18255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vm_stop(r); 18268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 18275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner pause_all_vcpus(); 18285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 18298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void version(void) 18315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 18325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner printf("QEMU PC emulator version " QEMU_VERSION QEMU_PKGVERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n"); 18338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void help(int exitcode) 18368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 18375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner version(); 18385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner printf("usage: %s [options] [disk_image]\n" 18398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "\n" 18408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'disk_image' is a raw hard image image for IDE hard disk 0\n" 18418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "\n" 18425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF(option, opt_arg, opt_enum, opt_help) \ 18435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner opt_help 18445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEFHEADING(text) stringify(text) "\n" 1845c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner#include "qemu-options.def" 18465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef DEF 18475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef DEFHEADING 18485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef GEN_DOCS 18498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "\n" 18508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "During emulation, the following keys are useful:\n" 18518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "ctrl-alt-f toggle full screen\n" 18528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "ctrl-alt-n switch to virtual console 'n'\n" 18538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "ctrl-alt toggle mouse and keyboard grab\n" 18548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "\n" 18558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "When using -nographic, press 'ctrl-a h' to get some help.\n" 18568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project , 18578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "qemu", 18588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DEFAULT_RAM_SIZE, 18598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _WIN32 18608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DEFAULT_NETWORK_SCRIPT, 18618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DEFAULT_NETWORK_DOWN_SCRIPT, 18628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 18638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DEFAULT_GDBSTUB_PORT, 18648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/tmp/qemu.log"); 18658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(exitcode); 18668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 18678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define HAS_ARG 0x0001 18698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectenum { 18715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF(option, opt_arg, opt_enum, opt_help) \ 18725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner opt_enum, 18735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEFHEADING(text) 1874c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner#include "qemu-options.def" 18755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef DEF 18765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef DEFHEADING 18775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef GEN_DOCS 18788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 18798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct QEMUOption { 18818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *name; 18828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int flags; 18838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int index; 18848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} QEMUOption; 18858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic const QEMUOption qemu_options[] = { 18878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "h", 0, QEMU_OPTION_h }, 18885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF(option, opt_arg, opt_enum, opt_help) \ 18895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner { option, opt_arg, opt_enum }, 18905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEFHEADING(text) 1891c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner#include "qemu-options.def" 18925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef DEF 18935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef DEFHEADING 18945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef GEN_DOCS 1895c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner { NULL, 0, 0 }, 18968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 18978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 18985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void select_vgahw (const char *p) 18995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 19005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *opts; 19015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner cirrus_vga_enabled = 0; 19035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner std_vga_enabled = 0; 19045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vmsvga_enabled = 0; 19055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner xenfb_enabled = 0; 19065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (strstart(p, "std", &opts)) { 19075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner std_vga_enabled = 1; 19085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else if (strstart(p, "cirrus", &opts)) { 19095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner cirrus_vga_enabled = 1; 19105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else if (strstart(p, "vmware", &opts)) { 19115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vmsvga_enabled = 1; 19125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else if (strstart(p, "xenfb", &opts)) { 19135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner xenfb_enabled = 1; 19145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else if (!strstart(p, "none", &opts)) { 19155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner invalid_vga: 19165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "Unknown vga type: %s\n", p); 19175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 19185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 19195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner while (*opts) { 19205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *nextopt; 19215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (strstart(opts, ",retrace=", &nextopt)) { 19235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner opts = nextopt; 19245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (strstart(opts, "dumb", &nextopt)) 19255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vga_retrace_method = VGA_RETRACE_DUMB; 19265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else if (strstart(opts, "precise", &nextopt)) 19275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vga_retrace_method = VGA_RETRACE_PRECISE; 19285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else goto invalid_vga; 19295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } else goto invalid_vga; 19305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner opts = nextopt; 19315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 19325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 19335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MAX_NET_CLIENTS 32 19358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 19365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef _WIN32 19375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Look for support files in the same directory as the executable. */ 19385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic char *find_datadir(const char *argv0) 19395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 19405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char *p; 19415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char buf[MAX_PATH]; 19425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner DWORD len; 19435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner len = GetModuleFileName(NULL, buf, sizeof(buf) - 1); 19455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (len == 0) { 19465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return NULL; 19475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 19485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner buf[len] = 0; 19505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p = buf + len - 1; 19515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner while (p != buf && *p != '\\') 19525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p--; 19535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *p = 0; 19545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (access(buf, R_OK) == 0) { 19555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return qemu_strdup(buf); 19565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 19575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return NULL; 19585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 19595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else /* !_WIN32 */ 19605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Find a likely location for support files using the location of the binary. 19625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner For installed binaries this will be "$bindir/../share/qemu". When 19635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner running from the build tree this will be "$bindir/../pc-bios". */ 19645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define SHARE_SUFFIX "/share/qemu" 19655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BUILD_SUFFIX "/pc-bios" 19665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic char *find_datadir(const char *argv0) 19678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 19685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char *dir; 19695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char *p = NULL; 19705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char *res; 19715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef PATH_MAX 19725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char buf[PATH_MAX]; 19738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 19745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner size_t max_len; 19755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 19765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(__linux__) 19775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner { 19785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int len; 19795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner len = readlink("/proc/self/exe", buf, sizeof(buf) - 1); 19805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (len > 0) { 19815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner buf[len] = 0; 19825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p = buf; 19835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 19845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 19855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#elif defined(__FreeBSD__) 19865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner { 19875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int len; 19885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner len = readlink("/proc/curproc/file", buf, sizeof(buf) - 1); 19895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (len > 0) { 19905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner buf[len] = 0; 19915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p = buf; 19925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 19935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 19945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 19955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* If we don't have any way of figuring out the actual executable 19965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner location then try argv[0]. */ 19975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!p) { 19985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef PATH_MAX 19995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p = buf; 20005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 20015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner p = realpath(argv0, p); 20025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!p) { 20035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return NULL; 20045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 20055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 20065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dir = dirname(p); 20075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dir = dirname(dir); 20085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 20095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner max_len = strlen(dir) + 20105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner MAX(strlen(SHARE_SUFFIX), strlen(BUILD_SUFFIX)) + 1; 20115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner res = qemu_mallocz(max_len); 20125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner snprintf(res, max_len, "%s%s", dir, SHARE_SUFFIX); 20135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (access(res, R_OK)) { 20145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner snprintf(res, max_len, "%s%s", dir, BUILD_SUFFIX); 20155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (access(res, R_OK)) { 20165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_free(res); 20175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner res = NULL; 20185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 20195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 20205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef PATH_MAX 20215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner free(p); 20225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 20235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return res; 20245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 20255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef SHARE_SUFFIX 20265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef BUILD_SUFFIX 20275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 20285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 20295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerchar *qemu_find_file(int type, const char *name) 20305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 20315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int len; 20325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *subdir; 20335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char *buf; 20345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 20355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* If name contains path separators then try it as a straight path. */ 20365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if ((strchr(name, '/') || strchr(name, '\\')) 20375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner && access(name, R_OK) == 0) { 2038025c32ffcd9f682cd761a836fe8798738d1648f2David Turner return qemu_strdup(name); 20395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 20405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner switch (type) { 20415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_FILE_TYPE_BIOS: 20425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner subdir = ""; 20435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 20445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_FILE_TYPE_KEYMAP: 20455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner subdir = "keymaps/"; 20465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 20475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner default: 20485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner abort(); 20495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 20505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner len = strlen(data_dir) + strlen(name) + strlen(subdir) + 2; 20515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner buf = qemu_mallocz(len); 20525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner snprintf(buf, len, "%s/%s%s", data_dir, subdir, name); 20535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (access(buf, R_OK)) { 20545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_free(buf); 20555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return NULL; 20565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 20575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return buf; 20585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 20595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 20605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint main(int argc, char **argv, char **envp) 20615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 20625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *gdbstub_dev = NULL; 20638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t boot_devices_bitmap = 0; 20648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 20658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int snapshot, linux_boot, net_boot; 20666a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner const char *icount_option = NULL; 20678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *initrd_filename; 20688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *kernel_filename, *kernel_cmdline; 20698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *boot_devices = ""; 20705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner DisplayState *ds; 20715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner DisplayChangeListener *dcl; 20728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int cyls, heads, secs, translation; 20738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *net_clients[MAX_NET_CLIENTS]; 20748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nb_net_clients; 20755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *bt_opts[MAX_BT_CMDLINE]; 20765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int nb_bt_opts; 20778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int hda_index; 20788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int optind; 20798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *r, *optarg; 20805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner CharDriverState *monitor_hd = NULL; 20818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *monitor_device; 20828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *serial_devices[MAX_SERIAL_PORTS]; 20838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int serial_device_index; 20848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *parallel_devices[MAX_PARALLEL_PORTS]; 20858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int parallel_device_index; 20865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *virtio_consoles[MAX_VIRTIO_CONSOLES]; 20875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int virtio_console_index; 20888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *loadvm = NULL; 20898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QEMUMachine *machine; 20908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *cpu_model; 20918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *usb_devices[MAX_USB_CMDLINE]; 20928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int usb_devices_index; 20938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int tb_size; 20948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *pid_file = NULL; 20955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *incoming = NULL; 20965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner CPUState *env; 20975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int show_vnc_port = 0; 20985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2099a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' Turner init_clocks(); 2100a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' Turner 21015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_cache_utils_init(envp); 21028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2103a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner QLIST_INIT (&vm_change_state_head); 2104c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner os_setup_early_signal_handling(); 21058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner module_call_init(MODULE_INIT_MACHINE); 21075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner machine = find_default_machine(); 21088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cpu_model = NULL; 21098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project initrd_filename = NULL; 21108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ram_size = 0; 21118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project snapshot = 0; 21128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kernel_filename = NULL; 21138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kernel_cmdline = ""; 21148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cyls = heads = secs = 0; 21158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project translation = BIOS_ATA_TRANSLATION_AUTO; 21165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_device = "vc:80Cx24C"; 21178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial_devices[0] = "vc:80Cx24C"; 21198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 1; i < MAX_SERIAL_PORTS; i++) 21208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial_devices[i] = NULL; 21218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial_device_index = 0; 21228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner parallel_devices[0] = "vc:80Cx24C"; 21248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 1; i < MAX_PARALLEL_PORTS; i++) 21258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parallel_devices[i] = NULL; 21268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parallel_device_index = 0; 21278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) 21295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner virtio_consoles[i] = NULL; 21305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner virtio_console_index = 0; 21315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 21325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (i = 0; i < MAX_NODES; i++) { 21335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner node_mem[i] = 0; 21345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner node_cpumask[i] = 0; 21355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 21365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 21378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project usb_devices_index = 0; 21388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nb_net_clients = 0; 21405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner nb_bt_opts = 0; 21418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nb_drives = 0; 21428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nb_drives_opt = 0; 21435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner nb_numa_nodes = 0; 21448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hda_index = -1; 21458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nb_nics = 0; 21478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tb_size = 0; 21495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner autostart= 1; 21505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 21515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner register_watchdogs(); 21528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project optind = 1; 21548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(;;) { 21558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (optind >= argc) 21568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 21578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project r = argv[optind]; 21588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (r[0] != '-') { 21598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hda_index = drive_add(argv[optind++], HD_ALIAS, 0); 21608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 21618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const QEMUOption *popt; 21628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project optind++; 21648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Treat --foo the same as -foo. */ 21658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (r[1] == '-') 21668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project r++; 21678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project popt = qemu_options; 21688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(;;) { 21698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!popt->name) { 21708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "%s: invalid option -- '%s'\n", 21718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argv[0], r); 21728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 21738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(popt->name, r + 1)) 21758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 21768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project popt++; 21778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (popt->flags & HAS_ARG) { 21798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (optind >= argc) { 21808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "%s: option '%s' requires an argument\n", 21818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argv[0], r); 21828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 21838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project optarg = argv[optind++]; 21858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 21868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project optarg = NULL; 21878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 21888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 21898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch(popt->index) { 21908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_M: 21918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project machine = find_machine(optarg); 21928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!machine) { 21938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QEMUMachine *m; 21948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("Supported machines are:\n"); 21958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(m = first_machine; m != NULL; m = m->next) { 21968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("%-10s %s%s\n", 21978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project m->name, m->desc, 21985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner m->is_default ? " (default)" : ""); 21998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(*optarg != '?'); 22018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_cpu: 22048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* hw initialization will check this */ 22058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*optarg == '?') { 22068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX: implement xxx_cpu_list for targets that still miss it */ 22078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(cpu_list) 22088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cpu_list(stdout, &fprintf); 22098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 22108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 22118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 22128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cpu_model = optarg; 22138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_initrd: 22168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project initrd_filename = optarg; 22178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_hda: 22198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cyls == 0) 22208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hda_index = drive_add(optarg, HD_ALIAS, 0); 22218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 22228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hda_index = drive_add(optarg, HD_ALIAS 22238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ",cyls=%d,heads=%d,secs=%d%s", 22248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0, cyls, heads, secs, 22258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project translation == BIOS_ATA_TRANSLATION_LBA ? 22268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ",trans=lba" : 22278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project translation == BIOS_ATA_TRANSLATION_NONE ? 22288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ",trans=none" : ""); 22298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_hdb: 22318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_hdc: 22328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_hdd: 22338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda); 22348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_drive: 22368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drive_add(NULL, "%s", optarg); 22378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_mtdblock: 22398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drive_add(optarg, MTD_ALIAS); 22408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_sd: 22428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drive_add(optarg, SD_ALIAS); 22438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_pflash: 22458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drive_add(optarg, PFLASH_ALIAS); 22468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_snapshot: 22488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project snapshot = 1; 22498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_hdachs: 22518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 22528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *p; 22538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = optarg; 22548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cyls = strtol(p, (char **)&p, 0); 22558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cyls < 1 || cyls > 16383) 22568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto chs_fail; 22578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*p != ',') 22588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto chs_fail; 22598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p++; 22608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project heads = strtol(p, (char **)&p, 0); 22618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (heads < 1 || heads > 16) 22628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto chs_fail; 22638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*p != ',') 22648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto chs_fail; 22658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p++; 22668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project secs = strtol(p, (char **)&p, 0); 22678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (secs < 1 || secs > 63) 22688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto chs_fail; 22698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*p == ',') { 22708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p++; 22718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(p, "none")) 22728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project translation = BIOS_ATA_TRANSLATION_NONE; 22738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!strcmp(p, "lba")) 22748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project translation = BIOS_ATA_TRANSLATION_LBA; 22758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!strcmp(p, "auto")) 22768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project translation = BIOS_ATA_TRANSLATION_AUTO; 22778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 22788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto chs_fail; 22798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (*p != '\0') { 22808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project chs_fail: 22818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: invalid physical CHS format\n"); 22828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 22838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (hda_index != -1) 22858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project snprintf(drives_opt[hda_index].opt, 22868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sizeof(drives_opt[hda_index].opt), 22878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HD_ALIAS ",cyls=%d,heads=%d,secs=%d%s", 22888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0, cyls, heads, secs, 22898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project translation == BIOS_ATA_TRANSLATION_LBA ? 22908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ",trans=lba" : 22918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project translation == BIOS_ATA_TRANSLATION_NONE ? 22928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ",trans=none" : ""); 22938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 22948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 22955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_numa: 22965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (nb_numa_nodes >= MAX_NODES) { 22975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: too many NUMA nodes\n"); 22985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 22995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 23005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner numa_add(optarg); 23015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 23028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_nographic: 23035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner display_type = DT_NOGRAPHIC; 23048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_CURSES 23068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_curses: 23075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner display_type = DT_CURSES; 23088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 23108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_portrait: 23118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project graphic_rotate = 1; 23128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_kernel: 23148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kernel_filename = optarg; 23158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_append: 23178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kernel_cmdline = optarg; 23188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_cdrom: 23208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drive_add(optarg, CDROM_ALIAS); 23218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_boot: 23238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project boot_devices = optarg; 23248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* We just do some generic consistency checks */ 23258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 23268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Could easily be extended to 64 devices if needed */ 23278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *p; 2328707c8a8975842105dd04d61a416ee175d033b94dDavid 'Digit' Turner 23298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project boot_devices_bitmap = 0; 23308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (p = boot_devices; *p != '\0'; p++) { 23318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Allowed boot devices are: 23328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * a b : floppy disk drives 23338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * c ... f : IDE disk drives 23348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * g ... m : machine implementation dependant drives 23358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * n ... p : network devices 23368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * It's up to each machine implementation to check 23378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * if the given boot devices match the actual hardware 23388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * implementation and firmware features. 23398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 23408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*p < 'a' || *p > 'q') { 23418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Invalid boot device '%c'\n", *p); 23428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 23438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (boot_devices_bitmap & (1 << (*p - 'a'))) { 23458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 23468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Boot device '%c' was given twice\n",*p); 23478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 23488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project boot_devices_bitmap |= 1 << (*p - 'a'); 23508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_fda: 23548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_fdb: 23558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda); 23568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_I386 23588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_no_fd_bootchk: 23598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fd_bootchk = 0; 23608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 23628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_net: 23638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (nb_net_clients >= MAX_NET_CLIENTS) { 23648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: too many network clients\n"); 23658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 23668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 23678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project net_clients[nb_net_clients] = optarg; 23688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nb_net_clients++; 23698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_SLIRP 23718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_tftp: 23728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tftp_prefix = optarg; 23738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_bootp: 23758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bootp_filename = optarg; 23768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_redir: 23785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner net_slirp_redir(NULL, optarg, NULL); 23798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 23815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_bt: 23825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (nb_bt_opts >= MAX_BT_CMDLINE) { 23835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: too many bluetooth options\n"); 23845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 23855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 23865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bt_opts[nb_bt_opts++] = optarg; 23875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 23888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef HAS_AUDIO 23898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_audio_help: 23908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AUD_help (); 23918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit (0); 23928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_soundhw: 23948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project select_soundhw (optarg); 23958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 23968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 23978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_h: 23985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner help(0); 23995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 24005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_version: 24015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner version(); 24025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(0); 24038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_m: { 24058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t value; 24068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *ptr; 24078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project value = strtoul(optarg, &ptr, 10); 24098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (*ptr) { 24108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 0: case 'M': case 'm': 24118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project value <<= 20; 24128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'G': case 'g': 24148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project value <<= 30; 24158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 24178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: invalid ram size: %s\n", optarg); 24188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* On 32-bit hosts, QEMU is limited by virtual address space */ 2422025c32ffcd9f682cd761a836fe8798738d1648f2David Turner if (value > (2047 << 20) && HOST_LONG_BITS == 32) { 24238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n"); 24248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (value != (uint64_t)(ram_addr_t)value) { 24278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: ram size too large\n"); 24288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ram_size = value; 24318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_d: 24348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 24358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int mask; 24365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const CPULogItem *item; 24378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 24388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mask = cpu_str_to_log_mask(optarg); 24398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!mask) { 24408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("Log items (comma separated):\n"); 24418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(item = cpu_log_items; item->mask != 0; item++) { 24428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("%-10s %s\n", item->name, item->help); 24438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cpu_set_log(mask); 24478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_s: 24505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner gdbstub_dev = "tcp::" DEFAULT_GDBSTUB_PORT; 24518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_gdb: 24535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner gdbstub_dev = optarg; 24548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_L: 24565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner data_dir = optarg; 24575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 24585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_bios: 24595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bios_name = optarg; 24605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 24615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_singlestep: 24625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner singlestep = 1; 24638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_S: 24658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project autostart = 0; 24668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef _WIN32 24688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_k: 24698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project keyboard_layout = optarg; 24708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 24728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_localtime: 24738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rtc_utc = 0; 24748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_vga: 24765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner select_vgahw (optarg); 24778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 24785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(TARGET_PPC) || defined(TARGET_SPARC) 24798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_g: 24808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 24818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *p; 24828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int w, h, depth; 24838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = optarg; 24848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project w = strtol(p, (char **)&p, 10); 24858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (w <= 0) { 24868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project graphic_error: 24878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: invalid resolution or depth\n"); 24888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 24898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 24908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*p != 'x') 24918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto graphic_error; 24928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p++; 24938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project h = strtol(p, (char **)&p, 10); 24948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (h <= 0) 24958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto graphic_error; 24968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*p == 'x') { 24978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p++; 24988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project depth = strtol(p, (char **)&p, 10); 24998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (depth != 8 && depth != 15 && depth != 16 && 25008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project depth != 24 && depth != 32) 25018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto graphic_error; 25028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (*p == '\0') { 25038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project depth = graphic_depth; 25048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 25058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto graphic_error; 25068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 25088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project graphic_width = w; 25098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project graphic_height = h; 25108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project graphic_depth = depth; 25118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 25148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_echr: 25158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 25168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *r; 25178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project term_escape_char = strtol(optarg, &r, 0); 25188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (r == optarg) 25198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("Bad argument to echr\n"); 25208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_monitor: 25238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project monitor_device = optarg; 25248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_serial: 25268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (serial_device_index >= MAX_SERIAL_PORTS) { 25278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: too many serial ports\n"); 25288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 25298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial_devices[serial_device_index] = optarg; 25318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial_device_index++; 25328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_watchdog: 25345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner i = select_watchdog(optarg); 25355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (i > 0) 25365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit (i == 1 ? 1 : 0); 25375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 25385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_watchdog_action: 25395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (select_watchdog_action(optarg) == -1) { 25405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "Unknown -watchdog-action parameter\n"); 25415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 25425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 25435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 25445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_virtiocon: 25455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (virtio_console_index >= MAX_VIRTIO_CONSOLES) { 25465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: too many virtio consoles\n"); 25475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 25485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 25495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner virtio_consoles[virtio_console_index] = optarg; 25505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner virtio_console_index++; 25515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 25528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_parallel: 25538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (parallel_device_index >= MAX_PARALLEL_PORTS) { 25548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: too many parallel ports\n"); 25558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 25568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 25578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parallel_devices[parallel_device_index] = optarg; 25588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parallel_device_index++; 25598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_loadvm: 25618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project loadvm = optarg; 25628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_full_screen: 25648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project full_screen = 1; 25658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_SDL 25678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_no_frame: 25688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project no_frame = 1; 25698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_alt_grab: 25718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alt_grab = 1; 25728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_no_quit: 25748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project no_quit = 1; 25758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_sdl: 25775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner display_type = DT_SDL; 25785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 25798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 25808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_pidfile: 25818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pid_file = optarg; 25828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_I386 25848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_win2k_hack: 25858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project win2k_install_hack = 1; 25868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 25875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_rtc_td_hack: 25885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner rtc_td_hack = 1; 25895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 25905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_acpitable: 25915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if(acpi_table_add(optarg) < 0) { 25925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "Wrong acpi table provided\n"); 25935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 25945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 25955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 25965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_smbios: 25975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if(smbios_entry_add(optarg) < 0) { 25985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "Wrong smbios provided\n"); 25995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 26005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 26015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 26028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 26035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_KQEMU 26048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_no_kqemu: 26058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kqemu_allowed = 0; 26068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_kernel_kqemu: 26088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kqemu_allowed = 2; 26098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 26115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_KVM 26125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_enable_kvm: 26135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner kvm_allowed = 1; 26145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_KQEMU 26155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner kqemu_allowed = 0; 26165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 26175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 26185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 26198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_usb: 26208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project usb_enabled = 1; 26218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_usbdevice: 26238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project usb_enabled = 1; 26248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (usb_devices_index >= MAX_USB_CMDLINE) { 26258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Too many USB devices\n"); 26268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 26278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project usb_devices[usb_devices_index] = optarg; 26298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project usb_devices_index++; 26308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_smp: 26328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project smp_cpus = atoi(optarg); 26335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (smp_cpus < 1) { 26348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Invalid number of CPUs\n"); 26358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 26368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_vnc: 26395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner display_type = DT_VNC; 26408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project vnc_display = optarg; 26418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef TARGET_I386 26438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_no_acpi: 26448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project acpi_enabled = 0; 26458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_no_hpet: 26475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner no_hpet = 1; 26485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 26495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_no_virtio_balloon: 26505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner no_virtio_balloon = 1; 26515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 26525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 26538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_no_reboot: 26548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project no_reboot = 1; 26558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_no_shutdown: 26578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project no_shutdown = 1; 26588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_show_cursor: 26608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cursor_hide = 0; 26618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_uuid: 26635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if(qemu_uuid_parse(optarg, qemu_uuid) < 0) { 26645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "Fail to parse UUID string." 26655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner " Wrong format.\n"); 26665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 26675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 26685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 26698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_option_rom: 26708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (nb_option_roms >= MAX_OPTION_ROMS) { 26718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Too many option ROMs\n"); 26728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 26738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project option_rom[nb_option_roms] = optarg; 26758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nb_option_roms++; 26768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(TARGET_ARM) || defined(TARGET_M68K) 26788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_semihosting: 26798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project semihosting_enabled = 1; 26808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 26828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_name: 26838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_name = optarg; 26848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(TARGET_SPARC) || defined(TARGET_PPC) 26868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_prom_env: 26878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (nb_prom_envs >= MAX_PROM_ENVS) { 26888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Too many prom variables\n"); 26898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 26908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 26918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project prom_envs[nb_prom_envs] = optarg; 26928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nb_prom_envs++; 26938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 26958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_ARM 26968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_old_param: 26978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project old_param = 1; 26988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 26998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 27008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_clock: 27018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project configure_alarms(optarg); 27028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 27038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_startdate: 27048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 27058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct tm tm; 2706c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner time_t rtc_start_date = 0; 27078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(optarg, "now")) { 27088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rtc_date_offset = -1; 27098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 27108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (sscanf(optarg, "%d-%d-%dT%d:%d:%d", 27118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &tm.tm_year, 27128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &tm.tm_mon, 27138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &tm.tm_mday, 27148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &tm.tm_hour, 27158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &tm.tm_min, 27168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &tm.tm_sec) == 6) { 27178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* OK */ 27188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (sscanf(optarg, "%d-%d-%d", 27198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &tm.tm_year, 27208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &tm.tm_mon, 27218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &tm.tm_mday) == 3) { 27228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tm.tm_hour = 0; 27238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tm.tm_min = 0; 27248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tm.tm_sec = 0; 27258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 27268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto date_fail; 27278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tm.tm_year -= 1900; 27298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tm.tm_mon--; 27308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rtc_start_date = mktimegm(&tm); 27318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (rtc_start_date == -1) { 27328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project date_fail: 27338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Invalid date format. Valid format are:\n" 27348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "'now' or '2006-06-17T16:01:21' or '2006-06-17'\n"); 27358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 27368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rtc_date_offset = time(NULL) - rtc_start_date; 27388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 27418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_tb_size: 27428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tb_size = strtol(optarg, NULL, 0); 27438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (tb_size < 0) 27448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tb_size = 0; 27458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 27468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case QEMU_OPTION_icount: 27476a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner icount_option = optarg; 27488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 27495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_incoming: 27505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner incoming = optarg; 27518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 27525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_XEN 27535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_xen_domid: 27545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner xen_domid = atoi(optarg); 27558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 27565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_xen_create: 27575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner xen_mode = XEN_CREATE; 27588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 27595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case QEMU_OPTION_xen_attach: 27605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner xen_mode = XEN_ATTACH; 27618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 27628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 27638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 27668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* If no data_dir is specified then try to find it relative to the 27685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner executable path. */ 27695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!data_dir) { 27705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner data_dir = find_datadir(argv[0]); 27715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 27725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* If all else fails use the install patch specified when building. */ 27735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!data_dir) { 27745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner data_dir = CONFIG_QEMU_SHAREDIR; 27755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 27765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2777c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner if (pid_file && qemu_create_pidfile(pid_file) != 0) { 2778c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner os_pidfile_error(); 2779c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner exit(1); 2780c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner } 2781c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner 27825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(CONFIG_KVM) && defined(CONFIG_KQEMU) 27835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (kvm_allowed && kqemu_allowed) { 27845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, 27855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "You can not enable both KVM and kqemu at the same time\n"); 27865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 27875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 27885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 27895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 27905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */ 27915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (smp_cpus > machine->max_cpus) { 27925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus " 27935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner "supported by machine `%s' (%d)\n", smp_cpus, machine->name, 27945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner machine->max_cpus); 27955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 27965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 27975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 27985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (display_type == DT_NOGRAPHIC) { 27998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (serial_device_index == 0) 28008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial_devices[0] = "stdio"; 28018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (parallel_device_index == 0) 28028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parallel_devices[0] = "null"; 28038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strncmp(monitor_device, "vc", 2) == 0) 28048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project monitor_device = "stdio"; 28058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_KQEMU 28088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (smp_cpus > 1) 28098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kqemu_allowed = 0; 28108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 28115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (qemu_init_main_loop()) { 28125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu_init_main_loop failed\n"); 28135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 28145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 28158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project linux_boot = (kernel_filename != NULL); 28168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF; 28178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!linux_boot && *kernel_cmdline != '\0') { 28198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "-append only allowed with -kernel option\n"); 28208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 28218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!linux_boot && initrd_filename != NULL) { 28248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "-initrd only allowed with -kernel option\n"); 28258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 28268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* boot to floppy or the default cd if no hard disk defined yet */ 28298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!boot_devices[0]) { 28308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project boot_devices = "cad"; 28318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2832c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner os_set_line_buffering(); 28338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (init_timer_alarm() < 0) { 28355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "could not initialize alarm timer\n"); 28365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 28375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 28386a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner configure_icount(icount_option); 28398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 28418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project socket_init(); 28428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 28438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* init network clients */ 28458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (nb_net_clients == 0) { 28468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no clients, we use a default config */ 28478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project net_clients[nb_net_clients++] = "nic"; 28488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_SLIRP 28498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project net_clients[nb_net_clients++] = "user"; 28508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 28518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0;i < nb_net_clients; i++) { 28548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (net_client_parse(net_clients[i]) < 0) 28558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 28568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner net_client_check(); 28588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_I386 28608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXX: this should be moved in the PC machine instantiation code */ 28618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (net_boot != 0) { 28628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int netroms = 0; 28638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < nb_nics && i < 4; i++) { 28648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *model = nd_table[i].model; 28658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char buf[1024]; 28665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char *filename; 28678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (net_boot & (1 << i)) { 28688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (model == NULL) 28698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project model = "ne2k_pci"; 28705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner snprintf(buf, sizeof(buf), "pxe-%s.bin", model); 28715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, buf); 28725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (filename && get_image_size(filename) > 0) { 28738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (nb_option_roms >= MAX_OPTION_ROMS) { 28748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Too many option ROMs\n"); 28758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 28768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner option_rom[nb_option_roms] = qemu_strdup(buf); 28788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nb_option_roms++; 28798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project netroms++; 28808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (filename) { 28825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_free(filename); 28835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 28848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (netroms == 0) { 28878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "No valid PXE rom found for network device\n"); 28888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 28898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 28918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 28928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* init the bluetooth world */ 28945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (i = 0; i < nb_bt_opts; i++) 28955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (bt_parse(bt_opts[i])) 28965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 28978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* init the memory */ 28995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (ram_size == 0) 29005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ram_size = DEFAULT_RAM_SIZE * 1024 * 1024; 29015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 29025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_KQEMU 29035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* FIXME: This is a nasty hack because kqemu can't cope with dynamic 29045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner guest ram allocation. It needs to go away. */ 29055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (kqemu_allowed) { 29065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner kqemu_phys_ram_size = ram_size + 8 * 1024 * 1024 + 4 * 1024 * 1024; 29075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner kqemu_phys_ram_base = qemu_vmalloc(kqemu_phys_ram_size); 29085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!kqemu_phys_ram_base) { 29095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "Could not allocate physical memory\n"); 29105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 29115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 29128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 29135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 29148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* init the dynamic translator */ 29168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cpu_exec_init_all(tb_size * 1024 * 1024); 29178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bdrv_init(); 29198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we always create the cdrom drive, even if no disk is there */ 29218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (nb_drives_opt < MAX_DRIVES) 29238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drive_add(NULL, CDROM_ALIAS); 29248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we always create at least one floppy */ 29268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (nb_drives_opt < MAX_DRIVES) 29288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drive_add(NULL, FD_ALIAS, 0); 29298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we always create one sd slot, even if no card is in it */ 29318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2932cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner if (nb_drives_opt < MAX_DRIVES) { 29338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project drive_add(NULL, SD_ALIAS); 2934cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner } 29358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* open the virtual block devices */ 2937cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner if (snapshot) 2938cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot, NULL, 0); 2939cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func, &machine->use_scsi, 1) != 0) 2940cb42a1b1461e02efb034582ac5d8f71534723b92David 'Digit' Turner exit(1); 29418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29426a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner //register_savevm("timer", 0, 2, timer_save, timer_load, NULL); 29435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner register_savevm_live("ram", 0, 3, ram_save_live, NULL, ram_load, NULL); 29448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* must be after terminal init, SDL library changes signal handlers */ 2946c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner os_setup_signal_handling(); 29478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 29488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Maintain compatibility with multiple stdio monitors */ 29498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(monitor_device,"stdio")) { 29508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < MAX_SERIAL_PORTS; i++) { 29518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *devname = serial_devices[i]; 29528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (devname && !strcmp(devname,"mon:stdio")) { 29538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project monitor_device = NULL; 29548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 29558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (devname && !strcmp(devname,"stdio")) { 29568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project monitor_device = NULL; 29578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial_devices[i] = "mon:stdio"; 29588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 29598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 29608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 29618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 29625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 29635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (nb_numa_nodes > 0) { 29645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int i; 29655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 29665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (nb_numa_nodes > smp_cpus) { 29675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner nb_numa_nodes = smp_cpus; 29685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 29695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 29705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* If no memory size if given for any node, assume the default case 29715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * and distribute the available memory equally across all nodes 29725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 29735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (i = 0; i < nb_numa_nodes; i++) { 29745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (node_mem[i] != 0) 29755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 29765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 29775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (i == nb_numa_nodes) { 29785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner uint64_t usedmem = 0; 29795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 29805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* On Linux, the each node's border has to be 8MB aligned, 29815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * the final node gets the rest. 29825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 29835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (i = 0; i < nb_numa_nodes - 1; i++) { 29845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner node_mem[i] = (ram_size / nb_numa_nodes) & ~((1 << 23UL) - 1); 29855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner usedmem += node_mem[i]; 29865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 29875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner node_mem[i] = ram_size - usedmem; 29885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 29895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 29905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (i = 0; i < nb_numa_nodes; i++) { 29915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (node_cpumask[i] != 0) 29925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 29935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 29945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* assigning the VCPUs round-robin is easier to implement, guest OSes 29955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * must cope with this anyway, because there are BIOSes out there in 29965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * real machines which also use this scheme. 29975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 29985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (i == nb_numa_nodes) { 29995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (i = 0; i < smp_cpus; i++) { 30005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner node_cpumask[i % nb_numa_nodes] |= 1 << i; 30015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 30055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (kvm_enabled()) { 30065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int ret; 30075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 30085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ret = kvm_init(smp_cpus); 30095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (ret < 0) { 30105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "failed to initialize KVM\n"); 30115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 30125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 30158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (monitor_device) { 30165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_hd = qemu_chr_open("monitor", monitor_device, NULL); 30178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!monitor_hd) { 30188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device); 30198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 30208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 30218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 30228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 30238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < MAX_SERIAL_PORTS; i++) { 30248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *devname = serial_devices[i]; 30258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (devname && strcmp(devname, "none")) { 30265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char label[32]; 30275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner snprintf(label, sizeof(label), "serial%d", i); 30285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner serial_hds[i] = qemu_chr_open(label, devname, NULL); 30298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!serial_hds[i]) { 30308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: could not open serial device '%s'\n", 30318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project devname); 30328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 30338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 30348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 30358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 30368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 30378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < MAX_PARALLEL_PORTS; i++) { 30388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *devname = parallel_devices[i]; 30398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (devname && strcmp(devname, "none")) { 30405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char label[32]; 30415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner snprintf(label, sizeof(label), "parallel%d", i); 30425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner parallel_hds[i] = qemu_chr_open(label, devname, NULL); 30438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!parallel_hds[i]) { 30448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "qemu: could not open parallel device '%s'\n", 30458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project devname); 30468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 30478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 30488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 30498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 30508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 30515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) { 30525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *devname = virtio_consoles[i]; 30535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (devname && strcmp(devname, "none")) { 30545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char label[32]; 30555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner snprintf(label, sizeof(label), "virtcon%d", i); 30565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner virtcon_hds[i] = qemu_chr_open(label, devname, NULL); 30575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!virtcon_hds[i]) { 30585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: could not open virtio console '%s'\n", 30595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner devname); 30605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 30615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 30648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 30655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner module_call_init(MODULE_INIT_DEVICE); 30665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 30675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner machine->init(ram_size, boot_devices, 30688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kernel_filename, kernel_cmdline, initrd_filename, cpu_model); 30698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 30705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 30715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (env = first_cpu; env != NULL; env = env->next_cpu) { 30725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (i = 0; i < nb_numa_nodes; i++) { 30735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (node_cpumask[i] & (1 << env->cpu_index)) { 30745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner env->numa_node = i; 30755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 30795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner current_machine = machine; 30805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 30815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* Set KVM's vcpu state to qemu's initial CPUState. */ 30825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (kvm_enabled()) { 30835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int ret; 30845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 30855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ret = kvm_sync_vcpus(); 30865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (ret < 0) { 30875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "failed to initialize vcpus\n"); 30885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 30895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 30915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 30928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* init USB devices */ 30938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (usb_enabled) { 30948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < usb_devices_index; i++) { 30955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (usb_device_add(usb_devices[i], 0) < 0) { 30968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Warning: could not add USB device %s\n", 30978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project usb_devices[i]); 30988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 30998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 31008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 31018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 31025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!display_state) 31035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dumb_display_init(); 31045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* just use the first displaystate for the moment */ 31055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ds = display_state; 31065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 31075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (display_type == DT_DEFAULT) { 31085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(CONFIG_SDL) || defined(CONFIG_COCOA) 31095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner display_type = DT_SDL; 31105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else 31115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner display_type = DT_VNC; 31125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vnc_display = "localhost:0,to=99"; 31135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner show_vnc_port = 1; 31145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 31158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3116707c8a8975842105dd04d61a416ee175d033b94dDavid 'Digit' Turner 31178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 31185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner switch (display_type) { 31195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case DT_NOGRAPHIC: 31205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 31215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(CONFIG_CURSES) 31225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case DT_CURSES: 31235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner curses_display_init(ds, full_screen); 31245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 31255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 31265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(CONFIG_SDL) 31275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case DT_SDL: 31285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner sdl_display_init(ds, full_screen, no_frame); 31295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 31305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#elif defined(CONFIG_COCOA) 31315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case DT_SDL: 31325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner cocoa_display_init(ds, full_screen); 31335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 31345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 31355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner case DT_VNC: 31365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vnc_display_init(ds); 31375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (vnc_display_open(ds, vnc_display) < 0) 31388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 31395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 31405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (show_vnc_port) { 31415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner printf("VNC server running on `%s'\n", vnc_display_local_addr(ds)); 31428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 31435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 31445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner default: 31455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner break; 31468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 31475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dpy_resize(ds); 31488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 31495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dcl = ds->listeners; 31505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner while (dcl != NULL) { 31515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (dcl->dpy_refresh != NULL) { 31525973c775c853e26f684de58ad28c267281aaffd6David 'Digit' Turner ds->gui_timer = qemu_new_timer_ms(rt_clock, gui_update, ds); 31535973c775c853e26f684de58ad28c267281aaffd6David 'Digit' Turner qemu_mod_timer(ds->gui_timer, qemu_get_clock_ms(rt_clock)); 31545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 31555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner dcl = dcl->next; 31565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 31575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 31585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (display_type == DT_NOGRAPHIC || display_type == DT_VNC) { 31595973c775c853e26f684de58ad28c267281aaffd6David 'Digit' Turner nographic_timer = qemu_new_timer_ms(rt_clock, nographic_update, NULL); 31605973c775c853e26f684de58ad28c267281aaffd6David 'Digit' Turner qemu_mod_timer(nographic_timer, qemu_get_clock_ms(rt_clock)); 31615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 31628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 31635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner text_consoles_set_display(display_state); 31645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_chr_initial_reset(); 31658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 31665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (monitor_device && monitor_hd) 31675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner monitor_init(monitor_hd, MONITOR_USE_READLINE | MONITOR_IS_DEFAULT); 31685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 31695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for(i = 0; i < MAX_SERIAL_PORTS; i++) { 31705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *devname = serial_devices[i]; 31715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (devname && strcmp(devname, "none")) { 31725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (strstart(devname, "vc", 0)) 31735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i); 31748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 31758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 31768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 31775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for(i = 0; i < MAX_PARALLEL_PORTS; i++) { 31785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *devname = parallel_devices[i]; 31795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (devname && strcmp(devname, "none")) { 31805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (strstart(devname, "vc", 0)) 31815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i); 31825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 31835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 31845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 31855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) { 31865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char *devname = virtio_consoles[i]; 31875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (virtcon_hds[i] && devname) { 31885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (strstart(devname, "vc", 0)) 31895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_chr_printf(virtcon_hds[i], "virtio console%d\r\n", i); 31905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 31915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 31925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 31935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (gdbstub_dev && gdbserver_start(gdbstub_dev) < 0) { 31945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner fprintf(stderr, "qemu: could not open gdbserver on device '%s'\n", 31955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner gdbstub_dev); 31965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner exit(1); 31975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 31985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 31995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (loadvm) 32005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner do_loadvm(cur_mon, loadvm); 32015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 32025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (incoming) { 32035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner autostart = 0; /* fixme how to deal with -daemonize */ 32045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_start_incoming_migration(incoming); 32055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 32065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 32075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (autostart) 32085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner vm_start(); 32095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 3210c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner os_setup_post(); 32118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 32125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner main_loop(); 32135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner quit_timers(); 32145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner net_cleanup(); 32155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 32168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 32178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3218