main.c revision 622b8f4c760b8c4479d28430f978bad8bb9ea32c
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/user-config.h" 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/bufprint.h" 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/dirscanner.h" 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/path.h" 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/timezone.h" 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/cmdline-option.h" 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/help.h" 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/goldfish_nand.h" 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/globals.h" 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 590119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine#include "android/qemulator.h" 60055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner#include "android/display.h" 610119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine 62ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#include "android/snapshot.h" 63ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "framebuffer.h" 659a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#include "iolooper.h" 66055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectAndroidRotation android_framebuffer_rotation; 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define STRINGIFY(x) _STRINGIFY(x) 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _STRINGIFY(x) #x 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 72a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#ifdef ANDROID_SDK_TOOLS_REVISION 73a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING STRINGIFY(ANDROID_SDK_TOOLS_REVISION)".0" 74a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#else 75a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING "standalone" 76a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#endif 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define KEYSET_FILE "default.keyset" 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinKeyset* android_keyset; 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define D(...) do { if (VERBOSE_CHECK(init)) dprint(__VA_ARGS__); } while (0) 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int control_console_start( int port ); /* in control.c */ 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int qemu_milli_needed; 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the default device DPI if none is specified by the skin 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEFAULT_DEVICE_DPI 165 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int opts->flashkeys; /* forward */ 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_TRACE 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void start_tracing(void); 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void stop_tracing(void); 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned long android_verbose; 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** U T I L I T Y R O U T I N E S *****/ 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*** CONFIGURATION 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ***/ 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic AUserConfig* userConfig; 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectemulator_config_init( void ) 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project userConfig = auserConfig_new( android_avdInfo ); 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* only call this function on normal exits, so that ^C doesn't save the configuration */ 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectemulator_config_done( void ) 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int win_x, win_y; 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!userConfig) { 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("no user configuration?"); 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_WM_GetPos( &win_x, &win_y ); 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_setWindowPos(userConfig, win_x, win_y); 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_save(userConfig); 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *loadpng(const char *fn, unsigned *_width, unsigned *_height); 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *readpng(const unsigned char* base, size_t size, unsigned *_width, unsigned *_height); 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_DARWIN 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ANDROID_ICON_PNG "android_icon_256.png" 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ANDROID_ICON_PNG "android_icon_16.png" 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectsdl_set_window_icon( void ) 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int window_icon_set; 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!window_icon_set) 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HANDLE handle = GetModuleHandle( NULL ); 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HICON icon = LoadIcon( handle, MAKEINTRESOURCE(1) ); 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_SysWMinfo wminfo; 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_GetWMInfo(&wminfo); 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SetClassLong( wminfo.window, GCL_HICON, (LONG)icon ); 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else /* !_WIN32 */ 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned icon_w, icon_h; 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size_t icon_bytes; 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const unsigned char* icon_data; 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void* icon_pixels; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project window_icon_set = 1; 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project icon_data = android_icon_find( ANDROID_ICON_PNG, &icon_bytes ); 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !icon_data ) 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project icon_pixels = readpng( icon_data, icon_bytes, &icon_w, &icon_h ); 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !icon_pixels ) 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the data is loaded into memory as RGBA bytes by libpng. we want to manage 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the values as 32-bit ARGB pixels, so swap the bytes accordingly depending 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * on our CPU endianess 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned* d = icon_pixels; 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned* d_end = d + icon_w*icon_h; 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; d < d_end; d++ ) { 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned pix = d[0]; 18720894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#if HOST_WORDS_BIGENDIAN 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* R,G,B,A read as RGBA => ARGB */ 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix = ((pix >> 8) & 0xffffff) | (pix << 24); 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* R,G,B,A read as ABGR => ARGB */ 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix = (pix & 0xff00ff00) | ((pix >> 16) & 0xff) | ((pix & 0xff) << 16); 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project d[0] = pix; 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Surface* icon = sdl_surface_from_argb32( icon_pixels, icon_w, icon_h ); 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (icon != NULL) { 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_WM_SetIcon(icon, NULL); 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_FreeSurface(icon); 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free( icon_pixels ); 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* !_WIN32 */ 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 208cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner#define ONE_MB (1024*1024) 209cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 210cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnerunsigned convertBytesToMB( uint64_t size ) 211cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner{ 212cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (size == 0) 213cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return 0; 214cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 215cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner size = (size + ONE_MB-1) >> 20; 216cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (size > UINT_MAX) 217cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner size = UINT_MAX; 218cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 219cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return (unsigned) size; 220cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 221cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 222cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turneruint64_t convertMBToBytes( unsigned megaBytes ) 223cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner{ 224cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return ((uint64_t)megaBytes << 20); 225cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 226cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** S K I N I M A G E S *****/ 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***** *****/ 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/***********************************************************************/ 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void sdl_at_exit(void) 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_config_done(); 2370119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_done(qemulator_get()); 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Quit(); 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid sdl_display_init(DisplayState *ds, int full_screen, int no_frame) 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2440119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine QEmulator* emulator = qemulator_get(); 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinDisplay* disp = skin_layout_get_display(emulator->layout); 2465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int width, height; 247055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner char buf[128]; 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (disp->rotation & 1) { 2505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner width = disp->rect.size.h; 2515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner height = disp->rect.size.w; 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 2535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner width = disp->rect.size.w; 2545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner height = disp->rect.size.h; 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 257055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner snprintf(buf, sizeof buf, "width=%d,height=%d", width, height); 258055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner android_display_init(ds, qframebuffer_fifo_get()); 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* skin_network_speed = NULL; 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* skin_network_delay = NULL; 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* list of skin aliases */ 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name; 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* alias; 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} skin_aliases[] = { 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA-L", "320x240" }, 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA-P", "240x320" }, 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA-L", "480x320" }, 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA-P", "320x480" }, 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "QVGA", "320x240" }, 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "HVGA", "320x480" }, 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, NULL } 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this is used by hw/events_device.c to send the charmap name to the system */ 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* android_skin_keycharmap = NULL; 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid init_skinned_ui(const char *path, const char *name, AndroidOptions* opts) 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[1024]; 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* root; 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* n; 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int win_x, win_y, flags; 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGINT, SIG_DFL); 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _WIN32 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGQUIT, SIG_DFL); 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we're not a game, so allow the screensaver to run */ 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project putenv("SDL_VIDEO_ALLOW_SCREENSAVER=1"); 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags = SDL_INIT_NOPARACHUTE; 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_window) 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags |= SDL_INIT_VIDEO; 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(SDL_Init(flags)){ 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "SDL init failure, reason is: %s\n", SDL_GetError() ); 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_window) { 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_EnableUNICODE(!opts->raw_keys); 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_EnableKeyRepeat(0,0); 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sdl_set_window_icon(); 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _WIN32 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* prevent SIGTTIN and SIGTTOUT from stopping us. this is necessary to be 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * able to run the emulator in the background (e.g. "emulator &"). 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * despite the fact that the emulator should not grab input or try to 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * write to the output in normal cases, we're stopped on some systems 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (e.g. OS X) 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGTTIN, SIG_IGN); 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project signal(SIGTTOU, SIG_IGN); 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project atexit(sdl_at_exit); 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project root = aconfig_node("", ""); 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(name) { 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Support skin aliases like QVGA-H QVGA-P, etc... 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project But first we check if it's a directory that exist before applying 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project the alias */ 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int checkAlias = 1; 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path != NULL) { 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmp+sizeof(tmp), "%s/%s", path, name); 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_exists(tmp)) { 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project checkAlias = 0; 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("there is no '%s' skin in '%s'", name, path); 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (checkAlias) { 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; ; nn++ ) { 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* skin_name = skin_aliases[nn].name; 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* skin_alias = skin_aliases[nn].alias; 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !skin_name ) 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strcasecmp( skin_name, name ) ) { 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin name '%s' aliased to '%s'", name, skin_alias); 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project name = skin_alias; 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Magically support skins like "320x240" */ 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(isdigit(name[0])) { 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *x = strchr(name, 'x'); 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(x && isdigit(x[1])) { 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int width = atoi(name); 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int height = atoi(x + 1); 3685389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine sprintf(tmp,"display {\n width %d\n height %d\n}\n", 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project width, height); 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project aconfig_load(root, strdup(tmp)); 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = ":"; 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto found_a_skin; 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path == NULL) { 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("unknown skin name '%s'", name); 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "%s/%s/layout", path, name); 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("trying to load skin file '%s'", tmp); 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(aconfig_load_file(root, tmp) >= 0) { 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "%s/%s/", path, name); 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = tmp; 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto found_a_skin; 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 3895389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine dwarning("could not load skin file '%s', using built-in one\n", 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project tmp); 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const unsigned char* layout_base; 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size_t layout_size; 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project name = "<builtin>"; 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout_base = android_resource_find( "layout", &layout_size ); 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout_base != NULL) { 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* base = malloc( layout_size+1 ); 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memcpy( base, layout_base, layout_size ); 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project base[layout_size] = 0; 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("parsing built-in skin layout file (size=%d)", (int)layout_size); 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project aconfig_load(root, base); 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project path = ":"; 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Couldn't load builtin skin\n"); 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectfound_a_skin: 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project win_x = 10; 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project win_y = 10; 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (userConfig) 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project auserConfig_getWindowPos(userConfig, &win_x, &win_y); 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4239085a28c14f369d231dbae099a690689179f428avchtchetkine 4240119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine if ( qemulator_init(qemulator_get(), root, path, win_x, win_y, opts ) < 0 ) { 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### Error: could not load emulator skin '%s'\n", name); 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4290119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine android_skin_keycharmap = skin_keyboard_charmap_name(qemulator_get()->keyboard); 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the default network speed and latency can now be specified by the device skin */ 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = aconfig_find(root, "network"); 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (n != NULL) { 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_network_speed = aconfig_str(n, "speed", 0); 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_network_delay = aconfig_str(n, "delay", 0); 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a trackball if needed */ 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = aconfig_find(root, "trackball"); 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (n != NULL) { 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinTrackBallParameters params; 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.x = aconfig_unsigned(n, "x", 0); 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.y = aconfig_unsigned(n, "y", 0); 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.diameter = aconfig_unsigned(n, "diameter", 20); 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ring = aconfig_unsigned(n, "ring", 1); 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ball_color = aconfig_unsigned(n, "ball-color", 0xffe0e0e0); 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.dot_color = aconfig_unsigned(n, "dot-color", 0xff202020 ); 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project params.ring_color = aconfig_unsigned(n, "ring-color", 0xff000000 ); 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_disp->trackball = skin_trackball_create( ¶ms ); 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_trackball_refresh( qemu_disp->trackball ); 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* add an onion overlay image if needed */ 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->onion) { 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinImage* onion = skin_image_find_simple( opts->onion ); 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int alpha, rotate; 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( opts->onion_alpha && 1 == sscanf( opts->onion_alpha, "%d", &alpha ) ) { 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = (256*alpha)/100; 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = 128; 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( opts->onion_rotation && 1 == sscanf( opts->onion_rotation, "%d", &rotate ) ) { 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rotate &= 3; 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rotate = SKIN_ROTATION_0; 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4730119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_get()->onion = onion; 4740119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_get()->onion_alpha = alpha; 4750119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine qemulator_get()->onion_rotation = rotate; 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_main(int argc, char **argv); 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function dumps the QEMU help */ 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void help( void ); 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void emulator_help( void ); 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define VERBOSE_OPT(str,var) { str, &var } 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _VERBOSE_TAG(x,y) { #x, VERBOSE_##x, y }, 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { const char* name; int flag; const char* text; } 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectverbose_options[] = { 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERBOSE_TAG_LIST 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 0, 0, 0 } 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectload_keyset(const char* path) 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_can_read(path)) { 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* root = aconfig_node("",""); 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!aconfig_load_file(root, path)) { 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_keyset = skin_keyset_new(root); 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_keyset != NULL) { 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "keyset loaded from: %s", path); 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_keyset(const char* keyset, AndroidOptions* opts) 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char kname[MAX_PATH]; 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p; 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* append .keyset suffix if needed */ 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (strchr(keyset, '.') == NULL) { 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = kname; 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = p + sizeof(kname); 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "%s.keyset", keyset); 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) { 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "keyset name too long: '%s'\n", keyset); 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project keyset = kname; 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* look for a the keyset file */ 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = p + sizeof(temp); 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint_config_file(p, end, keyset); 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "%s" PATH_SEP "keysets" PATH_SEP "%s", opts->sysdir, keyset); 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = temp; 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint_app_dir(p, end); 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, PATH_SEP "keysets" PATH_SEP "%s", keyset); 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end && load_keyset(temp) == 0) 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectwrite_default_keyset( void ) 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char path[MAX_PATH]; 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint_config_file( path, path+sizeof(path), KEYSET_FILE ); 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* only write if there is no file here */ 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !path_exists(path) ) { 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int fd = open( path, O_WRONLY | O_CREAT, 0666 ); 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* ks = skin_keyset_get_default(); 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "writing default keyset file to %s", path ); 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (fd < 0) { 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "%s: could not create file: %s", __FUNCTION__, strerror(errno) ); 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CHECKED(ret, write(fd, ks, strlen(ks))); 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project close(fd); 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid emulator_help( void ) 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_main(out); 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf( "%.*s", out->n, out->s ); 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_reset(out); 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function is used to perform auto-detection of the 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * system directory in the case of a SDK installation. 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we want to deal with several historical usages, hence 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the slightly complicated logic. 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * NOTE: the function returns the path to the directory 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * containing 'fileName'. this is *not* the full 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * path to 'fileName'. 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImagePath( const char* fileName ) 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = temp; 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(temp); 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q; 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* app; 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static const char* const searchPaths[] = { 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "", /* program's directory */ 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/lib/images", /* this is for SDK 1.0 */ 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/../platforms/android-1.1/images", /* this is for SDK 1.1 */ 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project app = bufprint_app_dir(temp, end); 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (app >= end) 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* first search a few well-known paths */ 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; searchPaths[nn] != NULL; nn++) { 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "%s", searchPaths[nn]); 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s", fileName); 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end && path_exists(temp)) { 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *p = 0; 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto FOUND_IT; 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* hmmm. let's assume that we are in a post-1.1 SDK 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * scan ../platforms if it exists 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "/../platforms"); 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end) { 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DirScanner* scanner = dirScanner_new(temp); 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (scanner != NULL) { 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int found = 0; 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* subdir; 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (;;) { 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project subdir = dirScanner_next(scanner); 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!subdir) break; 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s/images/%s", subdir, fileName); 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q >= end || !path_exists(temp)) 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project found = 1; 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "/%s/images", subdir); 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dirScanner_free(scanner); 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (found) 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* I'm out of ideas */ 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFOUND_IT: 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //D("image auto-detection: %s/%s", temp, fileName); 66318fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner return android_strdup(temp); 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImage( const char* path, const char* file ) 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = temp, *end = p + sizeof(temp); 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(temp, end, "%s/%s", path, file); 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end || !path_exists(temp)) 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 67618fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner return android_strdup(temp); 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkSystemImage( const char* path, const char* optionName, const char* file ) 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* image = _getSdkImage(path, file); 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (image == NULL) { 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Your system directory is missing the '%s' image file.\n" 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please specify one with the '%s <filepath>' option", 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file, optionName); 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return image; 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 6945389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine_forceAvdImagePath( AvdImageType imageType, 6955389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine const char* path, 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* description, 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int required ) 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path == NULL) 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (required && !path_exists(path)) { 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Cannot find %s image file: %s", description, path); 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->forcePaths[imageType] = path; 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 709cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnerstatic uint64_t 710cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner_adjustPartitionSize( const char* description, 711cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t imageBytes, 712cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t defaultBytes, 713cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner int inAndroidBuild ) 714cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner{ 715cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner char temp[64]; 716cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned imageMB; 717cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned defaultMB; 718cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 719cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (imageBytes <= defaultBytes) 720cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return defaultBytes; 721cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 722cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner imageMB = convertBytesToMB(imageBytes); 723cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultMB = convertBytesToMB(defaultBytes); 724cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 725cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (imageMB > defaultMB) { 726cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner snprintf(temp, sizeof temp, "(%d MB > %d MB)", imageMB, defaultMB); 727cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } else { 728cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner snprintf(temp, sizeof temp, "(%lld bytes > %lld bytes)", imageBytes, defaultBytes); 729cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 730cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 731def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner if (inAndroidBuild) { 732def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner dwarning("%s partition size adjusted to match image file %s\n", description, temp); 733cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 734cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 735cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return convertMBToBytes(imageMB); 736cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 737cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint main(int argc, char **argv) 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[MAX_PATH]; 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* tmpend = tmp + sizeof(tmp); 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* args[128]; 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int n; 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* opt; 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int use_sdcard_img = 0; 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int serial = 0; 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int gps_serial = 0; 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int radio_serial = 0; 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int qemud_serial = 0; 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int shell_serial = 0; 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned cachePartitionSize = 0; 752cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned systemPartitionSize = 0; 753cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned dataPartitionSize = 0; 75449dcc4de79c93de65c20706b798353be1e840915David 'Digit' Turner unsigned defaultPartitionSize = convertMBToBytes(66); 7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidHwConfig* hw; 757cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner AvdInfo* avd; 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //const char *appdir = get_app_dir(); 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_root = NULL; 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_out = NULL; 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidOptions opts[1]; 764b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* LCD density value to pass to the core. */ 765b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine char lcd_density[16]; 766b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* net.shared_net_ip boot property value. */ 767b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine char boot_prop_ip[64]; 768b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine boot_prop_ip[0] = '\0'; 7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[0] = argv[0]; 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_options( &argc, &argv, opts ) < 0 ) { 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (argc-- > 1) { 7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt = (++argv)[0]; 7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(!strcmp(opt, "-qemu")) { 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argc--; 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argv++; 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "-help")) { 7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_help(); 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strncmp(opt, "-help-",6)) { 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt += 6; 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "all")) { 7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_all(out); 7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_option(opt, out) == 0) { 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_topic(opt, out) == 0) { 8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out->n > 0) { 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("\n%.*s", out->n, out->s); 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: -help-%s\n", opt); 8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid topics\n"); 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opt[0] == '-') { 8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: %s\n", opt); 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid options\n"); 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "invalid command-line parameter: %s.\n", opt); 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Hint: use '@foo' to launch a virtual device named 'foo'.\n"); 8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for more information\n"); 8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8249085a28c14f369d231dbae099a690689179f428avchtchetkine if (android_charmap_setup(opts->charmap)) { 8259085a28c14f369d231dbae099a690689179f428avchtchetkine exit(1); 8269085a28c14f369d231dbae099a690689179f428avchtchetkine } 8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->version) { 8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("Android emulator version %s\n" 8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Copyright (C) 2006-2008 The Android Open Source Project and many others.\n" 8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "This program is a derivative of the QEMU CPU emulator (www.qemu.org).\n\n", 8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined ANDROID_BUILD_ID 8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING " (build_id " STRINGIFY(ANDROID_BUILD_ID) ")" ); 8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING); 8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf(" This software is licensed under the terms of the GNU General Public\n" 8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " License version 2, as published by the Free Software Foundation, and\n" 8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " may be copied, distributed, and modified under those terms.\n\n" 8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " This program is distributed in the hope that it will be useful,\n" 8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" 8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" 8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " GNU General Public License for more details.\n\n"); 8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->timezone) { 8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( timezone_set(opts->timezone) < 0 ) { 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "emulator: it seems the timezone '%s' is not in zoneinfo format\n", opts->timezone); 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* legacy support: we used to use -system <dir> and -image <file> 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * instead of -sysdir <dir> and -system <file>, so handle this by checking 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * whether the options point to directories or files. 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->image != NULL) { 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->system != NULL) { 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "You can't use -sysdir, -system and -image at the same time.\n" 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You should probably use '-sysdir <path> -system <file>'.\n" ); 8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that -image is obsolete and that -system is now used to point\n" 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to the system image. Next time, try using '-sysdir <path> -system <file>' instead.\n" ); 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = opts->image; 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->image = NULL; 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->system != NULL && path_is_dir(opts->system)) { 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "Option -system should now be followed by a file path, not a directory one.\n" 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please use '-sysdir <path>' to point to the system directory.\n" ); 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that the -system option should now be used to point to the initial\n" 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "system image (like the obsolete -image option). To point to the system directory\n" 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please now use '-sysdir <path>' instead.\n" ); 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = NULL; 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nojni) 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_jni = opts->nojni; 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nocache) 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = opts->nocache; 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noaudio) 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_audio = opts->noaudio; 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noskin) 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_skin = opts->noskin; 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->initdata) { 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->init_data = opts->initdata; 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->initdata = NULL; 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If no AVD name was given, try to find the top of the 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build tree 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd == NULL) { 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* out = getenv("ANDROID_PRODUCT_OUT"); 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out == NULL || out[0] == 0) 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(out)) { 9149877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project derror("Can't access ANDROID_PRODUCT_OUT as '%s'\n" 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You need to build the Android system before launching the emulator", 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out); 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root = path_parent( out, 4 ); 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_build_root == NULL || !path_exists(android_build_root)) { 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Can't find the Android build root from '%s'\n" 9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please check the definition of the ANDROID_PRODUCT_OUT variable.\n" 9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "It should point to your product-specific build output directory.\n", 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out ); 9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = out; 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build root: %s", android_build_root ); 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build out: %s", android_build_out ); 9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no virtual device name is given, and we're not in the 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build system, we'll need to perform some auto-detection 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * magic :-) 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 9375389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (opts->avd == NULL && !android_build_out) 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char dataDirIsSystem = 0; 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = _getSdkImagePath("system.img"); 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not specify a virtual device name, and the system\n" 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "directory could not be found.\n\n" 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you are an Android SDK user, please use '@<name>' or '-avd <name>'\n" 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to start a given virtual device (see -help-avd for details).\n\n" 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Otherwise, follow the instructions in -help-disk-images to start the emulator\n" 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sysdir %s", opts->sysdir); 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->system) { 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = _getSdkSystemImage(opts->sysdir, "-image", "system.img"); 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -image %s", opts->image); 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->kernel) { 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->kernel = _getSdkSystemImage(opts->sysdir, "-kernel", "kernel-qemu"); 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -kernel %s", opts->kernel); 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->ramdisk) { 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->ramdisk = _getSdkSystemImage(opts->sysdir, "-ramdisk", "ramdisk.img"); 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -ramdisk %s", opts->ramdisk); 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no data directory is specified, use the system directory */ 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->datadir) { 97418fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->datadir = android_strdup(opts->sysdir); 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dataDirIsSystem = 1; 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -datadir %s", opts->sysdir); 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->data) { 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check for userdata-qemu.img in the data directory */ 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/userdata-qemu.img", opts->datadir); 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(tmp)) { 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not provide the name of an Android Virtual Device\n" 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "with the '-avd <name>' option. Read -help-avd for more information.\n\n" 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you *really* want to *NOT* run an AVD, consider using '-data <file>'\n" 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to specify a data partition image file (I hope you know what you're doing).\n" 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 99318fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->data = android_strdup(tmp); 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -data %s", opts->data); 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sdcard && opts->datadir) { 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/sdcard.img", opts->datadir); 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_exists(tmp)) { 100018fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->sdcard = android_strdup(tmp); 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sdcard %s", opts->sdcard); 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1004353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 1005353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 1006353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->snapstorage && opts->datadir) { 1007353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije bufprint(tmp, tmpend, "%s/snapshots.img", opts->datadir); 1008353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (path_exists(tmp)) { 1009ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije opts->snapstorage = android_strdup(tmp); 1010353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("autoconfig: -snapstorage %s", opts->snapstorage); 1011353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1012353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1013ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#endif // CONFIG_ANDROID_SNAPSHOTS 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device parameters from our options 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) { 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_NO_CACHE; 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->wipe_data) { 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_WIPE_DATA | AVDINFO_WIPE_CACHE; 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1024353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 1025353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (opts->no_snapstorage) { 1026353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije android_avdParams->flags |= AVDINFO_NO_SNAPSHOTS; 1027353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1028353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#endif 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if certain options are set, we can force the path of 10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * certain kernel/disk image files 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1033353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_KERNEL, opts->kernel, "kernel", 1); 1034353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_INITSYSTEM, opts->system, "system", 1); 1035353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_RAMDISK, opts->ramdisk, "ramdisk", 1); 1036353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_USERDATA, opts->data, "user data", 0); 1037353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_CACHE, opts->cache, "cache", 0); 1038353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_SDCARD, opts->sdcard, "SD Card", 0); 1039353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 1040353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_SNAPSHOTS, opts->snapstorage, "snapshots", 0); 1041353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#endif 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we don't accept -skindir without -skin now 10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to simplify the autoconfig stuff with virtual devices 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_skin) { 10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skin = "320x480"; 10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skindir = NULL; 10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->skin) { 10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "the -skindir <path> option requires a -skin <name> option"); 10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1057b58c44e55548129243185ef5927bd3abb5903044David Turner android_avdParams->skinName = opts->skin; 1058b58c44e55548129243185ef5927bd3abb5903044David Turner android_avdParams->skinRootPath = opts->skindir; 1059b58c44e55548129243185ef5927bd3abb5903044David Turner 10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device differently depending on whether 10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we are in the Android build system or not 10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd != NULL) 10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_new( opts->avd, android_avdParams ); 10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_avdInfo == NULL) { 10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* an error message has already been printed */ 10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint("could not find virtual device named '%s'", opts->avd); 10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_build_out) { 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = android_build_root = opts->sysdir; 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_newForAndroidBuild( 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root, 10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out, 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams ); 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(android_avdInfo == NULL) { 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("could not start virtual device\n"); 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1088cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avd = android_avdInfo; 1089cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* get the skin from the virtual device configuration */ 1091cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->skin = (char*) avdInfo_getSkinName( avd ); 1092cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->skindir = (char*) avdInfo_getSkinDir( avd ); 10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skin) { 10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skin %s", opts->skin); 10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skindir %s", opts->skindir); 10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Read hardware configuration */ 11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hw = android_hw; 1103cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (avdInfo_getHwConfig(avd, hw) < 0) { 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("could not read hardware configuration ?"); 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->keyset) { 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset(opts->keyset, opts); 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "emulator: WARNING: could not find keyset file named '%s'," 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " using defaults instead\n", 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->keyset); 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset("default", opts); 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_keyset = skin_keyset_new_from_text( skin_keyset_get_default() ); 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: default keyset file is corrupted !!\n" ); 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: please update the code in android/skin/keyset.c\n" ); 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->keyset) 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project write_default_keyset(); 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 113140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 113240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char* end; 113340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie long shared_net_id = strtol(opts->shared_net_id, &end, 0); 113440beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (end == NULL || *end || shared_net_id < 1 || shared_net_id > 255) { 113540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie fprintf(stderr, "option -shared-net-id must be an integer between 1 and 255\n"); 113640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie exit(1); 113740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 1138b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine snprintf(boot_prop_ip, sizeof(boot_prop_ip), 1139b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine "net.shared_net_ip=10.1.2.%ld", shared_net_id); 114040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 114140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 114240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_config_init(); 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project init_skinned_ui(opts->skindir, opts->skin, opts); 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netspeed) { 11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_speed) 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network speed: '%s'", skin_network_speed); 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netspeed = (char*)skin_network_speed; 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netdelay) { 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_delay) 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network delay: '%s'", skin_network_delay); 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netdelay = (char*)skin_network_delay; 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 1158cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner char* tracePath = avdInfo_getTracePath(avd, opts->trace); 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (tracePath == NULL) { 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad -trace parameter" ); 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = path_mkdir_if_needed( tracePath, 0755 ); 11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not create directory '%s'\n", tmp); 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->trace = tracePath; 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = 0; 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = 1; 11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* generate arguments for the underlying qemu main() */ 1178238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner { 1179238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner const char* kernelFile = avdInfo_getImageFile(avd, AVD_IMAGE_KERNEL); 1180238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner int kernelFileLen = strlen(kernelFile); 1181238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 1182238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "-kernel"; 1183238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = (char*)kernelFile; 1184238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 1185238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner /* If the kernel image name ends in "-armv7", then change the cpu 1186238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * type automatically. This is a poor man's approach to configuration 1187238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * management, but should allow us to get past building ARMv7 1188238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * system images with dex preopt pass without introducing too many 1189238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * changes to the emulator sources. 1190238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * 1191238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * XXX: 1192238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * A 'proper' change would require adding some sort of hardware-property 1193238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * to each AVD config file, then automatically determine its value for 1194238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * full Android builds (depending on some environment variable), plus 1195238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * some build system changes. I prefer not to do that for now for reasons 1196238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * of simplicity. 1197238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner */ 1198238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner if (kernelFileLen > 6 && !memcmp(kernelFile + kernelFileLen - 6, "-armv7", 6)) { 1199238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "-cpu"; 1200238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "cortex-a8"; 1201238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 1202238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1204b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine if (boot_prop_ip[0]) { 1205b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-boot-property"; 1206b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = boot_prop_ip; 1207b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 1208b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 1209318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine if (opts->tcpdump) { 1210318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine args[n++] = "-tcpdump"; 1211318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine args[n++] = opts->tcpdump; 1212318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine } 1213318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine 1214e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine#ifdef CONFIG_NAND_LIMITS 1215e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->nand_limits) { 1216e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-nand-limits"; 1217e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->nand_limits; 1218e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 1219e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine#endif 1220e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine 1221e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netspeed) { 1222e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netspeed"; 1223e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->netspeed; 1224e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 1225e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netdelay) { 1226e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netdelay"; 1227e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->netdelay; 1228e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 1229e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netfast) { 1230e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netfast"; 1231e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 1232e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine 1233b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine /* the purpose of -no-audio is to disable sound output from the emulator, 1234b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine * not to disable Audio emulation. So simply force the 'none' backends */ 1235b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->no_audio) 1236b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine opts->audio = "none"; 1237b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1238b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio) { 1239b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio"; 1240b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio; 1241b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1242b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1243b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio_in) { 1244b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio-in"; 1245b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio_in; 1246b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1247b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio_out) { 1248b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio-out"; 1249b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio_out; 1250b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1251b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1252b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->cpu_delay) { 1253b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-cpu-delay"; 1254b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->cpu_delay; 1255b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1256b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 12577fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine if (opts->dns_server) { 12587fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = "-dns-server"; 12597fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = opts->dns_server; 12607fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine } 12617fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-initrd"; 1263cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner args[n++] = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_RAMDISK); 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1265b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project if (opts->partition_size) { 1266b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project char* end; 1267cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long sizeMB = strtol(opts->partition_size, &end, 0); 1268cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long minSizeMB = 10; 1269cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long maxSizeMB = LONG_MAX / ONE_MB; 1270b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 1271cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (sizeMB < 0 || *end != 0) { 1272b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "-partition-size must be followed by a positive integer" ); 1273b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 1274b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 1275cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (sizeMB < minSizeMB || sizeMB > maxSizeMB) { 1276b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "partition-size (%d) must be between %dMB and %dMB", 1277cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner sizeMB, minSizeMB, maxSizeMB ); 1278b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 1279b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 1280cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultPartitionSize = sizeMB * ONE_MB; 1281cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1282cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1283cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner /* Check the size of the system partition image. 1284cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * If we have an AVD, it must be smaller than 1285cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * the disk.systemPartition.size hardware property. 1286cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * 1287cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * Otherwise, we need to adjust the systemPartitionSize 1288cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * automatically, and print a warning. 1289cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * 1290cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner */ 1291cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner { 1292cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t systemBytes = avdInfo_getImageFileSize(avd, AVD_IMAGE_INITSYSTEM); 1293def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner uint64_t defaultBytes = defaultPartitionSize; 1294cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1295cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (defaultBytes == 0 || opts->partition_size) 1296cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultBytes = defaultPartitionSize; 1297cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1298cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner systemPartitionSize = _adjustPartitionSize("system", systemBytes, defaultBytes, 1299cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner android_build_out != NULL); 1300cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1301cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1302cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner /* Check the size of the /data partition. The only interesting cases here are: 1303065242de51ba1e18387ce22a99eb091a859990f7David 'Digit' Turner * - when the USERDATA image already exists and is larger than the default 1304cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * - when we're wiping data and the INITDATA is larger than the default. 1305cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner */ 1306cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1307cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner { 1308cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner const char* dataPath = avdInfo_getImageFile(avd, AVD_IMAGE_USERDATA); 1309def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner uint64_t defaultBytes = defaultPartitionSize; 1310cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1311cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (defaultBytes == 0 || opts->partition_size) 1312cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultBytes = defaultPartitionSize; 1313cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1314cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (dataPath == NULL || !path_exists(dataPath) || opts->wipe_data) { 1315cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPath = avdInfo_getImageFile(avd, AVD_IMAGE_INITDATA); 1316cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1317cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (dataPath == NULL || !path_exists(dataPath)) { 1318cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize = defaultBytes; 1319cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1320cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner else { 1321cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t dataBytes; 1322cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner path_get_size(dataPath, &dataBytes); 1323cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1324cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize = _adjustPartitionSize("data", dataBytes, defaultBytes, 1325cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner android_build_out != NULL); 1326cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1327b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 1328b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 13298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 13308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* filetype = "file"; 13318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1332cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (avdInfo_isImageReadOnly(avd, AVD_IMAGE_INITSYSTEM)) 13338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project filetype = "initfile"; 13348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 1336cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner "system,size=0x%x,%s=%s", systemPartitionSize, filetype, 1337cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avdInfo_getImageFile(avd, AVD_IMAGE_INITSYSTEM)); 13388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 13408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 13418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 1344b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project "userdata,size=0x%x,file=%s", 1345cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize, 1346cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avdInfo_getImageFile(avd, AVD_IMAGE_USERDATA)); 13478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 13498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 13508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (hw->disk_cachePartition) { 1352cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->cache = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_CACHE); 13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cachePartitionSize = hw->disk_cachePartition_size; 13548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->cache) { 13568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support a cache partition" ); 13578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = NULL; 13588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = 1; 13598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->cache) { 13628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* use a specific cache file */ 13638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x,file=%s", cachePartitionSize, opts->cache); 13648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 13658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 13668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!opts->no_cache) { 13688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a temporary cache partition file */ 13698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x", cachePartitionSize); 13708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 13718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 13728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 137492568958dd42bf35667cc6451b5edd7f7d1f73a1David 'Digit' Turner if (hw->hw_sdCard != 0) 1375cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->sdcard = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_SDCARD); 137692568958dd42bf35667cc6451b5edd7f7d1f73a1David 'Digit' Turner else if (opts->sdcard) { 13778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support SD Cards" ); 13788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sdcard = NULL; 13798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 13818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(opts->sdcard) { 13828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t size; 13838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_get_size(opts->sdcard, &size) == 0) { 13848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* see if we have an sdcard image. get its size if it exists */ 13858b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner /* due to what looks like limitations of the MMC protocol, one has 13868b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner * to use an SD Card image that is equal or larger than 9 MB 13878b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner */ 13888b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner if (size < 9*1024*1024ULL) { 13898b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner fprintf(stderr, "### WARNING: SD Card files must be at least 9MB, ignoring '%s'\n", opts->sdcard); 13908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 13918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-hda"; 13928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->sdcard; 13938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project use_sdcard_img = 1; 13948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 13968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("no SD Card image at '%s'", opts->sdcard); 13978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 13998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1400353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 1401353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->no_snapstorage) { 1402353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije opts->snapstorage = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_SNAPSHOTS); 1403353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if(opts->snapstorage) { 1404353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (path_exists(opts->snapstorage)) { 1405353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije args[n++] = "-hdb"; 1406353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije args[n++] = opts->snapstorage; 1407353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else { 1408353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("no image at '%s', state snapshots disabled", opts->snapstorage); 1409353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1410353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1411353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 1412353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->no_snapshot) { 141324204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock char* snapshot_name = 141424204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock opts->snapshot ? opts->snapshot : "default-boot"; 141553d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock if (!opts->no_snapshot_load) { 141653d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock args[n++] = "-loadvm"; 141753d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock args[n++] = snapshot_name; 141853d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock } 141924204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock if (!opts->no_snapshot_save) { 142024204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock args[n++] = "-savevm-on-exit"; 142124204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock args[n++] = snapshot_name; 1422353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1423353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->snapshot) { 1424353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije dwarning("option '-no-snapshot' overrides '-snapshot', continuing with boot sequence"); 142553d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock } else if (opts->no_snapshot_load || opts->no_snapshot_save) { 142653d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock D("ignoring redundant option(s) '-no-snapshot-load' and/or '-no-snapshot-save' implied by '-no-snapshot'"); 1427353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1428622b8f4c760b8c4479d28430f978bad8bb9ea32cTim Baverstock if (opts->no_snapshot_update_time) { 1429622b8f4c760b8c4479d28430f978bad8bb9ea32cTim Baverstock android_snapshot_update_time = 0; 1430622b8f4c760b8c4479d28430f978bad8bb9ea32cTim Baverstock } 1431353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->snapshot || opts->snapstorage) { 1432353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije dwarning("option '-no-snapstorage' overrides '-snapshot' and '-snapstorage', " 1433353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije "continuing with full boot, state snapshots are disabled"); 1434353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->no_snapshot) { 1435353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("ignoring redundant option '-no-snapshot' implied by '-no-snapstorage'"); 1436353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 1437ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije 1438ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije if (opts->snapshot_list) { 1439ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije snapshot_print_and_exit(opts->snapstorage); 1440ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije } 1441ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#endif // CONFIG_ANDROID_SNAPSHOTS 1442353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 14438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->logcat || opts->logcat[0] == 0) { 14448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = getenv("ANDROID_LOG_TAGS"); 14458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat && opts->logcat[0] == 0) 14468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = NULL; 14478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 14508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->console) { 14518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "option -console is obsolete. please use -shell instead" ); 14528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 14538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we always send the kernel messages from ttyS0 to android_kmsg */ 14578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 145813f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine if (opts->show_kernel) { 145913f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine args[n++] = "-show-kernel"; 146013f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine } 14618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 14638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-kmsg"; 14648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial++; 14658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXXX: TODO: implement -shell and -logcat through qemud instead */ 14688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->shell_serial) { 14698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 14708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "con:"; 14718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 14728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "stdio"; 14738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 14748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 14768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell = 1; 14778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 14798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 14808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->shell_serial; 14818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project shell_serial = serial++; 14828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 14848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 14858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 14868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 14878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 14888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->radio; 14898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 14908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 14928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 14938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-modem"; 14948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 14958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 14968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 14978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 14988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->gps; 14998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gps_serial = serial++; 15008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else /* !opts->old_system */ 15038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 15058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-qemud"; 15068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemud_serial = serial++; 15078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 1509b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-radio"; 1510b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->radio; 15118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 1514b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-gps"; 1515b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->gps; 15168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->memory) { 15208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 15218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project long ramSize = strtol(opts->memory, &end, 0); 15228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 0 || *end != 0) { 15238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "-memory must be followed by a positive integer" ); 15248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 15258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 32 || ramSize > 4096) { 15278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "physical memory size must be between 32 and 4096 MB" ); 15288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 15298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->memory) { 15328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%d", hw->hw_ramSize); 153318fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->memory = android_strdup(tmp); 15348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 15378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-trace"; 15388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->trace; 15398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-tracing"; 15408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "off"; 15418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1543b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* Pass LCD density value to the core. */ 1544b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine snprintf(lcd_density, sizeof(lcd_density), "%d", get_device_dpi(opts)); 1545b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-lcd-density"; 1546b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = lcd_density; 1547b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 1548b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* Pass boot properties to the core. */ 1549b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine if (opts->prop != NULL) { 1550b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine ParamList* pl = opts->prop; 1551b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine for ( ; pl != NULL; pl = pl->next ) { 1552b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-boot-property"; 1553b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = pl->param; 1554b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 1555b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 1556b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 15578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-append"; 15588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 15608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 15618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int timeout = strtol(opts->bootchart, &end, 10); 15628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (timeout == 0) 15638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->bootchart = NULL; 15648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (timeout < 0 || timeout > 15*60) { 15658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "timeout specified for -bootchart option is invalid.\n" 15668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please use integers between 1 and 900\n"); 15678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 15688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1571318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner /* Setup the kernel init options 1572318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner */ 15738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 15748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char params[1024]; 15758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = params, *end = p + sizeof(params); 15768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "qemu=1 console=ttyS0" ); 15788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 15808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.console=ttyS%d", shell_serial ); 15818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 15848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.tracing=1"); 15858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_jni) { 15888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.checkjni=1"); 15898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_boot_anim) { 15928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint( p, end, " android.bootanim=0" ); 15938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 15948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat) { 15968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q = bufprint(p, end, " androidboot.logcat=%s", opts->logcat); 15978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 15988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end) { 15998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* replace any space by a comma ! */ 16008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 16018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 16028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 1; p[nn] != 0; nn++) 16038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p[nn] == ' ' || p[nn] == '\t') 16048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[nn] = ','; 16058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += nn; 16068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = q; 16098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 16128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 16138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.ril=ttyS%d", radio_serial); 16148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 16168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.gps=ttyS%d", gps_serial); 16178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 16208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 16218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.qemud=ttyS%d", qemud_serial); 16228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 16258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.bootchart=%s", opts->bootchart); 16268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) { 16298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### ERROR: kernel parameters too long\n"); 16308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 16318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(params); 16348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1636d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->ports) { 1637d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-ports"; 1638d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->ports; 1639d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1640d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1641d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->port) { 1642d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-port"; 1643d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->port; 1644d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1645d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1646d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->report_console) { 1647d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-report-console"; 1648d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->report_console; 1649d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1650d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1651d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->http_proxy) { 1652d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-http-proxy"; 1653d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->http_proxy; 1654d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1655d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 165643552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine if (opts->charmap) { 165743552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = "-charmap"; 165843552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = opts->charmap; 165943552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine } 166043552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine 1661b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine if (opts->memcheck) { 1662b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = "-android-memcheck"; 1663b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = opts->memcheck; 1664b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine } 1665b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine 16668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* physical memory */ 16678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-m"; 16688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->memory; 16698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 16708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* on Linux, the 'dynticks' clock sometimes doesn't work 16718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * properly. this results in the UI freezing while emulation 16728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * continues, for several seconds... 16738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 16748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef __linux__ 16758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-clock"; 16768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "unix"; 16778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 16788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 167940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie /* Set up the interfaces for inter-emulator networking */ 168040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 168140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie unsigned int shared_net_id = atoi(opts->shared_net_id); 168240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char nic[37]; 168340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 168440beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 168540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "nic,vlan=0"; 168640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 168740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "user,vlan=0"; 1688111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie 1689111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1690111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie snprintf(nic, sizeof nic, "nic,vlan=1,macaddr=52:54:00:12:34:%02x", shared_net_id); 1691111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = strdup(nic); 1692111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1693111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "socket,vlan=1,mcast=230.0.0.10:1234"; 169440beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 169540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 16968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while(argc-- > 0) { 16978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = *argv++; 16988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 16998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n] = 0; 17008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 17018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(VERBOSE_CHECK(init)) { 17028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 17038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < n; i++) { 17048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stdout, "emulator: argv[%02d] = \"%s\"\n", i, args[i]); 17058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 17078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_main(n, args); 17088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1709