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