main.c revision 53eb66db4eba72d2e4fc951456be725e14243f25
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/config.h" 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/config/config.h" 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/user-config.h" 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/bufprint.h" 4126d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner#include "android/utils/filelock.h" 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/path.h" 43622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#include "android/utils/tempfile.h" 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 45f845627c83ce6ce3e306f9b6842d1e30ef89ae97David 'Digit' Turner#include "android/main-common.h" 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/help.h" 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/goldfish_nand.h" 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/globals.h" 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 51fc8ed80ba1362d2ce500003625e1c9c39f765661Xavier Ducrohet#include "android/qemulator.h" 52055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner#include "android/display.h" 530119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine 54ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#include "android/snapshot.h" 55ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije 56e3fdd075ed97085b4201cb0c79609633b19bddccDavid 'Digit' Turner#include "android/framebuffer.h" 579a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#include "iolooper.h" 58055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectAndroidRotation android_framebuffer_rotation; 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define STRINGIFY(x) _STRINGIFY(x) 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _STRINGIFY(x) #x 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 64a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#ifdef ANDROID_SDK_TOOLS_REVISION 65a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING STRINGIFY(ANDROID_SDK_TOOLS_REVISION)".0" 66a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#else 67a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING "standalone" 68a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#endif 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define D(...) do { if (VERBOSE_CHECK(init)) dprint(__VA_ARGS__); } while (0) 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int control_console_start( int port ); /* in control.c */ 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int qemu_milli_needed; 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the default device DPI if none is specified by the skin 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEFAULT_DEVICE_DPI 165 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_TRACE 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void start_tracing(void); 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void stop_tracing(void); 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned long android_verbose; 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_main(int argc, char **argv); 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function dumps the QEMU help */ 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void help( void ); 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void emulator_help( void ); 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define VERBOSE_OPT(str,var) { str, &var } 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _VERBOSE_TAG(x,y) { #x, VERBOSE_##x, y }, 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { const char* name; int flag; const char* text; } 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectverbose_options[] = { 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERBOSE_TAG_LIST 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 0, 0, 0 } 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid emulator_help( void ) 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_main(out); 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf( "%.*s", out->n, out->s ); 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_reset(out); 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner/* TODO: Put in shared source file */ 11240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turnerstatic char* 11340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner_getFullFilePath( const char* rootPath, const char* fileName ) 11440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner{ 11540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (path_is_absolute(fileName)) { 11640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner return ASTRDUP(fileName); 11740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } else { 11840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner char temp[PATH_MAX], *p=temp, *end=p+sizeof(temp); 11940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 12040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner p = bufprint(temp, end, "%s/%s", rootPath, fileName); 12140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (p >= end) { 12240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner return NULL; 12340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 12440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner return ASTRDUP(temp); 12540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 12640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner} 12740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 12840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turnerstatic uint64_t 12940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner_adjustPartitionSize( const char* description, 13040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner uint64_t imageBytes, 13140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner uint64_t defaultBytes, 13240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner int inAndroidBuild ) 13340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner{ 13440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner char temp[64]; 13540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner unsigned imageMB; 13640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner unsigned defaultMB; 13740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 13840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (imageBytes <= defaultBytes) 13940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner return defaultBytes; 14040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 14140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner imageMB = convertBytesToMB(imageBytes); 14240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner defaultMB = convertBytesToMB(defaultBytes); 14340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 14440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (imageMB > defaultMB) { 14540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner snprintf(temp, sizeof temp, "(%d MB > %d MB)", imageMB, defaultMB); 14640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } else { 14740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner snprintf(temp, sizeof temp, "(%lld bytes > %lld bytes)", imageBytes, defaultBytes); 14840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 14940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 15040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (inAndroidBuild) { 15140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner dwarning("%s partition size adjusted to match image file %s\n", description, temp); 15240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 15340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 15440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner return convertMBToBytes(imageMB); 15540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner} 15640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint main(int argc, char **argv) 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[MAX_PATH]; 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* tmpend = tmp + sizeof(tmp); 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* args[128]; 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int n; 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* opt; 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int serial = 0; 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int shell_serial = 0; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidHwConfig* hw; 168cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner AvdInfo* avd; 16974d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner AConfig* skinConfig; 17074d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner char* skinPath; 17183ffd66e78d290aa054ace5e484ae3766f638390Vladimir Chtchetkine int inAndroidBuild; 17240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner uint64_t defaultPartitionSize = convertMBToBytes(66); 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidOptions opts[1]; 175b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* net.shared_net_ip boot property value. */ 176b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine char boot_prop_ip[64]; 177b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine boot_prop_ip[0] = '\0'; 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[0] = argv[0]; 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_options( &argc, &argv, opts ) < 0 ) { 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 185bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner#ifdef _WIN32 186bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner socket_init(); 187bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner#endif 188bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner 189bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner handle_ui_options(opts); 190bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (argc-- > 1) { 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt = (++argv)[0]; 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(!strcmp(opt, "-qemu")) { 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argc--; 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argv++; 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "-help")) { 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_help(); 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strncmp(opt, "-help-",6)) { 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt += 6; 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "all")) { 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_all(out); 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_option(opt, out) == 0) { 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_topic(opt, out) == 0) { 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out->n > 0) { 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("\n%.*s", out->n, out->s); 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: -help-%s\n", opt); 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid topics\n"); 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opt[0] == '-') { 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: %s\n", opt); 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid options\n"); 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "invalid command-line parameter: %s.\n", opt); 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Hint: use '@foo' to launch a virtual device named 'foo'.\n"); 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for more information\n"); 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->version) { 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("Android emulator version %s\n" 2415f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner "Copyright (C) 2006-2011 The Android Open Source Project and many others.\n" 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "This program is a derivative of the QEMU CPU emulator (www.qemu.org).\n\n", 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined ANDROID_BUILD_ID 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING " (build_id " STRINGIFY(ANDROID_BUILD_ID) ")" ); 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING); 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf(" This software is licensed under the terms of the GNU General Public\n" 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " License version 2, as published by the Free Software Foundation, and\n" 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " may be copied, distributed, and modified under those terms.\n\n" 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " This program is distributed in the hope that it will be useful,\n" 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " GNU General Public License for more details.\n\n"); 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2595f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (opts->snapshot_list) { 2605f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner snapshot_print_and_exit(opts->snapstorage); 2615f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner } 2625f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 26325eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner sanitizeOptions(opts); 26425eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner 265bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner /* Initialization of UI started with -attach-core should work differently 266bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner * than initialization of UI that starts the core. In particular.... 267bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner */ 268bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner 269bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner /* -charmap is incompatible with -attach-core, because particular 270bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner * charmap gets set up in the running core. */ 27174d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner if (android_charmap_setup(opts->charmap)) { 27274d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner exit(1); 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 27583ffd66e78d290aa054ace5e484ae3766f638390Vladimir Chtchetkine /* Parses options and builds an appropriate AVD. */ 276462564f31bbdc9939bf1d2376e2782defa7ef655David 'Digit' Turner avd = android_avdInfo = createAVD(opts, &inAndroidBuild); 277cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* get the skin from the virtual device configuration */ 27925eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner if (opts->skindir != NULL) { 28025eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner if (opts->skin == NULL) { 28125eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner /* NOTE: Normally handled by sanitizeOptions(), just be safe */ 28225eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner derror("The -skindir <path> option requires a -skin <name> option"); 28325eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner exit(2); 28425eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner } 28525eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner } else { 28625eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner char* skinName; 28725eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner char* skinDir; 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28925eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner avdInfo_getSkinInfo(avd, &skinName, &skinDir); 29025eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner 29125eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner if (opts->skin == NULL) { 29225eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner opts->skin = skinName; 29325eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner D("autoconfig: -skin %s", opts->skin); 29425eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner } else { 29525eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner AFREE(skinName); 29625eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner } 29725eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner 29825eb6557b94da066d6e137c07aeced39badf5aa6David 'Digit' Turner opts->skindir = skinDir; 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skindir %s", opts->skindir); 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Read hardware configuration */ 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hw = android_hw; 304cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (avdInfo_getHwConfig(avd, hw) < 0) { 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("could not read hardware configuration ?"); 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->keyset) { 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset(opts->keyset, opts); 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "emulator: WARNING: could not find keyset file named '%s'," 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " using defaults instead\n", 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->keyset); 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset("default", opts); 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_keyset = skin_keyset_new_from_text( skin_keyset_get_default() ); 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: default keyset file is corrupted !!\n" ); 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: please update the code in android/skin/keyset.c\n" ); 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->keyset) 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project write_default_keyset(); 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 33240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 33340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char* end; 33440beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie long shared_net_id = strtol(opts->shared_net_id, &end, 0); 33540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (end == NULL || *end || shared_net_id < 1 || shared_net_id > 255) { 33640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie fprintf(stderr, "option -shared-net-id must be an integer between 1 and 255\n"); 33740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie exit(1); 33840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 339b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine snprintf(boot_prop_ip, sizeof(boot_prop_ip), 340b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine "net.shared_net_ip=10.1.2.%ld", shared_net_id); 34140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 34240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 34340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 344755811e67c266333807571f798b62b6916611f87David 'Digit' Turner user_config_init(); 3452507cab8a78fb609461a2b9cc4708bab60fc53a4David 'Digit' Turner parse_skin_files(opts->skindir, opts->skin, opts, hw, 34674d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner &skinConfig, &skinPath); 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 348092361e19ecc2992965729538984354099eea8cbDavid 'Digit' Turner if (!opts->netspeed && skin_network_speed) { 349092361e19ecc2992965729538984354099eea8cbDavid 'Digit' Turner D("skin network speed: '%s'", skin_network_speed); 350092361e19ecc2992965729538984354099eea8cbDavid 'Digit' Turner if (strcmp(skin_network_speed, NETWORK_SPEED_DEFAULT) != 0) { 351092361e19ecc2992965729538984354099eea8cbDavid 'Digit' Turner opts->netspeed = (char*)skin_network_speed; 352092361e19ecc2992965729538984354099eea8cbDavid 'Digit' Turner } 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 354092361e19ecc2992965729538984354099eea8cbDavid 'Digit' Turner if (!opts->netdelay && skin_network_delay) { 355092361e19ecc2992965729538984354099eea8cbDavid 'Digit' Turner D("skin network delay: '%s'", skin_network_delay); 356092361e19ecc2992965729538984354099eea8cbDavid 'Digit' Turner if (strcmp(skin_network_delay, NETWORK_DELAY_DEFAULT) != 0) { 357092361e19ecc2992965729538984354099eea8cbDavid 'Digit' Turner opts->netdelay = (char*)skin_network_delay; 358092361e19ecc2992965729538984354099eea8cbDavid 'Digit' Turner } 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 362cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner char* tracePath = avdInfo_getTracePath(avd, opts->trace); 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (tracePath == NULL) { 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad -trace parameter" ); 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = path_mkdir_if_needed( tracePath, 0755 ); 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not create directory '%s'\n", tmp); 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->trace = tracePath; 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = 1; 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* generate arguments for the underlying qemu main() */ 379238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner { 3800b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner char* kernelFile = opts->kernel; 3810b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner int kernelFileLen; 3820b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner 3830b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner if (kernelFile == NULL) { 3840b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner kernelFile = avdInfo_getKernelPath(avd); 3850b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner if (kernelFile == NULL) { 3860b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner derror( "This AVD's configuration is missing a kernel file!!" ); 3870b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner exit(2); 3880b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner } 3890b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner D("autoconfig: -kernel %s", kernelFile); 3900b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner } 3910b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner if (!path_exists(kernelFile)) { 3920b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner derror( "Invalid or missing kernel image file: %s", kernelFile ); 3930b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner exit(2); 3940b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner } 395238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 3960b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner hw->kernel_path = kernelFile; 397238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 398238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner /* If the kernel image name ends in "-armv7", then change the cpu 399238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * type automatically. This is a poor man's approach to configuration 400238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * management, but should allow us to get past building ARMv7 401238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * system images with dex preopt pass without introducing too many 402238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * changes to the emulator sources. 403238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * 404238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * XXX: 405238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * A 'proper' change would require adding some sort of hardware-property 406238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * to each AVD config file, then automatically determine its value for 407238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * full Android builds (depending on some environment variable), plus 408238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * some build system changes. I prefer not to do that for now for reasons 409238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * of simplicity. 410238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner */ 4110b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner kernelFileLen = strlen(kernelFile); 412238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner if (kernelFileLen > 6 && !memcmp(kernelFile + kernelFileLen - 6, "-armv7", 6)) { 413238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "-cpu"; 414238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "cortex-a8"; 415238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 416238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 418b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine if (boot_prop_ip[0]) { 419b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-boot-property"; 420b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = boot_prop_ip; 421b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 422b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 423318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine if (opts->tcpdump) { 424318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine args[n++] = "-tcpdump"; 425318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine args[n++] = opts->tcpdump; 426318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine } 427318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine 428e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine#ifdef CONFIG_NAND_LIMITS 429e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->nand_limits) { 430e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-nand-limits"; 431e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->nand_limits; 432e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 433e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine#endif 434e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine 43574d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner if (opts->timezone) { 43674d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner args[n++] = "-timezone"; 43774d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner args[n++] = opts->timezone; 43874d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner } 43974d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner 440e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netspeed) { 441e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netspeed"; 442e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->netspeed; 443e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 444e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netdelay) { 445e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netdelay"; 446e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->netdelay; 447e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 448e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netfast) { 449e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netfast"; 450e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 451e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine 452b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio) { 453b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio"; 454b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio; 455b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 456b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 457b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->cpu_delay) { 458b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-cpu-delay"; 459b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->cpu_delay; 460b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 461b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 4627fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine if (opts->dns_server) { 4637fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = "-dns-server"; 4647fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = opts->dns_server; 4657fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine } 4667fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine 4670b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner hw->disk_ramdisk_path = avdInfo_getRamdiskPath(avd); 4680b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner D("autoconfig: -ramdisk %s", hw->disk_ramdisk_path); 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 47040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner /* -partition-size is used to specify the max size of both the system 47140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner * and data partition sizes. 47240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner */ 47340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (opts->partition_size) { 47440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner char* end; 47540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner long sizeMB = strtol(opts->partition_size, &end, 0); 47640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner long minSizeMB = 10; 47740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner long maxSizeMB = LONG_MAX / ONE_MB; 47840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 47940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (sizeMB < 0 || *end != 0) { 48040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner derror( "-partition-size must be followed by a positive integer" ); 48140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner exit(1); 48240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 48340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (sizeMB < minSizeMB || sizeMB > maxSizeMB) { 48440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner derror( "partition-size (%d) must be between %dMB and %dMB", 48540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner sizeMB, minSizeMB, maxSizeMB ); 48640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner exit(1); 48740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 48840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner defaultPartitionSize = (uint64_t) sizeMB * ONE_MB; 48940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 49040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 49140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 49240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner /** SYSTEM PARTITION **/ 49340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 49440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (opts->sysdir == NULL) { 49540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (avdInfo_inAndroidBuild(avd)) { 49640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner opts->sysdir = ASTRDUP(avdInfo_getContentPath(avd)); 49740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner D("autoconfig: -sysdir %s", opts->sysdir); 49840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 49940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 50040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 50140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (opts->sysdir != NULL) { 50240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (!path_exists(opts->sysdir)) { 50340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner derror("Directory does not exist: %s", opts->sysdir); 50440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner exit(1); 50540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 50640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 50740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 50940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner char* rwImage = NULL; 51040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner char* initImage = NULL; 51140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 51240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner do { 51340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (opts->system == NULL) { 51440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner /* If -system is not used, try to find a runtime system image 51540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner * (i.e. system-qemu.img) in the content directory. 51640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner */ 51740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner rwImage = avdInfo_getSystemImagePath(avd); 51840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (rwImage != NULL) { 51940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner break; 52040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 52140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner /* Otherwise, try to find the initial system image */ 52240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner initImage = avdInfo_getSystemInitImagePath(avd); 52340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (initImage == NULL) { 52440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner derror("No initial system image for this configuration!"); 52540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner exit(1); 52640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 52740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner break; 52840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 53040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner /* If -system <name> is used, use it to find the initial image */ 53140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (opts->sysdir != NULL) { 53240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner initImage = _getFullFilePath(opts->sysdir, opts->system); 53340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } else { 53440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner initImage = ASTRDUP(opts->system); 53540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 53640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (!path_exists(initImage)) { 53740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner derror("System image file doesn't exist: %s", initImage); 53840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner exit(1); 53940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 54140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } while (0); 54240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 54340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (rwImage != NULL) { 54440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner /* Use the read/write image file directly */ 54540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner hw->disk_systemPartition_path = rwImage; 54640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner hw->disk_systemPartition_initPath = NULL; 54740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner D("Using direct system image: %s", rwImage); 54840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } else if (initImage != NULL) { 54940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner hw->disk_systemPartition_path = NULL; 55040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner hw->disk_systemPartition_initPath = initImage; 55140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner D("Using initial system image: %s", initImage); 55240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 55440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner /* Check the size of the system partition image. 55540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner * If we have an AVD, it must be smaller than 55640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner * the disk.systemPartition.size hardware property. 55740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner * 55840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner * Otherwise, we need to adjust the systemPartitionSize 55940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner * automatically, and print a warning. 56040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner * 56140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner */ 56240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner const char* systemImage = hw->disk_systemPartition_path; 56340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner uint64_t systemBytes; 56440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 56540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (systemImage == NULL) 56640841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner systemImage = hw->disk_systemPartition_initPath; 56740841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 56840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner if (path_get_size(systemImage, &systemBytes) < 0) { 56940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner derror("Missing system image: %s", systemImage); 57040841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner exit(1); 57140841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner } 57240841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 57340841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner hw->disk_systemPartition_size = 57440841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner _adjustPartitionSize("system", systemBytes, defaultPartitionSize, 57540841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner avdInfo_inAndroidBuild(avd)); 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 57840841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner /** DATA PARTITION **/ 57940841b2d221273a08abfe20824e7631211ade31dDavid 'Digit' Turner 580fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner if (opts->datadir) { 581fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner if (!path_exists(opts->datadir)) { 582fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner derror("Invalid -datadir directory: %s", opts->datadir); 583fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } 584fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } 585fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner 586fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner { 587fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner char* dataImage = NULL; 588fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner char* initImage = NULL; 589fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner 590fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner do { 591fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner if (!opts->data) { 592fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner dataImage = avdInfo_getDataImagePath(avd); 593fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner if (dataImage != NULL) { 594fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner D("autoconfig: -data %s", dataImage); 595fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner break; 596fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } 597fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner dataImage = avdInfo_getDefaultDataImagePath(avd); 598fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner if (dataImage == NULL) { 599fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner derror("No data image path for this configuration!"); 600fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner exit (1); 601fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } 602fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner opts->wipe_data = 1; 603fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner break; 604fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 606fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner if (opts->datadir) { 607fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner dataImage = _getFullFilePath(opts->datadir, opts->data); 608fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } else { 609fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner dataImage = ASTRDUP(opts->data); 610fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } 611fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } while (0); 612fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner 613fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner if (opts->initdata != NULL) { 614fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner initImage = ASTRDUP(opts->initdata); 615fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner if (!path_exists(initImage)) { 616fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner derror("Invalid initial data image path: %s", initImage); 617fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner exit(1); 618fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } 619fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } else { 620fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner initImage = avdInfo_getDataInitImagePath(avd); 621fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner D("autoconfig: -initdata %s", initImage); 622fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } 623fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner 624fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner hw->disk_dataPartition_path = dataImage; 625fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner if (opts->wipe_data) { 626fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner hw->disk_dataPartition_initPath = initImage; 627fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } else { 628fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner hw->disk_dataPartition_initPath = NULL; 629fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } 630fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner 631fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner uint64_t defaultBytes = defaultPartitionSize; 632fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner uint64_t dataBytes; 633fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner const char* dataPath = hw->disk_dataPartition_initPath; 634fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner 635fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner if (dataPath == NULL) 636fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner dataPath = hw->disk_dataPartition_path; 637fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner 638fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner path_get_size(dataPath, &dataBytes); 639fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner 640fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner hw->disk_dataPartition_size = 641fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner _adjustPartitionSize("data", dataBytes, defaultBytes, 642fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner avdInfo_inAndroidBuild(avd)); 643fd59c330bec77e7b9241e478efb1e1c508480d1dDavid 'Digit' Turner } 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 645c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner /** CACHE PARTITION **/ 646c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner 647c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner if (opts->no_cache) { 648c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner /* No cache partition at all */ 649c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner hw->disk_cachePartition = 0; 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 651c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner else if (!hw->disk_cachePartition) { 652c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner if (opts->cache) { 653c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner dwarning( "Emulated hardware doesn't support a cache partition. -cache option ignored!" ); 654c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner opts->cache = NULL; 655c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner } 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 657c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner else 658c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner { 659c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner if (!opts->cache) { 660c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner /* Find the current cache partition file */ 661c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner opts->cache = avdInfo_getCachePath(avd); 662c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner if (opts->cache == NULL) { 663c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner /* The file does not exists, we will force its creation 664c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner * if we are not in the Android build system. Otherwise, 665c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner * a temporary file will be used. 666c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner */ 667c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner if (!avdInfo_inAndroidBuild(avd)) { 668c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner opts->cache = avdInfo_getDefaultCachePath(avd); 669c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner } 670c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner } 67148a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner if (opts->cache) { 67248a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner D("autoconfig: -cache %s", opts->cache); 67348a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner } 674c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner } 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 676c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner if (opts->cache) { 677c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner hw->disk_cachePartition_path = ASTRDUP(opts->cache); 678c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner } 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 681c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner /** SD CARD PARTITION */ 682c480cca8d2007f5df62a7431beda310911b963e6David 'Digit' Turner 68348a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner if (!hw->hw_sdCard) { 68448a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner /* No SD Card emulation, so -sdcard will be ignored */ 68548a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner if (opts->sdcard) { 68648a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner dwarning( "Emulated hardware doesn't support SD Cards. -sdcard option ignored." ); 68748a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner opts->sdcard = NULL; 68848a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner } 68948a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner } else { 69048a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner /* Auto-configure -sdcard if it is not available */ 69148a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner if (!opts->sdcard) { 69248a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner do { 69348a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner /* If -datadir <path> is used, look for a sdcard.img file here */ 69448a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner if (opts->datadir) { 69548a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner bufprint(tmp, tmpend, "%s/%s", opts->datadir, "system.img"); 69648a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner if (path_exists(tmp)) { 69748a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner opts->sdcard = strdup(tmp); 69848a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner break; 69948a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner } 70048a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner } 70148a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner 70248a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner /* Otherwise, look at the AVD's content */ 70348a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner opts->sdcard = avdInfo_getSdCardPath(avd); 70448a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner if (opts->sdcard != NULL) { 70548a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner break; 70648a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner } 70748a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner 70848a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner /* Nothing */ 70948a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner } while (0); 71048a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner 71148a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner if (opts->sdcard) { 71248a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner D("autoconfig: -sdcard %s", opts->sdcard); 71348a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner } 71448a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner } 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(opts->sdcard) { 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t size; 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_get_size(opts->sdcard, &size) == 0) { 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* see if we have an sdcard image. get its size if it exists */ 7218b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner /* due to what looks like limitations of the MMC protocol, one has 7228b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner * to use an SD Card image that is equal or larger than 9 MB 7238b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner */ 7248b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner if (size < 9*1024*1024ULL) { 7258b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner fprintf(stderr, "### WARNING: SD Card files must be at least 9MB, ignoring '%s'\n", opts->sdcard); 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 72748a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner hw->hw_sdCard_path = ASTRDUP(opts->sdcard); 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 73048a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner dwarning("no SD Card image at '%s'", opts->sdcard); 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 73448a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner 73548a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner /** SNAPSHOT STORAGE HANDLING */ 73648a3c66361158678f476fc7c2eca2bef025eae62David 'Digit' Turner 7375f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner /* Determine snapstorage path. -no-snapstorage disables all snapshotting 7385f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner * support. This means you can't resume a snapshot at load, save it at 7395f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner * exit, or even load/save them dynamically at runtime with the console. 7405f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner */ 7415f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (opts->no_snapstorage) { 7425f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 7435f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (opts->snapshot) { 7445f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner dwarning("ignoring -snapshot option due to the use of -no-snapstorage"); 7455f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner opts->snapshot = NULL; 7465f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner } 7475f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 7485f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (opts->snapstorage) { 7495f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner dwarning("ignoring -snapstorage option due to the use of -no-snapstorage"); 7505f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner opts->snapstorage = NULL; 7515f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner } 7525f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner } 7535f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner else 7545f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner { 7555f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (!opts->snapstorage) { 7565f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner opts->snapstorage = avdInfo_getSnapStoragePath(avd); 7575f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (opts->snapstorage != NULL) { 7585f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner D("autoconfig: -snapstorage %s", opts->snapstorage); 759353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 760353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 761353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 7625f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (opts->snapstorage && !path_exists(opts->snapstorage)) { 7635f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner D("no image at '%s', state snapshots disabled", opts->snapstorage); 7645f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner opts->snapstorage = NULL; 7655f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner } 7665f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner } 7675f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 7685f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner /* If we have a valid snapshot storage path */ 7695f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 7705f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (opts->snapstorage) { 7715f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 7725f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner hw->disk_snapStorage_path = ASTRDUP(opts->snapstorage); 7735f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 7745f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner /* -no-snapshot is equivalent to using both -no-snapshot-load 7755f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner * and -no-snapshot-save. You can still load/save snapshots dynamically 7765f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner * from the console though. 7775f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner */ 7785f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (opts->no_snapshot) { 7795f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 7805f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner opts->no_snapshot_load = 1; 7815f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner opts->no_snapshot_save = 1; 7825f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 7835f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (opts->snapshot) { 7845f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner dwarning("ignoring -snapshot option due to the use of -no-snapshot."); 78553d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock } 7865f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner } 7875f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 7885f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (!opts->no_snapshot_load || !opts->no_snapshot_save) { 7895f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (opts->snapshot == NULL) { 7905f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner opts->snapshot = "default-boot"; 7915f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner D("autoconfig: -snapshot %s", opts->snapshot); 792353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 793353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 7945f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 7955f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner /* We still use QEMU command-line options for the following since 7965f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner * they can change from one invokation to the next and don't really 7975f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner * correspond to the hardware configuration itself. 7985f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner */ 7995f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (!opts->no_snapshot_load) { 8005f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner args[n++] = "-loadvm"; 8015f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner args[n++] = ASTRDUP(opts->snapshot); 8025f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner } 8035f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 8045f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner if (!opts->no_snapshot_save) { 8055f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner args[n++] = "-savevm-on-exit"; 8065f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner args[n++] = ASTRDUP(opts->snapshot); 8075f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner } 8085f64b873605baa5519211b0d47a53c93df9d4868David 'Digit' Turner 809622b8f4c760b8c4479d28430f978bad8bb9ea32cTim Baverstock if (opts->no_snapshot_update_time) { 810bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner args[n++] = "-snapshot-no-time-update"; 811622b8f4c760b8c4479d28430f978bad8bb9ea32cTim Baverstock } 812ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije } 813353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->logcat || opts->logcat[0] == 0) { 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = getenv("ANDROID_LOG_TAGS"); 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat && opts->logcat[0] == 0) 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = NULL; 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we always send the kernel messages from ttyS0 to android_kmsg */ 821062dd6a8b90c7c553a6a7257e9c245276b1dd969David 'Digit' Turner if (opts->show_kernel) { 822062dd6a8b90c7c553a6a7257e9c245276b1dd969David 'Digit' Turner args[n++] = "-show-kernel"; 8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXXX: TODO: implement -shell and -logcat through qemud instead */ 8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->shell_serial) { 8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "con:"; 8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "stdio"; 8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell = 1; 8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->shell_serial; 8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project shell_serial = serial++; 8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 842062dd6a8b90c7c553a6a7257e9c245276b1dd969David 'Digit' Turner if (opts->radio) { 843062dd6a8b90c7c553a6a7257e9c245276b1dd969David 'Digit' Turner args[n++] = "-radio"; 844062dd6a8b90c7c553a6a7257e9c245276b1dd969David 'Digit' Turner args[n++] = opts->radio; 8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 847062dd6a8b90c7c553a6a7257e9c245276b1dd969David 'Digit' Turner if (opts->gps) { 848062dd6a8b90c7c553a6a7257e9c245276b1dd969David 'Digit' Turner args[n++] = "-gps"; 849062dd6a8b90c7c553a6a7257e9c245276b1dd969David 'Digit' Turner args[n++] = opts->gps; 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->memory) { 8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project long ramSize = strtol(opts->memory, &end, 0); 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 0 || *end != 0) { 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "-memory must be followed by a positive integer" ); 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 32 || ramSize > 4096) { 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "physical memory size must be between 32 and 4096 MB" ); 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8635377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner hw->hw_ramSize = ramSize; 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->memory) { 8663bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner int ramSize = hw->hw_ramSize; 8673bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner if (ramSize <= 0) { 8683bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner /* Compute the default RAM size based on the size of screen. 8693bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * This is only used when the skin doesn't provide the ram 8703bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * size through its hardware.ini (i.e. legacy ones) or when 8713bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * in the full Android build system. 8723bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner */ 8735377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner int64_t pixels = hw->hw_lcd_width * hw->hw_lcd_height; 8743bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner /* The following thresholds are a bit liberal, but we 8753bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * essentially want to ensure the following mappings: 8763bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 8773bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 320x480 -> 96 8783bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 800x600 -> 128 8793bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 1024x768 -> 256 8803bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 8813bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * These are just simple heuristics, they could change in 8823bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * the future. 8833bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner */ 8843bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner if (pixels <= 250000) 8853bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner ramSize = 96; 8863bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner else if (pixels <= 500000) 8873bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner ramSize = 128; 8883bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner else 8893bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner ramSize = 256; 8903bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner } 8915377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner hw->hw_ramSize = ramSize; 8925377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner } 8935377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner 8945377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner D("Physical RAM size: %dMB\n", hw->hw_ramSize); 8955377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner 8965377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner if (hw->vm_heapSize == 0) { 8975377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner /* Compute the default heap size based on the RAM size. 8985377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner * Essentially, we want to ensure the following liberal mappings: 8995377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner * 9005377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner * 96MB RAM -> 16MB heap 9015377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner * 128MB RAM -> 24MB heap 9025377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner * 256MB RAM -> 48MB heap 9035377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner */ 9045377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner int ramSize = hw->hw_ramSize; 9055377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner int heapSize; 9065377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner 9075377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner if (ramSize < 100) 9085377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner heapSize = 16; 9095377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner else if (ramSize < 192) 9105377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner heapSize = 24; 9115377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner else 9125377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner heapSize = 48; 9135377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner 9145377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner hw->vm_heapSize = heapSize; 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-trace"; 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->trace; 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-tracing"; 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "off"; 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 924b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* Pass boot properties to the core. */ 925b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine if (opts->prop != NULL) { 926b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine ParamList* pl = opts->prop; 927b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine for ( ; pl != NULL; pl = pl->next ) { 928b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-boot-property"; 929b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = pl->param; 930b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 931b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 932b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 933318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner /* Setup the kernel init options 934318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner */ 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char params[1024]; 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = params, *end = p + sizeof(params); 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 939062dd6a8b90c7c553a6a7257e9c245276b1dd969David 'Digit' Turner /* Don't worry about having a leading space here, this is handled 940062dd6a8b90c7c553a6a7257e9c245276b1dd969David 'Digit' Turner * by the core later. */ 941062dd6a8b90c7c553a6a7257e9c245276b1dd969David 'Digit' Turner 942334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima#ifdef TARGET_I386 943334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima p = bufprint(p, end, " androidboot.hardware=goldfish"); 944bac9add881e0b7cfa2da2b86242347c096329a4cJun Nakajima p = bufprint(p, end, " clocksource=pit"); 945334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima#endif 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.console=ttyS%d", shell_serial ); 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.tracing=1"); 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_jni) { 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.checkjni=1"); 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_boot_anim) { 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint( p, end, " android.bootanim=0" ); 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat) { 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q = bufprint(p, end, " androidboot.logcat=%s", opts->logcat); 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end) { 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* replace any space by a comma ! */ 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 1; p[nn] != 0; nn++) 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p[nn] == ' ' || p[nn] == '\t') 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[nn] = ','; 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += nn; 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = q; 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.bootchart=%s", opts->bootchart); 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) { 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### ERROR: kernel parameters too long\n"); 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9880b0194940523fa3f318c380d0693907bd522241cDavid 'Digit' Turner hw->kernel_parameters = strdup(params); 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 991d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->ports) { 992d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-ports"; 993d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->ports; 994d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 995d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 996d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->port) { 997d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-port"; 998d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->port; 999d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1000d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1001d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->report_console) { 1002d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-report-console"; 1003d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->report_console; 1004d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1005d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1006d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->http_proxy) { 1007d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-http-proxy"; 1008d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->http_proxy; 1009d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1010d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 101143552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine if (opts->charmap) { 101243552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = "-charmap"; 101343552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = opts->charmap; 101443552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine } 101543552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine 1016b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine if (opts->memcheck) { 1017b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = "-android-memcheck"; 1018b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = opts->memcheck; 1019b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine } 1020b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine 10215377c5bfde6ba62490417bb0a7d7c1be1151692eDavid 'Digit' Turner /* physical memory is now in hw->hw_ramSize */ 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 102353eb66db4eba72d2e4fc951456be725e14243f25David 'Digit' Turner hw->avd_name = ASTRDUP(avdInfo_getName(avd)); 10246b8555cac04862908bf6c64565061f2c8e871ad7David 'Digit' Turner 102540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie /* Set up the interfaces for inter-emulator networking */ 102640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 102740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie unsigned int shared_net_id = atoi(opts->shared_net_id); 102840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char nic[37]; 102940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 103040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 103140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "nic,vlan=0"; 103240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 103340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "user,vlan=0"; 1034111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie 1035111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1036111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie snprintf(nic, sizeof nic, "nic,vlan=1,macaddr=52:54:00:12:34:%02x", shared_net_id); 1037111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = strdup(nic); 1038111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1039111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "socket,vlan=1,mcast=230.0.0.10:1234"; 104040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 104140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while(argc-- > 0) { 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = *argv++; 10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n] = 0; 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 104726d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner /* Generate a hardware-qemu.ini for this AVD. The real hardware 1048622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * configuration is ususally stored in several files, e.g. the AVD's 1049622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * config.ini plus the skin-specific hardware.ini. 1050622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * 105126d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner * The new file will group all definitions and will be used to 1052622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * launch the core with the -android-hw <file> option. 1053622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner */ 1054622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner { 105542074e5e184aed78dee0efb14d7376325516c070David 'Digit' Turner const char* coreHwIniPath = avdInfo_getCoreHwIniPath(avd); 105642074e5e184aed78dee0efb14d7376325516c070David 'Digit' Turner IniFile* hwIni = iniFile_newFromMemory("", NULL); 1057622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner androidHwConfig_write(hw, hwIni); 105826d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner 105926d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner if (filelock_create(coreHwIniPath) == NULL) { 106026d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner /* The AVD is already in use, we still support this as an 106126d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner * experimental feature. Use a temporary hardware-qemu.ini 106226d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner * file though to avoid overwriting the existing one. */ 106326d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner TempFile* tempIni = tempfile_create(); 106426d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner coreHwIniPath = tempfile_path(tempIni); 106526d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner } 106626d415322b75784f123d39f36616b8ebd1fbb359David 'Digit' Turner 106742074e5e184aed78dee0efb14d7376325516c070David 'Digit' Turner if (iniFile_saveToFile(hwIni, coreHwIniPath) < 0) { 106842074e5e184aed78dee0efb14d7376325516c070David 'Digit' Turner derror("Could not write hardware.ini to %s: %s", coreHwIniPath, strerror(errno)); 1069622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner exit(2); 1070622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner } 1071622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner args[n++] = "-android-hw"; 107242074e5e184aed78dee0efb14d7376325516c070David 'Digit' Turner args[n++] = strdup(coreHwIniPath); 1073622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner } 1074622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(VERBOSE_CHECK(init)) { 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 10773336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("QEMU options list:\n"); 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < n; i++) { 10793336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("emulator: argv[%02d] = \"%s\"\n", i, args[i]); 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10813336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner /* Dump final command-line option to make debugging the core easier */ 10823336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("Concatenated QEMU options:\n"); 10833336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner for (i = 0; i < n; i++) { 108426722dde31c3467cd31a078662810927eec05de5David 'Digit' Turner /* To make it easier to copy-paste the output to a command-line, 108526722dde31c3467cd31a078662810927eec05de5David 'Digit' Turner * quote anything that contains spaces. 108626722dde31c3467cd31a078662810927eec05de5David 'Digit' Turner */ 108726722dde31c3467cd31a078662810927eec05de5David 'Digit' Turner if (strchr(args[i], ' ') != NULL) { 108826722dde31c3467cd31a078662810927eec05de5David 'Digit' Turner printf(" '%s'", args[i]); 108926722dde31c3467cd31a078662810927eec05de5David 'Digit' Turner } else { 109026722dde31c3467cd31a078662810927eec05de5David 'Digit' Turner printf(" %s", args[i]); 109126722dde31c3467cd31a078662810927eec05de5David 'Digit' Turner } 10923336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner } 10933336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("\n"); 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 109574d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner 109674d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner /* Setup SDL UI just before calling the code */ 109774d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner init_sdl_ui(skinConfig, skinPath, opts); 109874d7acec6643694132a127feb5ccadda7ea793d6David 'Digit' Turner 1099bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner if (attach_ui_to_core(opts) < 0) { 1100bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner derror("Can't attach to core!"); 1101bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner exit(1); 1102bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner } 1103bdb6f2dd35a4c749186e665d55d7b76375d7e71dDavid 'Digit' Turner 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_main(n, args); 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1106