main.c revision f845627c83ce6ce3e306f9b6842d1e30ef89ae97
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" 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/dirscanner.h" 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/path.h" 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/timezone.h" 44622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#include "android/utils/tempfile.h" 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 46f845627c83ce6ce3e306f9b6842d1e30ef89ae97David 'Digit' Turner#include "android/main-common.h" 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/help.h" 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "hw/goldfish_nand.h" 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/globals.h" 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 520119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine#include "android/qemulator.h" 53055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner#include "android/display.h" 540119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine 55ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#include "android/snapshot.h" 56ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "framebuffer.h" 589a33e8554225c82cd900208f88e8965bb085ab87Vladimir Chtchetkine#include "iolooper.h" 59055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectAndroidRotation android_framebuffer_rotation; 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define STRINGIFY(x) _STRINGIFY(x) 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _STRINGIFY(x) #x 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 65a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#ifdef ANDROID_SDK_TOOLS_REVISION 66a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING STRINGIFY(ANDROID_SDK_TOOLS_REVISION)".0" 67a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#else 68a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner# define VERSION_STRING "standalone" 69a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner#endif 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define D(...) do { if (VERBOSE_CHECK(init)) dprint(__VA_ARGS__); } while (0) 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int control_console_start( int port ); /* in control.c */ 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int qemu_milli_needed; 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the default device DPI if none is specified by the skin 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEFAULT_DEVICE_DPI 165 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int opts->flashkeys; /* forward */ 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_TRACE 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void start_tracing(void); 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void stop_tracing(void); 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned long android_verbose; 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_main(int argc, char **argv); 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function dumps the QEMU help */ 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void help( void ); 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void emulator_help( void ); 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define VERBOSE_OPT(str,var) { str, &var } 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _VERBOSE_TAG(x,y) { #x, VERBOSE_##x, y }, 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { const char* name; int flag; const char* text; } 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectverbose_options[] = { 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERBOSE_TAG_LIST 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 0, 0, 0 } 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid emulator_help( void ) 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_main(out); 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf( "%.*s", out->n, out->s ); 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_reset(out); 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this function is used to perform auto-detection of the 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * system directory in the case of a SDK installation. 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we want to deal with several historical usages, hence 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the slightly complicated logic. 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * NOTE: the function returns the path to the directory 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * containing 'fileName'. this is *not* the full 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * path to 'fileName'. 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImagePath( const char* fileName ) 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = temp; 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(temp); 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q; 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* app; 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static const char* const searchPaths[] = { 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "", /* program's directory */ 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/lib/images", /* this is for SDK 1.0 */ 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "/../platforms/android-1.1/images", /* this is for SDK 1.1 */ 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NULL 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project app = bufprint_app_dir(temp, end); 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (app >= end) 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* first search a few well-known paths */ 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; searchPaths[nn] != NULL; nn++) { 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "%s", searchPaths[nn]); 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s", fileName); 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end && path_exists(temp)) { 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *p = 0; 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto FOUND_IT; 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* hmmm. let's assume that we are in a post-1.1 SDK 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * scan ../platforms if it exists 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(app, end, "/../platforms"); 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p < end) { 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DirScanner* scanner = dirScanner_new(temp); 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (scanner != NULL) { 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int found = 0; 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* subdir; 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (;;) { 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project subdir = dirScanner_next(scanner); 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!subdir) break; 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = bufprint(p, end, "/%s/images/%s", subdir, fileName); 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q >= end || !path_exists(temp)) 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project found = 1; 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "/%s/images", subdir); 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dirScanner_free(scanner); 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (found) 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* I'm out of ideas */ 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFOUND_IT: 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //D("image auto-detection: %s/%s", temp, fileName); 19418fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner return android_strdup(temp); 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkImage( const char* path, const char* file ) 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char temp[MAX_PATH]; 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = temp, *end = p + sizeof(temp); 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(temp, end, "%s/%s", path, file); 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end || !path_exists(temp)) 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 20718fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner return android_strdup(temp); 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic char* 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_getSdkSystemImage( const char* path, const char* optionName, const char* file ) 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* image = _getSdkImage(path, file); 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (image == NULL) { 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Your system directory is missing the '%s' image file.\n" 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please specify one with the '%s <filepath>' option", 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file, optionName); 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return image; 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 2255389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine_forceAvdImagePath( AvdImageType imageType, 2265389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine const char* path, 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* description, 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int required ) 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path == NULL) 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (required && !path_exists(path)) { 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Cannot find %s image file: %s", description, path); 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->forcePaths[imageType] = path; 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 240cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnerstatic uint64_t 241cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner_adjustPartitionSize( const char* description, 242cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t imageBytes, 243cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t defaultBytes, 244cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner int inAndroidBuild ) 245cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner{ 246cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner char temp[64]; 247cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned imageMB; 248cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned defaultMB; 249cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 250cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (imageBytes <= defaultBytes) 251cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return defaultBytes; 252cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 253cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner imageMB = convertBytesToMB(imageBytes); 254cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultMB = convertBytesToMB(defaultBytes); 255cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 256cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (imageMB > defaultMB) { 257cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner snprintf(temp, sizeof temp, "(%d MB > %d MB)", imageMB, defaultMB); 258cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } else { 259cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner snprintf(temp, sizeof temp, "(%lld bytes > %lld bytes)", imageBytes, defaultBytes); 260cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 261cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 262def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner if (inAndroidBuild) { 263def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner dwarning("%s partition size adjusted to match image file %s\n", description, temp); 264cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 265cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 266cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return convertMBToBytes(imageMB); 267cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 268cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint main(int argc, char **argv) 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char tmp[MAX_PATH]; 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* tmpend = tmp + sizeof(tmp); 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* args[128]; 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int n; 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* opt; 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int use_sdcard_img = 0; 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int serial = 0; 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int gps_serial = 0; 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int radio_serial = 0; 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int qemud_serial = 0; 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int shell_serial = 0; 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned cachePartitionSize = 0; 283cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned systemPartitionSize = 0; 284cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner unsigned dataPartitionSize = 0; 28549dcc4de79c93de65c20706b798353be1e840915David 'Digit' Turner unsigned defaultPartitionSize = convertMBToBytes(66); 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidHwConfig* hw; 288cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner AvdInfo* avd; 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project //const char *appdir = get_app_dir(); 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_root = NULL; 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* android_build_out = NULL; 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidOptions opts[1]; 295b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* LCD density value to pass to the core. */ 296b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine char lcd_density[16]; 297b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* net.shared_net_ip boot property value. */ 298b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine char boot_prop_ip[64]; 299b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine boot_prop_ip[0] = '\0'; 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[0] = argv[0]; 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( android_parse_options( &argc, &argv, opts ) < 0 ) { 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (argc-- > 1) { 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt = (++argv)[0]; 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(!strcmp(opt, "-qemu")) { 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argc--; 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argv++; 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "-help")) { 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_help(); 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strncmp(opt, "-help-",6)) { 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STRALLOC_DEFINE(out); 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opt += 6; 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(opt, "all")) { 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_help_all(out); 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_option(opt, out) == 0) { 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (android_help_for_topic(opt, out) == 0) { 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* ok */ 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out->n > 0) { 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("\n%.*s", out->n, out->s); 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: -help-%s\n", opt); 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid topics\n"); 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opt[0] == '-') { 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "unknown option: %s\n", opt); 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for a list of valid options\n"); 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "invalid command-line parameter: %s.\n", opt); 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "Hint: use '@foo' to launch a virtual device named 'foo'.\n"); 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "please use -help for more information\n"); 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3559085a28c14f369d231dbae099a690689179f428avchtchetkine if (android_charmap_setup(opts->charmap)) { 3569085a28c14f369d231dbae099a690689179f428avchtchetkine exit(1); 3579085a28c14f369d231dbae099a690689179f428avchtchetkine } 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->version) { 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf("Android emulator version %s\n" 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Copyright (C) 2006-2008 The Android Open Source Project and many others.\n" 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "This program is a derivative of the QEMU CPU emulator (www.qemu.org).\n\n", 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined ANDROID_BUILD_ID 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING " (build_id " STRINGIFY(ANDROID_BUILD_ID) ")" ); 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VERSION_STRING); 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project printf(" This software is licensed under the terms of the GNU General Public\n" 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " License version 2, as published by the Free Software Foundation, and\n" 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " may be copied, distributed, and modified under those terms.\n\n" 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " This program is distributed in the hope that it will be useful,\n" 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " GNU General Public License for more details.\n\n"); 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(0); 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->timezone) { 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( timezone_set(opts->timezone) < 0 ) { 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "emulator: it seems the timezone '%s' is not in zoneinfo format\n", opts->timezone); 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* legacy support: we used to use -system <dir> and -image <file> 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * instead of -sysdir <dir> and -system <file>, so handle this by checking 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * whether the options point to directories or files. 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->image != NULL) { 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->system != NULL) { 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "You can't use -sysdir, -system and -image at the same time.\n" 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You should probably use '-sysdir <path> -system <file>'.\n" ); 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that -image is obsolete and that -system is now used to point\n" 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to the system image. Next time, try using '-sysdir <path> -system <file>' instead.\n" ); 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = opts->image; 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->image = NULL; 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->system != NULL && path_is_dir(opts->system)) { 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->sysdir != NULL) { 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "Option -system should now be followed by a file path, not a directory one.\n" 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please use '-sysdir <path>' to point to the system directory.\n" ); 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Please note that the -system option should now be used to point to the initial\n" 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "system image (like the obsolete -image option). To point to the system directory\n" 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please now use '-sysdir <path>' instead.\n" ); 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = opts->system; 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = NULL; 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nojni) 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_jni = opts->nojni; 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->nocache) 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = opts->nocache; 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noaudio) 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_audio = opts->noaudio; 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->noskin) 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_skin = opts->noskin; 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If no AVD name was given, try to find the top of the 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build tree 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd == NULL) { 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* out = getenv("ANDROID_PRODUCT_OUT"); 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (out == NULL || out[0] == 0) 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(out)) { 4409877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project derror("Can't access ANDROID_PRODUCT_OUT as '%s'\n" 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You need to build the Android system before launching the emulator", 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out); 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root = path_parent( out, 4 ); 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_build_root == NULL || !path_exists(android_build_root)) { 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("Can't find the Android build root from '%s'\n" 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Please check the definition of the ANDROID_PRODUCT_OUT variable.\n" 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "It should point to your product-specific build output directory.\n", 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project out ); 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = out; 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build root: %s", android_build_root ); 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "found Android build out: %s", android_build_out ); 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (0); 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no virtual device name is given, and we're not in the 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Android build system, we'll need to perform some auto-detection 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * magic :-) 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 4635389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (opts->avd == NULL && !android_build_out) 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char dataDirIsSystem = 0; 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sysdir = _getSdkImagePath("system.img"); 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sysdir) { 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not specify a virtual device name, and the system\n" 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "directory could not be found.\n\n" 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you are an Android SDK user, please use '@<name>' or '-avd <name>'\n" 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to start a given virtual device (see -help-avd for details).\n\n" 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "Otherwise, follow the instructions in -help-disk-images to start the emulator\n" 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sysdir %s", opts->sysdir); 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->system) { 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->system = _getSdkSystemImage(opts->sysdir, "-image", "system.img"); 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -image %s", opts->image); 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->kernel) { 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->kernel = _getSdkSystemImage(opts->sysdir, "-kernel", "kernel-qemu"); 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -kernel %s", opts->kernel); 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->ramdisk) { 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->ramdisk = _getSdkSystemImage(opts->sysdir, "-ramdisk", "ramdisk.img"); 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -ramdisk %s", opts->ramdisk); 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if no data directory is specified, use the system directory */ 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->datadir) { 50018fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->datadir = android_strdup(opts->sysdir); 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dataDirIsSystem = 1; 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -datadir %s", opts->sysdir); 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->data) { 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* check for userdata-qemu.img in the data directory */ 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/userdata-qemu.img", opts->datadir); 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!path_exists(tmp)) { 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "You did not provide the name of an Android Virtual Device\n" 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "with the '-avd <name>' option. Read -help-avd for more information.\n\n" 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "If you *really* want to *NOT* run an AVD, consider using '-data <file>'\n" 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "to specify a data partition image file (I hope you know what you're doing).\n" 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ); 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 51918fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->data = android_strdup(tmp); 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -data %s", opts->data); 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->sdcard && opts->datadir) { 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, "%s/sdcard.img", opts->datadir); 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_exists(tmp)) { 52618fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->sdcard = android_strdup(tmp); 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -sdcard %s", opts->sdcard); 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 530353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 531353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 532353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->snapstorage && opts->datadir) { 533353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije bufprint(tmp, tmpend, "%s/snapshots.img", opts->datadir); 534353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (path_exists(tmp)) { 535ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije opts->snapstorage = android_strdup(tmp); 536353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("autoconfig: -snapstorage %s", opts->snapstorage); 537353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 538353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 539ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#endif // CONFIG_ANDROID_SNAPSHOTS 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device parameters from our options 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) { 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_NO_CACHE; 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->wipe_data) { 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams->flags |= AVDINFO_WIPE_DATA | AVDINFO_WIPE_CACHE; 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 550353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 551353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (opts->no_snapstorage) { 552353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije android_avdParams->flags |= AVDINFO_NO_SNAPSHOTS; 553353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 554353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#endif 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* if certain options are set, we can force the path of 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * certain kernel/disk image files 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 559353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_KERNEL, opts->kernel, "kernel", 1); 560353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_INITSYSTEM, opts->system, "system", 1); 561353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_RAMDISK, opts->ramdisk, "ramdisk", 1); 562353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_USERDATA, opts->data, "user data", 0); 563353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_CACHE, opts->cache, "cache", 0); 564353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_SDCARD, opts->sdcard, "SD Card", 0); 565353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 566353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije _forceAvdImagePath(AVD_IMAGE_SNAPSHOTS, opts->snapstorage, "snapshots", 0); 567353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#endif 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we don't accept -skindir without -skin now 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to simplify the autoconfig stuff with virtual devices 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_skin) { 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skin = "320x480"; 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->skindir = NULL; 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->skin) { 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "the -skindir <path> option requires a -skin <name> option"); 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 583b58c44e55548129243185ef5927bd3abb5903044David Turner android_avdParams->skinName = opts->skin; 584b58c44e55548129243185ef5927bd3abb5903044David Turner android_avdParams->skinRootPath = opts->skindir; 585b58c44e55548129243185ef5927bd3abb5903044David Turner 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* setup the virtual device differently depending on whether 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * we are in the Android build system or not 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->avd != NULL) 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_new( opts->avd, android_avdParams ); 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (android_avdInfo == NULL) { 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* an error message has already been printed */ 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint("could not find virtual device named '%s'", opts->avd); 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_build_out) { 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out = android_build_root = opts->sysdir; 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdInfo = avdInfo_newForAndroidBuild( 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_root, 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_build_out, 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_avdParams ); 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(android_avdInfo == NULL) { 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("could not start virtual device\n"); 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 614cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avd = android_avdInfo; 615cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* get the skin from the virtual device configuration */ 617cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->skin = (char*) avdInfo_getSkinName( avd ); 618cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->skindir = (char*) avdInfo_getSkinDir( avd ); 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skin) { 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skin %s", opts->skin); 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->skindir) { 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("autoconfig: -skindir %s", opts->skindir); 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Read hardware configuration */ 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hw = android_hw; 629cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (avdInfo_getHwConfig(avd, hw) < 0) { 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror("could not read hardware configuration ?"); 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->keyset) { 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset(opts->keyset, opts); 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "emulator: WARNING: could not find keyset file named '%s'," 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project " using defaults instead\n", 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->keyset); 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project parse_keyset("default", opts); 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project android_keyset = skin_keyset_new_from_text( skin_keyset_get_default() ); 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!android_keyset) { 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: default keyset file is corrupted !!\n" ); 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "PANIC: please update the code in android/skin/keyset.c\n" ); 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->keyset) 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project write_default_keyset(); 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 65740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 65840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char* end; 65940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie long shared_net_id = strtol(opts->shared_net_id, &end, 0); 66040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (end == NULL || *end || shared_net_id < 1 || shared_net_id > 255) { 66140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie fprintf(stderr, "option -shared-net-id must be an integer between 1 and 255\n"); 66240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie exit(1); 66340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 664b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine snprintf(boot_prop_ip, sizeof(boot_prop_ip), 665b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine "net.shared_net_ip=10.1.2.%ld", shared_net_id); 66640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 66740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 66840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project emulator_config_init(); 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project init_skinned_ui(opts->skindir, opts->skin, opts); 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netspeed) { 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_speed) 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network speed: '%s'", skin_network_speed); 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netspeed = (char*)skin_network_speed; 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->netdelay) { 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_network_delay) 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("skin network delay: '%s'", skin_network_delay); 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->netdelay = (char*)skin_network_delay; 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 684cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner char* tracePath = avdInfo_getTracePath(avd, opts->trace); 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ret; 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (tracePath == NULL) { 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "bad -trace parameter" ); 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ret = path_mkdir_if_needed( tracePath, 0755 ); 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ret < 0) { 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "could not create directory '%s'\n", tmp); 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(2); 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->trace = tracePath; 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_cache) 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = 0; 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project n = 1; 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* generate arguments for the underlying qemu main() */ 704238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner { 705238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner const char* kernelFile = avdInfo_getImageFile(avd, AVD_IMAGE_KERNEL); 706238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner int kernelFileLen = strlen(kernelFile); 707238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 708238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "-kernel"; 709238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = (char*)kernelFile; 710238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 711238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner /* If the kernel image name ends in "-armv7", then change the cpu 712238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * type automatically. This is a poor man's approach to configuration 713238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * management, but should allow us to get past building ARMv7 714238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * system images with dex preopt pass without introducing too many 715238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * changes to the emulator sources. 716238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * 717238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * XXX: 718238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * A 'proper' change would require adding some sort of hardware-property 719238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * to each AVD config file, then automatically determine its value for 720238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * full Android builds (depending on some environment variable), plus 721238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * some build system changes. I prefer not to do that for now for reasons 722238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner * of simplicity. 723238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner */ 724238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner if (kernelFileLen > 6 && !memcmp(kernelFile + kernelFileLen - 6, "-armv7", 6)) { 725238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "-cpu"; 726238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner args[n++] = "cortex-a8"; 727238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 728238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 730b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine if (boot_prop_ip[0]) { 731b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-boot-property"; 732b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = boot_prop_ip; 733b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 734b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 735318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine if (opts->tcpdump) { 736318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine args[n++] = "-tcpdump"; 737318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine args[n++] = opts->tcpdump; 738318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine } 739318f17a0050e729bce8545463b657c1d62835b5eVladimir Chtchetkine 740e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine#ifdef CONFIG_NAND_LIMITS 741e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->nand_limits) { 742e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-nand-limits"; 743e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->nand_limits; 744e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 745e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine#endif 746e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine 747e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netspeed) { 748e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netspeed"; 749e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->netspeed; 750e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 751e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netdelay) { 752e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netdelay"; 753e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = opts->netdelay; 754e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 755e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine if (opts->netfast) { 756e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine args[n++] = "-netfast"; 757e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine } 758e13168648d5947955e0fd4fbf396f891ae53921fVladimir Chtchetkine 759b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine /* the purpose of -no-audio is to disable sound output from the emulator, 760b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine * not to disable Audio emulation. So simply force the 'none' backends */ 761b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->no_audio) 762b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine opts->audio = "none"; 763b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 764b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->audio) { 765b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-audio"; 766b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->audio; 767b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 768b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 769b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (opts->cpu_delay) { 770b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-cpu-delay"; 771b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->cpu_delay; 772b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 773b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 7747fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine if (opts->dns_server) { 7757fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = "-dns-server"; 7767fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine args[n++] = opts->dns_server; 7777fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine } 7787fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-initrd"; 780cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner args[n++] = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_RAMDISK); 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 782b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project if (opts->partition_size) { 783b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project char* end; 784cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long sizeMB = strtol(opts->partition_size, &end, 0); 785cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long minSizeMB = 10; 786cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner long maxSizeMB = LONG_MAX / ONE_MB; 787b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 788cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (sizeMB < 0 || *end != 0) { 789b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "-partition-size must be followed by a positive integer" ); 790b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 791b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 792cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (sizeMB < minSizeMB || sizeMB > maxSizeMB) { 793b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project derror( "partition-size (%d) must be between %dMB and %dMB", 794cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner sizeMB, minSizeMB, maxSizeMB ); 795b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project exit(1); 796b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 797cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultPartitionSize = sizeMB * ONE_MB; 798cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 799cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 800cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner /* Check the size of the system partition image. 801cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * If we have an AVD, it must be smaller than 802cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * the disk.systemPartition.size hardware property. 803cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * 804cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * Otherwise, we need to adjust the systemPartitionSize 805cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * automatically, and print a warning. 806cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * 807cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner */ 808cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner { 809cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t systemBytes = avdInfo_getImageFileSize(avd, AVD_IMAGE_INITSYSTEM); 810def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner uint64_t defaultBytes = defaultPartitionSize; 811cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 812cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (defaultBytes == 0 || opts->partition_size) 813cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultBytes = defaultPartitionSize; 814cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 815cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner systemPartitionSize = _adjustPartitionSize("system", systemBytes, defaultBytes, 816cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner android_build_out != NULL); 817cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 818cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 819cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner /* Check the size of the /data partition. The only interesting cases here are: 820065242de51ba1e18387ce22a99eb091a859990f7David 'Digit' Turner * - when the USERDATA image already exists and is larger than the default 821cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner * - when we're wiping data and the INITDATA is larger than the default. 822cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner */ 823cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 824cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner { 825cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner const char* dataPath = avdInfo_getImageFile(avd, AVD_IMAGE_USERDATA); 826def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner uint64_t defaultBytes = defaultPartitionSize; 827cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 828cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (defaultBytes == 0 || opts->partition_size) 829cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner defaultBytes = defaultPartitionSize; 830cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 831cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (dataPath == NULL || !path_exists(dataPath) || opts->wipe_data) { 832cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPath = avdInfo_getImageFile(avd, AVD_IMAGE_INITDATA); 833cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 834cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (dataPath == NULL || !path_exists(dataPath)) { 835cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize = defaultBytes; 836cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 837cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner else { 838cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner uint64_t dataBytes; 839cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner path_get_size(dataPath, &dataBytes); 840cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 841cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize = _adjustPartitionSize("data", dataBytes, defaultBytes, 842cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner android_build_out != NULL); 843cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 844b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project } 845b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* filetype = "file"; 8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 849cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (avdInfo_isImageReadOnly(avd, AVD_IMAGE_INITSYSTEM)) 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project filetype = "initfile"; 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 853cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner "system,size=0x%x,%s=%s", systemPartitionSize, filetype, 854cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avdInfo_getImageFile(avd, AVD_IMAGE_INITSYSTEM)); 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bufprint(tmp, tmpend, 861b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project "userdata,size=0x%x,file=%s", 862cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner dataPartitionSize, 863cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner avdInfo_getImageFile(avd, AVD_IMAGE_USERDATA)); 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (hw->disk_cachePartition) { 869cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->cache = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_CACHE); 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cachePartitionSize = hw->disk_cachePartition_size; 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (opts->cache) { 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support a cache partition" ); 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->cache = NULL; 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->no_cache = 1; 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->cache) { 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* use a specific cache file */ 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x,file=%s", cachePartitionSize, opts->cache); 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (!opts->no_cache) { 8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* create a temporary cache partition file */ 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sprintf(tmp, "cache,size=0x%0x", cachePartitionSize); 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-nand"; 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(tmp); 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 89192568958dd42bf35667cc6451b5edd7f7d1f73a1David 'Digit' Turner if (hw->hw_sdCard != 0) 892cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner opts->sdcard = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_SDCARD); 89392568958dd42bf35667cc6451b5edd7f7d1f73a1David 'Digit' Turner else if (opts->sdcard) { 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dwarning( "Emulated hardware doesn't support SD Cards" ); 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->sdcard = NULL; 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(opts->sdcard) { 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t size; 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (path_get_size(opts->sdcard, &size) == 0) { 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* see if we have an sdcard image. get its size if it exists */ 9028b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner /* due to what looks like limitations of the MMC protocol, one has 9038b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner * to use an SD Card image that is equal or larger than 9 MB 9048b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner */ 9058b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner if (size < 9*1024*1024ULL) { 9068b657e5deaa03b989b0b36791fcf2aa6b2882656David 'Digit' Turner fprintf(stderr, "### WARNING: SD Card files must be at least 9MB, ignoring '%s'\n", opts->sdcard); 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-hda"; 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->sdcard; 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project use_sdcard_img = 1; 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("no SD Card image at '%s'", opts->sdcard); 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 917353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije#if CONFIG_ANDROID_SNAPSHOTS 918353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->no_snapstorage) { 919353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije opts->snapstorage = (char*) avdInfo_getImageFile(avd, AVD_IMAGE_SNAPSHOTS); 920353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if(opts->snapstorage) { 921353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (path_exists(opts->snapstorage)) { 922353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije args[n++] = "-hdb"; 923353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije args[n++] = opts->snapstorage; 924353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else { 925353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("no image at '%s', state snapshots disabled", opts->snapstorage); 926353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 927353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 928353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 929353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije if (!opts->no_snapshot) { 93024204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock char* snapshot_name = 93124204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock opts->snapshot ? opts->snapshot : "default-boot"; 93253d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock if (!opts->no_snapshot_load) { 93353d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock args[n++] = "-loadvm"; 93453d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock args[n++] = snapshot_name; 93553d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock } 93624204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock if (!opts->no_snapshot_save) { 93724204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock args[n++] = "-savevm-on-exit"; 93824204cc964cf7d56b1a20c12ece08eecab1093faTim Baverstock args[n++] = snapshot_name; 939353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 940353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->snapshot) { 941353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije dwarning("option '-no-snapshot' overrides '-snapshot', continuing with boot sequence"); 94253d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock } else if (opts->no_snapshot_load || opts->no_snapshot_save) { 94353d8a5c0c8fc087d16316a4399f5a773339c4956Tim Baverstock D("ignoring redundant option(s) '-no-snapshot-load' and/or '-no-snapshot-save' implied by '-no-snapshot'"); 944353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 945622b8f4c760b8c4479d28430f978bad8bb9ea32cTim Baverstock if (opts->no_snapshot_update_time) { 946622b8f4c760b8c4479d28430f978bad8bb9ea32cTim Baverstock android_snapshot_update_time = 0; 947622b8f4c760b8c4479d28430f978bad8bb9ea32cTim Baverstock } 948353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->snapshot || opts->snapstorage) { 949353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije dwarning("option '-no-snapstorage' overrides '-snapshot' and '-snapstorage', " 950353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije "continuing with full boot, state snapshots are disabled"); 951353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } else if (opts->no_snapshot) { 952353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije D("ignoring redundant option '-no-snapshot' implied by '-no-snapstorage'"); 953353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije } 954ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije 955ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije if (opts->snapshot_list) { 956ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije snapshot_print_and_exit(opts->snapstorage); 957ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije } 958ae835acc2d1a8b4aaeb599add9cfc02ea5789eafOt ten Thije#endif // CONFIG_ANDROID_SNAPSHOTS 959353b3b1135563e2bcaf7797acfa35a2fe2d3a818Ot ten Thije 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->logcat || opts->logcat[0] == 0) { 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = getenv("ANDROID_LOG_TAGS"); 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat && opts->logcat[0] == 0) 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->logcat = NULL; 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->console) { 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "option -console is obsolete. please use -shell instead" ); 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* we always send the kernel messages from ttyS0 to android_kmsg */ 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 97513f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine if (opts->show_kernel) { 97613f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine args[n++] = "-show-kernel"; 97713f3b6c53817255217f40db289abace42c3c31a6Vladimir Chtchetkine } 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-kmsg"; 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project serial++; 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* XXXX: TODO: implement -shell and -logcat through qemud instead */ 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->shell_serial) { 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "con:"; 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell_serial = "stdio"; 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->shell = 1; 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->shell_serial; 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project shell_serial = serial++; 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->radio; 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-modem"; 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project radio_serial = serial++; 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->gps; 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gps_serial = serial++; 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else /* !opts->old_system */ 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-serial"; 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "android-qemud"; 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemud_serial = serial++; 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->radio) { 1026b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-radio"; 1027b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->radio; 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 1031b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = "-gps"; 1032b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine args[n++] = opts->gps; 10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->memory) { 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project long ramSize = strtol(opts->memory, &end, 0); 10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 0 || *end != 0) { 10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "-memory must be followed by a positive integer" ); 10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ramSize < 32 || ramSize > 4096) { 10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "physical memory size must be between 32 and 4096 MB" ); 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->memory) { 10493bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner int ramSize = hw->hw_ramSize; 10503bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner if (ramSize <= 0) { 10513bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner /* Compute the default RAM size based on the size of screen. 10523bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * This is only used when the skin doesn't provide the ram 10533bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * size through its hardware.ini (i.e. legacy ones) or when 10543bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * in the full Android build system. 10553bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner */ 10563bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner int width, height, pixels; 10573bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner qemulator_get_screen_size(qemulator_get(), &width, &height); 10583bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner pixels = width*height; 10593bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner 10603bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner /* The following thresholds are a bit liberal, but we 10613bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * essentially want to ensure the following mappings: 10623bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 10633bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 320x480 -> 96 10643bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 800x600 -> 128 10653bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 1024x768 -> 256 10663bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * 10673bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * These are just simple heuristics, they could change in 10683bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner * the future. 10693bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner */ 10703bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner if (pixels <= 250000) 10713bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner ramSize = 96; 10723bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner else if (pixels <= 500000) 10733bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner ramSize = 128; 10743bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner else 10753bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner ramSize = 256; 10763bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner } 10773bbc919b70c78e0be6387d06faa90743deedb4dcDavid 'Digit' Turner bufprint(tmp, tmpend, "%d", ramSize); 107818fe86e8245878f3b7a2813bd59b8cfcf636e15cDavid 'Digit' Turner opts->memory = android_strdup(tmp); 10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-trace"; 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->trace; 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-tracing"; 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "off"; 10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1088b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* Pass LCD density value to the core. */ 1089b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine snprintf(lcd_density, sizeof(lcd_density), "%d", get_device_dpi(opts)); 1090b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-lcd-density"; 1091b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = lcd_density; 1092b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 1093b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine /* Pass boot properties to the core. */ 1094b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine if (opts->prop != NULL) { 1095b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine ParamList* pl = opts->prop; 1096b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine for ( ; pl != NULL; pl = pl->next ) { 1097b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = "-boot-property"; 1098b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine args[n++] = pl->param; 1099b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 1100b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine } 1101b25bf2a7477595aa54181874921086d4c0071c03Vladimir Chtchetkine 11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-append"; 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end; 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int timeout = strtol(opts->bootchart, &end, 10); 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (timeout == 0) 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project opts->bootchart = NULL; 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (timeout < 0 || timeout > 15*60) { 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project derror( "timeout specified for -bootchart option is invalid.\n" 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "please use integers between 1 and 900\n"); 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1116318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner /* Setup the kernel init options 1117318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner */ 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char params[1024]; 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *p = params, *end = p + sizeof(params); 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "qemu=1 console=ttyS0" ); 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->shell || opts->logcat) { 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.console=ttyS%d", shell_serial ); 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->trace) { 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.tracing=1"); 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!opts->no_jni) { 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.checkjni=1"); 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->no_boot_anim) { 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint( p, end, " android.bootanim=0" ); 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->logcat) { 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q = bufprint(p, end, " androidboot.logcat=%s", opts->logcat); 11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q < end) { 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* replace any space by a comma ! */ 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 1; p[nn] != 0; nn++) 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p[nn] == ' ' || p[nn] == '\t') 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[nn] = ','; 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += nn; 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = q; 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->old_system) 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.ril=ttyS%d", radio_serial); 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->gps) { 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.gps=ttyS%d", gps_serial); 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " android.qemud=ttyS%d", qemud_serial); 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opts->bootchart) { 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, " androidboot.bootchart=%s", opts->bootchart); 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) { 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "### ERROR: kernel parameters too long\n"); 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = strdup(params); 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1181d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->ports) { 1182d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-ports"; 1183d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->ports; 1184d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1185d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1186d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->port) { 1187d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-port"; 1188d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->port; 1189d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1190d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1191d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->report_console) { 1192d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-android-report-console"; 1193d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->report_console; 1194d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1195d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 1196d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine if (opts->http_proxy) { 1197d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = "-http-proxy"; 1198d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine args[n++] = opts->http_proxy; 1199d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine } 1200d81e6d1ce722d7e561d495bbd4b137e728e25b83Vladimir Chtchetkine 120143552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine if (opts->charmap) { 120243552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = "-charmap"; 120343552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine args[n++] = opts->charmap; 120443552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine } 120543552dc4fa64aad0c9fdb8f4c92ae7ac79406596Vladimir Chtchetkine 1206b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine if (opts->memcheck) { 1207b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = "-android-memcheck"; 1208b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine args[n++] = opts->memcheck; 1209b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine } 1210b5365f32d7b1dcc6c3e9be7584ce8d4f68b3e7e1Vladimir Chtchetkine 12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* physical memory */ 12128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-m"; 12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = opts->memory; 12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* on Linux, the 'dynticks' clock sometimes doesn't work 12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * properly. this results in the UI freezing while emulation 12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * continues, for several seconds... 12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef __linux__ 12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "-clock"; 12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = "unix"; 12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 122440beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie /* Set up the interfaces for inter-emulator networking */ 122540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (opts->shared_net_id) { 122640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie unsigned int shared_net_id = atoi(opts->shared_net_id); 122740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie char nic[37]; 122840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 122940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 123040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "nic,vlan=0"; 123140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "-net"; 123240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie args[n++] = "user,vlan=0"; 1233111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie 1234111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1235111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie snprintf(nic, sizeof nic, "nic,vlan=1,macaddr=52:54:00:12:34:%02x", shared_net_id); 1236111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = strdup(nic); 1237111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "-net"; 1238111d6f8ed6dea6e651ab450e1ea11310ff0b2857Dries Harnie args[n++] = "socket,vlan=1,mcast=230.0.0.10:1234"; 123940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie } 124040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while(argc-- > 0) { 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n++] = *argv++; 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project args[n] = 0; 12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1246622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner /* Generate a temporary hardware.ini for this AVD. The real hardware 1247622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * configuration is ususally stored in several files, e.g. the AVD's 1248622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * config.ini plus the skin-specific hardware.ini. 1249622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * 1250622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * The new temp file will group all definitions and will be used to 1251622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner * launch the core with the -android-hw <file> option. 1252622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner */ 1253622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner { 1254622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner TempFile* tempHw = tempfile_create(); 1255622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner if (tempHw == NULL) { 1256622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner derror("Could not create temporary hardware.ini: %s", strerror(errno)); 1257622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner exit(2); 1258622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner } 1259622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner 1260622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner const char* tempHwPath = tempfile_path(tempHw); 1261622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner IniFile* hwIni = iniFile_newFromMemory("", NULL); 1262622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner androidHwConfig_write(hw, hwIni); 1263622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner if (iniFile_saveToFile(hwIni, tempHwPath) < 0) { 1264622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner derror("Could not write temporary hardware.ini: %s", tempHwPath); 1265622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner exit(2); 1266622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner } 1267622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner args[n++] = "-android-hw"; 1268622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner args[n++] = strdup(tempHwPath); 1269622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner } 1270622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(VERBOSE_CHECK(init)) { 12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 12733336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("QEMU options list:\n"); 12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for(i = 0; i < n; i++) { 12753336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("emulator: argv[%02d] = \"%s\"\n", i, args[i]); 12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12773336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner /* Dump final command-line option to make debugging the core easier */ 12783336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("Concatenated QEMU options:\n"); 12793336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner for (i = 0; i < n; i++) { 12803336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf(" %s", args[i]); 12813336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner } 12823336176fc898915b7b5544f3a7c60ec2794507c3David 'Digit' Turner printf("\n"); 12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_main(n, args); 12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1286