main.c revision b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08c
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2006-2008 The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms. 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful, 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <signal.h> 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <unistd.h> 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h> 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/time.h> 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <process.h> 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 207fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "sockets.h" 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/android.h" 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "qemu-common.h" 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "sysemu.h" 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "console.h" 2734f2974ce7ec7c71beb47b5daf9089d5c8c40c79David 'Digit' Turner#include "user-events.h" 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <SDL.h> 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <SDL_syswm.h> 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "math.h" 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/charmap.h" 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/debug.h" 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/resource.h" 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/config.h" 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/config/config.h" 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/image.h" 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/trackball.h" 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/keyboard.h" 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/file.h" 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/window.h" 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/keyset.h" 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/gps.h" 489877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project#include "android/hw-qemud.h" 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/hw-kmsg.h" 50c5b127050f2dbed015d6b01703a33062d6910d4aDavid 'Digit' Turner#include "android/hw-lcd.h" 519877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project#include "android/hw-sensors.h" 52318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner#include "android/boot-properties.h" 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/user-config.h" 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/bufprint.h" 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/dirscanner.h" 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/path.h" 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/timezone.h" 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/cmdline-option.h" 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/help.h" 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/goldfish_nand.h" 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/globals.h" 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "tcpdump.h" 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 660119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine#include "android/qemulator.h" 67055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner#include "android/display.h" 680119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "framebuffer.h" 70055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectAndroidRotation android_framebuffer_rotation; 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define STRINGIFY(x) _STRINGIFY(x) 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _STRINGIFY(x) #x 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 76a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#ifdef ANDROID_SDK_TOOLS_REVISION 77a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING STRINGIFY(ANDROID_SDK_TOOLS_REVISION)".0" 78a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#else 79a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING "standalone" 80a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#endif 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define KEYSET_FILE "default.keyset" 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinKeyset* android_keyset; 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define D(...) do { if (VERBOSE_CHECK(init)) dprint(__VA_ARGS__); } while (0) 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int control_console_start( int port ); /* in control.c */ 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int qemu_milli_needed; 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the default device DPI if none is specified by the skin 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEFAULT_DEVICE_DPI 165 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int opts->flashkeys; /* forward */ 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_TRACE 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void start_tracing(void); 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void stop_tracing(void); 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned long android_verbose; 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** U T I L I T Y R O U T I N E S *****/ 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*** CONFIGURATION 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ***/ 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic AUserConfig* userConfig; 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectemulator_config_init( void ) 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project userConfig = auserConfig_new( android_avdInfo ); 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* only call this function on normal exits, so that ^C doesn't save the configuration */ 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectemulator_config_done( void ) 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int win_x, win_y; 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!userConfig) { 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("no user configuration?"); 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_WM_GetPos( &win_x, &win_y ); 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_setWindowPos(userConfig, win_x, win_y); 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_save(userConfig); 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *loadpng(const char *fn, unsigned *_width, unsigned *_height); 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *readpng(const unsigned char* base, size_t size, unsigned *_width, unsigned *_height); 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_DARWIN 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ANDROID_ICON_PNG "android_icon_256.png" 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ANDROID_ICON_PNG "android_icon_16.png" 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectsdl_set_window_icon( void ) 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int window_icon_set; 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!window_icon_set) 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HANDLE handle = GetModuleHandle( NULL ); 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HICON icon = LoadIcon( handle, MAKEINTRESOURCE(1) ); 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_SysWMinfo wminfo; 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_GetWMInfo(&wminfo); 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SetClassLong( wminfo.window, GCL_HICON, (LONG)icon ); 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else /* !_WIN32 */ 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned icon_w, icon_h; 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size_t icon_bytes; 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const unsigned char* icon_data; 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void* icon_pixels; 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project window_icon_set = 1; 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project icon_data = android_icon_find( ANDROID_ICON_PNG, &icon_bytes ); 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !icon_data ) 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project icon_pixels = readpng( icon_data, icon_bytes, &icon_w, &icon_h ); 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !icon_pixels ) 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the data is loaded into memory as RGBA bytes by libpng. we want to manage 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the values as 32-bit ARGB pixels, so swap the bytes accordingly depending 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * on our CPU endianess 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned* d = icon_pixels; 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned* d_end = d + icon_w*icon_h; 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; d < d_end; d++ ) { 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned pix = d[0]; 19120894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#if HOST_WORDS_BIGENDIAN 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* R,G,B,A read as RGBA => ARGB */ 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix = ((pix >> 8) & 0xffffff) | (pix << 24); 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* R,G,B,A read as ABGR => ARGB */ 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix = (pix & 0xff00ff00) | ((pix >> 16) & 0xff) | ((pix & 0xff) << 16); 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project d[0] = pix; 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Surface* icon = sdl_surface_from_argb32( icon_pixels, icon_w, icon_h ); 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (icon != NULL) { 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_WM_SetIcon(icon, NULL); 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_FreeSurface(icon); 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free( icon_pixels ); 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* !_WIN32 */ 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 212cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner#define ONE_MB (1024*1024) 213cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 214cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnerunsigned convertBytesToMB( uint64_t size ) 215cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner{ 216cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (size == 0) 217cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return 0; 218cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 219cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner size = (size + ONE_MB-1) >> 20; 220cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (size > UINT_MAX) 221cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner size = UINT_MAX; 222cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 223cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return (unsigned) size; 224cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 225cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 226cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turneruint64_t convertMBToBytes( unsigned megaBytes ) 227cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner{ 228cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return ((uint64_t)megaBytes << 20); 229cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 230cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** S K I N I M A G E S *****/ 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void sdl_at_exit(void) 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_config_done(); 2410119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_done(qemulator_get()); 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Quit(); 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid sdl_display_init(DisplayState *ds, int full_screen, int no_frame) 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2480119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine QEmulator* emulator = qemulator_get(); 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinDisplay* disp = skin_layout_get_display(emulator->layout); 2505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int width, height; 251055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner char buf[128]; 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (disp->rotation & 1) { 2545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner width = disp->rect.size.h; 2555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner height = disp->rect.size.w; 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 2575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner width = disp->rect.size.w; 2585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner height = disp->rect.size.h; 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 261055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner snprintf(buf, sizeof buf, "width=%d,height=%d", width, height); 262055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner android_display_init(ds, qframebuffer_fifo_get()); 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* skin_network_speed = NULL; 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* skin_network_delay = NULL; 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* list of skin aliases */ 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name; 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* alias; 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} skin_aliases[] = { 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA-L", "320x240" }, 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA-P", "240x320" }, 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA-L", "480x320" }, 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA-P", "320x480" }, 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA", "320x240" }, 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA", "320x480" }, 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL } 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this is used by hw/events_device.c to send the charmap name to the system */ 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* android_skin_keycharmap = NULL; 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid init_skinned_ui(const char *path, const char *name, AndroidOptions* opts) 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[1024]; 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* root; 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* n; 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int win_x, win_y, flags; 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGINT, SIG_DFL); 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _WIN32 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGQUIT, SIG_DFL); 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we're not a game, so allow the screensaver to run */ 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project putenv("SDL_VIDEO_ALLOW_SCREENSAVER=1"); 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags = SDL_INIT_NOPARACHUTE; 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_window) 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags |= SDL_INIT_VIDEO; 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(SDL_Init(flags)){ 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "SDL init failure, reason is: %s\n", SDL_GetError() ); 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_window) { 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_EnableUNICODE(!opts->raw_keys); 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_EnableKeyRepeat(0,0); 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sdl_set_window_icon(); 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _WIN32 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* prevent SIGTTIN and SIGTTOUT from stopping us. this is necessary to be 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * able to run the emulator in the background (e.g. "emulator &"). 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * despite the fact that the emulator should not grab input or try to 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * write to the output in normal cases, we're stopped on some systems 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (e.g. OS X) 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGTTIN, SIG_IGN); 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGTTOU, SIG_IGN); 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project atexit(sdl_at_exit); 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project root = aconfig_node("", ""); 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(name) { 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Support skin aliases like QVGA-H QVGA-P, etc... 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project But first we check if it's a directory that exist before applying 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project the alias */ 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int checkAlias = 1; 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path != NULL) { 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmp+sizeof(tmp), "%s/%s", path, name); 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_exists(tmp)) { 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project checkAlias = 0; 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("there is no '%s' skin in '%s'", name, path); 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (checkAlias) { 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++ ) { 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* skin_name = skin_aliases[nn].name; 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* skin_alias = skin_aliases[nn].alias; 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !skin_name ) 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strcasecmp( skin_name, name ) ) { 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin name '%s' aliased to '%s'", name, skin_alias); 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project name = skin_alias; 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Magically support skins like "320x240" */ 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(isdigit(name[0])) { 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *x = strchr(name, 'x'); 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(x && isdigit(x[1])) { 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int width = atoi(name); 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int height = atoi(x + 1); 3725389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine sprintf(tmp,"display {\n width %d\n height %d\n}\n", 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project width, height); 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project aconfig_load(root, strdup(tmp)); 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = ":"; 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto found_a_skin; 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path == NULL) { 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("unknown skin name '%s'", name); 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "%s/%s/layout", path, name); 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("trying to load skin file '%s'", tmp); 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(aconfig_load_file(root, tmp) >= 0) { 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "%s/%s/", path, name); 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = tmp; 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto found_a_skin; 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3935389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine dwarning("could not load skin file '%s', using built-in one\n", 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tmp); 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const unsigned char* layout_base; 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size_t layout_size; 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project name = "<builtin>"; 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout_base = android_resource_find( "layout", &layout_size ); 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout_base != NULL) { 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* base = malloc( layout_size+1 ); 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memcpy( base, layout_base, layout_size ); 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project base[layout_size] = 0; 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("parsing built-in skin layout file (size=%d)", (int)layout_size); 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project aconfig_load(root, base); 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = ":"; 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Couldn't load builtin skin\n"); 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfound_a_skin: 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project win_x = 10; 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project win_y = 10; 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (userConfig) 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_getWindowPos(userConfig, &win_x, &win_y); 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4279085a28c14f369d231dbae099a690689179f428avchtchetkine 4280119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine if ( qemulator_init(qemulator_get(), root, path, win_x, win_y, opts ) < 0 ) { 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### Error: could not load emulator skin '%s'\n", name); 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4330119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine android_skin_keycharmap = skin_keyboard_charmap_name(qemulator_get()->keyboard); 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the default network speed and latency can now be specified by the device skin */ 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = aconfig_find(root, "network"); 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (n != NULL) { 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_network_speed = aconfig_str(n, "speed", 0); 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_network_delay = aconfig_str(n, "delay", 0); 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a trackball if needed */ 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = aconfig_find(root, "trackball"); 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (n != NULL) { 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinTrackBallParameters params; 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.x = aconfig_unsigned(n, "x", 0); 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.y = aconfig_unsigned(n, "y", 0); 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.diameter = aconfig_unsigned(n, "diameter", 20); 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ring = aconfig_unsigned(n, "ring", 1); 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ball_color = aconfig_unsigned(n, "ball-color", 0xffe0e0e0); 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.dot_color = aconfig_unsigned(n, "dot-color", 0xff202020 ); 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ring_color = aconfig_unsigned(n, "ring-color", 0xff000000 ); 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_disp->trackball = skin_trackball_create( ¶ms ); 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_trackball_refresh( qemu_disp->trackball ); 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* add an onion overlay image if needed */ 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->onion) { 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinImage* onion = skin_image_find_simple( opts->onion ); 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int alpha, rotate; 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( opts->onion_alpha && 1 == sscanf( opts->onion_alpha, "%d", &alpha ) ) { 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = (256*alpha)/100; 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = 128; 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( opts->onion_rotation && 1 == sscanf( opts->onion_rotation, "%d", &rotate ) ) { 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rotate &= 3; 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rotate = SKIN_ROTATION_0; 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4770119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_get()->onion = onion; 4780119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_get()->onion_alpha = alpha; 4790119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_get()->onion_rotation = rotate; 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_main(int argc, char **argv); 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function dumps the QEMU help */ 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void help( void ); 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void emulator_help( void ); 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define VERBOSE_OPT(str,var) { str, &var } 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _VERBOSE_TAG(x,y) { #x, VERBOSE_##x, y }, 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { const char* name; int flag; const char* text; } 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectverbose_options[] = { 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERBOSE_TAG_LIST 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 0, 0, 0 } 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectload_keyset(const char* path) 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_can_read(path)) { 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* root = aconfig_node("",""); 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!aconfig_load_file(root, path)) { 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_keyset = skin_keyset_new(root); 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_keyset != NULL) { 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "keyset loaded from: %s", path); 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_keyset(const char* keyset, AndroidOptions* opts) 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char kname[MAX_PATH]; 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p; 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* append .keyset suffix if needed */ 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strchr(keyset, '.') == NULL) { 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = kname; 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = p + sizeof(kname); 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "%s.keyset", keyset); 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) { 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "keyset name too long: '%s'\n", keyset); 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project keyset = kname; 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* look for a the keyset file */ 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = p + sizeof(temp); 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint_config_file(p, end, keyset); 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "%s" PATH_SEP "keysets" PATH_SEP "%s", opts->sysdir, keyset); 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint_app_dir(p, end); 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, PATH_SEP "keysets" PATH_SEP "%s", keyset); 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectwrite_default_keyset( void ) 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char path[MAX_PATH]; 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint_config_file( path, path+sizeof(path), KEYSET_FILE ); 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* only write if there is no file here */ 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !path_exists(path) ) { 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int fd = open( path, O_WRONLY | O_CREAT, 0666 ); 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* ks = skin_keyset_get_default(); 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "writing default keyset file to %s", path ); 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (fd < 0) { 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "%s: could not create file: %s", __FUNCTION__, strerror(errno) ); 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CHECKED(ret, write(fd, ks, strlen(ks))); 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project close(fd); 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_NAND_LIMITS 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic uint64_t 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_nand_rw_limit( const char* value ) 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t val = strtoul( value, &end, 0 ); 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == value) { 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter value '%s': expecting unsigned integer", value ); 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (end[0]) { 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'K': val <<= 10; break; 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'M': val <<= 20; break; 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'G': val <<= 30; break; 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 0: break; 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad read/write limit suffix: use K, M or G" ); 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return val; 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_nand_limits(char* limits) 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int pid = -1, signal = -1; 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int64_t reads = 0, writes = 0; 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* item = limits; 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* parse over comma-separated items */ 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (item && *item) { 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* next = strchr(item, ','); 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (next == NULL) { 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project next = item + strlen(item); 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *next++ = 0; 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !memcmp(item, "pid=", 4) ) { 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pid = strtol(item+4, &end, 10); 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == NULL || *end) { 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter, expecting pid=<number>, got '%s'", 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project item ); 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (pid <= 0) { 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter: process identifier must be > 0" ); 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ( !memcmp(item, "signal=", 7) ) { 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal = strtol(item+7,&end, 10); 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (end == NULL || *end) { 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter: expecting signal=<number>, got '%s'", 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project item ); 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (signal <= 0) { 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter: signal number must be > 0" ); 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ( !memcmp(item, "reads=", 6) ) { 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project reads = parse_nand_rw_limit(item+6); 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ( !memcmp(item, "writes=", 7) ) { 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project writes = parse_nand_rw_limit(item+7); 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter '%s' (see -help-nand-limits)", item ); 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project item = next; 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (pid < 0) { 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad paramater: missing pid=<number>" ); 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (signal < 0) { 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad parameter: missing signal=<number>" ); 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (reads == 0 && writes == 0) { 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "no read or write limit specified. ignoring -nand-limits" ); 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project nand_threshold* t; 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t = &android_nand_read_threshold; 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->pid = pid; 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->signal = signal; 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->counter = 0; 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->limit = reads; 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t = &android_nand_write_threshold; 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->pid = pid; 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->signal = signal; 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->counter = 0; 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t->limit = writes; 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* CONFIG_NAND_LIMITS */ 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid emulator_help( void ) 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_main(out); 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf( "%.*s", out->n, out->s ); 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_reset(out); 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function is used to perform auto-detection of the 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * system directory in the case of a SDK installation. 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we want to deal with several historical usages, hence 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the slightly complicated logic. 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * NOTE: the function returns the path to the directory 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * containing 'fileName'. this is *not* the full 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * path to 'fileName'. 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImagePath( const char* fileName ) 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = temp; 7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(temp); 7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q; 7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* app; 7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static const char* const searchPaths[] = { 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "", /* program's directory */ 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/lib/images", /* this is for SDK 1.0 */ 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/../platforms/android-1.1/images", /* this is for SDK 1.1 */ 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project app = bufprint_app_dir(temp, end); 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (app >= end) 7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* first search a few well-known paths */ 7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; searchPaths[nn] != NULL; nn++) { 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "%s", searchPaths[nn]); 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s", fileName); 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end && path_exists(temp)) { 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *p = 0; 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto FOUND_IT; 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* hmmm. let's assume that we are in a post-1.1 SDK 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * scan ../platforms if it exists 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "/../platforms"); 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end) { 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DirScanner* scanner = dirScanner_new(temp); 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (scanner != NULL) { 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int found = 0; 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* subdir; 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (;;) { 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project subdir = dirScanner_next(scanner); 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!subdir) break; 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s/images/%s", subdir, fileName); 7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q >= end || !path_exists(temp)) 7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project found = 1; 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "/%s/images", subdir); 7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dirScanner_free(scanner); 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (found) 7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* I'm out of ideas */ 7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFOUND_IT: 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //D("image auto-detection: %s/%s", temp, fileName); 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_strdup(temp); 7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImage( const char* path, const char* file ) 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = temp, *end = p + sizeof(temp); 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(temp, end, "%s/%s", path, file); 7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end || !path_exists(temp)) 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_strdup(temp); 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkSystemImage( const char* path, const char* optionName, const char* file ) 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* image = _getSdkImage(path, file); 7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (image == NULL) { 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Your system directory is missing the '%s' image file.\n" 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please specify one with the '%s <filepath>' option", 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file, optionName); 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return image; 8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 8055389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine_forceAvdImagePath( AvdImageType imageType, 8065389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine const char* path, 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* description, 8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int required ) 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path == NULL) 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (required && !path_exists(path)) { 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Cannot find %s image file: %s", description, path); 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->forcePaths[imageType] = path; 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 820cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnerstatic uint64_t 821cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner_adjustPartitionSize( const char* description, 822cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t imageBytes, 823cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t defaultBytes, 824cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner int inAndroidBuild ) 825cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner{ 826cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner char temp[64]; 827cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned imageMB; 828cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned defaultMB; 829cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 830cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (imageBytes <= defaultBytes) 831cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return defaultBytes; 832cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 833cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner imageMB = convertBytesToMB(imageBytes); 834cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultMB = convertBytesToMB(defaultBytes); 835cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 836cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (imageMB > defaultMB) { 837cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner snprintf(temp, sizeof temp, "(%d MB > %d MB)", imageMB, defaultMB); 838cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } else { 839cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner snprintf(temp, sizeof temp, "(%lld bytes > %lld bytes)", imageBytes, defaultBytes); 840cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 841cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 842def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner if (inAndroidBuild) { 843def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner dwarning("%s partition size adjusted to match image file %s\n", description, temp); 844cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 845cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 846cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return convertMBToBytes(imageMB); 847cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 848cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint main(int argc, char **argv) 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[MAX_PATH]; 8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* tmpend = tmp + sizeof(tmp); 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* args[128]; 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int n; 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* opt; 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int use_sdcard_img = 0; 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int serial = 0; 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int gps_serial = 0; 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int radio_serial = 0; 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int qemud_serial = 0; 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int shell_serial = 0; 8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned cachePartitionSize = 0; 864cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned systemPartitionSize = 0; 865cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned dataPartitionSize = 0; 86649dcc4de79c93de65c20706b798353be1e840915David 'Digit' Turner unsigned defaultPartitionSize = convertMBToBytes(66); 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidHwConfig* hw; 869cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner AvdInfo* avd; 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //const char *appdir = get_app_dir(); 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_root = NULL; 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_out = NULL; 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidOptions opts[1]; 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[0] = argv[0]; 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_options( &argc, &argv, opts ) < 0 ) { 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (argc-- > 1) { 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt = (++argv)[0]; 8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(!strcmp(opt, "-qemu")) { 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argc--; 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argv++; 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "-help")) { 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_help(); 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strncmp(opt, "-help-",6)) { 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt += 6; 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "all")) { 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_all(out); 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_option(opt, out) == 0) { 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_topic(opt, out) == 0) { 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out->n > 0) { 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("\n%.*s", out->n, out->s); 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: -help-%s\n", opt); 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid topics\n"); 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opt[0] == '-') { 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: %s\n", opt); 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid options\n"); 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "invalid command-line parameter: %s.\n", opt); 9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Hint: use '@foo' to launch a virtual device named 'foo'.\n"); 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for more information\n"); 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9319085a28c14f369d231dbae099a690689179f428avchtchetkine if (android_charmap_setup(opts->charmap)) { 9329085a28c14f369d231dbae099a690689179f428avchtchetkine exit(1); 9339085a28c14f369d231dbae099a690689179f428avchtchetkine } 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->version) { 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("Android emulator version %s\n" 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Copyright (C) 2006-2008 The Android Open Source Project and many others.\n" 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "This program is a derivative of the QEMU CPU emulator (www.qemu.org).\n\n", 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined ANDROID_BUILD_ID 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING " (build_id " STRINGIFY(ANDROID_BUILD_ID) ")" ); 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING); 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf(" This software is licensed under the terms of the GNU General Public\n" 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " License version 2, as published by the Free Software Foundation, and\n" 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " may be copied, distributed, and modified under those terms.\n\n" 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " This program is distributed in the hope that it will be useful,\n" 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " GNU General Public License for more details.\n\n"); 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->timezone) { 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( timezone_set(opts->timezone) < 0 ) { 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "emulator: it seems the timezone '%s' is not in zoneinfo format\n", opts->timezone); 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* legacy support: we used to use -system <dir> and -image <file> 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * instead of -sysdir <dir> and -system <file>, so handle this by checking 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * whether the options point to directories or files. 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->image != NULL) { 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->system != NULL) { 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "You can't use -sysdir, -system and -image at the same time.\n" 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You should probably use '-sysdir <path> -system <file>'.\n" ); 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that -image is obsolete and that -system is now used to point\n" 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to the system image. Next time, try using '-sysdir <path> -system <file>' instead.\n" ); 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = opts->image; 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->image = NULL; 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->system != NULL && path_is_dir(opts->system)) { 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "Option -system should now be followed by a file path, not a directory one.\n" 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please use '-sysdir <path>' to point to the system directory.\n" ); 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that the -system option should now be used to point to the initial\n" 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "system image (like the obsolete -image option). To point to the system directory\n" 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please now use '-sysdir <path>' instead.\n" ); 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = NULL; 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nojni) 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_jni = opts->nojni; 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nocache) 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = opts->nocache; 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noaudio) 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_audio = opts->noaudio; 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noskin) 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_skin = opts->noskin; 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->initdata) { 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->init_data = opts->initdata; 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->initdata = NULL; 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If no AVD name was given, try to find the top of the 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build tree 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd == NULL) { 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* out = getenv("ANDROID_PRODUCT_OUT"); 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out == NULL || out[0] == 0) 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(out)) { 10219877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project derror("Can't access ANDROID_PRODUCT_OUT as '%s'\n" 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You need to build the Android system before launching the emulator", 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out); 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root = path_parent( out, 4 ); 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_build_root == NULL || !path_exists(android_build_root)) { 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Can't find the Android build root from '%s'\n" 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please check the definition of the ANDROID_PRODUCT_OUT variable.\n" 10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "It should point to your product-specific build output directory.\n", 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out ); 10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = out; 10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build root: %s", android_build_root ); 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build out: %s", android_build_out ); 10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no virtual device name is given, and we're not in the 10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build system, we'll need to perform some auto-detection 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * magic :-) 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 10445389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (opts->avd == NULL && !android_build_out) 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char dataDirIsSystem = 0; 10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = _getSdkImagePath("system.img"); 10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not specify a virtual device name, and the system\n" 10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "directory could not be found.\n\n" 10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you are an Android SDK user, please use '@<name>' or '-avd <name>'\n" 10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to start a given virtual device (see -help-avd for details).\n\n" 10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Otherwise, follow the instructions in -help-disk-images to start the emulator\n" 10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sysdir %s", opts->sysdir); 10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->system) { 10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = _getSdkSystemImage(opts->sysdir, "-image", "system.img"); 10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -image %s", opts->image); 10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->kernel) { 10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->kernel = _getSdkSystemImage(opts->sysdir, "-kernel", "kernel-qemu"); 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -kernel %s", opts->kernel); 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->ramdisk) { 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->ramdisk = _getSdkSystemImage(opts->sysdir, "-ramdisk", "ramdisk.img"); 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -ramdisk %s", opts->ramdisk); 10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no data directory is specified, use the system directory */ 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->datadir) { 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->datadir = qemu_strdup(opts->sysdir); 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dataDirIsSystem = 1; 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -datadir %s", opts->sysdir); 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->data) { 10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check for userdata-qemu.img in the data directory */ 10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/userdata-qemu.img", opts->datadir); 10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(tmp)) { 10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not provide the name of an Android Virtual Device\n" 10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "with the '-avd <name>' option. Read -help-avd for more information.\n\n" 10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you *really* want to *NOT* run an AVD, consider using '-data <file>'\n" 10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to specify a data partition image file (I hope you know what you're doing).\n" 10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->data = qemu_strdup(tmp); 11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -data %s", opts->data); 11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sdcard && opts->datadir) { 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/sdcard.img", opts->datadir); 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_exists(tmp)) { 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sdcard = qemu_strdup(tmp); 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sdcard %s", opts->sdcard); 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device parameters from our options 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) { 11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_NO_CACHE; 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->wipe_data) { 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_WIPE_DATA | AVDINFO_WIPE_CACHE; 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if certain options are set, we can force the path of 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * certain kernel/disk image files 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_KERNEL, opts->kernel, "kernel", 1); 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_INITSYSTEM, opts->system, "system", 1); 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_RAMDISK, opts->ramdisk,"ramdisk", 1); 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_USERDATA, opts->data, "user data", 0); 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_CACHE, opts->cache, "cache", 0); 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _forceAvdImagePath(AVD_IMAGE_SDCARD, opts->sdcard, "SD Card", 0); 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we don't accept -skindir without -skin now 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to simplify the autoconfig stuff with virtual devices 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_skin) { 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skin = "320x480"; 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skindir = NULL; 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->skin) { 11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "the -skindir <path> option requires a -skin <name> option"); 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1146b58c44e55548129243185ef5927bd3abb5903044David Turner android_avdParams->skinName = opts->skin; 1147b58c44e55548129243185ef5927bd3abb5903044David Turner android_avdParams->skinRootPath = opts->skindir; 1148b58c44e55548129243185ef5927bd3abb5903044David Turner 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device differently depending on whether 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we are in the Android build system or not 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd != NULL) 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_new( opts->avd, android_avdParams ); 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_avdInfo == NULL) { 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* an error message has already been printed */ 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint("could not find virtual device named '%s'", opts->avd); 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_build_out) { 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = android_build_root = opts->sysdir; 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_newForAndroidBuild( 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root, 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out, 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams ); 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(android_avdInfo == NULL) { 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("could not start virtual device\n"); 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1177cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avd = android_avdInfo; 1178cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* get the skin from the virtual device configuration */ 1180cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->skin = (char*) avdInfo_getSkinName( avd ); 1181cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->skindir = (char*) avdInfo_getSkinDir( avd ); 11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skin) { 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skin %s", opts->skin); 11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skindir %s", opts->skindir); 11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Read hardware configuration */ 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hw = android_hw; 1192cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (avdInfo_getHwConfig(avd, hw) < 0) { 11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("could not read hardware configuration ?"); 11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_NAND_LIMITS 11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nand_limits) 11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_nand_limits(opts->nand_limits); 12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 12018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->keyset) { 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset(opts->keyset, opts); 12048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "emulator: WARNING: could not find keyset file named '%s'," 12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " using defaults instead\n", 12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->keyset); 12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 12128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset("default", opts); 12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_keyset = skin_keyset_new_from_text( skin_keyset_get_default() ); 12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: default keyset file is corrupted !!\n" ); 12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: please update the code in android/skin/keyset.c\n" ); 12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->keyset) 12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project write_default_keyset(); 12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 122540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 122640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char* end; 122740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie long shared_net_id = strtol(opts->shared_net_id, &end, 0); 122840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (end == NULL || *end || shared_net_id < 1 || shared_net_id > 255) { 122940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie fprintf(stderr, "option -shared-net-id must be an integer between 1 and 255\n"); 123040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie exit(1); 123140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 123240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char ip[11]; 123340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie snprintf(ip, 11, "10.1.2.%ld", shared_net_id); 123440beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie boot_property_add("net.shared_net_ip",ip); 123540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 123640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 123740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_config_init(); 12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project init_skinned_ui(opts->skindir, opts->skin, opts); 12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netspeed) { 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_speed) 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network speed: '%s'", skin_network_speed); 12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netspeed = (char*)skin_network_speed; 12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netdelay) { 12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_delay) 12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network delay: '%s'", skin_network_delay); 12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netdelay = (char*)skin_network_delay; 12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_network_speed(opts->netspeed) < 0 ) { 12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "invalid -netspeed parameter '%s', see emulator -usage\n", opts->netspeed); 12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_help(); 12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_network_latency(opts->netdelay) < 0 ) { 12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "invalid -netdelay parameter '%s', see emulator -usage\n", opts->netdelay); 12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_help(); 12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->netfast) { 12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_download_speed = 0; 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_upload_speed = 0; 12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_min_latency = 0; 12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_net_max_latency = 0; 12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 1270cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner char* tracePath = avdInfo_getTracePath(avd, opts->trace); 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (tracePath == NULL) { 12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad -trace parameter" ); 12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = path_mkdir_if_needed( tracePath, 0755 ); 12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not create directory '%s'\n", tmp); 12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->trace = tracePath; 12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->tcpdump) { 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (qemu_tcpdump_start(opts->tcpdump) < 0) { 12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "could not start packet capture: %s", strerror(errno)); 12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) 12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = 0; 12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = 1; 12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* generate arguments for the underlying qemu main() */ 1296238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner { 1297238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner const char* kernelFile = avdInfo_getImageFile(avd, AVD_IMAGE_KERNEL); 1298238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner int kernelFileLen = strlen(kernelFile); 1299238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 1300238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "-kernel"; 1301238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = (char*)kernelFile; 1302238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 1303238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner /* If the kernel image name ends in "-armv7", then change the cpu 1304238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * type automatically. This is a poor man's approach to configuration 1305238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * management, but should allow us to get past building ARMv7 1306238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * system images with dex preopt pass without introducing too many 1307238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * changes to the emulator sources. 1308238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * 1309238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * XXX: 1310238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * A 'proper' change would require adding some sort of hardware-property 1311238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * to each AVD config file, then automatically determine its value for 1312238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * full Android builds (depending on some environment variable), plus 1313238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * some build system changes. I prefer not to do that for now for reasons 1314238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * of simplicity. 1315238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner */ 1316238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner if (kernelFileLen > 6 && !memcmp(kernelFile + kernelFileLen - 6, "-armv7", 6)) { 1317238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "-cpu"; 1318238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "cortex-a8"; 1319238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 1320238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1322b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine /* the purpose of -no-audio is to disable sound output from the emulator, 1323b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine * not to disable Audio emulation. So simply force the 'none' backends */ 1324b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->no_audio) 1325b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine opts->audio = "none"; 1326b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1327b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio) { 1328b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio"; 1329b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio; 1330b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1331b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1332b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio_in) { 1333b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio-in"; 1334b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio_in; 1335b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1336b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio_out) { 1337b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio-out"; 1338b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio_out; 1339b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1340b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1341b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->cpu_delay) { 1342b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-cpu-delay"; 1343b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->cpu_delay; 1344b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1345b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 13467fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine if (opts->dns_server) { 13477fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = "-dns-server"; 13487fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = opts->dns_server; 13497fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine } 13507fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine 13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-initrd"; 1352cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner args[n++] = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_RAMDISK); 13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1354b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project if (opts->partition_size) { 1355b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project char* end; 1356cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long sizeMB = strtol(opts->partition_size, &end, 0); 1357cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long minSizeMB = 10; 1358cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long maxSizeMB = LONG_MAX / ONE_MB; 1359b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 1360cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (sizeMB < 0 || *end != 0) { 1361b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "-partition-size must be followed by a positive integer" ); 1362b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 1363b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 1364cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (sizeMB < minSizeMB || sizeMB > maxSizeMB) { 1365b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "partition-size (%d) must be between %dMB and %dMB", 1366cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner sizeMB, minSizeMB, maxSizeMB ); 1367b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 1368b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 1369cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultPartitionSize = sizeMB * ONE_MB; 1370cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1371cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1372cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner /* Check the size of the system partition image. 1373cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * If we have an AVD, it must be smaller than 1374cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * the disk.systemPartition.size hardware property. 1375cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * 1376cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * Otherwise, we need to adjust the systemPartitionSize 1377cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * automatically, and print a warning. 1378cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * 1379cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner */ 1380cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner { 1381cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t systemBytes = avdInfo_getImageFileSize(avd, AVD_IMAGE_INITSYSTEM); 1382def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner uint64_t defaultBytes = defaultPartitionSize; 1383cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1384cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (defaultBytes == 0 || opts->partition_size) 1385cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultBytes = defaultPartitionSize; 1386cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1387cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner systemPartitionSize = _adjustPartitionSize("system", systemBytes, defaultBytes, 1388cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner android_build_out != NULL); 1389cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1390cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1391cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner /* Check the size of the /data partition. The only interesting cases here are: 1392065242de51ba1e18387ce22a99eb091a859990f7David 'Digit' Turner * - when the USERDATA image already exists and is larger than the default 1393cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * - when we're wiping data and the INITDATA is larger than the default. 1394cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner */ 1395cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1396cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner { 1397cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner const char* dataPath = avdInfo_getImageFile(avd, AVD_IMAGE_USERDATA); 1398def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner uint64_t defaultBytes = defaultPartitionSize; 1399cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1400cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (defaultBytes == 0 || opts->partition_size) 1401cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultBytes = defaultPartitionSize; 1402cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1403cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (dataPath == NULL || !path_exists(dataPath) || opts->wipe_data) { 1404cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPath = avdInfo_getImageFile(avd, AVD_IMAGE_INITDATA); 1405cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1406cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (dataPath == NULL || !path_exists(dataPath)) { 1407cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize = defaultBytes; 1408cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1409cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner else { 1410cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t dataBytes; 1411cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner path_get_size(dataPath, &dataBytes); 1412cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1413cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize = _adjustPartitionSize("data", dataBytes, defaultBytes, 1414cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner android_build_out != NULL); 1415cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1416b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 1417b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* filetype = "file"; 14208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1421cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (avdInfo_isImageReadOnly(avd, AVD_IMAGE_INITSYSTEM)) 14228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project filetype = "initfile"; 14238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 1425cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner "system,size=0x%x,%s=%s", systemPartitionSize, filetype, 1426cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avdInfo_getImageFile(avd, AVD_IMAGE_INITSYSTEM)); 14278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 14298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 14308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 1433b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project "userdata,size=0x%x,file=%s", 1434cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize, 1435cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avdInfo_getImageFile(avd, AVD_IMAGE_USERDATA)); 14368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 14388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 14398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (hw->disk_cachePartition) { 1441cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->cache = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_CACHE); 14428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cachePartitionSize = hw->disk_cachePartition_size; 14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->cache) { 14458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support a cache partition" ); 14468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = NULL; 14478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = 1; 14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->cache) { 14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* use a specific cache file */ 14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x,file=%s", cachePartitionSize, opts->cache); 14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 14558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!opts->no_cache) { 14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a temporary cache partition file */ 14588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x", cachePartitionSize); 14598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 14608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 14618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 146392568958dd42bf35667cc6451b5edd7f7d1f73a1David 'Digit' Turner if (hw->hw_sdCard != 0) 1464cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->sdcard = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_SDCARD); 146592568958dd42bf35667cc6451b5edd7f7d1f73a1David 'Digit' Turner else if (opts->sdcard) { 14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support SD Cards" ); 14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sdcard = NULL; 14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(opts->sdcard) { 14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t size; 14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_get_size(opts->sdcard, &size) == 0) { 14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* see if we have an sdcard image. get its size if it exists */ 14748b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner /* due to what looks like limitations of the MMC protocol, one has 14758b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner * to use an SD Card image that is equal or larger than 9 MB 14768b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner */ 14778b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner if (size < 9*1024*1024ULL) { 14788b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner fprintf(stderr, "### WARNING: SD Card files must be at least 9MB, ignoring '%s'\n", opts->sdcard); 14798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 14808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-hda"; 14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->sdcard; 14828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project use_sdcard_img = 1; 14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("no SD Card image at '%s'", opts->sdcard); 14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->logcat || opts->logcat[0] == 0) { 14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = getenv("ANDROID_LOG_TAGS"); 14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat && opts->logcat[0] == 0) 14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = NULL; 14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->console) { 14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "option -console is obsolete. please use -shell instead" ); 14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we always send the kernel messages from ttyS0 to android_kmsg */ 15038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidKmsgFlags flags = 0; 15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->show_kernel) 15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags |= ANDROID_KMSG_PRINT_MESSAGES; 15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_kmsg_init( flags ); 15108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-kmsg"; 15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial++; 15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXXX: TODO: implement -shell and -logcat through qemud instead */ 15168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->shell_serial) { 15178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "con:"; 15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "stdio"; 15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell = 1; 15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->shell_serial; 15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project shell_serial = serial++; 15308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 15338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->radio; 15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-modem"; 15428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 15438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 15458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 15468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->gps; 15478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gps_serial = serial++; 15488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else /* !opts->old_system */ 15518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 15538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-qemud"; 15548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemud_serial = serial++; 15558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 1557b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-radio"; 1558b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->radio; 15598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 1562b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-gps"; 1563b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->gps; 15648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->memory) { 15688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 15698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project long ramSize = strtol(opts->memory, &end, 0); 15708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 0 || *end != 0) { 15718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "-memory must be followed by a positive integer" ); 15728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 15738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 32 || ramSize > 4096) { 15758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "physical memory size must be between 32 and 4096 MB" ); 15768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 15778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->memory) { 15808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%d", hw->hw_ramSize); 15818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->memory = qemu_strdup(tmp); 15828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-trace"; 15868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->trace; 15878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-tracing"; 15888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "off"; 15898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-append"; 15928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 15948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 15958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int timeout = strtol(opts->bootchart, &end, 10); 15968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (timeout == 0) 15978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->bootchart = NULL; 15988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (timeout < 0 || timeout > 15*60) { 15998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "timeout specified for -bootchart option is invalid.\n" 16008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please use integers between 1 and 900\n"); 16018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 16028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1605318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner /* start the 'boot-properties service, and parse the -prop 1606318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner * options, if any. 1607318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner */ 1608318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner boot_property_init_service(); 1609318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner 1610c5b127050f2dbed015d6b01703a33062d6910d4aDavid 'Digit' Turner hwLcd_setBootProperty(get_device_dpi(opts)); 1611c5b127050f2dbed015d6b01703a33062d6910d4aDavid 'Digit' Turner 161203e124409bd08e620898fbaf8ce27dde3afa1143David 'Digit' Turner /* Set the VM's max heap size, passed as a boot property */ 161303e124409bd08e620898fbaf8ce27dde3afa1143David 'Digit' Turner if (hw->vm_heapSize > 0) { 161403e124409bd08e620898fbaf8ce27dde3afa1143David 'Digit' Turner char tmp[32], *p=tmp, *end=p + sizeof(tmp); 161503e124409bd08e620898fbaf8ce27dde3afa1143David 'Digit' Turner p = bufprint(p, end, "%dm", hw->vm_heapSize); 161603e124409bd08e620898fbaf8ce27dde3afa1143David 'Digit' Turner 161703e124409bd08e620898fbaf8ce27dde3afa1143David 'Digit' Turner boot_property_add("dalvik.vm.heapsize",tmp); 161803e124409bd08e620898fbaf8ce27dde3afa1143David 'Digit' Turner } 161903e124409bd08e620898fbaf8ce27dde3afa1143David 'Digit' Turner 1620318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner if (opts->prop != NULL) { 1621318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner ParamList* pl = opts->prop; 1622318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner for ( ; pl != NULL; pl = pl->next ) { 1623318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner boot_property_parse_option(pl->param); 1624318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner } 1625318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner } 1626318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner 1627318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner /* Setup the kernel init options 1628318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner */ 16298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 16308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char params[1024]; 16318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = params, *end = p + sizeof(params); 16328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "qemu=1 console=ttyS0" ); 16348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 16368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.console=ttyS%d", shell_serial ); 16378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 16408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.tracing=1"); 16418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_jni) { 16448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.checkjni=1"); 16458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_boot_anim) { 16488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint( p, end, " android.bootanim=0" ); 16498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat) { 16528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q = bufprint(p, end, " androidboot.logcat=%s", opts->logcat); 16538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end) { 16558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* replace any space by a comma ! */ 16568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 16578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 16588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 1; p[nn] != 0; nn++) 16598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p[nn] == ' ' || p[nn] == '\t') 16608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[nn] = ','; 16618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += nn; 16628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = q; 16658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 16688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 16698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.ril=ttyS%d", radio_serial); 16708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 16728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.gps=ttyS%d", gps_serial); 16738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 16768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 16778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.qemud=ttyS%d", qemud_serial); 16788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 16818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.bootchart=%s", opts->bootchart); 16828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) { 16858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### ERROR: kernel parameters too long\n"); 16868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 16878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(params); 16908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1692d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->ports) { 1693d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-ports"; 1694d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->ports; 1695d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1696d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1697d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->port) { 1698d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-port"; 1699d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->port; 1700d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1701d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1702d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->report_console) { 1703d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-report-console"; 1704d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->report_console; 1705d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1706d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1707d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->http_proxy) { 1708d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-http-proxy"; 1709d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->http_proxy; 1710d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1711d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 171243552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine if (opts->charmap) { 171343552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = "-charmap"; 171443552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = opts->charmap; 171543552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine } 171643552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine 1717b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine if (opts->memcheck) { 1718b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = "-android-memcheck"; 1719b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = opts->memcheck; 1720b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine } 1721b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine 17228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* physical memory */ 17238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-m"; 17248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->memory; 17258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* on Linux, the 'dynticks' clock sometimes doesn't work 17278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * properly. this results in the UI freezing while emulation 17288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * continues, for several seconds... 17298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 17308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef __linux__ 17318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-clock"; 17328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "unix"; 17338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 17348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 173540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie /* Set up the interfaces for inter-emulator networking */ 173640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 173740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie unsigned int shared_net_id = atoi(opts->shared_net_id); 173840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char nic[37]; 173940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 174040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 174140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "nic,vlan=0"; 174240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 174340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "user,vlan=0"; 1744111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie 1745111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1746111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie snprintf(nic, sizeof nic, "nic,vlan=1,macaddr=52:54:00:12:34:%02x", shared_net_id); 1747111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = strdup(nic); 1748111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1749111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "socket,vlan=1,mcast=230.0.0.10:1234"; 175040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 175140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 17528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while(argc-- > 0) { 17538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = *argv++; 17548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n] = 0; 17568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(VERBOSE_CHECK(init)) { 17588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 17598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < n; i++) { 17608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stdout, "emulator: argv[%02d] = \"%s\"\n", i, args[i]); 17618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_main(n, args); 17648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1765