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